<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BEKK Open &#187; Kvalitet og testing</title>
	<atom:link href="http://open.bekk.no/category/bekk/tech/kvalitet-og-testing/feed/" rel="self" type="application/rss+xml" />
	<link>http://open.bekk.no</link>
	<description>Et innblikk i hva som skjer i BEKK</description>
	<lastBuildDate>Fri, 10 Sep 2010 16:43:31 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Automated functional testing of iPhone apps with iCuke</title>
		<link>http://open.bekk.no/2010/06/02/automated-functional-testing-of-iphone-apps-with-icuke/</link>
		<comments>http://open.bekk.no/2010/06/02/automated-functional-testing-of-iphone-apps-with-icuke/#comments</comments>
		<pubDate>Wed, 02 Jun 2010 12:05:20 +0000</pubDate>
		<dc:creator>Aslak Hellesøy</dc:creator>
				<category><![CDATA[Fri Programvare]]></category>
		<category><![CDATA[Kvalitet og testing]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[icuke]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=2735</guid>
		<description><![CDATA[Seeing the downloads of the open source BDD/Acceptance Testing tool Cucumber skyrocketing is great, but seeing what insane extensions the community comes up with is even greater.
UK-based super hacker and long time Cucumber contributor Rob Holland announced iCuke yesterday. iCuke is a Cucumber extension that lets you write automated functional tests for iPhone apps. Here [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://open.bekk.no/wp-content/uploads/2010/06/icuke.png"><img class="size-full wp-image-2737 alignleft" title="icuke" src="http://open.bekk.no/wp-content/uploads/2010/06/icuke.png" alt="" width="110" height="203" /></a>Seeing the downloads of the open source BDD/Acceptance Testing tool Cucumber <a href="http://rubygems.org/gems/cucumber">skyrocketing</a> is great, but seeing what insane extensions the community comes up with is even greater.</p>
<p>UK-based super hacker and long time Cucumber contributor Rob Holland <a href="http://www.unboxedconsulting.com/blog/cucumber-iphone-icuke">announced iCuke yesterday</a>. iCuke is a Cucumber extension that lets you write automated functional tests for iPhone apps. Here is a little teaser&#8230;</p>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=12230690&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=12230690&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object>
<p><a href="http://vimeo.com/12230690">iCuke</a> from <a href="http://vimeo.com/user1178904">Aslak Hellesøy</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>For questions about iCuke, please use the <a href="http://groups.google.com/group/icuke">iCuke mailing list</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/2010/06/02/automated-functional-testing-of-iphone-apps-with-icuke/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Hva skjer når man gir bort flydata gratis?</title>
		<link>http://open.bekk.no/2009/12/13/hva-skjer-nar-man-gir-bort-flydata-gratis/</link>
		<comments>http://open.bekk.no/2009/12/13/hva-skjer-nar-man-gir-bort-flydata-gratis/#comments</comments>
		<pubDate>Sun, 13 Dec 2009 20:26:13 +0000</pubDate>
		<dc:creator>Anders Christensen</dc:creator>
				<category><![CDATA[IT-rådgivning]]></category>
		<category><![CDATA[Kvalitet og testing]]></category>
		<category><![CDATA[Virksomhet 2.0]]></category>
		<category><![CDATA[åpne API]]></category>
		<category><![CDATA[Avinor]]></category>
		<category><![CDATA[gratis]]></category>
		<category><![CDATA[kvalitet]]></category>
		<category><![CDATA[omdømme]]></category>
		<category><![CDATA[open data]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=2123</guid>
		<description><![CDATA[Sommeren 2009 slapp Avinor (selskapet som eier og drifter landets 46 offentlige flyplasser) deler av sine flydata i XML-format til fri bruk for publikum. Erfaringene drøye 5 måneder etter frislippet er, ikke overraskende, positive.]]></description>
			<content:encoded><![CDATA[<h3><strong><span style="color: #000000;">Sommeren 2009 slapp <a title="avinor.no" href="http://www.avinor.no" target="_blank">Avinor</a> (selskapet som eier og drifter landets 46 offentlige flyplasser) deler av sine <a title="API for flydata fra Avinor" href="http://api.avinor.no" target="_blank">flydata i XML-format</a> til fri bruk for publikum. Erfaringene drøye 5 måneder etter frislippet er omtrent som følger:</span></strong></h3>
<p></br><br />
<strong>Erfaring 1: Gratis flydata bidrar til økt datakvalitet og tjenesteorientering</strong></p>
<p>Umiddelbart etter lanseringen kom kommentarene, spørsmålene og forslagene. Systemutviklere og <a title="flyspotter.net" href="http://www.flyspotter.net" target="_blank">flyspottere</a> tok raskt tak i tjenestene og meldte tilbake om inkonsistens og mangler i datasettene. Å bli utsatt for ”amatørers” (da i ordets <a title="Amatør - Wikipedia" href="http://no.wikipedia.org/wiki/Amat%C3%B8r" target="_blank">egentlige betydning</a>) nysgjerrige og kritiske blikk har vært en verdifull og nyttig erfaring for Avinor. Denne &#8220;kollektive kvalitetssikringen&#8221; har bidratt til å øke kvaliteten på de aktuelle datasettene.</p>
<p>En annen konsekvens av frislippet har vært en mer generell dreining i tankesettet internt i Avinor. At data som tidligere kun har vært i bruk internt nå er eksponert eksternt har økt fokuset på tjenesteorientering, samt bidratt til å tydeliggjøre ansvarsforholdet mellom ulike enheter i organisasjonen. Det oppleves nå som enklere å snakke om både bruk, gjenbruk og utvikling av tjenester.<br />
<br /></br><br />
<strong>Erfaring 2: Gratis flydata bidrar til &#8220;kollektiv innovasjon&#8221;</strong></p>
<div id="attachment_2175" class="wp-caption alignright" style="width: 330px"><strong><strong><img class="size-full wp-image-2175  " style="margin: 5px;" title="iphone_app" src="http://open.bekk.no/wp-content/uploads/2009/12/iphone_app.gif" alt="Eksempel på iPhone-app med flydata fra Avinor" width="320" height="213" /></strong></strong><p class="wp-caption-text">Eksempel på iPhone-app med flydata fra Avinor</p></div>
<p>Det er ikke bare Avinor som har hatt nytte av at flydataene nå er tilgjengelig eksternt. Publikum nyter også godt av frislippet.</p>
<p>Kort tid etter lanseringen dukket det opp løsninger som nå hjelper Avinor med å holde det reisende publikum oppdatert på flytrafikkavviklingen. I dag benyttes Avinors API til flere ulike applikasjoner på både iPhone- og Android-plattformen, samt tjenester på en rekke større norske nettsteder.</p>
<p>Dette var alle tjenester som Avinor selv gjerne ønsket å utvikle, men aldri hadde anledning til å prioritere. Men som antatt i forkant; slipper vi dataene fri så vil andre lage løsningene &#8220;for oss&#8221;. Resultatet blir det samme; folk får tilgang til flytider.</p>
<p>(Som motvekt til iPhone-hysteriet utviklet forøvrig Avinor selv en <a title="Flytider på mobilen" href="http://m.osl.no" target="_blank">enkel webløsning</a> som fungerer på alle mobiltelefoner.)<br />
<br /></br><br />
<strong>Erfaring 3: Gratis flydata er positivt for omdømmet til Avinor</strong></p>
<p>Lanseringen av API&#8217;et har bidratt til at Avinor ved flere anledninger har fått positiv medieomtale. De siste månedene har blant annet <a title="nrkbeta.no" href="http://nrkbeta.no/2009/07/02/gratis-flydata-fra-avinor/" target="_blank">NRKbeta</a>, <a title="Dagbladet.no" href="http://www.dagbladet.no/2009/11/12/kultur/tekno/data_og_teknologi/statens_kartverk/9003977/" target="_blank">Dagbladet.no</a> og <a title="tu.no" href="http://www.tu.no/it/article216246.ece" target="_blank">Teknisk Ukeblad</a> hatt oppslag hvor Avinor trekkes fram som eksempel til etterfølgelse. Rett nok har omtalen vært relativt ”smal”, men all positiv omtale er eh… positivt (særlig når man tar i betraktning at Avinor stort sett bare er interessant for mediene når ting <em>ikke</em> går på skinner).</p>
<p>Internt har lanseringen også hatt en positiv omdømmeeffekt. Open data både <em>føles</em> og <em>er</em> moderne. Og Avinor har vært relativt tidlig ute på dette området. Per i dag har ikke altfor mange statlige virksomheter sluppet sine data til fri bruk, og innen internasjonal flytrafikk er eksemplene enda færre. Tanken på det kan gjøre en og annen ansatt i Avinor stolt. Open data bør definitivt være en målsetning, men foreløpig er det ingen selvfølge. Kudos til de som går foran.</p>
<p>- &#8211; - &#8211; -</p>
<p><em>Kommentar: Betydningen av erfaring 3 skal ikke overdrives. Verdien av erfaring 1 og 2 skal derimot ikke underdrives. Undertegnede er forøvrig en av flere BEKKere som jobber for Avinor. </em><br />
<br /></br></p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/2009/12/13/hva-skjer-nar-man-gir-bort-flydata-gratis/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Javadocstøy #2</title>
		<link>http://open.bekk.no/2009/12/07/javadocst%c3%b8y-2/</link>
		<comments>http://open.bekk.no/2009/12/07/javadocst%c3%b8y-2/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 14:24:18 +0000</pubDate>
		<dc:creator>Trond Arve Wasskog</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Kvalitet og testing]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[dokumentasjon]]></category>
		<category><![CDATA[håndtverk]]></category>
		<category><![CDATA[javadoc]]></category>
		<category><![CDATA[kvalitet]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=1998</guid>
		<description><![CDATA[Noen spør hvorfor jeg bruker energi på Javadocstøy. Finnes det ikke større fisker å steke?]]></description>
			<content:encoded><![CDATA[<p>Noen spør hvorfor jeg bruker energi på <a title="Javadocstøy #fail" href="http://open.bekk.no/2009/11/27/javadocst%c3%b8y/">Javadocstøy</a>. Finnes det ikke større fisker å steke?</p>
<p>Årsaken er at det indikerer at man har <em>sluttet å engasjere seg</em>. Man godtar ubrukelige regler, på tross av utvilsom støyfaktor og null verdi. Det tyder på at man ikke bryr seg om koden sin. Og kode er det mest sentrale vi produserer, kommuniserer og vedlikeholder.</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/2009/12/07/javadocst%c3%b8y-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Riktig feilhåndtering: Kontekstinformasjon</title>
		<link>http://open.bekk.no/2009/11/26/riktig-feilhandtering-kontekstinformasjon/</link>
		<comments>http://open.bekk.no/2009/11/26/riktig-feilhandtering-kontekstinformasjon/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 07:17:10 +0000</pubDate>
		<dc:creator>Trond Arve Wasskog</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Kvalitet og testing]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[driftbarhet]]></category>
		<category><![CDATA[feilhåndtering]]></category>
		<category><![CDATA[kvalitet]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=1687</guid>
		<description><![CDATA[For å feilsøke og finne årsaken til en feil har man behov for informasjon om kontekst når situasjonen inntraff. Dette inkluderer overordnet informasjon som maskin, bruker, tidspunkt og opprinnelse i koden. I tillegg vil man gjerne ha spesifikk informasjon om tilstand og data som ble behandlet. Målet er å kunne gjenskape situasjonen i et utviklingsmiljø for å forstå og rette feilen.]]></description>
			<content:encoded><![CDATA[<p>For å feilsøke og finne årsaken til en feil har man behov for informasjon om kontekst når situasjonen inntraff. Dette inkluderer overordnet informasjon som maskin, bruker, tidspunkt og opprinnelse i koden. I tillegg vil man gjerne ha spesifikk informasjon om tilstand og data som ble behandlet. Målet er å kunne gjenskape situasjonen i et utviklingsmiljø for å forstå og rette feilen.</p>
<p><strong>Standard informasjon</strong></p>
<p>Standard logginformasjon inkluderer typisk tidspunkt, alvorlighetsgrad, program- og komponentnavn i tillegg til selve meldingen. Et godt loggrammeverk tilbyr tilpasning av både innhold og format av disse parametrene.</p>
<p>Riktig feilhåndtering forutsetter fornuftig <a title="Feilkategoriseing og -hendelse" href="http://open.bekk.no/2009/11/18/riktig-feilhandtering-feilkategori-og-hendelse/">kategorisering og identifisering av feilhendelse.</a> Feilkategori og unik feil-ID er en viktig del av kontekstinformasjonen.</p>
<p><strong>Brukernavn</strong></p>
<p>Brukernavn for den innloggede brukeren kan med fordel logges. Enkelte applikasjonsservere tilbyr denne funksjonaliteten forutsatt at du benytter de innebygde mekanismene for autentisering og logging. En teknikk man kan benytte i egen kode er å ha brukernavnet på trådkonteksten (for eksempel  en <a title="Java ThreadLocal" href="http://java.sun.com/javase/6/docs/api/java/lang/ThreadLocal.html">ThreadLocal</a> variabel i Java). Når en feil oppstår henter loggmekanismen brukernavnet fra trådkonteksten og skriver det til loggen. Mange sikkerhetsrammeverk bruker også denne teknikken, det kan derfor hende at brukernavnet allerede ligger klart for bruk.</p>
<p><strong>Støtte for vilkårlig kontekstinformasjon</strong></p>
<p>Når en feil oppstår er det gjerne nyttig å legge til spesifikk informasjon om tilstand og kontekst. Det kan også være behov for å supplere mer informasjon oppover i kall-stacken. Rammeverket bør derfor ha støtte for å legge til vilkårlig kontekstinformasjon, for eksempel som skissert under.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AbstractException<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   ...
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> leggTilFeilinformasjon<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> navn, <span style="color: #003399;">Object</span> info<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      feilinformasjon.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>navn, info<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>Selvbeskrivende objekter</strong></p>
<p>Når man skal logge tilstand for de ulike objektene er det en stor fordel at disse kan beskrive seg selv. Det er feil ansvarsfordeling dersom en feilhåndteringsrutine må pakke ut og formattere kontekstinformasjonen som skal logges. En slik tilnærming vil også sannsynligvis føre til inkonsistens og duplisering.</p>
<p>Java-mekanismen for selvbeskrivende objekter er den velkjente <a href="http://www.j2ee.me/javase/6/docs/api/java/lang/Object.html#toString%28%29">toString()-metoden</a>. Ved å implementere toString() på en god måte vil tilstand kunne logges enkelt og konsistent. I tillegg er det enkelt å lage automatiserte tester for denne funksjonaliteten, og disse kan også fungere som dokumentasjon. Komponenter som <a href="http://commons.apache.org/lang/api/org/apache/commons/lang/builder/ToStringBuilder.html">Apache ToStringBuilder</a> kan være nyttig for implementasjon av toString().</p>
<p><strong>Stacktrace og uventede feil<br />
</strong></p>
<p>God feilhåndtering<a href="http://open.bekk.no/2009/11/02/riktig-feilhandtering-det-finnes-bare-tre-feiltyper/"> betyr få stacktrace i loggen</a>. Ideelt sett oppstår behovet for stacktrace kun ved programmeringsfeil; gitt at applikasjonsfeil og systemfeil er riktig håndtert og har tilstrekkelig kontekstinformasjon. Imidlertid, når en uventet feil først oppstår er stacktracen en uvurderlig del av kontekstinformasjonen. Man kan med forlel skille ut disse i en egen logg for utviklere; drift ser ofte på stacktrace som et verdiløst irritasjonsmoment.</p>
<p><strong>Oppsummering</strong></p>
<p>God kontekstinformasjon er en sentral mekanisme for riktig feilhåndtering. Drift og utvikling kan med stor sannsynlighet forstå og gjenskape feilsituasjonen, og dermed også rette feilen raskt. Teknikkene for kontekstinformasjon er enkle å implementere, forutsatt at feilhåndtering er en prioritert og forstått del av prosjektet.</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/2009/11/26/riktig-feilhandtering-kontekstinformasjon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Riktig feilhåndtering: Hvem bryr seg?</title>
		<link>http://open.bekk.no/2009/11/19/riktig-feilhandtering-hvem-bryr-seg/</link>
		<comments>http://open.bekk.no/2009/11/19/riktig-feilhandtering-hvem-bryr-seg/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 19:23:58 +0000</pubDate>
		<dc:creator>Trond Arve Wasskog</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Kvalitet og testing]]></category>
		<category><![CDATA[driftbarhet]]></category>
		<category><![CDATA[feilhåndtering]]></category>
		<category><![CDATA[kvalitet]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=1662</guid>
		<description><![CDATA[For bedre feilhåndtering må man i større grad skille mellom ulike brukergrupper og deres behov.]]></description>
			<content:encoded><![CDATA[<p>Å kjenne brukerne og deres behov er sentralt i all utvikling. Dette gjelder også feilhåndtering. Her er en oversikt over typiske brukergrupper og deres behov:<em> </em></p>
<p><strong>Brukeren</strong></p>
<p>Brukeren av systemet er først og fremst opptatt av <em>at </em>en feil har oppstått, at situasjonen er håndtert og ikke medfører senere problemer. Det er selvfølgelig irriterende og kan være problematisk når feil inntreffer, uansett er det kritisk at situasjonen ser ut til å være under kontroll. Brukeren bryr seg sjelden om årsaken til feilen, men vil gjerne kunne identifisere den spesifikke situasjonen når hun snakker med supportapparatet.</p>
<p><strong>Forretningssiden</strong></p>
<p>Forretningssiden (funksjonelt ansvarlige i utviklingsprosessen) forstår primært funksjonelle feil, og antar ofte at utviklere og leverandører tar seg av andre feiltyper. De ønsker generelt en applikasjon uten kritiske feil, men vil sjelden sørge for at feilhåndtering blir riktig prioritert i utviklingsprosessen.</p>
<p><strong>Kunde/Bestiller</strong></p>
<p>Den som sitter på budsjettet og bestiller applikasjonen har forventninger om en fungerende applikasjon, men har vent seg til at ingen applikasjoner er feilfrie. De er vanligvis ikke tilstrekkelig involvert i prosjektet til å påvirke og vektlegge feilhåndtering. Noen stiller imidlertid med testledere som kan være erfarne nok til å ivareta dette ansvaret og sørge for at unntaks- og feilsituasjoner blir testet.</p>
<p><strong>Drift</strong></p>
<p>Drift vil vite <em>hva de skal gjøre når feil oppstår</em>. På kort sikt er drift kun interessert i å gjøre grep slik at systemet kjører videre og ikke har havnet i en ugyldig tilstand. Selv om årsaken til feilen kan være interessant vil driftpersoner sjelden ha behov for detaljerte beskrivelser. Imidlertid vil de gjerne ha en oversikt over potensielle og kjente feilsituasjoner, kunne gjenkjenne feilkategoriene og kanskje bygge opp en erfaringsbase  over tid.</p>
<p><strong>Utviklere</strong></p>
<p>Utviklere vil vite <em>alt</em>:</p>
<ul>
<li>Hva var årsaken til feilen?</li>
<li>På hvilken server skjedde den?</li>
<li>Når oppsto situasjonen?</li>
<li>Hvilken tilstand hadde brukeren og applikasjonen?</li>
<li>Hva var kontekst i feilsituasjonen?</li>
<li>Kan den gjenskapes?</li>
</ul>
<p>Ettersom utviklere ofte står for feilhåndteringen vil utviklerbehovene prege implementasjonen. Dette resulterer gjerne i detaljerte feilmeldinger i alle sammenhenger; i brukergrensesnittet, loggfiler og konsoller.</p>
<p><strong>Tilpasning til brukernes behov</strong></p>
<p>For bedre feilhåndtering må man i større grad skille mellom ulike brukergrupper og deres behov. Her er noen mulige tilnærminger:</p>
<ul>
<li>Utviklingsprosjektet må ta hovedansvaret for feilhåndteringen. All erfaring tilsier at man ikke kan forvente at forretningssiden eller bestiller vil sørge for at behovene beskrives og prioriteres. Dersom kunden ikke har en erfaren testleder bør prosjektene selv bekle denne rollen.</li>
<li>Unngå detaljerte feilbeskrivelser i brukergrensesnittet, men oppgi gjerne en unik feil-ID slik at det er mulig å finne tilbake til den spesifikke feilen.</li>
<li>Involver drift i hele utviklingsprosjektet slik at de kan bidra til kravstilling og kommunisere sine behov på lik linje med funksjonelle krav.</li>
<li>Sørg for konsistent feilkategorisering som drift kan bruke for å kjenne igjen feil.</li>
<li>Bruk gjerne forskjellige logger for drift og feilretting. Drift har i utgangspunktet ikke behov for de detaljerte feilbeskrivelsene som man har i forvaltning.</li>
<li>Sørg for å legge til kontekstinformasjon i feilsituasjoner.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/2009/11/19/riktig-feilhandtering-hvem-bryr-seg/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Riktig feilhåndtering: Feilkategori og -hendelse</title>
		<link>http://open.bekk.no/2009/11/18/riktig-feilhandtering-feilkategori-og-hendelse/</link>
		<comments>http://open.bekk.no/2009/11/18/riktig-feilhandtering-feilkategori-og-hendelse/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 08:19:14 +0000</pubDate>
		<dc:creator>Trond Arve Wasskog</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Kvalitet og testing]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[driftbarhet]]></category>
		<category><![CDATA[feilhåndtering]]></category>
		<category><![CDATA[kvalitet]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=1560</guid>
		<description><![CDATA[Når man feilsøker kan man skille mellom feilkategori og feilhendelse. Kategorien beskriver hvilken feiltype som har oppstått, mens identifisering av feilhendelsen forteller hva som har skjedd til en bestemt tid i en spesifikk sammenheng.]]></description>
			<content:encoded><![CDATA[<p><strong>Feilkategori vs. -hendelse</strong></p>
<p>Når man feilsøker kan man skille mellom to ulike behov:</p>
<ul>
<li><em>Feilkategori</em> beskriver hvilken feil som har oppstått. Den kategoriserer hendelser av samme type, og brukes for å forstå hva som har skjedd.</li>
<li>Identifisering av <em>feilhendelsen</em> forteller hva som har skjedd til en bestemt tid i en spesifikk sammenheng. Typisk er dette nyttig for å finne ut hva som har skjedd når man feilsøker en bestemt feilsituasjon meldt av en bruker.</li>
</ul>
<p><strong>Feilkategorisering</strong></p>
<p>Feilkategorisering har flere alternative tilnærminger:</p>
<ul>
<li>Hver feilkategori representeres med en egen Exception. <a title="java.lang.Exception" href="http://java.sun.com/javase/6/docs/api/java/lang/Exception.html" target="_blank">Java SE APIet</a> er et eksempel på denne tilnærmingen. Dette resulterer typisk i mange Exception-klasser  definert på ulike steder i pakkestrukturen. Tilnærmingen kan derfor kalles <em>distribuert</em>.</li>
<li>Et fåtall sentrale Exception-klasser definerer feiltypene (gjerne <a title="Tre feiltyper" href="http://open.bekk.no/2009/11/02/riktig-feilhandtering-det-finnes-bare-tre-feiltyper/">Applikasjonsfeil, Systemfeil og Programmeringsfeil</a>). For hver feiltype defineres en ID som feiltypen bærer med seg (typisk en Enum spesifisert i constructor). Denne tilnærmingen kan ses på som <em>sentralisert</em>.</li>
<li>Kombinasjoner av disse, for eksempel et fåtall sentrale Exception-klasser med distribuerte subklasser.</li>
</ul>
<div style="text-align: center;"><img style="border: 1px solid black;" title="Sentralisert feilhierarki" src="http://open.bekk.no/wp-content/uploads/2009/11/SentralisertFeilhierarki.png" alt="Sentralisert feilhierarki" /><br />
<em>Sentralisert feilhierarki</em></div>
<p>Uavhengig av tilnærming er hensikten å gjenkjenne feilen og forstå hvorfor den oppstår. En driftsperson vil kanskje lage en erfaringsbase for kjente feilkategorier. En utvikler som skal feilrette har også god nytte av god feilkategorisering for å finne årsaken.</p>
<p>Min erfaring er at applikasjoner lykkes best med en sentralisert tilnærming, der man definerer feilkategoriene som en felles Enum. Rammeverk (f.eks. Java SE API og Spring Framework) velger gjerne en distribuert tilnærming; ettersom dette ikke er applikasjoner har man ikke det samme behovet for sentral oversikt over feilkategoriene.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">Enum</span> Kategori <span style="color: #009900;">&#123;</span> INGEN_PENGER, FEIL_ROLLE, UTESTENGT <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
...
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AbstractException<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">public</span> AbstractException<span style="color: #009900;">&#40;</span>Kategori kategori, ...<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      ...
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: center;"><em>Kategorisereing av feil ved hjelp av Enum</em></p>
<p><strong>Identifisering av feilhendelse</strong></p>
<p>For å finne ut av en spesifikk feil ønsker man å identifisere den unike hendelsen som forårsaket feilen. Typisk er dette en situasjon der en bruker melder en feil eller når man feilsøker en hendelse som andre har rapportert tidligere. Å kunne identifisere denne ene feilen i en stor loggfil er gull verdt. Dette krever at hver enkelt feil blir logget med en unik ID.</p>
<p>En teknikk som fungerer bra nok i de fleste sammenhenger er å bruke tidspunktet feilen oppstår (i millisekunder) som ID. Denne IDen vises i feilsammenheng og skrives samtidig til feilloggen. Sannsynligheten for at to eller flere feil oppstår i samme millisekund er tilstede, men denne teknikken vil uansett begrense utvalget til et minimum. Funksjonaliteten for å lagre IDen implementeres i Exception-superklassen.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AbstractException<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> uid<span style="color: #339933;">;</span>
   <span style="color: #000000; font-weight: bold;">public</span> AbstractException<span style="color: #009900;">&#40;</span>...<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      uid <span style="color: #339933;">=</span> <span style="color: #003399;">System</span>.<span style="color: #006633;">currentTimeMillis</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// skrives til loggen</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: center;"><em>Eksempel på identifisering av Exception-instans med timestamp.</em></p>
<p><strong>Oppsummering</strong></p>
<p>God feilhåndtering forutsetter riktig kategorisering av feil i tillegg til støtte for å identifisere hver enkelt feilhendelse. Som alltid krever dette at man har et bevisst og målrettet forhold til feilhåndtering gjennom hele prosjektløpet. Det er fullt mulig å unngå at feilkategorisering og idendifisering av feilhendelse blir klattet på mot slutten av et prosjekt; å involvere driftpersoner som kravstillere på lik linje med annen funksjonalitet er en god start. God kontekstinformasjon i en feilsituasjon er også viktig, dette blir et eget tema i denne serien.</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/2009/11/18/riktig-feilhandtering-feilkategori-og-hendelse/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Riktig feilhåndtering: Det finnes bare tre feiltyper</title>
		<link>http://open.bekk.no/2009/11/02/riktig-feilhandtering-det-finnes-bare-tre-feiltyper/</link>
		<comments>http://open.bekk.no/2009/11/02/riktig-feilhandtering-det-finnes-bare-tre-feiltyper/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 19:24:47 +0000</pubDate>
		<dc:creator>Trond Arve Wasskog</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Kvalitet og testing]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[driftbarhet]]></category>
		<category><![CDATA[feilhåndtering]]></category>
		<category><![CDATA[kvalitet]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=1484</guid>
		<description><![CDATA[Det finnes bare tre feiltyper: Applikasjonsfeil, Systemfeil og Programmeringsfeil. 
]]></description>
			<content:encoded><![CDATA[<p>I en applikasjon finnes det bare typer feil:</p>
<ul>
<li>Applikasjonsfeil</li>
<li>Systemfeil</li>
<li>Programmeringsfeil</li>
</ul>
<p>Applikasjonsfeil skyldes at funksjonelle forutsetninger ikke er tilfredsstilt. I praksis er dette gjerne ugyldig eller feilformatert input som for kort fødselsnummer, e-postadresse uten @, dobbeltføring av betaling eller en kunde som har utilstrekkelig bonusnivå for å utføre en handling. Applikasjonsfeil kan sies å være forventet og skal håndteres på lik linje med andre krav. Det kan være krevende å forutse alle slike feilsituasjoner. Erfaringsmessig har forretningsfolk god oversikt over de vanligste funksjonelle problemene, mens teknikere er flinke til å tenke på grenseverdier og inkonsistens. En iterativ tilnærming med teknikker som test-drevet utvikling, brukerhistorier og BDD vil avsløre de fleste applikasjonsfeilene. I utgangspunktet skal det ikke være nødvendig å feilrette og rulle ut en ny versjon av applikasjonen for denne typen feil. For å håndtere applikasjonsfeilene som allikevel slipper ut i produksjon er det viktig med hyppig utrulling slik at man kan fange opp disse etterhvert som man får praktisk erfaring med systemet.</p>
<p>Systemfeil skyldes feil i applikasjonens omgivelser eller infrastruktur. Typisk er dette en disk som går full, et nettverk som blir utilgjengelig eller en server blir overbelastet. Slike feil er også til en viss grad forventet; de opptrer sjelden, kan være vanskelig å forutse, men i praksis er det gjerne rimelig enkelt å teste slike feilsituasjoner. Ved systemfeil kan det gi mening å kjøre <em>fail-over</em> om mulig, alternativt vente en stund for deretter å prøve operasjonen på nytt; denne type feilhåndtering tilbys gjerne av meldingssystemer. Feilretting og ny utrulling skal ikke være nødvendig for denne feiltypen.</p>
<p>Programmeringsfeil skyldes at utviklere ikke har gjort jobben sin. De oppstår når applikasjonen ikke klarer å håndtere uventede hendelser på på robust vis. Typiske eksempler på dette (i en Java-applikasjon) er når systemet spyr ut feil av typen NullPointerException, NoSuchElementException og IndexOutOfBoundsException. Godt håndtverk med teknikker som TDD og automatisert testing, parprogrammering og kodegjennomgang er effektive tilnærminger for å minimere denne typen feil. Når en programmeringsfeil oppstår krever det en feilretting og påfølgende utrulling av ny versjon.</p>
<p>Tabellen under gir en oversikt over feiltypene og om de bør fanges og håndteres i applikasjonen, om det er mulig å vente litt og prøve operasjonen på nytt samt om den krever feilretting og utrulling av ny versjon:</p>
<table border="1" align="center">
<tbody>
<tr>
<th>Type</th>
<th>Fanges og håndteres?</th>
<th>Prøve på nytt?</th>
<th>Feilretting og utrulling?</th>
</tr>
<tr style="text-align: center;">
<td>Applikasjonsfeil</td>
<td>Ja/Mulig</td>
<td>Nei</td>
<td>Nei</td>
</tr>
<tr style="text-align: center;">
<td>Systemfeil</td>
<td>Nei/Mulig</td>
<td>Ja</td>
<td>Nei</td>
</tr>
<tr style="text-align: center;">
<td>Programmeringsfeil</td>
<td>Nei</td>
<td>Nei</td>
<td>Ja</td>
</tr>
</tbody>
</table>
<p>Dårlig feilhåndtering er dessverre alt for utbredt i vår industri. Antall stacktrace i loggen er en indikator på hvilken kvalitet applikasjonen har; applikasjonsfeil og systemfeil skal være håndtert mens programmeringsfeil skal være luket ut i utviklingsprosessen. Et bevisst forhold til feiltyper og hvordan de bør håndteres er et godt utgangspunkt for å lykkes på dette området. Riktig feilhåndtering krever imidlertid målrettet innsats gjennom hele utviklingsløpet.</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/2009/11/02/riktig-feilhandtering-det-finnes-bare-tre-feiltyper/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Tekniske renter &#8211; en annen måte å måle teknisk gjeld på.</title>
		<link>http://open.bekk.no/2009/10/27/tekniske-renter-en-annen-mate-a-male-teknisk-gjeld-pa/</link>
		<comments>http://open.bekk.no/2009/10/27/tekniske-renter-en-annen-mate-a-male-teknisk-gjeld-pa/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 14:47:52 +0000</pubDate>
		<dc:creator>Aslak Johannessen</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Kvalitet og testing]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[forvaltning]]></category>
		<category><![CDATA[kontinuerlig forbedring]]></category>
		<category><![CDATA[teknisk gjeld]]></category>
		<category><![CDATA[tekniske renter]]></category>
		<category><![CDATA[utviklingshastighet]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=1473</guid>
		<description><![CDATA[Teknisk gjeld er et velkjent begrep for de fleste og brukes ofte som en betegnelse på hvor god helse koden har. Begrepet peker på de delene av en kodebase som ikke er av god kvalitet. Hensikten med å klassifisere disse delene er selvfølgelig at man senere skal komme tilbake å fikse opp i ugjerningen. Den [...]]]></description>
			<content:encoded><![CDATA[<h3>Teknisk gjeld er et velkjent <a href="http://en.wikipedia.org/wiki/Technical_debt">begrep</a> for de fleste og brukes ofte som en betegnelse på hvor god helse koden har. Begrepet peker på de delene av en kodebase som ikke er av god kvalitet. Hensikten med å klassifisere disse delene er selvfølgelig at man senere skal komme tilbake å fikse opp i ugjerningen. Den klassiske måten å måle teknisk gjeld på er å lage en liste med punkter over kjent gjeld, for deretter å telle antall punkter på listen.</h3>
<p>Hvis man tar innover seg gjeldsbegrepet så er det i praksis ikke gjelden, men rentene som kjennes på kroppen. Vi mener at det er mer hensiktsmessig å måle tekniske renter enn teknisk gjeld. Rentene kan man enkelt finne ved å se på differansen mellom hvor lang tid det tar å implementere en oppgave i et nyoppstartet utviklingsprosjekt i forhold til i forvaltning. Hvis man bruker 1 time på å lage en avkryssningsboks i nyutvikling og 8 timer i forvaltning, kan man regne med at 7 av disse timene er renter. Hastigheten man en gang hadde er nå redusert, differansen velger vi å se på som tekniske renter. Dette er tid som er lite nyttig og oppleves som frustrerende, tid som vi gjerne ønsker å bruke til noe annet.</p>
<p>I BEKK forvaltning har vi mange prosjekter med en hel del nedskrevet og noe glemt gjeld. Vi har undersøkt om vi kan måle de tekniske rentene på denne gjelden og om dette kan gi oss et bedre bilde av hvilke utfordringer vi står ovenfor. Målet er å kunne gjøre forvaltning av applikasjoner på en bedre måte.</p>
<p>Ved å notere når man betaler tekniske renter fant vi raskt ut hvilken størrelseorden gjelden var på. Samtidig ser vi i hvilken del av applikasjonen gjelden befinner seg. Delen med gjeld er den delen av systemet man jobber med når rentene betales. Grafen under viser hvordan vi ser for oss en slik rentebetaling gjennom utviklingsløpet. Hastigheten eller &#8220;Valuta for pengene&#8221; på y-aksen og tid langs x-aksen.</p>
<div id="gx1n" style="text-align: left;">
<div style="text-align: center;"><img style="width: 648px; height: 415.396px;" src="http://docs.google.com/File?id=dhmkvkzc_162ttbcszp_b" alt="" /></div>
<p>De faktorene vi har tatt for oss vil hver for seg senke utviklingshastigheten. Hver av faktorene peker på et området hvor vi betaler renter og derfor har teknisk gjeld. Det finnes mange flere punkter og de varierer selvfølgelig fra prosjekt til prosjekt. Dette er vår liste, du kan sikkert finne flere punkter vi hadde satt pris på om du legger de til i kommentarfeltet.</p>
<p>Figuren over viser at hvis man for eksempel mister fokus på å skape verdi så vil hastigheten synke over tid. Hvis man i tillegg mister overføring av kompetanse vil utviklingshastigheten reduseres ytligere på grunn av manglende kompetanse hos de som skal gjøre jobben framover. Konsekvensen av de ulike punktene akkumulerer slik at de totalt bidrar til en reduksjon av utviklingshastigheten.</p>
<p><em>Verdifokus</em><br />
Prosjekter som har gått lenge har ofte en tendens til å bli preget av at prosjektet i bunn og grunn består i å rette feil. Det har tapt verdifokus i og med at man jobber med ting som ikke nødvendigvis gir mest verdi for pengene. I disse situasjonene har man ofte mistet overblikket og retningen for hvorfor prosjektet er i drift. Samtidig som koden man skriver blir vanskelig å vedlikeholde når de store linjene ikke tydelig kommer fram.</p>
<p><em>Kompetanse</em><br />
Ofte ser vi prosjekter som sprinter mot lansering og i det prosjektet er ferdig går hele teamet over på nye prosjekter. Med de forsvinner også viktig kunnskap. Vi ser at ved å overlappe forvaltningsteamet med utviklingsteamet (dette kan gjøres på mange måter) slipper vi å gjenoppdage rutiner og konvensjoner. Tid man kan bruke på viktigere ting.</p>
<p><em>Automatiserte tester</em><br />
Prosjekter av en viss alder har ikke automatiserte tester, eller tester i det hele tatt. Renter blir her betalt ved å opprette tester og regresjonstester for de delene av systemet hvor man skal gjøre endringer. Det å få tilbakebetalt disse rentene kan ta mye tid, men vi obsererer gang på gang at det er helt essensielt for at utviklinghastigheten skal øke.</p>
<p><em>Byggerutiner</em><br />
Hvis noe gjør vondt, gjør det ofte. Hvis du gjør noe ofte, automatiser det. Det sier seg selv at slike oppgaver er repetitive, og hvis du gjør dem ofte tar de mye tid. Som igjen gjør at du bruker mye tid på å gjøre disse oppgavene.</p>
<p><em>Historie</em><br />
Vi har i noen prosjekter brukt mye tid på å finne bakgrunnen for en designavgjørelse. I andre prosjekter har dette vært dokumentert ved god og uttrykksfull kode eller i form av en god og forståelig commit melding. Dette er steder hvor informasjonen er knyttet til kontekst (revisjon eller integrasjonspunkter) og hvis integrasjonspunktet endrer seg vil man med større sannsynlighet slette koden, i motsetning til dokumentet som omhandler det.</p>
<p>Hvert av punktene beskriver hvordan vi identifiserer at vi betaler renter og hvordan vi løste våre problemer. Det vi ønsker å få fram er ikke nødvendigvis størrelsen på den tekniske gjelden men hvordan man identifiserer den ved å se på betaling av renter. Ved å identifisere det vil man også være i en bedre posisjon for å ta problemet ved roten.</p>
<h4>Konsekvensene ved å ta opp teknisk gjeld er ikke nødvendigvis gjelden i seg selv, men rentene du betaler på den. Dette viser seg i den ekstra tiden du bruker på oppgaver som gikk raskere før. Gjelden må håndteres for at utviklingshastigheten ikke skal bremse opp. Det koster dine kunder mye, og gir deg kjedelige oppgaver.</h4>
</div>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/2009/10/27/tekniske-renter-en-annen-mate-a-male-teknisk-gjeld-pa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
