<?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>Sterk blanding &#187; Programmering</title>
	<atom:link href="http://sterkblanding.no/blog/category/programmering/feed/" rel="self" type="application/rss+xml" />
	<link>http://sterkblanding.no</link>
	<description>– Sterke meninger om IT og ledelse</description>
	<lastBuildDate>Wed, 11 Jan 2012 10:00:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Code templates &#8211; ukjent gullgruve for utviklere ?</title>
		<link>http://sterkblanding.no/blog/2011/09/07/code-templates-ukjent-gullgruve-for-utviklere/</link>
		<comments>http://sterkblanding.no/blog/2011/09/07/code-templates-ukjent-gullgruve-for-utviklere/#comments</comments>
		<pubDate>Wed, 07 Sep 2011 19:34:01 +0000</pubDate>
		<dc:creator>Anders Karlsen</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=1234</guid>
		<description><![CDATA[Mange som programmerer enten i java eller i andre programeringsspråk har en gullgruve rett under beina uten å vite om det, nemlig deres utviklingsmiljø eller IDE (Integrated Developing Enviroment). Jeg vil her beskrive Code Templates som finnes i de fleste IDE-er, og som kan hjelpe deg til en mer effektiv programmeringshverdag. Code templates kan generere [...]]]></description>
			<content:encoded><![CDATA[<p>Mange som programmerer enten i java eller i andre programeringsspråk har en gullgruve rett under beina uten å vite om det, nemlig deres utviklingsmiljø eller IDE (Integrated Developing Enviroment). Jeg vil her beskrive Code Templates som finnes i de fleste IDE-er, og som kan hjelpe deg til en mer effektiv programmeringshverdag. Code templates kan generere de rutinepregede delene av koden for deg slik at du kan konsentrere deg om det som gir forretningsverdi.</p>
<p><span id="more-1234"></span></p>
<p><em>Ville du ha brukt notepad til å skrive kode ?</em><br />
Selvsagt (forhåpentligvis) ikke. Vi bruker IDE til programmering fordi det gir en sikrere og raskere prosess. Moderne IDE-er inneholder et arsenal av verktøy. En av disse er code templates. Jeg skal her gå igjennom hvordan man kan bruke de innebygde code templatene eller endre disse slik at de passer perfekt. Man kan også lage nye selv. Jeg vil her bruke Eclipse og Java som et eksempel. Code templates finnes derimot i flere IDE-er (som for eksempel InteliJ og Netbeans) og kan også benyttes på samme måte i andre programeringsspråk enn java.</p>
<h2>Bruk de innebygde code templatene</h2>
<p>Eclipse kommer med mange innebygde templates. Disse listes opp under Preferences-Java-Editor-Templates. For å aktivere templaten i koden trykker du &#8220;Ctrl-Space-Space&#8221;.</p>
<p>Skal du opprette en junit-test (og det gjør du vel en del ganger?) finnes det en template for å dette. Denne ser slik ut:</p>
<p><a href="http://sterkblanding.no/files/2011/09/testtemplate.jpg"><img class="alignnone size-full wp-image-1242" src="http://sterkblanding.no/files/2011/09/testtemplate.jpg" alt="" width="512" height="75" /></a></p>
<p><a href="http://sterkblanding.no/files/2011/09/testtemplate.jpg"></a>Her lages det en metode annotert med test. org.junit.Assert importeres statisk. Og cursoren settes inne i metoden. Det opprettes også en variabel (testname). Dette gjør at brukeren skriver rett etter genereringen fylles inn der.</p>
<p>Det er fullt mulig å editere på templatene hvis de ikke passer helt. Dersom man for eksempel bruker fest assert så trenger man ikke statisk import av org.junit.Assert. Det er bare å slette den delen.</p>
<p>Ta deg tid til å ta en titt på de innebygde templatene. Det er antgelig flere ting du gjør ofte som det finnes templates som gjør denne jobben lettere.</p>
<h2>Lag dine egne templates</h2>
<p>Man kan også lage sine egne templates. Her skal vi ta for oss to eksempler.</p>
<h2>Template for equals metode</h2>
<p>Vi skal her se på en template for en eguals metode (Jada, det finnes mange andre måter for å enkelt lage en equalsmetode, men dette er et eksempel)</p>
<p><a href="http://sterkblanding.no/files/2011/09/equaltemplate1.jpg"><img class="alignnone size-full wp-image-1238" src="http://sterkblanding.no/files/2011/09/equaltemplate1.jpg" alt="" width="446" height="326" /></a></p>
<p>Minst 99% av alle equalsmetoder starter med å sjekke at objektet er av riktig type. Siden klassenavnet varierer fra klasse til klasse (duh), bruker vi en variabel &#8220;enclosing_type&#8221;. Denne erstates med navnet på klassen vi er i. I tillegg caster vi deretter objektet til den aktuelle typen. Det er i tillegg lagt på en nullsafe equalsmetode som kan brukes til å sjekke de aktuelle atributtene. Vi har også tatt med en gyldig (men ikke veldig bra) implementasjon av hashCode slik at man oppfyller kontrakten mellom equals og hashcode.</p>
<h2>Template for å generere en factory metode</h2>
<p>Mange ganger er det nyttig å opprette en klasse med en statisk metode. Følgende template hjelper deg på vei her :</p>
<p><a href="http://sterkblanding.no/files/2011/09/createTemplate.jpg"><img class="alignnone size-full wp-image-1240" src="http://sterkblanding.no/files/2011/09/createTemplate.jpg" alt="" width="662" height="128" /></a></p>
<p>Som vi ser brukes det mye av de samme teknikkene som i equals templaten. Det som er nytt er bruken av variable. Variable er felt som brukeren kan editere på umiddelbart etter å ha kjørt templaten. Her bruker vi dette til å redigere på variabelnavnet (som jo varierer mye fra klasse til klasse). Feltnavnet brukeren skriver inn oppdateres tre steder:</p>
<ol>
<li>I feltnavnet</li>
<li>I parameteren til metoden</li>
<li>I tilordningen på begge sider av likhetstegnet.</li>
</ol>
<p>Disse templatene er bare eksempeler. I et hvert domene finnes det noe som gjøres mange ganger og er nesten likt. Tenk deg om. Antagelig finnes det noe code templates kan hjelpe deg med. Hvis du vil kopiere noen av templatene fra eksemplene finner du dem og noen til <a href="https://github.com/anders88/eclipseTemplates/blob/master/templates.txt">her</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2011/09/07/code-templates-ukjent-gullgruve-for-utviklere/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hvordan sikre at brukerhistorien blir levert som kunden forventer</title>
		<link>http://sterkblanding.no/blog/2011/08/11/hvordan-sikre-at-brukerhistorien-blir-levert-som-kunden-forventer/</link>
		<comments>http://sterkblanding.no/blog/2011/08/11/hvordan-sikre-at-brukerhistorien-blir-levert-som-kunden-forventer/#comments</comments>
		<pubDate>Thu, 11 Aug 2011 15:12:40 +0000</pubDate>
		<dc:creator>Øyvind Norstein Øvregård</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Smidig]]></category>
		<category><![CDATA[Test]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=1202</guid>
		<description><![CDATA[Har du noen gang opplevd å levere noe du trodde kunden ville ha, men som i ettertid viste seg å være noe helt annet en hva kunden forventet? Hvorfor gikk det galt? Ofte er det slik at du og kunden hadde forskjellig forståelse av hva som skulle lages. Denne forståelsen var sannsynligvis ganske identisk i [...]]]></description>
			<content:encoded><![CDATA[<p>Har du noen gang opplevd å levere noe du trodde kunden ville ha, men som i ettertid viste seg å være noe helt annet en hva kunden forventet? Hvorfor gikk det galt?</p>
<p><span id="more-1202"></span>Ofte er det slik at du og kunden hadde forskjellig forståelse av hva som skulle lages. Denne forståelsen var sannsynligvis ganske identisk i begynnelsen, men manglende kommunikasjon underveis førte til antakelser som viste seg å være feil.</p>
<p>Kunden: &#8220;Hvordan går det?&#8221;<br />
Du: &#8220;Det går kjempe bra! Er allerede i Sandefjord!&#8221;<br />
Kunden: &#8220;Hva mener du med at du er i Sandefjord??&#8221;</p>
<p>Du satte deg i bilen din og kjørte til Kristiansand, mens kunden står og venter i Kristiansund. Hvorfor står dere på hver deres side av landet? Det som tilsynelatende var krystallklart for både deg og kunden i begynnelsen, resulterte i en skivebom av dimensjoner (ca 887 km). Hadde dere hatt en dialog underveis, ville dere mest sannsynlig kunne oppklart misforståelsen på et tidligere tidspunkt.</p>
<p>Selv om dette eksemplet kan virke banalt, så illustrerer det noe veldig viktig. Dersom man ikke får kontinuerlig feedback på det man driver på med, kan man fort ende opp med å kjøre i feil retning.</p>
<p>Veien til suksess handler om kommunikasjon med kunden. Kontinuerlig feedback sikrer at dere har felles forståelse for hvor dere skal. Det beste hadde selvfølgelig vært å ha kunden med i passasjersetet hele veien. Dette er ikke alltid mulig, men vi har noen gode erfaringer med hvordan man kan oppnå lignende nivå av kommunikasjon likevel.</p>
<p><strong>Fem gode tips for å sikre at brukerhistorien blir levert som kunden forventer</strong></p>
<p><strong>1. Bruk et felles språk som både kunde og utviklere forstår.</strong><br />
Utviklere generelt har en tendens til å bruke veldig mye tekniske uttrykk og forkortelser. Dette er et språk kunden ikke forstår og finner frustrerende. Få vil innrømme at de ikke forstår meningen av redsel for å fremstå som mindre smarte. Språk av slik art kan også fort bli tatt for god fisk, fordi det høres &#8220;fancy&#8221; ut og kan fort føre til misforståelser. Lytt til hvordan kunden beskriver og referer til ting og forsøk å tilpasse deg språket deres. I denne sammenheng er det alltid utviklerene som må tilpasse seg domenespråket til kunden, og ikke motsatt. Likevel er det vikitig å introdusere kunden for nye konsepter som for eksempel en &#8220;hendelse&#8221;, uten å beskrive dette på et teknisk nivå. Språket er noe som du utvikler sammen med kunden over tid. Sørg for å danne basisen for dette språket allerede fra starten av prosjektet.</p>
<p><strong>2. Start arbeidet ditt sammen med kunden før du begynner å skrive en eneste linje med kode.</strong><br />
Med dette oppnår du flere ting. For det første må du sette deg inn i problemstillingen for å i det hele tatt kunne føre en fornuftig dialog med kunden. Allerede nå får du bedre forståelse av hva som skal lages, både fordi du har tenkt over det på egenhånd, og du kanskje får svar på flere sentrale spørsmål gjennom dialog med kunden før du starter. For det andre så involverer du kunden fra starten av. Kunden vil føle det betryggende at han er involvert i prosessen. De er da i mye bedre stand til å gi deg løpende tilbakemeldinger.</p>
<p><strong>3. Lag et førsteutkast med akseptansekriterier</strong><br />
Akseptansekriteriene definerer hva som skal til for at brukerhistorien er ferdigutviklet. Dette bør være skrevet på det felles språket som dere sammen har kommet frem til. Kriteriene bør kun inneholde den funksjonaliteten som er innenfor denne brukerhistorien. Ikke inkluder kriterier for eksisterende funksjonalitet eller funksjonalitet som er utenfor scope.</p>
<p>En idé kan være å formulere akseptansekriteriene dine på dette formatet:<br />
Gitt at jeg har kr 100,-på visakortet mitt<br />
Når jeg kjøper en øl til kr 60,- med visakortet mitt<br />
Så skal jeg ha kr 40,- igjen på visakortet</p>
<p>Dette er et format fra Behavior driven development (BDD)-evangelistene som vi ikke kommer til å gå nærmere inn på i denne artikkelen.</p>
<p>Utviklere jobber best med konkrete eksempler, dette krever at du er presis. Når du utarbeider førsteutkastet med akseptansekriterier kommer det fort opp nye problemstillinger som man først ser når man graver seg dypere ned i detaljene. Utkastet er et godt utgangspunkt for videre diskusjon med kunden. Gjennom akseptansekriteriene dine skinner det igjennom hvordan du har oppfattet kundens behov.</p>
<p><strong>4. Kall inn kunden til et møte, med utgangspunkt i førsteutkastet av akseptansekriteriene.</strong><br />
Selv om du forhåpentligvis har hatt kontinuerlig kommunikasjon med kunden underveis, så blir et slikt møte en &#8220;reality check&#8221;. I dette møtet vil du få kjapp tilbakemelding på hvordan &#8220;din verden&#8221; stemmer overens med &#8220;kundens verden&#8221;. Du har allerede nå satt deg godt inn i problemstillingen, og har noe konkret å diskutere med kunden. Dette gjør deg i stand til å diskutere utfordringer som er på et mer detaljert nivå enn tidligere. Kunden vil som oftest stille spørsmål rundt flere av formuleringene i akseptansekriteriene dine. Slike spørsmål tyder på at du har uttrykt noe uklart, som ofte kan føre til misforståelser. Da er det helt nødvendig å stoppe opp, tenke seg om , og omformulere. Grav deg ned i hva uklarheten dreier seg om, og omformuler akseptansekriteriet sammen. På denne måten sikrer du at kunden får det han ber om, og du får en bedre forståelse av hva som skal lages og hvilken verdi dette gir til kunden.</p>
<p><strong>5. Ha en kontinuerlig feedback-loop med kunden.</strong><br />
Utviklerene har nå noe konkret å ta tak i. Det er fortsatt en del ting som ikke er avklart, men hovedessensen er på plass. Det dukker alltid opp nye problemstillinger etter at utviklingen har startet. Avklaringsprosessen er noe som går igjennom hele utviklingsløpet til brukerhistorien, men du har nå et godt grunnlag for å håndtere nye utfordringer som måtte oppstå. Du har dannet kommunikasjonskanalen, kunden er involvert fra starten av, og utviklerene har et klart definert sett av kriterier som de kan forholde seg til.</p>
<p>For å si det kort; involvér kunden så tidlig som mulig, kommunisér på et språk som dere har blitt enige om, og sørg for å få kontinuerlig feedback. Da vil man unngå mange unødvendige misforståelser og dere vil begge føle et felles eierskap til det som skal leveres. En bonuseffekt er at man kan etterprøve akseptansekriteriene når brukerhistorien er levert. Dette er mye enklere å gjøre ettersom kriteriene er noe dere har blitt enige om sammen, helt fra starten.</p>
<p>Dette er noen av våre erfaringer fra et av Norges største smidige prosjekter.<br />
Hva er dine erfaringer?</p>
<p>Øyvind Norstein Øvregård<br />
Finn-Robert Kristensen</p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2011/08/11/hvordan-sikre-at-brukerhistorien-blir-levert-som-kunden-forventer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Er dette riktig?</title>
		<link>http://sterkblanding.no/blog/2011/05/04/er-dette-riktig/</link>
		<comments>http://sterkblanding.no/blog/2011/05/04/er-dette-riktig/#comments</comments>
		<pubDate>Wed, 04 May 2011 10:48:54 +0000</pubDate>
		<dc:creator>christingorman</dc:creator>
				<category><![CDATA[Kompetanse]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Samhandling]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=1159</guid>
		<description><![CDATA[Spør du deg dette når du skriver kode? Hvem stiller du spørsmålet til? Hvem kan egentlig si om kode er riktig eller ikke? Det finnes ingen fasit innen programmering. Man bør ikke se kode som enten riktig eller gal, men heller som fungerende eller ikke-fungerende. Får den testen til å bli grønn. Ja da fungerer [...]]]></description>
			<content:encoded><![CDATA[<p>Spør du deg dette når du skriver kode?  Hvem stiller du spørsmålet til? Hvem kan egentlig si om kode er riktig eller ikke?  Det finnes ingen fasit innen programmering.  Man bør ikke se kode som enten riktig eller gal, men heller som fungerende eller ikke-fungerende. Får den testen til å bli grønn. Ja da fungerer koden som den skal.  Klapp deg selv på skulderen. Well done!</p>
<p><span id="more-1159"></span>Nå skal det selvsagt sies at man helst bør følge de maler og bruke de rammeverk som arkitekten eller teamet sammen har tenkt at prosjektet skal bruke.  Sånn sett finnes det regler for hva som er rett og galt.  Men når det finnes slike maler og rammeverk, da stiller vi oss ikke dette spørsmålet. Det er når vi beveger oss utenfor de etablerte malene at spørsmålet gjerne dukker opp: Er dette riktig?  Og det er litt trist når det skjer.  For det er tegn på at vi ikke stoler på oss selv til å kunne komme med gode nok løsninger.  Og det synes jeg vi skal gjøre.  Det har vi all grunn til å gjøre, flinke som vi er <img src='http://sterkblanding.no/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Vi bør absolutt fortsette med å stille spørsmål om hvorvidt koden vår kan forbedres. Men spørsmålet bør heller være &#8220;Hva synes du?&#8221; Vi bør fortsette med å involvere flest mulig. Men det bør gjøres som en diskusjon blant proffesjonelle utviklere der alle har gode poenger å komme med, og ingen sitter med fasiten.  Det er da det er morro å jobbe som et team.</p>
<p>Programmering burde ikke bare oppleves som å fargelegge inni ferdig-opptegnede figurer. Det burde være litt frihånds-arbeide også.  Det er når du føler at du er med på å skape løsningen at det er gøy å programmere.  Og det er når man har det gøy at man jobber best og utvikler seg mest.</p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2011/05/04/er-dette-riktig/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Hvordan lage minesveiper i JavaScript på under 14 minutter</title>
		<link>http://sterkblanding.no/blog/2011/03/25/hvordan-lage-minesveiper-i-javascript-pa-under-14-minutter/</link>
		<comments>http://sterkblanding.no/blog/2011/03/25/hvordan-lage-minesveiper-i-javascript-pa-under-14-minutter/#comments</comments>
		<pubDate>Fri, 25 Mar 2011 09:48:08 +0000</pubDate>
		<dc:creator>Thomas Kjeldahl Nilsson</dc:creator>
				<category><![CDATA[Frontend]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Smidig]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=1139</guid>
		<description><![CDATA[Denne øvelsen ble opprinnelig utført foran publikum på Go Open / Communities in Action eventet i mars 2011. En code kata er en enkel øvelse for å skjerpe programmeringsferdighetene dine. Det vil si &#8211; du trener bare problemløsning den første gangen du utfører øvelsen. Så gjentar du øvelsen, om og om igjen, til det sitter i [...]]]></description>
			<content:encoded><![CDATA[<p><em>Denne øvelsen ble opprinnelig utført foran publikum på Go Open / Communities in Action eventet i mars 2011.</em></p>
<p>En <a title="Code Kata" href="http://codekata.pragprog.com/">code kata</a> er en enkel øvelse for å skjerpe programmeringsferdighetene dine. Det vil si &#8211; du trener bare problemløsning den første gangen du utfører øvelsen. Så gjentar du øvelsen, om og om igjen, til det sitter i fingerspissene. Og hver gang prøver du å gjøre det litt kjappere. Hensikten er å trene hastighet, teknikk og verktøy.</p>
<p>I klippet under lager jeg en variant av <a title="Minesweeper code kata" href="http://codingdojo.org/cgi-bin/wiki.pl?KataMinesweeper">Minesweeper</a> kataen i JavaScript.</p>
<p><!-- Artiss Code Embed v1.5 | http://www.artiss.co.uk/artiss-code-embed -->
<object width="640" height="480"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=21474244&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=21474244&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="480"></embed></object><!-- End of Artiss Code Embed code -->
</p>
<p>(Kjør den i fullscreen for å se koden mer tydelig)</p>
<p>Merk: Jeg bruker testdrevet utvikling gjennom det meste av prosessen. På slutten dropper jeg TDD når jeg gjør det visuelle og selve spillmekanikken. Dette kunne også testes fra kode, men jeg droppet det for å gjøre den mer artig å se på. <img src='http://sterkblanding.no/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Du kan <a title="Minesveiper kata kode" href="https://github.com/thomanil/sweeper">se på koden i github-kontoen min</a>. Hver commit er en separat gjennomkjøring av øvelsen fra scratch.</p>
<p>Jeg brukte følgende libraries og verktøy:</p>
<ul>
<li><a title="Underscore.js library" href="http://documentcloud.github.com/underscore/">Underscore.js</a></li>
<li><a title="jQuery framework" href="http://jquery.com/">jQuery</a></li>
<li><a title="Grid.js library" href="https://github.com/thomanil/Grid">Grid.js</a></li>
<li><a title="clAutotest tool" href="https://github.com/thomanil/clAutotest">clAutotest</a></li>
<li><a href="http://macromates.com/">TextMate</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2011/03/25/hvordan-lage-minesveiper-i-javascript-pa-under-14-minutter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Konfigurasjon for de modige</title>
		<link>http://sterkblanding.no/blog/2010/11/07/konfigurasjon-for-de-modige/</link>
		<comments>http://sterkblanding.no/blog/2010/11/07/konfigurasjon-for-de-modige/#comments</comments>
		<pubDate>Sun, 07 Nov 2010 09:10:52 +0000</pubDate>
		<dc:creator>orjanlillevik</dc:creator>
				<category><![CDATA[Programmering]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=982</guid>
		<description><![CDATA[Visste du at det er mulig å kjøre mange forskjellige scriptspråk Java Virtual Machine? Vil du vite hva du kan bruke det til? Da er dette en bloggartikkel skrevet for deg.

Et  scriptspråk kan være et kraftig verktøy for å konfigurere  java-applikasjonen din.]]></description>
			<content:encoded><![CDATA[<p>Visste du at det er mulig å kjøre mange forskjellige scriptspråk Java Virtual Machine? Vil du vite hva du kan bruke det til? Da er dette en bloggartikkel skrevet for deg.</p>
<p>Et scriptspråk kan være et kraftig verktøy for å konfigurere  java-applikasjonen din. Det tillater endringer på en kjørende  applikasjon. Det gir deg frihet til å endre på kjørende javakode som du velger å eksponere. Det er kjent og kjær teknologi og derfor enklere å få tak i ansatte med riktig kompetanse enn om du velger mindre kjente teknologier. Og kanskje det viktigst av alt, et argument som burde veie tyngre enn det ofte gjør i avgjørelser; det er enkelt.</p>
<p><span id="more-982"></span></p>
<p>Min spontane reaksjon på forslaget var “er du gal!”. Målet var å kunne endre regler for automatisk saksbehandling mens systemet kjørte. Ideen var å eksponere disse reglene via jRuby. Min kollega, Trond Pedersen, som hadde kommet med forslaget lo litt og viftet det vekk som et forslag  fremmet bare for å vise at det er lov å tenke kreativt. Jeg lot ideen ligge resten av dagen. Først da jeg kom hjem lot jeg den få en rettferdig sjanse. Den var egentlig ganske tiltalende. Dersom vi valgte å  gjøre konfigurasjon via filer som inneholdt tekst og verdier ville vi  kunne slå av og på regler og sende inn verdier til reglene. Men hva om vi eksponerte et java-API via et scriptspråk istedet? Det åpner for å endre på hva man måtte ønske å eksponere. “Tør vi det” tenkte jeg.</p>
<p>Jeg bestemte meg for å se nærmere på ideen. Før jeg forelår noe sånt vil  jeg gjerne se hvordan vi kan løse det i praksis tenkte jeg. 30 minutter med litt leiting på verdensveven og litt lek og moro i eclipse hadde jeg et kjørende eksempel med en java-applikasjon som eksekverte jruby-kode. Et javaobjekt ble sendt som parameter til jrubyscriptet. Scriptet kalte metoder på javaobjektet og returnerte en verdi tilbake til  java-applikasjonen. Det finnes masse eksempler om man leter litt på  verdensveven men for at du skal slippe å lete så viser jeg mitt her.</p>
<p>Først litt javakode:<br />
<code>
<pre>
import java.io.File;
import java.io.FileReader;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class RunRuby {

public static void main(String[] args) throws Exception {

  ScriptEngineManager factory = new ScriptEngineManager();
  // Create a JRuby engine.
  ScriptEngine engine = factory.getEngineByName("ruby");

  // Evaluate JRuby code.
  engine.eval(new FileReader(new File("src/rubyscript.rb")));
  engine.put("object", new Object());

  // Run the ruby-method reverseToString
  String value = (String) engine.eval("reverseToString($object)");

  //java.lang.Object@something is printed backwards
  System.out.println(value);
  }
}
</pre>
<p></code><br />
Javakoden tolker en scriptfil, rubyscript.rb, og kjører metoden evaluate. Se eksempelkoden til rubyscript.rb:</p>
<p><code>
<pre>
require 'java'
def reverseToString(javaObject)

  # returns the reverse of the objects tostring method
  return javaObject.toString().reverse()

end</pre>
<p></code></p>
<p>Når passer det å bruke dette vektøyet til konfigurasjon? Når du vil gjøre endringer uten å måtte kompilere en ny applikasjon og starte den opp i produksjonsmiljøet ditt. Er det enkelt å forutse disse endringene kan du  trolig like gjerne gjøre det i en tekstfil med forhåndsdefinerte verdier som leses inn av applikasjonen din. Når du derimot synes det er vanskelig å forutse hvilke endringer du har lyst til å gjøre har du nå  et kraftig verktøy. Bruk et scriptspråk. Velg gjerne ditt eget  favorittscriptspråk. Om det er jRuby, JavaScript, Scala, Clojure eller et annet scriptspråk er opp til deg. Finn din favoritt som er kjørbar på JVM og du er igang på 1-2-3.</p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/11/07/konfigurasjon-for-de-modige/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Frihet til å lære: egenopplæring for systemutviklere</title>
		<link>http://sterkblanding.no/blog/2010/10/31/frihet-til-a-l%c3%a6re-egenoppl%c3%a6ring-for-systemutviklere/</link>
		<comments>http://sterkblanding.no/blog/2010/10/31/frihet-til-a-l%c3%a6re-egenoppl%c3%a6ring-for-systemutviklere/#comments</comments>
		<pubDate>Sun, 31 Oct 2010 21:14:21 +0000</pubDate>
		<dc:creator>Thomas Kjeldahl Nilsson</dc:creator>
				<category><![CDATA[Kompetanse]]></category>
		<category><![CDATA[Kursing]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[guide]]></category>
		<category><![CDATA[kompetanse]]></category>
		<category><![CDATA[kunnskapsmedarbeider]]></category>
		<category><![CDATA[læring]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=955</guid>
		<description><![CDATA[For noen dager siden besøkte jeg Dagen@IFI på UiO, hvor jeg promoterte Steria for informatikk-studenter. En student fortalte om en bekymring han hadde: &#8220;Dersom jeg velger feil kurs på skolen &#8211; låser jeg meg da til feil karriere?&#8221; Han ble lettet da jeg forsikret ham om at det ikke var tilfelle. For heldigvis er arbeidslivet [...]]]></description>
			<content:encoded><![CDATA[<p>For noen dager siden besøkte jeg <a href="http://dagen.at.ifi.uio.no/">Dagen@IFI</a> på UiO, hvor jeg promoterte Steria for informatikk-studenter. En student fortalte om en bekymring han hadde: <em>&#8220;Dersom jeg velger feil kurs på skolen &#8211; låser jeg meg da til feil karriere?&#8221;</em> Han ble lettet da jeg forsikret ham om at det ikke var tilfelle. For heldigvis er arbeidslivet det man selv gjør det til: du kan utvikle deg selv og skifte retning underveis.</p>
<p>Systemutviklere er både heldige og uheldige. Vi kan tilegne oss kunnskap og ferdigheter helt på eget initiativ, men vi tvinges også til å gjøre det for å holde oss relevante, ettersom teknologi endrer seg raskt.</p>
<p>Selv synes jeg at det er topp å plukke opp nye ting &#8211; her er noen metoder for å lære&#8230;</p>
<p><span id="more-955"></span></p>
<h1>Bredde eller dybde?</h1>
<p><strong>Tenk på kunnskap som personøkonomi.</strong> Ikke invester alt i en aksje <em>(&#8220;Jeg kan bare Java!&#8221;)</em>. Spre eggene dine over flere kurver. For all del: legg ned tid i mainstream-teknologi som er populær idag. C# og Java f.eks er lavrisiko med grei avkastning. Men se også på nisje-teknologi (la oss si F# eller Scala, for eksempel) Disse er mer høyrisiko fordi det absolutt ikke er sikkert de blir populære i fremtiden. Smale temaer gir til gjengjeld langt høyere avkastning <em>hvis</em> de slår an: du får et fortrinn fordi du var tidlig ute.</p>
<p><strong>Balanse mellom generelle og spesialiserte emner.</strong> Brede, eviggrønne felt (f.eks OO-design, regular expressions, statistikk) hjelper deg i mange år, uavhengig av domener og platformer. Men ikke overse domenekunnskap og platformspesifikke verktøy (Oracle og Microsoft) som gjør deg mer ettertraktet i prosjekter her og nå.</p>
<p><strong>Kultiver personlige styrker.</strong> Hvis du bare kan “litt om alt” så er det vanskelig å utmerke seg. Finn en eller to ting som er dine hovedpillarer, som du stadig forbedrer og behersker bedre enn andre.  Hva gjør at du skiller deg ut? Hva er ditt <em>&#8220;Unique Selling Point&#8221;</em>?</p>
<h1>Studieteknikk-kungfu</h1>
<p><strong>Du har et enormt arsenal av studieteknikker.</strong> Min erfaring: jeg lærer meg ting langt mer effektivt nå enn da jeg var i skoleverket eller på universitetet. Dels fordi jeg har blitt flinkere til å lære, men mest fordi vi har fått flere måter å tilegne oss kunnskap. Her er en liten godtepose av muligheter:</p>
<ul>
<li><a href="http://see.stanford.edu/">Universiteter</a> <a href="http://ocw.mit.edu/index.htm">verden</a> <a href="http://www.ocwconsortium.org/">over</a> legger ut åpen “courseware”: videoforelesninger, notater, pensum, oppgaver, fritt tilgjengelig på nett.</li>
<li><a href="http://peepcode.com/">Screencasts</a> er en fin blanding av foredrag og praktiske demonstrasjoner. Noen av dem må du betale for. De er derfor ofte <em>optimalisert</em> for å levere lærdom og verdi, mer enn en umotivert foreleser på Blindern noengang blir&#8230;</li>
<li><em>“So You&#8217;d Like To&#8230;”</em>-guidene hos Amazon.com er i noen tilfeller knallbra utvalg av faglitteratur og fungerer bra som utgangspunkt for selvstudium.</li>
<li>Online nyhetsblogger og foredrag fra konferanser gjør deg oppdatert på tilstanden i fagfeltet ditt.</li>
<li>Podcasts og lydbøker gjør iPoden din til en forelesningssal &#8211; kanskje mens du tar oppvasken?</li>
<li>Møt andre engasjerte i meetups, brukergrupper, code camps og online studiegrupper. Få feedback fra likesinnede, ikke gjem deg bort!</li>
<li>Open source lar deg kikke bak kulissene og se hvordan andre utviklere jobber og tenker.</li>
<li>Mindmapping er en sterk måte å ta gode, raske notater mens du studerer.</li>
</ul>
<p>Og dette var bare en tilfeldig utvalg. Med andre ord: dersom du begrenser deg til å kun lese en papirbok i ny og ne så handicapper du deg selv. <em>Du har mange muligheter!</em></p>
<p><strong>Absorber som en svamp.</strong> Hvis jeg har en ekstrem &#8220;læredag&#8221; så hører jeg på en podcast når jeg går til stasjonen på morran, leser litt i en relatert bok mens jeg sitter på toget, plugger inn iPoden igjen når jeg bytter over til tbanen til jobben, samme opplegg på veien hjem på ettermiddagen, og setter meg ned og koder en prototyp etter at ungene har lagt seg. Teknikkene nevnt i forrige avsnitt gjør det stadig enklere å presse inn læring flere steder i hverdagen enn man kunne før.</p>
<p><strong>Jevn progresjon</strong>. Store skippertak <em>kan</em> fungere, men det er i lengden bedre å lære litt hver dag istedet. Når man er student så fungerer sånne &#8220;overdoser&#8221; til en viss grad, men det blir vanskeligere når du har jobb og familie. Tenk bærekraftig tempo&#8230;</p>
<h1>Bruk det du lærer</h1>
<p><strong>Jobb med relevante prosjekter i arbeidstida.</strong> Dette er idealsituasjonen, men lar seg ikke alltid gjøre. Prosjekter krever vanligvis at vi leverer det vi allerede behersker, ikke det vi ønsker å lære mer om. Derfor kan det bli nødvendig å&#8230;</p>
<p><strong>Lage ting på fritida.</strong> Bruk det du har lært til å gjøre sideprosjekter på egenhånd. Ambisjon og omfang trenger ikke være all verden, bare du lager noe konkret og nyttig. Du kan lage et verktøy eller en tjeneste som bare du selv trenger, eller slippe det som open source eller en kommersiell tjeneste for hele verden. Poenget er at du anvender kunnskapen til noe konstruktivt. Det kan være slitsomt å bruke fritida til dette &#8211; til gjengjeld eier du selv det du lager. Og du får en &#8220;portfolio&#8221; å vise til.</p>
<p><strong>Lær det bort til andre!</strong> Når du formidler til andre (f.eks via kurs, blogging, foredrag) så tvinges du selv til å få bedre grep på stoffet ditt.  Du trenger ikke være guru for å lære bort ting &#8211; det holder at du har noenlunde grep om temaet og evner å formidle det godt.</p>
<p><em>Robert &#8220;Uncle Bob&#8221; Martin sa på et av foredragene sine at en profesjonell utvikler må bruke tjue timer hver uke på å forbedre seg som håndtverker. Dette er kanskje ekstremt &#8211; men hvor mye gjør du selv? Og hvordan lærer du nye ting? Del gjerne av egen erfaring i kommentarene under!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/10/31/frihet-til-a-l%c3%a6re-egenoppl%c3%a6ring-for-systemutviklere/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Jeg tror at du er den som kan ta initiativ til ”Loggvakt” i prosjektet ditt!</title>
		<link>http://sterkblanding.no/blog/2010/10/13/jeg-tror-at-du-er-den-som-kan-ta-initiativ-til-%e2%80%9dloggvakt%e2%80%9d-i-prosjektet-ditt/</link>
		<comments>http://sterkblanding.no/blog/2010/10/13/jeg-tror-at-du-er-den-som-kan-ta-initiativ-til-%e2%80%9dloggvakt%e2%80%9d-i-prosjektet-ditt/#comments</comments>
		<pubDate>Wed, 13 Oct 2010 06:21:47 +0000</pubDate>
		<dc:creator>Gudny Hauknes</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Smidig]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=897</guid>
		<description><![CDATA[Jeg bare må få komme med noen refleksjoner jeg gjorde meg her om dagen &#8211; basert på &#8220;opplevelser fra virkeligheten” i PERFORM-prosjektet hos Statens Pensjonskasse! I den intensive godkjenningsperioden vi har vært gjennom, ble rollen ”Loggvakt” opprettet. Rollen har holdt løpende oppsyn med serverlogger, gjort logganalyse og ytt bistand til Delprosjekt Test for preanalyse av [...]]]></description>
			<content:encoded><![CDATA[<h3>Jeg bare må få komme med noen refleksjoner jeg gjorde meg her om dagen &#8211; basert på &#8220;opplevelser fra virkeligheten” i PERFORM-prosjektet hos Statens Pensjonskasse!</h3>
<p>I den intensive godkjenningsperioden vi har vært gjennom, ble rollen ”Loggvakt” opprettet. Rollen har holdt løpende oppsyn med serverlogger, gjort logganalyse og ytt bistand til Delprosjekt Test for preanalyse av feil som rapporteres. Bemanning av rollen har gått på rundgang i prosjektet.<br />
<span id="more-897"></span><br />
Intet kunne ha gledet meg mer! Jeg selv var så heldig å få sitte loggvakt ”hjemme hos” Delprosjekt Test – og det to dager på rad attpåtil! Og det var da refleksjonene kom… Vi tar’n like godt på engelsk <img src='http://sterkblanding.no/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>During test intensive periods – engage your project members on &#8220;log surveillance duty&#8221;!</p>
<p>The person on duty has the chance of becoming a real detective! He or she should tail essential server logs continuously, analyse them and initiate proper action when e.g. specific stacktraces, log statements, log sequences or log-patterns appear. The log surveillance duty role should also take part in early analysis of important bug reports so that they can be handed over to relevant teams as fast as possible.</p>
<p>Using the log surveillance duty as one of several “bug hunt approaches”, the project may experience that bugs are caught earlier<em>. </em>In addition, <em>without </em>the log surveillance duty role, some of these bugs would <em>not have been reported at all</em>. You’ll see the effect of this during free testing in particular.</p>
<p>Imagine this “happy day situation” in your project:</p>
<p>“ALERT – we have a situation! Log statement GOOD_STUFF in the jBoss log”!</p>
<p>“Ta-ta-raaaa! Who did a search for GOOD_STUFF just a couple of minutes ago and got an error message? Ah-so you were the one! Grrrreat! Oh.. so – you’re &#8211; used to ignoring this error message- are you – ok…Please tell us when such messages appear, will you? It&#8217;s of great value! But now … What was your scenario again? And the five steps <em>preceeding</em> your scenario? Can you rerun it, please…..? Thanks! …..Bingoooo!! The GOOD_STUFF_BUG has been reproduced, it has been trapped! Juppie!! My hero tester! Could you report that bug for me, please?”</p>
<p>When assigning resources to the log surveillance duty role, people with different interests, orientations and skills should be motivated to take part! Experience the incredible opportunities just waiting to be used &#8211; to increase the over time quality of the system being built!</p>
<ul>
<li>One day – call a JEE architect, a senior developer for duty -</li>
<li>The day after that &#8211; a user scenario oriented person –</li>
<li>The next day a developer with DB-expertise -</li>
<li>A junior developer –</li>
<li>A technically oriented senior tester -</li>
<li>And then a &#8220;usability minded&#8221; one –</li>
</ul>
<p>Keep on rolling &#8211; keep on changing &#8211; keep on building system quality mind set &#8211; keep on spreading system understanding – keep on….</p>
<p>Don’t wait! Just do it! Market the log surveillance duty role and motivate your project members to take part! Prepare yourself to be called!</p>
<p>… I’ll bet you’ll take on new habits after you organized your first round – or the first time you participated – I’m sure!</p>
<p>So, get on with it! Good luck! </p>
<p>P.S:</p>
<p>Hvis du har lest min blogg fra 04/10/2010 og du allerede er på god vei til å bli en Buglock Holmes i prosjektet ditt, ser du nok at på loggvakta får du brukt alt det du har blitt vant til å gjøre som Buglock!</p>
<p>D.S.</p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/10/13/jeg-tror-at-du-er-den-som-kan-ta-initiativ-til-%e2%80%9dloggvakt%e2%80%9d-i-prosjektet-ditt/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Jeg vet at du kan bli prosjektets neste ”Buglock Holmes”!</title>
		<link>http://sterkblanding.no/blog/2010/10/04/jeg-vet-at-du-kan-bli-prosjektets-neste-%e2%80%9dbuglock-holmes%e2%80%9d/</link>
		<comments>http://sterkblanding.no/blog/2010/10/04/jeg-vet-at-du-kan-bli-prosjektets-neste-%e2%80%9dbuglock-holmes%e2%80%9d/#comments</comments>
		<pubDate>Mon, 04 Oct 2010 19:40:17 +0000</pubDate>
		<dc:creator>Gudny Hauknes</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Smidig]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=877</guid>
		<description><![CDATA[Uavhengig om du er juniorutvikler eller er du senior systemspesialist, er jeg sikker på at du kan bli prosjektets neste ”Buglock Holmes”! Hvis du vil&#8230;. Forbered deg til å bli Buglock Holmes på følgende måte: Ha en grov oversikt over områder de ulike teamene i prosjektet jobber med… Kjenn rimelig godt til hva produktkøen for [...]]]></description>
			<content:encoded><![CDATA[<p>Uavhengig om du er juniorutvikler eller er du senior systemspesialist, er jeg sikker på at <em>du</em> kan bli prosjektets neste ”Buglock Holmes”! Hvis du vil&#8230;.<br />
<span id="more-877"></span><br />
Forbered deg til å bli Buglock Holmes på følgende måte:</p>
<ul>
<li>Ha en grov oversikt over områder de ulike teamene i prosjektet jobber med…</li>
<li>Kjenn rimelig godt til hva produktkøen for prosjektleveransen inneholder…</li>
<li>Vit hva teamet ditt <em>og</em> hva andre team i prosjektet har levert …</li>
<li>Husk at det er nyttig å ha god oversikt over hvilke deler av produktkøen som <em>ikke </em>inngår i leveransen …</li>
<li>Sørg for at ørene dine vokser seg store og sterke! Vær nysgjerrig! Snus rundt!</li>
<li>Prøv å snappe opp ting som foregår hos naboteamet, ved kaffeautomaten…</li>
<li>Hold øye med serverloggene i integrasjonstestmiljøet for prosjektet…</li>
<li>Hold en rimelig god og helst løpende oversikt over hvilke feil som meldes inn i feilrapporteringssystemet i testintensive perioder …</li>
<li>Lær deg å huske nøkkelord og nøkkelsituasjoner, designdiskusjoner ved tavla og møter eller samtaler der viktige forståelser eller avklaringer ble skapt…</li>
<li>Husk situasjoner der folk var svært uenige om deler av løsningen…</li>
<li>Lær deg å huske situasjoner der man faktisk kom til enighet&#8230;</li>
<li>Bli pådriver for at viktige avklaringer og omforente tolkninger styres inn i klare krav, testbetingelser, skjermskisser, flytskjemaer, figurer etc. …</li>
<li>Bli pådriver for at de klare kravene etc. forstås på samme måte – spesielt av de som var uenige / ikke forstod hverandre…</li>
<li>Innse selv og hjelp ulike interessenter til å forstå at ikke alle uenigheter kan forenes…</li>
<li>Erkjenn at uansett hvor godt vi dokumenterer avklaringer, kan vi forvente at der ulike interessenter var uenige, vil diskusjoner dukke opp igjen senere i prosjektets liv, f.eks. når systemet leveres til test eller til produksjon…</li>
</ul>
<p> </p>
<p>Tren deg noen av disse teknikkene! Da vil du etter hvert bygge en god oversikt over hele systemet dere leverer! Du kan ta aktive grep i forhold til vanskelige feilfloker og du vil forstå hvordan de ulike feilene/manglene henger sammen med hverandre.</p>
<p>Lykke til, Buglock!</p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/10/04/jeg-vet-at-du-kan-bli-prosjektets-neste-%e2%80%9dbuglock-holmes%e2%80%9d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interaktiv programmering: utforsking, læring og produktivitet</title>
		<link>http://sterkblanding.no/blog/2010/09/09/interaktiv-programmering-utforsking-l%c3%a6ring-og-produktivitet/</link>
		<comments>http://sterkblanding.no/blog/2010/09/09/interaktiv-programmering-utforsking-l%c3%a6ring-og-produktivitet/#comments</comments>
		<pubDate>Thu, 09 Sep 2010 08:42:01 +0000</pubDate>
		<dc:creator>Thomas Kjeldahl Nilsson</dc:creator>
				<category><![CDATA[Frontend]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Smidig]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=781</guid>
		<description><![CDATA[Dette er blog-versjonen av et foredrag som jeg holdt på JavaZone 2010. Jeg har fått dilla på dynamiske programmeringsspråk (JavaScript, Ruby, Lisp, med flere) i det siste. Et av fellestrekkene ved slike språk er at de lar deg programmere interaktivt. Vet du ikke hva interaktiv programmering er? Flott, da har du kommet til riktig artikkel! [...]]]></description>
			<content:encoded><![CDATA[<p><em>Dette er blog-versjonen av et foredrag som jeg holdt på JavaZone 2010.</em></p>
<p>Jeg har fått dilla på dynamiske programmeringsspråk (JavaScript, Ruby, Lisp, med flere) i det siste. Et av fellestrekkene ved slike språk er at de lar deg programmere interaktivt. Vet du ikke hva interaktiv programmering er? Flott, da har du kommet til riktig artikkel!</p>
<p><span id="more-781"></span></p>
<p>Ideen bak er ganske enkel, men jeg tror det er enklere å vise hva det er først, istedet for å skrive masse forklarende tekst. Her er et eksempel, demonstrert med IRB (Interactive Ruby):</p>
<p><!-- Artiss Code Embed v1.5 | http://www.artiss.co.uk/artiss-code-embed -->
<object width="600" height="400"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=14709877&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=14709877&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="600" height="400"></embed></object><!-- End of Artiss Code Embed code -->
</p>
<p>Hva skjer her?</p>
<p>Vel, jeg skriver ekstremt grunnleggende Ruby-kode. Men se hva som skjer underveis. Hver Ruby-setning jeg skriver inn blir evaluert og kjørt av systemet. Resultatet spyttes tilbake på kommandolinja. Systemet husker hva jeg gjør. Jeg definerer variabler og funksjoner. Jeg kan bruke og bygge videre på dem, og jeg får umiddelbar feedback på alt jeg gjør. Og jeg slipper å kompilere eller restarte koden min hver gang jeg prøver noe nytt.</p>
<p>Den vanlige prosessen vår for systemutvikling er som et stålverk. Vi lager en støpeform (skriver kode i en IDE). Så støper vi en klump stål (kompilering/restart). Dersom stålklumpen ikke har riktig form, så er det tilbake til tegnebordet for å justere støpeformen. Denne feedback-løkka er mye raskere enn før takket være raskere kompilering, bedre maskiner og enhetstesting &#8211; men vi kaster likevel bort en del tid når vi løper frem og tilbake på denne måten.</p>
<p>Interaktiv programmering derimot er mer som å jobbe med leire. Vi arbeider med samme stykke materiale kontinuerlig. Vi klatter på litt kode, ser hvordan det ser ut. Tar vekk ting, bytter ut, former, eksperimenterer.</p>
<p>Dette er ikke en erstatning for hvordan vi vanligvis arbeider, men mer et nyttig tilbehør. Du bygger ikke en produksjonsbil med leire, men det er mye lettere å lage f.eks en design-prototype med leire enn med stål. På samme måte kan interaktiv programmering være et bra hjelpemiddel og supplement for seriøs systemutvikling.</p>
<p>Helt konkret: hvorfor er interaktiv programmering nyttig?</p>
<ul>
<li><strong>Du arbeider raskere</strong>, fordi feedback-løkka er kortere.</li>
<li><strong>Du slipper unna med mindre kode</strong>, fordi du bruker mindre tid på å bygge infrastruktur og &#8220;boilerplate&#8221;.</li>
</ul>
<p>Mer komplisert er det ikke. Jeg mistenker imidlertid at det ene bruksområdet ovenfor ikke overbeviser helt. Jeg skal derfor vise flere eksempler, og du kan tenke over hvordan disse teknikkene passer inn i din egen verktøykasse.</p>
<p>Jeg bruker jevnlig interaktiv programmering til følgende:</p>
<ul>
<li>Utforsking og læring</li>
<li>Grensesnitt mot backend-system</li>
<li>Frontend-utvikling og prototyping</li>
</ul>
<p>Utforsking og læring har vi allerede sett via IRB-klippet over. Neste eksempel er et interaktiv programmering som grensesnitt mot et kjørende system &#8211; i dette tilfellet en Ruby on Rails-applikasjon.</p>
<p>I filmklippet som følger lenger ned starter jeg et interaktivt konsoll på en lokal testserver. Der har jeg tilgang til det samme api&#8217;et, databasekoblinger etc som forretningslogikken i backenden av systemet mitt. Dette lar meg gå inn i en kjørende applikasjon og prøve ut nye ting, trekke ut informasjon eller gjøre små oppdateringer -<strong> mens systemet fremdeles kjører.</strong></p>
<p><!-- Artiss Code Embed v1.5 | http://www.artiss.co.uk/artiss-code-embed -->
<object width="600" height="400"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=14709904&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=14709904&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="600" height="400"></embed></object><!-- End of Artiss Code Embed code -->
</p>
<p>Man kan bruke dette konsollet til system-administrasjon i et produksjonssystem: istedet for å bygge tidkrevende web-admin-funksjonalitet i systemet ditt, så kan du la døra stå åpen for å ta de mer sjeldne oppgavene direkte i det interaktive konsollet. Bygg eventuelt web-UI for manglende ting dersom du ender med å gjøre samme oppgave om og om igjen på kommandolinja.</p>
<p>Dette shellet kan også brukes under utviklingsløpet for å se &#8220;hvordan ting arter seg&#8221; før man velger å forfølge noen bestemt løsningsretning med unit-tester, web-grensesnitt osv osv.</p>
<p>La oss flytte oss opp til frontend-utvikling. Når vi utvikler web-grensesnitt så har vi et annet interaktivt miljø vi kan bruke: Firebug-konsollet. Her er en liten demonstrasjon.</p>
<p><!-- Artiss Code Embed v1.5 | http://www.artiss.co.uk/artiss-code-embed -->
<object width="600" height="400"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=14711715&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=14711715&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="600" height="400"></embed></object><!-- End of Artiss Code Embed code -->
</p>
<p>Dette var et veldig enkelt eksempel. Jeg bruker imidlertid samme teknikker når jeg jobber med mer komplekse webapplikasjoner: da bruker jeg hyppig konsollet for å prøve ut ting &#8220;live&#8221;.  Metodikker som f.eks testdrevet utvikling er flott for backend-utvikling, men i visuell/frontend-utvikling er det ofte vanskelig å lage programmatiske tester siden man ikke helt vet hvordan ting kommer til å se ut og oppføre seg i nettleseren. Kanskje vet du ikke engang helt &#8220;hva du leter etter&#8221; på forhånd? Da er det fint å kunne prøve seg fram litt før man skriver for mye kode.</p>
<p>Nå vet jeg hva du tenker. &#8220;Men Thomas, jeg har ikke lyst å sitte og skrive kode rett inn i disse kommandolinje-greiene. Jeg liker editoren min mye bedre!&#8221; Jeg forstår den innvendingen. Du kan eventuelt skrive koden i editoren og manuelt lime den inn på kommandolinja, men det er blir fort litt knotete. Vi har mer lyst til å arbeide i en skikkelig IDE, og sende kode derfra til det interaktive miljøet.  Vi skal se på et eksempel på slik arbeidsflyt i et språk som heter Clojure.</p>
<p>Clojure er et ungt, lovende programmeringsspråk. Det er bare noen år gammelt, men er bygget på moden teknologi. Clojure er implementert i Java, snakker pent med Java-biblioteker, og basert på LISP (en over 50 år gammel dialekt av programmeringsspråk). Det vi hittil har kalt &#8220;interaktive konsoller&#8221; blir ofte kalt Read-Eval-Print-Loops (REPL). Dette utrykket kommer opprinnelig fra LISP, som har hatt slike verktøy (og kultur for å bruke dem aktivt) i mange år.</p>
<p>La oss se på et eksempel i Clojure. Jeg holder meg i editoren min, og sender funksjoner og kommandoer til REPL-prosessen rett fra editoren min. I dette tilfellet bruker jeg dette til å jobbe smidig med 3d-grafikk (jeg er veldig uerfaren på dette området, og trenger derfor umiddelbar feedback på alt jeg gjør).  Klippet under starter med å demonstrere helt grunnleggende ting, så tar vi steget opp til grafikk-arbeid. Mot slutten implementerer jeg rendering av et veldig enkelt  Tetris-spill.</p>
<p><!-- Artiss Code Embed v1.5 | http://www.artiss.co.uk/artiss-code-embed -->
<object width="600" height="400"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=14709925&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=14709925&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="600" height="400"></embed></object><!-- End of Artiss Code Embed code -->
</p>
<p><strong>Hva har vi sett så langt?</strong></p>
<p>Interaktiv programmering gir deg rask feedback. Det lar deg jobbe hurtigere, skrive mindre kode, lære og utforske, snakke direkte med kjørende systemer, og gjøre effektiv prototyping og visuell utvikling.</p>
<p>Nå tenker du kanskje: &#8220;jeg arbeider med Java til daglig, hvordan kan jeg bruke disse greiene til noe nyttig?&#8221; Vel, alle disse teknikkene kan brukes sammen med Java-kode.  Ruby kan kjøres på Java: JRuby er en moden platform som snakker pent sammen med Java-komponenter. JavaScript likeså: du kan enkelt kjøre JavaScript på serversiden som et interaktivt skall rundt applikasjonen din. Clojure er allerede bygd i, og beregnet for bruk sammen med, vanlig Java (3D-eksemplet ovenfor bruker allerede et Java-API for OpenGL-grafikk).</p>
<p>Det er derfor ikke mye som skal til for å få slike interaktive skall rundt din egen applikasjon. Kan du lukte mulighetene her?</p>
<p>Til slutt vil jeg gjerne at du tar en kikk på filmklippene under. De er eksempler på s.k. Livecoding, en aktivitet som ligger i skjæringspunktet mellom programmering og performance-kunst. Det som skjer i klippene under er at utvikleren koder opp improviserte algoritmer for lyd og musikk live foran publikum. Kanskje ikke nyttig umiddelbart nyttig for deg og meg, men det er et interessant eksempel på interaktiv programmering tatt til sin ytterste konsekvens.</p>
<p><!-- Artiss Code Embed v1.5 | http://www.artiss.co.uk/artiss-code-embed -->
<object width="600" height="400"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2433947&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=2433947&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="600" height="400"></embed></object><!-- End of Artiss Code Embed code -->
</p>
<p><!-- Artiss Code Embed v1.5 | http://www.artiss.co.uk/artiss-code-embed -->
<object width="600" height="400"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2502546&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=2502546&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="600" height="400"></embed></object><p><!-- End of Artiss Code Embed code -->
</p>
<h2>Referanser:</h2>
<p><a href="http://en.wikipedia.org/wiki/Read-eval-print_loop">A list of REPL environments</a></p>
<p><a href="http://tagaholic.me/2009/05/11/demystifying-irb-commands.html">Demystifying IRB commands (interactive Ruby)</a></p>
<p><a href="http://slash7.com/2006/12/21/secrets-of-the-rails-console-ninjas/">Secrets of the Rails Console Ninjas</a></p>
<p><a href="http://getfirebug.com/wiki/index.php/Console_Panel">The Firebug Console Panel</a></p>
<p><a href="http://clojure.org/getting_started">Clojure.org: &#8216;Getting started&#8217;</a></p>
<p><a href="http://technomancy.us/126">in which are found tricks of the trade concerning clojure authorship</a></p>
<p><a href="http://wiki.github.com/ztellman/penumbra/getting-started">Penumbra OpenGL framework: &#8216;Getting started&#8217;</a></p>
<p><a href="http://impromptu.moso.com.au/resources.html">Impromptu livecoding environment introduction</a></p>
<p><a href="http://impromptu.moso.com.au/gallery.html">Andrew Sorenson livecoding videos</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/09/09/interaktiv-programmering-utforsking-l%c3%a6ring-og-produktivitet/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Lær deg et scriptspråk!</title>
		<link>http://sterkblanding.no/blog/2010/06/30/l%c3%a6r-deg-et-scriptsprak/</link>
		<comments>http://sterkblanding.no/blog/2010/06/30/l%c3%a6r-deg-et-scriptsprak/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 18:53:52 +0000</pubDate>
		<dc:creator>Thomas Kjeldahl Nilsson</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Smidig]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=722</guid>
		<description><![CDATA[La oss si at du er en systemutvikler. Du er ansatt for din ekspertise i et av de &#8220;to store&#8221; applikasjonsspråkene &#8211; Java eller C#. Disse språkene kan brukes til svært mange oppgaver. Du kan teoretisk løse ethvert problem med dem, og de er sannsynligvis hovedgrunnen til at cv-en din er salgbar. Så hvorfor lære [...]]]></description>
			<content:encoded><![CDATA[<p>La oss si at du er en systemutvikler. Du er ansatt for din ekspertise i et av de &#8220;to store&#8221; applikasjonsspråkene &#8211; Java eller C#. Disse språkene kan brukes til svært mange oppgaver.  Du kan teoretisk løse ethvert problem med dem, og de er sannsynligvis hovedgrunnen til at cv-en din er salgbar. <strong>Så hvorfor lære noe mer enn Java eller C#?</strong></p>
<p>Jeg skal fortelle deg hvorfor du bør lære deg et s.k. scriptspråk. Scriptspråk har andre styrker enn Java og C#, og tilfører allsidighet og produktivitet til verktøyskuffen din. En kompetent håndtverker bruker mer enn hammer på jobb: skrutrekker, meisel og knipetang må også med.</p>
<p><span id="more-722"></span></p>
<p>Steve Yegge skrev for noen år siden en glimrende artikkel om hvordan han skiller gode utviklere fra svakere kandidater under jobbintervjuer <sup><a href="#yegge_article">[1]</a></sup>.  Et av poengene hans er at mange utviklere har en akilles-hel: det ene språket de mestrer er ikke ideellt til alle situasjoner. De er &#8220;<strong>one trick ponies&#8221;</strong>.</p>
<p>Her er et intervjuspørsmål som Yegge bruker til å teste kandidater:</p>
<blockquote><p>Last year my team had to remove all the phone numbers from 50,000<br />
Amazon web page templates, since many of the numbers were no longer in<br />
service, and we also wanted to route all customer contacts through a<br />
single page.</p>
<p>Let&#8217;s say you&#8217;re on my team, and we have to identify the pages having<br />
probable U.S. phone numbers in them. To simplify the problem slightly,<br />
assume we have 50,000 HTML files in a Unix directory tree, under a<br />
directory called &#8220;/website&#8221;. We have 2 days to get a list of file<br />
paths to the editorial staff. You need to give me a list of the .html<br />
files in this directory tree that appear to contain phone numbers in<br />
the following two formats: (xxx) xxx-xxxx and xxx-xxx-xxxx.</p></blockquote>
<p>Hvordan ville du løse dette problemet? Hint: Java og C# er ikke førstevalget til Steve, ei heller mitt. Du KAN løse dette og mange lignende problemer i Java eller C#, men et scriptspråk lar deg løse problemet raskere og mer elegant.</p>
<p><strong>Så hva er scriptspråk og hvorfor er de så nyttige?</strong> Jeg definerer kort og godt disse til å være <a href="http://www.ruby-lang.org/en/">Ruby</a>, <a href="http://www.python.org/">Python</a>, og <a href="http://www.perl.org/">Perl</a>. Alle tre er modne, populære språk. Det betyr ikke så mye hvilket av dem du lærer først: alle sammen deler de fleste av følgende styrker:</p>
<ul>
<li>Førsteklasses støtte for å manipulere tekster og filer.</li>
<li>Fungerer bra sammen med kommandolinje-verktøy og shellscripting, spesielt på unix-systemer.</li>
<li>Enkle å komme igang med. Vanligvis preinstallert på Unix, Linux og OS X-systemer.</li>
<li>Gode til proof of concepts og prototyper. Passer bra til å rask iterere frem og demonstrere konsepter.</li>
<li>Ypperlige til å automatisere oppgaver (f.eks scripting av operativsystemer, applikasjoner, byggeprosesser).</li>
<li>Er gjerne dynamisk typede språk, noe som lar deg bruke mindre tid på syntax og mer tid på selve oppgaven du skal løse. <sup><a href="#yegge_video">[2]</a></sup></li>
<li>Kan kjøre oppå, eller sammen med, de tyngre platformspråkene (se <a href="http://jruby.org/">JRuby</a>, <a href="http://ironruby.net/">IronRuby</a>). Best of both worlds!</li>
<li>Gir deg et nytt perspektiv på platformer og språk du allerede mestrer. Det er alltid nyttig å utvide horisontene sine! <sup><a href="#martin_video">[3]</a></sup></li>
</ul>
<p>Høres dette nyttig ut? <strong>Har du lyst til å lære mer? </strong>En god måte å komme igang på kan være å lese denne boka:</p>
<p style="text-align: center"><a href="http://pragprog.com/titles/bmsft/everyday-scripting-with-ruby"><img class="aligncenter size-full wp-image-733" src="http://sterkblanding.no/files/2010/06/rubyBookCover.jpg" alt="" width="300" height="300" /></a></p>
<p>eller denne:</p>
<p style="text-align: center"><a href="http://www.amazon.com/Python-Nutshell-Second-OReilly/dp/0596100469"><img class="aligncenter size-full wp-image-734" src="http://sterkblanding.no/files/2010/06/pythonBookCover.jpg" alt="" width="145" height="217" /></a></p>
<p>Sett deg så ned med et konkret prosjekt<strong>. </strong> Finn f.eks en &#8220;tidstyv&#8221; i hverdagen din &#8211; en rutine som kan automatiseres. Lag et script som løser problemet ditt.</p>
<p>Vips: fremtidig tid spart, og du har begynt å legge et <strong>nytt, kraftig verktøy</strong> i reportoaret ditt!</p>
<h2>Referanser:</h2>
<p>1) <a id="yegge_article" href="http://sites.google.com/site/steveyegge2/five-essential-phone-screen-questions">Yegges artikkel om intervju-spørsmål</a><br />
2) <a id="yegge_video" href="http://www.youtube.com/watch?v=tz-Bb-D6teE">Yegge om styrkene til scriptspråk/dynamiske språk (video)</a><br />
3) <a id="martin_video" href="http://www.akitaonrails.com/2010/06/16/railsconf-2010-video-interview-robert-martin-english">Robert &#8220;Uncle Bob&#8221; Martin om hvorfor du bør lære nye språk (video)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/06/30/l%c3%a6r-deg-et-scriptsprak/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Sammen mot en enklere fremtid</title>
		<link>http://sterkblanding.no/blog/2010/06/02/enklere-fremtid/</link>
		<comments>http://sterkblanding.no/blog/2010/06/02/enklere-fremtid/#comments</comments>
		<pubDate>Wed, 02 Jun 2010 06:00:05 +0000</pubDate>
		<dc:creator>Sondre Bjellås</dc:creator>
				<category><![CDATA[Brukervennlighet]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Risikostyring]]></category>
		<category><![CDATA[Smidig]]></category>
		<category><![CDATA[Strategi]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=610</guid>
		<description><![CDATA[Kompleksitet er den viktigste årsaken til at IT-prosjekter feiler. Prosjekter som feiler og dårlig programvare gjør våre kunder og brukere ulykkelige. Hvorfor gjør vi IT-investeringer? Det handler om å redusere komplekse problemer til meningsfylte oppgaver som mennesker kan fullføre. Jeg ønsker å fokusere på utvikling av programvare (løsninger, pakkeprodukter, osv) og hvilken verdi programvare har [...]]]></description>
			<content:encoded><![CDATA[<p>Kompleksitet er den <a href="http://www.objectwatch.com/white_papers.htm#ITComplexity" target="_blank">viktigste årsaken</a> til at IT-prosjekter feiler. Prosjekter som feiler og dårlig programvare gjør våre kunder og <strong>brukere ulykkelige</strong>.</p>
<p>Hvorfor gjør vi IT-investeringer? Det handler om å <strong>redusere komplekse problemer</strong> til meningsfylte oppgaver som mennesker kan fullføre.</p>
<p><span id="more-610"></span></p>
<p>Jeg ønsker å fokusere på utvikling av programvare (løsninger, pakkeprodukter, osv) og hvilken verdi programvare har for våre brukere. Å bygge programvare er en av flere viktige funksjoner som vi gjør hos Steria, og det er tusenvis av andre som også bygger programvare for å løse utfordringer.</p>
<p>Undersøkelser har vist at vi ikke har hatt særlig forbedring i suksessraten i utviklingsprosjekter. Bransjen har ca. 30% suksess i prosjekter som starter opp, og slik har det vært siden 1996 i følge <a href="http://www.standishgroup.com/" target="_self">Standard Group</a> (CHAOS Report). Hvorvidt dette er representativt for det norske markedet er ukjent, men egne erfaringer fra Norge tilsier at det er en betraktelig høyere andel prosjekter med suksess her i landet, mye takket være smidige teknikker og prosesser.</p>
<h2>Programvarens lov</h2>
<p>I henhold til David S. Platts <a href="http://msdn.microsoft.com/en-us/magazine/ff646970.aspx" target="_blank">3 lover om programvare</a>, har programvaren vi bygger i seg selv ingen verdi. Det har liten betydning hvor teknisk bra kildekoden til et program er, det er kun vår egen mor som bryr seg om slikt.</p>
<p>Platts 3 lover sier:</p>
<ol>
<li><strong>Programvare har ingen verdi i seg selv</strong>. Den eneste verdien programvare har er gleden den gir til brukeren.</li>
<li><strong>Programvaren kan øke brukerens glede</strong> på en av to måter. Den kan hjelpe brukeren å fullføre en ønsket oppgave, eller den kan gi en god opplevelse. Eksempelvis hjelper Outlook med å lese og skrive epost, mens HALO på Xbox 360 gir deg en god opplevelse som er underholdende.</li>
<li><strong>Brukeren skal </strong><strong>ikke tenke på<span style="font-weight: normal"> </span>programvaren</strong>. Det viktigste er innholdet og oppgaven, ikke programvaren i seg selv.</li>
</ol>
<p>Målet med programvare bør alltid være å<strong> redusere komplekse problemer til </strong><strong>enkle oppgaver</strong>. Enkle oppgaver som mennesker kan utføre, uten at det krever mye tankearbeid. Desto mindre en bruker må tenke, desto mer glad og produktiv vil han bli.</p>
<h2>Tenke enkelt</h2>
<p>Når vi har et komplekst problem vi ønsker å løse, hvilke mekanismer pleier vi å benytte for å løse dem? Når vi ser på programvaren som har blitt utviklet opp igjennom årene, er det ganske klart at vi ikke tenker på å gjøre ting enkelt.</p>
<p>Vår forståelse av komplekse problemer øker desto mer vi jobber med dem. Men vi har problemer med å komme opp med enkle løsninger. Altfor ofte lager vi kompliserte løsninger for komplekse problemer. Dette må vi forsøke å unngå, for det er hovedårsaken til at utviklingsprosjekter feiler.</p>
<p><strong>Vi må sammen begynne å </strong><strong>tenke enklere.</strong> Vi må sammen utforske hvordan vi kan redusere komplekse detaljer i et løsningsdesign, helt til vi sitter igjen med et design som er så enkelt som overhodet mulig og fortsatt gir verdi til brukerne.</p>
<p>Vårt mål bør være: <strong>Lage en enklest mulig arkitektur</strong>.</p>
<p>Det er selvsagt mange årsaker hvorfor noe som starter enkelt, fort blir komplisert. En viktig faktor er mengden av funksjonalitet i en løsning. Robert L. Glass  skriver i boka &#8220;<a href="http://www.amazon.com/Facts-Fallacies-Software-Engineering-Robert/dp/0321117425">Facts and Fallacies of Software Engineering</a>&#8221; at <strong>25% økt funksjonalitet øker kompleksiteten med 100%</strong>.</p>
<p>Neste gang du står ovenfor et problem som noen ønsker løst ved hjelp av programvare, start med å tenke over brukerne og hvordan du kan øke deres glede. Deretter reduserer kompleksiteten i løsningsdesignet til du oppnår det enkleste designet som er mulig som fortsatt oppnår målet: <strong>Gjøre brukerne glade!</strong></p>
<p>(Se mitt innlegg om <a href="http://sondreb.com/blog/post/MSDN-Live-Solution-Architecture-Slides.aspx" target="_blank">løsningsarkitektur på MSDN Live</a> for mer detaljer om dette emnet)</p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/06/02/enklere-fremtid/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Hold stø kurs med autotesting!</title>
		<link>http://sterkblanding.no/blog/2010/05/31/hold-st%c3%b8-kurs-med-autotesting/</link>
		<comments>http://sterkblanding.no/blog/2010/05/31/hold-st%c3%b8-kurs-med-autotesting/#comments</comments>
		<pubDate>Mon, 31 May 2010 19:14:04 +0000</pubDate>
		<dc:creator>Thomas Kjeldahl Nilsson</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Smidig]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[feedback]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=643</guid>
		<description><![CDATA[Unit-tester er nyttig for de fleste systemutviklere. Noen av oss kjører strikt, metodisk testdrevet utvikling. Andre bruker bare automatiserte tester nå og da som sikkerhetsnett for å unngå regress-feil. Hvor ofte fyrer du selv av testene dine? Kjører du testsuiten din en gang i ny og ne, eller strikt for hver metode du implementerer? Jeg [...]]]></description>
			<content:encoded><![CDATA[<p>Unit-tester er nyttig for de fleste systemutviklere.</p>
<p>Noen av oss kjører strikt, metodisk testdrevet utvikling. Andre bruker bare automatiserte tester nå og da som sikkerhetsnett for å unngå regress-feil. <strong>Hvor ofte fyrer du selv av testene dine?</strong> Kjører du testsuiten din en gang i ny og ne, eller strikt for hver metode du implementerer?</p>
<p>Jeg liker å kjøre testene mine <strong>ofte</strong> mens jeg arbeider. Det jeg liker enda bedre er å la utviklingsmiljøet mitt kjøre dem for meg, automatisk. Poenget med yrket vårt er jo nettopp å automatisere og effektivisere arbeidsprosesser &#8211; dette forsøker jeg å gjøre også med mine egne rutiner og verktøy. La oss se hvordan vi kan få til dette.</p>
<p><span id="more-643"></span></p>
<p>Mange av oss bruker allerede <a href="http://martinfowler.com/articles/continuousIntegration.html">Continuous Integration</a> for å oppdage feil i den felles kodebasen. Personlig autotesting er det neste, logiske steget: enhetstestene våre burde kjøre i bakgrunnen hver gang vi endrer noe, og gi oss umiddelbar tilbakemelding når vi knekker funksjonalitet. På denne måten oppdager vi våre egne feil før resten av teamet blir påvirket av dem.</p>
<p>Det finnes flere verktøy som gjør dette for deg:</p>
<ul>
<li><span style="font-family: arial, sans-serif"><a href="http://improvingworks.com/products/infinitest/">Infinitest</a> (Java)</span></li>
<li><span style="font-family: arial, sans-serif"><a href="http://www.zenspider.com/ZSS/Products/ZenTest/">Autotest / ZenTest</a> (Ruby)</span></li>
<li><span style="font-family: arial, sans-serif"><a href="http://github.com/lacostej/nosyd">Nosyd</a> (Python)</span></li>
</ul>
<p><strong>Det er imidlertid ikke vanskelig å lage et enkelt autotest-verktøy på egen hånd</strong>. Jeg synes at det er en god ide å bruke litt tid her og der på å forbedre sitt eget utviklingsmiljø. Vi har jo muligheten til å lage våre egne verktøy (<a href="http://no.wikipedia.org/wiki/Smed">smeden</a> er en av få håndverkere som kan si det samme). Som utvikler bør man iallfall klare å slipe sine egne kniver, for å si det sånn. Og dette er en god anledning!</p>
<p><a href="http://sterkblanding.no/files/2010/05/smedVerktoy.jpg"><img class="alignleft size-full wp-image-669" style="margin-top: 0px;margin-bottom: 0px;margin-left: 10px;margin-right: 10px" title="smedVerktoy" src="http://sterkblanding.no/files/2010/05/iStock_000012701407Small.jpg" alt="" width="211" height="296" /></a></p>
<p><strong>Et naivt script for autotesting implementerer du på en ettermiddag.</strong> Alt du trenger er et lite program som reagerer på endringer i prosjektfilene dine, og kjører testene etter behov.</p>
<p>Algoritmen er enkel: La scriptet kjøre regelmessig, f.eks hvert sekund. Kontroller &#8220;forrige endring&#8221;-klokkeslettet for alle filene i prosjektet. Dersom klokkeslettet på en eller flere filer har endret seg siden forrige kontroll, så kjør enhetstestene til prosjektet. Analyser output fra testkjøringen, og se hvorvidt noen tester feilet eller kode knakk helt (exceptions). <strong>Gi så klar tilbakemelding om testene er ok eller feilet.</strong></p>
<p>Tilbakemeldingen kan være litt grafikk og lyd på desktopen (for eksempel med <a href="http://growl.info/">Growl</a> eller <a href="http://www.fullphat.net/index.php">Snarl</a>), en <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=67492">lavalampe</a> på pulten, <a href="http://marketplace.eclipse.org/content/eclipse-xps">blinkende LED-lamper</a> på laptopen&#8230; vær kreativ<strong>!</strong> Bare sørg for er at du får en tydelig tilbakemelding på hvorvidt testene feiler eller ikke.</p>
<p><strong>Filmklippet under viser hvordan mitt eget autotest-miljø fungerer.</strong> Koden er i dette tilfellet skrevet i et språk som heter <a href="http://clojure.org">Clojure</a> og ser derfor kanskje litt pussig ut, men ikke heng deg opp i det: det som demonstreres er at jeg knekker og fikser tester, og får automatisk godt synlig feedback på dette underveis.</p>
<p style="text-align: center"><!-- Artiss Code Embed v1.5 | http://www.artiss.co.uk/artiss-code-embed -->
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="480" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=11633909&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="640" height="480" src="http://vimeo.com/moogaloop.swf?clip_id=11633909&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object><!-- End of Artiss Code Embed code -->
</p>
<p>Ikke spesielt komplisert.</p>
<p><strong>&#8220;Dette ser jo genialt ut! Hvorfor bruker ikke alle autotest-verktøy allerede?&#8221;</strong></p>
<p>Vel, det finnes dessverre noen utfordringer.</p>
<p>Dersom autotesting skal fungere hensiktsmessig må testsuiten som kjøres kun bestå av raske enhetstester, ikke tunge integrasjonstester. Og enhetstestene må gå kjapt! En test-run må ta sekunder, ikke minutter, ellers mister du gevinsten ved den umiddelbare feedbacken.</p>
<p>Problemet med trege tester er betydelig. Det finnes workarounds: man kan analysere avhengigheter mellom tester og kode, kun kjøre de berørte testene, kjøre raske tester først, feilende tester først, nylig feilende tester først&#8230; Men mange av oss har dessverre erfart at det er vanskelig å få til et godt fungerende opplegg for dette i et vanlig moderat stort utviklingsprosjekt.</p>
<p>Så er ikke autotesting nyttig likevel, da? Jo! Autotesting fungerer <strong>knallbra</strong> i<strong> små prosjekter</strong> (som ikke har samlet på seg så mye kode ennå) og <strong>egenopplæring</strong> (når du lærer nye verktøy og språk og ønsker å ta små steg med kjapp feedback). Det kan kanskje også fungere i større prosjekter <strong>dersom</strong> du har muligheten til å segmentere koden og testene dine i mindre moduler på en hensiktsmessig måte.</p>
<p>I bunnen av denne artikkelen har jeg vedlagt et eksempel på hvordan et enkelt autotest-script kan se ut, implementert i <a href="http://ruby-lang.org/">Ruby</a>. Scriptet er skrevet for OS X-miljø, men koden bør være relativt lesbar og enkel å porte til ditt eget favorittspråk og utviklingsmiljø.</p>
<p><strong>Happy testing!</strong></p>
<p><em>Eksempel:</em></p>
<p><code> </code></p>
<p><code> </code></p>
<p><code></p>
<pre># Command line command which launches all unit tests
RUN_TESTS_CMD = "mvn clean test"

# Pick up any changes in files matching this filepath
FILES_TO_MONITOR = "**/*.java"

# Determine test outcome by scraping test output for #telltale signs of failure or exceptions</pre>
<pre>def test_failed?(test_output)
  return (test_output["FAIL in"] != nil) # Any 'FAIL in' strings in test result indicates failure
end

def exception_occurred?(test_output)
  return (test_output["EXCEPTION in"] != nil)
end

# Indicate test state by turning the background color of the test terminal
# a different color - yellow red og green. Currently uses Mac AppleScripts, but could be
# an audible signal, lava lamp, or anything else instead.

def indicate_tests_running
  `osascript bin/autotest/make-term-yellow`
  puts "\n\n\n----------------------------------"
  puts "TESTRUN STARTED #{Time.now}"
  puts "----------------------------------\n\n\n"
end  

def indicate_test_success(description)
  `osascript bin/autotest/make-term-green`
  puts description
end  

def indicate_test_errors(description)
  `osascript bin/autotest/make-term-red`
  puts description
end  

$monitored_files = {} # Stores the last changed time of each file    

def files_changed? # Check if any files have been touched/saved since last check
  file_changed = false;  

  Dir[FILES_TO_MONITOR].each do |filepath|
    if(!File.new(filepath).ctime.eql?($monitored_files[filepath]))
      file_changed = true;
      $monitored_files[filepath] = File.new(filepath).ctime
    end
  end  

  return file_changed
end  

def run_test
  indicate_tests_running
  result = `#{RUN_TESTS_CMD}`  #Run the tests, pipe resulting console output back
  display_results(result)
end    

def display_results(testOutput)
  if test_failed?(testOutput)
    indicate_test_errors("SOME TEST(S) FAILED\n"+testOutput)
  elsif exception_occurred?(testOutput)
    indicate_test_errors("EXCEPTIONS OCCURRED\n"+testOutput)
  else
    indicate_test_success("ALL TESTS SUCCEED\n"+testOutput)
  end
end  

def test_loop
  while true
    if files_changed?
      run_test
    end
    sleep(1) #seconds between each poll for file changes
  end
end  

test_loop # Start testing!</pre>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/05/31/hold-st%c3%b8-kurs-med-autotesting/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Mot til å produksjonssette tidlig?</title>
		<link>http://sterkblanding.no/blog/2010/04/26/mot-til-a-produksjonssette-tidlig/</link>
		<comments>http://sterkblanding.no/blog/2010/04/26/mot-til-a-produksjonssette-tidlig/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 16:56:15 +0000</pubDate>
		<dc:creator>Jan Helge Maurtvedt</dc:creator>
				<category><![CDATA[Business Process Management]]></category>
		<category><![CDATA[ITIL]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Smidig]]></category>
		<category><![CDATA[Strategi]]></category>
		<category><![CDATA[endringsledelse]]></category>
		<category><![CDATA[mål]]></category>
		<category><![CDATA[prosjektledelse]]></category>
		<category><![CDATA[utfordringer]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=490</guid>
		<description><![CDATA[Har ditt erstatningsprosjekt mot til å produksjonssette på 70 % av funksjonaliteten til det gamle systemet? Det er mange, kanskje spesielt bedriftsledere og avdelingsledere i styringsgrupper rundt om kring, som tror at IT-prosjektet er ferdig når man har produksjonssatt den nye løsningen. Det er en oppfatning som kan få katastrofale følger. Min erfaring er at [...]]]></description>
			<content:encoded><![CDATA[<p>Har ditt erstatningsprosjekt mot til å produksjonssette på 70 % av funksjonaliteten til det gamle systemet? Det er mange, kanskje spesielt bedriftsledere og avdelingsledere i styringsgrupper rundt om kring, som tror at IT-prosjektet er ferdig når man har produksjonssatt den nye løsningen. Det er en oppfatning som kan få katastrofale følger.<span id="more-490"></span></p>
<p>Min erfaring er at det er ved produksjonssetting de virkelige utfordringene begynner, og da din prosjektgruppe trenger fokus. Nettopp da må styringsgruppen og involverte beslutnignstagere forstå at prosjektet trenger arbeidsro og gode rutiner, ikke nedleggelse, nye rapporteringsforpliktelser, bli gjenstand for budsjettkutt eller lignende. Utsagnet <em>et system som ikke endres er et dødt system</em> er virkelig sant i denne perioden. Husk det når du budsjetterer prosjektet og når du setter dine forventninger.</p>
<p>Det er alltid forbundet med risiko å ta en beslutning om konvertering og produksjonssetting, ofte resulterer det, i at man ikke klarer å skru av det gamle systemet likevel, eller at svært mange interessenter blir misfornøyde og skaper mye støy for prosjektet – den gamle løsningen fungerte jo bedre. Man kan teste så mye man orker før produksjonssetting, men Murphy’s lov slår til og ting går galt. Brukeren kan det ikke – da fungerer det ikke. Noe av det testteamet trodde var i orden viser seg kanskje også å skape en nedtur i begynnelsen. Opplevelsen trenger altså ikke bare være basert på reell mangel på funksjonalitet, men opplevd funksjonalitet. Fenomenet kan illustreres med en blodbadkurve, der man opplever at det nye systemet fungerer vesentlig dårligere enn det gamle systemet i en periode etter produksjonssetting.</p>
<p><a href="http://sterkblanding.no/files/2010/04/blodbadet.gif"><img class="alignnone size-full wp-image-492" title="blodbadet" src="http://sterkblanding.no/files/2010/04/blodbadet.gif" alt="" width="540" height="235" /></a></p>
<p>Ved å gjøre de rette grepene kan imidlertid blodbad-perioden reduseres og gjøres minst mulig smertefull. Her er fire tips.</p>
<p><strong>1. Styr forventningene i forkant</strong> – Blodbad-perioden er ofte den samme tidsperioden der styringsgruppen forventer at gevinstene skal realiseres, gjerne nokså umiddelbart. Dette er en umulighet hvis man ser på kurven over. Prosjektet er travelt opptatt med å prioritere feil, lære seg å drifte det nye systemet, lære brukerne å bruke det nye systemet og løse de mest kritiske tingene som mangler i systemet, ofte ved hjelp av tidkrevende workarounds inntil gode nok løsninger er på plass.</p>
<p><strong>2. Gi prosjektet økonomisk handlingsrom</strong> – Det sikreste man kan gjøre for å sikre absolutt fiakso er å legge ned prosjektet i denne fasen. Likevel er ofte “pengene brukt opp”, man hadde jo ikke regnet med at man måtte jobbe når man hadde levert til produksjon og nedleggelse blir realiteten. Det å ikke ha penger til endringer og videreutvikling i denne perioden er den sikreste måten å redusere levetiden på det nye systemet dramatisk. Det kan også tenkes at de som har fått det nye systemet trenger litt tid på å lære det, så regn med noen vikarer.</p>
<p><strong>3. Vær flink til å prioritere og operer med åpne prioriteringslister</strong> – Styringsgruppen ønsker rask realisering av visjonen og at prosjektet skal makte å følge den stiplede grønne utviklingsbanen. Svaret er ja, det skal dere få, men først må prosjektet få hodet over vannet i form av å løse de mest kritiske feilene. Deretter kan man prioritere forbedringer og nyutvikling. Et sikkert tegn på at man har med en umoden styringsgruppe å gjøre er dersom de i denne perioden forventer at prosjektet skal prioritere nye forretningskrav som plutselig har kommet opp når de ser det nye systemet. Prosjektgruppen bør prioritere utestående områder slik at det som er mest kritisk (eller lønnsomt) kommer først.</p>
<p><strong>4. Avklar ansvar og organisasjonsmodell for vedlikehold tidlig</strong> – Etter produksjonssetting kan det være uklare ansvarsforhold knyttet til vedlikehold. Innse det med en gang – et system uten endring er et dødt system. Da må man vite hvordan endringene skal gjennomføres, testes og produksjonssettes også etter oppstart. Ofte “fryses” kanskje systemet for å unngå store endringer rett før oppstart, med den konsekvens at utviklerne som kunne løst feil raskt forsvinner over til andre oppgaver eller mister fokus. Realiteten er at det er i produksjonssettingsfasen at endringstakten, eller i hvert fall feilrettingstakten, bør være desidert størst. I hvert fall dersom man mener alvor med å snu blodbadet og realisere visjonen for prosjektet.</p>
<p>Legg merke til at jeg ikke foreslår å utsette produksjonssettingen. Dette er åpenbart eneste alternativ dersom man ser at selv de mest basale behov systemet er tenkt å løse ikke fungerer, men i så tilfelle har prosjektet et større problem og burde ha lært seg metoder som Scrum og EVO for lenge siden.</p>
<p>Legg også merke til at prosjektet endrer karakter den dagen man produksjonssetter. Det er ikke lenger et erstatningsprosjekt. Det er et smidig forbedringsprosjekt og må behandles som det!</p>
<p>Les mer på sterkbladning.no:</p>
<ul>
<li><a href="http://sterkblanding.no/blog/2010/02/25/galls-lov-og-erstatningsprosjekter/">Johannes om erstatningsprosjekter</a></li>
<li><a href="http://sterkblanding.no/blog/2010/04/07/er-scrum-og-itil-en-del-av-problemet/">Ole-Vidar om driftsrammeverk (ITIL) vs utviklingsrammeverk (Scrum)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/04/26/mot-til-a-produksjonssette-tidlig/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bugs of honor, bugs of shame</title>
		<link>http://sterkblanding.no/blog/2010/04/06/bugs-of-honor-bugs-of-shame/</link>
		<comments>http://sterkblanding.no/blog/2010/04/06/bugs-of-honor-bugs-of-shame/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 16:39:28 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=346</guid>
		<description><![CDATA[Det er flaut med bugs. Noen bugs gjør meg flauere enn andre. Andre bugs er helt akseptable. I prosjektet mitt er vi stolte av at såpass få feil finnes av testere (eller av brukere), men det er noen som faller gjennom sikkerhetsnettet vårt. Her er noen av bugsene vi har hatt i det siste, fra [...]]]></description>
			<content:encoded><![CDATA[<p>Det er flaut med bugs. Noen bugs gjør meg flauere enn andre. Andre bugs er helt akseptable. I prosjektet mitt er vi stolte av at såpass få feil finnes av testere (eller av brukere), men det er noen som faller gjennom sikkerhetsnettet vårt. Her er noen av bugsene vi har hatt i det siste, fra den minst ydmykende til den verste:</p>
<p><span id="more-346"></span></p>
<ul>
<li><strong>Bug rapport: &#8220;Administrative kostnader&#8221; skal fjernes:</strong> Når vi beregner totalkostnaden til et veiprosjekt, inkluderer vi kostnaden av nyanlegg, ombygging, bruer og administrative kostnader. Når vi demonstrerte applikasjonen til brukerne våre, husket de plutselig at administrative kostnader er sjelden i bruk og burde egentlig fjernes fra applikasjonen. Endringen var enkel og det er usannsynlig at en bedre analyse på forhånd hadde kommet fram til samme konklusjon. Dette er den type feilrapport vi liker å få.</li>
<li><strong>Bug rapport: Ikke-effektuerte utbetalinger skal telle mot totalt tilgjengelige midler:</strong> Når vi sjekket om det var tilstrekkelige midler for å utføre en utbetaling, glemte vi å ta med de utbetalingene som var registrert, men ikke utført enda. Tilstandsovergangen av utbetalinger fra registrert til godkjent til utført var litt mer kompleks enn vi hadde forventet, og enhetstestene sjekket ikke tilstrekkelig med varianter. Vi burde ha funnet denne feilen med enhetstestene våre, men dersom vi aldri får feil av denne typen, kan det være en indikasjon på at vi er <em>for</em> nøye med testingen vår. Så feilen er helt grei. Spesielt ettersom konsekvensene for brukeren ikke var spesielt store</li>
<li><strong>Bug rapport: Perioder som starter i desember rapporterer <em>IllegalArgumentException</em>:</strong> Når vi beregnet neste måned, glemte vi å ta hensyn til at du kan ikke bare legge til én på månedsnummer. Neste måned etter desember er ikke måned 13! Dette var en slurvete feil og jeg tror den ble introdusert en gang når vi ikke parprogrammerte (fordi koden var så triviell, liksom!). Brukerne våre forstår at slike type feil kan skje, men vi må se nøyere på prosessen vår for å unngå slike feil i fremtiden.</li>
<li><strong>Bug rapport: Layout ser rotete ut i Internet Explorer:</strong> For å unngå noen tekniske problemer når vi skrev enhetstester for HTML&#8217;en vi produserte, fjernet vi midlertidig doctype-definisjonen fra webside-malene våre. Så glemte vi å putte definisjonen inn igjen (jada, et nytt eksempel der vi ikke parprogrammerte). Sidene så fortsatt fine ut i Chrome og Firefox, som utviklerne brukte for manuell verifisering. Men i Internet Explorer så websidene direkte kaotiske ut. Den tekniske konsekvensen av feilen var triviell, men feilen kunne lett ha vært unngått, dersom vi vi hadde testet med samme nettleser som brukerne våre. Noen av brukerne våre fikk dette håpløse førsteinntrykket av applikasjonen mens de hjalp oss å teste. Det var skikkelig flaut. Dette vil vi ikke at skjer igjen!</li>
</ul>
<p>Det er litt vanskelig å definere hvilke bugs som gjør meg mest flau. Noen viktige faktorer er hvor vanskelig ville det vært for oss å unngå feilen og hvor stor konsekvens feilen har. Men andre faktorer påvirker også hvordan vi oppfatter en bug. Av feilene på lista over, så er den jeg er mest flau over kun en kosmetisk feil. Men siden dette var noen brukeres førsteinntrykk av applikasjonen, var det mye mer problematisk enn de særtilfellene vi ikke helt støttet.</p>
<p>Hva synes du gjør en feil mer eller mindre akseptabel?</p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/04/06/bugs-of-honor-bugs-of-shame/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Kom igang med JavaScript!</title>
		<link>http://sterkblanding.no/blog/2010/03/24/kom-igang-med-javascript/</link>
		<comments>http://sterkblanding.no/blog/2010/03/24/kom-igang-med-javascript/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 06:25:32 +0000</pubDate>
		<dc:creator>Thomas Kjeldahl Nilsson</dc:creator>
				<category><![CDATA[Frontend]]></category>
		<category><![CDATA[Programmering]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Smidig]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=185</guid>
		<description><![CDATA[Stadig mer programvare utvikles som rike webapplikasjoner, og brukere og kunder stiller stadig høyere krav til disse løsningene. JavaScript er derfor i ferd med å bli et av de viktigste verktøyene våre for moderne applikasjonsutvikling.

Språket blir dessverre behandlet som den stygge andungen av mange utviklere fordi det tradisjonelt oppleves som knotete, skjørt og lite vedlikeholdbart. Slik trenger det ikke være!

Vi i Steria har utviklet et gratis, nedlastbart kurs som oppdaterer deg på dette området. Denne workshopen introduserer ferdighetene, teknikkene og verktøyene som gjør JavaScript-utvikling langt mer overkommelig enn tidligere. Alt materiale i kurset er fritt tilgjengelig til din egen bruk.]]></description>
			<content:encoded><![CDATA[<p>Stadig mer programvare utvikles som rike webapplikasjoner, og brukere og kunder stiller stadig høyere krav til disse løsningene. JavaScript er derfor i ferd med å bli et av de <strong>viktigste verktøyene</strong> våre for moderne applikasjonsutvikling.</p>
<p>Språket blir dessverre behandlet som den stygge andungen av mange utviklere fordi det tradisjonelt oppleves som knotete, skjørt og lite vedlikeholdbart. Slik trenger det ikke være!</p>
<p>Vi i Steria har utviklet et <strong>gratis, nedlastbart</strong> kurs som oppdaterer deg på dette området. Denne workshopen introduserer ferdighetene, teknikkene og verktøyene som gjør JavaScript-utvikling langt mer overkommelig enn tidligere. Alt materiale i kurset er fritt tilgjengelig til din egen bruk.<span id="more-185"></span></p>
<p>Du kan bruke foilene, forelesningsnotatene og øvelsene som <strong>personlig studiemateriell</strong>. Du kan også holde kurset som en formell <strong>workshop</strong> sammen med kollegaer eller kunder. Workshopen tar omtrent en halv dag (3-4 timer) når det gjøres skikkelig &#8211; beregn halvannen time forelesning, minst halvannen time praktiske øvelser.</p>
<p style="text-align: center"><!-- Artiss Code Embed v1.5 | http://www.artiss.co.uk/artiss-code-embed -->
<object width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=slides-100310162930-phpapp02&rel=0&stripped_title=javascript-neednt-hurt-3390657" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=slides-100310162930-phpapp02&rel=0&stripped_title=javascript-neednt-hurt-3390657" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><!-- End of Artiss Code Embed code -->
</p>
<h2 style="text-align: center"><a title="Download link" href="http://kjeldahlnilsson.net/jsnh.zip"><strong><span style="color: #ff6600"><span style="text-decoration: none"><span style="color: #0000ff">LAST NED HER</span></span></span></strong></a></h2>
<p style="text-align: center"><em>(Inneholder slides, forelesningsnotater, øvelser, løsninger, eksempler, verktøy. Utgitt under en Creative Commons Attribution 3.0 lisens. Du kan bruke, endre og dele det fritt, så lenge du krediterer opphavsmannen.)</em></p>
<p>Hvis du ikke har kapasitet til å kjøre kurset selv kan du ta kontakt med <a title="Steria Norge link" href="http://steria.no">Steria</a>; vi kan holde kurset i dine lokaler, i og rundt Oslo.</p>
<p>La oss avslutte med en smakebit. Filmklippet under illustrerer et av temaene som workshopen tar for seg, nemlig <a title="Wikipedia TDD link" href="http://en.wikipedia.org/wiki/Test-driven_development">testdrevet utvikling</a> i JavaScript. Enjoy!</p>
<p style="text-align: center"><!-- Artiss Code Embed v1.5 | http://www.artiss.co.uk/artiss-code-embed -->
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=9453172&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="640" height="424" src="http://vimeo.com/moogaloop.swf?clip_id=9453172&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object><!-- End of Artiss Code Embed code -->
</p>
<p><em><br />
</em></p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/03/24/kom-igang-med-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hemmeligheten bak gode spesifikasjoner</title>
		<link>http://sterkblanding.no/blog/2010/01/21/hemmeligheten-bak-gode-spesifikasjoner/</link>
		<comments>http://sterkblanding.no/blog/2010/01/21/hemmeligheten-bak-gode-spesifikasjoner/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 23:48:08 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Smidig]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[FitNesse]]></category>
		<category><![CDATA[spesifikasjon]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=82</guid>
		<description><![CDATA[Mange prosjekter har startet å ta i bruk verktøy som FitNesse eller Cucumber til å automatisere funksjonelle tester. Disse verktøyene gjør det lett å skrive akseptansetester, men det er opp til oss som bruker dem å sørge for at disse testene blir til en god spesifikasjon av systemet som skal utvikles, og ikke bare testscript. [...]]]></description>
			<content:encoded><![CDATA[<p>Mange prosjekter har startet å ta i bruk verktøy som <a href="http://fitnesse.org">FitNesse</a> eller <a href="http://cukes.info">Cucumber</a> til å automatisere funksjonelle tester. Disse verktøyene gjør det lett å skrive akseptansetester, men det er opp til oss som bruker dem å sørge for at disse testene blir til en god spesifikasjon av systemet som skal utvikles, og ikke bare testscript. Her er noen tips for å forbedre dine spesifikasjoner.</p>
<p><span id="more-82"></span></p>
<h3>Fokus på &#8220;hvorfor&#8221;, ikke &#8220;hvordan&#8221;</h3>
<p>Hva forsøker denne testen å uttrykke:</p>
<blockquote><p>Når en bruker registrerer en betaling med beløp &#8220;-1234567890&#8243;, så skal brukeren se en feilmelding</p></blockquote>
<p>Hva med denne:</p>
<blockquote><p>Når en bruker registrerer en betaling med et negativt beløp så skal brukeren få en passende feilmelding</p></blockquote>
<p>Magiske tall, tekster og verdier i tester skjuler hva vi forsøker å <em>spesifisere</em>. Noen flere eksempler: &#8220;når en bruker utelater et eller flere påkrevde felter, så skal brukeren få en feilmelding knyttet til de manglende feltene&#8221;, &#8220;gitt at brukeren leverer en lottorekke med for få tall&#8221;.</p>
<p>Å koble slike tester mot systemet krever mer arbeid, spesielt de første gangene, men testene blir mye klarere etterpå. Og hovedformålet med en akseptansetest er at den er en spesifikasjon som kan diskuteres mellom prosjektet og omverdenen. Og da er det viktig å være klar. Noen ganger vil det virke svært vanskelig å automatisere forståelige spesifikasjoner. Da bør du huske at en god beskrivelse er mer verdifull enn en dårlig test.</p>
<h3>Given-when-then</h3>
<p>Noe av det første du lærer med tester er &#8220;bruk formen &#8216;gitt X, når Y, så Z&#8217;&#8221;. Men det er ikke alltid så klart hva X, Y og Z skal være. Tester består av tre typer steg:</p>
<ul>
<li><strong>Arrange</strong> (oppsett, &#8220;given&#8221;): Beskriver tilstanden til systemet før testen starter. Typiske eksempler er &#8220;<em>gitt at det eksisterer en bruker med utestående betalinger</em>&#8220;, &#8220;<em>gitt at tjenesten levert fra vår partner har registrert et varenummer</em>&#8221; eller kanskje &#8220;<em>gitt at det er en fredag</em>&#8221; (du får vente til freddan). Avhengig av systemet og tilstanden vi beskriver, kan testen benytte disse stegene på forskjellige måter: Vi kan <em>sette opp</em> brukeren og betalingene i systemet, vi kan se på steget som en forutsetning som vi <em>sjekker</em> om er oppfylt, for eksempel ved å gjøre et søk mot tjenesten fra vår partner, vi kan <em>forutsette</em>, eller endog håpe at det er oppfylt og vi kan la steget kun være dokumentasjon, slik at når testen feiler, så vet vi noen ting vi kan verifisere manuelt, eller det kan være en ren løgn. Kanskje systemet er satt opp på en spesiell måte slik at det ikke er avhengig av ukedagen. Men vi har lyst til å dokumentere hvordan det hadde sett ut om det hadde vært &#8220;på ordentlig.&#8221;</li>
<li><strong>Act</strong> (utfør, &#8220;when&#8221;): Beskriver stimuli inn fra omverden. &#8220;Når brukeren registrerer en ny betaling,&#8221; &#8220;når klientsystemet sender en betalingsforespørsel med manglende kundeinformasjon&#8221;. Disse kan implementeres på flere måter i de fleste systemer: Et test av et web-grensesnitt kan simulere en klient med for eksempel <a href="http://code.google.com/p/selenium/wiki/GettingStarted?redir=1">webdriver</a>, den kan gjøre et http-kall og direkte, eller testen kan bruke klassene som implementerer tjenesten direkte. For funksjonelle tester foretrekker jeg nesten alltid det siste. Det gjør at testene vil kjøre hundre ganger raskere, og vil som regel innebære mindre jobb. Husk: Det er ikke nødvendig å teste brukergrensesnittet på nytt for hver valideringsregel eller spesialtilfelle i applikasjonen din.</li>
<li><strong>Assert</strong> (sjekk, &#8220;then&#8221;): Beskriver hvordan systemet skal reagere på stimuli og hva tilstanden til systemet skal være etterpå. For eksempel &#8220;så skal brukeren få en feilmelding om at alle betalinger må være utført før en ny betaling kan registreres&#8221;, &#8220;så skal den nye betalingen ikke lagres i systemet.&#8221;</li>
</ul>
<h3>Veien fra testscript til spesifikasjoner</h3>
<p>Når prosjekter først tar i bruk FitNesse er det veldig vanlig å se tester som ser cirka slik ut:</p>
<ul>
<li>Putt inn <em>en kjempeliste med rader med en bråte kolonner</em> inn i tabell A.</li>
<li>Putt inn <em>en ny kjempelist med rader etc</em> i tabell B</li>
<li>Send inn et kjempemessig XML dokument</li>
<li>Sjekk at svaret matcher et nytt XML dokument</li>
</ul>
<p>Dette er ikke en spesifikasjon &#8211; det er et testscript. Og det er ikke slike tester som gir verdi til et prosjekt. Men det er et sted å starte, for det krever ikke så veldig mye kreativitet. Og vi kan gjenbruke lærdommen fra slike tester. Men før det blir en hel skog av tester som dytter XML-dokumenter hit og dit, kan det være lurt å løfte testene opp på et mer logisk nivå:</p>
<ul>
<li>Gitt at det ikke eksisterer noen betalingsforespørsler</li>
<li>Og en bruker er registrert</li>
<li>Når brukeren sender inn en betalingsforespørsel med <em>ett gitt problem</em></li>
<li>Så skal brukeren få feilmeldingen <em>en gitt feilmelding</em></li>
</ul>
<p>I FitNesse-terminologi kan en slik test implementeres som en ColumnFixture. Det vil si: Hvert par av &#8220;problem&#8221; og &#8220;feilmelding&#8221; er en rad i en tabell. Slik kan vi uttrykke mange regler ved systemet klart og konsist.</p>
<p>Dersom du har startet å gå veien med testscript, er det ikke vanskelig å snu: For hver rad i den nye spesifikasjonen din skal du utføre alt det testscriptet ditt gjorde.</p>
<p>Jeg vil bruke jobben med akseptansetester til ikke bare å gjøre automatiske kjøringer av systemet mitt, men til å spesifisere og diskutere de egentlige kravene brukerne mine bryr seg om. Og dersom jeg må velge mellom tester som lar seg automatisere og spesifikasjoner som beskriver kravet, vil jeg alltid velge det siste.</p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/01/21/hemmeligheten-bak-gode-spesifikasjoner/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hvordan endre en statisk klasse til en dynamisk singleton</title>
		<link>http://sterkblanding.no/blog/2010/01/21/hvordan-endre-en-statisk-klasse-til-en-dynamisk-singleton/</link>
		<comments>http://sterkblanding.no/blog/2010/01/21/hvordan-endre-en-statisk-klasse-til-en-dynamisk-singleton/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 08:52:05 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[refactoring]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=40</guid>
		<description><![CDATA[Har du arvet kode fra noen andre? Er det ingen tester på kodebasen? Er all koden limt fast sammen med kall på statiske metoder som ikke lar seg erstatte med mocker i testene dine? Det er mulig å gjøre en disiplinert refaktorisering fra denne situasjonen til et mockbart design der alle kallene går via en [...]]]></description>
			<content:encoded><![CDATA[<div>
<div>Har du arvet kode fra noen andre? Er det ingen tester på kodebasen? Er all koden limt fast sammen med kall på statiske metoder som ikke lar seg erstatte med mocker i testene dine?</div>
<div><span id="more-40"></span></div>
<div>Det er mulig å gjøre en disiplinert refaktorisering fra denne situasjonen til et mockbart design der alle kallene går via en singleton som kan erstattes under testing. Her er en oppskrift for å endre en statisk klasse til en singleton:</div>
<div>
<ol>
<li>Gitt at den originale klassen heter StaticService. Kopier klassen til en ny klasse som blir implementasjonsklassen, for eksempel kallt ServiceImplementation</li>
<li>ServiceImplementation trenger å kun ha ikke-statiske metoder. Dette er lett å fikse ved en tekstlig &#8220;søk/erstatt&#8221; av &#8220;public static&#8221; med &#8220;public&#8221;. Normalt vil dette søket kun treffe metodene som du trenger, men det er mulig du må ettergå steget for hånd.</li>
<li>For å kunne mocke ut ServiceImplementation er det kjekt å ha et interface, for eksempel kallt ServiceInterface. Din IDE har antageligvis innebygget støtte for dette. Se etter &#8220;Extract Interface&#8221; i Refactoring menyen.</li>
<li>La en ny klasse ServiceDelegator som skal erstatte StaticService.  Legg til en private static felt til ServiceInterface. I code menyen til IDEA og i Source menyen finnes valget &#8220;(Generate) Delegate methods&#8221;. IDEA gjør disse metodene static dersom feltet er static, men det gjør dessverre ikke Eclipse. I Eclipse må man bruke &#8220;søk/erstatt&#8221; for å legge til &#8220;static&#8221; (erstatt &#8220;public&#8221; med &#8220;public static&#8221;, men pass opp for &#8220;public class&#8221; i toppen av filen)</li>
<li>Så kommer det skumle. Slett StaticService og omdøp ServiceDelegator til static service. Her vil refactoringstøtten i IDE&#8217;en din virke mot deg. All koden burde nå fortsatt kompilere uten endring.</li>
<li>Så er det bare å gjøre instansfeltet i servicen aksesserbart av testene (for eksempel med en setter) og du kan mocke ut ServiceInterface til hjertens lyst og glede</li>
</ol>
</div>
<p>Lykke til med ditt testbare prosjekt!</p></div>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/01/21/hvordan-endre-en-statisk-klasse-til-en-dynamisk-singleton/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Min første katacast</title>
		<link>http://sterkblanding.no/blog/2010/01/21/min-f%c3%b8rste-katacast/</link>
		<comments>http://sterkblanding.no/blog/2010/01/21/min-f%c3%b8rste-katacast/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 08:51:40 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://sterkblanding.no/?p=42</guid>
		<description><![CDATA[Etter at jeg så noen artige eksempler på programmere som jobbet med øvelsesprogrammering på KataCasts, bestemte jeg meg for å spille inn min egen video. Jeg er rimelig fornøyd, men jeg feilberegner bakgrunnsmusikken med cirka ett minutt. (Det gikk fortere på innspillingen enn på generalprøven). Uten mer om og men, poster jeg en video her [...]]]></description>
			<content:encoded><![CDATA[<p>Etter at jeg så noen artige eksempler på programmere som jobbet med øvelsesprogrammering på <a href="http://www.katacasts.com/">KataCasts</a>, bestemte jeg meg for å spille inn min egen video. Jeg er rimelig fornøyd, men jeg feilberegner bakgrunnsmusikken med cirka ett minutt. (Det gikk fortere på innspillingen enn på generalprøven).</p>
<p><span id="more-42"></span></p>
<p>Uten mer om og men, poster jeg en video her av hvordan jeg liker å jobbe med tester for å drive fram &#8220;kravene&#8221; til en applikasjon og refactoring for å forme designet til applikasjonen. Se spesielt rundt 11:30 minutter inn i videoen hvor jeg refactorer inn et regelmotordesign i en fungerende løsning.</p>
<p>Oppgaven kalles &#8220;Fizz buzz kataen&#8221;. Den går ut på å generere en sekvens av nummer der hvert tall som er delelig på 3 erstattes med &#8220;fizz&#8221; og alle tall som er delelig på 5 erstattes med &#8220;buzz&#8221;. Så starten blir &#8220;1, 2, fizz, 4, buzz, fizz, 7, 8, fizz, buzz, 11, etc.&#8221; Seks minutter inn i kataen endres kravet (og musikken!): Nå skal man kunne programmere inn hvilke erstatningsregler som gjelder. Som eksempel bruker jeg at &#8220;tall delelig med 2 skal erstattes med &#8216;coconut&#8217; og tall delelig med 7 skal erstattes med &#8216;banana&#8217;&#8221;.</p>
<p>Takk til Emily Bache for inspirasjon til oppgaven.</p>
<p><a href="http://vimeo.com/8459948">Fizz buzz code kata</a> av <a href="http://vimeo.com/user2873956">Johannes Brodwall</a> på <a href="http://vimeo.com">Vimeo</a>.</p>
<p>Jeg bruker <a href="http://www.jetbrains.com/idea/free_java_ide.html">IntelliJ IDEA Community Edition</a> på Windows Vista (!) til å løse oppgaven. Videoen er filmet med <a href="http://www.bbsoftware.co.uk/BBFlashBack_FreePlayer.aspx?cc=true">BB FlashBack Express</a> (som er gratis), konvertert til AVI med Windows Media 1 codec og lastet opp til Vimeo.</p>
<p>Denne blogposten var originalt publisert på engelsk på <a href="http://johannesbrodwall.com">min personlige blog</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://sterkblanding.no/blog/2010/01/21/min-f%c3%b8rste-katacast/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

