Fantastisk utvecklarvår i Göteborg 2012!

Aldrig förr har utvecklarcommunityn i Göteborg varit så sprudlande som den är nu, iaf om du frågar mig! Till att börja med har vi minst tre rejäla konferenser, tyvärr inte fyra då Nordic Ruby går av stapeln i Stockholm i år. Hur som helst – ovanpå det har vi ju javaforum, nforum och alla user groups på Meetup, liksom SweNug, Alt.net, OWASP och en mängd andra aktiviteter som t ex Göteborgs Agilister och allt som anordnas av DataFöreningen Sverige (DFS).

Att vi har detta utbud i Göteborg tycker jag är kanon! Det ger varje utvecklare en möjlighet att välja själv, att inte bara vara tvingad till att stirra blint på en leverantörs erbjudanden, bara en teknik, bara en grupp – dvs inte bara smalna av och ramla in i “samma gamla hjulspår”, utan verkligen har en möjlighet att bredda sin insikt, kompetens och sitt nätverk.

Det som är än mer glädjande är att i all denna “konkurrens” så har verkligen de flesta user grupper jag varit i kontakt med satt just utvecklarna i första rummet. Det finns ett litet undantag som sätter sina egna ekonomiska intressen före utvecklarna i user groupen och försöker kontrollera informationen som når utvecklarna, istället för att låta medlemmarna själva bestämma vad de tycker. Jag gissar att detta blir uppenbart så småningom och att en ny grupp bildas spontant – som är till primärt för utvecklare, inte ett bolags ekonomiska intressen.
(Min uppfattning är att utvecklare är intelligenta, självständiga individer som är helt kompetenta nog att ta egna informerade beslut, inte få “så här skall du tycka och göra” nedtryckt i halsen. Nåväl, det lär som sagt självregleras inom tid.)

Så, without further ado: här är min lista på vårens toppar i Göteborg 2012!

Konferenser

WebCoast, 16-18 mars, Lindholmen Science Park (en unconference)
Software Passion Summit, 19-20 mars, Clarion Hotel Post (Centralstationen)
Scandinavian Developer Conference, 16-17 april, Svenska mässan (Korsvägen)
dev:mobile, 12 juni, Folkets hus (Järntorget)

User Groups etc

(Dessa har ju återkommande möten och byter emellanåt plats – därav blir datum/adress inte så intressant.)

JFokus – dag 1

No Gravatar

Jag och några kollegor har precis varit på ett fullspäckat JFokus i Stockholm. I år (precis som förra året) höll hela spektaklet hus i Stockholm Waterfront Congress Centre, som ligger mitt i smeten, endast ett stenkast från centralen. JFokus är (om du inte visste det redan) en tre-dagars konferens med stort fokus på Java och allt som snurrar runt Java. Första dagen är en tutorial-dag där fokus läggs på längre sessioner och mer övningar i ett fåtal ämnen. Jag hade inte möjlighet att vara med på detta i år, utan fokuserade mer på dag 2 och 3 så är fullspäckade av väldigt intressanta 15-50 minuterspresentationer.

Även om vi hade en monter på andra våningen (eller var det tredje våningen?) så spenderade jag största delen av min tid på att gå på sessionerna/presentationerna. Konferensen har inga officiella spår (eller fokusområden), men det märktes att vissa ämnen var hetare än andra. Funktionell programmering, concurrency, nitty-gritty-detaljer om JVM:en, persistens i Java och CQRS summerar de områden som jag stötte på under mina två dagar där.

Tyvärr så gick presentationer i fyra rum samtidigt, så jag hann ju inte med att se allt jag ville =( Jag tänkte här gå igenom de presentationer som jag gick på och lite tankar omkring dem. Detta inlägg innehåller första dagens presentationer, så dag 2 kommer i ett annat inlägg.

Keynote – Enterprise Java in 2012 and Beyond – Juergen Hoeller

Den första och enda presentationen jag inte skrev några anteckningar om. Kan bero på att jag inte riktigt förstod vad allt det han pratade om gick ut på. Eller för att det var tidigt på morgonen och kaffet inte riktigt kickat igång min hjärna. I alla fall så var presentationen väldigt seg och innehöll inte så mycket av värde. Tråkigt för att vara en keynote. Det jag kommer ihåg var att han pratade om framtidens enterprise-Java i anslutning till vad Spring-ramverket kan hjälpa till med.

A JVM does what? – Cliff Click

En djupdykning om hur JVM:en fungerar idag, hur den kanske borde ändras om för att bli bättre och vad som borde läggas till för att bli effektivare. Han gick igenom några “magiska” saker som JVM:en ger oss som vi ofta inte tänker på att vi har; illusionen om oändligt med minne, att bytecode-exekvering är snabbt, en konsistent minnesmodell (oavsett underliggande hårdvara), konsistent trådningsmodell (samma sak här) och att lås är snabba. Rätt djupa saker, men intressanta. Sedan kom han in på saker som vi tror att JVM:en har men som inte stämmer. En ögonbrynshöjare var att trådprioritering nästan aldrig fungerar på Linux. För att du skall kunna ändra prioritet på Java-trådar under Linux måste ditt program köras som root och hur ofta händer det?

Java 7 – State of the Enterprise – Markus Eisele

Presentation om hur du får in Java 7 i din produktionsmiljö. Java 7 släpptes ju i slutet på juli och har haft lite tid att mogna, men än har inte många valt att gå över till Java 7 i sina produktionsmiljöer. En sak jag inte visste var att Java 6 har sin EOL (End Of Life) i november i år, vilket faktiskt pekar på att vi borde gå över till Java 7 så fort vi bara kan. Enligt en undersökning som Markus visade siffror från i sin presentation har endast ~17% gått över till Java 7 och ungefär hälften har inte ens en plan på att överhuvudtaget uppgradera. Detta är lite skrämmande.

Han gick också igenom några steg som man bör tänka på när man skall uppgradera. Sammanfattningsvis innebar de att testa att din kod + tredjepartsberoenden fungerar med Java 7, kolla om din kod använder deprikerade saker, kör dina tester om och om igen (för Java 7 kan exekvera dina tester i annan ordning än förut, vilket kan krascha tester om testmetoderna är beroende på exekveringsordning (som du faktiskt borde fixa ändå!)) samt kontrollera vilka nya features som finns i Java 7 som du kanske borde passa på att använda i befintlig kod. Koden uppgraderar inte sig själv till Java 7, så lite försiktig bör man vara.

 Unleash your domain – Greg Young

Sammanfattningsvis en introduktion till DDD tillsammans med CQRS med faktiska exempel. Fruktansvärt intressant! Jag skall inte gå igenom här vad DDD och CQRS är, men om du vill lära dig mer så kan jag rekommendera www.dddcqrs.com. Presentationen öppnade verkligen ögonen för mig när det gäller event-drivna system. Kärnan i det hela är att du inte persisterar state på dina domänobjekt, utan händelser. Ett state för säg en order bestäms alltså av ett antal händelser som skett i systemet; exempelvis “skapa order”, “lägg till orderrad”, “lägg till en till orderrad” och “lägg till orderadressat”. Om man modellerar sitt system på detta sätt kan man göra så mycket häftiga saker. CQRS är så mycket mer än bara den event-drivna biten, så jag rekommenderar dig att följa länken ovan och lära dig via exempel och videos som finns på sidan.

An intro to Hadoop – Eva Andreasson

Kort fikasession om Hadoop, vad det är och lite hur det fungerar. Hadoop är ett distribuerat open source-ramverk från Apache som kan hjälpa dig persistera och hantera stora mängder data. Ramverket är inspirerat av Googles tankar om MapReduce och deras egna filsystem GFS och används nu av flera stora aktörer som Facebook och Twitter. Det är kanske inte så många företag i Sverige som behöver titta på detta än, men det är en väldigt häftig och smart modell för att hantera stora mängder data.

Synd att presentationen bara var över en kaffepaus (den varade i ca 15 minuter) då ämnet intresserar mig. Hade varit trevligt med en djupare genomgång med exempel på hur det fungerar mer i detalj. Får väl hem och labba lite antar jag =)

The curious coljureist – Neal Ford

En introduktion till Clojure som är en Lisp-implementation i Java. Neal gjorde (som vanligt) ett bra jobb. Clojure är alltså ett funktionellt språk som är extremt flexibelt och väldigt lämpat för “concurrent programming”. Jag själv har inte mycket erfarenhet av funktionella språk, så det var kul att få en genomgång. För en Java-nörd som mig känns det som en rätt stor tröskel att komma över innan man kan skriva kod i Clojure utan att snubbla över syntaxproblem. Jag skulle nog inte rekommendera Clojure som första funktionella språk för någon som “bara” kodat imperativa språk som Java innan. Men om man kan det och använder det på rätt sätt så kan det nog vara ett sjukt effektivt programmeringsspråk.

Fyra punkter som sammanfattar Clojure:

  • Highly expressive language
  • Seamless Java interop
  • Functional
  • Advanced concurrency

The road to REST – Rickard Öberg

Väldigt intressant (och kanske lite kontroversiell?) presentation om hur man bygger REST-API:er på ett bra sätt. Rickard gick igenom vad REST är och hur Roy Fielding (som myntade uttrycket) tänkt när han skrev specen. Sedan förklarade han hur han varit med och byggt ett system på REST med en väldigt tunn klient. I projektet han jobbat i kom det fram till ett tankesätt som passade dem bra; “exponera use-case, inte domänmodell”. Vanligtvis brukar man exponera sina domänobjekt via sitt REST-API, så att en klient själv kan bestämma vad den skall göra med datat. Klienten kommer i detta fall hålla affärslogiken och ta beslut om vad användaren kan göra i systemet.

Rickards tips var alltså att dra gränsen mellan server och klient närmare klienten, så att klienten blir så tunn som möjligt. Affärslogiken för systemet hamnar då på serversidan och klienten får endast reda på vad den kan göra genom hyperlänkar som returneras från servern. REST-API:t innehåller endast representationer av de operationer du kan göra på ditt data, inte datat självt. Det är denna bit som kan anses lite kontroversiell, då man helt tappar CRUD-access till domänobjekten själva via API:t. Om man gör på detta sätt så hävdar Rickard att man får en hel del fördelar med att underhålla sitt API och sin applikation i helhet. Man kan då enklare uppdatera systemet genom att all affärslogik ligger på ett ställe; i servern. Klienten är bara “dum” och följer bara de länkar som REST-anropen returnerar. Intressant tankesätt som tåls att tänkas på..

Kvällsaktiviteter

Dagen avslutades med mingel och god mat i Stockholm Waterfronts lokaler tillsammans med massor med intressanta människor. Jag hann också med att gå på en icke-formell Open JDK-session som Fredrik Wendt har skrivit om här.

Using Entity Framework 4.3 Database migration for any project

In this blog post I’m going to write about the Entity Framework 4.3 Database migration and how to use it without using Code-First or Entity Framework as an OR-M at all.

To get started just create a simple project, for example a Console Application. After that write the following in the Package Manager Console (In the Visual Studio menu, select View/Other Windows/Package Manager Console). Write the following and hit enter:

 

PM> Install-Package EntityFramework

After the EntityFramework 4.3 is installed we need to enable the database migration. Only one project in our solution can be enabled. To enable migration just enter the following in the Package Manager Console:

PM> Enable-Migrations

When this is done we will now have a folder in our project called Migrations. In this folder we will see Configuration.cs file (this file may showed up after you have enabled the migrations).

In the Migrations folder we will add our database changes for the current version of our code. More about this later.

Open the application configuration file and add a connection string:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
 
  <connectionStrings>
    <add name="BlogContext"
         providerName="System.Data.SqlClient"
         connectionString="Data Source=.;Initial Catalog=MyBlog;Persist Security Info=True;Integrated Security=true"/>
  </connectionStrings>
</configuration>

I gave the connection string the name “BlogContext”, I also use a database with the name MyBlog.

If you use Entity Framework and code-first, Code-First can create a database for us based on our model. But this blog post will be about not using Entity Framework as the OR-M at all, instead I already have an existing database called “MyBlog”. This database has one table called “Blog” with two column, BlogId and Name:

 

image

Note: The _MigrationHistory table as you can see in the image above is a table that will be created by EF 4.3 Database Migration to keep track of the migrations. It will use that table know the current state of the migration, only to make sure it knows which migrations that is in pending state (has not bean applied) etc.

This blog post pretends that we already have an earlier version of our program that works against the database schema above. Now in our new version we are going to add one new column for specifying when a Blog record is created.

After our connection string is in place, we need to create a DbContext class. The EF 4.3 Database Migration needs a DbContext, we will just create an empty DbContext. By doing so we can use the EF 4.3 Database migration without using EF as our OR-M.

Add a new class with the same name as the connection string, for example “BlogContext”, we must make sure it will inherit from the DbContext class:

namespace ConsoleApplication6.Model
{
    using System.Data.Entity;
 
    public class BlogContext : DbContext
    {
    }
}

Note: EF will by default try to locate a connection string with the same name as our DbContext class.

When this is done we need to open the Configuration.cs file located in the earlier created Migrations folder. We need to specify that the configuration of the migration should use our BlogContext, we do that by using the DbMigrationsConfiguration<T> and specify that the T is our BlogContext. The configuration class is used to configure the database migration, it also need to know which database it should work against etc. This is done by specifying a DbContext and in our case our BlogContext:

namespace ConsoleApplication6.Migrations
{
    using System.Data.Entity.Migrations;
 
    using ConsoleApplication6.Model;
 
    internal sealed class Configuration : DbMigrationsConfiguration<BlogContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }
    }
}

Note: The AutomaticMigrationsEnabled is set to false by default, if we use Code-First and want to let the migration tool automatically handle migrations, we can enable it and just add the changes to our Model, and the migration will check for the changes and do migration based on it, here is more information about it: EF 4.3 Automatic Migration. But in this example we will handle the migration manually.

There is Seed( xxx ) method added to the Configuration file, by using that method we can for example use it to fill/seed our database with data after a migration. I have removed that method because in this example we will not use it.

Now when all the basic configuration of our Migration is setup, we can start adding a migration. We do that by using the command “Add-Migration”. In this example we will add a new column to our Blog table called “Created”. So in the Package Console Manager we write:

PM> Add-Migration AddBlogCreated

We will now have a file added to the Migrations folder with the name “AddBlogCreated.cs” and the file will also have a timestamp as a prefix, this is used to know the order the migration should taka place. A Migration file will have two methods, Up and Down. The Up method will be used to specify what changes the current version of our application need to apply to the database, the Down is used to reverse the changes we have added to the Up method. When EF 4.3 Database Migration will update the database, it will run all migration in the timestamp order, and only those that haven’t been used since the last update (The _MigrationHistory table know about which migration that was last used). The Up method of all migrations will be called and do the changes we have specified to the database. If we decide to go back to a previous migration, the Down method will be called to redo the changes in a revers order.

By using the AddColumn method in the migration file, we can easy add columns to our database, by using the RemoveColumn, we can remove a column that is added. The following example adds a column to the “Blog” table with the name “Created” and specify that it’s a DateTime, it will also remove the column if the migration is reversed.

namespace ConsoleApplication6.Migrations
{
    using System.Data.Entity.Migrations;
    
    public partial class AddBlogCreated : DbMigration
    {
        public override void Up()
        {
            AddColumn("Blog", "Created", c => c.DateTime());
        }
 
        public override void Down()
        {
            DropColumn("Blog", "Created");
        }
    }
}

When specifying the column type we can also specify if the column is nullable or has a default value etc.

AddColumn("Blog", "Created", c => c.DateTime(nullable:false, defaultValueSql:"GetDate()"));

We can also use pure SQL in the migration class by using the Sql method:

public override void Up()
{
   AddColumn("Posts", "Abstract", c => c.String());
 
   Sql("UPDATE Posts SET Abstract = LEFT(Content, 100) WHERE Abstract IS NULL");
}

Other method that can be used are for example: RenameTable, RenameColumn, CreateTable add and remove index etc.

Now when we have added our AddBlogCreted migration to just simply add a new column, we want to run our migration. We can do it by using the Update-Database command in the Package Manager Console:

PM> Update-Database

The Update-Database will now execute all migrations that is added and not “executed” since last update. The timestamp prefix of the migration files as mentioned earlier is used to execute the migration in a correct order. If we run this command we will now have a new column called “Created” in our Blog table.

If we also want to see the SQL of the migration we can add the –Verbose parameter after the Update-Database:

PM> Update-Database -Verbose

To go to a specific migration, we can use the Update-Database and use the –TargetMigration parameter, for example:

PM> Update-Database –TargetMigration:"AddBlogCreated"

This will take us to the “AddBlogCreated” migration state. At the moment we are at this state so nothing will happen. We can try it by going back to a previous state, because we only have one migration we need to back to the first state of the migration (initial state), this is done by set the –TargetMigration value to “$InitialDatabase”:


PM> Update-Database –TargetMigration:$InitialDatabase

When we run the command above, we can see in the Package Manager Console that our AddBlogCreated migration is reverted. If we look at our database we can see that our Created column is removed. Now if run the Update-Database command and sets the –TargetMigration to “AddBlogCreated”, we now moves to the “AddBlogCreated” migration state and our Created column is now added.

We can also execute the Update-Database command and get SQL script and pending migrations etc from code. This can be done by using the DbMigrator class and the MigratorScriptingDecorator etc. Here is an example where a migration is updated and the SQL script is displayed in a Console application:

class Program
{
   static void Main(string[] args)
   {
      var configuration = new Configuration();
      var migrator = new DbMigrator(configuration);
 
      var scriptor = new MigratorScriptingDecorator(migrator);
      var script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null);
      Console.WriteLine(script);
           
      migrator.Update();
           
      var pending = migrator.GetPendingMigrations();
 
      Console.ReadLine();
 
   }
}

Summary

In this blog post we have seen how we can use the new Entity Framework 4.3 Database Migration and use it without even use Entity Framework as our OR-M. We have seen how to install and configure the migration, also how to apply a migration and reverse it.

Ps. If you want to know when I post another blog post, please follow me on twitter @fredrikn

@JFokus: Tackling Android fragmentation av Glenn Bech

No Gravatar

Glenn Bech höll en väldigt bra presentation på JFokus om hur man hanterar problem som skärm storlek och OS version. Ett av problemen är att gamla telefoner inte uppgraderas till nya versioner av OS:et. Idag använder flest telefoner version 2.3  av Android (v2.2 20%). Detta kan jämföras med iOS där 66% använder iOS 5+. Men frågan är om et är ett problem för konsumenterna? Troligtvis inte. Men för vem är det ett problem? Naturligtvis för oss utvecklare. Vi måste veta hur många telefoner som finns körande på dom olika versionerna så att vi tex kan använda version av Androids api:er.

OpenJDK session at JFokus, Stockholm

OpenJDK logotype

Yesterday evening some 30 people met to talk about OpenJDK. Apart from one unlucky fellow that asked for “pointers on how to move from Java 5 to Java 6″, it was mostly political and community related issues discussed. The only technical topic discussed was really the (awkful) build system.

Access to properties like in java fx

The first topic that came up was a question whether Java SE (or rather “Java the language”) would get property access added, like that available in JavaFX. No one could really answer, the person asking for it was asked to join the mailing list(s) and ask for this feature.

Build infrastructure/system

Next up was the question if Oracle/OpenJDK are working on improving the build system, as well as restructuring the code base to make it easier to find your way in it. It’s apparently quite hard to navigate and find the parts your looking for.

Historically, we were told, Java started out as a code base for Solaris. Then there were some thing added for some other OS, and another, and another and so – it was never really a multiplatform layout set out from the beginning.

Photo of Dalibor TopicOne suggestion was to make a “mocked OS”, which mocks everything out and makes for a good reference point when you want to start out support for a new platform. “Look at Windows” Dalibor Topić replied with some laughter following within the group. A more serious reply was to look at how the new Mac OS port is being handled. As I understood it, currently it lives by its own (in branches?) since Oracle has not decided to step up and support that platform yet. If it matures enough and reaches a quality level high enough for adoption, then Oracle might take on supporting it. Regardless, people wanting to port OpenJDK to a new platform can look at how this all works out.

IcedTea was mentioned of course, but I really don’t remember the reference to it, or the point made. :-)

OpenJDK contributors

Next question was out of pure interest from someone that wanted to know who, outside of Oracle, that contribute to the project these days.

  • Linux, BSD communities initially
  • Canonical, IBM recently
  • SAP contributed hotspot fixes, AMD for their CPUs
  • and academics/individuals

How do you contribute to OpenJDK?

Photo of Yara SengerThis was brought up by a Brazillian JUG organiser Yara Senger, and was discussed for quite a long time. Her focus, as I understood it, was to make sure to engage not only the top coders of the community, but people at all levels and most importantly people that have advanced from the “beginner” level. Some people made subtle points saying that not everyone might be up for the task – this is not your everyday Java bean your going to write …

On a more concrete level, Cecilia Borg, said that this is something they are in fact looking into and their current take is to try to engage the community via the user groups. The London JUG apparently has made some substantial work here, with code review programs, efforts on automating the manual tests that needs to be carried out for OpenJDK releases, and also the “adopt a JCP” program.

Photo of Cecilia Borg
“NetBeans did a good job [with engaging the community]” and lowering the barrier on getting involved and onboard.

Several times, it was said that “we need to provide a virtualbox image where everything’s set up” in order to move away from new comers spending time on simply trying to get it to actually build, and focus on getting “real” work done instead.

JEP for RIPE-MD

Photo of Leif-Jöran OlssonLeif-Jöran Olsson (ljo, from eXist-db fame) asked if there is work planned or going on for adding more non-proprietary cryptographic algorithms (such as RIPE-MD) now that MD5 sums for instance to an increasing level is being seen as non-reliable.  This led to a brief introduction on JEPs – JDK Enhancement Proposals (much like Python’s PEPs I assume – this was new to me). It was not clear to me who is allowed to add JEPs. But the discussion also led to the next topic:

How does one become a committer?

This is actually well documented under the Bylaws headline on openJDK website.

And that was 60 minutes of OpenJDK discussions.

Återkoppling från en Coding Dojo

No Gravatar

Det är otroligt kul och inspirerande att se Coding Dojos tas emot så väl ute bland de företag jag besöker. Att det är väl mottaget bland utvecklare är uppenbart och kan bl a förklaras med “Code wins arguments”. I “gamla” inkörda team där diskussioner gått i stå och nötts länge kan helt plötsligt helt ny dynamik uppstå. De “gamla” argumenten som gått fram och tillbaka men bara varit abstrakta och teoretiska skall helt plötsligt omsättas i kod, med/inför kollegorna och “helt plötsligt” går det från abstrakt till konkret och inte bara fåtalet engagerar sig och har en uppfattning, utan flertalet.

De Coding Dojos jag driver hos kunder är just detta – praktiska övningar med ett mål eller en poäng. Ingen föreläsningsserie man sitter och nickar igenom och sedan släpper vind för våg. Med riktiga övningar, där alla deltar och skriver kod själva ökar deltagandet, engagemanget och det kritiska granskandet.

Eftersom det ofta uppstår diskussioner med uttryck som “jag brukar göra såhär”, “oj, så har jag aldrig gjort, eller tänkt” så är det viktigt att det inte finns lönesättande chef(er) på plats. Om deltagarna är rädda för att säga fel och börjar väga sin ord så försvinner en stor poäng med dojon. Jag försöker få alla att vara spontana med hur de tänker, att exponera hur de jobbar utanför dojon så att de kan få konstruktiv feedback på sitt arbetssätt. Lönesättande chef och/eller beställer behöver givetvis återkoppling också. Här följer ett exempel från förra veckan.

Hej Kund!

Efter lite hackiga, trevande steg med första övningen tyckte jag mig se en enorm skillnad till tillfälle två. Det märks att flera utvecklare försökt sig på det vi övade i vardagen! Jag tror mig se att så gott som alla utvecklare har fått en ny infallsvinkel till hur de ser på sin kodskrivning och den synen utvecklade vi med en mer realistisk övning ihop med mockning. Det var mycket bra frågor som dök upp, vilket tyder på att de är engagerade, intresserade, verkligen försöker anamma en annan kodordning och har en sund kritisk inställning till vad de gör själva (det är ju inte jag som skriver koden under övningen – jag bara guidar och ger tips)!

Övning 1:

Vi tog en enkel basövning (String calculator).
Vi introducerade red-green-refactor, Arrange/Act/Assert, bottom-up.
Vi tog baby steps bokstavligen med 1 minut som tidkrav att gå från röd till grön.
Vi såg triangulering som ett sätt att driva fram funktionalitet.
Grå zon: “täcker testen all funktionalitet? om inte, har vi använt test-driven utveckling?”

Övning 2:

Vi tog in en ny, ganska stor uppgift som är mycket mer realistisk (tagen från produktionskod).
Vi lade på ett nytt moment/tanke i form av en “testbacklog”. (Verkade vara en ny idé – diskuterade VAB-scenariot och vikten av att kunna dela kod ofta.)
Vi lade på mockning med Mockito. (En del var redan bekanta med Mockito.)
Grå zon: “ett par antydningar till att ändra kod utan att testen uttrycker den funktionella ändringen i koden”.
Vi refaktorerade kod lite oortodoxt (utan test, utan undo/bortkommentering).

Det var mycket motiverande för min del att se utvecklingen i teamet, det var en helt annan “mognad” i TDD-tänket och ett bra driv/bra dialoger. Parprogrammeringen såg bitvis fullständigt klanderfri ut – mycket kul att se! Nästan all kod drevs fram från test (två, tre tillfällen fanns antydan till att skriva kod som inte var testdriven/täckt av test).

Utvärderingen i slutet bjöd mer på kod- och designdiskussioner (jag vill aldrig avbryta sådant) så vi hann inte “utvärdera” så mycket, men på tavlan skrev jag upp:

+ bra frågor
+ bra övning
! refactoring gjorde koden mycket mer läsbar
! smidigt med @Mock
? Använda TestNG nästa gång

Mitt förslag är att vi nästa gång utvecklar i flera par parallellt (en dator per par med Eclipse är vad som behövs), lägger på Clean Code-aspekter och använder samma uppgift och ser hur vi kan få koden att se ut på olika sätt.