Man lever så länge man lär

Arkiv för kategorin ‘programmering’

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”.

Etikettmoln