<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-8401108360802573439</atom:id><lastBuildDate>Tue, 29 Nov 2011 19:23:14 +0000</lastBuildDate><category>ADB</category><category>systemutveckling</category><category>Dan North</category><category>förändring</category><category>affärsnytta</category><category>silverlight</category><category>kvalitet</category><category>daily scrum</category><category>samarbete</category><category>vattenfallsmodellen</category><category>Öredev</category><category>effektivitet</category><category>Karriär</category><category>Hanselman</category><category>användare</category><category>commitment</category><category>scrum</category><category>objektorientering</category><category>unit testing</category><category>.net</category><category>podcasts</category><category>komplexitet</category><category>pomodoro</category><category>roy osherove</category><category>fokustid</category><title>En systemutvecklares självterapi</title><description>Jag heter Per och är systemutvecklare, småbarnsförälder och hemmafixare. Eftersom tiden sällan räcker till ens en av dessa roller funderar jag mycket över hur man kan bli effektivare. Att blogga ser jag främst som självterapi - för att skriva av mig.
Men kanske stämmer något in även på fler?</description><link>http://systemutvecklaren.blogspot.com/</link><managingEditor>noreply@blogger.com (Per)</managingEditor><generator>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Systemutvecklaren" /><feedburner:info uri="systemutvecklaren" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-4274602799772081953</guid><pubDate>Mon, 07 Mar 2011 21:16:00 +0000</pubDate><atom:updated>2011-03-08T20:48:25.716+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">unit testing</category><category domain="http://www.blogger.com/atom/ns#">samarbete</category><category domain="http://www.blogger.com/atom/ns#">objektorientering</category><title>Badare, skogshuggare och objektorienterade designers</title><description>Ibland kastas man tillbaka till skolbänken. Inte i bokstavlig mening, som i att gå en kurs, utan bildligen. Ibland blir man påmind om vad man faktiskt lärde sig där bland alla föreläsningar, fikapauser och tentor. Man blir påmind om hur lite man egentligen vet och hur spännande vårt område egentligen är.&lt;br /&gt;
&lt;br /&gt;
Sitter fortfarande med samma avancerade problem som jag bloggade om förra gången. En avancerad urvalsprocess för att välja det bästa alternativet bland många. Jag vet nu vet vad som ska göras och hur det bör gå till men jag hade stora problem med att få lösningen dit jag ville. Jag ritade pilar och boxar, hittade på coola namn som "Manager", "RuleSet" och "Matcher". Problemet jag hade var att det inte kändes objektorienterat. På något vis luktade hela lösningen procedurell kod... Dessutom blev de tester jag skrev krångliga och allt för &lt;i&gt;nyfikna&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Låt oss ta en avstickare och fundera lite över nyfikna tester. De är ett problem. Det är tester som vill veta lite &lt;i&gt;för&lt;/i&gt;&amp;nbsp;mycket om klassen som det testar. Istället för att testa inputs och outputs testar de istället &lt;i&gt;hur&lt;/i&gt;&amp;nbsp;klassen under test kommer fram till ett resultat. Tänk dig en metod som processar en fil. Den ska givet ett antal villkor ta olika beslut och då och då interagera med andra klasser. Det vi egentligen vill veta är att vår metod uppfyller sitt &lt;i&gt;kontrakt&lt;/i&gt;, att den gör det den utger sig att göra. Men ett nyfiket test kollar istället på vilket sätt den interagerar med omvärlden och "tjuvlyssnar" på algoritmens inre logik. Visst, du kanske har snott ihop världens tajtaste algoritm, men jag kan lova dig att det finns någon där ute som kan göra det annorlunda och troligen bättre. Om denne någon fick i uppdrag att modifiera din algortim skulle de nyfikna testerna stå ivägen och bara orsaka svordomar. De skulle faila bara för att man ändrade på algoritmens struktur, fastän det förväntade beteendet var oförändrat. Varje gång vi använder &lt;a href="http://en.wikipedia.org/wiki/Mock_object#Mocks.2C_fakes_and_stubs"&gt;mocks och inte stubs&lt;/a&gt; bör vi därför ställa oss frågan: "är jag för nyfiken". &lt;br /&gt;
&lt;br /&gt;
Ok, det var ett sidospår. Jag satt alltså där med en lösning på gång, men med en lukt av gammal unken Pascal.&lt;br /&gt;
&lt;br /&gt;
Återigen ett samtal med en kollega. Återigen en ny syn på saken, men denna gång en sanning jag har kunnat men glömt bort. Frågan han ställde var enkel och förtjänar fet stil i stor font&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;"Hur skulle det du försöker göra fungera om det gjordes manuellt, i verkligheten?"&lt;/span&gt;&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
En alldeles lysande fråga! Jag tänkte bort alla artificiella saker jag uppfunnit där på min kammare. Jag började förklara flödet och beskrev deltagarna i mitt scenario som &lt;i&gt;personer&lt;/i&gt;. Dessa personer hade inga collections eller managers till sin hjälp. De hade böcker, offerter, anteckningar och andra &lt;i&gt;verkliga &lt;/i&gt;saker. De interagerade inte med repositories eller factories. De interagerade med andra &lt;i&gt;personer&lt;/i&gt;. En skiss dök upp. Pilar fortfarande, men nu streckgubbar och dokument. Regelböcker och arkivmappar.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-icS0gMaA5vg/TXaHn9o-LoI/AAAAAAAAAB0/oUOJTncOW4Y/s1600/bild.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="https://lh4.googleusercontent.com/-icS0gMaA5vg/TXaHn9o-LoI/AAAAAAAAAB0/oUOJTncOW4Y/s320/bild.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Det fantastiska med det här var att jag genast fick en objektorienterad lösning. En lösning som modellerade något verkligt och som efterliknade verklig kommunikation och interaktion. Inga Managers, Coordinators eller Services. Helt plötsligt föll sig också kollaboratörernas respektive ansvarsområden och förmågor på plats.&lt;br /&gt;
&lt;br /&gt;
Jag hade helt glömt att objektorientering mår bäst när den modellerar något verkligt. Den mår bäst av att vi inte hittar på massa abstraktioner och flummiga tekniska begrepp. Den mår bäst när vi använder vårt eget språk som vi skulle använda för att beskriva för vem som helst. En snabb tur till Google ger snart denna mening som förtjänar att dammas av: &lt;i&gt;"Software objects are often used to model the real-world objects that you find in everyday life."&lt;/i&gt;&lt;a href="http://download.oracle.com/javase/tutorial/java/concepts/"&gt;[källa]&lt;/a&gt;&amp;nbsp;Det tål att tänkas på när vi springer iväg med vårt design-pattern-influerade, tekniktörstande ego...&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Vad gäller nyfikna tester slapp jag även dem. Eftersom varje klass nu fick ett tydligt ansvar och tydliga metoder blev det enkelt att testa. Om varje klass får ett tydligt kontrakt är det enkelt att sätta förväntningar och se att de infrias av klassen. Jag tror att nyfikna tester är en indikation på att man pysslar med procedurell kod. Det funkar inget vidare. Tydligen gillar TDD objektorienterad kod bättre än Pascal.&lt;br /&gt;
&lt;br /&gt;
Och så till rubriken. Vad har någon som badar eller kör motorsåg gemensamt med den som sysslar med objektorienterad design? Tja, jag gillar ju både bad och motorsågar (kanske inte i kombination...) men jag är inte den gemensamma nämnaren.&lt;br /&gt;
&lt;br /&gt;
Nä, svaret är enkelt: de är alla saker vi inte bör göra &lt;i&gt;ensamma&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Over and out!&lt;br /&gt;
[Dagens kodarmusik: &lt;a href="http://open.spotify.com/track/5FQazQxWUHsJ8QDaXLdFzR"&gt;Blow - Ke$ha&lt;/a&gt;]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-4274602799772081953?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/kDTqctulyZM/badare-skogshuggare-och.html</link><author>noreply@blogger.com (Per)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh4.googleusercontent.com/-icS0gMaA5vg/TXaHn9o-LoI/AAAAAAAAAB0/oUOJTncOW4Y/s72-c/bild.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2011/03/badare-skogshuggare-och.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-6010923428641324009</guid><pubDate>Fri, 25 Feb 2011 15:29:00 +0000</pubDate><atom:updated>2011-02-25T16:33:37.067+01:00</atom:updated><title>Ett par nya ögon och öron kan spela stor roll!</title><description>Satt häromdagen och slet mitt hår över en riktigt komplex uppgift. Jag ritade klassdiagram, körde lite TDD, skapade en massa interface.... bara för att inse att jag var ute och cyklade fullständigt. Den känslan är inte ny. Den är tvärtom välbekant.&lt;br /&gt;
&lt;br /&gt;
Jag tror det finns en motsvarighet till författarnas "writers block" även inom vårt yrke. Den där känslan man får när man provat alla angreppsvinklar man har och ändå slutar upp i återvändsgränder. Det är tröstlöst. Det är svårt skadande för självförtroendet. Så ger man upp, slår igen laptopen och slänger sig i soffan med bultande huvudvärk och en känsla av hopplöshet.&lt;br /&gt;
&lt;br /&gt;
Men det tar inte slut där. Då kommer natten. Man vänder och vrider sig och försöker lösa problemet lite sådär halvsovande. Jag minns när jag gick på högskolan och vaknade i flummiga tankar i stil med "hur jag än vänder och vrider på kudden så löser jag inte den här labben". För någon utanför vårt yrke tror jag det låter hur galet som helst. Men jag tror att vi alla har varit där någon gång...&lt;br /&gt;
&lt;br /&gt;
Men sen kommer ljuset - ett par nya ögon eller öron. Man drar ihop en eller ett par kollegor och presenterar problemet för dem. Kanske löser man det bara genom att förklara för dem, genom att höra sina egna ord. Eller så är det någon som bara &lt;i&gt;ser&lt;/i&gt;. Ser det du inte kunde se. Någon som får den där förlösande upptäckten som gör att min egen hjärna får en välbehövlig defibliratorchock. Som en LP som hakat upp sig som någon knuffar vidare. Det är en grym känsla!&lt;br /&gt;
&lt;br /&gt;
Ibland är man själv den nytänkande motparten, ibland är man den som kört fast. Oavsett situation är de nya ögonen ovärdeliga.&lt;br /&gt;
&lt;br /&gt;
Dessutom tror jag att man &lt;i&gt;måste &lt;/i&gt;igenom det där jobbiga för att kunna ta emot de nya ögonen. Man måste gräva ner sig i ett problem och vända det ut och in före man verkligen kan uppskatta en ny dimension och &lt;i&gt;förstå&lt;/i&gt;&amp;nbsp;att den har någon värdefullt att ge.&lt;br /&gt;
&lt;br /&gt;
Precis det här hände mitt senaste problem. En oerhört kreativ diskussion med två begåvade kollegor löste många knutar och någon bara &lt;i&gt;såg&lt;/i&gt;. Fantastiskt.&lt;br /&gt;
&lt;br /&gt;
Så alla ni som är med i kreativa diskussioner, se ert värde! Även om man inte kommer fram till lösningen just där och då kan era frågor och nya vinklar vara värda guld. Våga säga nåt, våga komma med en fråga eller åsikt, det kan vara just den som är starten till nästa möjlighet!&lt;br /&gt;
&lt;br /&gt;
Over and out!&lt;br /&gt;
&lt;br /&gt;
Dagens kodarmusik: &lt;a href="http://open.spotify.com/track/4c1Bs92Z5oWeeB0olsAZhz"&gt;Sara Lumholdt - Enemy&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-6010923428641324009?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/hrCGcVtwxCE/ett-par-nya-ogon-och-oron-kan-spela.html</link><author>noreply@blogger.com (Per)</author><thr:total>0</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2011/02/ett-par-nya-ogon-och-oron-kan-spela.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-5477539919999310308</guid><pubDate>Fri, 11 Feb 2011 13:28:00 +0000</pubDate><atom:updated>2011-02-13T13:07:47.521+01:00</atom:updated><title>S - och vad det innebär för oss dödliga utvecklare</title><description>Efter att ha hört &lt;a href="http://hadihariri.com/"&gt;Hadi Hariri&lt;/a&gt; prata om &lt;i&gt;maintainable code&lt;/i&gt;&amp;nbsp;på ett event i Göteborg häromdagen fick jag en sista knuff att ta tag i något jag funderat över ett tag, nämligen SOLID.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;a href="http://en.wikipedia.org/wiki/Solid_(object-oriented_design)"&gt;SOLID &lt;/a&gt;är en akronym av akronymer som myntades av &lt;a href="http://blog.objectmentor.com/articles/category/uncle-bobs-blatherings"&gt;Robert C. Martin&lt;/a&gt; (Uncle Bob), en levande legend i utvecklarsamanhang och författaren till den fantastiska boken &lt;a href="http://www.adlibris.com/se/product.aspx?isbn=0132350882"&gt;Clean Code&lt;/a&gt;. SOLID står för fem principer:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Single Responsibility&lt;/li&gt;
&lt;li&gt;Open/Closed&lt;/li&gt;
&lt;li&gt;Liskov substitution&lt;/li&gt;
&lt;li&gt;Interface segregation&lt;/li&gt;
&lt;li&gt;Dependency Inversion&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Dessa begrepp har många gånger förklarats och diskuterats. Bland annat finns det en hel del referenser till bra podcasts om dem i ett av mina &lt;a href="http://systemutvecklaren.blogspot.com/2010/03/topp-5-podcasts-for-inspiration.html"&gt;gamla blogginlägg&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Man kan då undra vilket värde det finns i att gå igenom dem igen, men jag tänkte för egen del ta tag i att lära mig dem en gång för alla. Hur kan jag applicera dem i mitt vanliga utvecklarliv, som affärssystemsutvecklare? Eftersom jag är ett unit-testing freak vill jag också gräva lite i hur väl de sammanfaller med testbarhet.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Därför börjar vi idag med &lt;b&gt;S -&amp;nbsp;&lt;/b&gt;&lt;a href="http://en.wikipedia.org/wiki/Single_responsibility_principle"&gt;Single Responsibility Principle&lt;/a&gt;&amp;nbsp;(SRP) som definieras såhär&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;blockquote&gt;There should never be more than one reason for a class to change&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (&lt;a href="http://www.objectmentor.com/resources/articles/srp.pdf"&gt;http://www.objectmentor.com/resources/articles/srp.pdf&lt;/a&gt;)&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
En klass ska alltså ha ett enda skäl att ändras. Det klassiska exemplet är en klass "Anställd", som ansvarar för att spara och hämta sig från databasen, räkna ut sin lön och skriva ut en rapport. I ett sånt tillrättalagt exempel är det ju enkelt att se att den har många orsaker att ändra sig. Databasens struktur innebär ändringar. Löneuträkningen innebär ändringar. Rapportformatet innebär ändringar.&lt;br /&gt;
&lt;br /&gt;
Jag tror inte att någon av oss skriver sådana klasser... eller? Ett mer vanligt fenomen är att vi skriver "god-classes", klasser som kan det mesta och lite till. Ett säkert tecken är &lt;i&gt;namnet&lt;/i&gt;. När vi känner oss tvungna att lägga på ändelser som "Service", "Manager" eller "Handler" på vår klass ska vi börja fundera. Vad gör vår klass, &lt;i&gt;egentligen&lt;/i&gt;?&lt;br /&gt;
&lt;br /&gt;
En annan vanlig sak är att vi smyger in infrastruktur lite här och var, som säkerhet och loggning. Många klasser i systemet &amp;nbsp;loggar via en logger och varje klass kollar att användaren är auktoriserad. Ändrar vi på någon av dessa tekniker åker vi dit igen. Här kan &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming"&gt;AOP &lt;/a&gt;vara en lösning, men det är en helt annan diskussion.&lt;br /&gt;
&lt;br /&gt;
Ett enklare sätt att titta på SRP är att börja på metodnivå och sedan arbeta sig uppåt. SRP gäller nämligen även där! Här är det ännu enklare att detektera "smells", tecken på att vårat &lt;b&gt;S &lt;/b&gt;är i fara:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Långa metoder&lt;/b&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;En metod på 300 rader gör troligen mer än en sak. En metod på 10 rader gör troligen färre saker...&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Otydliga metodnamn&lt;/b&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;DoWork() - gör säkert bra saker, men vad?&amp;nbsp;&lt;/li&gt;
&lt;li&gt;UpdateOrInsert() - gör ju åtminstone två saker&lt;/li&gt;
&lt;li&gt;CreateAndRegisterItem() - dito&lt;/li&gt;
&lt;li&gt;CreateItemIfTotalIsNotTooHigh() - ja, kommentar kanske är överflödig...&lt;/li&gt;
&lt;li&gt;Generells sett, undvik &lt;b&gt;if&lt;/b&gt;,&lt;b&gt; and&lt;/b&gt;&amp;nbsp;och &lt;b&gt;or &lt;/b&gt;i metodnamn...&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Metoder med bool parametrar för att styra flödet&lt;/b&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;PrintReport(bool toPrinter) kan ju tydligen skriva ut både till printer och någon annanstans&lt;/li&gt;
&lt;li&gt;PrintReport(bool toPrinter, bool includeDeleted) - mera bools, mera permutationer....&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Metoder som arbetar på flera abstraktionsnivåer&lt;/b&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;En metod som&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;läser fil från disk&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;parsar innehållet&lt;/span&gt;&lt;/b&gt; och agerar därefter utifrån &lt;span class="Apple-style-span" style="color: orange; font-weight: bold;"&gt;affärslogik&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red; font-weight: bold;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;arbetar på flera &lt;span class="Apple-style-span" style="color: orange;"&gt;&lt;b&gt;abstraktionsnivåer &lt;/b&gt;&lt;/span&gt;och gör definitivt många saker...&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;Det enklaste sättet att kolla sig själv är att alltid försöka beskriva &lt;i&gt;exakt &lt;/i&gt;vad metoden gör med enbart namnet. Kan man inte det med enkelhet så luktar det lång väg...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;När man väl förstår metodnivån kan man dra det längre och applicera det på klassnivå. En &lt;b&gt;Parser&lt;/b&gt;&amp;nbsp;klass har ett tydligare definierat ansvar än en &lt;b&gt;FileHandler&lt;/b&gt;. Så att försöka namnge saker &lt;i&gt;exakt&lt;/i&gt;&amp;nbsp;efter vad de gör är gångbart även på klassnivå.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Ett annat tips som Hadi Hariri tog upp i sin session i Göteborg och i sitt eminenta &lt;a href="http://devlicio.us/blogs/hadi_hariri/archive/2010/12/18/srp-as-easy-as-123.aspx"&gt;blogginlägg &lt;/a&gt;är att byta ut parametrarna i sina metoder mot instansvariabler. Kolla sedan hur många metoder i klassen som använder dessa instansvariabler. Är det få har vi låg &lt;a href="http://en.wikipedia.org/wiki/Cohesion_(computer_science)"&gt;&lt;i&gt;cohesion&lt;/i&gt;&amp;nbsp;&lt;/a&gt;i klassen, dvs metoderna hör inte ihop. Arbetar de inte på någon instansvariabel kommer Resharper att vilja göra metoden static. Både &lt;i&gt;cohesion &lt;/i&gt;och static metoder kan vara tecken&amp;nbsp;på att man bör bryta isär till fler klasser.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Det här innebär givetvis att vi kommer få många små klasser med många små metoder. Ett argument mot det kan ju vara att man inte vill hålla reda på så många klasser i sitt projekt. Men väg det mot att få i uppdrag att lösa en bugg i en klass på 1500 rader, eller en metod på 300 rader... Och det där med att hålla reda på löser de flesta utvecklingsmiljöer rätt bra, dessutom med verktyg som &lt;a href="http://www.jetbrains.com/resharper/"&gt;Resharper &lt;/a&gt;är varje klass bara ett CTRL+T bort... Så glöm det!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;Hur påverkar SRP testbarhet?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Att skriva test för en metod med tydlig namn och få rader kod är enkelt.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Att skriva test för en klass med begränsat ansvar innebär troligen färre beroenden och kollaboratörer. Därmed färre saker att isolera i en testmiljö.&lt;/li&gt;
&lt;li&gt;Små klasser = små testklasser = samma nytta för underhåll som för produktionskod.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Sammanfattning&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Håll koll på namn på metoder och klasser. Är det svårt att komma på = varningslampa!&lt;/li&gt;
&lt;li&gt;Håll metoder och klasser korta&lt;/li&gt;
&lt;li&gt;Granska klassens &lt;i&gt;cohesion&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;SRP underlättar testbarhet&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;Det verkar som om jag kan skriva under på S:et i SOLID. Det är en av de enklare principerna att förstå men kan vara lurigt att implementera. Använd några av teknikerna med namngivning eller instansvariabler till hjälp. Ibland går det inte, men jag tycker att vår&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;i&gt;ambition&lt;/i&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&amp;nbsp;är det viktigaste. Att vi förstår att SRP är ett perspektiv att granska sina klasser och metoder utifrån.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;Sådär ja! One down, four to go. Next stop: Open/Closed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Over and out!&lt;/div&gt;&lt;div&gt;[Dagens kodarmusik: &lt;a href="http://open.spotify.com/track/0Q98RvIc9NyCj6pp4lO1rA"&gt;Jochen Miller - Brace yourself&lt;/a&gt;]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-5477539919999310308?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/g8aZ-GHFW5Y/s-och-vad-det-innebar-for-oss-dodliga.html</link><author>noreply@blogger.com (Per)</author><thr:total>0</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2011/02/s-och-vad-det-innebar-for-oss-dodliga.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-6404775168489503413</guid><pubDate>Wed, 08 Dec 2010 21:52:00 +0000</pubDate><atom:updated>2010-12-08T23:23:23.763+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">systemutveckling</category><category domain="http://www.blogger.com/atom/ns#">Dan North</category><category domain="http://www.blogger.com/atom/ns#">komplexitet</category><title>Enkelhet - i all sin enkelhet</title><description>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Hej, jag heter Per och jag är en "complexoholic".&lt;br/&gt;&lt;br/&gt;Okej, det där låter ju lite udda, men jag lyssnade idag på en fantastisk &lt;a href='http://www.infoq.com/presentations/Simplicity-Architect'&gt;föreläsning &lt;/a&gt;av en av mina husgudar, &lt;a href='http://blog.dannorth.net/'&gt;Dan North&lt;/a&gt;. Dan pratade om hur vi utvecklare är beroende av komplexitet, hur vi givet ett ganska enkelt problem gärna gör det mer komplext än det borde vara. Vi är "complexoholics".&lt;br/&gt;&lt;br/&gt;En av de saker jag tar med mig från Dans presentation är att komma ihåg att fråga mig själv: "varför?". När vi, av ren vana, väljer en lösning bara för att ramverket finns och &lt;i&gt;kan&lt;/i&gt; lösa problemet, är det inte alltid det enklaste sättet att lösa problemet. Därför bör vi som utvecklare vara öppna inför varje ny uppgift och inse att den är just det - en &lt;i&gt;ny &lt;/i&gt;uppgift. Bara för att den har vissa likheter med vad vi har gjort förut, är den inte samma som vi gjort förut. Därmed kan vi inte alltid förutsätta att vi ska använda samma verktyg varje gång.&lt;br/&gt;&lt;br/&gt;Dan gav ett exempel på hur han vek sig själv ut och in när han försökte sätta upp ett test på sin befintliga kod. Efter ett bra tags böjande och "bändande" kom en kollega fram och ställde den magiska frågan: Varför? Några svar och fler "varför" senare valde han, istället för att skriva världens mest komplexa test, att ändra koden så att både den och testet blev &lt;i&gt;enklare&lt;/i&gt;.&lt;br/&gt;&lt;br/&gt;Genom att ställa frågan till andra och sig själv öppnar man upp ögonen, tar ett steg tillbaka och inser att man löser fel problem. Komplexa lösningar har oftast en mycket enklare och bättre lösning, det gäller bara att hitta problemets kärna.&lt;br/&gt;&lt;br/&gt;En annan bra sak att ta med sig är &lt;i&gt;&lt;a href='http://en.wikipedia.org/wiki/Timeboxing'&gt;timeboxing&lt;/a&gt;&lt;/i&gt;. Jag skrev i mitt förra inlägg om risken för att spåra ur när man försöker vara &lt;a href='http://systemutvecklaren.blogspot.com/2010/11/att-vara-en-for-bra-scout.html'&gt;en för bra scout&lt;/a&gt;. Den risken minimeras genom att, inför ett problem, ge sig själv en tidsgräns för hur lång tid man har på sig att lösa det. När tiden går ut tar man ett steg tillbaka och tittar ur ett fågelperspektiv och funderar på vad det är som gör att problemet inte är löst.&lt;br/&gt;&lt;br/&gt;Många av dessa saker handlar om att &lt;i&gt;öppna ögonen&lt;/i&gt;, att bryta invanda mönster och ett rätt så improduktivt beroende av komplexitet.&lt;br/&gt;&lt;br/&gt;Sen finns det ju en baksida på att låta enkelheten ta över. Generaliseringar och strävan efter återanvändning är i grunden bra inställningar som vi inte bara ska slänga åt sidan. Ramverk finns för att förenkla och för att skapa en lösning som ser likadan ut överallt. Bara för att en enkel lösning löser problemet innebär inte att vi ska släppa våra kvalitetskrav. Men låter vi oss vara öppna, diskutera med någon annan och ifrågasätta kommer vi långt. Har vi också ett kvalitetsmedvetet, professionellt perspektiv kommer vi ännu längre.&lt;br/&gt;&lt;br/&gt;Att vara utvecklare är fortfarande svårt, men faktiskt bara ännu roligare!&lt;br/&gt;&lt;br/&gt;Over and out!&lt;br/&gt;&lt;br/&gt;Dagens kodarmusik: &lt;a href='http://open.spotify.com/track/5SIaweEVIWbRJKM9iuqqxg'&gt;Within temptation - The heart of everything&lt;/a&gt;
&lt;span id='BB_SIGN_BEGIN'&gt;
&lt;img alt='BlogBooster-The most productive way for mobile blogging. BlogBooster is a multi-service blog editor for iPhone, Android, WebOs and your desktop' src='http://theblogbooster.com/pixel.gif' style='border:none;'/&gt;
&lt;/span&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-6404775168489503413?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/lmf7OErKrbE/enkelhet-i-all-sin-enkelhet.html</link><author>noreply@blogger.com (Per)</author><thr:total>0</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2010/12/enkelhet-i-all-sin-enkelhet.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-1962572172073804452</guid><pubDate>Sat, 27 Nov 2010 10:19:00 +0000</pubDate><atom:updated>2010-11-27T11:21:40.812+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">systemutveckling</category><category domain="http://www.blogger.com/atom/ns#">unit testing</category><category domain="http://www.blogger.com/atom/ns#">kvalitet</category><title>Att vara en (för) bra scout...</title><description>"The good boyscout rule" betyder att man ska lämna lägerplatsen lite bättre än man fann den. Applicerat till mitt område innebär det att man ska snygga till kod man träffar på lite i taget, så att det&amp;nbsp;successivt&amp;nbsp;blir en bättre kodbas. När jag hörde om denna regel i Robert C. Martins bok "Clean Code" lät det ju helt logiskt. Och det är det. Att hela tiden snygga till den kod man springer på gör saker bättre...&lt;br /&gt;
&lt;br /&gt;
Men (ja, det låg väl ett MEN i luften) det finns problem med att tänka såhär.&lt;br /&gt;
&lt;br /&gt;
Som utvecklare slåss jag hela tiden med instinkten att göra om saker. Göra saker bättre. Göra saker rätt.&lt;br /&gt;
Betänk följande situtation och känn om den känns bekant:&lt;br /&gt;
&lt;br /&gt;
Du får i uppdrag att utveckla Feature A. Att göra den rakt upp och ner tar väl någon timme, högst. Men sisådär en kvart in i utforskandet av den befintliga koden har antalet högljudda "nämen va f-n?!" och "WTF!?" blivit så många att du tänker att du kunde gjort det här bättre, snyggare, mer rätt. Ok, du börjar refaktorera. Timme nummer tre in i din omdesign börjar det likna nåt, men det är inte riktigt klart. Bara en stund till... och en till... Till slut har du gjort om designen, men har forfarande inte gjort Feature A klar. Dessutom har du hittat ännu fler saker att göra om och ett antal saker som gör din omdesign omöjlig om inte dessa andra saker också fixas till....&lt;br /&gt;
&lt;br /&gt;
Känns det igen?&amp;nbsp;Här hamnar jag jämt.&lt;br /&gt;
&lt;br /&gt;
Att vara en bra scout som utvecklare kräver en stor dos disciplin. Att kunna göra om &lt;i&gt;lite&lt;/i&gt;&amp;nbsp;i taget. Att inse att allt inte kan göras som du vill. Att släppa ifrån dig saker som &lt;i&gt;inte &lt;/i&gt;är perfekta. Allt för att få jobbet gjort.&lt;br /&gt;
&lt;br /&gt;
Ok, så vi behöver bli bättre på att lägga band på våra kreativa lust och våra utsvävningar. Men samtidigt är våra instinkter om vad som inte är bra säkerligen befogade. På något sätt måste de komma upp och åtgärdas. Bara inte nu. Inte på bekostnad av Feature A. Inte på bekostnad av sprinten eller projektet.&lt;br /&gt;
&lt;br /&gt;
Kanske är hemligheten att lägga en kvart på att beskriva problemet man hittat i den befintliga designen. Dokumentera det, lägg det i teamets backlog och &lt;b&gt;gå vidare&lt;/b&gt;. På det sättet kanske man får ro i den kreativa själen samtidigt som man bibehåller sprinten och projektets fart.&lt;br /&gt;
&lt;br /&gt;
Jag förespråkar inte att man helt bortser från kvalitet, tvärtom. Men rikta insatserna rätt. Exempelvis släpper jag inte på rutiner som unit testing, "clean code" eller "separation of concerns" bara för att trycket är hårt. Det vore bara dumt. Men nyckeln ligger i att ta sig framåt på ett kvalitetsmedvetet sätt utan att helt köra av vägen.&lt;br /&gt;
&lt;br /&gt;
Här ligger vårt paradox:&lt;br /&gt;
Vi måste se målet - gå mot det - men utan att tumma på våra principer.&lt;br /&gt;
Vi måste bibehålla våra principer - men utan att avvika från målet.&lt;br /&gt;
&lt;br /&gt;
Att vara utvecklare är svårt. Men roligt!&lt;br /&gt;
&lt;br /&gt;
Over and out!&lt;br /&gt;
Dagens kodarmusik:&amp;nbsp;&lt;a href="http://open.spotify.com/track/66g6vN9BohunePIp3XBSjq"&gt;Tom Colontonio - Nighthawk (Original mix)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-1962572172073804452?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/3QmIWAZMpWc/att-vara-en-for-bra-scout.html</link><author>noreply@blogger.com (Per)</author><thr:total>3</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2010/11/att-vara-en-for-bra-scout.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-2904317165541063686</guid><pubDate>Fri, 10 Sep 2010 18:28:00 +0000</pubDate><atom:updated>2010-09-10T21:40:26.947+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">silverlight</category><category domain="http://www.blogger.com/atom/ns#">komplexitet</category><category domain="http://www.blogger.com/atom/ns#">.net</category><title>Det vackra i att dölja komplexitet (I'm back!)</title><description>Okej. Det var minst sagt ett tag sen. Strunt i det nu.&lt;br /&gt;
&lt;br /&gt;
Idag avslutade jag dagen på topp. Vi vet ju alla att långt ifrån alla dagar på kontoret slutar så lyckligt. Ibland är man mitt i "zonen" när dagishämtningen pockar, ibland är hemgången en ren lättnad efter en dag fylld av motgångar och trassel. Men idag slutade jag på topp.&lt;br /&gt;
&lt;br /&gt;
Jag har insett att min verkliga fetisch inom programmering är att gömma komplexitet. Att generalisera, parametrisera och göra den där svåra saken EN gång. För att jag sen ska utföra samma åtgärd enkelt och helst med en one-liner. Nu innefattande den lösning vi byggde en klass med tre generiska argument och en konstruktor med ett predikat, en func och en action. Snacka om generalitet.&lt;br /&gt;
&lt;br /&gt;
Ok, ibland gör vi dom där generiska klasserna och snurrorna bara för att polera våra egon. Ibland drar man till med en tenär operation bara för att vi kan. Men det som verkligen ger&amp;nbsp;tillfredsställelse&amp;nbsp;är när man använder dessa kraftfulla konstruktioner &lt;b&gt;rätt.&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
Ibland sysslar vi med copy-paste programmering, vi gör om samma sak om och om igen eftersom det löser uppgiften. Men i de lägena ringer klockan. Här finns chans för generalisering och förenkling.&lt;br /&gt;
&lt;br /&gt;
Jag har jobbat en hel del med Silverlight och MVVM det senaste. I en situation insåg jag att vymodell 2 var till 50% en kopia av vymodell 1. Det var vid tanken att på att skriva exakt samma tester igen eller supporta samma kod på två ställen som gränsen var nådd. Därmed fann jag ett rätt användbart mönster som går att applicera på MVVM med, enligt mig, bibehållen abstraktion.&lt;br /&gt;
&lt;br /&gt;
Om man behöver samma beteende i två vymodeller innebär det med all säkerhet att man har samma beteende i två vyer. Hade detta varit på min gamla WinForms tid hade jag skrikit UserControl för full hals. Ok. Jag skapar en UserControl med det gemensamma beteendet. Nu, för att använda denna UserControl behöver mina vymodeller publicera en 6-7 properties som vyn kan binda till. 6-7 properties i varje vymodell som är duplicerade... RRRRIIIIINNGGG!&lt;br /&gt;
&lt;br /&gt;
Vad jag gjorde var att skapa en delad vymodell för min UserControl som var separat. Denna vymodell innehåller då de properties som behövs. Vymodell1 och Vymodell2 publicerar då bara en property, av den delade Vymodellens typ. Jag sätter DataContext på UserControlen till denna property och voila!&lt;br /&gt;
&lt;br /&gt;
Det som var ännu bättre var att jag lät den delade Vymodellen ta in ett generiskt argument (ok, jag gillar tydligen dom) och därmed kunde operationerna se lika ut medan det som vyn hanterade kunde variera.&lt;br /&gt;
Initieringen av den delade vymodellen kan ta in Func&lt;t&gt; eller Action&lt;t&gt; eller Predicate&lt;t&gt; för att utföra specifika åtgärder. Detta bestämmer ju den vymodell som är host, men den gör det deklarativt och EN gång.&lt;/t&gt;&lt;/t&gt;&lt;/t&gt;&lt;br /&gt;
&lt;br /&gt;
Detta är ett mönster som jag med en gång fann mer&amp;nbsp;användning&amp;nbsp;för. Det har säkert ett namn, det är säkert välkänt och det finns kanske åsikter om dess legalitet... men det funkar OCH det låter mig göra saker EN gång.&lt;br /&gt;
&lt;br /&gt;
Låt gå för att denna post kanske var lite mer low-level än annars. Låt gå för att den skulle innehållit kodexempel istället för "lilla sagan om koden". Låt gå. För nu skriver jag av mig tankar igen och det känns grymt!&lt;br /&gt;
&lt;br /&gt;
Over and out!&lt;br /&gt;
&lt;br /&gt;
[Dagens kodarmusik:&amp;nbsp;&lt;a href="http://open.spotify.com/track/4LyKbOhh4C7z9SbEHcluFn"&gt;RAMsterdam - Jorn van Deynhoven remix edit&lt;/a&gt;]&lt;br /&gt;
&lt;br /&gt;
Ps. Jag hörde att Silverlight 5 är på gång. Kan det vara sant? Hur fort ska vi byta versioner egentligen! Ds.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-2904317165541063686?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/RQ1XL4YnqiU/det-vackra-i-att-dolja-komplexitet-im.html</link><author>noreply@blogger.com (Per)</author><thr:total>0</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2010/09/det-vackra-i-att-dolja-komplexitet-im.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-8015351750107354267</guid><pubDate>Mon, 22 Mar 2010 18:36:00 +0000</pubDate><atom:updated>2010-03-22T19:45:52.918+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">podcasts</category><category domain="http://www.blogger.com/atom/ns#">unit testing</category><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">Hanselman</category><category domain="http://www.blogger.com/atom/ns#">roy osherove</category><title>Topp 5 podcasts för inspiration!</title><description>&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;De senaste månaderna har jag varit en storkonsument av podcasts. Framförallt har det varit Hanselminutes, .Net Rocks, Herding code och MSDN Radio. Med tanke på all den tid jag lägger på pendling och renovering är just podcasts i hörlurarna ett fantastiskt medium.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Det finns såklart avsnitt som är sådär. Avsnitt som handlar om ämnen långt utanför mitt intresse och utanför vad jag riktigt begriper. Men så ibland dyker de upp - guldkornen. Avsnitt jag kan lyssna på igen, avsnitt som verkligen väcker inspirationen och öppnar ögonen.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Jag tror mycket på att vi utvecklare kan tjäna mycket på att dela med oss av det vi kan till varandra. På det sättet kan vi alla växa och göra branschen bättre. Mitt bidrag här och nu är att dela med mig av några riktiga ess bland podcast-avsnitt.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://hanselminutes.com/default.aspx?showID=187"&gt;1. Hanselminutes, avsnitt 169: Roy Osherove on The Art of Unit testing&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Roy har blivit en av mina hjältar. Han brinner verkligen för unit testing och kan, till skillnad från andra jag hört, verkligen förklara det på en bra och detaljerad nivå. Jag hade dessutom nöjet att se Roy på SDC 2010 där han drog in en humoristisk växel som podcast avsnittet inte visade. Han har vanan att sjunga en liten sång efter sina föredrag där han satt ny text till kända låtar. Vad sägs om "Please don't code tonight" till tonerna av Guns 'n roses "Don't cry"? Tydligen fanns det en utvecklare i hans team med vissa brister... kanske finns den på youtube någonstans...&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Men det här avsnittet av Hanselminutes är ett måste för alla oss utvecklare som inte riktigt har kommit igång med unit testing. Kanske också för de som&amp;nbsp;&lt;b&gt;har&amp;nbsp;&lt;/b&gt;kommit igång, men som ändå inte har fattat...&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;blockquote&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Imagine the person reading your tests is a serial killer. You don't want to piss him off.&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;- Roy Osherove, SDC 2010&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=476"&gt;2. .Net rocks, avsnitt 476: Is software development too complex?&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Detta är en paneldebatt från konferensen Devlink, där panelen diskuterar hur svår och komplex verkligheten är för oss utvecklare. Jag fastnade mycket diskussionen kring hur vi utvecklare ställs inför högt ställda krav på att förstå och anamma ny teknik i en rasande fart. Det här avsnittet har diskuterats en hel del efteråt i andra avsnitt och är definitivt ett man inte ska missa!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=520"&gt;3. .Net Rocks, avsnitt 520: Catching up with Juval Löwy&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Alltså, Juval... det är en snubbe med rejäl hjärnkapacitet! Här börjar de i en diskussion om Juvals tes "Every class should be a WCF service". Bara att reda ut vad han menar med det gör det här avsnittet riktigt intressant. Sen hjälper det också att intervjuarna Carl och Richard ifrågasätter Juval rätt spydigt... På det hela taget ett mycket bra avsnitt om hur vi utvecklare lägger så mycket tid på "plumbing" och så lite på verklig affärsnytta.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://hanselminutes.com/default.aspx?showID=163"&gt;4. Hanselminutes, avsnitt 145: SOLID principles with Uncle Bob&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Bara att Uncle Bob är med borgar för bra innehåll, men här tar han upp sina SOLID principles och förklarar dem på ett bra sätt. Om du inte vet vad SOLID är - lyssna! Om du vet vad de är - lyssna ändå, Uncle Bob pratar om dem på ett så självklart vis att du kanske förstår ännu bättre. Avsnittet satte igång en rätt hetsig debatt mellan Bob och snubbarna bakom&amp;nbsp;&lt;a href="http://blog.stackoverflow.com/"&gt;Stack overflow&lt;/a&gt;. Därav blev det en uppföljare med Uncle Bob i avsnitt&amp;nbsp;&lt;a href="http://hanselminutes.com/default.aspx?showID=168"&gt;150&lt;/a&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=470"&gt;5. .Net rocks, avsnitt 470: Nate Kohari on the Zen of project management&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Titeln lockade inte först, men det här handlar om lean inom systemutveckling. Nate tillhandahåller en produkt som stödjer "Kanban boards" som en tjänst på Internet. Det intressanta är kanske inte hans produkt utan hela diskussionen kring lean och hur det förhåller sig till agile och scrum. Jag hade inte riktigt koll på begreppen "lean" och "kanban" före jag lyssnade, men nu fattar jag det hela lite bättre. Det gör du också om du offrar 45 minuter!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Det var de fem jag tänkte tipsa om nu. Men det finns många fler som är väl värda sin knappa timma.&amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Over and out!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Dagens kodarmusik:&amp;nbsp;&lt;a href="http://open.spotify.com/track/7uOqItg25qRArZCuZocueC"&gt;In Flames - Moonshield (C64 Version)&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-8015351750107354267?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/U4DpVtwG-I0/topp-5-podcasts-for-inspiration.html</link><author>noreply@blogger.com (Per)</author><thr:total>1</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2010/03/topp-5-podcasts-for-inspiration.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-663935714159919426</guid><pubDate>Tue, 02 Mar 2010 20:36:00 +0000</pubDate><atom:updated>2010-03-03T06:39:07.614+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">systemutveckling</category><category domain="http://www.blogger.com/atom/ns#">.net</category><title>Prestationsångest och vikten av engagerade utvecklare</title><description>WCF, Entity Framwork, MEF, Prism, AJAX, REST, WPF, Silverlight, oData, RIA Services....&lt;br /&gt;
&lt;br /&gt;
Visst har du använt alla teknikerna ovan?&lt;br /&gt;
Okej, inte det. Men du VET vad alla går ut på eller?&lt;br /&gt;
Nähä! Varför inte då? Det vet ju alla .NET utvecklare, eller?&lt;br /&gt;
&lt;br /&gt;
Nä. De allra flesta av oss har inte koll på alla nyheter som dyker upp inom .NET området. Det är helt enkelt en massiv flod av nya tekniker som sköljer mot oss. Lyssnar man på podcasts eller läser tidningar låter det som om ALLA är helt uppe i senaste 4.0 ramverket och allt vad det innebär, fastän det egentligen inte ens har släppts. Det skapar en hel del prestationsångest för oss vanliga dödliga utvecklare.&lt;br /&gt;
&lt;br /&gt;
Vilket ansvar har jag egentligen för att ta till mig all ny teknik? Om jag jobbar på ett företag som levererar mjukvara vars säljargument är "alltid först med det senaste inom teknik" är det säkerligen en företagspolicy. Det kommer då vara en organisation som ser det som helt normalt att hela tiden hänga med. Men jag tvivlar på att de allra flesta arbetar på det företaget. Många arbetar i organisationer där IT och mjukvara bara är ett verktyg för att hjälpa företaget med dess egentliga brödföda. Hade de kunnat driva verksamheten utan IT hade det varit det bästa, men av många skäl måste de ha IT system. Om man, som jag, sitter på just ett sådant företag är ansvaret mycket otydligare. Ansvaret ligger då på oss utvecklare att hela tiden hänga med i utvecklingen.&lt;br /&gt;
&lt;br /&gt;
Men det finns ju egentligen inget självändamål med att anamma nya tekniker bara för att de är nya. Men om vi inte sätter oss in i dem och förstår dem ser vi inte heller den potential som de kan ge. Vi kanske levererar lösningar som fungerar, de kanske till och med fungerar bra. Men de kunde varit enklare att underhålla, enklare att förändra eller mer användarvänliga om vi valt en ny modernare teknik. Om vi drar på oss skygglappar och fortsätter oförändrat blir vår teknik snart föråldrad och vi målar hjälplöst in oss i ett hörn.&lt;br /&gt;
&lt;br /&gt;
Så min fundering är: Inser dessa företag vilket ansvar som ligger på oss utvecklare? Är de beredda att betala för den tid det tar att bara utvärdera och hänga med i det ständigt pulserande flödet? Jag tror att svaret är nej på båda frågorna.&lt;br /&gt;
&lt;br /&gt;
Enligt min erfarenhet kommer ansvaret falla på en eller ett par tongivande utvecklare som på fritiden, av rent intresse, läser om eller söker information om nya tekniker. Det handlar om eldsjälar som av ren lust slänger ihop en WPF applikation bara för att se hur det funkar. Eller om den som plöjer böcker om WCF istället för romaner innan nattlampan släcks. Jag tror att de flesta små utvecklingsavdelningar är beroende av dessa få personer. Och inte nog med det, de är beroende av att dessa få är villiga att sprida sin entusiasm och nyfikenhet vidare som kunskap till de övriga på avdelningen. Är det rimligt att ställa sådana krav på anställda? Troligen inte. Men dessa personer gör det ändå, för att det är roligt helt enkelt!&lt;br /&gt;
&lt;br /&gt;
Tidigare var jag absolut inte den personen. Jag var nöjd och glad med att hacka på i det som fanns och hade tillräcklig utmaning med att förstå det vi sysslade med just då. Men jag har förändrats. Jag har börjat lyssna på podcasts eller läsa böcker på väg till jobbet. Att veta lite mer om det som finns omkring mig är riktigt spännande och sätter många saker i nya perspektiv. Kanske är jag på väg att bli en av "dem", kanske är det bara en fas som "kunskapssvamp"...&lt;br /&gt;
&lt;br /&gt;
Men att bli varse om vad som finns är egentligen det som leder till den största prestationsångesten. Att veta om vad som finns och hur kort man kommit i jämförelse till allt det andra är värre än att bara hänga med i det man just nu gör. Men glöm det! Det är okej att vara den som "bara" hänger med, det passar inte alla att vara eldsjäl eller evangelist. Vi behöver alla utvecklare! Vi behöver de som är mer fokuserade på verksamhet, är specialister på våra befintliga system och de som "bara" hänger med. Tro mig, det är svårt nog ibland.&lt;br /&gt;
&lt;br /&gt;
Så med det sagt -&amp;nbsp;Hatten av till alla er evangelister, eldsjälar och "überstormmeisters" där ute och en&lt;br /&gt;
personlig hatt till Olausson &amp;amp; Olsson, två exempel på kunskapsspridare jag mött i min karriär.&lt;br /&gt;
Ni regerar!&lt;br /&gt;
&lt;br /&gt;
Over and out!&lt;br /&gt;
&lt;br /&gt;
Dagens kodarmusik: &lt;a href="http://open.spotify.com/track/4qBIDl6gI65GAF9xM5UZ9V"&gt;Jochen Miller - Lost Connection&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Ps. Jag skulle gärna vilja veta hur andra företag gör, vad driver er teknikutveckling inom systemutvecklingsområdet? Ds.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-663935714159919426?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/nwrMk6QZ4Uc/prestationsangest-och-vikten-av.html</link><author>noreply@blogger.com (Per)</author><thr:total>2</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2010/03/prestationsangest-och-vikten-av.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-6157281031744146175</guid><pubDate>Sat, 06 Feb 2010 20:37:00 +0000</pubDate><atom:updated>2010-02-08T10:04:51.123+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">systemutveckling</category><category domain="http://www.blogger.com/atom/ns#">Karriär</category><title>Om ambitioner, karriärsval och vår yrkesstolthet</title><description>Nyligen har jag varit inblandad i rekryteringen av nya utvecklare. Förutom insikten om att vi är ganska sällsynta, fick det mig in på ämnet karriärsval och ambitioner.&lt;br /&gt;
&lt;br /&gt;
När jag började plugga systemutveckling 1998 var den gemensamma uppfattningen hos mig och mina klasskompisar att programmering var kul men inte slutstationen. Ju förr man fick dra på sig slipsen och titulera sig projektledare eller något annat flott, desto bättre! Programmering var något man började med för att senare klättra raskt uppåt för att inte alls ha med kod att göra. Tanken då var att någon annan ju skulle koda det vi bestämt, designat eller arkitektat.&lt;br /&gt;
&lt;br /&gt;
Jag minns tydligt mina formuleringar i mina jobbansökningar: "jag siktar på att en dag lyfta blicken från koden och arbeta mera med projektledning". När jag efter mina första fem år som utvecklare sökte nytt jobb menade jag formuleringen mer än förut och tänkte att mina fem år som utvecklare borde ju ge pay off snart!&lt;br /&gt;
&lt;br /&gt;
Nu inser jag hur fel jag hade. Mina första fem år som utvecklare gav pay off, men inte det jag tänkt. Jag blev bättre - på att utveckla, inte projektleda. Varför skulle det vara då självklart att jag som utvecklare skulle nalkas projektlederi? Varför skulle mina fem års programmerande göra mig till en bra projektledare eller, för den sakens skull, ens intresserad av projektledning.&lt;br /&gt;
&lt;br /&gt;
Nu frågar jag mig istället: vad  är roligt och utmanande i mitt arbete? Vad är det som får igång min kreativitet, mitt engagemang och min nyfikenhet? Det är lätt att svara på. Dom stunder jag sitter och programmerar - skapar - är de absolut mest utmanande. Nu, med snart åtta års erfarenhet känner jag mig än mindre fullärd som programmerare än någonsin. Det innebär inte att jag är sämre, bara att jag förstått att allting hela tiden utvecklas. Ju mer man gör sig medveten av vad som finns tillgängligt och vad andra gör, inser man att det finns mycket man inte kan eller inte provat.&lt;br /&gt;
&lt;br /&gt;
Med den bakgrunden, att allting förändras, hur kan vi som programmerare / systemutvecklare då se som självklart att vårt yrke är ett steg mot något annat? Varför kan vi inte bara finna stolthet i vårt yrke och finna glädjen i att bli mer och mer professionella på just det?&lt;br /&gt;
&lt;br /&gt;
Det finns ju två vanliga vägar vi kan välja att gå, som alternativ till att stanna kvar som programmerare / systemutvecklare (vad är skillnaden egentligen, varför skriver jag / mellan dessa titlar?).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Projektledare &lt;/b&gt;innebär ju oftast att administrera. Att hålla koll på projektet, planera tid, följa upp arbete och svettas med kunder. Själva rollen erbjuder ju ingen hands-on med koden direkt. Som projektledare handlar det mer om arbetsledning och administration än utveckling. I mina öron lockar det inte.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Arkitekt &lt;/b&gt;innebär oftast att koden börjar tyna bort från skrivbordet (nivån av försvinnande beror kanske på&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Software_architect"&gt;typ av arkitekt&lt;/a&gt;)&amp;nbsp;och att man mer använder Visio och Outlook som sin utvecklingsmiljö. Visst är det kul att sitta och spåna om lösningar, beskriva dem och eventuellt rita diagram över dem. Men vore det inte trist att inte få skörda frukten och se lösningen växa fram i kod? &lt;a href="http://www.dannorth.net/"&gt;Dan North&lt;/a&gt; pratade på Öredev om arkitektrollen och att det var ett problem att denne ofta inte har kontakt med koden längre. "Code? I am an architecht, can't you SEE my beard?!".&lt;br /&gt;
&lt;br /&gt;
Poängen är inte att dissa dessa andra yrken. Inte alls. Poängen är att se dem som &lt;i&gt;andra &lt;/i&gt;yrken. De behövs och förtjänar all respekt, men de är inte en naturlig följd av ett par år som systemutvecklare. De är yrken man kan &lt;i&gt;välja&lt;/i&gt;, oavsett om man varit utvecklare eller ej.&lt;br /&gt;
&lt;br /&gt;
Jag har börjat se annorlunda på framtiden. Jag är nöjd med att vara utvecklare, nöjd med att bli bättre på att göra just det. Jag har mycket kvar att lära och är fortfarande gladast när jag får koda.&amp;nbsp;Hade jag varit i en organisation där mitt yrke innebar en serverad lösning som jag, utifrån strikta riktlinjer, skulle koda hade min glädje säkert varit mindre  Jag vill ha mer frihet. Men jag undrar om sådana ställen verkligen finns. Med dagens agila trender krävs vi systemutvecklare att göra mer av allt. Vi är lite projektledare, lite arkitekter och en stor portion programmerare. Därför undrar jag hur många strikt uppstyrda "programmerare" det finns idag.&lt;br /&gt;
&lt;br /&gt;
Tyvärr är ju verkligheten att om man blir för bra på att utveckla kommer man i många fall bli erbjuden steg "uppåt", vilket innebär mindre och mindre av det man är så bra på. Man blir "promoted to incompetence", dvs man skickas uppåt så länge man är riktigt bra på sitt jobb tills man stannar på ett man inte är lika bra på... (Kallas också &lt;a href="http://en.wikipedia.org/wiki/Peter_Principle"&gt;The Peter Principle&lt;/a&gt;). Jag skulle vilja se en framtid där karriärsstegen innebar att bli bättre och bättre på att utveckla. Att få erkännande för sitt kunnande, sina färdigheter och sin kunskapsspridning till andra.&lt;br /&gt;
&lt;br /&gt;
Men okej, visst finns det personer som hittar en alternativ karriär genom att befordras. Men jag vill slå ett slag för att värdera de som är riktigt bra utvecklare. Klappa dem på axeln, ge dem högre lön - men skicka inte alla längre bort från koden.&lt;br /&gt;
&lt;br /&gt;
Vad alla andra väljer att göra i sin karriär är ointressant. Det är vårt eget karriärsval som är det viktiga. Är man glad och nöjd med det man gör och ser en framtid i det - fortsätt med det! Det tänker jag göra. Men här och nu stryker jag "siktar på projektledarrollen" ur mitt CV.&lt;br /&gt;
&lt;br /&gt;
Over and out!&lt;br /&gt;
&lt;br /&gt;
Dagens kodarmusik: Pain of salvation - Road salt (Ja, jag är ett melodifestival-freak)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-6157281031744146175?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/L31IPV04GGU/ambitioner.html</link><author>noreply@blogger.com (Per)</author><thr:total>6</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2010/02/ambitioner.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-2303315370589501946</guid><pubDate>Mon, 01 Feb 2010 11:54:00 +0000</pubDate><atom:updated>2010-02-01T14:56:02.643+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">affärsnytta</category><category domain="http://www.blogger.com/atom/ns#">användare</category><title>Alla vill bidra med något - vad är vårt bidrag?</title><description>Tittade på Skavlan i SVT där filosofen &lt;em&gt;&lt;a href="http://www.alaindebotton.com/"&gt;Alain de Botton&lt;/a&gt;&lt;/em&gt; var med. Alain talade om ämnen från sin bok "the pleasure and sorrows of work". En verkligt intressant man med många spännande tankar. En sak han sa fastnade hos mig: i vårt arbete vill vi alla känna att vi har en mening, att vårt arbete gör skillnad för någon annan. Oavsett hur litet bidraget är gör det oss lyckliga.&lt;br /&gt;
&lt;br /&gt;
Jag har länge funderat över vad vårt bidrag egentligen är. Vi levererar ju något väldigt abstrakt, ettor och nollor. I bästa fall syns vår applikation, men vad bidrar det egentligen till? Svaret är &lt;strong&gt;användarnytta&lt;/strong&gt;.&lt;br /&gt;
Som utvecklare är inte vårt syfte att skapa teknisk briljans, innovation eller smarta funktioner. Vårt syfte är att göra skillnad för våra användare. Ofta hamnar jag själv i diskussioner oim hur vi kunde bygga det ena eller andra på olika sätt för att göra det så tekniskt smart som möjligt. Mindre ofta handlar diskussionen om på vilket sätt användaren skulle komma till gagn.&lt;br /&gt;
Det kan bero på&amp;nbsp;att de flesta av oss sitter ett par led från den nytta vi egentligen förväntar oss. Vi skulle egentligen vilja göra en direkt nytta genom att&amp;nbsp;bidra till företagets välstånd, bättre klimat eller en&amp;nbsp;bättre värld. För de flesta av oss är den direkta nytta vi gör förknippat med hur väl någon annan kan använda vår mjukvara för att göra sin del i kedjan. En användare kan då skapa ett bättre produktsortiment, som sedan kan marknadsföras av marknadsavdelningen som sedan kan säljas av säljledet. Alla har vi vår del i nyttan, det gäller bara att finna vår plats.&lt;br /&gt;
&lt;br /&gt;
Det känns som en lättnad att ha hittat min del i det stora ekorrhjulet. Med andra ord ska användaren bli min bästa kompis framöver, den jag vill göra glad, den jag vill göra mitt bästa för. Självklart måste ett visst mått av teknisk briljans förekonma, både för att göra jobbet på bästa sätt men också för utmaningen, för att polera det professionella egot en smula. Expertkänslan man får av välskriven och vällbyggd mjukvara skapar en professionell lycka. Men det får inte överskugga varför vi egentligen utvecklar. För, lets face it - ingen användare,&amp;nbsp;inget jobb.&lt;br /&gt;
&lt;br /&gt;
Mitt i skrivandet av detta inlägg lyssnade jag på podcasten &lt;a href="http://www.dotnectrocks.com/"&gt;.Net rocks&lt;/a&gt; (som är helt grym, by the way).&amp;nbsp;Man intervjuade &lt;em&gt;&lt;a href="http://www.idesign.net/"&gt;Juval Löwy&lt;/a&gt;&lt;/em&gt;, levande utvecklarlegend och sjukt intelligent snubbe. Han sa något som fastnade, ungefär: Det vi utvecklare producerar hamnar i en av två kategorier. Den ena är affärsnytta. Den andra är "plumbing", rörmokeri, infrastruktur. Användaren bryr sig inte alls om rörmokeriet i mjukvaran, ändå är det där vi gör absolut mest arbete. &lt;br /&gt;
&lt;br /&gt;
Även om Juval hade en annan poäng med uttalandet än just användarnytta, visst låter det bekant? Vår möda ligger mer på &lt;strong&gt;hur&lt;/strong&gt; vi bygger än på &lt;strong&gt;vad&lt;/strong&gt; vi bygger och &lt;strong&gt;varför&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
Jag bjuder gärna in till ett inlägg om hur vi får den andra sidan att se på oss på samma sätt. Att vi är där för att hjälpa, men att vi behöver veta &lt;strong&gt;hur&lt;/strong&gt; vi kan hjälpa.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://computersweden.idg.se/2.2683/1.288348/skarp-dig-it-manniska"&gt;I en artikel i Computer Sweden&lt;/a&gt; förra veckan tyckte&lt;em&gt; Lars Dahmén&lt;/em&gt; att vi skulle sätta oss bredvid användarna i lunchrummet. Det låter som en bra idé. Leta upp en användare, bjud på en kopp kaffe och fråga vad du kan göra för honom/henne! Jag tror det kan vara&amp;nbsp;början till en vacker vänskap...&lt;br /&gt;
&lt;br /&gt;
Over and out!&lt;br /&gt;
&lt;br /&gt;
Dagens kodarmusik: &lt;a href="http://open.spotify.com/track/0uOQbbJxywwzF1BaHx9ohy"&gt;Signum - Push Through (Edit)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-2303315370589501946?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/aA1KZK-yYSQ/alla-vill-bidra-med-nagot-vad-ar-vart.html</link><author>noreply@blogger.com (Per)</author><thr:total>4</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2010/02/alla-vill-bidra-med-nagot-vad-ar-vart.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-1704560260591595182</guid><pubDate>Tue, 19 Jan 2010 21:58:00 +0000</pubDate><atom:updated>2010-01-20T11:13:04.899+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ADB</category><title>Fast i databehandlingsträsket!</title><description>Förr i tiden kallades vårt yrke för ADB. På 80-talet innebar det &lt;b&gt;Automatisk &lt;/b&gt;Databehandling, på 60- och 70-talet &lt;b&gt;Administrativ &lt;/b&gt;Databehandling.&lt;br /&gt;
&lt;br /&gt;
För de allra flesta i min generation känns termen ADB som uråldrig. Det luktar lite gammal 70-tals inredning och farbröder med skägg som snackar Turing-maskiner och hackar maskinkod eller lämnar in hålkort för kompilering. Tyvärr känner jag dessa dagar allt för väl igen mig i den ursprungliga innebörden av förkortningen - administrativ databehandling. &amp;nbsp;För den senaste tiden har större delen av min arbetstid gått åt till att just &lt;b&gt;administrera data&lt;/b&gt;. Gräva fram och tillbaka i databaser för att manuellt ta reda på information, påverka information eller rätta till information. Det är inte ens lite roligt och påminner mig om devisen att "repetitiva uppgifter gör dig dummare". Vart tog utvecklingen vägen? Vart tog arbetet med att utforma smart och effektivt IT-stöd vägen?&lt;br /&gt;
&lt;br /&gt;
Svaret på detta tror jag ligger i två punkter.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;1. För dåliga system&lt;/b&gt;&lt;br /&gt;
Grejen är att hade systemen vi bygger varit snäppet bättre hade man inte behövt leta i obskyr data för att finna lösningen på problem. Antingen hade systemet inte haft problem eller så hade det åtminstone innehållit tillräckliga felsökningsfunktioner för att slippa dataträsket. Då kunde problemen lämnas till användarna som faktiskt äger datan - vilket för mig till nästa punkt.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. Fel ägare på data - fel kultur&lt;/b&gt;&lt;br /&gt;
Som systemutvecklare skapar jag IT-stöd. Det är mitt expertområde. Stödet byggs för användare som av ett eller annat skäl har funnit behov för ett detta stöd. Med hjälp av min applikation ska användaren sköta sin data på ett enklare sätt. Förut kanske användaren hanterade allt manuellt, men nu ska denna alltså föräras ett förstklassigt IT-stöd för uppgiften. Med andra ord - det som systemet hanterar i form av domänbegrepp och data ägs helt och hållet av användaren. Det är sant oavsett om vi bygger ett system eller ej. Jag sitter inte på min kammare och fyller på en massa affärsdata i systemen, det är ju det användaren har tänkt att göra.&lt;br /&gt;
Varför då inte bygga system som låter användaren ta det fulla ansvaret? Jag är inte alls intresserad av vad han eller hon matar in, söker fram eller redigerar. Det är ett arbetsverktyg, men det är inte mitt arbetsverktyg.&lt;br /&gt;
&lt;br /&gt;
Kulturen runt omkring oss, iallfall runt mig, andas ibland en form av "expertstämpel" på oss systemutvecklare. Vi blir någon slags mytomspunna orakel med allsmäktig kunskap - om allt. Givet den rollen är det bara vi som har den magiska kraften att på något sätt leta rätt bland den data andra skapar... Passar rätt väl med en bild av skäggig farbror på 70-talet, eller hur?&lt;br /&gt;
&lt;br /&gt;
Nästa gång som du får frågan från en användare om att manuellt gräva i data, fundera över hur du kunde ha undvikit situationen?&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Kan användaren använda befintliga, om än krångliga vägar, för att själv hitta rätt? Är sättet allt för krångligt föds behovet av bättre sätt och vi får nya uppdrag.&lt;/li&gt;
&lt;li&gt;Kan du med enkla medel automatisera sökandet i en ny funktion? På det viset slipper du iallafall leta manuellt varje gång.&lt;/li&gt;
&lt;li&gt;Kan du publicera den nya funktionen till användaren?&lt;/li&gt;
&lt;li&gt;Kan du ta bort felet som orsakar behovet att söka fram data? Är modellen för krånglig, funktionerna bristfälliga eller finns det helt enkelt buggar. "We should fix that"!&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Det är dags att byta kultur. Datorer och IT-system är inte magiska. De är egentligen inte särskilt spännande alls. Det som är spännande är hur vi kan använda dem och låta dem göra nytta för oss.&amp;nbsp;&lt;b&gt;Där&lt;/b&gt;&amp;nbsp;ligger vår expertis, vårt intresse och vår utmaning! Låt oss bli mer IT-avdelning och mindre Data-avdelning!&lt;br /&gt;
&lt;br /&gt;
Over and out!&lt;br /&gt;
&lt;br /&gt;
Dagens &lt;strike&gt;kodar &lt;/strike&gt;ADB-musik: &lt;a href="http://open.spotify.com/track/6MjiVEJy1YVuJNFu72OH61"&gt;Lady Gaga - Bad Romance&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-1704560260591595182?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/Kw2g_mq_pzo/fast-i-databehandlingstrasket.html</link><author>noreply@blogger.com (Per)</author><thr:total>2</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2010/01/fast-i-databehandlingstrasket.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-7407348480833975467</guid><pubDate>Thu, 17 Dec 2009 20:43:00 +0000</pubDate><atom:updated>2009-12-17T21:43:47.278+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Dan North</category><category domain="http://www.blogger.com/atom/ns#">unit testing</category><category domain="http://www.blogger.com/atom/ns#">förändring</category><title>"The pit of despair"</title><description>Nyligen har vi i vårt team gjort en ansats till att göra mera unit tests. Det är en grym känsla när vi alla verkar få samma "tända glödlampa" över våra huvuden, när insikten om att det här är vad vi borde göra slår oss alla samtidigt. Att vara överrens underlättar ju helt klart.&lt;br /&gt;
&lt;br /&gt;
Men vägen till ett bättre och förändrat arbetssätt är motig. Jag har flera gånger den senaste tiden varit på god väg att ta en liten genväg för att slippa ta den jobbiga vägen över unit tests. Jag vet ju självklart innerst inne att vi inte kan fortsätta koda på utan tester, alla de buggar jag kämpat med är ju ett bevis på att något måste bli bättre. Men ändå kryper den gamla vanan fram ibland och man kommer på sig själv att argumentera för att försvara sitt tillfälliga undantag. "Ja men den HÄR grejen kan jag ju inte testa... den är ju trivial och dessutom svinjobbig att testa!"&lt;br /&gt;
&lt;br /&gt;
Som tur är finns det fler än jag i teamet. Hade det bara varit jag hade min monolog enkelt kunnat låtit logisk och ja själv hade säkert accepterat ursäkten för att tillfälligt undvika från planen. Tillfällena hade nog blivit fler... och ännu fler. Till slut sitter man där igen, inte ett dugg bättre och med samma gamla buggar som välkomnar en på morgonen. Men har man människor runt sig som ifrågasätter undantaget (ja ibland räcker det med en tveksam blick för att fånga samvetet...) så blir det inte så.&lt;br /&gt;
&lt;br /&gt;
Nä, det är bara att bita ihop! Under &lt;a href="htttp://dannorth.net/"&gt;Dan Norths&lt;/a&gt; föreläsning på &lt;a href="http://www.oredev.org/"&gt;Öredev&lt;/a&gt; pratade han om "the Satir Change Model". Den beskriver ungefär hur vi hanterar förändring och hur vi tar oss vidare. Det är en stegvis process.&lt;br /&gt;
Steven Smith beskriver den bra &lt;a href="http://stevenmsmith.com/ar-satir-change-model/"&gt;i sin blog&lt;/a&gt;.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_eSzwhDWqptQ/SyqSXv7dSBI/AAAAAAAAABQ/6d4EKtiTmfc/s1600-h/satir_graph.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_eSzwhDWqptQ/SyqSXv7dSBI/AAAAAAAAABQ/6d4EKtiTmfc/s320/satir_graph.gif" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;bild från&amp;nbsp;&lt;a href="http://stevenmsmith.com/ar-satir-change-model/"&gt;http://stevenmsmith.com/ar-satir-change-model/&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I stort går det ut på att vi befinner oss i ett nuläge, trygga i det vi kan, det vi är vana vid och vårt beteende, även om det är ett destruktivt beteende. En förändring introduceras och genast föds ett motstånd mot det nya där vi, medvetet eller omedvetet, motarbetar förändringen. Nästa steg är KAOS. I botten av detta kaos finns "the pit of despair". Nu är vi på botten och har svårt att se hur vi ska kunna ro iland förändringen.&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Men - låter vi oss komma förbi denna grop väntar integrering och nya insikter, när vi ser hur det nya faktiskt hjälper oss i vårt arbete. Och fullföljer vi integreringen väntar ett nytt nuläge där vi förbättrat oss och vant oss vid nya, mindre destruktiva beteenden.&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Tänker jag efter känner jag klart igen mitt eget beteende. Fastän jag var fullt delaktig i initiativet till förändringen har jag gjort motstånd med mina lama ursäkter om att slippa undan. Just nu befinner vårt team sig i gropen och med sprattlande armar försöker vi gräva oss upp. Men att bara inse att det är där vi är hoppas jag är ett bra tecken.&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Det är dags att släppa motståndet och låta kaoset styra ett tag.&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Snart är vi på väg upp igen.&amp;nbsp;Åtminstone lagom till nästa förändring...&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Over and out!&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Dagens kodarmusik: Ingen musik, utan lite &lt;a href="http://www.hanselminutes.com/default.aspx?showID=187"&gt;Hanselminutes med Roy Osherove om Unit Testing&lt;/a&gt;.&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-7407348480833975467?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/o_epGPkLozs/pit-of-despair.html</link><author>noreply@blogger.com (Per)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_eSzwhDWqptQ/SyqSXv7dSBI/AAAAAAAAABQ/6d4EKtiTmfc/s72-c/satir_graph.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2009/12/pit-of-despair.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-4111200833889144750</guid><pubDate>Sun, 13 Dec 2009 19:43:00 +0000</pubDate><atom:updated>2009-12-13T22:40:40.375+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">samarbete</category><title>Dags att spela i samma lag!</title><description>Min uppfattning om vårt yrke, systemutvecklare, har alltid varit att vi gör mer än att knacka kod. Vi gör mer än att designa mjukvaruarkitekturer. Vi löser behov. Vi utvecklar &lt;i&gt;verksamheten&lt;/i&gt; tillsammans med de som arbetar i och med den. Utan dem skulle det inte finnas någon verksamhet, inga behov och inget berättigande för vårt yrkes existens. Tyvärr upplever jag att vi ganska sällan kommer till vår fulla rätt.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Den "färdiga" lösningen på ett fat&lt;/b&gt;&lt;br /&gt;Allt för ofta kommer en färdig lösning till oss från användare eller ledning. Det innebär att någon annan än vi har tänkt ut vilket systemstöd som ska finnas och när det måste vara klart. Vi kommer in allt för sent i processen när viktiga beslut redan är fattade som på många sätt inskränker i vår möjlighet att utöva det vi är bäst på - att utveckla IT-stöd. Om vi redan tidigt fanns med i processen kunde vi bättre förstå skäl och bakgrund till det man vill åstadkomma och kanske finna bättre vägar eller ännu bättre lösningar. Men när man får en färdig lösning finns det oftast varken tid eller mandat för att gå tillbaka och riva upp beslut eftersom någon annan ju redan "vet" att det är den enda och bästa vägen. Sen sitter man som utvecklare och knackar ihop något man egentligen inte tror på.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Två månader på IT-kammaren och sen är det klart&lt;/b&gt;&lt;br /&gt;Ett annat vanligt scenario är att vi IT-människor får allt för fria händer. Vi tolkar lite tunna uppgifter vi fått för att sedan stänga in oss och designa en lösning som ur vårt perspektiv verkar klockren. Tyvärr slutar det ju ofta med väldigt komplicerade funktioner som användarna inte förstår eller tycker fungerar i deras vardag. De vet inte vad de ville ha, men det som levererades var inte rätt. Lösningen har fått för stort IT-fokus. Fundera en stund över den där dialogen du designade med lite väl "data-nära" termer här och var...&lt;br /&gt;&lt;br /&gt;Det här är två ytterligheter, men de pekar båda på samma område där vi allt för ofta brister - &lt;b&gt;samarbete&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Vi måste på ett bättre sätt lyckas använda varandra. De har kunskap om verksamheten och lever i den varje dag. De är beroende av det vi levererar och måste leva med det, varje dag. Vi har kunskap om hur man gör bra IT-stöd, hur man kan samverka med befintliga lösningar och vilka tekniker som är aktuella idag. Var för sig kommer vi till korta, men tillsammans har vi ju en rätt bra laguppställning. Vi täcker ju in alla väsentliga områden! Vore det då inte bättre om vi blev lite mindre &lt;b&gt;DE &lt;/b&gt;och lite mera &lt;b&gt;VI&lt;/b&gt;?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;VI&lt;/b&gt; jobbar gemensamt eftersom vi har ett gemensamt mål, en verksamhet som fungerar bra och presterar på topp. Genom att utnyttja våra olika kompetenser och roller på bästa sätt kan vi få mycket bättre effekt och undvika feltolkningar. &lt;b&gt;VI &lt;/b&gt;är större än meningslösa motstridigheter, vi bryr oss om vårt gemensamma arbete och vårt gemensamma resultat. Det spelar ingen roll vem eller vad som är skälet till att något inte fungerar eller brister, vi har ett gemensamt ansvar för att få det att fungera.&lt;br /&gt;&lt;br /&gt;Det här är några punkter jag tänker arbeta mer för framöver:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I varje verksamhetsprojekt få med kunskap om IT och möjliga lösningar tidigt&lt;/li&gt;&lt;li&gt;Upprätta en bra dialog tidigt, lyssna - vad är behovet &lt;i&gt;egentligen&lt;/i&gt;?&lt;/li&gt;&lt;li&gt;Leverera små, &lt;i&gt;körbara&lt;/i&gt;, delar av vår lösning regelbundet som vi kan prova gemensamt - på riktigt!&lt;/li&gt;&lt;li&gt;Aldrig mer säga "ok, då fattar vi" och försvinna in på kammaren och tok-koda i 3 månader&lt;/li&gt;&lt;li&gt;Aldrig mer säga "ja den lösningen blev ju sådär, men det var ju de på X fel, så det är inte mitt problem"&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Vi är ett och samma lag. Vi har ett och samma mål.&lt;br /&gt;Så vad är problemet?&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Over and out!&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dagens kodarmusik: &lt;a href="http://open.spotify.com/track/6ppmOGdM7Sn5oIvJSy7X4A"&gt;Europe - New love in town&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-4111200833889144750?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/A7iPzEGqXBs/dags-att-spela-i-samma-lag.html</link><author>noreply@blogger.com (Per)</author><thr:total>0</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2009/12/dags-att-spela-i-samma-lag.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-8338375661899420012</guid><pubDate>Mon, 07 Dec 2009 20:29:00 +0000</pubDate><atom:updated>2009-12-07T21:43:22.987+01:00</atom:updated><title>Unit testing success story!</title><description>Jag var bara tvungen att skriva en liten glädjepost om mitt första riktiga äventyr med unit testing.&lt;br /&gt;
Jag har under de senaste dagarna lagt till några nya funktioner i en grafisk kontroll. Den består i stort av en datagridview med ett antal rader och kolumner. Vissa rader är summor av ovanstående rader, vissa kolumner är summa av radens värden. Alltså, det finns lite relationer raderna och kolumnerna emellan.&lt;br /&gt;
I samband med att jag gjorde de nya funktionerna skrev jag i princip om hela kontrollen och dess affärslogik för att göra den mera testbar. Det verkade som en liten lagom prototyp. Och det var det.&lt;br /&gt;
&lt;br /&gt;
För att bara beskriva läget före min unit testing refactoring, såg det ut ungefär så här:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Inga unit tests&lt;/li&gt;
&lt;li&gt;Grafisk kontroll: Specialhantering för alla typer av rader och kolumner, kontroll mot konstanter och vissa magic numbers. Mycket kontroll av inmatade värden och omvandling från string till int.&lt;/li&gt;
&lt;li&gt;Coordinator: Specialhantering av samma konstanter, 150 rader kod.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Affärsobjekt: Ärvda versioner av riktiga affärsobjekt för att kunna blanda affärsobjekt med rena summeringsrader och kolumner. Konstanter och magiska siffror lite här och där.&lt;/li&gt;
&lt;li&gt;Acceptanstest: Starta applikationen. Prova funktion 1, funkade inte. Ändra lite. Prova igen. Prova funktion 2, funkar! Prova den tredje funktionen, funkade inte. Ändra. Funkar! Prova lite till. Nu funkar inte funktion 1. Osv osv. Nervöst inför releasen... Buggfix redan första dagen.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Och så efter...&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;40 unit tests, all green!&lt;/li&gt;
&lt;li&gt;Grafisk kontroll: Bara hantering av hur cellerna ska se ut, hur de formatteras mm. Hämta värde och skriva värde till och från affärsobjekten sker med en enda enkel metod.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Coordinator: En konstruktor och två properties. Det är allt.&lt;/li&gt;
&lt;li&gt;Affärsobjekt: GUI wrappers som ibland håller referenser till affärsobjekt, ibland inte. Hel uppsatta för att på bästa sätt stödja GUI programmeringen. Och helt testbara!&lt;/li&gt;
&lt;li&gt;Acceptanstest: Allt funkar med en gång! Iallafall ser det ut så...&lt;/li&gt;
&lt;li&gt;Känns grymt bra inför releasen!&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Med andra ord, att skriva unit tests för min lilla funktionsändring gjorde inte bara att jag fick mer förtroende att den fungerar. Det gjorde också lösningen betydligt bättre eftersom en testbar arkitektur helt enkelt är en bra arkitektur. Testbarhet motverkar nämligen "fix-och-trix-lösningar" som jag lätt faller tillbaka till. Tyngdpunkten på funktionerna ligger i affärslogiken. GUI:t hanterar bara grafisk representation.&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Sen kan man säga vad man vill om att jag kanske även utan unit tests borde sett att lösningen... ja...sög.&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Men det är skit samma nu. Med hjälp av en unit testing utflykt och genom att tänka på testbarheten blev det en självklarhet även för mig.&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Att inte skriva unit tests i fortsättningen känns otänkbart. Nu är de här för att stanna, för den känsla jag nu har inför det jag presterat och inför en stundande release är något jag vill vänja mig vid.&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Ett litet citat på vägen, som inte alls har med ämnet att göra, men som var så bra. Andy Hunt sa i sitt keynote på Öredev 2007 på temat "Accidental Complexity", dvs saker som är komplext utan att det egentligen finns skäl till det:&lt;br /&gt;
&lt;blockquote&gt;XML is like kids. They start of small and cute. Then they grow.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
Over and out!&lt;br /&gt;
&lt;br /&gt;
Dagens kodarmusik: &lt;a href="http://open.spotify.com/track/5zuXA4WuwBmGpUqAgX6aDc"&gt;Riva - Time is the healer (Armin van Buuren remix)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-8338375661899420012?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/fvBonpz87Wk/unit-testing-success-story.html</link><author>noreply@blogger.com (Per)</author><thr:total>0</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2009/12/unit-testing-success-story.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-2776044506751733748</guid><pubDate>Sun, 06 Dec 2009 19:11:00 +0000</pubDate><atom:updated>2009-12-07T17:37:35.825+01:00</atom:updated><title>En nybörjares syn på unit testing</title><description>EN sådär 10 år efter branschen är jag igång med lite unit testing. I den nya funktion jag nu ska implementera har jag försökt göra så kompletta unit tests som möjligt. Det är inte lätt.&lt;br /&gt;
Så här långt in i kampen har jag kommit fram till ett par saker:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Använd mocks - på rätt sätt&lt;/b&gt;&lt;br /&gt;
En Mock är ett fake-objekt, som man använder istället för den verkliga implementationen. Man ersätter då alla anrop på en verklig klass med anrop på en mock. Du kan då i testet styra vad din mock ska svara på anrop och på det viset skapa en känd omvärld för ditt test. Generellt sett har jag haft mest användning av mock objekt när det gäller de olika skiktens ställföreträdare och inte så mycket när det gäller affärsobjekt. Till exempel är det lättare att göra en fake implementation av en "ProduktManager", som innehåller funktioner för att hämta och spara produkter än för själva klassen "Produkt" i sig.&lt;br /&gt;
&lt;br /&gt;
Men här märker man direkt om arkitekturen är testvänlig eller inte (läs: bra eller inte...). Om det inte är möjligt att byta ut sina "managers" mot andra implementationer är det svårt att använda mocks. Men om alla användare av managern använder ett interface är det enklare. Om man dessutom använder en instance factory eller en IOC containter (här är jag dock på tunn is) gör det hela lösningen ännu mer testbar.&lt;br /&gt;
&lt;br /&gt;
Sen försöker jag dra gränsen för både mocks och omfattningen av test vid ett skikt. Det innebär att man testar ett skikt i taget och det enda som man "mockar" är skiktet under det skikt man just nu testar. (Phew, hur blev det där egentligen?).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_eSzwhDWqptQ/Sxv38ia1B0I/AAAAAAAAAAk/yVD01NqY7nU/s1600-h/EnkelArkitektur.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_eSzwhDWqptQ/Sxv38ia1B0I/AAAAAAAAAAk/yVD01NqY7nU/s320/EnkelArkitektur.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;Så, för att förklara:&lt;br /&gt;
Om jag ska skriva ett test för en &lt;i&gt;coordinator&lt;/i&gt;, kommer jag att ge den en eller flera mocks för de &lt;i&gt;managers &lt;/i&gt;den använder. På det sättet ger jag den klass jag använder givna förutsättningar. Inget konstigt så långt. Där drar jag gränsen för testet. Repository skikten är aldrig inblandat i testet. Inte heller GUI. Det gör testet mindre, mer fokuserat och enklare att skriva.&lt;br /&gt;
&lt;br /&gt;
Behovet av att använda mocks för andra objekt, som entiteter har jag ännu inte riktigt utrett. Det jag har märkt är att det kan hjälp att skapa enkla metoder för att &lt;i&gt;fylla på &lt;/i&gt;de riktiga affärsobjekten med testdata. Men jag använder då i vilket fall det &lt;i&gt;riktiga affärsobjektet. &lt;/i&gt;Men vem vet, kanske din hjälpfunktion är en indikation på att du behöver den även i produktionskoden?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ett sätt att bemästra GUI tester... lite&lt;/b&gt;&lt;br /&gt;
Hur man testar GUI är ett problem för mig. Men jag har hittat en utväg. Gör GUI:t dummare.&lt;br /&gt;
&lt;br /&gt;
Med en coordinator (som i vårt fall är den GUI pratar med) som levererar så färdig information som möjligt kan man lägga mer kod i den mycket mer testbara coordinatorn. Att tänka på vad som är enklast att hantera för ett GUI, och bygga coordinatorn efter det, gör skillnad.&lt;br /&gt;
&lt;br /&gt;
Funktioner som exempelvis tar in strängvärden kan man evaluera om värdet var giltig integer eller ej i coordinatorn. Sen får GUI:t hantera det som den vill, men problemet kommer inte sprida sig vidare eftersom vi med tester i coordinatorn sett till att alla felaktiga värden hanteras korrekt.&lt;br /&gt;
&lt;br /&gt;
Ett annat bra sätt är att helt ta bort null-problematiken för GUI:t. Låt aldrig coordinatorn returnera null, utan istället en tom lista, tom sträng etc. Kanske är det till och med så att vi borde skapa &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;VårKlass.Empty&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;för att alltid ge tillbaka något. Hur många &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;NullReference &lt;/span&gt;&lt;/span&gt;problem har man inte fått...&lt;br /&gt;
&lt;br /&gt;
Vid databindning i en DataGridView, använd antingen &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;CellValueNeeded &lt;/span&gt;&lt;/span&gt;och &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;CellValuePushed &lt;/span&gt;&lt;/span&gt;som pekar på &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;GetValue(...)&lt;/span&gt;&lt;/span&gt; i coordinatorn och &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;SetValue(...)&lt;/span&gt;&lt;/span&gt; i coordinatorn. Eller, vilket oftast är ännu bättre, skapa tillrättalagda, testbara GUI objekt com är gjorda för databindning.&lt;br /&gt;
&lt;br /&gt;
Kontentan är att GUI:t ska vara så dumt som möjligt! Då slipper vi komma på obskyra sätt att testa det med unit tests. Då kan GUI:t testas manuellt utifrån användbarhet och inte för att hitta buggar med vad jag ibland kallar för "Happy testing". Klicka här, klicka där... klicka lite här.... Ja du vet vad jag pratar om.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Håll testerna rena och tydliga&lt;/b&gt;&lt;br /&gt;
När TDD förespråkarna gav oss utvecklare fribrev vad gäller dokumentation hurrade nog inte bara jag. "Jag skriver kod istället för dokumentation - grymt!". Men då gäller det ju att testerna går att läsa som dokumentation. Här har jag hittat ett par bra tips&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Låt testerna få tydliga namn, hur långa som helst bara de är tydliga&lt;/li&gt;
&lt;li&gt;Uttryck testerna som ett krav eller påstående, som &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;SökningPåOkändProduktGerTomLista&amp;nbsp;&lt;/span&gt;&lt;/span&gt;eller &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;IckeNumerisktVärdeFörAntalPåverkarInteDataOchKastarInteException&lt;/span&gt;&lt;span style="font-size: small;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Undvik onödiga Asserts i testet. Om du har gjort en assert i ett testfall, gör inte om den i ett annat. Till exempel, du har en funktion som alltid ska returnera resultat och inte null. Säkerställ detta i testet&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;HämtaProdukterReturnerarAlltidEttVärde&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: small;"&gt;. &lt;/span&gt;&lt;span style="font-family: inherit;"&gt;I alla andra tester förutsätter man sedan att så är fallet.&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: small;"&gt; &lt;/span&gt;&lt;span style="font-family: inherit;"&gt;Inga &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;if != null&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: small;"&gt;, &lt;/span&gt;&lt;span style="font-family: inherit;"&gt;inga &lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;Assert.IsNotNull&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: small;"&gt;, &lt;/span&gt;&lt;span style="font-family: inherit;"&gt;såvida det inte gäller något specifikt för just det nya testet.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Skapa hjälpfunktioner i din klass som gör komplexa eller otydliga operationer.&lt;br /&gt;
Jag råkade ut föra att jag i många tester behövde hämta ut ett objekt från en &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="font-size: small;"&gt;IEnumerable &lt;/span&gt;&lt;/span&gt;med hjälp av LINQ. Koden blev rätt hårig och var egentligen inte del av testet. Istället för att skapa massa komplex kod i mitt test la jag ut den koden i en hjälpfunktion med enkelt namn. Då ser testet snyggare ut och blir enklare att förstå. Dessutom är det ju inte fel att lägga ett test på hjälpfunktionen också, en gång för alla så att inte heller resultat från den behöver ifrågasättas.&lt;/li&gt;
&lt;li&gt;Använd &lt;i&gt;alltid &lt;/i&gt;möjligheten till att skriva en kommentar till din Assert, alltså en sista inparametern till Assert, inte som en kommentar i koden.&lt;/li&gt;
&lt;li&gt;Skriv &lt;i&gt;aldrig &lt;/i&gt;kommentarer i testkoden. Den ska inte behöva kommenteras.&lt;/li&gt;
&lt;li&gt;Ta utan att blinka bort tester som heter TestMethod1 eller TestaProdukt mm. Vad gör du när ett sånt test fallerar? Nä, dåligt namngivna tester är faktiskt sämre än inga tester, iallafall ur dokumentationssynpunkt.&lt;/li&gt;
&lt;li&gt;Låt dina Asserts återspegla vad testet heter, dvs det ska var tydligt att din Assert testar just det som namnet på ditt test säger&lt;/li&gt;
&lt;li&gt;Klappa dig själv på axeln om du gör ett test med bara EN assert i. Bra gjort!&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Med andra ord - ställ samma krav på testkoden, eller högre(!), som på produktionskod vad gäller tydlighet och format.&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;TDD eller... ?&lt;/b&gt;&lt;br /&gt;
Precis som med Unit tests är det ju inte direkt ett buzzword längre. TDD ha funnits ett bra tag, men jag har inte lyckats ta det till mig än.&amp;nbsp;Jag tycker Uncle Bob är en riktig hjälte med många bra idéer. Jag skulle gärna &lt;i&gt;vilja&lt;/i&gt;&amp;nbsp;känna att TDD är min grej. Du vet väl vad TDD reglerna är?&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: 'Lucida Grande', 'Bitstream Vera Sans', 'trebuchet ms', verdana, tahoma, arial, sans-serif; font-size: 13px;"&gt;You are not allowed to write any production code unless it is to make a failing unit test pass.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Lucida Grande', 'Bitstream Vera Sans', 'trebuchet ms', verdana, tahoma, arial, sans-serif; font-size: 13px;"&gt;You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: 'Lucida Grande', 'Bitstream Vera Sans', 'trebuchet ms', verdana, tahoma, arial, sans-serif; font-size: 13px;"&gt;You are not allowed to write any more production code than is sufficient to pass the one failing unit test.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;span style="font-family: 'Lucida Grande', 'Bitstream Vera Sans', 'trebuchet ms', verdana, tahoma, arial, sans-serif;"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;Mitt förfarande för unit tests är just nu trevande och utforskande. Det består i stort i att koda i mindre sjok för att sedan skriva tester i mindre sjok och så börja om igen. Istället för att känna mig missnöjd över att jag ännu inte kör TDD&amp;nbsp;väljer att se det så här: Nu &lt;i&gt;gör&lt;/i&gt;&amp;nbsp;jag tester, det gjorde jag inte förut. Mina kodsvängar är kortare nu och jag tänker hela tiden på testbarheten. Jag är på gång!&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Uncle Bob själv sa sig vara lite skeptisk till TDD först, men blev helt såld på det. Jag gillar ett citat han gav angående insikterna efter att ha givit sig hän till TDD, det säger lite av min känsla också.&lt;br /&gt;
&lt;/div&gt;&lt;blockquote&gt;I can no longer concieve of typing in a big long batch of code hoping it works. I can no longer tolerate ripping a set of modules apart, hoping to reassemble them and get them all working by next Friday.&lt;br /&gt;
- Uncle Bob&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
Over and out!&lt;br /&gt;
&lt;br /&gt;
Dagens &amp;nbsp;kodarmusik: &lt;a href="http://svtplay.se/v/1785404/julkalendern__superhjaltejul/samla_samla"&gt;Supersnälla Silversara - Samla Samla&lt;/a&gt; (okej udda, men den är OMÖJLIG att få ur huvudet!!! Prova - jag vill inte lida själv.)&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Lite länktips&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://www.viddler.com/explore/oredev/videos/108/"&gt;Know Your Units - Kevlin Henney, Curbralan, UK&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.infoq.com/interviews/coplien-martin-tdd"&gt;Coplien och Martin debaterar TDD, CDD och professionalism&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd"&gt;TDD artikel från mästaren själv, Uncle Bob&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-2776044506751733748?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/p4QfGNcYGXo/en-nyborjares-syn-pa-unit-testing.html</link><author>noreply@blogger.com (Per)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_eSzwhDWqptQ/Sxv38ia1B0I/AAAAAAAAAAk/yVD01NqY7nU/s72-c/EnkelArkitektur.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2009/12/en-nyborjares-syn-pa-unit-testing.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-2547061314967249297</guid><pubDate>Fri, 27 Nov 2009 22:12:00 +0000</pubDate><atom:updated>2009-11-28T17:34:54.087+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Dan North</category><category domain="http://www.blogger.com/atom/ns#">Öredev</category><category domain="http://www.blogger.com/atom/ns#">Hanselman</category><title>Videos från Öredev</title><description>Missa inte chansen att se dessa guldkorn från Öredev!&lt;br /&gt;
&lt;div&gt;&lt;a href="http://vimeo.com/7849591"&gt;Dan North - Our obsession with Efiiciency&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;a href="http://vimeo.com/7680468"&gt;Scott Hanselman - Information overload and managing the flow&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://vimeo.com/7721974"&gt;Neal Ford - The Productive Programmer&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Och som en bonus, från ett tidigare Öredev, &amp;nbsp;missa absolut inte&lt;br /&gt;
&lt;a href="http://www.viddler.com/explore/oredev/videos/36/"&gt;Uncle Bob - The renaissance of craftsmanship&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Jag lovar att var och en av dessa är väl värd sina 50 minuter. Garanterat!&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-2547061314967249297?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/SUP2ntSxRUo/videos-fran-oredev.html</link><author>noreply@blogger.com (Per)</author><thr:total>0</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2009/11/videos-fran-oredev.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-8570694834518935542</guid><pubDate>Fri, 27 Nov 2009 20:37:00 +0000</pubDate><atom:updated>2009-11-27T22:45:27.069+01:00</atom:updated><title>Jag vill ha en databas i rött och grönt!</title><description>Alltså det här med automatiska tester är ju "old news" vid det här laget. Ja, att automatiska tester &lt;b&gt;finns&lt;/b&gt; är ingen nyhet, men användningen av det är fortfarande nytt för många av oss, inte minst mig själv.&lt;br /&gt;
Med en kodbas på 100.000-tals rader kod är ett par hundra tester inget vidare facit. Men, nu var det inte det jag funderade på...&lt;br /&gt;
&lt;br /&gt;
Vad jag länge funderat över är hur man testar databasen och DB2 i synnerhet. Det finns ju fina grejer som "Linq to SQL" eller "Visual Studio for Database Developers". Men - det gäller ju allt som oftas SQL Server. Jag har absolut inget emot MSSQL, tvärtom! Men, nu sitter jag inte med Microsoft utan med IBM DB2. Det finns mycket att säga om den, men i vår utvecklingsgrupp har vi efter en del besvärligheter äntligen hittat bra vägar att utveckla mot DB2.&lt;br /&gt;
&lt;br /&gt;
Men att jobba med databaser innebär ju att man, hur man än vänder och vrider på accessen mot den, delar sin applikation i minst två delar. En del kör Stored Procedures med affärslogik (not my flavor...), en del SP's som ersättning mot SQL i koden (smakar bättre) och en del släpper loss med SQL kod blandat med den vanliga källkoden (smakar bäver). O/R mappers eller inte, databasen är en del av applikationen. Att designa och bygga den är en vital del av att bygga applikationen. &lt;br /&gt;
&lt;br /&gt;
Men säg då att man valt SQL i koden, då är väl bara DB:n ett dumt lager? Nä. Det finns fortfarande triggers, referensintegritet, vyer... Så länge man lagt kod i databasen på ett eller anat sätt är det också en del av applikationen och måste på så vis också testas. &lt;br /&gt;
&lt;br /&gt;
Okej. Du har inga triggers och ingen RI (skojar du eller?). Vet du vad, du har fortfarande ett testbehov! Vad händer om du förändrar schemat. Vad händer om du lägger till en kolumn eller byter en datatyp? Vad händer om någon annan gör det utan att du vet om det? Hur testar man att applikationen klarar det? Ofta tror man att "ja, men en sån ändring påverkar ju inte någon annan applikation". Men hur vore det att &lt;b&gt;verkligen &lt;/b&gt;veta?&lt;br /&gt;
&lt;br /&gt;
Nog om behovet. Det finns.&lt;br /&gt;
&lt;br /&gt;
Min önskan är att jag skulle kunna lägga mina tester av databasen tillsammans med testerna av den övriga koden. Att få samma inbyggda Visual Studio stöd för mina tester. Att enkelt kunna testa fram om min nya release gör det den ska i databasen och hur bakåtkompatibel &amp;nbsp;den är.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Att testa att rätt saker händer i databasen&lt;/b&gt;&lt;br /&gt;
Det här ju egentligen rätt elementärt. Du ser till att databasen ser ut på ett visst sätt, att vissa data finns och att andra inte gör det. Du kör din kod. Du kontrollerar att rätt saker hänt.&lt;br /&gt;
Men hur gör man det på ett sätt som låter oss inkorporera det i Visual Studio tester?&lt;br /&gt;
&lt;br /&gt;
Låt oss skapa en struktur av hjälpklasser som representerar databasen vid ett givet tillfälle, ett snapshot. Det rymmer sig extremt mycket information i databasens metadata, så det här kan autogenereras. Egentligen liknar min vision egentligen typade dataset, men med mindre buggar och kanske en aaaning snabbare.&lt;br /&gt;
&lt;br /&gt;
Okej, jag ger mig på ett försök att förklara tanken med lite pseudokod.&lt;br /&gt;
&lt;br /&gt;
Vi tänker oss en tabell med kunder som vi ska testa mot. Vi börjar med att se till att vår testkund inte finns redan.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: small;"&gt;TableCustomer.DeleteIfExists(12345);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Varje tabell har ett antal hjälpmetoder, för att skapa, ta bort eller uppdatera rader. Vi känner till metadatan och vilka fält som är nycklar samt vilka som är NOT NULL. Det gör att vi kan skapa alla möjliga operationer mot databasen automatiskt. Särskilt mycket nytta får vi av de som arbetar mot primärnyckeln (som givetvis INTE behöver vara ett RowId, utan kan vara sammansatt)&lt;br /&gt;
&lt;br /&gt;
När vi väl tagit bort kunden, kan vi köra vår riktiga kod. I detta fall ett anrop på en SP som skapar en kund.&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: small;"&gt;&lt;br /&gt;
// Detta är produktionskoden, ett anrop på en stored procedure&lt;br /&gt;
CustomerProxy.SaveCustomer(12345, "Test Customer", "West street 25", "Waynesburg, PA");&lt;br /&gt;
&lt;br /&gt;
TableCustomer.Row row = TableCustomer.GetByPrimary(12345);&lt;br /&gt;
Assert.IsNotNull(row);&lt;br /&gt;
Assert.AreEqual(12345, row.CustomerId);&lt;br /&gt;
Assert.AreEqual("West street 25", row.StreetAdress);&lt;br /&gt;
Assert.AreEqual("Waynesburg, PA", row.CityAdress);&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
För de av er som ifrågasätter min simpla och uppenbart sunkiga datamodell - grattis! Ni lider av samma skada som jag. Men det är inte det viktiga. På ett enkelt sätt har vi testat att databasen ser ut som vi tänkte oss.Dessutom har vi gjort det med unit tests och testmöjligheterna är autogenererade.&lt;br /&gt;
&lt;br /&gt;
Men vi har ytterligare en vinst: Vi märker när schemat ändras. Om någon skapar nya fält som krävs av kundtabellen kommer vår snapshot inte att fungera. Vår SP kommer inte heller fungera.&lt;br /&gt;
&lt;br /&gt;
Om vi autoskapar vår snapshot varje natt i samband med det nattliga bygget kan vi få med alla de ändringar som skett i databasen. På det sättet kan vårt snapshot hänga med i förändringarna. Då blir det rätt uppenbart om någon ändrat någonting som påverkar våra tester. Efter vårt bygge kör vi ju givetvis vårt stora testpaket och hittar då en eller flera röda "pluppar" i testprotokollet.&lt;br /&gt;
&lt;br /&gt;
Inte nog med det! Om vi inkluderar vårt snapshot med vår release som just nu ligger i produktion så vet vi vad applikationen förväntar sig av databasen. Det gör ju att testerna av releasen direkt smäller om någon släppt en "helt ofarlig ändring". Detta eftersom vi givetvis &lt;b&gt;inte&lt;/b&gt;&amp;nbsp;genererar om releasens snapshot utan kör på det den förutsatte vid releasetillfället.&lt;br /&gt;
&lt;br /&gt;
Eller, ännu bättre! Om vi istället kör &lt;b&gt;två &lt;/b&gt;uppsättningar tester av vår releasekod, en med den gamla snapshoten och en med en helt ny autogenererad snapshot. Då ser vi om vår kod klarar av den nya strukturen. Två sätt att testa samma sak, men ur olika vinkel och på det viset bättre!&lt;br /&gt;
&lt;br /&gt;
Jag vet inte om ni har hängt med på hälften av det jag yrat om eller om det ens verkar vettigt. Jag brinner verkligen för det här ämnet och om allt vill sig väl hoppas jag presentera lite exempelkod vad det lider.&lt;br /&gt;
&lt;br /&gt;
Kanske finns det till och med visst stöd i befintliga lösningar därute:&lt;br /&gt;
&lt;a href="http://db2unit.sourceforge.net/"&gt;http://db2unit.sourceforge.net/&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.theserverside.net/discussions/thread.tss?thread_id=23702"&gt;http://www.theserverside.net/discussions/thread.tss?thread_id=23702&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.anydbtest.com/"&gt;http://www.anydbtest.com/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Vad som än finns i dessa lösningar, är själva idén något jag tror starkt på!&lt;br /&gt;
&lt;br /&gt;
Phew! Dags att släppa vilda databastester för ett tag och ta helg!&lt;br /&gt;
&lt;br /&gt;
Over and out!&lt;br /&gt;
&lt;br /&gt;
Dagend kodarmusik: &lt;a href="http://open.spotify.com/track/13Q2kOuhCXQG9yHBKw7mSt"&gt;C-Quence - Endorphine (Original mix edit)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-8570694834518935542?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/4pTwFoECHO0/jag-vill-ha-en-databas-i-rott-och-gront.html</link><author>noreply@blogger.com (Per)</author><thr:total>0</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2009/11/jag-vill-ha-en-databas-i-rott-och-gront.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-6011992907082085584</guid><pubDate>Thu, 26 Nov 2009 20:57:00 +0000</pubDate><atom:updated>2009-11-27T20:52:25.976+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">daily scrum</category><category domain="http://www.blogger.com/atom/ns#">commitment</category><title>We are the Commitments!</title><description>Ja jag har inte ens sett den där "&lt;a href="http://www.imdb.com/title/tt0101605/"&gt;Commitments&lt;/a&gt;" rullen, men begreppet "Commitment" har jag funderat kring en del.&lt;br /&gt;
&lt;br /&gt;
Att göra ett commitment är att förbinda sig, att förpliktiga sig att göra någonting. Att ställa upp helhjärtat för något och ingå en överenskommelse. Det här är ju en grundbult i all form av planering. Att kunna räkna med vad jag förväntas göra och att jag vet vad jag kan förvänta mig av andra.&lt;br /&gt;
&lt;br /&gt;
Vissa personer är svårare än andra att få ett "commitment" från. Titta bara på hantverkare. Hur många av oss har inte fått "om en vecka" eller "i början av nästa månad" i ansiktet om vi frågat om den snälle rörmokaren/elektrikern/snickaren om han kanske eventuellt möjligen kommer snart?&lt;br /&gt;
&lt;br /&gt;
Jag har mer än en gång raljerat över hur det skulle se ut om vi i IT branschen också gjorde så. För det gör vi väl inte? Vi säger väl alltid en fast tid och levererar väl alltid till den tiden? Vi kan väl enkelt räkna ut hur lång tid en funktion tar att införa?&amp;nbsp;Tyvärr är det ju inte så. Jag tror att det till stor del på brister i våra commitments.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Dela upp saker i mindre uppgifter&lt;/b&gt;&lt;br /&gt;
Att få frågan "hinner du implementera denna funktionen på 3 veckor?" är oftast inte lätt att svara på. Tyvärr brukar jag lite väl snabbt göra ett överslag för att kunna svara "ja" direkt. Man vill ju inte sätta käppar i hjulen för en redan satt deadline och visst fixar man det där? Men en uppgift som tar 3 veckor att göra innehåller ju en hel del detaljer. Därför tycker jag att vi borde vara mer försiktiga med våra commitments och ta med oss en sådan fråga in på kammaren. Där delar man upp uppgiften i hanterbara delar som var för sig blir enklare att planera. Låt vara att det tar ett tag, men när man kommer tillbaka med sitt svar blir det mer säkert. Dessutom kan det självfallet också bli så att man svarar "ja, del 1,2 och 3 hinner jag. Men del 4 kommer inte finnas med". Då får beställaren bestämma sig för att tilldela mer resurser eller acceptera bortfallet.&lt;br /&gt;
&lt;br /&gt;
Detta är en av delarna i Scrum som jag gillar skarpt. Att man avsätter tid i början av varje sprint för att planera, bryta ner och definiera vad man kommer hinna med. Att man faktiskt gräver ner sig lite i början för att kunna ge ett bättre commitment. Sen kan det ju finnas osäkra punkter man dyker på, men då är det ju ypperliga saker att börja med.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Daily scrum&lt;/b&gt;&lt;br /&gt;
Som jag skrev i ett tidigare inlägg är det här med "daily scrums" något jag tror starkt på. Vi har i teamet kommit överrens om vissa saker, vad som ska göras och när det kommer att vara klart. Att varje dag följa upp hur det går är att respektera våra gemensamma commitments. Då märker man tydligt om någon faller efter eller har svårt att klara sitt commitment. Eller förresten, det är ju hela &lt;b&gt;teamet &lt;/b&gt;&amp;nbsp;som gjort ett commitment och de har vi ju alla intresse av att klara av!&amp;nbsp;Att inte följa upp varje dag blir att kasta en överrenskommelse i ett svart hål och sedan få reda på vad som kom ur det där hålet. Jaha, det blev en sån!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Tydlighet i uppdrag och commitments&lt;/b&gt;&lt;br /&gt;
Ska vi kunna ge bra besked till våra beställare måste vi vara tydliga mot varandra, både som uppdragsgivare och som den som utför uppdraget. Allt för ofta pratar vi i lösa termer som "när du har tid" eller "ja, när du känner dig klar med A, kanske du kan titta på B?" Vad är det egentligen man har förbundit sig till i ett sådant läge? Ingenting!&amp;nbsp;Vad kan beställaren förutsätta att du gör? Dito! Lägg till detta att man inte kommunicerar läget på sina commitments dagligen och vilken planering har du?&lt;br /&gt;
&lt;br /&gt;
Det skulle kännas så mycket bättre om jag själv var säker på vad olika kravställare förväntar sig av mig och att jag har varit tydlig med vad jag kommer leverera. Då behöver man inte lägga onödig energi på spekulation, besvikelse eller frustration. Iallafall inte beroende på sina och andras commitments.&lt;br /&gt;
&lt;br /&gt;
Efter att ha skrivit detta inlägg började jag googla lite och hittade ett mycket intressant dokument som beskrev hur agila metoder motverkar teamets problematik. Ett av dessa problem var just "Lack of commitments". Läs gärna &lt;a href="http://www.agilejournal.com/articles/columns/column-articles/889-how-agile-practices-address-the-five-dysfunctions-of-a-team"&gt;How agile practices adress the five dysfunctions of a team&lt;/a&gt;!&lt;br /&gt;
&lt;br /&gt;
Over and out!&lt;br /&gt;
&lt;br /&gt;
Dagens kodarmusik: &lt;a href="http://open.spotify.com/track/1XgMiW7W0YuwQ8lo5B21k5"&gt;Darude - In The Darkness&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-6011992907082085584?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/MNwcFD0zbyY/we-are-commitments.html</link><author>noreply@blogger.com (Per)</author><thr:total>0</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2009/11/we-are-commitments.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-3539112872942992277</guid><pubDate>Thu, 19 Nov 2009 21:36:00 +0000</pubDate><atom:updated>2009-11-27T20:47:14.063+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">vattenfallsmodellen</category><title>Hjälp! Vi har fått en vatten(fall)skada!</title><description>Med hjälp av en konsult och en kollega har jag just insett någonting. Vi är skadade. Eller, i bästa fall är det inte du och jag, utan bara en stor del av vår omgivning som är skadad. Det handlar inte om en fysisk skada eller svininfluensa, det handlar om tydliga&amp;nbsp;symtom av &lt;em&gt;vattenfall-skada&lt;/em&gt;. &lt;br /&gt;
&lt;br /&gt;
Denna skada skapar en icke-kreativ miljö, en stel miljö som har svårt att hantera förändring och initiativ. Den gör att kreativa människor resignerar och&amp;nbsp;riskerar att idéer släcks innan de ens provats. &lt;br /&gt;
&lt;br /&gt;
Var ska vi börja nysta i det här då? Varför inte hos vår gamle vän Wikipedia..&lt;br /&gt;
&lt;blockquote&gt;&lt;strong&gt;Vattenfallsmodellen&lt;/strong&gt; är ett sätt att driva ett projekt, till exempel ett större administrativt datasystem. Tanken är att varje steg ska vara helt klart och bedömas innan man går vidare i nästa steg. Vattenfallsmetoden är mer än 30 år gammal.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
Just det, jag talar om &lt;strong&gt;det &lt;/strong&gt;vattenfallet, &lt;strong&gt;den &lt;/strong&gt;modellen. &lt;br /&gt;
&lt;br /&gt;
Men okej, vad är nytt i insikten om att vattenfallsmodellen inte fungerar? Ingenting såklart. Vi kan till och med lämna hela argumentationen mot vattenfallsmodellen i systemutvecklingsprojekt därhän. Det jag insett går mycket djupare. Det finns nämligen en så djupt rotad vattenfalls-kultur att det återkommer långt utanför systemutvecklingsprojekten. &lt;br /&gt;
&lt;br /&gt;
Har du någonsin fått en kreativ idé, kanske på jobbet, som kännts rätt smart, ganska självklar och riktigt logisk? Du lade fram din idé med en entusiasm man bara finner hos kreativa människor som just satt igång att skapa. Du fick kanske medhåll om att idén var bra och att det verkligen vore något att ta tag i. Man kanske till och med sa "Bra gjort, kör igång direkt så får vi se hur det går!"?&lt;br /&gt;
Då är du lycklig! Jag tror till och med att du är ovanlig.&lt;br /&gt;
&lt;br /&gt;
I allt för många fall skulle din idé försvinna i det allmänna bruset. Men i de fall jag nu tänker på tas din idé om hand efter ett tag. Det tillsätts en utredning där du troligen inte är med, som pågår allt för länge. Det väcker frustration och din idé tappar sitt driv. I andra fall presenterar du en kanon-lösning där du knäckt ett gammalt problem med en riktig innovation. Istället för understöd (och kanske din förväntade ovation) får du avvaktande reaktioner, eftersom ingen vågar tro på dig och din idé. De vet ju inte hur det slutar, de har ju inte analyserat den...&lt;br /&gt;
&lt;br /&gt;
Varför blir det så? Det finns säkert många anledningar, men det här är min teori: Det finns en så utbredd &lt;b&gt;vattenfalls-mentalite&lt;/b&gt;&lt;b&gt;t&lt;/b&gt; hos många människor där man vill veta allting på förhand inte vågar chansa med ett osäkert kort. Det finns ett behov av att utreda varje hörn, specificera och analysera alla delar av lösningen. &lt;strong&gt;Sen &lt;/strong&gt;kan det bli tal om att dra igång.&amp;nbsp;Den entusiasm man kände för sin idé, det engagemang man lagt ner i den försvinner. Dessutom kanske inte den den idé man hade ens är aktuell längre i dess ursprungliga form. Omgivningen har ändrats, du har ändrats och fått en förfinad, kanske ännu bättre idé. Är ni med på vart vi är på väg?&lt;br /&gt;
&lt;br /&gt;
Om vi inför varje förändring&amp;nbsp;ska analysera varje detalj kommer vi aldrig kunna hänga med. Då har vi analyserat klart lagom tills nästa förändring dyker upp.&amp;nbsp;Vi blir som en dålig skidåkare i en svart puckelpist, precis när man tror man fattat dyker nästa skräckinjagande puckel upp...Dessutom kommer allt för många vara upptagna med att analysera och allt för få med att skapa nya innovationer.&lt;br /&gt;
&lt;br /&gt;
Om vi tillät oss att ta språnget tidigare, att våga lita på vår och andras entusiasm skulle mycket vara vunnet. Då skulle vi&amp;nbsp;vårda&amp;nbsp;innovation, kreativitiet och ambition. Det driver utvecklingen framåt och föder innovatörer.&amp;nbsp;Låt gå att vi inte vet exakt hur allting kommer bli, men låt oss starta med det vi vet. En person vi litar på har en "gut-feeling", så kör! Vi lär oss på vägen och tids nog ser vi om vi behöver justera riktiningen, byta spår eller stanna upp. &lt;br /&gt;
&lt;br /&gt;
Jag förespråkar inte att vara ansvarslös, givetvis måste man veta riktningen och målet för att kunna ta sig vidare. Men vad jag efterfrågar är en flexibilitet att ta små steg och att våga ta dem utan att helt ha koll på vart vägen leder.&amp;nbsp;Min 4-åriga dotter kommer ofta på förslag om tokiga pyssel vi ska göra därhemma. Allt för ofta blir det ett nej, eftersom jag redan funderat ut vad som eventuellt kommer inträffa och hur stökigt det kommer att bli. Men om jag vore mera villig att ta en rätt ofarlig risk, kanske jag får chansen att vara med när min dotter lär sig något, utvecklas eller bara får en mysig stund med total uppmärksamhet. Okej, liknelsen mellan projekt och idéer på kontoret och barnens pyssel är kanske lite svag, men tänk efter... innovation och uppfinningsrikedom kanske hör ihop med barnslig nyfikenhet?&lt;br /&gt;
&lt;br /&gt;
Jag tror inte att någon idag &lt;b&gt;vill&lt;/b&gt;&amp;nbsp;påstå att man utvecklar eller arbetar efter vattenfallsmodellen.&amp;nbsp;På frågan om verksamhetens spelsystem är det väl ingen som med gott samvete säger "Vi kör en rak vattenfallare med en projektledare på topp!". Då låter det&amp;nbsp;ju bättre att namedroppa lite "iterativt",&amp;nbsp;"agilt" eller "scrum" istället.&lt;br /&gt;
&lt;br /&gt;
I ett program med en av mina husgudar: "Arga snickaren" var det ett innertak&amp;nbsp;med vattenskador.&amp;nbsp;Personen som ägde huset hade funderat på att måla över fläckarna för att slippa se skiten. Arga Anders sa något i stil med "Ja det kan du ju göra, men om två månader ser det likadant ut igen". &lt;br /&gt;
&lt;br /&gt;
Så länge som vår inställning är vattenfalls-skadad spelar det ingen roll hur agil/iterativ/inkrementell vår systemutveckling är eller sägs vara. Så länge som vi inte främjar människor och deras kreativitet är allt det där bara puts på ytan.&lt;br /&gt;
&lt;br /&gt;
Tack till två herrar Olausson som väckte denna nya insikt.&lt;br /&gt;
&lt;br /&gt;
Dagens kodarmusik: &lt;a href="http://open.spotify.com/track/6sFYRYHH2FMkL5EuybbyY8"&gt;Linkin Park - Crawling&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-3539112872942992277?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/K_rMA5q8w_g/hjalp-vi-har-fatt-ett-vattenfallskada.html</link><author>noreply@blogger.com (Per)</author><thr:total>0</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2009/11/hjalp-vi-har-fatt-ett-vattenfallskada.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-3938238874011013819</guid><pubDate>Tue, 17 Nov 2009 22:15:00 +0000</pubDate><atom:updated>2009-11-17T23:25:19.581+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">daily scrum</category><category domain="http://www.blogger.com/atom/ns#">scrum</category><title>Utnyttja rädslan för att göra bort sig - på rätt sätt.</title><description>&lt;blockquote&gt;"Nothing motivates like the fear of appearing to be an idiot."&lt;br /&gt;
Tyler Jennings, Öredev 2009&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
Vid första anblick låter det kanske negativt, men om man funderar lite mer kan det ju användas på bra sätt.&lt;br /&gt;
&lt;br /&gt;
Visst händer det att man gör saker som inte är prioriterade, kanske för att de är roligare eller för att man fått påtryckningar utifrån. Det händer ju också ibland att man allt för länge ältat ett problem men tjurskalligt gett sig fan på att lösa det på ett visst sätt. Eller varför inte när man underskattat uppgiften men inte vill erkänna att man tidsupskattat fel. Till slut blir det en dålig vana och sen sitter man där, sönderstressad för att klara de uppgifter som egentligen skulle göras på den tid man ursprungligen hade.&lt;br /&gt;
&lt;br /&gt;
Allt det där kan ju fortgå om man får sitta helt ifred utan ifrågasättande. Dag efter dag, vecka efter vecka sitter vi där med en sporadisk fråga om hur det går. När det närmar sig release blir det extra kaotiskt och stressat, men så ska det väl vara? Visst blir det lite sisådär med kvaliteten, men mjukvara är ju komplext, eller hur? Nä. Så ska det inte vara. Det är bara destruktivt.&lt;br /&gt;
&lt;br /&gt;
Men, tänk om man fick frågan &lt;b&gt;varje dag&lt;/b&gt;, fast mera tillspetsad med&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;1. Vad gjorde du igår?&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;2. Vad ska du göra idag?&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;3. Finns det något som hindrar ditt arbete?&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Detta är frågorna man får varje dag med "the daily scrum".&amp;nbsp;Att träffas såhär varje dag tycker jag verkar extremt lovande. Det förhindrar ju att man&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
- Sitter med ett problem som någon annan har lösningen på, dvs inte frågar när man borde&lt;br /&gt;
- Sitter med uppgifter som inte ingår i det prioriterade arbetet, för att man blivit störd med ovidkommande eller för att man helt enkelt gjort något "roligare"&lt;br /&gt;
- Stångar sig blodig på sin lösning utan att någon ifrågasätter den&lt;br /&gt;
- Inser att man inte kommer hinna i tid men frågar ingen så...&lt;br /&gt;
&lt;br /&gt;
Som utvecklare ska man inte se det som ett hot, utan som en möjlighet att bli av med de hinder man eventuellt har för att klara sina uppgiter. Eller som ett tillfälle att hjälpa andra att komma vidare. Allt för att bli bättre, och effektivare. Och om inte det funkar för dig, du vill väl undvika att verka vara en idiot, eller hur?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-3938238874011013819?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/EbWJ8kGFnzU/utnyttja-radslan-for-att-gora-bort-sig.html</link><author>noreply@blogger.com (Per)</author><thr:total>0</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2009/11/utnyttja-radslan-for-att-gora-bort-sig.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-6239419389267031352</guid><pubDate>Mon, 16 Nov 2009 20:35:00 +0000</pubDate><atom:updated>2009-11-27T21:49:32.507+01:00</atom:updated><title>Samtal jag behöver färre av</title><description>Genom att kommunicera med andra lär vi oss saker, producerar vi saker och skapar effektiva samarbete.&lt;br /&gt;
Samtal med andra är ju alltid lika produktivt... eller?&lt;br /&gt;
&lt;br /&gt;
Det finns de samtal, både på jobbet och privat, som verkligen motarbetar allt vad produktivitet innebär. Jag funderade lite kring det där och kom på ett antal scenarier som jag ska jobba med för att hantera bättre framöver.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Samtal med någon som är på väg därifrån&lt;/b&gt;&lt;br /&gt;
Har du någon gång haft en känsla av att den du pratar med bara vill avsluta samtalet? Du vet, när han eller hon blir mer och mer forcerad i sina svar med ena foten&amp;nbsp;bokstavligen&amp;nbsp;utanför dörren? Det har jag. Jag har inget problem med att just mitt ärende har lägre prioritet än något annat, men jag &lt;b&gt;har&lt;/b&gt; problem med när någon, utan engagemang, inleder samtalet. Handlar det då om ett ärende jag känner engagemang för kommer jag troligen avbryta det jag håller på med för att på bästa sätt bidra till diskussionen.&lt;br /&gt;
Efter hand inser man att den investerade energin just slösats bort. Personen egentligen inte har tid med den diskussion, som han eller hon just startade... jag har tappat mitt fokus och när personen gått behöver jag inte bara återfokusera utan också svälja stoltheten och frustrationen över att just ha dragit en utläggning till "void".&lt;br /&gt;
&lt;br /&gt;
Framöver tänker jag försöka på förhand göra klart om personen har tid att snacka om ämnet en stund eller inte. Om inte- &amp;nbsp;inget engagemang, inget fokustapp, ingen förnedring. Vad man kan önska från motparten är att inleda med "Du, kort bara, jag är på väg till X och undrar bara hur det ligger till med Y?".&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Samtal när man själv är på väg därifrån&lt;/span&gt;&lt;br /&gt;
Ok. Jag är inte perfekt. Ovanstående exempel drabbar ju även mig i det omvända. Man triggar igång någon som man inte var beredd på och så står man där som ett fån och lyssnar fastän man för längesedan antingen blivit A - ointresserad eller B - känner att det tar för lång tid. Är svaret A, så är samvetet styrande. Här berättar ju någon något som är intressant för honom eller henne, men inte för mig. Är det en polare, och läget är rätt, kan man ju alltid avbryta med ett "Boooring", men oftast är det någon mindre välkänd. Då blir det till att lyssna helt enkelt. &amp;nbsp;Är svaret B, kan man ju alltid be att få återkomma eller boka en tid för ett "riktigt" samtal om saken.&lt;br /&gt;
&lt;br /&gt;
Nu kanske vi gränsar till något djupare mer medmänskligt... Alla samtal syftar ju inte till att gagna båda, utan för att den som håller utläggning helt enkelt behöver prata av sig och min fråga gav ett välbehövligt tillfälle. Tänker man mer på det viset är det bara att lyssna, engagera sig och känna att man gjort något för någon annan. Men om någon på gång på gång suger in en i sitt nät och "pratar av sig" blir ju oftast tendensen att man går i större och större cirklar runt denne.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Bekräftelsesamtal förklädda till diskussioner&lt;/b&gt;&lt;br /&gt;
Det finns de som gärna vill ha en diskussion om något och på ytan verkar vara uppriktigt intresserad av min åsikt. Egentligen är personen bara ute efter att bekräfta en redan cementerad uppfattning. Man är egentligen inte beredd att diskutera men vill ändå ge skenet av att man är öppen för input. Kanske tänkte denne cementerade åsiktsbärare att åsikten var så självklar att det inte kunde finnas någon annan syn på saken?&lt;br /&gt;
&lt;br /&gt;
Provokation är underskattat ibland. Här finns det verkligen utrymme för lite klädsam provokation. Om man misstänker att det finns en gjuten åsikt kan man ju alltid påstå något i den helt motsatta riktningen bara för att se vad som händer! Antingen avbryts samtalet och man slösar inte bort en massa onödig tid och frustration. Eller, beroende på graden av provokation, kan det sluta i skratt. Risken finns ju också att stämningen blir lite tryckt, men den får man ta... Inte särskilt produktivt, men kanske gör det att personen i fråga inte frågar mig nästa gång det blir aktuellt att polera sitt ego. Kanske sådde jag till och med ett frö av osäkerhet som tvingar fram lite mera eftertanke.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Samtal smittade med "Jag-vet-bättre-än-du-lilla-vän-syndromet"&lt;/b&gt;&lt;br /&gt;
Detta syndrom drabbar de "experter" som ställer frågor som de "vet" svaret på, men ändå frågar för att sedan kunna förklara vad som är fel i det svar man ger. Är ni med?&lt;br /&gt;
Exempel: Svärmor/mamma frågar "Om barnet gråter i sängen efter läggning, tar ni upp det då?". Svarar man då "Ja" så går man i en taffligt preparerad fälla och en lektion följer. Om jag detekterar att jag är på väg i fällan brukar jag återigen prova lite klädsam provokation och svara "Ja, det är klart. Vill barnet upp är det väl klart att man tar upp det! Då får barnet komma upp och får lite godis". Ja det där sista kanske är bordeline spydigt, men att försöka kläda in sina lektioner i fina frågor är ju rätt lågt det med...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Samtal eftersom det är lättare än att tänka efter&lt;/b&gt;&lt;br /&gt;
Vissa personer tar allt för lätt till frågan, kanske under devisen "en vanlig fråga får man tåla...". Att få en fråga en gång eller två är ju okej, men om samma person ställer samma fråga gång blir det lätt störigt. Det är precis som att vissa människor inte sparar något i databasen utan använder andra människor som sin databas. Själva är dom en "tunn klient" någonstans med ganska begränsad hårddisk... för att dra en nördig analogi. Visst kan det kännas bra att vara en viktig kugge som människor frågar ofta, men varje fråga skapar ett engagemang som stjäl tid och energi. Kan jag med mitt svar göra den som frågar mera självständig - kanon! Men att bli databas för en massa klienter är... inte fullt lika kanon. När jag blir tillfrågad nästa gång ska jag försöka ge ett engagemang som just syftar till att slippa frågan nästa gång, inte genom att vara otrevlig utan genom att försöka svara bra. Men det är klart, om det inte hjälper och frågan återkommer gång på gång kanske det finns fog för bara &lt;i&gt;lite &lt;/i&gt;spydighet. Lite bara?&lt;br /&gt;
&lt;br /&gt;
Ett annat exempel, där jag själv lätt faller in, är att fråga som första steg i tankeprocessen. Som att man behöver någon annan som startar upp den egna hjärnan. Ofta sitter man inför en ny design av en systemlösning och med en gång börjar man fråga bordsgrannen: "Du, vad tror du om det här...". Egentligen borde jag själv tänka igenom problemet översiktligt och sedan planera in en kort eller lång session med bordsgrannen. Det kräver ganska liten ansträngning, men dåliga vanor och lättja gör att jag själv ofta gör så här. Dels färgas mina initiala tankar av den jag frågat, dels startar jag en helt oförberedd diskussion som stör bordsgrannen i sitt arbete. Varje liten förberedelse är bättre än ingen... här ska jag bli bättre!&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Vad vill jag egentligen med det här långa inlägget?&lt;/b&gt;&lt;br /&gt;
Okej, jag kanske låter lite bitter och en aning cynisk i mina amatörmässiga socialvetenskapliga analyser. Men min poäng är att vi borde vara ärligare och mer medvetna när vi pratar med andra. Det här handlar om en respekt för varandra och varandras tid. Att engagera någon utan förberedelse eller utan eget engagemang är inte respekt. Att fråga någon fastän man egentligen inte bryr sig om svaret är inte respekt. Att inte känna efter ifall motparten är intresserad utan bara köra på är inte respekt. Det är bara slöseri med tid och människor helt enkelt.&lt;br /&gt;
&lt;br /&gt;
Vilka samtal behöver jag fler av då? Enkelt. De som gör mig glad!&lt;br /&gt;
&lt;br /&gt;
Over and out!&lt;br /&gt;
&lt;br /&gt;
Dagens kodarmusik: Ingen. Min son sover och jag vill för allt i världen inte väcka honom.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-6239419389267031352?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/FRv5mAcdV4g/samtal-jag-behover-farre-av.html</link><author>noreply@blogger.com (Per)</author><thr:total>0</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2009/11/samtal-jag-behover-farre-av.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-4614815249509574443</guid><pubDate>Sun, 15 Nov 2009 18:06:00 +0000</pubDate><atom:updated>2009-11-17T09:09:22.703+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">effektivitet</category><category domain="http://www.blogger.com/atom/ns#">Dan North</category><title>Lästips på ämnet effektivitet!</title><description>Apropå Dan North och hans diskussion kring "efficiency" vs "effectiveness".&lt;br /&gt;
Läs Dans senaste bloggpost (12/11) om en &lt;a href="http://dannorth.net/"&gt;dam i en taxi&lt;/a&gt;!&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; color: #333333; line-height: 18px;"&gt;&lt;span style="font-family: inherit;"&gt;[Dagens kodarmusik:&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;&lt;a href="http://open.spotify.com/track/6JoxpsF0yzjRcZyrPJPfXY"&gt;Lange - Out of the sky&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-4614815249509574443?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/rIaZYNtIPFc/lastips-pa-amnet-effektivitet.html</link><author>noreply@blogger.com (Per)</author><thr:total>0</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2009/11/lastips-pa-amnet-effektivitet.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-2571369623217747530</guid><pubDate>Mon, 09 Nov 2009 07:32:00 +0000</pubDate><atom:updated>2009-11-16T07:45:47.495+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">effektivitet</category><category domain="http://www.blogger.com/atom/ns#">pomodoro</category><category domain="http://www.blogger.com/atom/ns#">fokustid</category><title>Butiken är stängd för Fokustid!</title><description>&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;I helgen har jag arbetat en del hemifrån. Vi har en release som redan nu är försenad, men som bara &lt;b&gt;måste&lt;/b&gt;&amp;nbsp;fram till nästa vecka. Eftersom jag varit själv hemma med mina två barn, den ena en 2-åring med halsfluss, har förutsättningarna inte varit optimala...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Men ändå blir de få timmar jag lagt på hemmaplan 100% mer effektiva än de timmar jag lägger när jag är på kontoret. Till och med när jag jobbat med min son i knäet, med "Dora Utforskaren" på ena halvan av min skärm och Visual Studio på andra halvan har jag lyckats dräpa en massa gamla surdegar som varit kvar.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Även om jag känner mig nöjd med min insats ställer jag mig frågan om varför jag inte kan vara lika effektiv på kontoret. När jag stängde laptopen vid midnatt på lördagskvällen började en idé snurra i min skalle - &lt;i&gt;fokustid&lt;/i&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Jag tror mycket på idén om att begränsa våra kanaler till när det passar oss. Jag har under en tid försökt att begränsa telefonvägen genom att vidarekoppla telefonen och mailvägen genom att bara läsa av mailen vid vissa tider. Men det återstår en viktig kanal -muntlig kommunikation, dvs när någon bara kommer in och börjar prata. Nu föreslår jag inte att vi utvecklare &amp;nbsp;helt stänger in oss i en grotta, dricket Jolt och aldrig pratar med någon. Nej, vi ska helt enkelt &lt;i&gt;styra&lt;/i&gt;&amp;nbsp;när vi öppnar kommunikationen mot omvärlden.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Hur gör vi det då? Jag tänker mig att vi inför &lt;i&gt;fokustid&lt;/i&gt;, tid när vi bara fokuserar på det vi tänkt göra och inget annat. Då får ingen störa, vi svarar inte i telefon eller på mail (såvida det jobb vi för stunden tänkte göra inte är att just ringa eller maila...).&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Givetvis måste akuta saker komma igenom, men hur mycket är egentligen så akut?&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Hur lång fokustid vi har är givetvis individuellt. Kanske är det &lt;a href="http://www.pomodorotechnique.com/"&gt;pomodoro teknikens&lt;/a&gt; 25 minuter, kanske är det mer.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;I mitt fall tänker jag börja med en målsättning om att minst halva dagen ska vara fokustid, dvs fyra timmar. Dessa tänkte jag som första test dela upp i två pass om två timmar. Under dessa två timmar tänker jag råfokusera! Jag tänker dra på ett par lurar, lyssna på lite jobbar-trance (funkar bäst för mig) och stänga dörren till kontoret. Då betar jag av det jag planerat att göra.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;När fokustiden är slut öppnar jag kanalerna igen och kommer upp till ytan igen. Jag tror att folk kommer förstå så länge som man är tydlig med vad man planerar. Man kan inte heller ha fokustid under hela dagen eftersom kommunikation med andra ingår. Så länge som de vet att man återkommer inom två timmar är det väldigt få situationer som jag kan tänka mig där det är så akut att det inte kan vänta. Det här handlar ju lika mycket om att kunna värdera vad som är akut och inte. Även om användare ofta uttrycker sig i form av "bråttom" eller "akut!" så ändrar de sig lätt när man ifrågasätter litegrann. Det visar sig att det är okej att vänta ett par timmar, en dag eller kanske en vecka! Alla som skriker "jag brinner!" gör faktiskt inte det...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Nu är min fokustid-metod inte testad än. Den låter bra på pappret och jag är inte på något vis först med dessa tankar. &lt;a href="http://sv.wikipedia.org/wiki/Scrum"&gt;Scrum &lt;/a&gt;och &lt;a href="http://www.pomodorotechnique.com/"&gt;Pomodoro &lt;/a&gt;har ju tydliga inslag av det här. &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Jag är trött på det eviga "whack-a-mole" spel som jobbet oftast är. &amp;nbsp;Jag säger som Rage Against the Machine - "Take the power back!".&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Over and out!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;[Dagens kodarmusik: &lt;a href="http://open.spotify.com/track/0MrkZz4D3fGlEkhebjPPrh"&gt;Muse - MK Ultra&lt;/a&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-2571369623217747530?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/U8TARjUArlo/butiken-ar-stangd-for-fokustid.html</link><author>noreply@blogger.com (Per)</author><thr:total>0</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2009/11/butiken-ar-stangd-for-fokustid.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8401108360802573439.post-1584010730744785382</guid><pubDate>Sun, 08 Nov 2009 13:42:00 +0000</pubDate><atom:updated>2009-12-01T19:54:07.562+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">effektivitet</category><category domain="http://www.blogger.com/atom/ns#">Öredev</category><title>Mitt första inlägg någonsin...(eller Tack Öredev!)</title><description>&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;b&gt;Tack Öredev!&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Efter att ha kommit tillbaka från den fantastiska utvecklarkonferensen Öredev i Malmö är jag full av nyfunnen inspiration. Talare och underhållare som Scott Hanselman, Dan North och Ze Frank lyckades verkligen få igång mitt tankemaskineri!&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Temat för årets Öredev var &lt;/span&gt;&lt;b&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;effektivitet&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;. Ett rätt utslitet ord, men ju mer jag hörde från olika talare finns det en helt del sunt förnuft i deras tankar.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;a href="http://www.hanselman.com/blog/"&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Scott Hanselman&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt; pratade bland annat om att kunna välja vilka kanaler man har öppna och begränsa frlödet i dessa kanaler. Han pratade en del om hur man organiserar sin mailkorg och definierar automatiska regler för att låta de viktiga mailen stå ut och de mindre viktiga bli något man läser när (och om) man får tid och lust. Att skapa en regel för alla mail där man står som "kopia" är ett extremt bra tips! Den som sätter mig som kopia/CC får helt enkelt vara beredd på att det är ett mail jag kanske inte läser! Klockrent! Ett annat var att separera de interna mailen från de externa. Nyhetsbrev och annat sorteras till sin egen mapp.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Ett mera kontroversiellt tips från Scott var att låta mailklienten vara stängd fram till på förmiddagen/lunchen. Att hela tiden få popups som meddelar om ett nytt mail stör! Vi måste &lt;/span&gt;&lt;i&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;välja &lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;när vår mailkanal är öppen.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Scott, min nya hjälte, hade också tipset om att på sin telefonsvarare tala in "Hej! Det här är inte sättet att nå mig, skicka ett mail istället!". Att på detta sätt kanalisera sin information till ett flöde, istället för flera, känns också som en bra idé!&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Om &lt;/span&gt;&lt;a href="http://www.hanselman.com/blog/"&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Scott Hanselman&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&amp;nbsp;är min hjälte, är &lt;/span&gt;&lt;a href="http://dannorth.net/"&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Dan North&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&amp;nbsp;min nya mentor.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Jag lyssnade på flera av hans föredrag och han är helt lysande. Bland annat hade han en session om "Our obsession with efiiciency". Det handlade bland annat om skillanden mellan "efficiency" och "effectiveness". Jag har lite svårt med att hitta bra översättningar till svenska. Men att vara "efficient" kan sägas vara &lt;/span&gt;&lt;i&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;att göra rätt saker&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;, medan "effectiveness" är &lt;/span&gt;&lt;i&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;att göra saker rätt&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;. Han hade bland annat ett exempel om hur man mäter allt i spenderad tid för att bevisa sin effektivitet, ett rätt korkat sätt. "Ja du hade 4 timmar på dig att göra den här uppgiften, du har gjort 2 av dessa och är således halvvägs färdig nu". Dan drog liknelsen med en bil. Om man vet att bilen drar 1 liter milen och tankar fullt (50 liter) så vet man att den har gått 25 mil när tanken är halvtom. Det säger ju dock inget om att man kanske ställt bilen på tomgång en halv dag och bränt 25 liter på det istället... Med andra ord - vi måste mäta i vad vi faktiskt &lt;/span&gt;&lt;i&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;presterar&lt;/span&gt;&lt;/i&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&amp;nbsp;och inte hur lång tid prestationen tog. Det tål att tänkas på.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Mot bakgrund av det som dessa fantastiska talare pratat om har jag bestämt mig för att göra en ansats till att bli mera effektiv (översätt till mera "effectiveness") i mitt arbete och i min vardag. Scott Hanselman sa "everyone should have their own blog" och jag tänker ta det rådet.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Så därför finns nu denna blogg. Kanske läser någon den, kanske gör ingen det.&amp;nbsp;Men just nu skriver jag den bara i självterapeutiskt&amp;nbsp;syfte.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;Over and out!&lt;/span&gt;&lt;br /&gt;
&lt;i&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;span style="font-family: Georgia, 'Times New Roman', serif;"&gt;&lt;i&gt;"If you think professionals are expensive, consider what amateurs cost!"&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Dan North, Öredev 2009.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8401108360802573439-1584010730744785382?l=systemutvecklaren.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/Systemutvecklaren/~3/dXXmb6uYdA8/mitt-forsta-inlagg-nagonsineller-tack.html</link><author>noreply@blogger.com (Per)</author><thr:total>0</thr:total><feedburner:origLink>http://systemutvecklaren.blogspot.com/2009/11/mitt-forsta-inlagg-nagonsineller-tack.html</feedburner:origLink></item></channel></rss>

