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

<channel>
	<title>BEKK Open</title>
	<atom:link href="http://open.bekk.no/feed/" rel="self" type="application/rss+xml" />
	<link>http://open.bekk.no</link>
	<description>Et innblikk i hva som skjer i BEKK</description>
	<lastBuildDate>Mon, 26 Jul 2010 10:52:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Interaksjonsdesign i smidigland &#8211; fra en utviklers perspektiv</title>
		<link>http://open.bekk.no/2010/07/11/interaksjonsdesign-i-smidigland/</link>
		<comments>http://open.bekk.no/2010/07/11/interaksjonsdesign-i-smidigland/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 07:42:50 +0000</pubDate>
		<dc:creator>Jøran Vagnby Lillesand</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[FUNK]]></category>
		<category><![CDATA[interaksjonsdesign]]></category>
		<category><![CDATA[metode]]></category>
		<category><![CDATA[smidig]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=2762</guid>
		<description><![CDATA[Smidig utviklingsmetodikk har kommet for å bli. Men hvordan passer egentlig interaksjonsdesign inn i det smidige utviklingsløpet? Dette innlegget beskriver mine erfaringer med interaksjonsdesignere i smidige prosjekter - og gir noen tips til hvordan dette kan løses.]]></description>
			<content:encoded><![CDATA[<p>Gjennom flere prosjekter har jeg hatt gleden av å se hvor viktig det er å ha interaksjonsdesignere på utviklingsprosjekter. Som utvikler er det givende å ha noen på teamet som kan gi applikasjonen det løftet som skal til for at den får det lille ekstra som imponerer brukerne og kunden og gjør at man virkelig kan være stolt av det man lager!</p>
<p>Min erfaring er at mange interaksjonsdesignere synes det er vanskelig å finne sin plass i en smidig hverdag, hvor krav og retning kan endre seg raskt. Der metodikken tidligere har vært å designe en helhetlig brukeropplevelse før utviklingen begynner, må interaksjonsdesignere nå ha flere fokus samtidig. I et landskap som oppfordrer til endring og avvik fra plan, må man forsøke å ligge et hestehode foran utviklerne til enhver tid – samtidig som det er forventet at man greier å løfte blikket og lage en langsiktig plan for applikasjonen.</p>
<h2>En interaksjonsdesigners oppgaver</h2>
<p>Under følger en beskrivelse av de forskjellige oppgavene til en interaksjonsdesigner. Jeg har forsøkt å prioritere oppgavene med de viktigste først. Merk at jeg har valgt å fokusere på noen få oppgaver; de mest sentrale sett fra mitt daglige virke som utvikler. I realiteten gjør interaksjonsdesignere uendelig mye mer, og har en <a href="http://open.bekk.no/2010/01/28/funk-metodekort/">enorm verktøykasse</a>.</p>
<h3>Daglig oppfølging</h3>
<p>Den viktigste jobben en interaksjonsdesigner gjør er å følge opp utviklingen fra dag til dag. Det vil si å «henge over» utviklerne og passe på at all funksjonalitet som lages er god nok. Helst bør dette gjøres som en fast del av utviklingsprosessen &#8211; gjerne som et akseptansekriterium innenfor hver iterasjon. Ethvert krav som toucher frontend bør først diskuteres med en interaksjonsdesigner – gjerne resulterende i omtrentlige papirskisser for løsningen. Deretter skal den ferdige implementasjonen finpusses og godkjennes før kravet kan sies å være ferdig. Skal dette fungere er det viktig at utviklerne også fokuserer på å involvere og imøtekomme interaksjonsdesigneren, slik at det ikke blir en «vi mot dem»-holdning.</p>
<p>Dersom man ikke har nok ressurser til å ligge i forkant innenfor hver enkelt iterasjon, kan man legge inn i prosessen at ingen krav er klare til utvikling før interaksjonsdesignet er ferdig. Dette vil redusere behovet for daglig oppfølging og gjøre det lettere å prioritere i hvor stor grad hvert enkelt krav skal detaljeres.</p>
<h3>Skissere målbilde for applikasjonen</h3>
<p>Den neste viktige jobben er å skissere et målbilde for hele applikasjonen. Målbildet er et ideal for hvordan applikasjonen kan bli seende ut når den er ferdig, og bør brukes til å bygge og prioritere backlog. Det er viktig å styre forventningene, slik at man ikke kommer i en posisjon der man ikke får satt noe i produksjon før målbildet er nådd og alt er implementert. Å balansere mellom målbilde og daglig oppfølging kan være vanskelig; man bør være i stand til å produksjonssette deler av løsningen ofte, mens man fortsatt sikter mot idealbildet for hele applikasjonen.</p>
<p>Skissering av målbilde bør også inneholde utprøving av enkeltkomponenter, for eksempel ved hjelp av papirskisser eller prototyper, slik at man unngår ubehagelige overraskelser sent i utviklingen.</p>
<h3>Brukertester</h3>
<p>For å sikre at man er på rett spor kan det være nyttig å hente inn feedback ved å gjennomføre brukertester av løsningen. Dette bør ikke utsettes til man anser hele applikasjonen som ferdig, men heller gjentas flere ganger under utviklingen dersom ressursene tillater det. Hvis man får produksjonssatt løsningen tidlig, bør man selvsagt også følge opp de tidlige brukerne.</p>
<h2>Avslutning</h2>
<p>Denne introduksjonen til hvordan interaksjonsdesign kan passe inn i smidig utvikling kan kanskje best avsluttes med et fritt gjengitt sitat av Mary Poppendieck: <em>«Maybe we shouldn&#8217;t be thinking about how we fit usability into agile, but how we can fit agile into usability».</em> Å skape verdi handler ikke om domenemodeller, rammeverk eller programmeringsspråk. Verdi dreier seg om å tilfredsstille og begeistre kundene dine! Dette må vi som programmere innse at det er andre som kan bedre enn oss.</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/2010/07/11/interaksjonsdesign-i-smidigland/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Riktig beskyttelse mot Cross Site Scripting- og SQL-injection-angrep</title>
		<link>http://open.bekk.no/2010/06/25/riktig-beskyttelse-mot-cross-site-scripting-og-sql-injection/</link>
		<comments>http://open.bekk.no/2010/06/25/riktig-beskyttelse-mot-cross-site-scripting-og-sql-injection/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 12:11:49 +0000</pubDate>
		<dc:creator>Erlend Oftedal</dc:creator>
				<category><![CDATA[Sikkerhet]]></category>
		<category><![CDATA[sql-injection]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=2798</guid>
		<description><![CDATA[De siste årene har vi sett flere massive SQL-injection- og Cross Site Scripting (XSS)-angrep mot store siter. Twitter hadde nylig en XSS-feil og i begynnelsen av juni var det et stort angrep mot siter som kjørte en bestemt annonsekomponent. Beskyttelse mot denne type angrep, krever at man tenker på kontekst når man skriver kode.
Validering av [...]]]></description>
			<content:encoded><![CDATA[<p>De siste årene har vi sett flere massive <a href="http://www.owasp.org/index.php/SQL_Injection">SQL-injection</a>- og <a href="http://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29">Cross Site Scripting (XSS)</a>-angrep mot store siter. Twitter hadde nylig en XSS-feil og i begynnelsen av juni var det <a href="http://blog.eeye.com/network-security/mass-infection-via-sql-injection-of-iis-websites">et stort angrep mot siter som kjørte en bestemt annonsekomponent</a>. Beskyttelse mot denne type angrep, krever at man tenker på kontekst når man skriver kode.</p>
<p><strong>Validering av input er ikke løsningen</strong><br />
Tidligere snakket man ofte om at manglende validering av input var årsaken til disse feilene. Dette er dessverre ikke riktig. Validering av input handler om å sjekke at input er riktig i forhold til domenet. Dette vil riktignok stoppe mange angrep, men på langt nær alle. Et godt eksempel er navnet &#8220;Ken-Martin O&#8217;Conner&#8221;. Dette etternavnet inneholder flere tegn som også er kontrolltegn i SQL. For å kunne godta dette navnet må man ved validering av input godta bånde bindestrek og fnutter. Dermed vil man også tillate et angrep som <code>' OR '' LIKE '' --</code>. Man kan selvsagt forsøke å gjøre valideringen enda strenger, men man risikerer kjapt å avvise gyldig input.</p>
<p>Jeg sier ikke at validering av input er unødvendig &#8211; det er bare ikke løsningen på dette problemet.</p>
<p><strong>Kontekst og escaping</strong><br />
Problemet ved både XSS- og SQL-injection-feil er at data flyter fra en kontekst og over i en annen. Ved overgang fra f.eks. javakode til SQL, må vi sørge for at vi beholder semantikken. Skal vi sette inn en datastreng i en SQL-spørring, må vi sørge for at det forblir en streng. Dette gjør vi ved å foreta output escaping. For SQL er løsningen enkelt og greit å ta i bruk parameteriserte spørringer (prepared statements). Bruker vi prepared statements og gir inn parametrene i etterkant, vil rammeverket håndtere escaping av kontrolltegn for oss.</p>
<p>For XSS er det desverre noe vanskeligere. Når data forlater vår applikasjon og går over til noe browseren skal tolke, er det nemlig flere mulige kontekster. Vi kan skrive ut innhold i javascript, javascript i HTML, mellom HTML-tagger, i HTML-attributter osv. Og flere av disse kontekstene må behandles forskjellig. Vi kan begynne med input som skrives ut mellom HTML-tagger. Dette er den enkleste konteksten. Vi kan bruke dette eksempelet:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;div&gt;Du søkte på &quot;her kommer inputten&quot;&lt;/div&gt;</pre></div></div>

<p>For å hindre kjøring av script her, må vi sørge for at input ikke kan åpne nye tagger, f.eks. en <code>&lt;script&gt;</code>-tag. Dette gjør vi selvsagt da ved å erstatte <code>&gt;</code> med <code>&amp;gt;</code> og <code>&lt;</code> med <code>&amp;lt;</code>.</p>
<p>I HTML-attributter, må vi også passe oss for enkle eller doble fnutter alt etter hva som er brukt. Et eksempel på denne konteksten kan være:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;input type=&quot;text&quot; value=&quot;her kommer inputten&quot;  name=&quot;searchValue&quot; /&gt;</pre></div></div>

<p>Et typisk angrep ville i dette tilfellet ha brutt ut av <code>value</code>-attributtet og åpnet en javascript-event (f.eks. <code>onclick</code> eller <code>onmouseover</code>). Her må vi altså <code>"</code> med <code>&amp;quote;</code> og <code>'</code> med <code>&amp;#x27;</code> eller <code>&amp;#39;</code>. Men i noen tilfeller glemmer utviklere å bruke fnutter til å avgrense attributtverdier, så til og med et mellomrom kan lede til problemer.</p>
<p>Ser vi på javascript i HTML, kan det se slik ut:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">...
&lt;body&gt;
&lt;script&gt;
var searchTerms = 'her kommer inputten';
&lt;/script&gt;&lt;code&gt;
...
&lt;/body&gt;
...</pre></div></div>

<p>Her er det kanskje lett å tenke at det holder å legge til en backslash forann eventuelle enkle fnutter (<code>'</code> blir til <code>\'</code>), men vi må huske at vi er i en såkalt <strong>dobbel-kontekst</strong>: Javascript-kontekst inni en HTML-kontekst. Vi må derfor også passe oss for HTML-tegn. <a href="http://erlend.oftedal.no/blog/?blogid=91">Her er et eksempel på hvorfor man må escape for begge kontekster</a>.</p>
<p>For mer informasjon om de forskjellige XSS-kontekstene, se <a href="http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet">OWASP XSS Prevention Cheat Sheet</a>.</p>
<p>For .NET finnes det et bibliotek kalt <a href="http://wpl.codeplex.com/">Web Protection Library</a>. Dette biblioteket har en komponent som heter AntiXSS, som kan escape for forskjellige kontekster. For Java kan man f.eks. benytte <a href="http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/Encoder.html">encoderen i ESAPI</a>.</p>
<p><strong>Oppsummert</strong><br />
Beskyttelese mot disse angrepene må gjøres med kontekstbasert escaping idet vi bytter fra en kontekst til en annen.</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/2010/06/25/riktig-beskyttelse-mot-cross-site-scripting-og-sql-injection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hvorfor trenger DIN bedrift en strategi for sosiale medier?</title>
		<link>http://open.bekk.no/2010/06/16/hvorfor-trenger-din-bedrift-en-strategi-for-sosiale-medier/</link>
		<comments>http://open.bekk.no/2010/06/16/hvorfor-trenger-din-bedrift-en-strategi-for-sosiale-medier/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 09:38:00 +0000</pubDate>
		<dc:creator>Rune F. Åsprang</dc:creator>
				<category><![CDATA[BEKK Management Consulting]]></category>
		<category><![CDATA[Virksomhet 2.0]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[forretningsutvikling]]></category>
		<category><![CDATA[innovasjon]]></category>
		<category><![CDATA[sosial programvare]]></category>
		<category><![CDATA[sosiale medier]]></category>
		<category><![CDATA[sosiale nettverk]]></category>
		<category><![CDATA[strategi]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=2791</guid>
		<description><![CDATA[Norske virksomheter har brukt noen år på å bestemme seg for å bruke sosiale medier. Fra ”forbudstiden” i 2006-2007, da flere bedrifter nedla forbud mot bruk av Facebook i arbeidstiden (se her for et eksempel – det føles lenge siden nå, gjør det ikke?), har nå de aller fleste norske bedrifter bestemt seg for å [...]]]></description>
			<content:encoded><![CDATA[<p>Norske virksomheter har brukt noen år på å bestemme seg for å bruke sosiale medier. Fra ”forbudstiden” i 2006-2007, da flere bedrifter nedla forbud mot bruk av Facebook i arbeidstiden (se <a href="http://www.adressa.no/nyheter/trondheim/article858958.ece">her</a> for et eksempel – det føles lenge siden nå, gjør det ikke?), har nå de aller fleste norske bedrifter bestemt seg for å ha et bevisst forhold til sosiale medier. Dialog som angår bedrifter pågår i sosiale medier og bedriftene ønsker altså å ha et bevisst forhold til dette, men hva gjør man så? Trenger bedriftene en egen strategi for tilstedeværelse i sosiale medier?</p>
<p>I en nylig publisert undersøkelse fra Dataforeningen konkluderes det med at 8 av 10 norske bedrifter har bestemt seg for å bruke sosiale medier – dette er 25 % mer enn for et halvt år siden. Undersøkelsen sier videre at 74% prosent av norske virksomheter har hatt sosiale medier som tema for diskusjon i ledergruppen. 67% av respondentene i undersøkelsen mener at virksomheter som ikke har en strategi for sosiale medier vil møte problemer. Det er altså ingen tvil om at holdningene til sosiale medier er i kraftig endring i norske bedrifter!</p>
<p><strong>Skeptisk?</strong></p>
<p>Motargumentene mot store norske virksomheters tilstedeværelse i sosiale medier vil alltid være tilstede. Frykt for at brukerne på sosiale medier er negative, angst for delekultur og åpenhet og spørsmål rundt personvern og IT-sikkerhet er vanlige motargumenter mot å ta skrittet ut i de sosiale medienes verden. Men veier fordelene opp for ulempene?</p>
<p><strong>Sosiale medier har sine fordeler!</strong></p>
<p>En bevisst tilstedeværelse i sosiale medier gir mulighet til å utnytte markedets engasjement for selskapets merkevare(r) til selskapets fordel. Dialog i sosiale medier fostrer innovasjon – ideer  til forbedring oppstår lettest gjennom dialog og samspill. Sosiale medier er som skapt for dette. Bedrifter som lytter til varepraten i sosiale medier, og bruker dette aktivt i sin forretningsutvikling, utvikler produkter som kundene vil betale for!</p>
<p>Sosiale medier byr på en unik mulighet til å synliggjøre bedriftens handlekraft og smidighet. Hvilke andre muligheter har en bedrift til å fortelle markedet daglig om hva man gjør for å utvikle bedre produkter og tjenester og hvordan man jobber for sine kunder? Benytter man seg av mulighetene de sosiale mediene gir bygger man etter min mening omdømme med en effektivitet som tidligere var umulig.</p>
<p><strong>Trenger man en strategi for sosiale medier da?</strong></p>
<p>Varepraten og dialogen om virksomheter går i de sosiale mediene uansett, man må forholde seg til disse mediene enten man vil eller ikke. Edgar Valdmanis i Dataforeningen <a href="http://www.idg.no/computerworld/karriere/article163545.ece">oppsummerer dette</a> på en glimrende måte: ”Dine ansatte er der, dine kunder er der, dine leverandører er der. Hvis du neglisjerer dette, er det på egen risiko!”</p>
<p>Store norske virksomheter bør derfor investere tid og ressurser i å utarbeide en strategi for sin tilstedeværelse i sosiale medier. Strategien bør gjøres lett tilgjengelig for alle ansatte – enkelhet og evnen til å fatte seg i korthet er suksessfaktorer i så måte. Som et minimum bør en strategi for tilstedeværelse i sosiale medier klart definere hva man ønsker å oppnå (mål), hva man skal gjøre (satsingsområder) og hvor man skal gjøre det (Twitter? Facebook? Egen blogg? Eget nettsamfunn?).</p>
<p><strong>Investering i strategi vil tilbakebetales!</strong></p>
<p>Investeringen i en strategi for tilstedeværelse i sosiale medier vil tilbakebetales gjennom økt effekt av ressursbruk på sosiale medier og økt seriøsitet i sosiale medier.</p>
<p>Økt effekt av ressursbruken på sosiale medier oppnår man gjennom at strategien gir en klar retning og et fokus til satsingen i sosiale medier. Dette forenkler prioritering av ressursbruken på sosiale medier og man unngår bruk av ressurser på områder der forventet effekt er lav.</p>
<p>Bedrifter som har en strategi for tilstedeværelse i sosiale medier opplever økt grad av seriøsitet i sosiale medier blant de ansatte. Ansatte som er trygge på at ledelsen har en plan for bedriftens tilstedeværelse i sosiale medier unngår å ”ta ansvar” for å svare på bedriftens vegne når de finner det for godt. <a href="http://thomasmoen.com/wimpgate">Wimpgate</a> og <a href="http://www.arnsteinlarsen.no/2009/04/warnerfail-hvorfor-sa-stor-stahei/">Warnerfail</a> er eksempler de fleste bedrifter forsøker å unngå.</p>
<p>For å etablere en profesjonell tilstedeværelse i sosiale medier trenger man altså en strategi som definerer fokus for tilstedeværelsen. Det å definere fokus handler mer om å velge bort enn å velge. Hva vil vi oppnå med vår tilstedeværelse i sosiale medier? Hva skal vi gjøre i sosiale medier? Hvordan skal vi fremstå? Hvilke kanaler skal vi bruke? Hvilke avdelinger eller forretningsområder skal være ansvarlige?</p>
<p>Dette er sentrale spørsmål som må besvares i en strategi for tilstedeværelse i sosiale medier. Og ja, jeg mener at DIN bedrift trenger en strategi for tilstedeværelse i sosiale medier!</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/2010/06/16/hvorfor-trenger-din-bedrift-en-strategi-for-sosiale-medier/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Komponentbaserte webrammeverk: Tapestry 5</title>
		<link>http://open.bekk.no/2010/06/03/komponentbaserte-webrammeverk-tapestry-5/</link>
		<comments>http://open.bekk.no/2010/06/03/komponentbaserte-webrammeverk-tapestry-5/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 15:17:30 +0000</pubDate>
		<dc:creator>Thomas Fossum</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[Webarkitektur]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[webrammeverk]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=2746</guid>
		<description><![CDATA[Nytt prosjekt, nye muligheter!
Når man planlegger et utviklingsprosjekt for web vil dette som oftest innebære et valg av webrammeverk. Det er etterhvert blitt svært mange å velge blant, og det kan være en utfordring å få oversikt over hva som skiller de ulike rammeverkene. Tradisjonelle action-baserte webrammeverk som Struts2 og Spring MVC har modne og [...]]]></description>
			<content:encoded><![CDATA[<p>Nytt prosjekt, nye muligheter!</p>
<p>Når man planlegger et utviklingsprosjekt for web vil dette som oftest innebære et valg av webrammeverk. Det er etterhvert blitt svært mange å velge blant, og det kan være en utfordring å få oversikt over hva som skiller de ulike rammeverkene. Tradisjonelle action-baserte webrammeverk som Struts2 og Spring MVC har modne og velprøvde API, og blir ofte valgt fordi man her har erfaring fra før og fordi rammeverkene støttes av en stor community. Men blant alternativene som bør vurderes finnes en rekke komponent-baserte rammeverk med en mer høynivå tilnærming. Disse rammeverkene lover rask og effektiv utvikling med et minimum av konfigurasjon, og konfigurerbare, kraftige komponenter som holder på sin egen tilstand og gir rik funksjonalitet rett ut av boksen. Rammeverkene er ment å være utviklervennlige, med utstrakt implementasjon av best pactices.</p>
<p>Tapestry er et open source komponent-basert webrammeverk som har vært under utvikling siden starten av 2000-tallet. Med versjon 5 har rammeverket fått mye oppmerksomhet og positiv omtale. I likhet med Wicket er det nå tatt inn som et Apache-prosjekt, noe som betyr at kildekoden er tilgjengelig med Apache Software Licence 2.0.</p>
<h3>Hvorfor skal så du vurdere dette rammeverket kontra tradisjonelle action-baserte webrammeverk?</h3>
<p>Utviklerne bak Tapestry har definert fire egenskaper som de anser som de viktigste for et rammeverk:</p>
<ul>
<li>Enkelhet &#8211; å utvikle webapplikasjoner skal ikke trenge å være så komplisert. Mye kompleksitet blir håndtert av rammeverket, som utvikler skal du få fokusere på forretningslogikk.</li>
</ul>
<ul>
<li>Konsistens &#8211; Rammeverket skal ha en konsistent oppførsel, med komponenter som er &#8220;self contained&#8221;, altså holder på sin egen tilstand. Webapplikasjoner lagd med Tapestry skal ha en uniform struktur og utviklere skal kunne bygge på best practices.</li>
</ul>
<ul>
<li>Effektivitet &#8211; Applikasjoner basert på Tapestry skal ha god ytelse og skalerbarhet. Utviklingsprosessen skal også være så effektiv som mulig.</li>
</ul>
<ul>
<li>Tilbakemelding &#8211; Rammeverket skal gi god og relevant informasjon til utvikler hvis feilsituasjoner oppstår.</li>
</ul>
<h3>Hvordan er så dette implementert i Tapestry 5?</h3>
<p><strong><span style="color: #000000;">Enkelhet</span></strong></p>
<p>En webapp lagd i Tapestry består av et sett med sider som håndteres av rammeverket. En side består av en template (med en eller flere gjenbrukbare komponenter) og en tilhørende javaklasse med samme navn. Javaklassen er en POJO uten avhengigheter til andre deler av rammeverket; ingen superklasse som må extendes, ingen interface må implementeres.</p>
<p>Denne understøttende javaklassen tilsvarer en Controller i et action-basert rammeverk, og håndterer events som kommer fra viewet. Dette ligner mye på måten tradisjonelle desktop-applikasjoner fungerer, og innebærer et høyere nivå av abstraksjon fra request/response-modellen som f.eks Struts2 og Spring MVC bruker. Urler og request-parametere er erstattet av metoder og egenskaper ved side-objekter. Komponenter er også bygget opp på samme måte; en template og en javaklasse med samme navn, uten avhengigheter. Bruken av POJOs gjør det lett å lage egne testbare komponenter, samt å utvide eksisterende komponenter.</p>
<p>Så hvordan kan Tapestry sette sammen templates og tilhørende javaklasser når disse ikke arver fra en rammeverkspesifikk superklasse eller implementerer bestemte interfaces? Tapestry bruker bytecode weaving til å legge til tapestryspesifikk kode ved runtime. Dette skjer ved at sider og komponenter bruker annotations for å beskrive hvordan rammeverket skal håndtere koden. En kan også bruke navnekonvensjon på metoder som lytter på events, og dermed redusere bruken av annotations. Den utstrakte bruken av annotations og navnekonvensjoner øker lesbarheten og reduserer mengden boilerplate kode.</p>
<p>En siste viktig detalj mht enkelhet er at konfigurasjon gjøres programatisk i en egen javaklasse. Dette gir svært lite deklarasjon i XML å forholde seg til, kun web.xml. Tapestry kommer med en defaultkonfigurasjon som man kan utvide og endre ved behov.</p>
<p><strong><span style="color: #000000;">Konsistens</span></strong></p>
<p>Et viktig designprinsipp for Tapestry er &#8220;convention over configuration&#8221;. Sider, komponenter, templates, services etc må ligge i bestemte kataloger, og følge bestemte navnekonvensjoner. Det man tjener på dette er redusert behov for konfigurasjon, samt en konsistent struktur på webapplikasjonen.</p>
<p>Alle komponenter er self-contained og kan plasseres på hvilken som helst side. De holder sin egen state uten behov for parametere.</p>
<p><strong><span style="color: #000000;">Effektivitet</span></strong></p>
<p>I likhet med andre komponentbaserte webrammeverk er Tapestry svært velegnet til prototyping og rask utvikling av webapplikasjoner.</p>
<p>Kraftige, gjenbrukbare komponenter gir mye funksjonalitet ut av boksen, og disse er enkle å modifisere og utvide. Det er også enkelt å utvikle egne komponenter. Rammeverket kommer med bl.a URL-håndtering, mulighet for tilstandshåndtering på klient eller server, inputvalidering, internationalization, AJAX-støtte og feilrapportering innebygget, og integrasjon mot en rekke kjente rammeverk som Spring og Hibernate er inkludert.</p>
<p>Som utvikler ønsker man å produsere mest mulig funksjonalitet raskest mulig, med færrest mulig feil. Code-test-deploy roundtrip bør derfor være så kort som mulig, og rammeverket må understøtte testdrevet utvikling. Nettopp effektivitet og testbarhet er blant Tapestrys sterkeste kort.</p>
<p>Med live class reloading av alle komponent-klasser trenger man ikke redeploye aplikasjonen for å se resultatet av en endring i koden. Tapestry har en egen classloader som ser etter endringer i koden, og dette muliggjør høy produktivitet. Ettersom komponentene i Tapestry håndterer sin egen tilstand og eventhandling abstraherer bort mye kompleksitet kan utviklere heller konsentrere seg om forretningslogikk. Tapestry er også velegnet for TDD, med sider og komponenter som er POJOs uten avhengigheter til rammeverket.</p>
<p>Et annet viktig prinsipp for Tapestry er &#8220;static structure, dynamic behavior&#8221;.<br />
Med dette menes at strukturen til en gitt side er statisk mens logikken i komponentene gjør at sidene likevel er dynamiske. Med en statisk instans av strukturen for en side kan denne pooles av rammeverket. Dette gjør at en side som aksesseres flere ganger vil gjenbrukes, noe som er gunstig både for ytelse og skalering. Tapestry lagrer mindre data i HttpSession enn andre komponentbaserte rammeverk som JSF og Wicket, fordi bare data fra en side lagres, ikke hele side-instansen.</p>
<p><strong><span style="color: #000000;">Tilbakemelding</span></strong></p>
<p>Når en feilsituasjon oppstår vil Tapestry gi utvikler en detaljert og informativ feilmelding. Feilmeldingen vil referere til riktig kodelinje i den originale kildekoden, med et utsnitt av den aktuelle kodebiten og en mulig feilårsak og løsning.</p>
<h3>Så er alt bare gull og Tapestry 5 et soleklart valg i ditt neste prosjekt?</h3>
<p>Det er endel aspekter man bør være klar over når man vurderer Tapestry.</p>
<p>Rammeverket har fått endel pepper for manglende bakoverkompatibilitet ved major releases. Versjon 5 er en omfattende omskrivning ift v4, og en migrering av et eldre prosjekt vil være tidkrevende. Nå loves det fra utviklerne at man f.o.m v5 ikke skal få dette problemet så lenge selve grunnkonseptene ikke endres.</p>
<p>Komponenter som håndterer sin egen tilstand gjør at man kan få mye data i session scope og dermed stort minneforbruk; dette er en generell problemstilling for komponentbaserte webrammeverk. Tapestry håndterer dette vha førnevnte side-pooling og lagring kun av data for en side i session. Man kan også optimalisere applikasjonen ved å sette en grense for antall sider i session.</p>
<p>Bruken av en pool med side-instanser begrenser også den potensielt uheldige effekten for ytelse som runtime bytecode weaving kan ha. Sider vil ta kun ta lenger tid å laste ved førstegangs aksess, så dette er ikke et større problem i Tapestry enn f.eks i JSP.</p>
<p>Feilsøking i generert tapestrykode kan være frustrerende. Koden du har skrevet blir vevd sammen med tapestrykode runtime, og en bug kan ligge i koden fra rammeverket. Du har da muligheten til å sette loglevel til DEBUG, og få ut logg for den endelige, genererte koden.</p>
<p>Lærekurven kan være bratt hvis man tidligere kun har skrevet webapplikasjoner i action-baserte rammeverk. Erfaring fra utvikling av desktop-applikasjoner vil være relevant for det programmeringsparadigmet man bruker i Tapestry. Dokumentasjonen er blitt mye bedre med versjon 5, og veien til den første Hello World-applikasjonen er ikke lang.</p>
<p>Tapestry har færre brukere og aktive commiters enn f.eks Struts2, Spring MVC og JSF, men community er i vekst nå som Tapestry er blitt et Apacheprosjekt.</p>
<h3>Konklusjon</h3>
<p>Hvis du skal vurdere webrammeverk til en applikasjon med et rikt GUI og ønsker å utvikle dette uten bruk av plugins må komponentbaserte webrammeverk vurderes. Med Apache i ryggen og en økende brukermasse er Tapestry 5 et webrammeverk i positiv utvikling.</p>
<p>Tapestry gir deg et bibliotek med kraftige, utvidbare og godt dokumenterte komponenter, og sikrer en rask utviklingssyklus med live class reloading. Rammeverket forenkler utvikling av rike GUI for web og er godt egnet for testdrevet utvikling. For å oppnå enkelhet ved utvikling må man ofre noe fleksibilitet. Ved å akseptere de valg som er gjort i rammeverket får man konsistens, på bekostning av ubegrenset mulighet til å implementere egne patterns.</p>
<p>Tapestry 5 bør være på lista når webrammeverk skal velges i ditt neste prosjekt.</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/2010/06/03/komponentbaserte-webrammeverk-tapestry-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automated functional testing of iPhone apps with iCuke</title>
		<link>http://open.bekk.no/2010/06/02/automated-functional-testing-of-iphone-apps-with-icuke/</link>
		<comments>http://open.bekk.no/2010/06/02/automated-functional-testing-of-iphone-apps-with-icuke/#comments</comments>
		<pubDate>Wed, 02 Jun 2010 12:05:20 +0000</pubDate>
		<dc:creator>Aslak Hellesøy</dc:creator>
				<category><![CDATA[Fri Programvare]]></category>
		<category><![CDATA[Kvalitet og testing]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[icuke]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=2735</guid>
		<description><![CDATA[Seeing the downloads of the open source BDD/Acceptance Testing tool Cucumber skyrocketing is great, but seeing what insane extensions the community comes up with is even greater.
UK-based super hacker and long time Cucumber contributor Rob Holland announced iCuke yesterday. iCuke is a Cucumber extension that lets you write automated functional tests for iPhone apps. Here [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://open.bekk.no/wp-content/uploads/2010/06/icuke.png"><img class="size-full wp-image-2737 alignleft" title="icuke" src="http://open.bekk.no/wp-content/uploads/2010/06/icuke.png" alt="" width="110" height="203" /></a>Seeing the downloads of the open source BDD/Acceptance Testing tool Cucumber <a href="http://rubygems.org/gems/cucumber">skyrocketing</a> is great, but seeing what insane extensions the community comes up with is even greater.</p>
<p>UK-based super hacker and long time Cucumber contributor Rob Holland <a href="http://www.unboxedconsulting.com/blog/cucumber-iphone-icuke">announced iCuke yesterday</a>. iCuke is a Cucumber extension that lets you write automated functional tests for iPhone apps. Here is a little teaser&#8230;</p>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=12230690&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=12230690&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object>
<p><a href="http://vimeo.com/12230690">iCuke</a> from <a href="http://vimeo.com/user1178904">Aslak Hellesøy</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>For questions about iCuke, please use the <a href="http://groups.google.com/group/icuke">iCuke mailing list</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/2010/06/02/automated-functional-testing-of-iphone-apps-with-icuke/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Det lønner seg å dele: GoOpen 2010</title>
		<link>http://open.bekk.no/2010/05/04/det-l%c3%b8nner-seg-a-dele-goopen-2010/</link>
		<comments>http://open.bekk.no/2010/05/04/det-l%c3%b8nner-seg-a-dele-goopen-2010/#comments</comments>
		<pubDate>Tue, 04 May 2010 21:07:41 +0000</pubDate>
		<dc:creator>Jon Grov</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Fri Programvare]]></category>
		<category><![CDATA[friprog]]></category>
		<category><![CDATA[offentlig]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=2696</guid>
		<description><![CDATA[Nasjonalt kompetansesenter for fri programvare, ofte kalt Friprogsenteret, arrangerer hvert år konferansen GoOpen. Flere av våre kunder tjener på pragmatisk og effektiv bruk av fri programvare. Se vår direktør for kundeutvikling, Jon Fageraas, fortelle hvorfor dyp kunnskap om både fri programvare og etablerte kommersielle produkter er nødvendig for å være en god leverandør.


Blant konferanseforedragene var [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.friprog.no/" target="_blank">Nasjonalt kompetansesenter for fri programvare</a>, ofte kalt Friprogsenteret, arrangerer hvert år konferansen <a href="http://www.goopen.no" target="_blank">GoOpen</a>. Flere av våre kunder tjener på pragmatisk og effektiv bruk av fri programvare. Se vår direktør for kundeutvikling, Jon Fageraas, fortelle hvorfor dyp kunnskap om både fri programvare og etablerte kommersielle produkter er nødvendig for å være en god leverandør.</p>
<div style="width: 425px;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="250" 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=10920934&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="425" height="250" src="http://vimeo.com/moogaloop.swf?clip_id=10920934&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></div>
<p>
Blant konferanseforedragene var <a href="http://www.avinor.no" target="_blank">Avinors</a> erfaringer med offentliggjøring av data (som du også kan lese mer om <a href="http://open.bekk.no/2009/12/13/hva-skjer-nar-man-gir-bort-flydata-gratis/" target="_blank">her</a>),  <a href="http://www.norwegian.no">Norwegians</a> sofistikerte og sammensatte arkitektur for flyreservasjon, samt <a href="http://www.nav.no">NAVs</a> nye <a href="http://www.nav.no/stillinger/index.jsf" target="_blank">stillingssøk</a> basert på søkemotoren <a href="http://lucene.apache.org/solr/" target="_blank">Solr</a>. Sistnevnte ble filmet, se foredraget til NAVs portalansvarlig Magnus Børnes Hellevik sammen med Carl Christensen lenger ned.</p>
<div id="__ss_3814222" style="width: 425px;"><strong style="display: block; margin: 12px 0 4px;"><a title="GoOpen 2010: Avinor" href="http://www.slideshare.net/Friprog/goopen-2010-ann-kristin-hansen">GoOpen 2010: Avinor</a></strong><object id="__sse3814222" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" 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://static.slidesharecdn.com/swf/ssplayer2.swf?doc=ann-kristinhansenavinor-100422041507-phpapp01&amp;stripped_title=goopen-2010-ann-kristin-hansen" /><param name="name" value="__sse3814222" /><param name="allowfullscreen" value="true" /><embed id="__sse3814222" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=ann-kristinhansenavinor-100422041507-phpapp01&amp;stripped_title=goopen-2010-ann-kristin-hansen" name="__sse3814222" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<div id="__ss_3814231" style="width: 425px;"><strong style="display: block; margin-top: 12px; margin-bottom: 0px; padding-bottom: 0px;"><a title="GoOpen 2010: Norwegian" href="http://www.slideshare.net/Friprog/goopen-2010-hvard-haug-hanssen">GoOpen 2010:  Norwegian</a></strong><object id="__sse3814231" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" 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://static.slidesharecdn.com/swf/ssplayer2.swf?doc=havardhaughanssennorwegian-100422041605-phpapp01&amp;stripped_title=goopen-2010-hvard-haug-hanssen" /><param name="name" value="__sse3814231" /><param name="allowfullscreen" value="true" /><embed id="__sse3814231" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=havardhaughanssennorwegian-100422041605-phpapp01&amp;stripped_title=goopen-2010-hvard-haug-hanssen" name="__sse3814231" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<div style="width: 425px;"><strong style="display: block; margin: 12px 0 4px;"><a href=" http://vimeo.com/11049845">GoOpen 2010: NAV</a></strong><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="252" 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=11049845&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="425" height="252" src="http://vimeo.com/moogaloop.swf?clip_id=11049845&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></div>
<div style="margin-top: 10px">Stor takk til Friprogsenteret, og ikke minst til bidragsyterne, for at presentasjonene er gjort tilgjengelig.</div>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/2010/05/04/det-l%c3%b8nner-seg-a-dele-goopen-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Om arkitektur og hvordan den blir til</title>
		<link>http://open.bekk.no/2010/04/12/om-arkitektur-og-hvordan-den-blir-til/</link>
		<comments>http://open.bekk.no/2010/04/12/om-arkitektur-og-hvordan-den-blir-til/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 07:13:44 +0000</pubDate>
		<dc:creator>Vidar Kongsli</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Systemarkitektur]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[arkitektur]]></category>
		<category><![CDATA[metode]]></category>
		<category><![CDATA[prosess]]></category>
		<category><![CDATA[systemutvikling]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=2580</guid>
		<description><![CDATA[I mitt tidligere innlegg &#8220;Om arkitektur&#8221; forsøkte jeg å si noe om hva  arkitektur innen informasjonsteknologi betyr og hvilket fokus  arkitekturarbeidet bør ha. Jeg forsøkte å analysere hva ordet arkitektur  kommer av og hvordan den klassiske tolkningen av ordet gikk ut på.  Videre forsøkte jeg å trekke paralleller til hvordan arkitektur [...]]]></description>
			<content:encoded><![CDATA[<p>I mitt tidligere innlegg &#8220;<a title="Første artikkel, &quot;Om arkitektur&quot;" href="http://open.bekk.no/2010/04/06/om-arkitektur/">Om arkitektur</a>&#8221; forsøkte jeg å si noe om hva  arkitektur innen informasjonsteknologi betyr og hvilket fokus  arkitekturarbeidet bør ha. Jeg forsøkte å analysere hva ordet arkitektur  kommer av og hvordan den klassiske tolkningen av ordet gikk ut på.  Videre forsøkte jeg å trekke paralleller til hvordan arkitektur bør  tolkes innen informasjonsteknologi. Minst like viktig er det å se på  hvordan en arkitektur blir til, og ikke minst hvilke oppgaver en  arkitekt bør ha i så henseende. I dette innlegget forsøker jeg å komme  med noen tanker rundt dette.</p>
<h3>&#8220;Jeg har sett mange gode arkitekturer som aldri ble noe av&#8221;</h3>
<p>Dette sitatet (fritt etter hukommelsen) hørte jeg fra en foreleser på en  konferanse for en tid tilbake. Min første tanke var: &#8220;var arkitekturen god hvis den  ikke ble noe av&#8221;? Hvis vi igjen skal se på gode, gamle <a title="Lenke til side om Vitruvius hos Wikipedia" href="http://en.wikipedia.org/wiki/Vitruvius">Vitruvius</a> som jeg  nevnte i mitt forrige innlegg; oppfyller arkitekturen som ikke ble noe  av ikke prinsippene <em>firmitatis utilitatis venustatis? </em>Ikke var  den robust, ikke var den nyttig for brukerne og den fikk aldri sjansen  til å vise sin skjønnhet. Vel. Mer fruktbart er det kanskje å spørre seg  hvorfor en arkitekturplan aldri ble noe av. Det kunne være at den ble  for dyr, det kunne være at den ikke løste utfordringene den skulle eller  det kunne være at den ikke hadde tilstrekkelig forankring i  organisasjonen. Like viktig som hva en arkitektur består av, er hvordan  den ble til.</p>
<h3>Arkitektur ikke bare en arkitekts anliggende</h3>
<p>Arkitektur er et tverrfaglig område. Det omhandler forretningen  (hvilken funksjonalitet er ønsket, og hvilken verdi gir den?),  økonomi/finans (hva er kostnadene? Oppstartskostnader vs. operasjonelle  kostnader, osv.) og ikke minst teknologi (modenhet, tilgjengelighet,  osv.). En god arkitekturprosess krever forankring og involvering fra  ulike deler av organisasjonen og jo mer eierskap de involverte føler, jo  større er sjansen for å lykkes. Et eksempel på dette er smidige  utviklingsprosjekter, der arkitekturspørsmål bør kunne diskuteres og  løses i utviklingsteamet. I den grad man har arkitekturprinsipper som  går på tvers av prosjekter, bør man sikre tilstrekkelig involvering på  tvers av prosjekter, f.eks. gjennom at arkitekter dedikeres til  prosjektene og kan jobbe tett med utviklingsteamene.</p>
<h3>Arkitektur og &#8220;Big Design Up Front&#8221;  &#8211; BDUF</h3>
<p>I mitt tidligere innlegg pekte jeg på at arkitektur er en delmengde av  design i den forstand at design kan skje på alle granularitetsnivåer og  kan gjerne omhandle en moduls eller applikasjons interne organisering,  mens arkitektur fokuserer på helheten og eksterne kvaliteter. I smidige  prosjekter ønsker man å unngå det man kaller &#8220;<a href="http://en.wikipedia.org/wiki/Big_Design_Up_Front">big design up front</a>&#8220;,  altså at design skjer før utviklingen eller implementasjonen starter.  Dette er et prinsipp som brukes uavhengig av hvilke smidige metoder som  benyttes, men jeg syns <a href="http://en.wikipedia.org/wiki/Lean_software_development">Lean Software Development</a> er nærmest å forankre  prinsippet teoretisk. I mine øyne er fravær av BDUF en følge av tre  Lean-prinsipper: 1) vektlegge læring, 2) ta avgjørelser så sent som  mulig og 3) mindre avfall, &#8220;eliminate waste&#8221;. Ved å kjøre  designprosessen som en del av utviklingsprosessen kan man ta med seg  læring inn i designprosessen. Videre kan man utsette designavgjørelser  lengre slik at man har mer informasjon og kunnskap tilgjengelig som  beslutningsgrunnlag og dermed forhåpentligvis ta en bedre avgjørelse enn  man kunne gjort tidligere. Til sist, hvis design gjøres samtidig som  implementasjonen, sparer man unødig ressursbruk til dokumentasjon i og  med at de involverte har informasjonen i mente allerede. Mer om  dokumentasjon senere&#8230;</p>
<p>Spørsmålet er om regelen om å unngå &#8220;big  design up front&#8221; også gjelder for arkitektur? Ja og nei. Noen  arkitekturavgjørelser må ofte tas før man starter implementasjon. Dette  kan for eksempel være hvilken implementasjonsplattform man ønsker å  bruke (Java EE eller .NET, for eksempel). Det som er viktig i slike  sammenhenger, er som jeg nevnte i forrige avsnitt at man utsetter  avgjørelser som er vanskelig å omgjøre så lenge som mulig. Spesielt  viktig er det også å utsette avgjørelser som introduserer mye  kompleksitet så lenge som mulig fordi kompleksitet ofte introduserer  avhengigheter. Disse bidrar så til å krympe mulighetsrommet for  arkitekturen. Med andre ord får man mindre frihetsgrader. I den grad man  kan gjøre det, bør man fatte avgjørelser som kan omgjøres for å unngå å  male seg inn i et hjørne. Et godt innlegg om det å utsette avgjørelser  finner du <a title="The principle of Last Responsible Moment" href="http://asserttrue.blogspot.com/2009/04/principle-of-last-responsible-moment_11.html">her</a>.</p>
<h3>Et dokument er ikke arkitektur</h3>
<p>&#8220;Leveransen fra arkitekturprosessen er et arkitekturdokument&#8221;. &#8220;I følge  rammeverk X skal leveransen fra arkitekturprosessen være et Y-diagram,  en Z-modell, &#8230; , samt en forretningmodell&#8221;.  Lyder kjent? Å ha noe  håndfast (i den grad man kan omtale et elektronisk dokument som  håndfast, man kan i det minste skrive det ut for å få noe håndfast) å  vise til som resultat av en investering gir en god og varm følelse. I  klassisk transaksjonstankegang er dette viktig fordi det er et synlig  bevis for hva man har fått igjen, og et sett arkitekturprinsipper som  eksisterer inni hodene på folk ikke gir den samme følelsen av å ha fått  noe tilbake.</p>
<p>Å benytte et rammeverk for arkitektur som definerer  et sett av dokumenter som skal produseres gir også troverdighet som det  er behagelig å lene seg på. Dette er selvfølgelig vissvass. Et  arkitekturrammeverk er et tomt skall uten innhold, og det er innholdet  som er viktig.</p>
<p>Arkitektur består av en del fokusområder /  kvaliteter (eksempelvis <em>firmitatis utilitatis venustati</em>s). Disse  er i stor grad ideer eller prinsipper, og det er veldig vanskelig å  formidle ideer og prinsipper i dokumenter. Enklere er det derimot å  overføre ideer muntlig, og enda bedre; hvis man selv har vært med på å  komme frem til disse har man en enda bedre forståelse (og ikke minst et  større eierskap). Dokumenter er den dårligste kommunikasjonsformen, og  burde brukes når andre former ikke er tilgjengelige. Dette kan være  tilfelle på grunn av avstand til brukere; både organisatorisk,  geografisk og i tid. Som jeg nevnte i forrige avsnitt; den  organisatoriske avstanden bør minimeres gjennom involvering, og som jeg  nevnte i avsnittet om BDUF, avstanden i tid bør minimeres ved å utsette  arkitekturavgjørelsene så lenge som mulig.</p>
<h3>Oppsummering</h3>
<p>Gjennom disse to innleggene om arkitektur har jeg vært innom flere  aspekter som kan oppsummeres som følger:</p>
<ol>
<li>Arkitektur fokuserer  på helheten og på eksterne kvaliteter (hva som er eksternt varierer dog  avhengig av perspektivet)</li>
<li>Arkitektur består av en del  kvalitetsområder eller prinsipper, eksempelvis <em>firmitatis utilitatis  venustati</em>s</li>
<li>Arkitekturarbeid er en tverrfaglig prosess der  involvering fra ulike deler av organisasjonen er viktig</li>
<li>Arkitektur  bør utvikles gradvis, parallelt med implementasjon der man underveis  nyttiggjør seg lærdom man opparbeider seg</li>
<li>Leveransen fra  arkitekturarbeid bør ikke defineres i form av dokumenter.  Kommunikasjonsformen bør tilpasses situasjonen.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/2010/04/12/om-arkitektur-og-hvordan-den-blir-til/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Plumbo og sånt&#8230;</title>
		<link>http://open.bekk.no/2010/04/06/plumbo-og-sant/</link>
		<comments>http://open.bekk.no/2010/04/06/plumbo-og-sant/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 17:56:16 +0000</pubDate>
		<dc:creator>Janniche Haugen</dc:creator>
				<category><![CDATA[BEKK]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=2607</guid>
		<description><![CDATA[Gode utviklere bruker ikke Plumbo! Det tror nå i hvert fall jeg&#8230; Hvorfor ikke? Jo, fordi de liker å finne ut hva som _egentlig_ er feil, og fikse det.
Har du rusk i rørene? Selvfølgelig er jo Plumbo effektivt der og da &#8211; hell litt i røret, vent, skyll med masse varmt vann og rørene er [...]]]></description>
			<content:encoded><![CDATA[<p>Gode utviklere bruker ikke Plumbo! Det tror nå i hvert fall jeg&#8230; Hvorfor ikke? Jo, fordi de liker å finne ut hva som _egentlig_ er feil, og fikse det.</p>
<p>Har du rusk i rørene? Selvfølgelig er jo Plumbo effektivt der og da &#8211; hell litt i røret, vent, skyll med masse varmt vann og rørene er så gode som nye! Eller? Nei… Det er en grunn til at det står på Plumbo-flasken at den ikke må brukes på ditt og datt rør. (Ettersom jeg ikke eier Plumbo klarer jeg ikke å sitere flasken heelt riktig). Men, jeg vet at Plumbo er skadelig for rørene dine, særlig når man har en leilighet fra 1936. I tillegg fungerer det jo bare en liten stund. Hvorfor? Fordi du ikke har fikset roten til problemet.<br />
<strong><br />
Plumbo gir ingen tilfredsstillende følelse av å ha fikset problemet.  Det er som et lite hack &#8211; du vet at det virker, enn så lenge. </strong></p>
<p>Med mindre du ikke vet bedre da. Men, den dagen du finner ut at Plumbo ikke er verdens smarteste ting å bruke i lengden &#8211; forhåpentligvis før rørene dine må skiftes &#8211; er det på tide å tenke litt lenger. Kanskje du faktisk må løfte på den risten, stikke hånden ned i røret og finne ut hvorfor vannet ikke renner ut som det skal. Det er ikke bare moro å tømme et rør for rusk, men følelsen i etterkant er myyye bedre. Ekstra smart føler du deg den dagen du finner ut at grunnen til at rusket havner i røret og tetter det er fordi risten som ligger over ikke er tett nok.<br />
<strong><br />
Brett opp armene og tør å bli skitten! </strong></p>
<p>Og ja, jeg kom til å tenke på dette da jeg plutselig hadde skrudd fra hverandre hele toalettet mitt, fordi det laget lyder. Jammen meg fant jeg ut hvordan mekanismen for å få vann både inn og ut fungerte; hvordan toalettet har en enkel detektor flytende i vannet for å vite når det skal fylles igjen, hva som gjorde at det lakk og dermed laget lyder når det hele tiden måtte fylles igjen. Jeg kunne jo kalt inn en ekspert, men hvorfor det når man ved å plukke ting varsomt fra hverandre finner helt fint ut hvordan patenten fungerer og hvordan det skal settes sammen igjen.</p>
<p>Jeg hører fremdeles min fars stemme i hodet: &#8220;Ikke bruk makt&#8221; &#8211; hver gang jeg ikke helt forstår hvordan noe fungerer og har lyst å rive det fra hverandre. Dette minner meg om at med litt tålmodighet finner jeg alltid ut hvordan ting henger sammen. Hans moral var alltid at det finnes en patent. Finner man og forstår denne er det sjelden bruk for makt. I tillegg slipper man selvfølgelig å ødelegge ting, noe som er fornuftig når man har en innebygget nysgjerrighet som gjør at man bare _må_ sjekke inni alt som er av fjernkontroller og duppeditter for å se hvordan det fungerer. Det kan nå kanskje også nevnes at jeg ikke noengang, så godt jeg kan huske, har skrudd fra hverandre noe som jeg ikke har klart å sette sammen igjen.</p>
<p><strong>Tar du deg tid til å finne patenten? Tør du å bli skitten til albuene? Kjøper du Plumbo eller ny rist til dusjen?</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/2010/04/06/plumbo-og-sant/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Om arkitektur</title>
		<link>http://open.bekk.no/2010/04/06/om-arkitektur/</link>
		<comments>http://open.bekk.no/2010/04/06/om-arkitektur/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 11:05:58 +0000</pubDate>
		<dc:creator>Vidar Kongsli</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Systemarkitektur]]></category>
		<category><![CDATA[arkitektur]]></category>
		<category><![CDATA[metode]]></category>
		<category><![CDATA[programvareutvikling]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=2576</guid>
		<description><![CDATA[Innen IT-bransjen finner man &#8220;arkitektur&#8221; overalt. Vi har  systemarkitektur, databasearkitektur, data-arkitektur,  løsningsarkitektur, sikkerhetsarkitektur, integrasjonsarkitektur, og vi  har 3-lagsarkitekturer. Beveger man seg på spesifikke plattformer har  man J2EE-arkitektur og .NET-arkitektur. Nå om dagen sliter bransjen  (skal vi tro tidsånden) med monolittiske arkitekturer, og løsningen er  en tjenestebasert arkitektur. Betimelige spørsmål [...]]]></description>
			<content:encoded><![CDATA[<p>Innen IT-bransjen finner man &#8220;arkitektur&#8221; overalt. Vi har  systemarkitektur, databasearkitektur, data-arkitektur,  løsningsarkitektur, sikkerhetsarkitektur, integrasjonsarkitektur, og vi  har 3-lagsarkitekturer. Beveger man seg på spesifikke plattformer har  man J2EE-arkitektur og .NET-arkitektur. Nå om dagen sliter bransjen  (skal vi tro tidsånden) med monolittiske arkitekturer, og løsningen er  en tjenestebasert arkitektur. Betimelige spørsmål er hva arkitektur  egentlig er, hva kjennetegner god arkitektur og hvordan oppnår man den?</p>
<h3>Arkitektur  fokuserer på helheten</h3>
<p>Selv om man skal være forsiktig med å trekke  paralleller mellom arkitektur i IT-verdenen og den klassiske betydningen  av arkitektur, er det interessant å studere etymologien for å få en  forståelse av hva ordet har blitt brukt til og hva det har representert  tidligere. Ordet arkitektur stammer fra gresk &#8220;arkitekton&#8221; (via latin  &#8220;architechtura&#8221;) og er sammensatt av de to ordene &#8220;ὰρχι&#8221; (hoved- eller  sjef-) og &#8220;Τεκτονική&#8221; (håndtverker, bygger). En arkitekt er altså en  &#8220;sjefsbygger&#8221;.</p>
<p>Om arkitektur står det også å lese at den ble ofte  kalt <em>moderkunsten</em> fordi den fokuserte på <em>helheten</em> (kilde:  <a href="http://www.kunsthistorie.com/">kunsthistorie.com</a>). Dette er noe vi kan kjenne igjen daglig bruk av  arkitektur i vår bransje. Arkitektur handler om helheten, de store  linjene. Man kan snakke om &#8220;overliggende arkitektur&#8221;, selv om det  muligens er smør på flesk, men det gir ikke noen mening å snakke om  &#8220;detaljert arkitektur&#8221;. Man kan derimot snakke om &#8220;detaljert design&#8221;;  til forskjell fra arkitektur er design noe som kan gjelde ulike  granularitetsnivåer. Forskjellen mellom arkitektur og design er at  arkitektur fokuserer på helheten og et systems eksternt synlige,  ikke-funksjonelle kvaliteter, mens design gjerne kan omhandle interne  kvaliteter. Eksempelvis er intern kodeorganisering som noe som omhandler  design, men ikke arkitektur. Derimot er valg av plattform, f.eks. J2EE  eller .NET, noe som anligger arkitektur i og med at det sannsynligvis er  et valg som har noe å si for eksterne egenskaper. Dette er forøvrig  også en del av designet, og derav følger at arkitektur er en delmengde  av design.</p>
<h3>Den klassiske arkitekturen &#8211; <em>firmitatis utilitatis  venustatis</em></h3>
<p>I min noe vilkårlige og overfladiske omgang med  klassiske verker er jeg funnet &#8220;De architectura&#8221; (&#8220;Om arkitektur&#8221;) av  <a title="Link to page on Vitruvius on Wikipedia" href="http://en.wikipedia.org/wiki/Vitruvius">Vitruvius</a>. &#8220;De architectura&#8221; er antikkens mest kjente referanse for  definisjon av arkitektur. Den er inndelt i ti seksjoner og omhandler alt  fra byplanlegging, materialkunnskap og vanntilførsel til bruk av  maskiner. Vitruvius mener at en god bygning må etterleve de tre  prinsippene <em>firmitatis utilitatis venustatis</em> som kan oversettes  (av meg, <a href="http://penelope.uchicago.edu/Thayer/E/Roman/Texts/Vitruvius/home.html">via engelsk</a>) som:</p>
<ul>
<li>Styrke (eller robusthet) &#8211; den  skal være bygd på et solid fundament og bygd av nøye utvalgte materialer</li>
<li>Funksjonalitet  (eller brukbarhet) &#8211; gjennom en fornuftig sammensetning av dens deler  slik at delene kommer til sin rett</li>
<li>Skjønnhet &#8211; den skal ha  et fint utseende og fremstå som en helhet der alle delene er  proporsjonert i forhold til hverandre</li>
</ul>
<p>Er dette  prinsipper som også gir mening i vår bransje? Som jeg nevnte  innledningsvis, er det lett å gå seg vill i alle arkitekturbegrepene.  Fra nå av omtaler jeg &#8220;arkitektur innen informasjonsteknologi&#8221; kort og  godt som &#8220;arkitektur&#8221;, og når jeg omtaler arkitektur i klassisk forstand  som &#8220;bygningsarkitektur&#8221; eller &#8220;klassisk arkitektur&#8221;.</p>
<h3>Klassiske  prinsipper anvendt i vår hverdag</h3>
<h4>Styrke (eller robusthet)</h4>
<p>For  en bygning er det lett å være enig i at den må ha et tilstrekkelig  solid fundament og at den må være bygd av egnede materialer. For et  IT-system er ikke dette like intuitivt. Når det gjelder programvare  (&#8220;mykvare&#8221;) skal denne være myk og formelig for å kunne imøtekomme  fremtidige krav som oppstår gjennom systemets livssyklus. I motsetning  til styrke i form av fasthet eller ubevegelighet, er <span>&#8220;endringsvennlighet&#8221; (eng.  &#8220;changeability&#8221;)</span> en kvalitet som vi ønsker i arkitekturen  vår. Samtidig er det sjelden mulig å ha en arkitektur som er åpen for  alle mulige endringer, noen fundamenter må være fastere enn andre.  Utfordringen består i å forutse hvilke endringer som er sannsynlig kommer  og hvilke som er usannsynlige. Klarer man det, kan man sørge for at  designvalg ikke påvirker endringsvennligheten i negativ retning.  Man  kan muligens også snakke om at en arkitektur er &#8220;robust og slitesterk&#8221; i  den forstand at den skal kunne imøtekomme nye bruksmønster og at den  skal være skalerbar og anvendbar i ulike situasjoner. Jeg tør også påstå  at jo lavere kompleksitet arkitekturen har, jo større er  sannsynligheten for at den blir anvendbar i fremtiden.</p>
<h4>Funksjonalitet  (eller brukbarhet)</h4>
<p>Prinsippet <em>utilitatis</em> er noe som i mine  øyne er direkte overførbart til vår bransje. &#8220;Nytteverdi&#8221; er muligens et  enda bedre ord for denne egenskapen. Høy nytteverdi oppnås ved at  systemets ulike deler spiller sammen slik at hver enkelt del er  formålstjenlig og virker sammen i en helhet. Ikke vanskelig å være enig i  dette, utfordringen man har som arkitekt er ofte å sørge for et riktig  utvalg av komponenter og integrere disse slik at de spiller godt sammen.</p>
<h4>Skjønnhet</h4>
<p>Skal  vi anvende prinsippet om <em>venustatis</em> i vår hverdag, må vi kanskje  ha et litt videre perspektiv en visuell skjønnhet. (Uten at jeg skal  påstå at Vitruvius kun refererte til visuell skjønnhet.) Er skjønnhet  noe som vi arkitekter vanligvis fokuserer på?  Burde vi? Og hva er  &#8220;skjønnhet&#8221; i en arkitektur? I &#8220;<a href="http://www.python.org/dev/peps/pep-0020/">Zen of Python</a>&#8220;, som omhandler  designprinsipper for programmeringsspråket Python, sier Tim Peters at  &#8220;beautiful is better than ugly&#8221;. Dette hjelper oss kanskje ikke så mye  nærmere svaret. La oss heller snu om på det og si at skjønnhet er det  som behager og gleder folk, hva nå enn det er. Og hvem er folk? Jo, det  er sluttbrukere, arkitekter, driftspersonell og utviklere (blant andre).  &#8220;Vakker i sin enkelhet&#8221;, sier man ofte, og i mine øyne er enkelhet  viktig i en arkitektur. Er arkitekturen enkel og lett å forstå, så er  den &#8220;vakker i sin enkelhet&#8221;.</p>
<p>Som vi ser er de klassiske  prinsippene for arkitektur absolutt anvendbare på informasjonsteknologi,  og jeg tør påstå at de også gir verdi gjennom å hjelpe til gi innsikt i  hva man bør vektlegge.</p>
<h3>Moderne prinsipper for arkitektur</h3>
<p>Hvis  vi så forlater antikken og stiger inn i nåtiden så finnes det andre  oppfatninger om hva arkitektur omhandler. Her er en liste fra &#8220;<a href="http://oreilly.com/catalog/9780596517984">Beautiful  architecture</a>&#8221;  som jeg syns er nyttig:</p>
<ul>
<li>Funksjonalitet &#8211; hvilken  funksjonalitet som systemet tilbyr brukerne</li>
<li>Endringsvennlighet &#8211;  hvilke endringer kommer til måtte gjøres i fremtiden, og hvilke  endringer er ikke sannsynlige?</li>
<li>Ytelse &#8211; hva vil systemets ytelse  være?</li>
<li>Kapasitet &#8211; Hvor mange samtidige brukere skal systemet  betjene? Hvor store datamengder skal det behandle?</li>
<li>Økosystem &#8211;  hvordan vil systemet samhandle med andre systemer i økosystemet det skal  produksjonssettes i?</li>
<li>Modularitet &#8211; hvordan deler man opp jobben  med å utvikle systemet og i særdeleshet; hvordan kan systemet  modulariseres slik at modulene kan utvikles uavhengig av hverandre og  samtidig imøtekomme hverandres krav presist og enkelt?</li>
<li>Byggbarhet  &#8211; Kan systemet bygges som et sett av komponenter som kan implementeres  og verifiseres uavhengig av hverandre? Hvilke komponenter burde  gjenbrukes fra andre produkter og hvilke burde anskaffes fra eksterne  tilbydere?</li>
<li>Produktifisering &#8211; hvis systemet skal eksistere i  ulike versjoner, hvordan kan det utvikles som en produktlinje?</li>
<li>Sikkerhet  &#8211; Hvordan kan informasjonssikkerheten ivaretas?</li>
</ul>
<p>Denne  listen inneholder en del fellespunkter med de vi fant hos Vitruvius. I  tillegg tilføyer den en del punkter som er spesifikke for  informasjonsteknologi. Jeg syns dette er en nyttig liste; den har et  passe detaljnivå og er ikke for lang.</p>
<h3>Oppsummering</h3>
<p>Arkitektur  omhandler helheten i et system, til forskjell fra design. Arkitektur  adresserer eksterne kvaliteter, på ulike nivåer. Arkitektur innen  informasjonsteknologi og klassisk arkitektur har noen felles prinsipper  som bør vektlegges. I tillegg til dette har arkitektur innen  informasjonsteknologi noen prinsipper som er spesifikke for fagområdet.</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/2010/04/06/om-arkitektur/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Avoid fragile webtests by using PageObjects</title>
		<link>http://open.bekk.no/2010/03/25/avoid-fragile-webtests-by-using-pageobjects/</link>
		<comments>http://open.bekk.no/2010/03/25/avoid-fragile-webtests-by-using-pageobjects/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 21:37:48 +0000</pubDate>
		<dc:creator>Vegard Hartmann</dc:creator>
				<category><![CDATA[BEKK]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=2546</guid>
		<description><![CDATA[If you have tried webtesting over some period of time, chances are that you have experienced the fragile nature of webtests. The reason for this fragiltiy is that if there is one part of an application that is bound to change frequently, it is the user interface. So what might be done about the fragile [...]]]></description>
			<content:encoded><![CDATA[<p>If you have tried webtesting over some period of time, chances are that you have experienced the fragile nature of webtests. The reason for this fragiltiy is that if there is one part of an application that is bound to change frequently, it is the user interface. So what might be done about the fragile nature of webtests caused by frequent changes to the user inteface?</p>
<h2>Use abstraction to reduce the impact of change</h2>
<p>If a part of your system is prone to changes you need to isolate that part of the system to reduce the impact of change. This is usually done using some sort of abstraction. An example of this is the use of interfaces in order to be able to change the implementing classes of some exposed functionality without breaking the parts of the system that depend on this exposed functionality. The same way of thinking may be used to make your webtests less fragile. The key to this is to see your web pages as exposing functionality. The search page of google does for example expose the functionality of searching for a term or phrase.</p>
<h2>Introducing Page Objects</h2>
<p>The functionality of a page can be exposed to your tests using an object, a <a href="http://code.google.com/p/selenium/wiki/PageObjects">Page Object</a>, that your tests interact with rather than the actual web page itself. The Page Object is like an interface to your web page. It exposes the functionality on the page while at the same time hiding the implementation details. This means that a test that exercises the search functionality does not know anything about the details required in order to search for something, that is that you need to locate an html element with id &#8220;q&#8221;, enter text into this, and then press a button with the text &#8220;Google Search&#8221;. Your tests only know that the page exposes functionality for searching after a phrase.<br />
<div id="attachment_2560" class="wp-caption aligncenter" style="width: 610px"><a href="http://open.bekk.no/wp-content/uploads/2010/03/googlesearch_pageobjects2.png"><img src="http://open.bekk.no/wp-content/uploads/2010/03/googlesearch_pageobjects2-1024x228.png" alt="" title="googlesearch_pageobjects" width="600" height="130" class="size-large wp-image-2560" /></a><p class="wp-caption-text">Abstracting google search functionality using a page object</p></div></p>
<p>So how does this look like in real life? Imagine the following test scenario:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Given that I am on the google search page
When searching for the phrase &quot;webdriver&quot;
Then a link to the project's home page should be present in the search results</pre></div></div>

<p>The test written in JUnit for this scenario using page objects could look like the following</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@Test
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> whenSearchingForWebDriverUrlShouldBePresentInSearchResults<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	SearchPage searchPage <span style="color: #339933;">=</span> createSearchPage<span style="color: #009900;">&#40;</span>driver<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	SearchResultPage resultPage <span style="color: #339933;">=</span> searchPage.<span style="color: #006633;">searchFor</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;webdriver&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	assertTrue<span style="color: #009900;">&#40;</span>resultPage.<span style="color: #006633;">isLinkPresentInResults</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;http://code.google.com/p/selenium/&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>This test contains only three lines and is easily readable. A test exercising the same functionality but without using page objects is given below:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@Test
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> whenSearchingForWebDriverUrlShouldBePresentInSearchResults<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	WebDriver webDriver <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> FirefoxDriver<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	webDriver.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;http://www.google.com/&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	WebElement searchField <span style="color: #339933;">=</span> webDriver.<span style="color: #006633;">findElement</span><span style="color: #009900;">&#40;</span>By.<span style="color: #006633;">name</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;q&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	searchField.<span style="color: #006633;">sendKeys</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;webdriver&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	searchField.<span style="color: #006633;">submit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	assertNotNull<span style="color: #009900;">&#40;</span>webDriver.<span style="color: #006633;">findElement</span><span style="color: #009900;">&#40;</span>By.<span style="color: #006633;">xpath</span><span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">&quot;//a[@href='http://code.google.com/p/selenium/']&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	webDriver.<span style="color: #006633;">quit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Notice that the test using page objects is much more readable than the one without, and it is easy to capture the essence of the test scenario. Furthermore, imagine having 50 tests that all test various aspects of the search functionality. If the name of the search field changes to &#8220;x&#8221; all of your tests will break. In order to get them running again you would have to go through each test replacing &#8220;q&#8221; with &#8220;x&#8221;. Now, if you used page objects, all your tests would still break, but you would only have to make a change on place, in your page object, instead of all 50 tests.</p>
<h2>Key features of Page Objects</h2>
<p>The key features of page objects can be summarized as follows:</p>
<h3>Methods represent services</h3>
<p>The methods represent functionality exposed to the user on the page, such as searchForPhrase(&#8220;phrase&#8221;).</p>
<h3>Hide implementation details</h3>
<p>They do not reveal how the functionality is implemented, for example how you locate the search field or the button needed to be pushed in order to perform the search.</p>
<h3>Do not make assumptions</h3>
<p>Methods on a Page Object are neutral in the sense that they do not state whether something should be true or not. It is up to the users of the Page Object to make assumptions. The Page Objects only provide the ability to make assumptions, such as isLinkPresentInResults(&#8220;link&#8221;).</p>
<h3>Methods return other page objects</h3>
<p>This causes the Page Objects to reveal the flow through the application. </p>
<h3>Different outcomes are modelled as separate methods</h3>
<p>Because the flow of the application is revealed, different paths through the application must be modeled separately. When logging in to an application you would for example expect to be sent to different pages depending on whether you provided valid login credentials or not.</p>
<h3>Need not represent an entire page</h3>
<p>A Page Object may only represent part of a page, such as a login panel on a portal application that provides personalization.</p>
<h2>Succeeding with Webtesting</h2>
<p>There are of course other challenges of webtests and this is not the full story of how to succeed with webtesting. For more about the full story have a look at the slides from my presentation <a href='http://open.bekk.no/wp-content/uploads/2010/03/succeeding-with-webtesting-using-webdriver.pdf'>Succeeding with webtesting using webdriver</a> at <a href="http://free-test.org/">Free-Test 2010</a></p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/2010/03/25/avoid-fragile-webtests-by-using-pageobjects/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
