Vad jag önskar att jag lärt mig på Chalmers
2014-06-19
Har funderat lite på vad jag lärde mig på Chalmers som jag haft nytta av i arbetslivet och vad jag önskar att jag hade lärt mig. Har även funderat på vilka kurser jag skulle rekommendera en student som går på högskolan nu med avsikt att jobba inom mjukvaruindustrin att läsa. Dessa saker har ett visst samband, men är inte ekvivalenta då man lär sig saker på högskolan som är bra/roliga/nyttiga att kunna i den del av livet som inte är relaterad till arbetslivet. Inte minst lär man sig många saker som är bra att kunna när man spelar frågespel ;) Måste dock i ärlighetens namn säga att just ur frågespelsperspektivet så finns det nog betydligt bättre utbildningar är en civilingenjörsutbildning. Utbildningar i historia och biologi t.ex.
Jag har hela min jobbkarriär jobbat med att konstruera mjukvarusystem av varierande storlek. Systemen har varit av typen "enterprise systems", så min bild av vad som är nyttigt att kunna är så klart färgad av det.
Vad jag inte lärde mig på Chalmers och som jag önskat att jag hade lärt mig:
- Versionshantering
Versionshantering är ju något som man använder dagligen när man jobbar med utveckling i mjukvaruindustrin. Det är i normalfallet verkligen inte raketforskning, men det hade varit lite bra att prova på ett VCS under kontrollerade former. Tror vi läste en kort text som berörde RCS i en kurs (kommer inte ihåg vilken), men det hade varit väldigt nyttigt att få använda ett versionshanteringssystem under t.ex en serie med labbar. Av de VCS:er som jag använt kanske Subversion hade varit det lättaste att lära sig. Git kanske hade varit nyttigare, men det känns lite för komplext för att vara helt optimalt att använda i labbar i en grundkurs. Risken är att det blivit för stort fokus på Git och inte på kursens huvudsakliga innehåll. Det känns även som om strulfaktorn är högre i Git än i SVN och strulfaktorn vill man ju hålla så låg som möjligt i en kurs...
- Strukturera stora mjukvarusystem
Det hade varit extremt nyttigt att lära sig lite om hur man kan strukturera stora system på olika sätt och hur man skall värdera de olika sätten mot varandra. Vi hade en kurs på 3 poäng när jag gick i trean i vilken vi i grupper om 2-5 pers fick genomföra ett projekt. Vad projektet skulle handla om fick vi bestämma ganska mycket själva. Några kompisar och jag skrev ett distribuerat air hockey-spel. Det var skitkul. Vi kodade loss som bara den och resultatet blev förvånansvärt bra. Dock är jag inte säker på att man om man skulle kolla på koden idag skulle vara speciellt imponerad över hur den varken var strukturerad, kommenterad eller testad. Nu gick inte kursen ut på det, men det hade varit nyttigt om någon lärare från datavetenskapliga institutionen hade gått igenom koden och gett kommentarer på arkitekturen (tror iofs inte att det hette så på den tiden).
- XML/XSD
Inte världens roligaste ämne, men ack så nyttigt att kunna. Avser då främst att konstruera en XSD så att de begränsningar som finns angående kardinalitet och elementordning i det som modelleras avspeglas på ett korrekt sätt i XSD:n. Detta är inte så svårt men inte helt trivialt heller. Jag har många gånger under mina år som kodare antigen behövt skapa en XSD från grunden eller sätta mig in i vilka begränsningar som en befintlig XSD ställer på XML-dokument som valideras mot den. Det är då vettigt att i alla fall ha ett hum om hur det hänger ihop. Gick en kurs i XML på Mittuniversistet för några år sedan. Innan kursen började trodde jag att den 1) skulle bli jättetråkig och 2) att jag inte skulle lära mig så mycket, men jag hade fel (som så ofta) på bägge punkterna. Den var helt OK ur ett rolighetsperspektiv och jag lärde mig en hel del, främst om XSD-konstruktion och XSLT.
- Installation och konfiguration av utvecklingsmiljö
När jag gick på Chalmers och gjorde labbar i datavetenskapliga kurser så var alltid utvecklingsmiljön färdiginstallerad och klar att använda. Detta är så klart praktiskt. Man kan koncentrera sig på det stoff som labben handlar om och labbhandledarna slipper få en massa ovidkommande frågor. Tyvärr är det inte så det funkar i arbetslivet, inte där jag jobbat i alla fall. Där kommer man inte till en färdiginstallerad dator som är klar att sätta sig ner och börja producera kod vid. Det är alltid en massa strul med att installera en IDE, ladda ner SDK:er och tredjepartsprodukter.
- Unix/Linux-systemadministration, bash, vi, less, grep, find
På alla de ställen som jag jobbat på så har de system som jag varit med och utveckla driftats på någon form av *nix-plattform. (I ärlighetens namn skall det sägas att Alystra som jag jobbade med på TransWare även och kanske rämst driftades på windows). Det har därför varit mycket värdefullt att kunna navigera runt och utföra grundläggande kommandon inne på diverse test- och produktionsservrar som kört olika typer av *nix-operativsystem. Det är bra att förstå lite om runlevels och att veta hur man lägger till användare samt hur rättighetssystemet fungerar. När det gäller testservrar så är det min erfarenhet att de oftast inte har någon vettig editor, dvs emacs, installerad. Jag har dock inte träffat på någon testserver som inte har haft vi installerat, varför grundläggande kunskap om det programmet är av stort värde när man skall in och ändra i någon konfigurationsfil. Det första vi-kommando man bör lära sig är
esc-:-q-!
Med det klarar man sig långt. När man skall kolla loggar, vilket man gör ofta och inte sällan under stor press ("Feature x funkar inte. Fixa!"), så är det bra att kunna använda less, grep, tail och find. - Något bra scriptspråk, ex Python
Det händer av och till att man behöver skriva program som manipulerar eller genererar textfiler. Att skriva sådana program i Java är ju såklart görbart, men det är inte helt smidigt. Fil-IO har blivit mer lättanvänt i senare versioner av Java än i version 1.1 som var den nyaste som fanns när jag började programmera med språket, men det är fortfarande inte smidigt. Jämför man hur många rader ett program som t.ex. läser indata från en textfil, kör en fråga mot en relationsdatabas baserat på det inlästa värdet och sedan skriver resultatet från frågan till en annan textfil så kan det säkert skilja en faktor fem beroende mellan ett Java-program och ett Python-program. (Ett extra plus är att det är mycket roligare att skriva kod i Python ;) Nu tog jag Python för det är det programmeringsspråk jag gillar bäst, men det finns en uppsjö av andra bra skriptspråk också.
- Testning: enhetstester, komponenttester, systemtesterEnhetstester och komponenttester är någon man som utvecklare skriver själv så att skriva sådana måste man kunna. När det gäller systemtester har i alla fall jag inte skrivit så många sådana själv utan min erfarenhet är att det ofta är specialiserade testare som konstruerar dem, men det är ändå viktigt att förstå vad ett systemtest skall testa och vad det finns för verktyg att skapa sådana i. Det kan även vara så att ett systemtest behöver köra ett litet specialskrivet program (fixtur) för att kunna testa det som skall testas. Vid sådana tillfällen kan man bli tillfrågad om att bistå med hjälp.
- Maven, ant
Koden man skriver måste byggas ihop till något som kan driftsättas på en server (eller annan dator) någonstans. I Java-världen sker sådana byggen ofta med verktyg som maven och ant. På Chalmers vet jag att vi använde make in någon kurs. Det var en mycket bra, men kanske inte så behaglig, erfarenhet eftersom vi på mitt första jobb byggde ihop vårt system med make.
Vad vill jag då rekommendera någon som vill jobba som utvecklare inom mjukvaruindustrin att läsa? Jo, följande:
- Generella kurser inom datavetenskap: algoritmer, datastrukturer mm.Det är viktigt att ha en stabil grund att stå på. Läser man sådana kurser får man en bred kunskap och kan jobba inom många olika delar av fältet. Läser man bara högt specialiserade kurser är risken att man blir för smal. Finns det då inga jobb inom just den specialiseringen kan det vara svårt att komma in på arbetsmarknaden.
- Databaser - SQL: används ju i princip överallt. Ett måste att kunna.
- Maskinnära programmering/assembler: Inte dumt att kunna åtminstone lite grand om lågnivåprogrammering även om man inte tänkt sig att jobba med det. Om inte annat för att inse hur priviligerade vi som kodar i högnivåspråk är ;)
- Kurser där man lär sig det jag tog upp i listan ovan ;)
Övriga råd:
- Installera Linux på en dator och lek runt med den. Installera program, kör en webbserver, lär dig om runlevels, rättigheter, användare mm.
- Installera en databas på datorn. Välj en relationsdatabas som t.ex. Postgres. Lär dig skapa tabeller mm (DDL) samt att lägga till och hämta upp data (DML).
- Installera ett IDE för ditt favoritprogramspråk och använd den tills dess att den känns bekväm.
- Lär dig ett bra skriptspråk, gärna Python. Lägg speciell vikt vid stränghantering och fil-IO. Lär dig accessa databasen du installerade från programspråket.
- Försök hitta något område som du är intresserad av och skriv något program inom det området. Det kan vara en app eller en webbsida eller något annat, det spelar ingen roll, bara du själv gillar det.
- Läs bloggar och artiklar på nätet och försök häng med i trenderna. Hittar du något som låter roligt så prova det!
Detta är mina tankar i frågan. Hade varit kul att höra vad andra tycker och tänker angående detta. Vad önskar ni att ni hade läst i er högskoleutbildning?
Det blev visst inte så mycket skrivet om vad jag har nytta i arbetslivet av det som jag lärde mig på Chalmers. Det här inlägget blev så långt så jag får ta det i ett senare inlägg.
Leave a reply