Man lever så länge man lär

Arkiv för kategorin ‘programmering’

Det kliar i fingrarna

Ja, ibland gör det faktiskt det. Inte precis bokstavligt, men i alla fall bildligt talat. Till exempel när jag tagit in en massa ny[gammal] information och känner behov av att formulera egna reflektioner kring denna. Då flyttar jag över min privata dator till datorbordet, kopplar in externa bildskärmar och går till WordPress.

Fast i detta nu handlar det inte så mycket om tankar som dykt upp medan jag sugit åt mig tips och idéer kring mjukvaruarkitektur, utan om något annat som jag inte riktigt kan sätta fingret på. Och det är ju då skrivandet är mitt bästa verktyg, ity ordsmidet oftast skapar den struktur och ordning jag eftersträvar.

Jag misstänker att det här skrivandet har något att göra med semester och att jag börjar få lite ångest över den totala bristen på aktivitet, fast jag redan är inne på tredje veckan. Tänk att komma tillbaka till jobbet efter dryga fyra veckor och inse att en har gjort samma saker som alla andra veckor på året. Hugaligen!

En av föreläsningarna jag kikade på igår handlade om att bygga sin egen teknikradar, liknande den som ThoughtWorks släpper cirka två gånger per år. Och när jag mediterade lite över det insåg jag att jag egentligen redan har en sådan. Bara inte strukturerad på samma sätt som deras. Eller, i ärlighetens namn, inte så värst strukturerad alls. Det är en (eller flera, beroende på hur man räknar) Trello-tavla, med idéer och planer kring sådant jag vill lära mig mer om. Och då handlar det om mjukvaruutveckling – det är nog säkrast att påpeka detta för mig självklara; folk skulle ju faktiskt kunna tro att jag hade andra intressen.

(Nej, jag är aldrig ironisk eller sarkastisk. Alls. Jag lovar. Absolut inte. Aldrig! ;-)

Hur som helst handlar det här med teknikradarn om att kartlägga och skissa sin egen väg i den mjukvarutekniska djungeln och därmed både skapa en plan för framtiden, och visualisera vägen i backspegeln. Jag tror att det är ett jättebra sätt att se hur långt en har kommit och tydliggöra vart en vill fortsätta vidare.

Jag känner (vilket verkar vara något som händer med ojämna mellanrum) behov av att skapa mål och mening och ha en plan för att inte behöva tänka och det är väl där som idén om att återvända till den akademiska världen gör sig påmind. Att vara inskriven på, och följa, en universitetskurs innebär ju att hela tiden veta åt vilken nytta fritiden ska ägnas. Som sagt: inte behöva tänka utan bara göra.

Igår loggade jag, för första gången på säkert ett år, in på antagning.se för att titta efter distanskurser som är öppna för sen anmälan. Två av dem på kvartsfart lockade lite (Datorarkitektur I och Programmering i C), men jag kommer inte att skicka in någon anmälan. Det känns dumt att låsa upp sig, även om jag tror att åtminstone C-kursen skulle vara ganska lätt avklarad. Men för att programmera i C behöver jag ingen kurs – dels skrev jag själv en del C-program på 90-talet och dels har jag en sambo som länge jobbat med just att programmera i C. Det som skulle tala för en kurs är nog främst att det kan ge fokus och motivation – och sen dessutom ytterligare några små, trevliga högskolepoäng i samlingen.

Vad gäller datorarkitekturen verkar kursen rolig och är garanterat nyttig, men jag tror inte att jag har den motivation jag skulle behöva för att ta mig igenom den. Jag har dåligt samvete över att jag inte färdigställde cloud-kursen förra året, så med jämna mellanrum funderar jag på om det vore värt att plocka upp den igen eller om jag kan hitta ett sätt att lägga den bakom mig så att den slutar störa. Därför vill jag inte skriva in mig på fler kurser som kan öka min mentala börda.

Sedan ska man nog inte glömma att jag börjar på nytt uppdrag i september, vilket kommer att ställa en del nya krav på mig och mina mentala förmågor. Innan dess kommer jag nog också att ha rätt fullt upp med att avsluta det gamla uppdraget på bästa sätt – dels leverera värde och dels i någon mån lämna över. Vad det nu kan finnas som behöver lämnas över innan jag lämnar projektet. Jag har ju ingen unik kunskap om systemen vi jobbar med, är ingen nyckelperson inom något specifikt område. Jag är mer allmänt kunnig och erfaren i projektet, och det som just jag vet och kan är inget som är konkret och uppräkningsbart.

Det som känns tråkigt med att sluta är just det att mycket av det jag samlat på mig under dessa år går till spillo, d.v.s. inte kommer projektet till godo – jag hade verkligen haft en massa värde att bidra med om jag hade stannat kvar. Kunskap och erfarenhet, såväl som sedvanlig utvecklarkompetens. Men det är inget nytt, jag har ju bidragit med allt det där under mina fyra och ett halvt år och förr eller senare blir det nödvändigt att gå vidare. Inte minst för min egen skull, för min egen utveckling. Jag vill lära mig nya saker och jobba med mina egna kollegor!

Visst, det både går och känns tryggt och bra i uppdraget och vägen framåt är tydlig, och det hade varit väldigt lätt att stanna och fortsätta in över mållinjen (som jag i och för sig tror flyttar på sig, lite grann, hela tiden), men jag vill inte vara den som är sist kvar eller (som är alternativet) bli kvar för tid och evighet.

Men nog om uppdraget – jag hade ju tänkt att skriva om min fortbildning!

Jag är intresserad av många olika saker när det gäller mjukvaruutveckling, men har insett att jag måste hålla igen och fokusera för att det annars lätt blir vare sig hackat eller malet, d.v.s. inlärningen blir fragmenterad och ingenting blir färdigt. Jag har därför valt att prioritera områdena mikrotjänster, arkitektur och Kotlin.

Min fortbildning har så här långt huvudsakligen handlat om att titta på inspelade resp. interaktiva föreläsningar. Jag har uppskattat och haft bra utbyte av flera online-kurser med Sam Newman på ämnet mikrotjänster, respektive inspelade videokurser med Neal Ford och Mark Richards om arkitektur. Vad gäller Kotlin (programspråk) har det inte gått lika bra, men jag har i alla fall kikat på ett par kurser/föreläsningar och kodat lite på min vanliga applikation. Semesternöjen!

Jag undrar vad det ska bli härnäst?

Jag känner mig ganska nöjd med det här första steget kring mikrotjänster och mjukvaruarkitektur och tycker att jag fått den hyfsade överblick och förståelse för ämnena jag önskade när jag började. Hm, dock har jag ytterligare ca 10-20 timmars föreläsningar på min önskelista, så det kanske inte är slut riktigt ännu. Jag tror på upprepning, både för att jag har teflonminne och för att det är nyttigt att ta del av olika personers syn på ett och samma område. Mångfald berikar.

Med tanke på vad som komma skall skulle det möjligen vara bra att bekanta sig med React, vilket i och för sig stått med på listan även tidigare men nu placerat sig en bit högre upp – eftersom det tycks användas rätt flitigt på nästa uppdrag.

Efterhandskommentar:
Och det här inlägget blev, som så många andra tidigare, inte heller färdigskrivet när det begav sig, så jag publicerar det nu, senare, på dess ursprungliga datum. (Det är roligt att läsa inlägget med perspektivet från två månader framåt i tiden.)

Min roll som Certified ScrumMaster®

Några av er vet redan detta, och någon av er kanske också läste det i mitt förra blogginlägg, men för er andra: nu för tiden jobbar jag inte bara som utvecklare utan har också tagit rollen som scrum master i det utvecklingsteam jag tillhör. För enkelhetens skull kallar jag det för ”mitt” team, om än jag varken äger eller ansvarar för det mer än någon annan i teamet. En för alla, alla för en, ni vet. Men det är klart: jag är samtidigt också stolt över att det är just mitt team.

Mine! (om ni minns Finding Nemo?)

Så vad menas med scrum master? Ja, det är en av rollerna i ett Scrum-team, och lite om detta finns att läs i Den Officiella Scrum-guiden – här på svenska. Scrum är ett arbetssätt som ska underlätta leverans av sånt som ger värde.

Scrum (n): A framework within which people can address complex adaptive problems, while productively and creatively delivering products of the highest possible value.

Min roll som scrum master handlar i dagsläget mest om att stötta teamet och arbetssättet, som visserligen är inspirerat av Scrum, men kallas ”scrum-ish”. Exempelvis ser jag till att planering och återblickar genomförs (eftersom det både är ett krav från projektet och i arbetssättet, och något som hjälper teamet på olika sätt) och jobbar mer allmänt med att underlätta och förbättra teamets arbete, t.ex. genom att undanröja hinder och kratta banan för ett effektivt och fokuserat arbete. Men mina främsta uppgift är möjliggörande – teamet gör jobbet, jag assisterar. Jag gillar den här formuleringen jag hittade hos Citerus:

Det är viktigt att komma ihåg att bakom begreppet “scrum master” gömmer sig den tidlösa idén om den stöttade (sic!) ledaren. Någon som finns på plats för att ge andra makt, snarare än för att utöva den själv.

Även om det är mäktigt frestande att gå in på och diskutera inlägget som helhet, ska jag försöka hålla mig till ämnet i mitt kaninhål; men läs blogginlägget, om du är intresserad av agilt arbetssätt och scrum masterns roll – inlägget inspirerade och bekräftade insikten om att en inte borde bära dubbla hattar så som alla vi scrum masters i projektet gör. Det är inte optimalt att agera i två dimensioner samtidigt, eller om man så vill: med fokus på två tämligen ortogonala områden. Vi tvingas byta sammanhang ofta, och måste därmed också hitta strategier för att göra det så smärtfritt som möjligt, t.ex. genom att inte behöva göra det så ofta. Just växlingarna i mentalt fokus kräver en del av människan i rollerna.

Här påminns jag om den gamla godingen, som känns precis lika aktuell idag som den gjorde då: Joel Spolskys "Human Task Switches Considered Harmful. Jag äger så klart den legendariska Boken, men hittar den inte just nu – det kan vara en av böckerna jag lånade ut till en mer junior kollega för en tid sedan.

Sidospår, men läs gärna Joel on Software – själv fortsätter jag där jag var.

Vad jag tänkte säga om scrummästeriet är att jag i någon mån strävar efter att smälta in i bakgrunden. Om vi bortser från att jag personligen inte gillar att stå i centrum, är det mer frågan om att det är teamet som är maktfaktorn såväl som det centrala i vårt arbetssätt. Det är t.ex., eller borde i alla fall vara, teamet som pratar med teamet på de dagliga möten. Jag som scrum master finns till för att hjälpa teamet jobba optimalt, med både nytta och nöje som resultat. Flummigt? Kanske. Men i slutänden handlar det förstås om att vi ska genomföra projektets uppgift, och samtidigt bygga en arvsmassa som vi själva och andra (teamet har både konsulter och anställda) kan jobba vidare med när projektet inte längre finns. Och stötta verksamheten genom att hålla systemet igång, användbart.

Heh. Medan jag skrev detta blev jag påmind om att jag hade en kvarstående uppgift sedan kursen i slutet av januari – jag skulle ju skriva provet för att bli certifierad scrummästare, eller mer internationellt: Certified ScrumMaster®.

Så det gjorde jag och här ser ni, som bevis, delar av resultatet (=certifikatet):

Certifikat: Certified ScrumMaster

Jag kan alltså numera titulera mig Certified ScrumMaster®, eller CSM.

Innan jag skrev själva provet läste jag noga igenom Den Officiella Scrum-guiden och kikade parallellt i onlinedokumentet på originalspråket, The Scrum Guide™ (eftersom jag inte litar på översättningen, som rent språkligt kunde vara bättre). Jag lade då märke till att några stycken saknas i den svenska versionen och spekulerade i varför. Rent förbiseende? Troligen, men vore det inte roligare om den som översatt hade ignorerat de passager vederbörande inte höll med om?

Nog om detta… Här är några citat från guiden:

Scrum Master

Scrum Mastern ansvarar för att säkerställa att Scrum förstås och efterlevs. Scrum Mastern gör detta genom att se till att scrumteamet håller sig till scrumteori, tillämpning och regler.

Scrum Mastern är en tjänande ledare för scrumteamet. Scrum Mastern hjälper dem utanför scrumteamet att förstå vilka av deras interaktioner med scrumteamet som är till nytta och vilka som inte är det. Scrum Mastern hjälper alla att förändra dessa interaktioner för att maximera det värde som skapas av scrumteamet.

Intressant här är att jag tydligen ska fortsätta bry mig om saker utanför teamet. Sådant som försvårar eller kan underlätta vårt arbete. Trevligt att det är så pass tydligt uttalat. Dock ska man inte glömma att vi inte jobbar enligt Scrum, utan ”scrum-ish”. Eller "scrummish" som låter lite roligare och säkert kan tolkas fel. Eller varför inte ”Scrum-isch”, med tanke på missnöjet med bristande flexibilitet.

Vad Scrum Mastern gör för utvecklingsteamet

Scrum Mastern hjälper utvecklingsteamet på flera sätt, t ex genom att:

  • Coacha utvecklingsteamet i självorganisering och tvärfunktionalitet;

  • Hjälpa utvecklingsteamet i att skapa produkter med högt värde;

  • Undanröja hinder för utvecklingsteamets framsteg;

  • Vägleda vid scrumaktiviteter om så ombeds eller behövs; samt

  • Coacha utvecklingsteamet i organisationer där Scrum ännu inte har införts eller förståtts fullt ut.

Här känns det mer som att jag har en tämligen lång väg att gå för att leva upp till beskrivningen, men tröstar mig med att vi ju inte jobbar Scrum och att jag p.g.a. dubbla roller i teamet faktiskt inte har utrymme att ta mig an samtliga punkter. Lustigt nog kan nog detta vara min väg mot coachningen vi brukade prata om; jag och forntida chef trodde alltid att jag skulle hamna i någon coachande roll.

Med allt detta sagt är jag ändå ganska nöjd med min roll som scrum master på deltid, och jag tänker fortsätta pimpa Moomin-tavlan så att omgivningen även framledes kan stanna till och inspektera alla små lustigheter jag hittar på för att göra den roligare att jobba med. Och att läsa. Nästa sak jag ska fixa är någon form av avgränsare för de olika ytorna – jag tänkte prova med presentsnören. Kuliga magneter ligger och väntar i ett aviserat paket, som jag hämtar ikväll.

Det här känns som en bra dag, måste jag säga. Jag har haft kompledigt p.g.a. alldeles för många arbetstimmar tidigare i veckan, och tittade på en intressant video, vilket var det som fick mig till datorn då jag ville blogga om videon och inspirationen den gav mig, men jag halkade i vanlig ordning in på ett sidospår och kom att skriva om det här scrummästeriet i stället. Tänk så det kan bli!

Att kunna är icke att få eller göra

Om det verkar för bra för att vara sant så är det förmodligen det också.

Det må vara att vi numera använder WLS 12 och JDK 8 i projektets miljöer, men det är ändå inte fritt fram att använda det nya som nu erbjuds. Vi ska ännu en tid skriva koden enligt Java 6 – förstå hur gammalt det är! Förhoppningsvis släpper man dock handbromsen någon gång framåt, eller strax efter, jul.

Jobbmässigt gäller annars påfallande ofta principen om ett steg fram och två tillbaka. Så snart det mot alla odds anas en strimma ljus vid horisonten, och man hunnit börja hoppas igen, får man ånyo en slemmig torsk rätt i nyllet.

Jag funderar en del över vad jag ska ta mig för framöver och känner på några trådar, men inget är bestämt och jag vet inte ens själv vad det är jag vill. Men det går säkert att ta reda på – som alltid är det viktigaste att ta ett nästa steg.

Och under tiden är det bara att bita ihop och köra på och göra det bästa av det som är. I morgon ska jag jobba hemifrån i förhoppning om att kunna fokusera ordentligt och få min aktuella uppgift effektivt utförd – jag behöver göra mig av med den och det finns inget bättre sätt att uppnå det än att göra jobbet. Vissa saker är jobbigare än andra, men om man inte börjar blir man heller inte klar.

Problemet med just den här uppgiften är dels att den är ganska omfattande och kräver en hel del koncentration, vilket är varför det känns så jobbigt att börja. Och så det faktum att det är i samma härad som jag varit i förut (och blev trött av då också) så det är lite känslan av ”been there, done that”. Fast egentligen har jag bara varit någonstans i närheten, så det här gör det jobbigt också för att jag behöver sätta mig in i ännu en tämligen okänd och komplex funktionalitet. Idag lusläste jag specifikationer och identifierade diskrepanser dem emellan, vilket resulterade i en lista om nästan 25 punkter skickad till upphovsmännen. I morgon påbörjar jag implementation och hoppas på respons innan den är klar.

Jobbigt blir det, som sagt, men jag vet ju att när jag väl är igång handlar det nästan bara om att vara systematisk och tålmodig. Och noggrann. Jobbar jag testdrivet slipper jag dessutom hålla alla detaljer i huvudet utan kan förlita mig på mina tester – allt jag då behöver tänka på samtidigt är den mindre mängd funktionalitet som bor i just den del eller det lager jag för tillfället jobbar med. Precis så som jag läst om i artiklar om hur en liten hjärna kan hantera stora modeller. Utifrån en viss abstraktionsnivå zooma in och zooma ut efter behov. Visualisering och rationalisering. Fokus på det centrala, ignorera det som stör.

Jag kan tänka länge på hur jag ska göra, för det innebär att jag slipper börja.

Socialstyrelsen rekommenderar: Java SE 6 → 8

Äntligen!

Från och med nästa vecka kommer jag att i tjänsten att kunna utveckla i/med/för en nyare version av Java, tack vare uppgradering av applikationsservern till en version med stöd för Java SE 8 (och Java EE 7). Det vill säga, vi kommer att göra en tidsresa från 2006 till 2014 om man tittar enbart på Java SE-versionen. Sedan i september finns ju även Java SE 9 att tillgå, men WLS-stödet saknas.

Så vad innebär det här för oss? Ja, WebLogic Server går från 11gR1 (10.3) till 12cR2 (12.2), vilket i sin tur medför att Java SE 6 → 8 och Java EE 5 → 7.

I min värld innebär själva WLS-uppgraderingen ingen större påverkan för mig – eller rättare sagt: jag vet inte vad den innebär. Uppgraderingen av Java SE, däremot, gör det lättare för oss att skriva bra kod. Programmera funktionellt!

Förändringarna i själva programmeringsspråket för både Java SE 7 och 8 listas på What’s New in JDK 8, men de jag främst ser fram emot är följande:

Java SE 7

  • Binary Literals
  • Strings in switch Statements
  • The try-with-resources Statement
  • Catching Multiple Exception Types
  • Underscores in Numeric Literals
  • Type Inference for Generic Instance Creation

Java SE 8

  • Lambda Expressions
  • Method references
  • Default methods
  • Collections: Stream API

Vad Java EE från 5 till 7 innebär är jag lite osäker på, men Wikipedia anger: ”Java EE 7 added Java API for WebSocket, Java API for JSON Processing”.

Jag ser verkligen fram emot att börja använda det nya som nu blir tillgängligt. Delvis för att jag tror att innebär att vi kan skriva säkrare och mer lättläst kod, och delvis för att det är roligt med nya möjligheter. Det kan nog bli lite som att lära sig programmera på nytt, om man vill. Jag ska definitivt försöka tänka mer funktionellt. Jag tror att det är väldigt nyttigt för oss gamla, lätt skabbiga rävar.

Givetvis har jag [sedan länge] förberett mig genom att läsa Functional Programming in Java och tittat på videos som Refactoring to Java 8 by Trisha Gee (Devoxx 2016) och en bunt andra från Devoxx, JavaOne och liknande.

Let there be Monday!

Onwards and forwards – kursen är klar, nu söker vi nästa!

Så där, då har jag lämnat i min sista uppgift i årets första kurs, Algoritmer och datastrukturer. Summa summarum skulle jag säga att det har gått förvånansvärt bra. Jag har känt mig urkass och värdelös, men lik förbaskat fått bra respons från läraren så jag har väl bara inte förstått på vilken nivå jag förväntas ligga.

I januari förra året konstaterade jag att jag hade samlat ihop 50 poäng på två år och funderade på om och i så fall hur jag skulle gå vidare med mina studier eftersom jag då var klar med det aktuella kurspaketet. Jag konstaterade att jag behövde kontakta studievägledare och få förslag på tänkbara vägar framåt.

Eftersom jag den här månaden plötsligt vaknat och fått energi och styrfart så väl som handlingskraft har jag grunnat och funderat och rådgjort med i alla fall två olika studievägledare och faktiskt fattat beslut om vilken riktning jag ska välja. Jag har dessutom skickat in en ansökan för höstterminen i enlighet därmed.

Så vad blir det då?

Jo, ser ni: jag har bestämt mig för att jobba framåt (aldrig bakåt!) i riktning mot en kandidatexamen i datavetenskap. Hade jag börjat från början och studerat på helfart hade de erforderliga 180 högskolepoängen förväntats ta 3 år att få ihop, men riktigt så blir det ju inte för mig. Dels har jag redan en del poäng men framförallt har jag inte tänkt läsa på heltid – åtminstone inte till att börja med.

När jag kollade runt lite på de program som fanns att tillgå hos olika universitet och högskolor fastnade jag för Uppsalas program, som verkar mer baserat på ”hårda” matte- och datakurser än t.ex. Stockholmsprogrammet som tycks innehålla fler ”mjuka” kurser. Det var något med all den där matematiken som lockade mig, och jag har efter noggrant övervägande kommit fram till att det är just matematik jag ska börja med. Och sålunda söker jag Matematik I à 30 hp i Uppsala. Om jag fattat rätt så kan det gå att läsa på cirka 50%, om jag bara kommer ihåg att registrera mig på alla kurserna så kan jag läsa några av dem nästa termin. Och även om jag bara skulle fixa två eller tre av kurserna så vore det en väldigt bra början eftersom den första är obligatorisk för allt, och den andra krävs för väldigt många av datakurserna jag tänkt mig att läsa sedan.

Och ja, mitt PlantUML-diagram över kurser och deras inbördes kopplingar och beroenden har vid det här laget blivit väldigt stort. I lördags satt jag nästan en halv dag vid datorn med att bara rita upp planen för mina första år på den här datavetenskapliga studievägen och koppla ihop kurserna med varandra. Det är nog dags nu att plocka bort övriga kandidatkandidater (sic!) från det gigantiska diagrammet så att det blir överblickbart och inte så förbaskat överväldigande.

Läsåret 2017/2018

Planen just nu är alltså Matematik I, som består av följande delkurser:

Och nej, ingenting är spikat. Jag kan fortfarande göra helt om, men att döma av intagningspoäng från tidigare år borde jag inte ha några problem att komma in.

Så skönt att vara klar med kursen och så skönt att veta vart jag ska härnäst!

När jag så nu är fri från allt (utom jobbet) kan jag läsa Functional Programming in Java, eller läsa färdigt alla kursböcker som jag bara blivit nästan klar med. Eller bara gå ut och njuta av det vackra vårvädret. Fatta vilken frihet jag fått!

Ljusstrimmor i en godtycklig tunnel

Jag kan redan ana hur oändligt vilsen, och tom, jag kommer att känna mig när allt det här hektiska som just nu driver mig framåt, och gör att jag inte riktigt kan sova hela nätter, börjar lugna ned och lägga sig till rätta igen. När drogen tar slut och jag ska försöka återgå till någon form av normalt liv. Jag vet inte ens om det går. Eller om jag vill. För känslan är ju helt fantastisk – samtidigt som det sliter.

Idag har jag i alla fall skrivit färdigt min pseudokod och gjort en implementation i Java för den sista delen av kursen, själva uppfartssträckan. Det handlade om att, med hjälp av FacePager, tanka hem en massa data avseende inlägg från en grupp eller användare på Facebook och sedan programmatiskt behandla detta data för att programmet sedan skulle kunna besvara ett antal konkreta frågor.

Hoppas bara att jag gjorde rätt med inlämningen, för instruktionerna var allt annat än glasklara. Förhoppningsvis blir jag tilldelad en studentgrupp och får tillgång till ett diskussionsforum där jag och övriga medlemmar ska ladda upp och opponera på varandras lösningar. Pseudokoden läggs upp i pdf-format och Netbeans-projektet med själva programkoden läggs upp som en zip-fil.

Edit: Se där, redan medan jag skrev detta fick jag mig en grupp tilldelad! :D

I vanlig ordning sparade jag på arbetet tills deadline hunnit komma farligt nära och det visade sig även nu vara mer att tänka på än jag riktigt budgeterat för, men jobbet blev ändå rimligt i omfattning. En sak jag reflekterade över var att det här med pseudokod är ett rätt flummigt begrepp och vad ville kursen ha?

Oftast tänker jag mig pseudokod som en mer mänsklig beskrivning av tänkt programmeringslogik, ganska implementationsnära men inte programkod. Pratar vi däremot beskrivning av algoritmer så ska den ju verkligen inte likna programkod, utan mer beskriva det hela på bönders vis. I klartext, mänskligt. Och helt frikopplat från implementationsdetaljer. Generiskt, språkagnostiskt.

Nu skrev jag till slut (efter mycken vånda!) det hela på en ganska hög och abstrakt nivå, men klämde in konkreta detaljer gällande val av datastrukturer eftersom jag förstod att det var något som förväntades och jag ansåg det högeligen relevant för bedömningen av min lösnings effektivitet. På ett sätt kände jag att jag fuskade, men å andra sidan handlade det ju om att lösa uppgiften på acceptabelt sätt och algoritmer går det inte ens att undvika.

Jag valde t.ex. att inte lagra datat som sådant utan bara analysera det i förbifarten, lite så som jag tänker mig att man gör i Big Data-tillämpningar. Ackumulera resultat, men spara på så lite som möjligt. Det funkar bra när frågorna är statiska, men ger inget utrymme för nya frågor mot gammalt data. Det blir sannerligen intressant att se vad mina medstudenter har att säga…

Jaja, om inte annat så har jag åtminstone lärt mig använda några av de features som kom med Java 7 respektive Java 8. Try-with-resources, några streams- och lambda-funktioner etc. Det kanske inte var riktigt det primära syftet med vare sig kursen eller uppgiften, men jag kunde/ville inte hejda mig. Det är så roligt att få möjlighet att skriva kod som utnyttjar features jag inte kan använda i min vardagliga gärning eftersom vi i uppdraget fortfarande är låsta till Java 6. Hoppet lever, för det är modernare plattformar på ingång, även om det dröjer.

Jobbmässigt fick jag igår, då jag satt hemma och jobbade, ett telefonsamtal från min chef i vilket hon informerade om att jag från och med 1 april kommer att tillhöra en ny och annan grupp. En som förmodligen kommer att passa betydligt bättre än den jag tillhör idag. Ny chef blir det också då, i form av den person som var projektledare över oss mot slutet av mitt förra uppdrag. Återstår att se vad det kommer att innnebära i praktiken, om något alls. Tråkigt känns det dock att byta bort min nuvarande chef, som jag trivts riktigt bra med under den korta tid vi haft tillsammans. Måste försöka se till att inte missa informationsmötet kring den nya organisationen, så jag förstår var det är jag hamnar egentligen. Ointressant låter det inte, för vi pratar framtidsområden och potential de luxe.

I uppdraget rullar det vidare under ganska stark press, även om jag personligen faktiskt lyckats tagga ned något och få saker gjorda så att jag känner att det går så sakteliga framåt. Jag är aningens tröttare än vad som är nödvändigt och har märkligt svårt att sova längre än till halv fem på morgnarna (helgdag såväl som vardag), men vaknar i alla fall inte med kod i huvudet längre och börjar till och med ana undersidan av projektledarens tak för arbetade timmar per vecka. Trevligt också att jag kunnat jobba med mer blandade människor på sistone.

Herr utvecklingsledaren återvänder till kontoret på måndag och då blir det kul, tycker jag, att se om våra diskussioner kring tänkbara förändringar kommer att leda till något konkret eller om allt bara av bekvämlighet återgår till att rulla i samma gamla hjulspår som förut. Spännande och intressanta tider, tänker jag. Det är knappt att jag kan bärga mig tills det blir måndag och jag får åka ut till kontoret igen för att ta tag i några av alla de saker jag vill och behöver göra.

Jag har datorn hemma sedan i fredags, men tänker motstå alla frestelser.

Ajuste, vi måste ju prata framtida studier också. Jag kollade förra sommarens antagningsstatistik för den kurs jag sökte till sommaren och om det blir likadant nu så kommer jag in på båda kvoterna. Dock är jag inte helt säker på att det är den kurs jag vill gå. Den känns mindre teknisk än jag skulle önska, så vi får se.

Sedan mailade jag också studievägledningen på Stockholms universitet för att höra mig för om möjligheter att jobba mot en kandidatexamen i datavetenskap. Att döma av svaret är det nog enstaka kurser jag ska inrikta mig på, och där vill jag sätta mig ned och ta reda på vilka som ingår i programmet. Dels behöver jag kolla om jag kan få tillgodoräkna mig några av dem baserat på kurser jag redan läst, och dels behöver jag fundera på vad jag kan/vill/ska söka för hösten. Och så aktualisera mitt fina PlantUML-diagram över kurs- och programalternativ.

Snart, snart, snart händer det saker – det känns i hela kroppen. Våren är här!

Bara en uppgift kvar i kurspaketet

Puh! Nu har jag (med en halv minut till godo) lämnat in den näst sista uppgiften på kursen Webbapplikationer för mobila enheter som jag läser nu under hösten, och som också är den sista kursen i kurspaketet. Vad jag ska läsa sedan vet jag inte, men sökte i alla fall flera olika kurser för både första och andra läsperioden under våren. Haken med de flesta av de här kurserna är att de går på halvfart, vilket nog är på gränsen till för tufft att köra parallellt med jobbet, så vi får se.

Det är i alla fall kul att lära sig saker och om jag inte ska studera nästa termin kan jag med gott samvete ägna mig åt att läsa böcker (både inom it och rent skönlitterärt) och knåpa ihop min bokhållar-app som jag velat göra så länge. Förr trodde jag att jag skulle bli tvungen att lära mig Android-utveckling men nu vet jag att det förmodligen räcker gott med en enkel ensidig webapp. Och då syftar jag på en ”single page application”, som kommer att vara mångsidig.

Nästa uppgift ska vara klar och inlämnad nästa år. Ganska snart, trots allt.

Behåller jobbet med Jfokus i sikte

I år var första gången jag ansökte hos företaget om att få gå på Jfokus, vilket alltså innebär att de betalar avgiften och accepterar att jag deltar, med full lön och utan debitering av min tid till kund. Många sköna tusenlappar blir det nog.

Förra året, minns jag, var jag så övertygad om att jag skulle få nobben, att jag inte ens gjorde mig besväret att försöka. Ni vet hur det kan vara – det finns ett elektroniskt formulär att fylla i, som dock är utformat för externa utbildningar, d.v.s. kurser. Jag upplever de allra flesta formulär som svåra och jobbiga att fylla i och det här blir som att försöka knöla in en val i ett 20-litersakvarium. Det går inte att fylla i rätt, för jag saknar uppgifter till obligatoriska fält och det saknas fält för uppgifter som jag anser viktiga. Vilket gör att jag får fabulera och fantisera ihop något och … tja, det passar inte alls min person. Det blir mentalt jobbigt.

I år såg jag det mer som att det i alla fall var värt att prova, och att om jag skulle få nobben kanske det kunde få vara ett tydligt tecken på att det är dags att byta arbetsgivare. Allt jag gör är nämligen att dra in pengar – under mina dryga 13 år som anställd har jag varken gått på kurs eller konferens av eget val, och heller aldrig suttit på bänken (varit utan uppdrag). Sedan 2009 har jag dessutom suttit permanent ute hos kund och har inte ens en postlåda hos min arbetsgivare. De tillhandahåller dator och telefonabonnemang, samt vpn och applikationer för att registrera debiterbara resp. arbetade timmar. Ungefär så krävande är jag som anställd. De enda utgifter jag orsakat företaget på eget bevåg de senaste åren är 2 tentaresor och 2 inköp av kurslitteratur. Mina 50+ nya högskolepoäng inom datavetenskapen har jag annars skaffat helt och hållet på min fritid, under 2 års tid och vid sidan av det vanliga arbetet på heltid. Shit, vad jag måste vara bra!

Ja, i och för sig var vi några som gick på Gradle Groovy-seminarium för några år sedan, under en arbetsdag på promenadavstånd från kontoret, men jag tror faktiskt att det var kostnadsfritt vilket innebär att det företaget bidrog med var en dags utebliven debitering för var och en. Som ren kuriosa kan jag för övrigt berätta att den enda av oss som deltog och fortfarande jobbar kvar är… jag.

För dem av er som hört om varslet hos min arbetsgivare: jag är inte uppsagd och har heller inte fått något erbjudande om att sluta frivilligt mot ersättning. Jag ser det som att jag inte behöver fatta några omedelbara beslut kring min framtid och därför kan köra på som vanligt tills jag själv känner att det är dags. Gott så.

Och för att göra en lång historia något kortare: jag anmälde mig till Jfokus 2017 (med en tanke om att eventuellt betala själv om företaget satte sig på tvären), diskuterade saken med min chef (som ställde sig positiv), fyllde i formuläret efter bästa förmåga och skickade in ansökan. Därefter väntade jag några veckor och så plötsligt, en dag i slutet av november, var ansökan godkänd – jag kommer att vara med på Jfokus, i Stockholm den 7-8 februari 2017. Whee! See you there?

Refaktoriseringsjunkie

Dags att färdigställa det mer yrkesrelaterade av blogginläggen för dagen. Jag hade gärna gjort det tidigare, men hade trevliga, sociala aktiviteter inbokade. För en stund sedan kom jag hem och eftersom jag drack kaffe efter oplanerad söndagmiddag med vänner föreligger viss risk för att det blir svårt att somna.

Idag är det alltså Sveriges nationaldag och jag är först och främst ganska trött, behöver vila lite också. Om jag nu vet hur man gör. Sent igår kväll lämnade jag in den avslutande uppgiften för vårens högst prioriterade kurs (se studierapport i föregående inlägg) och håller så smått på att varva ned. Jag har kört rätt hårt på jobbet under våren vilket bl.a. bidragit till att studierna hamnat lite på undantag.

Om jobbet, ja. Jag kör som sagt hårt, inte ens alltid för att jag måste utan för att jag inte kan låta bli (hjälp, jag behöver avgiftning!), men innan någon ringer efter hjälp vill jag påpeka att parentesen var humoristisk. Läget är under kontroll och när det närmar sig för mycket ser jag till att få den återhämtning jag behöver.

Icke desto mindre är jag nog lite av en junkie när det gäller ordning och reda, data och programmering, och för det sistnämnda inte minst refaktorisering.

Det är få saker som är så tillfredsställande som att få städa upp i mossbelupen och mögelangripen gammal bortglömd och försummad kod så att den blir klar, tydlig, begriplig och lätt att uppdatera när ny eller ändrad funktionalitet ska in. Att t.ex. eliminera krångliga språkliga konstruktioner eller vända på villkor, i syfte att förenkla koden och därigenom öka förståelsen, liksom skala av lager efter lager av plack som samlats genom åren och vid mindre uppdateringar. Fantastiskt!

Jag blir ständigt överraskad och förundrad över hur effektivt det är just att vrida och vända och plocka isär och sedan återuppbygga programkod. Buggar gör sig plötsligt uppenbart påminda, död kod rullar ut över bordskanten eller bara blåser bort i en uppfriskande bris när jag jonglerar eller kastar upp alla delar i luften. Det som kommer ner igen är det som behövs, och det som får vara kvar. Typ.

Ett av mina favoritverktyg just nu är visualisering, eller mer specifikt: diagram. Normalt sett ritar jag diagram i huvudet för att hålla reda på och förstå flödet i koden och vad den gör, men vissa saker är för stora för att riktigt få plats eller så behöver jag kommunicera med andra och då kan det underlätta med diagram. I datorn, thank you very much – jag fixar inte att rita för hand på en whiteboard. Avundas lite grann dem som kan, om jag ska vara ärlig. Det är en bra förmåga som gör det enklare för olika människor att kommunicera och förstå varandra.

I min senaste refaktoriseringsuppgift ingick det att dokumentera flödet genom systemet via ett sekvensdiagram och det var ritandet av diagrammet (givetvis med tillhörande noggrann analys) som tog den allra största delen av tiden.

Jag gick grundligt till väga genom att först rita in vartenda litet metodanrop, både inom tjänsten och utåt mot andra tjänster, genom hela flödet och det var banne mig tur att jag jobbade hemifrån, för det resulterande diagrammet var gigantiskt! Min (dock är den inköpt av sambon, så rent tekniskt hans, men det är främst jag som använder den) 27-tumsskärm räckte inte långt, och på jobbet har jag bara två mindre skärmar på 21 eller 22 tum… det hade inte alls funkat särskilt bra.

Eftersom diagrammet blev så stort slog jag isär det och analyserade delarna av flödet var för sig och samtidigt lärde jag mig att man i PlantUML kan använda include-filer. Notera att jag ur ett utifrånperspektiv ritade diagram, medan jag i själva verket analyserade kodens funktion med hjälp av denna visualisering.

Analysen resulterade i en väldigt mycket bättre förståelse för vad som görs, samt ett ifrågasättande av en hel mängd olika anrop till angränsande tjänster.

Varför hämtas Objekt A i ett separat anrop när samma objekt faktiskt kommer in via hämtning av en bunt Objekt B, som alltid måste göras? Den koden försvann.

Och ja, detta är en designförändring som potentiellt kan ge ändrat beteende och därför har jag nogsamt tänkt igenom eventuella följder. Teoretiskt kan det bli fel, men jag kan inte se att det bör kunna bli det i praktiken. Famous last words…

Varför hämtas en bunt Objekt C för att eventuellt läggas in i bunten med Objekt B, när detta redan gjordes när Objekt B-bunten hämtades. Hela denna sista del av initialflödet visade sig alltså också vara överflödig. Även den koden försvann.

Ni ser vart vi är på väg, va? Flera delar av flödet är redan bortstädade och mitt diagram börjar bli hanterbart i storlek. Dags att titta närmare på den egentliga funktionaliteten i flödet, koden där det som ska göras också är det som görs.

Här flyttar jag omkring kodrader och ändrar villkor så att saker står för sig själva så mycket det går och bara det som verkligen hör ihop står tillsammans. Detta uppenbarar en struktur som gör flödet lättare att förstå, men det kan bli bättre.

Jag bryter ut den kod som förbereder och utför hämtningen av ett antal Objekt B till en egen, separat metod (som dessutom blir lätt att testa). Denna får heta just ”hämta Objekt B”. Det blir tydligt för läsaren att grunden är en bunt Objekt B.

På liknande sätt strukturerar jag om så att koden som gör det egentliga jobbet ligger i en klunga och kan brytas ut till en egen metod vid namn ”gör jobbet”. Detta tydliggör uppgiften (förutsatt att man bryter ut rätt saker!) och lämnar utrymme att fokusera på de förberedande åtgärder som måste vidtas innan.

Några kontroller som kan avbryta flödet flyttas upp för att undvika situationen att det vid ett avbrott utförts onödigt arbete. Det är en bra princip, det där att göra så lite så möjligt så sent som möjligt, och som en följd därav kanske inte behöva göra något alls. Prokrastinering som princip. Hm… det tål att tänkas på.

När jag tittade på sekvensdiagrammet undrade jag också varför det gjordes två anrop, direkt efter varandra, mot en viss tjänst. Kunde man inte lika gärna göra bara ett anrop och låta den anropade metoden utföra båda uppgifterna? Efter att ha undersökt hur de två metoderna i övrigt användes i systemet (svar: inte alls) slog jag ihop dem till en enda, givetvis med ett tydligt beskrivande namn.

Och där någonstans kunde jag inte hitta något mer att ta bort och ansåg mig därmed vara klar. Nu är koden luftigt lätt och ledig. Den doftar sommaräng!

Nästa fråga: var och när ska jag få min nästa fix? Jag längtar redan…

Frustrerande uppstartsperiod

Jag har säkert bara förträngt hur det brukar vara att börja nytt uppdrag, men jag känner mig frustrerad och undrar hur lång tid det ska behöva ta att finna sig till rätta i den miljö jag ska jobba i. Och då menar jag inte så mycket den fysiska miljön som den programmeringstekniska. Jag är hyfsat obekant med mycket, som t.ex. applikationen och upplägget såväl som de tekniker som används.

Visst, jag har allmän kunskap när det gäller liknande tekniker, men saknar (för min bekvämlighet) alldeles för mycket detaljerad kunskap och erfarenhet av just dessa specifika. Och i utvecklingsteamet är det lite för ofta främst konsulter och nyanställda på plats, d.v.s. vi saknar någon som kan guida oss rätt i djungeln. Det blir lätt så att en blind leder andra blinda – inget vet riktigt vad som är rätt.

Man kan lugnt säga att det krävs en rejäl dos av tålamod från min sida – jag vill ju som vanligt kunna och behärska allt på en gång. Jag trivs verkligen inte med att vara någon som är osäker och behöver fråga om (känns det som) allt, jämt. Jag får bita ihop och dra några extra djupa andetag och sen bara köra vidare.

Och samtidigt vet jag ju ändå att det bara är i början det känns så här jobbigt. Det går över. Jag kommer att med tiden lära mig allt jag behöver kunna och hitta lämpliga sätt att förhålla mig till arbetet och mina med- och motarbetare.

Så här långt har jag bl.a. bekantat mig lite mer med SLF4J, JPA och Mockito.

Lära ut med korrekt kod

Jag blir faktiskt en smula irriterad här, inte bara å nybörjarnas vägnar utan även p.g.a. något jag uppfattar som bristande respekt för programmeringen/språket. Ska du lära folk att programmera Java bör du nog inte skriva kodexempel i ett program som med automatik gör om första bokstaven på varje rad till versal. Åtminstone inte utan att gå tillbaka och korrigera i efterhand. Koden blir trasig.

Public static void double(double x) { Double result = x*x; return result; }

Ovanstående kod kompilerar inte. Det heter public, med inledande gemen.

Nu är i och för sig Double result korrekt, rent formellt, men troligen inte riktigt det man egentligen vill visa. Att i sin kod inte göra skillnad på double och Double är fel, då de faktiskt är olika saker. Det ena är ett s.k. primitivt värde, medan det andra är ett objekt (som iofs innehåller ett primitivt värde, av typen double, men det är ändå ett objekt). Eftersom metoden är specificerad så att den returnerar en double kommer programmet att returnera just en double, d.v.s. den primitiva typen, vilket innebär att resultatet som är en Double kommer att omvandlas per automatik, i onödan. Det man menade här var säkert att skriva double result.

Nybörjaren, som ännu inte fått lära sig vad klasser är, borde inte luras att tro att Double och double är samma sak genom att man på det här sättet slarvar med representationen. Dessutom är det ju heller inte riktigt så enkelt att man alltid kan byta ut den inledande bokstaven för att växla typ från den primitiva typen till motsvarande klass – ett typiskt exempel där är int som mappar mot Integer.

Det är inte okej, i min bok, att visa slarvigt skriven kod för dem som ska lära sig.

Sedan är det visserligen strikt formellt korrekt, så tillvida att det kompilerar, att ange metod- och variabelnamn som börjar med en versal, men det bryter mot sedvanlig praxis och följer heller inte allmänt vedertagen kodstil för Java. Namn på variabler och metoder bör inledas med en gemen (bör, därför att det alltid finns undantag). Allt annat ser ut som Visual Basic i mina ögon. Fult, fult, fult!

Jag är bestämt övertygad om att man som lärare ska föregå med gott exempel.

Jag hoppas att jag hittar något vänligt sätt att påtala sådana här saker, sedan i slutet, eller efter att kursen är slut. Kanske vänta tills efter att jag fått mitt betyg? Betyg: ”G Godkänd”, ”UX Otillräckligt, komplettering krävs” eller ”U Underkänd”.

Antagningsbesked och tillhörande val

Jag blev antagen till alla kurser jag sökte, kan man säga. Uppifrån och ned på den av mig prioriteringsordnade ansökningslistan stod det ”Antagen” överallt, ända tills antalet poäng nått det maximala man får tacka ja till. Summa summarum blev det sex kurser med ”Antagen” och sex kurser med ”Struken”.

En av de strukna kurserna ansågs jag obehörig till eftersom den krävde 7,5 hp grundläggande programmering eller motsvarande kunskaper. Visserligen har jag motsvarande kunskaper, men det verkade inte värt besväret att leta reda på någon som kan skriva ut ett intyg för att formellt få lära mig Perl (som jag jobbat med ett antal år) och Python (som jag nosat på i tjänsten och på egen hand).

Av de sex kurser jag blev antagen till har jag nu tackat ja till tre. På kvartsfart.

En av kurserna är ett paket som omfattar fyra kurser och sträcker sig över en längre period (detta bör enligt mina beräkningar handla om två år). De övriga två kurserna är tänkta att klaras av i sin helhet under vårterminen 2015.

Det här är kurserna jag tänkte ge mig på:

Webbutveckling och programmering, 30 hp fördelat på:

Inledande programmering i Java, 7,5 hp
Grundläggande datasäkerhet, 5 hp

Vi kan väl säga som så att jag inte räknar med att behöva jobba ihjäl mig med den grundläggande Java-kursen, och inte heller anstränga mig över hövan med Python-programmeringen. Så då borde det väl främst vara datasäkerheten jag skulle kunna behöva oroa mig lite för – med tillhörande tentamen i Linköping.

Jag tar dock inget för givet, utan ställer in mig på att allt kan hända i vår.

I väntan på att det ska bli dags att börja de ”riktiga” studierna roar jag mig med att studera på MIT (fast det lär inte institutet i fråga veta särskilt mycket om). MIT har nämligen något som kallas Open CourseWare, där de tillgängliggjort en mängd utbildningar som vem som helst kan ta del av via nätet. Från webbsiten når man enkelt inspelade videoföreläsningar och diverse annat kursmaterial.

Sedan förra lördagen har jag tagit mig exakt halvvägs igenom kursen som heter Introduction to Computer Science and Programming, vilket innebär att jag tittat på 13 föreläsningar på ca 50 minuter vardera. Somligt är nog så grundläggande, men det är ändå (tror jag) nyttigt för mig. Jag får en stabil grund och lär mig begrepp jag tidigare saknat, även om jag har viss kännedom sedan tidigare.

Programmeringsspråket som används är Python, vilket är kul för att jag fuskat lite i det förut och för att det verkar vara ett ganska roligt språk att använda sig av. Det här ger möjligen ett litet försprång vad gäller den kurs jag ska läsa i vår.

Jag väntar otåligt på mina nybeställda, rabatterade och fraktfria glada strumpor.

Utöver MIT-föreläsningar ägnar jag min fritid åt att läsa och lämna feedback på sambons exjobbstext, samt hänga med i den stora bunten tv-serier vi försöker följa. Vilket av detta det blir beror mycket på hur sent jag kommer hem och hur trött i huvudet och ögonen jag är. Orkar jag tänka mycket kan det bli exjobbet, bara lite: föreläsningar. Annars tv. Om ögonen fått nog för dagen lyssnar jag på James Marsters som läser Vampire Empire. Eller någon kodnära podcast.

Att det är nästan jul rör mig inte i ryggen, även om jag är förvånad över att det är så få dagar kvar nu. Antar att min brist på julinsikt har mycket att göra med att vädret inte alls är eller varit vintrigt här i stan. Det är milt och förbaskat mörkt. Jag ser fram emot att få vara ledig ett par veckor och ha makten över min tid.

Ungefär samtidigt som jobbet drar igång efter helgerna gör även kurserna det. Därefter blir det en semestervecka igen i februari, då vi är ett gäng som åker till Lissabon med väninnan som fyller jämnt och firar eller flyr detta genom att resa. Sedan… vet jag inte mycket om vad som händer. Den som lever får se. Då.

Allmänt ospecificerat

[Söndag, mitt på dagen]

Ännu en lång helg är snart till ända och jag njuter av ensamheten, medan sambon är ute och roar sig på sitt eget sätt och håll. Just nu pustar jag ut, framför datorn, efter att ha ägnat några timmar åt städande. Det sistnämnda kom sig av att jag ville känna att jag uträttat något och då fanns det ju (som alltid) lämpliga saker att göra.

Efter att jag avslutat en viktig uppgift från listan i UfYH-appen insåg jag att köket inte fanns med i familje-Trello:n, mer än som kommande renoveringsobjekt, så jag lade in det stora röjningsprojektet, med diverse punkter i att göra-listan. Den första av dem prickade jag omgående av, så klart – det är ju därför checklistor finns.

Jag tror det är så det får bli – Trello får hantera hela projektet och så kan jag lägga in enstaka unfucking-aktiviteter i UfYH-appen för utförande med hjälp av 20/10.

Solen skiner där ute. Om inte sol var så varmt hade jag förmodligen gjort en längre promenad för att lyssna vidare på Skin Game (bok 15 i Dresden Files-serien, av Jim Butcher). Av någon anledning somnar jag nämligen, och tvingas gång på gång spola tillbaka, om jag lyssnar stillasittande eller -liggande. Vilket är synd, för det är ju alldeles ljuvligt att ligga och blunda och njuta av James Marsters uppläsning. Vore det så att alla ljudböcker lästes av honom hade jag varit 100% boklyssnare.

Vilket påminner mig om att jag ser fram emot november, då Dragon Warriors (Kickstarter-backad film i vilken James Marsters har en framträdande roll) är tänkt att presenteras för allmänheten. Ja, jag är självfallet en av dess stolta sponsorer.

[Söndag, sent på kvällen]

Och där någonstans slog hungern till och jag gjorde ett långt avbrott i skrivandet. Jag tror att jag rentav helt glömde bort att jag hade påbörjat ett blogginlägg. I stället tittade jag på ett avsnitt vardera av Episodes och Supernatural, plus det första av Teen Wolf. Därefter ännu ett Teen Wolf – jag ville se hur det skulle utvecklas.

När sambon till slut återvände hem lagade vi mat och såg färdigt första säsongen av Arrow. Tänk att det tog så lång tid att verkligen ta sig an den serien! Jag gillar den, även om det känns smått absurt att se t.ex. ”Harry Dresden” och ”Captain Jack” och ”River Song” i helt andra sorters roller än dessa. Men det är kul också. Dessa skådisar är ju, lustigt nog, alla britter. Kanske just därför jag gillar dem?

Nu ser jag fram emot att snart börja kolla på Arrows andra säsong och så kommer en tredje säsong redan till hösten. Sedan finns det också gott om avsnitt av både House of Cards och Orange is the New Black att se – vi har ännu bara sett något enstaka avsnitt av deras respektive andrasäsonger. Även om det nu är slut på tablå-säsongen så att det inte längre ramlar in drösvis med nya avsnitt varje vecka har vi massor att titta på. Hela Star Trek (minus den allra första TOS-säsongen) och alla gamla säsonger (första till åttonde doktorn) av Doctor Who, till exempel.

Låt se, om jag går igenom listan uppifrån och ned (markerar dem som är mer än precis påbörjade): Angel, Arrow, Black Sails, Brooklyn Nine-Nine, Camelot, Defiance, Episodes, Fargo, Fringe, Grimm, The Guild, Helix, Heroes, House of Cards, Intelligence, Jonathan Creek, Justified, The Killing, Lost Girl, Numb3rs, Orange is the New Black, Orphan Black, Star Trek, Stargate, The Tomorrow People, The Tudors, The White Queen… och fler därtill. För egen del ser jag (om än med rätt låg frekvens) bl.a. Being Human (UK), Sons of Anarchy, Supernatural och Teen Wolf. Funderar även på kolla in From Dusk till Dawn, vid lämplig tillfälle.

[Måndag, efter jobbet]

Mäh! Tänk att det ska vara så svårt att få ut ett jädrans blogginlägg. Det är ju bara att skriva färdigt och trycka på knappen. Liksom. Fast som sagt, skriva färdigt. Jag är inte världsbäst på att släppa taget och lämna ifrån mig skriven text. Därtill är jag alltför noggrann, för att inte säga petig, och har rätt specifika krav på mina texter.

Första delen av det här inlägget skrev jag i söndags, mitt på dagen någon gång. Andra delen kom till närmare läggdags igår kväll, alltså fortfarande i söndags. Dessvärre fastnade jag därefter i en bit programkod som jag blivit ombedd att städa upp för att visa att jag vet något litet mer än ingenting om Java-programmering.

Det blev förstås alldeles för sent innan det var färdigt, så då hade jag verkligen inte tid och lust att färdigställa inlägget. Nu är det måndag kväll och den här gången ska jag banne mig publicera inlägget också! Fast jag skulle behöva leta reda på någon lämplig Java-kod där ute på nätet… Kod som jag kan säga något om – också det är för att visa att jag vet vad jag pysslar med. Det kan ju gå precis hur som helst, det.

Dock, jag tänker bevisa att jag faktiskt kan hålla igen och faktiskt behålla fokus i stället för att ständigt hoppa vidare till nästa blanka föremål som dyker upp i min hjärna. För det vet jag att jag kan. Bland annat gjorde jag just det på jobbet idag. Nästan så att jag blev lite stolt, faktiskt. Nu var det förstås inte mer än i en två timmar lång lucka mellan andra åtaganden, men ändå… det hade varit så lätt, så lätt, att fladdra iväg till annat. Jag undrar ibland vad det är som gör att det är så svårt att ta sig över tröskeln in i en sådan fokuserad värld, medan det när man väl är där är hur enkelt som helst att stanna kvar. Det är som flytet som kan uppstå vid programmering – ibland tar det lång tid att komma igång, men sedan rullar det på.

Den främsta anledningen till att jag kom hem så tidigt som sjutton (pun intended) idag var att ta hand om en leverans. Budfirman var på plats en halvtimme innan avtalad tid och jag gav min tillåtelse att lämna paketen utanför lägenhetsdörren för att snubben skulle slippa vänta tills någon i familjen kom hem, varför det kändes angeläget att skynda. Man vill ju inte låta dem stå där alltför länge för vem vet vilka av mina grannar som kan bli frestade av två stora, bruna, intetsägande kartonger.

Nåväl, kartongerna stod där och väntade när jag kom hem, precis på slaget, och jag lyfte in dem i lägenheten, bytte till hemmakläder, spillde upp ett stort glas kallt vatten – och satte mig vid datorn. Finn ett fel. Men ändå inte, egentligen, för jag ska ju skriva färdigt det här inlägget. Och först därefter får jag öppna mina bruna paket.

Vad det är i paketen? Nördigheter som Star Trek- och Soft Kitty-prylar. Whee!

Får jag gå nu?

Veckans nya programspråk: Python

Jag har fuskat en gnutta i Python förut, i tjänsten, men då har det handlat om enkla modifieringar av kod som någon annan skrivit. Nu skrev jag programmet själv, från början till slut. Det tog ett par fredagstimmar och sedan hade jag mitt (samma gamla vanliga) program även i Python-skrud. Programmet (eller scriptet, om man så vill) är ganska precis lika långt som det i Ruby och hälften så långt som det i Objective-C. Skillnaden mellan Ruby och Python blev mindre än jag förväntat mig, men det beror nog mycket på att jag egentligen programmerar i något annat språk. Det vill säga, att jag inte utnyttjar språken som en riktig kännare av dem skulle ha gjort.

De delar mitt program främst består av är kommandoradstolkning, inläsning från fil, mönstermatchning och datum-/tidsaritmetik. Det är intressant att se skillnaderna i hur man gör saker i respektive språk, och hur variabler ser ut innan de fått värden. Jag är säker på att jag missar vissa saker, men kan ju gå tillbaka framöver. Faktum är att jag tänker mig att jag ska göra just det i något senare skede, försöka sätta mig in i språket på djupet och verkligen förstå dess själ. Ja, det låter kanske smått högtravande och kommer väl förmodligen aldrig att bli av, men då får det vara så.

Just nu verkar det som om nästa version av Programmet blir skriven i Rust.

Helgens arb^H^H^Hnöjen

Den här helgen har känts lång och skön trots att den ju bara varit en normal helg på två dagar. Jag har hunnit med en del saker, både bra och roliga sådana dessutom.

Igår var jag ute och finfikade med kulturvännerna på ett alldeles nyöppnat Espresso House, beläget på Norrlandsgatan. Inte alls långt från flera andra, ska nämnas. Väl hemkommen sedan, framåt kvällen, tog jag tag i dator- och it-relaterade saker som legat och mognat på väntelistan. Jag replikerade mina två lokala git-repositories till familjens NAS och uppgraderade min primära MacBook Pro (a.k.a. 13-tummaren) till OS X Mavericks. Replikeringen var en snabb affär, medan uppgraderingen tog någon timme eller två – dock utan några som helst problem vad jag har kunnat se.

Att det dröjt så pass länge innan jag tog steget att uppgradera (jo, jag har förstått att folk har varit förundrade) beror bl.a. på att jag precis hade uppgraderat till Mountain Lion när Mavericks kom och att jag inte haft fungerande backup:er på ett tag – vem vill uppgradera datorn utan att ha säkerhetsbälten och livremmar i form av aktuella backup:er liksom. Sedan undviker jag gärna att vara alltför snabb på nya bollar och har heller inte haft vare sig tid eller lust att hålla på med sådant där infrastrukturellt.

I helgen är/var det Weekend Rush hos Dustin och GP föreslog att jag skulle skaffa en SSD (med 23% rabatt) till min Mac, vilket jag nappade på så nu har jag beställt en sådan. Då gör det ju inget alls att datorn är i god form, med fräscha och aktuella backuper etc. Jag ser nu på Dustins webbplats att den disken är alldeles slutsåld.

Idag fortsatte jag med de dator- och it-relaterade uppgifterna genom att göra backup på, och uppgradera, även min gamla MacBook Pro (a.k.a. 15-tummaren). Den kan gott få vara lite modern, den med, även om jag inte använder den särskilt ofta. Det kändes väldigt skönt och luftigt med en 15 tums display jämfört med 13. På jobbet är jag bortskämd med stor bildskärm (27 tum), vilket jag ibland saknar här hemma. Funderar på att skaffa mig en extern monitor. Om det nu funkar bra med min dator. Haken med det är väl kanske att man behöver ändra möblering på arbetsplatsen.

Och så har jag (som många andra) deklarerat också. Det var lätt som en plätt. Inte minst underlättar det att ha scannat in sina kontrolluppgifter och gjort dem sökbara baserat på nyckelord. Vilket påminner mig om att jag ju scannade papper också.

I övrigt läste jag ytterligare tre kapitel ur The Clean Coder, som verkar intressant såväl som utmanande, och konstaterade att jag glömt allt jag kunnat om Ruby på tio dagar. På podcast-fronten har mina Kodsnack-avsnitt tagit slut och jag har inte många avsnitt av Säkerhetspodcasten kvar heller, så snart får jag väl börja lyssna på engelskspråkiga saker (har ganska mycket ohört av Java Posse och andra som jag inte börjat på ännu) eller helt andra sorters podcasts. Det jag har uppköat handlar bl.a. om fantastik, annan nördighet – och så helt vanliga saker också.

Jag har förresten börjat skissa på en kravspecifikation för den app jag vill ta fram. Och kanske lite arkitektur såväl som design också. Det började med att jag lade upp ett nytt kort på min ”Att göra”-lista i Trello och där började beskriva appens funktionalitet och skapa en lista över olika aktiviteter som behöver utföras för att komma åtminstone en bit på vägen. Vännerna vid fikat igår reagerade positivt på min muntliga beskrivning och såg genast flera andra områden där den här appen skulle kunna användas. Och det är ju inga problem att åstadkomma – jag behöver bara döpa mina saker mer generiskt och vips, så blir appen allmänt användbar. Och ja, jag tänker mig en Android-app – det är ju det jag och de flesta av vännerna har nytta av. Hoppas bara att jag får tid, ork och lust att ta tag i det på riktigt snart!

Men oj, nu måste jag sluta – det är ju Kodsnack live!! :)

Veckans nya programspråk: Ruby

Ja, det var väl egentligen förra veckans programspråk eftersom det var i söndags jag roade mig med att skriva ett litet program i Ruby. Och det programmet skrevs utifrån samma krav som det jag veckan innan skrev i Objective-C. Exakt likadant blev det dock inte då jag kom på nya saker att göra och färdigt blev det inte heller. Visst, programmet fungerar nu, men räcker ju inte för att jag ska känna mig nöjd.

Kod är mer än funktion

En viktig sak i min programmeringsfilosofi är nämligen att ett program inte är klart bara för att det bevisligen fungerar. Där ser jag stor skillnad mellan mig själv och nyare utvecklare, som ofta inte utvecklat känslan för skönhet och långsiktighet i koden – både det rent visuella i hur källkoden ser ut och det mer designmässiga.

Kod som kommunikation

Och det jag menar med långsiktighet här handlar mycket om kommunikation, d.v.s. att koden ska vara begriplig för mig själv och andra som kan behöva uppdatera den i framtiden, och om en robust design, d.v.s. det ska gå lätt att uppdatera koden när kraven förändras. För det gör de, om programmet/systemet hanteras på rätt sätt.

Implementera inget onödigt

Men tro nu för guds skull inte att jag förespråkar att man implementerar krav som ännu inte finns! Nej, vi ska implementera det som behövs, varken mer eller mindre. Vi kan visserligen hålla i bakhuvudet det som kommer sedan, i den mån vi vet om det, för att inte råka skära av vägen framåt, men vi implementerar inget onödigt.

We are not done yet!

I min värld kan det när koden fungerar ännu vara rätt mycket arbete kvar att göra. Och då räknar jag inte med sådana saker som att skriva unittestkod, för det har jag ju gjort medan jag utvecklade det funktionella. Nej, det handlar om att titta igenom koden ett par varv till, snygga till och refaktorera för både läs- och underhållsbarhet. Utöver detta kanske man också justerar designen, både på högre och lägre nivå. Fast det sista beror ju också av om man har mandat att göra designförändringar.

Refactoring

Refaktorering är en njutning när man känner sig trygg i att man täckt upp den viktiga funktionaliteten med hjälp av unittester – gör man fel i sin refaktorering märks det ju på att testerna inte längre går igenom utan signalerar fel. Baren blir röd, som vi säger i Eclipse-världen. Vi kör red/green/refactor!TDD-lingo.

Ruby är mer kortfattat?

Det fascinerar mig att programmet som landade runt 150 rader i Objective-C blev mindre än hälften så långt i Ruby. Fast då är ju som sagt inte funktionen densamma så man kan inte göra en direkt jämförelse. Sedan skriver jag olika bra i respektive språk och inget av programmen är heller färdigt, men ändå… rätt stor skillnad!

En del av skillnaden kommer dock säkert att försvinna när jag inför mina förenklade algoritmer i det längre programmet. Och kanske också med mer objektorienterade koncept i det kortare. Vem vet, de båda blir kanske i slutänden precis lika långa.

Namnsättning

En annan lustighet är att jag av någon anledning bytte namnsättningsprincip när jag växlade språk. I Objective-C använder jag samma namngivning som i Java, d.v.s. camelCase. I Ruby fann jag mig plötsligt skriva mer i ”C-stil”, d.v.s. snake_case.

Framtida ändringar

Saker jag vill göra med Ruby-programmet är t.ex. att göra det mer objektorienterat, för som det nu var skrev jag det mer som ett script med några hjälpfunktioner. Jag vill alltså bryta ut delar av koden till en separat klass, med ”riktiga” metoder. Och så vill jag förstås (som vanligt) skriva unit-tester för dessa – kod utan unit-tester är inte riktig riktig kod. Och på något sätt kopplar jag ihop objektmetoder och unittestkod.

Andra saker jag gjorde hade att göra med editering och versionshantering.

Editor

Första versionen av programmet skrev jag direkt i kommandorads-vi. Det var inte helt angenämt, så jag installerade TextMate. Programmet gav mig färgkodning och som bonus en fantastiskt fin ikon i form av en rosalila blomma, som fick mig att vilja älska det. Dessvärre var det inte jättekul att redigera kod i detta program heller. Och jag inser nu att jag förmodligen kunde ha fått färgkodning med hjälp av vim om jag bara kommit på tanken att installera den (men det gjorde jag förstås inte då).

Sedan blev jag påmind om Sublime Text, som Kodsnackarna nämnde i något av de avsnitt jag lyssnat på, och som GP enligt uppgift använder både hemma och på jobbdatorn. Jag installerade Sublime och blev lite kär på direkten. I Sublime fick jag bl.a. hjälp med att skriva variabelnamnen rätt och konstaterade att den verkar värd att utvärdera. Det är nog inte otänkbart att betala de 70 USD programmet kostar.

Versionshantering

Det här med versionshantering, då. Där var det ganska självklart att använda git, eftersom det är den versionshanterare jag vill lära mig – dels för att det är den som är ”den” och dels för att jag vill förstå hur den skiljer sig från mitt tjänsteverktyg som är Rational Team Concert. Nu innehåller RTC mer än versionshantering, men ändå.

Jag skapade mig ett git-repository för projektet, och checkade in min programfil. Fine, men nu vill jag lära mig mer om git-användning och skicka upp min kod till familjens NAS för safekeeping och möjlighet att kanske dela koden med andra.

Påskläsning

Till min hjälp i lärandet om git har jag skaffat ett par e-böcker. Kanske kan dessa få bli min påskläsning, måhända parallellt med H.P. Lovecrafts The Call of Cthulhu.

Med tanke på att vi reser bort tror jag inte det blir någon programmering denna helg, men annars låter det som en rolig idé att prova ett nytt programspråk varje vecka. Tänk så många språk man hinner med på bara ett år! Och jag undrar vad det gör med ens förmåga att programmera – blir man kanske mer förvirrad än upplyst?

Provprogrammerar i Objective-C

I fredags fick jag för mig att installera Xcode som utvecklingsmiljö på min MacBook Pro för att skriva ett enkelt program i (och därmed lära mig lite) Objective-C, som är det programmeringsspråk man använder i Apple-världen för Mac OS X och iOS.

Jag nöjde mig på kvällen med att göra Xcode-installationen, sätta upp mitt projekt och kolla upp Objective-C som hastigast. Programspråket såg lite skumt ut, men verkade möjligt att lära sig. Kombinationen C och objektorientering kan nog funka. Jag har ju programmerat i både C och Java, och en del andra mer obskyra språk.

Ändå pirrade det allt lite i magen – hur skulle det gå? Jag stod i begrepp att ge mig in på något nytt och främmande. Vet inte varför sådant gör mig nervös, men det gör det samtidigt som jag ändå någonstans vet att jag grejar det. Hur som helst tedde det sig som en utmärkt idé att där bryta för dagen och övergå till familjeliv, för att dagen efter läsa in mig på ämnet och börja koda. Och det var ungefär så det blev.

Det vill säga, jag läste mycket mindre än jag tänkt innan jag var igång med själva kodandet. Uppgiften jag ålagt mig handlade om att läsa data från en textfil, tolka innehållet genom att extrahera relevant information och göra några beräkningar.

Jag började med att läsa in hela filens innehåll och skriva mycket rudimentär kod för att identifera de rader som var av intresse och plocka ut det data jag behövde. Efter något femtiotal rader kod började jag sakna de konstruktioner jag obehindrat svänger mig med i Java-världen. Det är så frustrerande att inte veta hur man bäst gör saker i det aktuella programspråket, hela tiden tvingas googla efter exempel. Men visst, man lär sig. Jag lärde mig. Jag är nog inte en så gammal hund ändå.

Jag säger: Stack Overflow måste väl ändå vara världens bästa resurs!

I stort sett hela lördagen satt jag sedan och programmerade. Jag lärde mig skapa och hantera några enklare objekt. Jag lärde mig att börja med hakparentes för att kunna anropa metoder på ett objekt och hur man fick IDE:n att visa vilka metoder som finns. Jag lärde mig hur man skapar och använder reguljära uttryck (denna gudomliga skapelse!) för att hitta och extrahera datum och klockslag ur strängar. Jag lärde mig att jämföra tidpunkter och addera tidsintervall. Samt en del annat.

Mitt program består i nuläget av ungefär 150 rader kod, i en och samma källkodsfil, inklusive kommentarer och tomrader. Jag har en main-metod och 6 hjälpfunktioner. Det finns ytterligare någon sak jag vill testa, men programmet fungerar som det är.

Jag har bekantat mig mycket lite med själva utvecklingsmiljön än så länge, även om jag i alla fall lärt mig sådant som att kommentera block av kod och checka in koden i mitt lokala git-repository. Så här långt är Xcode rätt frustrerande och jag saknar Eclipse. Antar (hoppas!) att det främst beror på att Xcode är annorlunda, men det finns en möjlighet att Xcode faktiskt inte har de funktioner jag är van vid.

Det mest frustrerande är nog just det där att jag inte känner språket ännu – jag vet inte vilka metoder jag kan förvänta mig hitta på ett objekt och inte hur de namnges. Ibland tar det en evighet att begripa hur jag ska göra, ibland går det på ryggmärg – många gånger går saker faktiskt att göra på nästan exakt samma sätt som i Java.

Utöver att lära mig mer om själva programmeringen vill jag bli bättre kompis med utvecklingsmiljön (Xcode) och lära mig en massa om versionshanteringen (git). Och så vill jag givetvis också lära mig hur man kan unittesta kod i den här miljön.

En vacker dag tänker jag mig att prova på iOS-utveckling genom att skriva en app. Eller så blir det Android i stället – det är ju den plattform jag använder dagligdags. Oavsett vilket har jag en uppgift att lösa. Automatisera det jag idag gör manuellt.

Hur som helst var det riktigt roligt att utföra uppgiften – det kan nog bli mer sånt!

Modermodemet ser oss alla, hela tiden

Efter att, som alltför ofta på sistone, ha jobbat så länge att jag bara nätt och jämnt fortfarande har tillåtelse att vistas på kontoret, lyssnade jag på hemvägen (det blir ofta så när det hunnit bli sent och jag är trött i ögonen så att läsning inte lockar) på Kodsnack avsnitt 26, som döpts till ”Modermodemet ser dig”. Och i det avsnittet pratades det precis som vanligt om en massa intressanta saker. Det är få avsnitt av Kodsnack som inte engagerar, även om inte alla sätter avgrundsdjupa spår.

Det slår mig om och om igen att jag verkligen blir glad av att lyssna på Kodsnack. Killarna är oerhört vettiga och befinner sig på precis rätt ställe på skalan mellan… äh, jag vet inte vilka skämtsamma ytterligheter jag ska dra till med. Kanske är det bara så enkelt att jag är utsvulten på kodsnackare. Jag skulle verkligen önska att jag var omgiven av den sortens människor i min vardag, men så är det tyvärr inte. Visst, sambon är väl ungefär en sådan människa, men en sambo gör ju ingen klan.

I morse, på vägen till jobbet, hade jag tänkt läsa vidare i Code Complete – det vore ju bra att bli klar med boken någon gång, tänkte jag – men kunde strax konstatera att det var alldeles sant som det meddelats mig per e-post. Att jag inte längre (tack vare min arbetsgivare) har fri tillgång till Safari Books Online. Det som var så bra!

På jobbet läste jag mailet mer noggrant och kunde konstatera att jag i stället kan beställa något som kallas Safari Flow, vilket kostar min avdelning en liten summa för ett års tillgång. Jag beställde så klart genast, för det var inte någon summa så stor att chefen borde behöva säga nej. Och chefen godkände min beställning, så nu väntar jag på bekräftelse (och instruktioner, antar jag) från leverantören.

Jag tänkte en kort liten tanke om att skaffa mig ett privat abonnemang, fristående från arbetsgivaren, men efter att ha läst på webbplatsen känns det inte värt det.

Det är väl Safari Library jag i första hand skulle vara intresserad av:

Safari Library

Unlimited access to the premiere
reference collection of books,
videos, and courses.

€34.99 per month after trial

Fatta, flera hundra kronor i månaden – det är rätt mycket pengar, särskilt som man oftast inte läser den här typen av böcker kontinuerligt. Allt över hundra kronor per månad är för mycket, nästan oavsett vad det är för abonnemang det handlar om.

Det jag tror att jag beställt via arbetsgivaren är Safari Flow, som nu när jag nu läser om tjänsten på webbplatsen inte låter alls särskilt lockande. Visst, jag är bra på att måla fan på väggen, men tänk om jag inte får läsa böckerna på vanligt sätt, utan tjänsten väljer böcker åt mig och bara låter mig läsa väl valda delar ur dem? Hu!

Safari Flow

Tell us what you’re working on, and we’ll guide
you through the world’s largest technology,
business, and design library.

€24.99 per month after trial

Det kanske låter fint och är bra om man inte har någon aning om var man ska börja, men jag tycker fortfarande att det låter obehagligt. Jag får mental klaustrofobi och ser framför mig hur jag blir tvångsmatad med boksidor jag aldrig skulle ha valt själv.

Jag måste väl ha berättat hur jag mycket avskyr när leverantörer har bestämt hur jag ska använda deras produkter? Låt mig välja och bestämma själv, tack! Jag har svårt för grafiska användargränssnitt just därför att någon där bestämt vad jag ska kunna göra och inte. Nej, tacka vet jag kommandoraden i ett Unix-baserat system!

Lite spelar det också in att det antyds att jag förväntas lämna ifrån mig information. Jag har väl aldrig varit särskilt meddelsam, men i dessa övervakningstider är jag mindre benägen än någonsin att vilja lämna ut någon information om vad jag gör.

Och här är det jag börjar hitta tillbaka till där jag befann mig i början av inlägget. Kodsnack-killarna pratade nämligen om det utrullande övervakningssamhället och vad jag förstår spelades avsnittet in någon gång i samma veva som det började avslöjas vilken härva av massövervakning vi idag faktiskt sitter i. Och de utryckte precis samma oro som jag själv känner över den aktuella utvecklingen och det där otäcka sluttande planet vi halkar omkring på. Jag vet inte riktigt om jag ska bli glad över att fler vettiga människor delar min oro, eller ledsen över bekräftelsen. Jag menar, om de också tänker så är det förmodligen inte bara jag som är paranoid.

Jag rekommenderar verkligen att ni lyssnar på avsnittet, även om ni inte är särskilt intresserade av kodsnack – just det här avsnittet handlar om så helt andra saker. Särskilt för mina piratvänner tänkte jag mig att diskussionen är intressant att höra.

Avsnittet jag lyssnade på i morse fick mig att fundera på var och i vilken typ av verksamhet jag egentligen borde jobba. Tankeväckande. Och i kvällens avsnitt nämndes bland annat bristen på etiska riktlinjer för programmerare, vilket också får mig att tänka och reflektera – nu över andra delar av min tillvaro än ren teknik.

Och för övrigt gladde det mig när man påbjöd läsning av H.P. Lovecrafts The Call of Cthulhu inför ett kommande* avsnitt – det var inte alls länge sedan jag skaffade Lovecrafts samlade verk i e-form, så då kan jag enkelt läsa den utvalda historien! Har parkerat avsnittet om Pushing Ice (Alastair Reynolds), som jag ännu inte läst.

* = ja, jag vet att jag ligger långt efter – har inte hört mer än 25 av hittills 44 avsnitt.

Slutligen (for my records): idag fick jag några viktiga saker uträttade på jobbet, efter att ha prokrastinerat å det grövsta och fått gjort en massa annat som hade lägre prioritet. Ibland går det bara inte att göra annat än vad hjärnan tycker sig behöva.

Programmering: Tillstånd – från en stor maskin till flera mindre klasser

Jag har egentligen inte i mitt tidigare liv stött på konceptet tillståndsmaskin när det handlar om programmering, även om jag har ett svagt minne av att begreppet dök upp i något av de tekniska ämnen jag läste på gymnasiet. Det var inte alls särskilt länge sedan ämnet dök upp i en programmeringsteknisk diskussion med sambon. Han, som har både mer formell utbildning och bättre teoretiska kunskaper än jag, förklarade principen och jag blev entusiastisk och lanserade konceptet på jobbet och fick positiv respons och sedan har det rullat på. Jag gillar tillståndsmaskiner!

Jag tror inte att jag är världsbäst på att förklara det hela, men kan ju ändå försöka ge min bild. Konceptet innebär att saker hela tiden befinner sig i ett visst tillstånd, och går vidare till andra tillstånd enligt ett förbestämt mönster eller schema – inte nödvändigtvis likadant från gång till gång. Ett eller flera tillstånd kan t ex upprepas eller måste inte finnas alls. Alla sådana saker specificeras av mönstret/schemat.

Förresten, det är ju inte så att det alltid finns en formell beskrivning heller – ibland sitter det hela bara i huvudet, man förstår själva processen. Det kan vara så enkelt som att man köper en sak: går in i affären, väljer vara (eller varor), betalar, får ett kvitto, går ut ur affären. Eller så låter man bli att betala och får därför inget kvitto. Eller kanske man går runt i butiken varv efter varv innan man till slut känner sig redo att passera kassan. Och så vidare. Processen är flexibel och kan varieras.

En fördel med att använda tillståndsmaskiner i programmeringen är att man slipper hålla hela bilden i huvudet. Det räcker med att se på den närmaste omgivningen och förstå var man man kommer ifrån, och vad man därför ska göra eller förvänta sig härnäst. Typ så ser jag på det. En tillståndsmaskin gör jobbet mycket enklare. Och ja, för att det påståendet ska vara sant måste det självfallet handla om ett problem som är lämpligt att lösa med en tillståndsmaskin, men det säger sig självt.

Utan tillståndsmaskinen kommer man antagligen att skriva kod som är kladdig och svårläst och därmed blir knepig både att följa, underhålla och vidareutveckla. Och kladdig och svårbegriplig kod tycker jag är bland det värsta en programmerare kan skriva. Det är att göra alla, både sig själv och framtida förvaltare av koden, en mycket stor otjänst. Om koden är kladdig från början blir den inte bättre när man ändrar i den. Inte ens om man själv är den som skrivit den från början. Tro mig.

Här skulle jag lätt kunna dra ut på sidospår för att prata programmeringsmetodik i största allmänhet (Code Complete-läsandet sätter sina spår och väcker sovande björnar), men nu tror jag ändå att det var historien om tillståndsmaskinen jag hade tänkt berätta så jag låter bli det. Kanske någon annan gång. Till programmeringen!

Låt säga att vi ska jobba oss igenom någon form av datastruktur, som är/behöver vara ordnad efter ett visst schema, och behöver titta på eller hantera varje bit data på olika sätt beroende på var i det här schemat vi (d.v.s. vi som lever i koden) befinner oss. Då tuggar vi oss igenom strukturen bit för bit och gör det som behövs för var och en av dem. För att hålla reda på var i schemat vi befinner oss kan vi t ex använda states, eller tillstånd om man nu ska prata svenska. Fine. Det finns ju i Java (och även andra språk) en datatyp för uppräkning och den kan vi använda.

Vi har en variabel som representerar det aktuella tillståndet med hjälp av ett värde ur en enumeration (uppräkning, här: lista över möjliga tillstånd), och så gör vi saker och sätter om värdet på variabeln vartefter vi tar oss fram i schemat/mönstret. Och på slutet kollar vi om det slutliga tillståndet stämmer med vad vi förväntat oss. Allt är fint, men koden känns inte riktigt bra och framförallt när man hanterar många olika tillstånd blir det väldigt oöverskådligt. Man tycker att det borde kunna finnas bättre sätt att lösa problemet. Och det gör det förstås. Det gör det nästan alltid.

Jag och sambon pratade vidare om tillståndsmaskiner och han planterade för några dagar sedan en tanke om att i stället representera tillstånden med klasser, som då skulle ha en hanteringsmetod med den logik som annars ligger i case-satserna. Det lät roligt, om än lite svårt att föreställa sig först, så jag blev sugen på att åtminstone testa. Sent igår gjorde jag sålunda ett provskott och kunde då konstatera att det var snabbt och lätt att skapa tillståndsklasser och peta in hanteringsmetoderna i dem.

Därefter åkte jag hem och fortsatte där med att skapa fiktiv exempelkod, helt tagen ur luften, och visa för sambon hur hans lösning förvanskats och implementerats av min hjärna och nu tänkte jag att jag kunde visa lösningen även för mitt framtida jag. Och naturligtvis även för er som läser detta inlägg och eventuellt är intresserade.

Så här ser det ut när jag representerar mina tillstånd med hjälp av enumerationer:

/* metoden som gör det övergripande jobbet */ {
	State currentState = Begin;

	while (we.haveMoreThings()) {
		switch (currentState) {
		case Begin:
			currentState = we.handleBegin(thing);
			break;
		case StateA:
			currentState = we.handleStateA(thing);
			break;
		case StateB:
			currentState = we.handleStateB(thing);
			break;
		case StateC:
			currentState = we.handleStateC(thing);
			break;
		case End:
			currentState = we.handleEnd(thing);
			break;
		default:
			throw new IllegalStateException("Hey, what!?");
		}
	}

	if (!currentState.isTheEnd()) {
		throw new IllegalStateException("We are not done yet!");
	}
}

private State handleBegin(Object thing) {
	// Här gör vi massor av spännande hantering...
	// ... och sedan returnerar vi nytt tillstånd:
	return StateA;
}
// ... här blir det alltså en metod per hanterat tillstånd.

Och så här ser det ut när jag i stället representerar mina tillstånd med klasser:

/* metoden som gör det övergripande jobbet */ {
	State currentState = Begin;

	while (we.haveMoreThings()) {
		currentState = currentState.handle(thing);
	}

	if (!currentState.isTheEnd()) {
		throw new IllegalStateException("We are not done yet!");
	}
}

Det vill säga: tillståndet sköter hanteringen. Jag vet vilken version jag föredrar.

Så, kan man kanske undra, hur ser det då ut bakom kulisserna?

I det första fallet lade jag (av flera olika skäl) mina tillstånd i egen, separat fil:

	enum State {
		Begin, StateA, StateB, StateC, End;
	
		public boolean isTheEnd() {
			return this == End;
		}
	}

… och i det andra fallet hamnar handle-metoderna i stället i ett State-interface, där jag även lagt tillståndsklasserna (som varken behövs eller bör synas utifrån). Det är en bra idé att stoppa undan ovidkommande information för att undvika förvirring.


interface State {

	public State handle(Object thing);
	public boolean isTheEnd();

	public static final State Begin = new Begin();
	public static final State StateA = new StateA();
	public static final State StateB = new StateB();
	public static final State StateC = new StateC();
	public static final State End = new End();
	
	public class Begin implements State {

		@Override
		public State handle(Object thing) {
			// Här gör vi massor av spännande hantering...
			// ... och sedan returnerar vi nytt tillstånd:
			return StateA;
		}

		@Override
		public boolean isTheEnd() {
			return false;
		}

		private Begin() { /* no outside construction, please */ }
	}
	// ... här blir det alltså en klass per hanterat tillstånd.
}

Hade detta varit i den riktiga världen hade jag valt att lägga tillståndsklasserna i egna, separata filer och gjort dem ”package private”, men i exempelkoden ville jag hålla strukturen likadan utifrån sett för att göra jämförelsen dem emellan enklare.

Nåväl, så här ser det ut just nu. Exemplet ovan gör inga anspråk på att vara vare sig korrekt eller komplett eller ens i närheten av realistiskt, men jag tycker att det fyller en funktion och hoppas att någon av mina läsare får glädje eller nytta av det.

Själv kommer jag garanterat att fundera vidare och skruva och fixa och dona och fiffa och mojja och vad man nu gör med kod. Kod, och ens tänkande kring den, evolverar ständigt. Ibland går det snabbt och ibland går det långsamt, men jag finner det i praktiken omöjligt att stå stilla. Det går alltid att göra koden bättre!

Kommentarer, funderingar, förslag?

Code Complete gör mig kodnödig!

Den bok jag läser just nu heter Code Complete (läs den, om du är utvecklare och inte redan gjort det!) och handlar om programmering. Jag har nu hunnit fram till de delar som handlar om själva koden och som bland annat beskriver några olika metoder för att arbeta fram bra kod. Och jag blir bara så förbaskat kodnödig.

Jag vill koda! Det har inte blivit så mycket av den varan på sistone.

Jag riktigt längtar efter att få sätta tänderna i ny utveckling, eller faktiskt hellre, dra igång en riktigt rejäl refactoring-omgång i tjänsten. Det finns en del att göra där, och jag har den senaste veckan eller så vid upprepade tillfällen nästan fått sätta mig på händerna för att inte förlora mig ut på den långa vägen mot Den Perfekta Koden[tm].

Alltså, det skulle vara så oerhört tillfredsställande att få göra det jobb som jag vet behöver och borde och förmodligen även kommer att göras, men det rätta tillfället har inte kommit ännu. Jag vet att det kommer, dock. Kanske snart, kanske lite senare. Men det kommer. Om inte annat så kommer jag att se till att det gör det.

Under tiden får jag nöja mig med att tänka, och i vissa fall beskriva. Det är inte riktigt samma sak, men jag kan ju också leva rätt gott i ett tillstånd av förväntan.

Etikettmoln