Man lever så länge man lär

Inlägg taggade ‘git’

Mattegrund lagd, ny termin påbörjad

Precis som efter förra tentan har jag varit väldigt trött sedan den i måndags. Ämnet denna gång var algebra och jag övernattade även nu på bra och lämpligt beläget hotell, dock utan sällskap. Det var riktigt skönt att sitta och äta ensam på mysig pub med mindre än en handfull gäster (inkl. mig själv), med ett glas riktigt gott lokalbryggt därtill: jag rekommenderades Cinder, en IPA från Tempel Brygghus, och blev inte besviken. Kanske läge att beställa hit några flaskor?

Laddar med Toast Skagen (på tallriken) och lokal Cinder (i glaset) inför morgondagens tenta. Same procedure as last time, men solokvist denna gång.

Själva tentan då.

Jag satt förhållandevis blickstilla i dryga fyra timmar (även om jag denna gång faktiskt kom ihåg att räta på mig och vrida på huvudet ibland för att förebygga det där otäcka bruset som uppstår i huvudet när jag efter intensivt fokus ställer mig upp så att blodet åter kan flöda fritt och som alltid får mig att tro att jag ska svimma) innan jag kände mig klar, sammanställde och lämnade in resultatet.

Känslan vid inlämmningen var betydligt behagligare än den stilla nästan-panik jag initialt upplevde, då ingen av uppgifterna verkade enkel och jag hade glömt allt om hur en sanningstabell ser ut, hur man löser en diofantisk ekvation eller identifierar nollställen för ett givet polynom-uttryck. För att inte tala om det här med induktionsbevis… dessa var inte lätta ens medan jag mindes metoden.

Lustigt, det där, hur något som först ter sig i princip omöjligt kan bli förståeligt, begripligt och överkomligt – utan att några som helst konkreta åtgärder vidtas. Jag antar att det beror på att stressen lägger sig så att hjärnan kan fungera. Och jösses, vilken skön känsla det är när man inte genast gett upp utan dragit många djupa andetag, behållit fattningen och så till slut blir rikligen belönad.

Jag gjorde en liten mental inventering av uppgifterna efteråt och konstaterade att jag med mycket stor sannolikhet skulle få godkänt, men att jag antagligen inte skulle nå det högsta betyget. Och det dröjde inte mer än 3 dagar innan jag fick det bekräftat och kunde därmed konstatera att jag uppnått denna termins mål om behörighet till de datavetenskapliga kurser jag siktade in mig på någon gång i våras, när jag insåg att jag behövde en plan för mina studier. Det vill säga: kurser som ingår i universitetets datavetenskapliga kandidatprogram.

Check! Riktigt nöjd med det här är jag.

Av de fem kurser som ingår i det här mattepaketet är alltså de två viktigaste avklarade, och för tillfället har jag inga planer på att läsa de resterande, men majoriteten borde gå att tenta av närhelst jag haft tid och motivation att tillägna mig kunskaperna så inget är hugget i sten. Någon av kurserna verkar kräva deltagande i grupparbeten så där skulle det väl behövas ett särskilt upplägg.

Just nu känns det som en bra idé att hoppa av den Cloud-kurs jag sökt och tackat ja till. Det är kanske bättre att ta en andningspaus (och få möjlighet att göra andra saker) fram tills i slutet av mars, då nästa ”viktiga” kurs drar igång? Vilket skulle ge mig möjlighet att göra sådant som legat på väntelistan länge, sådant jag verkligen vill göra, t ex läsa tredje utgåvan av Effective Java.

Och bara för det var jag ju tvungen att kika närmare på kursen och när jag läste litteraturlistan blev jag extremt sugen på att åtminstone läsa böckerna – 1 primär kursbok, och så 8 till som referenslitteratur. Samtliga, ser jag, finns att läsa via Safari Online som jag har tillgång till via flera olika kanaler, bl a arbetsgivaren och ACM (som jag gick med i för en tid sedan, vilket jag nog glömt skriva här).

När jag nu blev så fortsatt sugen på att läsa Cloud-kursen (på 25%) och även noterade att det går bra att läsa vidare under sommaren ifall jag inte hunnit klart när nästa kurs drar igång, fanns inget behov att avstå. Så jag är nu registrerad på kursen, som officiellt började igår. Kursmaterialet fanns tillgängligt i helgen, men jag valde i stället att köra tidigare påtänkta självstudier inom Big Data.

Kurserna jag körde igenom var Big Data 101 och Hadoop 101, som båda ingår i paketet ”Big Data Fundamentals”. Det var lagom roligt och också nyttigt – det är ju aldrig fel att skaffa lite koll på vad sådana där buzzwords egentligen handlar om. Är du som jag vetgirig? Kolla in Cognitive Class! Där finns en bunt kurser relaterade till ”cognitive computing”, och samtliga verkar vara fritt tillgängliga.

Nästa självstudiekurs jag kör blir nog Spark Fundamentals I, för när jag är klar med den blir jag belönad med ytterligare två medaljer (eller badges, som de kallar det). Det skadar säkert inte heller. Därefter sneglar jag på Scala 101… Konstaterar än en gång att det finns mer jag vill göra än vad jag hinner med.

Vilket leder tankarna till jobbet… där så lite hinns med trots långa dagar.

I förmiddags gick jag raskt från en till åtta punkter på min ”att göra först”-lista. Jag tror att jag kunde pricka av ungefär hälften av dem (kodning, felsökning, buggrättning) under dagen och påbörjade en kodgranskning innan hemgång. Däremellan ägnade jag mig åt merge i små kontrollerade steg från release- till utvecklingsgrenen. Git hanterar sånt bra. Och i vanlig ordning blev jag frustrerad över kollega som inte mergat sina ändringar, vilket resulterade i att jag blev låst och inte kunde färdigställa mitt jobb. Jag måste vänta in kollegans merge och det stör, för då kan jag inte släppa och gå vidare utan måste hålla det i minnet.

Två möten om en timme vardera var jag också med på, varav ett jag som själv organiserat. I ”mitt” möte tittade dollar-gänget, d.v.s. den halva av Scrum-teamet som jag tillhör, närmare på de aktiviteter vi tagit in i den igår påbörjade sprinten. Syftet är att skaffa en gemensam förståelse för vad som ska göras samt, genom att även bjuda in lämplig(a) kravare, skaffa fram svar på eventuella frågor vi har. Gruppen består av utvecklare och testare. Normalt är vi fem personer men idag, pga sjukdom resp. utbildning, var vi bara tre. Det gör ändå rätt mycket nytta.

Nej, nu måste jag få iväg det här inlägget innan det börjar mögla… och sova!

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!

Etikettmoln