Code review? (nforum 23 April – Göteborg)

No Gravatar

Har du länge drömt mardrömmar om din kod? Eller kanske du är en av dem som önskar att Code Review var en del av er arbetsprocess? Kanske du redan har sådan process? Mattias Jiderhamn från B2B företaget Expert Systems i Alingsås kommer och gästar nforum den 23 april och delar med sig av sina idéer och tankar kring just detta ämne.

Personligen är jag förvånad över att det är så få företag som lägger energi på att införa alla dessa mjuka ting i sina arbetsprocesser. TDD, Code Review, Acceptans Review m.m. Oftast brukar det bero på att de som bestämmer inte själva vart kodare och eller så finns det brister i förståelse för vad en bra process faktiskt innebär.

Jag kan förstå denna sits samtidigt som jag är stor motståndare här. I min värld har jag alltid strävat efter att det inte finns något som heter övertid, det finns inget som heter buggar m.m. Vi vet alla att det visst finns det men om du envist inte vill tillåta dem för dig själv och samtidigt även vill kunna utföra ett bra jobb kommer du automatiskt som programmerare hela tiden tvinga dig själv att hitta de effektiva och smarta vägarna att gå för att just slippa sitta över, slippa buggar m.m. Du nyttjar TDD, du tänker en extra gång innan du hackar din kod. Du bollar idéer med dina kollegor, du ber någon kollega i smyg kolla på din kod m.m. Vi brukar oftast bli kallade de Pragmatiska utvecklarna. Tycker dock det är synd att det inte direkt ligger lika mycket fokus på de Pragmatiska säljarna, de pragmatiska kunderna mot utvecklarna.
Många processer försöker men allt för många förstår inte processerna i sig. De tror oftast det bara är för utvecklarna skall hinna göra med features och missar att de själva egentligen också ingår i processen.
Känslan på en bra konferens brukar i många fall vara ”Det är fel folk som sitter här, vi kan detta, synd våra chefer inte är här och lyssnar på detta, det är de som behöver denna kunskap inte vi…” Du känner igen dig va? Tänkte väl det.

Jag fick höra en skrämmande historia en gång.
Köparen: Vad är detta? Test 40timmar? Code Review 10h? Det har jag aldrig betalt för förut, stryk det.
Säljaren: Ok.

Ta ansvar, stå på dig, kan du inte övertala din överman, gör bevis på att dina idéer faktiskt ger värde.
För så länge du kan leverera lufttid och inte siffror är du oftast rätt rökt. Dvs. kan du inte bevisa att det ger effektivitet kommer du heller inte få till det, då extra arbete (som de ser det) ökar bara deras siffra med den tid som redan finns, de ser sällan att tillägg drar av tid.

Andra ämnen vi tar upp på nforum den 23 April är TypeScript med John Tjust från oss på Squeed.
Även Filip Ekberg gästar oss med att prata om Async i C#.

Vi ses, anmäl dig på nforums egna sida.
www.nforum.se

Mvh Johan

Continuous Delivery

No Gravatar

Fredrik Normén på Squeed kommer den 30:e April att prata om Continuous Delivery och hans erfarenheter kring området i det projekt han sitter i just nu för ett finansbolag. Ni kommer att få grundläggande förståelse kring begreppet Continuous Delivery, samt hur Fredrik och hans team har valt att lösa vissa problem i sitt utvecklingsteam, allt från process, källkodshantering, branchning, automatisering etc,  detta med hjälp av Microsoft Team Foundation Server 2012 och NuGet samt andra verktyg och hack!

Detta är ett event via Swenug som sponsras av Squeed AB.

Anmäl er här:

http://www.swenug.se/events/gbg-continuous-delivery

Krav och test i harmoni

No Gravatar

Kravnätverket SARE, Swedish Association for Requirements Engineering, ordnade en föreläsning med professorn Robert Feldt förra veckan. Han jobbar på Chalmers och Blekinge Tekniska högskola på en avdelning med det sympatiska namnet Human Focused Software Engineering. Han ingår i en forskningsgrupp med tio doktorander/professorer som har gjort en studie av hur det som de kallar för alignment mellan krav och test fungerar i verkligheten. Här följer en liten sammanfattning av föreläsningen.

Robert inledde med att visa lite hur forskningen inom systemutveckling hittills har sett ut och berättade att ungefär hälften rör de traditionella områderna som krav, test och design. Endast 2 % av forskningsrapporterna rör både krav och test.

Denna studies syfte var dels att förstå utmaningarna i arbetet med REVV (kravhantering, verifiering, validering) och dels se vilka lösningar man idag tror sig ha inom mjukvarutvecklingsföretag.

Det traditionella sättet att hantera krav och test är att göra en matris där krav och testfall mappas och det finns också mycket forskning kring hur man fyller i den matrisen för att få spårbarhet. Ett problem med detta är att det är svårt att hitta tid att hålla kopplingarna aktuella i olika verktyg. En fördel är att det är enkelt att kunna bocka av vilka krav som är testade.

Forskarna i studien tror att detta matrisarbete inte är så viktigt, utan att det är viktigare att få alignment mellan krav och test. Med detta menar de att justera både krav och testfall så att de koordinerat fungerar ihop och ger en optimal produktutveckling. Studiens resultat har bidragit till att stärka tron på detta.

  • Om kraven har hög kvalitet, dvs tydliga, verifierbara, kompletta och uppdaterade, underlättar det för att skapa en bra koppling mellan krav och test.
  • Om målet eller strategin med produkten är känt blir det också bättre harmoni mellan krav och test och ett bättre samarbete både internt och externt.
  • Ett gemensamt perspektiv och bättre kommunikation mellan krav och test är viktigare än verktygsstöd.
  • Ett nära samarbete mellan rollarna ger bättre alignment och mindre friktion. Ett tips kan vara att byta roller tillfälligt vilket ger en ökad förståelse för varandras arbetsuppgifter. Troligen är detta bättre än att gå en kurs eller att köpa ett verktyg.
  • Det handlar mycket om personlig utveckling. Ofta är testarna oerfarna vilket kan vara ett problem.

Det är vanligare att det saknas personer som jobbar med krav än med test samtidigt som det finns en stor positiv trend för kravfolk.

Slutsatserna är att

  • den mänskliga och organisatoriska sidan av mjukvaruutveckling är kärnan för harmoni
  • kraven måste ha hög kvalitet

Det finns idag inte så mycket stöd eller verktyg för att skapa harmoni utan här krävs mer forskning och erfarenhet.

Jag tycker att det var intressant att få ett vetenskapligt perspektiv på detta ämne. Oftast saknas det och istället läser man om andras erfarenheter, gör egna erfarenheter och går kurser utan större akademisk förankring. Roligt med ett avbrott från det!

Svensk ordlista för kravhantering

No Gravatar

Den oberoende organisationen SQEB, Software Quality Engineering Board, verkar “för en svensk standard inom kravhantering och för att certifiera kravhanterare enligt en internationell norm.”

De har gjort en svensk översättning av REQB:s (Requirements Engineering Qualifications Board) ordlista för kravhantering. Genom att använda termerna som finns där blir det enklare att förstå vad som avses med begrepp samtidigt som det kan vara trevligt att använda svenska ord istället för engelska om det passar i sammanhanget.

» SQEB:s svenska ordlista
» REQB:s engelska ordlista “Standard glossary of terms used in Requirements Engineering” 1.0

Agila affärer

No Gravatar

Agila organisationer – när blir det mainstream? Jag har hört talas om att Cisco gått “all in” och rakt igenom säger sig ha produktägare som “rekryterar” ett av flera utvecklarlag (Development Team) till sig. Teamet eller teamen väljer sedan Scrum Master. Undrar om det rent av är enklare att genomföra en sådan radikal förändring i en riktigt stor organisation, jämfört med den mindre där alla (nästan) känner varandra. (Och att det därför är ovanligt att höra om organisationer som är agila rakt igenom, eller ens i mer än ett led i matrisorganisationens hierarki.)

På ämnet agila affärer – ThoughtWorks skrev nyss “Eliminating Sales Commissions“, där de berättar om sin resa med att plocka bort den vanliga men felriktade säljbonusen.

Pimpa Göteborgs Postens skolkarta

No Gravatar

OBS! Nedanstående kod fungerar när jag skriver detta (2012-12-13), om GP ändrar sin kod så kommer det antagligen inte funka så skyll inte på mig ;)

När man har barn i skolåldern så känns Göteborgs Postens karta över skolors resultat väldigt relevant. Det är ett utmärkt initiativ men eftersom jag är lat och ville få en bättre överblick snabbt så saknade jag färgkodning av skolorna direkt på kartan så man slapp klicka på varje skola för att se den.Så vad gör en lat nörd? Klickar runt manuellt i 5 minuter eller lägger en timme på att koda ett ful-hack istället? Jag tror ni kan gissa.

Jag har alltid tyckt att bookmarklets varit hur fantastiskt som helst men har fram tills nu inte funnit nått nyttigt användningsområde. Bookmarklets är bokmärken som i stället för länkar innehåller Javascript-kod som körs på den sida som är aktiv i webbläsaren när man klickar på bokmärket. Det som är så trevligt med detta är att koden i skriptet kan modifiera den aktiva sidan hur fanken den vill.

För den som bara vill se en trevligare version av GP:s skolkarta är det bara att dra följande länk:Pimpa GP Skolkarta” till bokmärkesfältet, surfa in på skolkartan och klicka på bokmärket.

Om man inte kan eller vill installera genom att dra och släppa länken så gör en länk manuellt genom skapa ett bokmärke och ange denna text som “Adress”:

javascript:(function(){function%20pimp(){var%20e={IG:"http://www.google.com/intl/en_us/mapfiles/ms/icons/red-dot.png",G:"http://www.google.com/intl/en_us/mapfiles/ms/icons/yellow-dot.png",VG:"http://www.google.com/intl/en_us/mapfiles/ms/icons/blue-dot.png",MVG:"http://www.google.com/intl/en_us/mapfiles/ms/icons/green-dot.png"};var%20t={};var%20n=null;var%20r=null;var%20i=setInterval(function(){s()},300);var%20s=function(){if(o()){clearInterval(i);u();l(n)}};var%20o=function(){if(mktmp.spots_ready===1&&!!mktmp.mgr&&!!mktmp.mgr[0].markers){n=mktmp.mgr[0].markers;r=mktmp.spots[0].spots;return%20n.length===r.length}};var%20u=function(){for(var%20e=0,t=r.length;e<t;e++){a(r[e])}var%20n="Pimpar%20skolkartan!";n+="\n"+r.length+"%20skolor\n";alert(n)};var%20a=function(e){var%20n=new%20google.maps.LatLng(e.latitude,e.longitude);var%20r=n.toUrlValue();t[r]=e};var%20f=function(e){return%20t[e.getPosition().toUrlValue()]};var%20l=function(t){t.each(function(t){var%20n=f(t);var%20r=c(n);var%20i=e[r];t.setIcon(i)})};var%20c=function(e){var%20t=e.summary;var%20n="G";if(t.indexOf("IG")!==-1){n="IG"}else%20if(t.indexOf("MVG")!==-1){n="MVG"}else%20if(t.indexOf("VG")!==-1){n="VG"}return%20n}}pimp()})();

Skolkartan innan att skriptet körts.

Skolkartan innan att skriptet körts.

Skolkarta efter att skriptet körts

Skolkartan efter att skriptet körts

För er som eventuellt vill veta mer om hur det går till rent tekniskt så läs vidare.

För att utveckla koden installerade jag Firefox och pluginen Greasemonkey som gör det lätt att köra egna Javascript på andras sidor. När de väl fungerar med Greasemonkey är det lätt att konvertera koden till bookmarklet. Men innan jag kunde börja koda behövde jag gräva i GP:s DOM träd för att se hur jag kunde få tag på Google kartan som de använde. För detta använde jag gamla hederliga Firefox pluginen Firebug. GP har en hel del kod på sidorna som inte var relevant för mig och namnen de använder på DOM-noder och Javascript variabler är inte självklara så det var det som var det bökigaste med hela projektet. Men efter lite grävande så kom jag fram till att kartan låg i en div med namnet “mkmap” och Javascript objektet “mktmp” samt att skolorna kallades “spots”.

Nu var det bara att skriva koden (se nedan) som ändra markörerna på kartan i olika färger beroende på skolans betyg. De använder Googles karta och som tur är hade jag hade lekt lite med Google maps API innan vilket underlättade väsentligt.

Ett problem som uppkommer när man hackar in kod på en redan initierad sida på detta sätt är att veta när alla skolor var laddade och kartan är redo att moddas. En timer som körs med 300ms mellanrum används för att kolla när skolorna laddats och alla kartmarkörerna har skapats.

// start periodic check for when map is ready
var timer_id_check_map_ready = setInterval(function() {
    waitForMapReady()
}, 300);
var waitForMapReady = function() {
    if (isMapReady()) {
        // turn off timer event
       clearInterval(timer_id_check_map_ready);
        ...
    }
};
var isMapReady = function() {
    if (mktmp.spots_ready === 1 && !!mktmp.mgr && !!mktmp.mgr[0].markers) {
        markers = mktmp.mgr[0].markers;
        schools = mktmp.spots[0].spots;
        return markers.length === schools.length;
    }
};

Kartmarkörerna hade ingen referens till skolobjekt så det fanns inget lätt sätt att para ihop dem för att uppdatera markörikon efter skolans betyg, men både skolobjekten och markörerna har samma geo-position så jag använde mig av detta för att lista ut vilken skola en markör representerar.
var addGeoPosition2SchoolMapping = function(school) {
  var latitudeAndLongitudeOne = new google.maps.LatLng(school.latitude, school.longitude);
  var pos_string_val = latitudeAndLongitudeOne.toUrlValue();
  geo_position_to_school_mapping[pos_string_val] = school;

};
var getSchoolForMarker = function(marker) {
  // use the markers geoposition to get the school
  return geo_position_to_school_mapping[marker.getPosition().toUrlValue()];
};

För att ta reda på betyget på skolan söker jag bara i skolobjektets “summary” information (ett fulhack men hittade inte betyget någon annan stans).
Nu var det bara att iterera över alla markörer och sätta färg beroende på betyg.

var updateMarkerIcons = function(markers) {
  markers.each(function(marker) {
    var school = getSchoolForMarker(marker);
    var grade = getGrade(school);
    var icon = icons[grade];
    marker.setIcon(icon);
  });
};

Det var det hela, ett bräckligt litet hack men det var kul att leka lite. Hoppas det inspirerar er till egna fantastiska bookmarklets!

Hela koden:

Devoxx 2012 Antwerpen Belgien

No Gravatar

 

Det var ett tag sen man satt bakom skolbänken, vilket man tydligt känner av efter tre dagars totalt korvstoppande i vad som sägs vara europas andra största bioanläggning, kinepolis.
Årets upplaga bjöd inte på några riktigt stora namn, men det är inte enbart rock-star-status som styr om ett föredrag blir bra.

Onsdag

Keynote

Denna keynote var något av det segaste jag sett i världshistorien, då den till 80% handlade om hur duktiga devoxx-folket var, och hur bra deras konferrens gått senaste åren. Vidare handlade den om devoxx-klan-ledarens Stephan Janssens egna presentations-site parleys.com, vilket iofs är en fantastisk sida. Hans egotrip drog ut på tiden, och Oracles Nandini Ramani fick mindre tid, vilket sedan gav ripple-effects i schemat resten av dagen.
Stephen Chin kom sedan inrullande på motorcykel fram till podiet, och även här syntes inte ett spår av självinsikt.
Oracles presentation var bra, och handlade mestadels om JDK8 och vad som komma skall, inga direkta nyheter. JavaFX verkar ges fokus igen, trots dess minst sagt misslyckade framgång hittils. Nu kommer en 3D-funktion, för att enkelt kunna göra 3D-grafik likt Direct3D på native-klienter. Personligen tror jag inte detta kommer kännas intressant, då WebGL har kommit så långt, men vem vet.

Neall Ford från ThoughtWorks var väl kanske ett av de största namnen, och pratade lite om hur bra det är att vara generös med sin specialistkunskap, och låta den rinna ut i andra delar av organisationen och i sitt övriga liv. Hans stora idol Richard Feynman var på duken i stora delar av hans presentation, då Feynman löste många olika problem, trots att han egentligen var specialist inom ett givet område. Poäng efter poäng handlade om hur man kan flytta en lösning inom en domän in till en annan.
Även om det är omöjligt att jämföra sig med geniet Feynman, kan det vara en bra tankeställare.
Neal har släppt en bok som täcker detta ämne fullt ut som heter: Presentation Patterns (http://presentationpatterns.com/).

Lunch

Efter lunch halkade jag för sent in i en snabbföreläsning, quickie, om Arquillian. Mha Arquillian och ShrinkWrap, byggde han ihop en snyggt och prydligt unit-test där data-sourcen bestod av lite vad man ville. I hans fall var det bl.a. en simpel textfil som beskrev tabeller med data.
Klart smidigt då man vill mocka data, vilket man ju gör typ hela tiden i sina integrationstester.

Nästa quickie var om JMS 2.0 av Nick Wright från c2b2 consulting. Han beskrev i korthet alla smaskiga nyheter i JMS 2.0. Han tyckte det var dags att fräscha upp saker, JMS 1.1  har levt i ca 10 år nu. Bland annat bygger jms nu ut de delar som massor av andra ramverk byggt ovanpå jms, eller parallellt med. Exempelvis finns nu stöd för Java 7 Autoclosable och ett betydligt kompaktare och snyggare API, som absolut ger JMS en konkurrensfördel mot andra aktörer. Vidare finns batch-delivery, delivery-delay och async-delivery. P2P och Pub-Sub måste implementeras av API:et iom 2.0. På det stora hela ser det riktigt modernt och bra ut, blir kul att testa.

Java 8

Oracles Joseph Darcy hade sedan sin presentation om Java 8.
Här fick alla reda på att det var dags att skynda på, då slutdatum för Java 1.6 är bara 4 månader bort. Lustigt nog tycker jag att Java 7 fortfarande är rätt buggig, och G1 har ju precis blivit klar. Jag tror 1.6 kommer få leva lite till, men det är bara min teori.
Joseph försvarade och förklarade hur Oracle tänker när de gör olika typer av teknikval och vilka olika nivåer av kompatiblitet som måste efterlevas.
De har i praktiken tre dimensioner; source-, behavioral- och binary-compatibility.
Intressant nog har de nästan aldrig brutit alla tre dimensionerna tidigare, men det blir det ändring på iom Java 8.
Java 8 kommer bygga in default-methods på interfaces för att möjliggöra interface evolution, dvs vi kommer få traits in i java till sist, inga nyheter här.
Det mest spännande han tog upp var hur de valt att implementera lambda uttryck.
Istället för att utnyttja statisk kompilering, dvs använda antingen syntaktiskt socker och köra med anonyma klasser undertill, eller utnyttja MethodHandles, valde Oracle att göra detta helt i run-time.
Detta görs via den i Java 7 introducerade invoke dynamic (indy), vilket visar sig passa aldeles utmärkt in i deras val att göra tillräckligt stora ingrepp för att lösa problemet, utan att skapa en situation de inte kan komma ur i framtiden.
Det fiffiga med att använda indy är att hur lambdas faktiskt plockas fram, det blir en implementationsdetajl som Oracle kan ändra i framtiden om de har lust, mycket smart.
I Java 8 kommer ditt anrop till en lambda sättas upp första anropet, för att i följande anrop anropas i praktiken med samma prestanda som vilken vanlig metod som helst (han visade lite lovande grafer på detta).

Vertx.io

Nästa presentation var av Tim Fox och handlade om vertx.io.
Detta hade jag redan lite kunskap om tidigare, och det var kul att höra lite mer om detta lovande ramverk. Passade även på att ställa lite väl valda frågor till Tim efteråt.
Vertx.io löser ett ganska vanligt problem som dagens Web 2.0 appar måste lösa, nämligen en smidig kommunikation mellan server tillbaka till klienten, dvs comet, ajax-push osv vad alla namn kan tänkas vara.
Serverkod körs i en enkeltrådad event-loop, likt node.js, all kommunikation görs via en eventbus (hazelcast). Det fiffiga är att även klienter kan anropas på samma eventbus, gömt för app-utvecklaren.
Klienten har tillgång till att inkludera vertx.js-javascriptet, och kan därefter lyssna och ta emot json-data via denna event-bus. Klienten kommer utnyttja websockets om browsern stödjer det, eller använda i nedstigande ordning; SockJS, long-polling, timed-polling.
Jag tror vi kommer se mer av detta ramverk, han är trots allt backad av VMWare.

Mäss-mingel

Efter detta var det mingeldags. JetBrains och Spring fick mestadels av min tid. Jag är numera kändis på JetBrains hemsida, då deras kameraman sprang runt och ville fånga alla olika nationaliteters beröm. Det kommer komma en film där de klipper ihop olika språk som berättar hur fantastisk deras IDEA är.

Spring Cloud Foundry blir en ny konkurrent inom PaaS. Deras setup är mycket lik Amazon EC2, där de i princip har ett appmoln med tomcats, riak, mongodb, mysql, postgre etc.
De har en fin plugin till eclipse och IDEA 12 har en plugin klar i pipan.
En fiffig feature är att om man har en spring-applikation, kan CloudFoundry autokonfigurera och injecta bönor med dataSources rakt in i din app, autoconfig kallade de detta, verkar ganska smidigt.

Torsdag

Keynote

Keynote-dags igen, Googles tur att skryta lite och Tim Brady stod för vocals.
Google har gjort en rad förbättringar och förenklingar i GAE/J som verkade lovande.
Maven och jenkins-integration och möjligheta att auto-deploya ett bygge till GAE/J smidigt direkt efter success i jenkins. Bra för continous deployment.
GAE/J har nu traffic-splitting så att man smidigt kan lyfta över lite trafik åt gången till sin nya version, lite live-testning a’la FaceBook, smidigt.

Tim var näst intill aggressiv i sitt framförande om hur viktigt säkerhet är på nätet, och hur viktigt det är att vi utvecklare tar ansvar för våra kunders data.
Han praktiskt taget skrek ut: ‘ANVÄND HTTPS’, varefter han promotade 2-step-verifcation, och att alla borde använda det. Han promotade sedan OAuth2, och tyckte att hela världen helst skulle logga in via deras SSO-lösning, och inte någon annan. Man skulle absolut inte skriva en egen login, då det var svårt och skulle bli hackat for sure.
Hur läskigt ett internet där alla loggar in via OAuth2 än må vara, verkar det vara en bra och säker lösning, speciellt tillsammans med deras nya Account Chooser, som enkelt gör val av olika OAuth2-leverantörer enkelt.
Efter detta var det en kort intro till Dart. Dart löser samma problem som JetBrains Kotlin och RedHat Ceylon enligt mig, speciellt eftersom det ännu inte ens kör i Chrome, utan endast i en special chrome-variant kallad Dartium. Alla tre språken är snygga, bra, genomtänkta och har lambdas etc, ser ingen klar vinnare här ännu.

Blandad kvalitet

Halkade sedan snett in i vad jag trodde skulle vara en intressant presentation om G1.
Det visade sig vara en Jaromir Hamala, som borde gå en ordentlig engelska-lektion (något år eller två). Tyvärr kunde man inte se denna föreläsning, och det fick istället bli lite BigData och Hadoop.
Costin Leau presenterade en rad olika snygga wrappers för att få in Hadoop-algoritmer i ditt Spring-projekt.
Antingen kan man använda Apache Pig, PigRunner och specifikt PigTemplate. Pig utnyttjar ett speciellt query-språk kallat Pig Latin för att beskriva dina map-reduce steg. PigTemplate trycker in och sätter upp en Hadoop och en Pig i ditt spring-projekt, smidigt.
Alternativ två som demonstrerades var HiveTemplate, som i praktiken gör samma sak, men där utnyttjar man Hive och specifikt HiveSQL som query-språk.
HiveSQL är nästan som SQL, men med lite extra socker för att göra allt distribuerat och map-reducigt. Verkar vara enklare att använda och hans exempel med HiveTemplate såg bra ut.

Costin visade sedan hur man med Spring Batch, Spring Integration och någon av tidigare valda tekniker kunde bygga en snygg graf av händelser för att distribuerat parsa stora mängder loggar.

Flera olika sources i Spring Integration samlade loggar, som skrevs till en fil eller katalog, varpå dessa processades av olika steg m.h.a HiveTemplate, mycket snyggt.

Project butter

Chet Haase och Romain Guy, Google, förklarade sedan varför deras operativsystem Android alltid har haft lagg och vad de kalla ‘jerk’, vid t.ex. scroll av table-views, drag av ikoner över skrivbord etc, och hur de löst problemen nu till sist, iom project ‘Butter’ i android 4.1 Jelly Bean.
Inte en dag försent enligt mig.
En mycket teknisk genomgång av tripple-buffering och annat ganska intressant, men det mest intressanta var deras tooling de presenterade.
De har byggt en fin uppsättning verktyg för att hitta och identifiera exakt vad som sker i Android då visuella problem uppstår.
De hade live-kodning, som så många andra under Devoxx, och visade DumpSys, SysTrace, TraceView och Allocation Tracker.
Allocation Tracker är ett program jag tycker Oracle skall skriva ihop och skicka med i deras JDK, nu måste man ju köpa dessa produkter separat.

Ceylon

I ett extrainsatt nummer presenterade sedan Gavin King RedHat’s senaste språk, Ceylon.
Han var inte alls förberedd, då han blivit inkastad i sista stund.
Det blev en enminuters intro, sedan rakt in i eclipse och deras egengjorda Ceylon-plugin.
Ceylon är starkt typat och kompilerar till javascript och bytecode.
Gavin valde att lägga hela tiden till att visa hur man bygger tupler för hand, och hur man kan med det kraftfulla typsystemet skapa listor som består av olika typer, t.ex. List<String, Integer, Float>, och hur man sedan kan skapa en operator som kan addera en sådan lista med en annan sådan lista.
Ganska trevliga saker, enkelt att förstå, och framförallt extremt bra plugin som meddelar typfel direkt. Ceylon gör otroligt intelligenta statiska kompileringar, han har gjort ett bra jobb, skall bli intressant att testa.

Java posse

Efter detta blev det en stunds avslappning med en öl i hand, då JavaPosse 2012 spelades in live i en av salongerna. Kanske en aning utdraget, men roligt trots allt.

Tillbaka in i allvaret igen fortsatte Daniel Spiewak att förklara hur han gått till väga när han skapade sin kompilator till sitt språk han utvecklar på Precog.
Energisk i sitt framförande vandrade han fram och tillbaka barfota i sina slitna jeans framme vid podiet, denna mannen brann för att koda avancerade saker, mycket inspirerande.
Han hade tagit fram en konstruktion som han kallade Atom. Namnet kom av total idébrist enligt Daniel.
En Atom var en klass, med en metod, som utifrån sett var helt pure, men internt var mutable.
Ganska intressant lösning på problemet att populera noddata i ett spanning tree, när kompilatorn vandrar nedåt. Ärvda attribut är sällan ett problem men när man har ett språk som hanterar lambdas som skall evalueras i ett senare skede är det problematiskt. Den enklaste lösningen är att vandra genom hela trädet (grafen) igen då ett lambda påträffas. En annan är att skapa denna typen av lazy-init-data-holders.
Klart intressant, men man var helt slutkörd efter att ha dels lärt sig scala, och dels tagit upp grafteori igen, allt på mindre än 40 minuter.

Spring 3.2

Josh Long presenterade sedan nyheter med Spring 3.2.
Han ägnade stor tid åt att repetera vad 3.1 innehöll men kom till sist till 3.2.
Bland nyheterna kan man hitta async processing i Servlet 3.0 som vi väntat på i ca tre år. Josh Long är för övrigt ganska kort.
De har byggt ut stödet för mockning vid test, och lagt in en rad nya mock-objekt och byggt på de gamla en del.
Det finns nu generic factory methods, som möjliggör att mockning blir korrekt i samtliga tester, om man utnyttjar Mockito eller EasyMock.
En annan trevlig nyhet är det utbyggda stödet för att testa hela web-appen smidigt med deras junit-runner.
Allt är stiligt konfigurerat, med convention over configuration, och flertalet olika mock-mekanismer går automatiskt igång för att testa dina controllers på ett smidigt sätt.
Även lite förbättrade konfigureringsmöjligheter vid test-setup har tillkommit via ContextInitializers.
Tester kan nu även ha hierarkier av spring contexts, vilket inte fanns tidigare. Detta möjliggör att ha samma konfig som i produktion om man så önskar.
Sammantaget kan man säga att VMWare har lagt mesta energin på att förbättra för testbarheten i spring, vilket vi givetvis välkomnar.

Bästa presentationen

Eftersom inspelningsutrustningen inte fungerat, körde sedan Chet Haase sin presentation igen, som handlade om framtidens Processer.
Detta var bland det roligaste jag sett i form av presentation, av en smart och karismatisk programmerare.

En hand-jagad version av hans presentation finns här: https://www.youtube.com/watch?v=b8H90xr61FY

Med lite belgisk choklad under armen lämnar vi Antwerpen med dess fantastiska katedral bakom oss för den här gången.

Sammanfattning

Lite allmäna reflektioner om konferrensen gäller hygien och könsfördelning, dock inte sammanhängande.
Det var 4% kvinnligt deltagande i år, 4%. Det är lite, och det påpekades av flertalet arrangörer och talare. Det lite ironiska är att Stephan i sin keynote frågade publiken om hur många som ‘doesn’t have an erection now?’ när han visade sin nya funktion i parleys.com. Det kan ju vara plumpa skämt som detta som skrämmer bort våra kvinnliga programmerarvänner kanske.
Vidare till hygien då. Belgare och fransmän och deras cigaretter. Det röks, och inte lite, och inte långt utanför där alla sitter.
Faktum är att det röks precis utanför byggnaden, och all denna rök letar sig med enkelhet in via ventilation och öppna dörrar.
Vidrigt.

De hade styrt upp WiFi riktigt ordentligt, och trots 3400 deltagare fungerade WiFi…ibland. Inte första dagen, men andra fungerade det utmärkt…ish.

Alla fick ett åkband som innehöll ett NFC/RFID-chip. Detta kunde man utnyttja till att rösta Upp eller Ned efter man sett ett bidrag. Vidare kunde samma chip utnyttjas till diverse mat-utdelningar, öl-utskänkning, omröstningar och annat i olika montrar, genom att de scannade med en tablet eller telefon. Detta fungerade imponerande väl och gjorde allt betydligt mer strömlinjeformat än tidigare konferrenser.

Talarlistan var inte speciellt stjärnspeckad men konferrensen bjöd ändå på mycket matnyttigt och intressant, och sammanfattningsvis var den bra arrangerad i sin helhet.

 

Scrum i kravarbetet

No Gravatar

I mitt nuvarande uppdrag jobbar jag med att ta fram krav för utvecklingsteamen. Eftersom jag är van att jobba med scrum som utvecklare saknade jag det nu när jag började jobba med krav. Det jag framför allt saknade var möjligheten att kunna jobba efter en synlig prioritering och strävan efter att få saker klara succesivt istället för att allt blev klart ganska nära inpå den nya sprinten började. Jag har därför börjat jobba scrum-ish även nu när jag jobbar med krav.

Effekten hittills har framför allt varit att vi har fått ökad arbetsro, eftersom det blir tydligt vilken planering vi har för en begränsad tid framöver, och jag känner även själv att jag strävar mer efter att bli klar med enskilda arbetsuppgifter så fort som möjligt för att undvika för mycket parallellt arbete.

Verktyget som vi valde att använda är Trello. Det är ett gratis och mycket användarvänligt webbaserat verktyg där man konfigurerar det mesta själv efter behov direkt i de vyer man använder funktionen. I Trello kan man ha flera bräden, boards, där vi använder ett bräde per sprint och ett bräde till vår backlogg. Varje bräde kan ha så många kolumner man önskar och i kolumnerna lägger man lappar, cards. Vi har i dagsläget valt att ha kolumnerna:

  • Att göra
  • Håller på med
  • Nästa steg är inbokat
  • Väntar på något
  • Klart

Vi börjar varje sprint med en planering. Då ser vi över hur många arbetsdagar vi har att tillgå i teamet och pratar med produktägaren för produkten vi kravställer om vad vi ska göra och i vilken ordning. För varje sak som ska göras skapar vi en lapp på det i Att-göra-kolumnen. Det går enkelt att ändra prioriteringen genom att dra och släppa lappar inom kolumnen.

Ett exempel på en scrumtavla för ett kravteam. All information är påhittad.

Ett exempel på en scrumbräde för ett kravteam. All information är påhittad.

För att kunna följa upp hur väl vi lyckas hålla oss till det planerade arbetet markerar vi upp vilka lappar som planerades från början med en etikett, label, som syns som en färgmarkering i överkanten av lappen. Om det kommer in nya arbetsuppgifter under sprintens gång bedömer vi om de är prioriterade och lägger i så fall in dem som lappar i att-göra-listan.

Varje morgon har teamet en avstämning där vi tittar igenom brädet. Om någon lapp har hinder för att fortsätta jobba på den markerar vi den med en etikett, vi har valt rött.

Etiketterna konfigureras enkelt direkt i gränssnittet och har både färg och text. Det finns till och med möjlighet att slå på ett filter så att etiketternas färger blir anpassade för färgblinda!

Lappar kan tilldelas en eller flera medlemmar på brädet. Man kan även lägga till checklistor, vilket vi brukar använda för att markera vilka arbetsuppgifter som ingår i en lapp. På brädet ser man tydligt hur många punkter som är klara och inte.

En lapp med en checklista och två etiketter

En lapp med en checklista och två etiketter

Checklistorna kan kopieras, vilket underlättar för oss som har ett gäng punkter som ska uppfyllas innan ett krav anses klart. Det är vår Definition of Done, som fungerar bra att använda även när det gäller krav. Checklistan i bilden ovan är bara ett exempel.

Vi har även börjat uppskatta storleken på våra lappar och gör ett burndown-diagram där vi räknar ner hur mycket som inte är klart. Det ger också en strävan efter att bli klar med lappar successivt och en indikation på om vi jobbar oss framåt eller inte.

Trello har bland annat en iPhone-app men det är enklast att använda Trello direkt i webbläsaren.

iPhone-app

iPhone-app

Det kommer kontinuerligt nya features, en av de senaste är att man kan filtrera brädet, t ex för att se vilka lappar som har en viss etikett (vilka som har hinder) eller för att se vilka lappar man själv är medlem i.

Ta gärna en titt på Trello och se om du kan använda det i din vardag. Och om du jobbar med kravställning i en agil utvecklingsorganisation kan det fungera bra att även jobba agilt med kravarbetet!

Øredev 2012

No Gravatar

We, Adam Lith and Magnus Härlin, from Squeed attended the Øredev conference this year, and we want to share our experience of this event.

How pairing adds value – Lisa Crispin (@lisacrispin)

Lisa Crispin made an excellent presentation on the subject of pair programming. She discussed why people might have a hard time starting to pair up, such as feeling uncomfortable and exposed. She also made several good arguments of the downside of pair programming as in the difficulty to get in the “zone”. She made one point which gave a nice transition to the next session we went to by Ryan McGeary, and that point was that even though you have a harder time getting into the zone as a pair, you will have a much more disciplined focus from not having your attention stolen from things such as Twitter, Facebook or emails.

Asynchronous Collaboration – Ryan McGeary (@rmm5t)

All in all this was one of the most thought provoking presentations, touching a very controversial subject, and therefore it deserved its very own blog post.

Software won – so what now? – David Rowan (@iRowan)

Volunteer your time and make great things. Lots of charity hacker groups have popped up and helped in different areas like maps with weather forecasts and videos from the New York storm.

Anything is possible. The tools and the platforms are here, the developers are the rock stars and can change the world.

Organizations where you can report if you paid a bribe to any official with all the data open so that everyone can see who are taking bribes and the extent of the corruption. With open data a lot can be achieved.

2 billion people currently connected to the internet, a number that is estimated to grow to 5 billion within 5 years. The reach of a good idea is endless.

Pure Functional Javascript – Christian Johansen (@cjno)

Informative session focusing on how to only use side effects and mutability where it is really necessary and the benefits that gives.

Pure functional functions are functions without side effects which make them easier to test and the risk for subtle bugs is reduced. The functions that have side effects should be isolated.

It is possible to use first class functions, functions that are declared as variables. That enables higher order functions that accepts functions as arguments or functions that return other functions. Utilizing that makes it easier to create small abstractions for common tasks.

For-loops can often be replaced with the foreach, map or reduce depending on the purpose of the loop. It gives a shorter more readable code.

Advanced Raven Db – Aeynde Rahien (@ayende)

Raven Db is a document database and compared to a lot of other document databases it has good tooling to view, update, import and export data. The size of the database only has a fractional impact on performance for read and write operations. The indexes are automatically created based on usage. First time a query is run a temporary index is created, it takes between 10 – 20 ms. If the same index is used multiple times it will be persisted as a permanent automatic index. All index updated and creates are done on the fly by a background thread. 

Any data that is stored can be queried. Raven utilizes Lucene so it is possible to make full text search as well as fuzzy search that gives suggestions if no matches are found. For data aggregation map reduce queries are used and they are created automatically and can also be updated without being recreated if the underlying data is changed. 

The Raven Db server can be run as a console application, in memory or as a Windows service. When running tests it’s very handy to use the in memory server. The only thing needed is to change to the connection string.

Micro-Services Architecture – Fred George (@fgeorge52)

As the session heading suggests, Micro-Service architecture consists of a lot of small services that only have one responsibility each which makes them quite small at about 100 lines of code in each service. This enables very rapid deployment of each service as soon as it is ready for release. Every service should be able to be deployed on its own. The messages that are passed around by the services are formatted in JSON. In the reference project that Fred referred to they had used Kafka for message passing. 

By using this setup the the micro services are made language agnostic. The services should be self monitoring and report problems that stops message processing. Multiple versions of the same service can exist, this way there won’t be any problems with several services needing to be updated at the same time.

Git scaling at GitHub – Vicent Martí (@vmg)

Vicent talked about the challenge of scaling the Github service. We won’t go into the details of this, but it was truly fascinating and we as windows users look forward to the future release of libgit2!

A note worthy to mention was that Vicent was excellent at rhetoric, and we would gladly listen to him again.

Exploring Datomic – Tim Ewald

This session blew our minds. Tim held a session about the Datomic database, with a very unique rethinking of the client-server architecture of most databases today. If this database is as promising as described by Tim, then you can expect a whole blog post about it in the future, once we have studied it more.

Build Web Apps Much Faster – Steve Sanderson (@stevensanderson)

Microsoft has release Windows Azure Mobile Services that is a backend service for simpler web applications, like mobile sites. By using the services you can just plug in authentication against Twitter, Facebook, Google and Microsoft Accounts. There is also a data store that is easy to use. It accepts json messages and automatically created the database structure based on the content. There is also the possibility to set up server side scripts that can be hooked in before an data manipulation to update the incoming request. The service runs on node.js and can use socket connections to make real time updates on the client.

Asynchronous Collaboration – Ryan McGeary at Øredev 2012

No Gravatar

Maximize flow, and minimize interruptions. That was the main focus of Ryans message, but at a more detailed level he argued for why all sorts of communication which had a social convention of “you should answer this right away” should have a minimum possible occurrence. This include phone calls, direct talking, instant messaging etc. One should also turn off all forms of intrusive notification systems on the computer as well as your portable devices. This includes popular services such as Facebook, Twitter, and even email.

But why? Because we want to get in the zone. We want flow. If someone else in the team needs our attention, they should always need to ask themselves how urgent the matter is, and if there is only one specific person who could help them, or if anyone in the team could be of equal use. If the answer is that they need You, and it must be Now, then use direct talk, or call them. If it’s not urgent, then he should use the issue tracker. If it doesn’t have to be you, then he should utilize a persistent group chat tool (that does not have intrusive notifications) to ask the entire team for help, and whoever is not in the zone can be of assistance.

Have you ever thought of why, when you interrupt a developer who is in the zone, he usually looks at you with a stare that feels like it could burn the back of your skull? That is because when writing software you do a lot of mental construction, sort of like building a house of cards in your mind. When he gets interrupted, even just with the question “may I interrupt?”, then what you have done is you just stepped all over his house of cards. Hence, the stare.

So we should all try to be more respectful of each others thought process.

Ryan also argued against daily stand-ups, and how the same information could be conveyed to everyone in the team equally well by using the issue tracker and group chat.

All in all this was one of the most thought provoking presentations, touching a very controversial subject.