<?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/"
	xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule">

<channel>
	<title>Thinking Inside a Bigger Box &#187; Norsk</title>
	<atom:link href="http://johannesbrodwall.com/category/norsk/feed/" rel="self" type="application/rss+xml" />
	<link>http://johannesbrodwall.com</link>
	<description>Johannes Brodwall&#039;s Musings on Software Architecture and Programming</description>
	<lastBuildDate>Mon, 03 May 2010 20:24:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<creativeCommons:license>http://creativecommons.org/licenses/by/3.0/</creativeCommons:license>		<item>
		<title>Å trene på Java EE</title>
		<link>http://johannesbrodwall.com/2009/12/02/trene-pa-java-ee/</link>
		<comments>http://johannesbrodwall.com/2009/12/02/trene-pa-java-ee/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 19:25:52 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Norsk]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=489</guid>
		<description><![CDATA[For å bli bedre må man trene. For å bli bedre med avanserte ting, må man forstå de grunnleggende tingene bra. For å vite hvorfor man bruker avanserte verktøy, må man prøve å jobbe uten dem. Derfor har jeg de siste ukene trent mange ganger på å lage en veldig enkel webapplikasjon i Java. For hele applikasjonen har jeg startet med å skrive testene før koden som implementerer funksjonaliteten.

Dersom du vil prøve deg på samme øvelse, inneholder denne artikkelen litt informasjon for å komme i gang. Start med koden under og <em>følg feilmeldingene.</em> Send en kommentar dersom du ikke kommer videre fra en feilmelding, så får vi en FAQ.

<h3>Oppgaven</h3>

Løs et så enkelt som mulig problem som involverer websider og database med så enkel teknologi om mulig.

Oppgaven jeg har laget går ut på å <em>opprette personer med fullt navn og søke etter personer basert på navnet deres</em>. For å gjøre oppgaven så lite som mulig har jeg valgt å la personer kun ha ett informasjonsfelt: Fullt navn. Denne oppgaven tar cirka 2-3 timer uten øvelse og du kan få den ned i 60-90 minutter med trening.

Du kan naturligvis velge en annen oppgave, men uansett hva du velger: Det er mer lærerikt å gjenta den samme oppgaven flere ganger enn å utføre en avansert oppgave.

Når jeg utfører oppgaven er det viktigste jeg lærer meg å forstå feilmeldingene som guider meg gjennom utviklingen. Dersom du trenger hjelp til å komme til de første feilmeldingene kan du se resten av artikkelen.
]]></description>
			<content:encoded><![CDATA[<p>For å bli bedre må man trene. For å bli bedre med avanserte ting, må man forstå de grunnleggende tingene bra. For å vite hvorfor man bruker avanserte verktøy, må man prøve å jobbe uten dem. Derfor har jeg de siste ukene trent mange ganger på å lage en veldig enkel webapplikasjon i Java. For hele applikasjonen har jeg startet med å skrive testene før koden som implementerer funksjonaliteten.</p>
<p>Dersom du vil prøve deg på samme øvelse, inneholder denne artikkelen litt informasjon for å komme i gang. Start med koden under og <em>følg feilmeldingene.</em> Send en kommentar dersom du ikke kommer videre fra en feilmelding, så får vi en FAQ.</p>
<h3>Oppgaven</h3>
<p>Løs et så enkelt som mulig problem som involverer websider og database med så enkel teknologi om mulig.</p>
<p>Oppgaven jeg har laget går ut på å <em>opprette personer med fullt navn og søke etter personer basert på navnet deres</em>. For å gjøre oppgaven så lite som mulig har jeg valgt å la personer kun ha ett informasjonsfelt: Fullt navn. Denne oppgaven tar cirka 2-3 timer uten øvelse og du kan få den ned i 60-90 minutter med trening.</p>
<p>Du kan naturligvis velge en annen oppgave, men uansett hva du velger: Det er mer lærerikt å gjenta den samme oppgaven flere ganger enn å utføre en avansert oppgave.</p>
<p>Når jeg utfører oppgaven er det viktigste jeg lærer meg å forstå feilmeldingene som guider meg gjennom utviklingen. Dersom du trenger hjelp til å komme til de første feilmeldingene kan du se resten av artikkelen.</p>
<p><!-- more --></p>
<h3>Steg for steg: Startpunktet</h3>
<p>Selv om jeg valgte veldig enkel teknologi for implementasjonen, har jeg valgt et større sett med biblioteker for å skrive testene. Jeg bruker følgende når jeg skriver testene:</p>
<ul>
<li>JUnit 4.6</li>
<li>Jetty 6.1.22</li>
<li>HSqlDb 1.8.0.10</li>
<li>WebDriver-HtmlUnit 0.6.1039</li>
<li>Mockito 1.8.0</li>
<li>FEST-assert 1.2 (ikke påkrevd, men gjør testene søtere)</li>
</ul>
<p>Den eneste teknologien jeg har valgt for implementasjonen er Servlet-API 2.5 og Hibernate-Annotations 3.4.0.GA.</p>
<p>For at du skal slippe å plundre så mye med avhengigheter før du kommer i gang har jeg laget en <a href="http://svn.brodwall.com/demo/java-ee-spike-kata/pom.xml">pom.xml</a>-fil som du kan ta utgangspunkt i.</p>
<h3>Web-tester</h3>
<p>For å starte utviklingen, er det lurt med en test som starter på utsiden av applikasjonen. Noe slikt:</p>
<ol>
<li>Start opp miljøet</li>
<li>Legg inn en person</li>
<li>Søk etter personen</li>
</ol>
<p>Slik kommer du i gang med en test som går mot en web applikasjon:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">int</span> SERVER_PICKS_PORT <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
org.<span style="color: #006633;">mortbay</span>.<span style="color: #006633;">jetty</span>.<span style="color: #006633;">Server</span> server <span style="color: #339933;">=</span> 
       <span style="color: #000000; font-weight: bold;">new</span> org.<span style="color: #006633;">mortbay</span>.<span style="color: #006633;">jetty</span>.<span style="color: #006633;">Server</span><span style="color: #009900;">&#40;</span>SERVER_PICKS_PORT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
server.<span style="color: #006633;">addHandler</span><span style="color: #009900;">&#40;</span>
       <span style="color: #000000; font-weight: bold;">new</span> org.<span style="color: #006633;">mortbay</span>.<span style="color: #006633;">jetty</span>.<span style="color: #006633;">webapp</span>.<span style="color: #006633;">WebAppContext</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;src/main/webapp&quot;</span>, <span style="color: #0000ff;">&quot;/&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
server.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">int</span> serverPort <span style="color: #339933;">=</span> server.<span style="color: #006633;">getConnectors</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #006633;">getLocalPort</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
org.<span style="color: #006633;">openqa</span>.<span style="color: #006633;">selenium</span>.<span style="color: #006633;">WebDriver</span> browser <span style="color: #339933;">=</span>
       <span style="color: #000000; font-weight: bold;">new</span> org.<span style="color: #006633;">openqa</span>.<span style="color: #006633;">selenium</span>.<span style="color: #006633;">htmlunit</span>.<span style="color: #006633;">HtmlUnitDriver</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
browser.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;http://localhost:&quot;</span> <span style="color: #339933;">+</span> serverPort <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;/&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
browser.<span style="color: #006633;">findElement</span><span style="color: #009900;">&#40;</span>By.<span style="color: #006633;">linkText</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Create person&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Dette oppsettet forventer å finne <code>web.xml</code>-fila på <code>src/main/webapp/WEB-INF/web.xml</code>.</p>
<h3>Funksjonell test</h3>
<p>En funksjonell test definerer <em>kravene</em> i applikasjonen. Det er lurt å gjøre funksjonelle tester så raske som overhode mulig, samtidig som de går gjennom alle kravene. En funksjonell test trenger ikke være en ende-til-ende test, slik som eksempelet over. Dette er viktig, fordi ende-til-ende tester er ofte veldig trege. Her er noen eksempler på funksjonelle tester:</p>
<ul>
<li>Vis en siden for å opprette nye personer</li>
<li>Opprett en ny person</li>
<li>Verifiser at personens navn er oppgitt og ikke inneholder ulovlige tegn</li>
<li>Vis en side for å søke etter personer</li>
<li>Vis alle personer dersom søkestreng ikke er angitt</li>
<li>Søk etter angitt søkestreng</li>
</ul>
<p>En funksjonell test kan se slik ut:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">PersonServlet servlet <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> PersonServlet<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
HttpServletRequest req <span style="color: #339933;">=</span>
    org.<span style="color: #006633;">mockito</span>.<span style="color: #006633;">Mockito</span>.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>HttpServletRequest.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
HttpServletResponse resp <span style="color: #339933;">=</span>
    org.<span style="color: #006633;">mockito</span>.<span style="color: #006633;">Mockito</span>.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>HttpServletResponse.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
PersonDao personDao <span style="color: #339933;">=</span>
    org.<span style="color: #006633;">mockito</span>.<span style="color: #006633;">Mockito</span>.<span style="color: #006633;">mock</span><span style="color: #009900;">&#40;</span>PersonDao.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
servlet.<span style="color: #006633;">setPersonDao</span><span style="color: #009900;">&#40;</span>personDao<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
org.<span style="color: #006633;">mockito</span>.<span style="color: #006633;">Mockito</span>.<span style="color: #006633;">when</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getMethod</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">thenReturn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;POST&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
org.<span style="color: #006633;">mockito</span>.<span style="color: #006633;">Mockito</span>.<span style="color: #006633;">when</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getPathInfo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">thenReturn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/create.html&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
org.<span style="color: #006633;">mockito</span>.<span style="color: #006633;">Mockito</span>.<span style="color: #006633;">when</span><span style="color: #009900;">&#40;</span>req.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;full_name&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">thenReturn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Johannes Brodwall&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003399;">StringWriter</span> pageSource <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">StringWriter</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
org.<span style="color: #006633;">mockito</span>.<span style="color: #006633;">Mockito</span>.<span style="color: #006633;">when</span><span style="color: #009900;">&#40;</span>resp.<span style="color: #006633;">getWriter</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">thenReturn</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">PrintWriter</span><span style="color: #009900;">&#40;</span>pageSource<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
servlet.<span style="color: #006633;">service</span><span style="color: #009900;">&#40;</span>req, resp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
org.<span style="color: #006633;">mockito</span>.<span style="color: #006633;">Mockito</span>.<span style="color: #006633;">verify</span><span style="color: #009900;">&#40;</span>personDao<span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">create</span><span style="color: #009900;">&#40;</span>Person.<span style="color: #006633;">byName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Johannes Brodwall&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
org.<span style="color: #006633;">fest</span>.<span style="color: #006633;">assertions</span>.<span style="color: #006633;">Assertions</span>.<span style="color: #006633;">assertThat</span><span style="color: #009900;">&#40;</span>pageSource.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">contains</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Personen er opprettet&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>Data-aksess-test</h3>
<p>Hibernate forenkler databasebruken mye. Men Hibernate er selv komplekst og når man bruker det på mer avanserte måter fortjener det egne tester. En typisk test med Hibernate kan være:</p>
<ol>
<li>Legg i tre personer i database</li>
<li>Søk etter en del av navnet på en av dem</li>
<li>Sjekk at du får tilbake akkurat den du forventet</li>
</ol>
<p>Når jeg starter med Hibernate, lager jeg en test som dette, og følger feilmeldingene. Pass på å både følge feilmeldinger i loggen og stack tracer.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">AnnotationConfiguration conf <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> AnnotationConfiguration<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">setProperty</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Environment</span>.<span style="color: #003399;">URL</span>, <span style="color: #0000ff;">&quot;jdbc:hsqldb:mem:persondaotest&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
PersonDao dao <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> HibernatePersonDao<span style="color: #009900;">&#40;</span>conf.<span style="color: #006633;">buildSessionFactory</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
dao.<span style="color: #006633;">create</span><span style="color: #009900;">&#40;</span>Person.<span style="color: #006633;">withName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;foo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
org.<span style="color: #006633;">fest</span>.<span style="color: #006633;">assertions</span>.<span style="color: #006633;">Assertions</span>.<span style="color: #006633;">assertThat</span><span style="color: #009900;">&#40;</span>dao.<span style="color: #006633;">find</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #006633;">containsExactly</span><span style="color: #009900;">&#40;</span>Person.<span style="color: #006633;">withName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;foo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Følg feilmeldingene herfra.</p>
<h3>Integrasjon</h3>
<p>En veldig vanlig måte for web serveren å overlevere spesielt ting som DataSources til applikasjonen er via JNDI. I Jetty kan du gjøre dette i Web-testen på følgende måte:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">org.<span style="color: #006633;">hsqldb</span>.<span style="color: #006633;">jdbc</span>.<span style="color: #006633;">jdbcDataSource</span> ds <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> org.<span style="color: #006633;">hsqldb</span>.<span style="color: #006633;">jdbc</span>.<span style="color: #006633;">jdbcDataSource</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
ds.<span style="color: #006633;">setDatabase</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;jdbc:hsqldb:mem:personwebtest&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
ds.<span style="color: #006633;">setUser</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;sa&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">new</span> org.<span style="color: #006633;">mortbay</span>.<span style="color: #006633;">jetty</span>.<span style="color: #006633;">plus</span>.<span style="color: #006633;">naming</span>.<span style="color: #006633;">Resource</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;jdbc/primaryDs&quot;</span>, ds<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Oppstart av Jetty som vist over</span></pre></div></div>

<h3>Konklusjon</h3>
<p>Å gjøre en liten øvelse som dette er en god måte å bli bevisst hvilke vaner du har og hvor lang tid det egentlig tar for deg å gjøre oppgavene dine. Du vil oppleve at det å skrive tester før koden føles som om det går saktere enn du tror du er vant til.</p>
<p>Men dersom du er som meg, vil du også oppleve noe annet: Når du tester ut applikasjonen første gang (du kan gjøre dette med Jetty, naturligvis) så er sjansene gode for at den vil være nokså feilfri og at debugging i stor grad er overflødig. Jeg vet ikke med deg, men debugging er en aktivitet jeg gjerne blir kvitt.</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2009/12/02/trene-pa-java-ee/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Tips for databasemigreringer</title>
		<link>http://johannesbrodwall.com/2009/11/24/tips-for-databasemigreringer/</link>
		<comments>http://johannesbrodwall.com/2009/11/24/tips-for-databasemigreringer/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 18:10:42 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Norsk]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=486</guid>
		<description><![CDATA[En kollega spurte i dag om mine topp tips når det gjelder databaserefactorings. Her er mitt svar:

<ol>
  <li>Ha en organisert struktur med at man gjennomfører navngitte migreringer (a la <a href="http://api.rubyonrails.org/classes/ActiveRecord/Migration.html">Ruby-on-Rails sine migrations</a> eller <a href="http://dbdeploy.com/">dbdeploy</a>). Typisk er det vanlig og velfungerende å navngi scripts med løpenummer (001, 002, ...) eller timestamp (20091124071300, ...) og ha en tabell i databasen som holder styr på hva som har blitt kjørt</li>
  <li>Bruk views og materialiserte views for å støtte tilbakekompabilitet (NB: Oracle er veldig sterk på dette, andre databaser kan slite)</li>
  <li>Om mulig, gjør hver migrering bakoverkompatibel på en versjon av programvaren. Dette er lettere å få til jo hyppigere du releaser programvaren</li>
  <li>Skill endringer i skjema (for eksempel: legg på en kolonne) fra migrering av data (for eksempel: populere kolonnen). Feilene vil typisk ligge i #2 av disse, og den er lett å gjøre transaksjonell, mens skjemaendringer ikke er transaksjonelle i de fleste baser.</li>
</ol>

Har jeg dekket det viktigste da?]]></description>
			<content:encoded><![CDATA[<p>En kollega spurte i dag om mine topp tips når det gjelder databaserefactorings. Her var mitt svar:</p>
<ol>
<li>Ha en organisert struktur med at man gjennomfører navngitte migreringer (a la <a href="http://api.rubyonrails.org/classes/ActiveRecord/Migration.html">Ruby-on-Rails sine migrations</a> eller <a href="http://dbdeploy.com/">dbdeploy</a>). Typisk er det vanlig og velfungerende å navngi scripts med løpenummer (001, 002, &#8230;) eller timestamp (20091124071300, &#8230;) og ha en tabell i databasen som holder styr på hva som har blitt kjørt</li>
<li>Bruk views og materialiserte views for å støtte tilbakekompabilitet (NB: Oracle er veldig sterk på dette, andre databaser kan slite)</li>
<li>Om mulig, gjør hver migrering bakoverkompatibel på en versjon av programvaren. Dette er lettere å få til jo hyppigere du releaser programvaren</li>
<li>Skill endringer i skjema (for eksempel: legg på en kolonne) fra migrering av data (for eksempel: populere kolonnen). Feilene vil typisk ligge i #2 av disse, og den er lett å gjøre transaksjonell, mens skjemaendringer ikke er transaksjonelle i de fleste baser.</li>
</ol>
<p>Har jeg dekket det viktigste da?</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2009/11/24/tips-for-databasemigreringer/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Lær Scrum på 3 minutter</title>
		<link>http://johannesbrodwall.com/2009/09/07/l%c3%a6r-scrum-pa-3-minutter/</link>
		<comments>http://johannesbrodwall.com/2009/09/07/l%c3%a6r-scrum-pa-3-minutter/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 20:31:05 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Non-technical]]></category>
		<category><![CDATA[Norsk]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=453</guid>
		<description><![CDATA[<blockquote><em>This Norwegian language article introduces a short two-page guide I've written to explain Scrum to people who've only just heard of it.</em></blockquote>

I samarbeid med våre dyktige redaksjonelle medarbeidere på Steria, har jeg forfattet en "3 minutters guide" til Scrum. Denne tar for seg spørsmålene som "hva er egentlig Scrum".

[caption id="" align="alignnone" width="360" caption="Dette er Scrum"]<a href="http://steria.no/gloria/id/11004571/subid/0"><img alt="Hva er egentlig Scrum" src="http://steria.no/image/4954/1/4954_1.jpg" title="Hva er egentlig Scrum" width="360" height="152" /></a>[/caption]
  
3-minutterguidene kan lastes ned fra <a href="http://steria.no/gloria/id/11004571/subid/0">Sterias hjemmesider</a>.
  
Jeg planlegger å følge opp denne guiden med en guide som beskriver hva som skal til for å faktisk lykkes med Scrum. Har du noen ideer?]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>This Norwegian language article introduces a short two-page guide I&#8217;ve written to explain Scrum to people who&#8217;ve only just heard of it.</em></p></blockquote>
<p>I samarbeid med våre dyktige redaksjonelle medarbeidere på Steria, har jeg forfattet en &#8220;3 minutters guide&#8221; til Scrum. Denne tar for seg spørsmålene som &#8220;hva er egentlig Scrum&#8221;.</p>
<div class="wp-caption alignnone" style="width: 370px"><a href="http://steria.no/gloria/id/11004571/subid/0"><img alt="Hva er egentlig Scrum" src="http://steria.no/image/4954/1/4954_1.jpg" title="Hva er egentlig Scrum" width="360" height="152" /></a><p class="wp-caption-text">Dette er Scrum</p></div>
<p>3-minutterguidene kan lastes ned fra <a href="http://steria.no/gloria/id/11004571/subid/0">Sterias hjemmesider</a>.</p>
<p>Jeg planlegger å følge opp denne guiden med en guide som beskriver hva som skal til for å faktisk lykkes med Scrum. Har du noen ideer?</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2009/09/07/l%c3%a6r-scrum-pa-3-minutter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>En lynrask innføring i Scrum</title>
		<link>http://johannesbrodwall.com/2009/07/30/en-lynrask-innf%c3%b8ring-i-scrum/</link>
		<comments>http://johannesbrodwall.com/2009/07/30/en-lynrask-innf%c3%b8ring-i-scrum/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 09:33:09 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Non-technical]]></category>
		<category><![CDATA[Norsk]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://johannesbrodwall.com/?p=411</guid>
		<description><![CDATA[<blockquote>This Norwegian language post talks a little about a quick intro to Scrum that I wrote for my employer</blockquote>

Jeg har forfattet en "3-minutters guide" til Scrum. Dette er en to siders lettlest artikkel som publiserer via min arbeidsgiver Steria. Denne har som mål å være tilgjengelig både for tekniske og ikke-tekniske prosjektdeltagere som gjerne vil forstå litt mer om hva Scrum dreier seg om.

Du finner artikkelen på <a href="http://steria.no/gloria/id/11004571/subid/0">Sterias arkiv over 3-minuttersguider</a>. Du kan <a href="mailto:johannes@brodwall.com">ta kontakt</a> dersom du ønsker et eller flere eksemplarer av guiden trykket på solid papir.

Jeg regner med å lage flere iterasjoner av denne guiden, så tips om forbedringer mottas med takk.]]></description>
			<content:encoded><![CDATA[<blockquote><p>This Norwegian language post talks a little about a quick intro to Scrum that I wrote for my employer</p></blockquote>
<p>Jeg har forfattet en &#8220;3-minutters guide&#8221; til Scrum. Dette er en to siders lettlest artikkel som publiserer via min arbeidsgiver Steria. Denne har som mål å være tilgjengelig både for tekniske og ikke-tekniske prosjektdeltagere som gjerne vil forstå litt mer om hva Scrum dreier seg om.</p>
<p>Du finner artikkelen på <a href="http://steria.no/gloria/id/11004571/subid/0">Sterias arkiv over 3-minuttersguider</a>. Du kan <a href="mailto:johannes@brodwall.com">ta kontakt</a> dersom du ønsker et eller flere eksemplarer av guiden trykket på solid papir.</p>
<p>Jeg regner med å lage flere iterasjoner av denne guiden, så tips om forbedringer mottas med takk.</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2009/07/30/en-lynrask-innf%c3%b8ring-i-scrum/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Den Smidige myte?</title>
		<link>http://johannesbrodwall.com/2009/05/25/den-smidige-myte/</link>
		<comments>http://johannesbrodwall.com/2009/05/25/den-smidige-myte/#comments</comments>
		<pubDate>Mon, 25 May 2009 18:53:40 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Norsk]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://brodwall.com/johannes/blog/?p=358</guid>
		<description><![CDATA[This is a Norwegian language copy of an article I published with Niklas Bjørnerstedt in the Norwegian computing magazine ComputerWorld
Studier som utgir seg for å være vitenskapelig utført viser seg stadig å ikke tåle nærmere granskning. Kommersielle tenkesmier tar mange snarveier i kampen om å få frem oppsiktsvekkende resultater. Forskeren Magne Jørgensen har gjennom årene [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>This is a Norwegian language copy of an article I published with <a href="http://www.leanway.no/?p=125">Niklas Bjørnerstedt</a> in the Norwegian computing magazine ComputerWorld</em></p></blockquote>
<p>Studier som utgir seg for å være vitenskapelig utført viser seg stadig å ikke tåle nærmere granskning. Kommersielle tenkesmier tar mange snarveier i kampen om å få frem oppsiktsvekkende resultater. Forskeren Magne Jørgensen har gjennom årene bidratt til å “avsløre” flere tvilsomme studier og dermed bidratt til å heve den vitenskapelige standarden innenfor systemutvikling. Vi synes dette er en hederverdig innsats som vi har lært mye av. Vi synes dog at Magne har blitt overivrig i det siste. I både artikler og foredrag virker han å fremfekte et syn som stiller spørsmålstegn ved all erfaring som ikke er vitenskapelig bevist. Det siste eksemplet på dette synet sto å lese i CW den 24. mars. Når artikkelen bruker denne skepsisen til å koble smidig utvikling med ord som “mote” og “tro” så føler vi at forskeren er i ferd med å kaste ut barnet med badevannet.</p>
<p>Kan det noen gang bevises at smidig utvikling er effektivere enn “tradisjonell utvikling”? Problemstillingen er sannsynligvis for åpen. Det finnes mange måter man kan definere “effektiv” på, en uendelig antall måter å være smidig på og enda flere måter å utvikle på som ikke er smidige. Vitenskapelige studier må redusere en problemstilling til noe som lar seg måle. For eksempel: Gir parprogrammering færre defekter enn individuell programmering? Faren med å redusere problemstillinger på denne måten er at det som gjenstår kan bli et meningsløst spørsmål uten kontekst. Et studie har for eksempel nylig vist at en naken mann (eller kvinne) ikke mister mer varme gjennom hodet enn resten av kroppen. Men dette er ikke relevant til hvor vidt vi bør ta på oss lue om vinteren: I det virkelige livet er det få som velger å gå ut nakne på vinteren, men mange som går barhodet. I sitt foredrag på Software 2009 hevdet Magne tilsvarende at Fred Brooks berømte påstand “Adding manpower to a late software project makes it later” ikke er verdt mye da det er en overforenkling (Brooks skal selv ha innrømmet at det er en “outrageous oversimplification”). De fleste prosjektledere vil derimot si at dette er et godt eksempel på en erfaringsbasert regel. Selvfølgelig er den ikke sann i alle tilfeller, men man bør ha gode grunner for å bryte den.</p>
<p>Som et komplement til vitenskapelige studier er det jo vanlig å bruke erfaringsbaserte slutninger. Disse erfaringene kan være falske, vi mennesker er mestere på å lure oss selv, men det må likevel være bedre å basere seg på en erfaring enn å bare gjette. Hvis det så kommer vitenskapelige studier som tilsier at erfaringen er falsk så er det et grunnlag for å endre adferd. Det er viktig å samle erfaring på en måte som er tilnærmet vitenskapelig for å unngå noen av de fallgruvene Magne gir eksempler på i sine innlegg.</p>
<p>Systematisk bruk av erfaringer er også fundamentet for smidige metoder. Etter en kort iterasjon revurderer teamet resultatet og sin arbeidsform. Målet er nettopp å basere seg på erfaring og empiri framfor blind tro. Slik vil et smidig team bruke iterasjonene på å hente inn mer informasjon om teknikkene de bruker, måten de jobber på og hvor vidt arbeidet deres tilfredsstiller kundens behov.</p>
<p>Smidige metoder er heller ikke en moteting, slik Magne ser ut til å hevde. Smidig utvikling har en lang tradisjon. Det oppsto ikke med det smidige manifestet i 2001. Tankeretningen vokste ut fra det samme miljøet som ble kalt objektorientert på 90-tallet. Dette er et miljø med sterke bånd til akademia tilbake fra Smalltalk og Simula67 før dette. I tillegg har man lånt fra Toyota Production System sin erfaring innen prosessindustrien. En tradisjon som bygger på det W. Edwards Deming kalte Plan-Do-Check-Act &#8211; en tilpasning av den vitenskapelige metode til industrien.</p>
<p>Smidig utvikling er et rammeverk for å lære fra erfaring. På samme måte som man kan bruke vitenskapens verktøy bra eller dårlig, kan man bruke smidig utvikling bra eller dårlig. Det vil aldri finnes metoder som garanterer at vi lykkes. I stedet ønsker vi metoder som hjelper oss å oppdage når vi ikke gjør det.</p>
<p>Niklas Bjørnerstedt, Leanway<br />
Johannes Brodwall, Steria</p>
<p>Publisert i Computerworld 22. mai 2009 (kun i papirutgaven)</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2009/05/25/den-smidige-myte/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Alt kan refaktoreres</title>
		<link>http://johannesbrodwall.com/2009/05/23/alt-kan-refaktoreres/</link>
		<comments>http://johannesbrodwall.com/2009/05/23/alt-kan-refaktoreres/#comments</comments>
		<pubDate>Sat, 23 May 2009 21:12:33 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Norsk]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://brodwall.com/johannes/blog/?p=355</guid>
		<description><![CDATA[This blogpost is a Norwegian language tribute to one of my home city&#8217;s great poets
Med takk til Joachim Nielsen
Ta en titt inn på skjermen din æ&#8217;kke testen grønn
Det var mye værre her om da&#8217;n da var alle tester røde
Skulle vært her i forrige uke, da hadde byggserver&#8217;n stopp
Alt jeg tenker på er test og kode [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>This blogpost is a Norwegian language tribute to one of my home city&#8217;s great poets</em></p></blockquote>
<blockquote><p><em>Med takk til Joachim Nielsen</em></p></blockquote>
<p>Ta en titt inn på skjermen din æ&#8217;kke testen grønn<br />
Det var mye værre her om da&#8217;n da var alle tester røde<br />
Skulle vært her i forrige uke, da hadde byggserver&#8217;n stopp<br />
Alt jeg tenker på er test og kode og bygg og mat hver bidige dag</p>
<p>Alt kan refaktoreres, alt kan leveres<br />
Alt kan refaktoreres, og ingen ting blir bedre</p>
<p>Jeg våkner i den samme gamle klassen og håper på det beste<br />
Tomme tester og tommere metoder, her er gutten som kan refaktorere<br />
Alle koderne som var her i går har forsvinni til no&#8217; bedre<br />
Hver dag er den samme som den neste, ut og refaktorere</p>
<p>Alt kan refaktoreres, ingen ting kan heles<br />
Alt kan refaktoreres, og ingen ting blir bedre</p>
<p>Jeg sitter her og tester igjen, min oppfinnsomhet har grenser<br />
Skulle hatt no&#8217; design eller no&#8217; krav, eller begge deler<br />
Alle folka går å prater om meg her skal det konverseres<br />
Dem begynner å bli skikkelig lei, her må det kritiseres</p>
<p>Ta en titt på skjermen din, æ&#8217;kke testen grønn (ikke vær så kjedelig)<br />
Det var mye værre her om da&#8217;n da var alle tester røde (ikke reproduserbar)<br />
Skulle vært her i forrige uke, da hadde byggserver&#8217;n stopp (kan det være mulig)<br />
Alt jeg tenker på er test og kode og bygg og mat hver bidige dag</p>
<p>Alt kan refaktoreres, alt kan leveres<br />
Alt kan refaktoreres, og ingen ting blir bedre</p>
<p>Jeg våkner i den samme gamle klassen og håper på det beste<br />
Tomme tester og tommere metoder, her er gutten som kan refaktorere<br />
Alle koderne som var her i går har forsvinni til no&#8217; bedre<br />
Hver dag er den samme som den neste, ut og refaktorere</p>
<p>Alt kan refaktoreres<br />
Alt kan leveres<br />
Alt kan refaktoreres<br />
Og ingen ting blir bedre</p>
<p>Alt kan refaktoreres<br />
Alt kan leveres<br />
Alt kan kopieres<br />
Og ingen ting blir bedre</p>
<p>Alt kan refaktoreres<br />
Alt kan refaktoreres<br />
Alt kan refaktoreres<br />
Alt kan refaktoreres</p>
<p><em>Forslag til refaktorering av sangen mottas med takk</em></p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2009/05/23/alt-kan-refaktoreres/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Vær-varsom plakaten for arkitekten</title>
		<link>http://johannesbrodwall.com/2009/04/22/v%c3%a6r-varsom-plakaten-for-arkitekten/</link>
		<comments>http://johannesbrodwall.com/2009/04/22/v%c3%a6r-varsom-plakaten-for-arkitekten/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 20:43:32 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Norsk]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://brodwall.com/johannes/blog/?p=348</guid>
		<description><![CDATA[På dagens møte i IASA Oslo fremsatte jeg påstanden at vi trenger en &#8220;vær-varsom plakat&#8221; for arkitekten. Spesielt fokuserte jeg på virksomhetsarkitektens rolle og risiko.
I diskusjonen etterpå kom vi inn på mange av aspektene og det var mange veldig gode forslag der jeg ikke fikk notert meg alt, så jeg har utelatt mange ting som [...]]]></description>
			<content:encoded><![CDATA[<p>På dagens møte i <a href="http://wiki.cantara.no/display/IASA/">IASA Oslo</a> fremsatte jeg påstanden at vi trenger en &#8220;vær-varsom plakat&#8221; for arkitekten. Spesielt fokuserte jeg på virksomhetsarkitektens rolle og risiko.</p>
<p>I diskusjonen etterpå kom vi inn på mange av aspektene og det var mange veldig gode forslag der jeg ikke fikk notert meg alt, så jeg har utelatt mange ting som kunne vært sagt.</p>
<p>Her er mitt førsteutkast til &#8220;vær-varsom plakaten&#8221;:</p>
<ul>
<li><strong>Hold tilbake til innflytelse</strong>: Når du foreslår en løsning, kan løsningen bli valgt ukritisk. Når du tar ansvar for en løsning, umyndiggjør du de som skal utføre jobben og gjør dem i dårligere stand til å ta ansvar i fremtiden.</li>
<li><strong>Vær forsiktig med å foreslå løsninger</strong>: Løsningen du foreslår har høyere kostnader enn du forventer. Løsningen du foreslår løser problemet dårligere enn du forventer. Problemet du løser er mindre alvorlig enn du forventer.</li>
<li><strong>Byråkrati koster</strong>: Alle tid brukt i møter er tid som ikke brukes til fremdrift. All unødvendig informasjon (for eksempel standarder) som blir gitt fjerner oppmerksomheten fra en bit viktigere informasjon.</li>
</ul>
<p>I stedet kan en arkitekt fokusere på å være en kulturkatalysator:</p>
<ul>
<li><strong>Skap fora for andre</strong>: Du har en unik mulighet til å støtte læring og erfaringsutveksling mellom de som utfører jobben.</li>
<li><strong>Fremhev andre</strong>: Dersom du kjenner andres sterke sider og forbedringsønsker, har du mulighet til å bidra til andres personlige vekst.</li>
<li><strong>Vær et talerør</strong>: De som gjør oppgavene har ofte vanskelig for å få gehør for sine problemer og behov. Formidle disse problemene til ledelsen og hjelp sett fokus på daglige forbedringsmuligheter.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2009/04/22/v%c3%a6r-varsom-plakaten-for-arkitekten/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Lyntalemanifestet</title>
		<link>http://johannesbrodwall.com/2008/12/07/lyntalemanifestet/</link>
		<comments>http://johannesbrodwall.com/2008/12/07/lyntalemanifestet/#comments</comments>
		<pubDate>Sun, 07 Dec 2008 21:57:10 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Communities]]></category>
		<category><![CDATA[Norsk]]></category>

		<guid isPermaLink="false">http://brodwall.com/johannes/blog/2008/12/07/lyntalemanifestet/</guid>
		<description><![CDATA[I&#8217;ve been part of the group organizing the Norwegian language, lightning talks based conference Smidig the last two years. This Norwegian language article describes the essential guidelines to giving a short presentation.
En god lyntale kan ha enda større påvirkning enn et godt foredrag, fordi lettere kan nå flere mennesker. Men det krever innsats. En god [...]]]></description>
			<content:encoded><![CDATA[<p><em>I&#8217;ve been part of the group organizing the Norwegian language, lightning talks based conference Smidig the last two years. This Norwegian language article describes the essential guidelines to giving a short presentation.</em></p>
<p>En god lyntale kan ha enda større påvirkning enn et godt foredrag, fordi lettere kan nå flere mennesker. Men det krever innsats. En god lyntale er:</p>
<ul>
<li><strong>Fokusert:</strong> Du skal ha ett poeng, én påstand eller ett spørsmål som foredraget bygger rundt. En god lyntale er ikke kortversjonen av et timesforedrag, eller abstraksjon over erfaringer. Snakk om konkrete erfaringer. Finn det aller viktigste poenget og snakk om det.</li>
<li><strong>Forberedt:</strong> En lyntale krever forberedelser, akkurat som et annet foredrag. Men siden det er kort har du anledning til å trene på det flere ganger. Vis ditt publikum respekt. Hold talen for en vegg tre ganger før du holder den for et menneske. Det tar bare 30 minutter.</li>
<li><strong>Pirrende:</strong> Når tiden din er brukt opp skal du ikke ha sagt alt du kunne ha sagt, og ditt publikum skal ikke ha hørt alt de kunne ha hørt. Både du og publikum bør ha appetitt på mer informasjon.</li>
</ul>
<p>Kan du skape mening på ti minutter? Klart du kan.</p>
<p><em>Kommentarer, eksempler på gode lyntaler og forslag til revidering av &#8220;manifestet&#8221; mottas med takk!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2008/12/07/lyntalemanifestet/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Er smidige målprisprosjekter mulig?</title>
		<link>http://johannesbrodwall.com/2008/11/23/er-smidige-malprisprosjekter-mulig/</link>
		<comments>http://johannesbrodwall.com/2008/11/23/er-smidige-malprisprosjekter-mulig/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 03:03:44 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Communities]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Norsk]]></category>

		<guid isPermaLink="false">http://brodwall.com/johannes/blog/2008/11/23/er-smidige-malprisprosjekter-mulig/</guid>
		<description><![CDATA[ The Norwegian computing association has released guidelines for contracts regarding agile projects. Wednesday, November 26th I will be part of a panel debating this work and the combination of agile and contracts. This Norwegian language blog post contains my introductory remarks for the debate.
Kom på debatten på Oslo Lean Meetup på onsdag og delta [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><em> The Norwegian computing association has released guidelines for contracts regarding agile projects. Wednesday, November 26th I will be part of a panel debating this work and the combination of agile and contracts. This Norwegian language blog post contains my introductory remarks for the debate.</em></p></blockquote>
<p><em>Kom på <a href="http://agile.meetup.com/31/calendar/9184874/">debatten på Oslo Lean Meetup</a> på onsdag og delta på debatten!</em></p>
<p>Jeg er ikke en prosjektleder, en advokat eller en politikker, så jeg kan ikke si så mye om hva som må være med i en slik kontrakt. Jeg er bare en programmerer. Jeg er en programmerer som ønsker å jobbe på gode prosjekter. Jeg håper at det er mulig for meg å jobbe på gode prosjekter som også advokatene og politikerne vil være fornøyde med.</p>
<p>Hva er et godt prosjekt? Den enkle definisjonen er at et godt prosjekt er et prosjekt som både leverandøren og kunden, både utviklerne og brukerne er fornøyde med. For meg som programmerer er dette viktig. Og jeg tror det er viktig for mange andre programmerer. Hva er det som gjør at enkelte mennesker synes programmering er spennende? Jeg tror svaret er enkelt: Programmerer er mennesker som brenner for å skape ting som noen har bruk for.</p>
<p>Jeg ønsker å skape verdi, og for meg er smidige metoder en god rettesnor. Jeg tror ikke smidige metoder er et magisk ord man kan bruke for å få til vellykkede prosjekter, men jeg tror at verdiene smidige metoder beskriver forbedrer sjansene mine for å delta på gode prosjekter. Men bare dersom man forstår verdiene og ikke bare utfører tomme ritualer som man kaller &#8220;smidig&#8221;.</p>
<p>Jeg har jobbet noen år som programmerer. Og jeg har deltatt både på prosjekter jeg var fornøyd med og på prosjekter som jeg ikke var fornøyd med. Den triste sannheten er at de fleste prosjektene jeg har sett eller deltatt på var ikke gode prosjekter.</p>
<p>Derfor var det veldig spennende for meg når jeg først fikk høre om veillederen. Spørsmålet jeg håper veilederen kan svare på: Er det mulig å forbedre sjansen for at leveranseprosjekter blir gode leveranseprosjekter? Kan veilederen forbedre sjansen for at prosjektene våre blir gode prosjekter?</p>
<p>Jeg har lest gjennom det som har blitt skrevet med en blanding av håp og skrekk. Mitt svar er &#8220;jeg vet ikke&#8221;.</p>
<p>Men jeg er skeptisk. Det virker som om smidige metoder, som mye annet, er i ferd meg å bli et offer for sin egen suksess. Kan vi risikere å falle i fella at vi tror at fordi vi bruker ord som Product Owner og ScrumMaster og Sprint og Product Backlog så vil alt bli bedre av seg selv?</p>
<p>Det er lett å si &#8220;smidig&#8221;, men det er ikke alltid lett å gjøre smidig. Så for å forstå hva smidige metoder dreier seg om, gikk jeg tilbake til kilden.</p>
<p>Jeg bladde opp på http://agilemanifesto.org. De smidige verdiene er kjent for de fleste nå. De står på forsiden. Men det ser ut som om mange overser den første linken herfra. Den går til de tolv smidige prinsippene. Jeg har valgt ut tre for dere:</p>
<p>&#8220;Our highest priority is to satisfy the customer through early and continuous delivery of valuable software.&#8221;</p>
<p>&#8220;Simplicity&#8211;the art of maximizing the amount of work not done&#8211;is essential.&#8221;</p>
<p>&#8220;Welcome changing requirements, even late in development. Agile processes harness change for the customer&#8217;s competitive advantage.&#8221;</p>
<p>Det jeg har fått ut av smidighet, er erkjennelsen om at vi ikke kan anta perfekt informasjon. Vi er nødt til å få feedback på det vi tror og det vi gjør, og vi er nødt til å endre planene basert på denne feedbacken. Denne grunnleggende verdien ligger bak ønsket om hyppige leveranser og mye annet.</p>
<p>Så jeg står igjen med et siste spørsmål: Er det mulig å lage en leveransekontrakt som verdsetter denne dype verdien om feedback? Det håper jeg å få svar på i denne debatten.</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2008/11/23/er-smidige-malprisprosjekter-mulig/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Toyota Kyushu &#8211; En produksjonsballett</title>
		<link>http://johannesbrodwall.com/2008/11/01/jke-dag-1-toyota-kyushu-en-produksjonsballett/</link>
		<comments>http://johannesbrodwall.com/2008/11/01/jke-dag-1-toyota-kyushu-en-produksjonsballett/#comments</comments>
		<pubDate>Sat, 01 Nov 2008 22:34:51 +0000</pubDate>
		<dc:creator>Johannes Brodwall</dc:creator>
				<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Norsk]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://brodwall.com/johannes/blog/2008/11/01/jke-dag-1-toyota-kyushu-en-produksjonsballett/</guid>
		<description><![CDATA[This is a rough Norwegian language translation of the article JKE Day 1: Toyota Kyushu &#8211; The Manufacturing Ballet by Kevin Meyer (improvements on the language are very welcome, comments on the contents should go to Kevin). The reproduction has been authorized by the author. Unlike the rest of my site, this article is not [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>This is a rough Norwegian language translation of the article <a href="http://www.evolvingexcellence.com/blog/2008/10/jke-day-1-toyota-kyushu.html">JKE Day 1: Toyota Kyushu &#8211; The Manufacturing Ballet</a> by Kevin Meyer (improvements on the language are very welcome, comments on the contents should go to Kevin). The reproduction has been authorized by the author. Unlike the rest of my site, this article is not available under creative commons license.</em></p></blockquote>
<p>Jeg kom over en artikkel som demonstrerte hvor bemerkelsesverdig lean production system kan være. Den var så spennende at jeg bestemte meg for å oversette den til norsk:</p>
<blockquote><p>
Jeg trodde at jeg forsto lean ganske bra. Jeg tok feil. Jeg har fortsatt masse å lære.</p>
<p>På mandag besøkte jeg Toyotas Kyushu fabrikk som en del av Gemba&#8217;s <a href="http://www.gemba.com/benchmarking-trips.cfm?id=73">Japan Kaikaku Experience</a>. Anlegget har en kapasitet til å produsere 40 000 kjøretøy i måneden, produserte 430 000 kjøretøy i 2007 og produserer akkurat nå 1150 kjøretøy hver dag gjennom to skift. Det er over 6000 ansatte, noe som er en reduksjon de siste par månedene på grunn av den lavere globale etterspørselen etter biler, men det er 2000 mer enn for ti år siden.</p>
<p>Det første du legger merke til når du kjører inn til komplekset er at fabrikkpipene er skarpt gule. Hvorfor gule? Med gule piper kan de enklere se om pipene er skitne slik at de vet om de må rengjøres. Det siste du opplever når du forlater området er guiden som sier &#8220;jeg er sikker på at jeg kunne gjort en bedre jobb og jeg vil streve etter å forbedre meg&#8221; og så bukker hun gjentatte ganger til bussen vår mens vi kjører vår vei og avslutter med et siste fullt bukk når vi runder hjørnet av parkeringsplassen&#8230; en halv kilometer unna. Ønsket om å forbedre arbeidet og respekten for mennesker gjennomsyrer fabrikken.</p>
<p>Erfaringen er vanskelig å beskriver, men her kommer noe friflytende tanker og observasjoner.</p>
<p>Dette er Toyotas mest lønnsomme fabrikk dersom man regner kroner per bil. Det er ikke den beste når det gjelder produktivitet av arbeidsstokken. Dette faktumet bør kaste kaldt vann over &#8220;arbeidstimer per enhet&#8221; metrikker som ofte brukes i industrien. Dersom mindre av tiden brukes på direkte arbeid, kan det medføre forbedringer i fabrikkens produktivitet som øker lønnsomheten. De forstår at arbeid er en verdi, ikke en kostnad.</p>
<p>Toyota produserer kun til bestilling. Bilutsalg må forplikte seg på antall enheter med 30 dagers varsel før produksjonsmåneden, og så låse sin bestilling 5 dager før produksjonsmåneden starter. På det tidspunktet sendes kravene videre til Toyotas underleverandører som så har 3 dager på å planlegge produksjon av de delene som trengs for hvert kjøretøy. Delene leveres i inkrementer på én time til fabrikkgulvet.</p>
<p>Høres komplisert ut? Det er komplisert. Legg til takt-tid, eller hvor ofte et kjøretøy ruller av samlebåndet for å møte etterspørselen, som kan variere fra 90 sekunder helt ned til under 50 sekunder. Sekunder. Takt-tiden endres hele tiden for å tilpasse seg etterspørselen. Se for deg hvordan endringer i etterspørsel leder tilbake til leverandørkjedekrav og og leverandørkjedefleksibilitet.</p>
<p>Så&#8230; tenk på dette: De samme operasjonen brukes ikke bare til å lage kjøretøy med varierende farger eller kjøretøy med varierende opsjoner eller til og med til å lage kjøretøy med radikalt forskjellig teknologi (for eksempel bensinbiler eller hybrider). De brukes til å lage helt forskjellig kjøretøy. Det endres hele tiden, per enkelt enhet. Hundrevis av variasjoner, mange så radikalt forskjellige som kjøretøy med forskjellig chassis. Hvert minutt. En personbil, så en SUV, så en hybrid av den samme SUV-en, så en bil igjen&#8230; se for deg flyten av materialer, balansering av produksjonslinjene, standardisering av arbeid som trengs for å få en slik produksjonskjede til å summe. Det bør få de som tror at Toyota ikke tror på en produksjon av varierende modeller til å tenke seg om to ganger. Eller de som tror at raske endringer av produksjonslinjer kun er en drøm.</p>
<p>Og til sist&#8230; tenk på dette: Det var ikke en eneste synlig datamaskin på fabrikkgulvet. Noe sted. Et stort elektronisk skilt viser tilstanden på hver produksjonslinje, men alt annet var manuelt. Hver kasse med deler ble håndtert med manuelle kanban (men med strekkoder, slik at papirkortene ikke blir overlevert). Når en kasse er tom, blir den fylt opp igjen av arbeidere som kjører vogner opp og ned mellom produksjonslinjene. Når en kasse med deler blir tømt, erstattes den med en ny kasse. Tusenvis av deler, fra så små som skruer og muttere helt opp til motorer og dører, over flere mål med fabrikkgulv.</p>
<p>Toyota automatiserer kun farlig arbeid (som sveising) eller det som er for tungt for mennesker. Alt annet er gjort av arbeiderne&#8230; fordi kun mennesker kan komme med forbedringer. Og disse kontinuerlige forbedringene er en av de mest imponerende aspektene ved denne fabrikken.</p>
<p>I motsetning til mange andre bilprodusenter, lar Toyota fabrikkene sine forbedre seg individuelt i stedet for å påtvinge detaljerte arbeidsstandarder på tvers av fabrikker. Endringer og innovasjoner er synlige over alt, på alle arbeidsstasjoner. Arbeiderne bruker PVC rør til å skape sine egne måter å vise den eksakte plasseringen av deler for å effektivisere arbeidet. Disse Rube Goldberg-trallene følger dem mens de flytter seg sammen med bilen for å utføre forskjellige operasjoner.</p>
<p>Hver bevegelse er koreografert og perfeksjonert. Man er nødt til å stå og se på hver arbeider gå gjennom flere runder med sine arbeidsoppgaver for å se nøyaktig hvor koreograferte de er. Hver bevegelse har et formål og er designet for å minimere arbeidet for den nåværende og neste operasjon. I det arbeideren går ut av frontsetet etter å ha installert fire skruer, vrir han litt på venstrehånden slik at bakdøren åpnes og så glir han ut av frontsetet og inn i baksetet. I det han forlater baksetet etterlater han et verktøy som neste arbeider trenger. Det er vanskelig å beskrive, men det er i sannhet en produksjonsballett.</p>
<p>Hvis en arbeider har et problem, trekker han i en snor som utløser en alarm. En annen person kommer løpende. Eskalering av problemer er noe mange sliter med, og Toyotas løsning er å lage veldig enkle avgjørelser og flere avgjøringspunkter. Arbeideren starter med &#8220;er det et problem, ja/nei?&#8221; Hvis &#8220;ja&#8221; så trekker han i alarmen. En mann med hvite hansker kommer løpende og har en annen enkel avgjørelse: &#8220;er det virkelig et problem, ja/nei?&#8221; De to har bokstavlig talt under ett minutt, en takt, å komme til en avgjørelse. Dersom &#8220;ja&#8221; så stoppes produksjonslinja, og en arbeidsleder kommer løpende. Han har en ny enkel avgjørelse av &#8220;kan problemet løses innen to takter (cirka to minutter), ja/nei?&#8221; Hvis nei, så går problemet opp ett nivå til &#8220;stopp fabrikken&#8221;. På under tre minutter har et problem blitt identifisert, angrepet, nesten alltid løst, men en avgjørelse har blitt tatt som potensielt kunne stoppet hele fabrikken.</p>
<p>Hvor ofte hører man alarmen? Cirka hvert minutt over hele fabrikken. Det er ikke noe i veien med å rapportere et problem. Formålet er å finne det og fikse det, raskt. På under ett minutt. Hvor lang tid tar det deg å identifisere, rapportere og løse et problem? Jeg vet hva du tenker: Jeg skammer meg også.</p>
<p>Det er cirka syv parallelle produksjonslinjer som løper fra hode til hale, hvor hver bil produseres. De er synkroniserte men uavhengige for å gjøre det mulig å ha en buffer på tre til syv biler, noe som tillater at en linje kan være inoperativ i to takter to eller tre ganger per skift uten å stoppe fabrikken. &#8220;Buffer&#8221; er antageligvis ikke riktig ord&#8230; husk at dette utgjør kanskje fem minutter. Fabrikken har planlagt 100 % oppetid, men målet er 97 %.</p>
<p>Takt-tiden justeres hele tiden basert på etterspørsel. Tregere takter blir sett på som en mulighet til å forbedre arbeidet. Jeg vet at den nåværende krisen har medført nedgangstider for mange, men hva ville skjer dersom du gikk til sjefen og sa at du ønsket å redusere den tiden arbeiderne jobbet direkte med produksjon slik at de kan forbedre arbeidet? De ville antageligvis sjekke gyldigheten av MBA-graden din.</p>
<p>Men dette er hvorfor denne fabrikken er så lønnsom&#8230; uten at den er den beste når det gjelder å utnytte arbeidskapasiteten. Menneskeskapte forbedringer mer enn utjevner forskjellen. &#8220;Kaizen&#8221; (Toyotas begrep for &#8220;kontinuerlig forbedring&#8221;) på denne fabrikken, som på alle andre Toyota-fabrikker, innebærer alle typer forbedring. Noen kan være så små som &#8220;i stedet for at jeg strekker høyrearmen over venstrearmen for å hente en del, plasserer jeg delkassen til venstre&#8221;, men det er fortsatt en forbedring. Hver arbeider forventes å komme med en forbedring i måneden. Hver forbedring blir dokumentert på et enkelt ark. Hundre tusen forbedringer i året. Små forbedringer som utgjør en massiv endring.</p>
<p>Vi strever ofte med om vi skal kompensere eller belønne arbeidere for forbedringer og hvor betalingen skulle hentes fra. På Toyota, i stedet for å forsøke å beregne lønnsomheten for hver enkelforbedring, betaler hver forbedring fem til ti dollar fra fabrikkens opplæringsbudsjett. Dersom ideen medfører mindre arbeid, får arbeideren fordelen av redusert arbeidsmengde i en måned før produksjonslinjene rebalanseres.</p>
<p>Opplæring er naturlig nok essensielt. Nye arbeidere bruker tre måneder på å lære sin første jobb, for det meste i et opplæringssenter som ser nesten identisk ut med fabrikken. Etter at de har lært denne jobben, lærer de jobben som utføres før sin egen og så jobben som utføres etter. De bruker én måned på hver av disse.</p>
<p>Å balansere arbeidskraften er også viktig. Uplanlagt fravær kan være døden. Fabrikker har 5 % overkapasitet i bemanning for å tillate ferier og fravær. Ut over dette&#8230; så må sjefen erstatte en manglende arbeider. Dersom arbeideren trenger å bruke toalettet utenfor sine vanlige pauser og lunsj, så må sjefen ta hans plass. Dersom arbeideren plutselig er borte, så må sjefen ta hans plass. Denne filosofien gjelder helt til toppledelsen i fabrikken.</p>
<p>Det er pauserom og toaletter innen 50 meter fra hver arbeidsstasjon. Overraskende nok får de ansatte lov til å røyke i pausene sine&#8230; på produksjonsgulvet. Alle tar pause samtidig, og produksjonslinjen stoppes&#8230;. lyset over produksjonslinjen skues av for å spare energi. Ti minutter senere spilles Edelweiss, og alle går tilbake på plass.</p>
<p>Nedgangstidene merkes. Hundrevis av vikarer, en tradisjonell og akseptert form for arbeid i Japan, har forlatt fabrikken. Men alle fulltidsarbeidere har sin jobb på livstid, noe som har vært praksis i årtier. Lojalitet begge veier hjelper begge parter. Men husk også at Toyota er unike i at de har, og følger, 50 årsplaner. Ikke femårsplaner som resten av oss. Femti. Krisen var forventet, likviditet var satt av, strategier var utviklet til å utforme opplæring for å komme gjennom krisen.</p>
<p>Hvem kan si meg hvem som er toppsjef i Toyota? Det er noen få som kan. Men ikke så mange som kan navngi Welch eller Nardelli. Ledelsen på Toyota er ydmyke. Fujio Cho has sagt &#8220;led som om du ikke har noe makt&#8221;. Etter å ha sett denne fabrikken forstår du virkelig den idéen. Toyota er et prinsipp, et system, som tilfeldigvis har en leder. Det er et prinsipp som understøtter mennesker og som utnytter forbedringene som disse menneskene skaper.</p>
<p>Tror du at du forstår lean? Da kan det være at du bør besøke Toyota Kyushu på <a href="http://www.gemba.com/benchmarking-trips.cfm?id=73">The Japan Kaikaku Experience.</a>
</p></blockquote>
<p>Her er det masse å lære, dersom man fokuserer på prinsippene og ikke teknikkene. Det er stor forskjell på produksjon og (software)utvikling. Men prinsippene om at de store forbedringene kommer fra en samling små forbedringer, om at det er de som jobber på fabrikkgulvet som skaper forbedringene og at god og helhetlig opplæring lønner seg er gyldige. Og jeg tror ledere innen IT burde være de som kan ta plassen til de som de leder og som leder uten makt.</p>
]]></content:encoded>
			<wfw:commentRss>http://johannesbrodwall.com/2008/11/01/jke-dag-1-toyota-kyushu-en-produksjonsballett/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
