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?
Tryckt & kränkt