[x^2 for x in lst]

Bloggstart

2014-03-12

Att börja blogga alltså. Har funderat på det förrut. Mest för att jag varit sugen på att prova lite olika, mer eller mindre kontiga, sätt att koda ihop en webb-applikation på. Ett litet projekt jag påbörjade var att skriva en bloggapplikation i princip helt i JavaScript. Den kom jag ganska långt med. Kommer ihåg att jag hade en "vänstermeny" som var implementerad med arv i JavaScript. Det är inte att rekommendera...

Nu blir det inga sådana knasigheter. Men jag tänker i alla fall skriva webbapplikationen själv. Det är inte så lätt att komma på vettiga uppgifter för sina hobbyprojekt, så det här blir ett utmärkt tillfälle att få tota ihop något som kanske kanske kan "go live", till skillnad från många av mina andra små projekt.

Tänker skriva webbapplikationen med hjälp av Django och spara texterna och annat i en MongoDB-databas. Att det blev just Django beror på att jag gillar Python väldigt mycket, men att det inte blir så många tillfällen att använda det i vardagen. Detta blir ett bra tillfälle att mätta sin Python-törst lite.

Angående valet av MongoDB så är drivkraften en annan. Jag använder MongoDB i jobbet så i det fallet gäller det mer att MongoDB är en väldigt trevlig databas att arbeta med.

Vad skall bloggen då handla om? Jag har tänkt att den skall handla om programmeringsrelaterade ämnen som intresserar mig. Det blir nog en del om programsråken jag tycker bäst om dvs Java och Python samt en och annan recension av någon datarelaterad bok som jag läst. Vi får la se. Skoj skall det bli i alla fall.

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, systemtester

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

Plötsligt händer det!

2014-11-09

Kommer ni ihåg den där gamla reklamfilmen när en person står i en lång kö till kassan i en mataffär då plötsligt en ny kassa som personen blir först i kön till öppnas? "Plötsligt händer det!". Jag kommer inte ihåg vad filmen gör reklam för, men igår inträffade i alla fall en sådan "plötsligt händer det"-händelse.

Jag satt och kodade på matteappen fram på kvällskvisten. Höll på med en egen grafisk View i vilken användaren skall kunna ange ett klockslag genom att ställa visarna på en analog klocka. Jag hade kommit så långt att jag hade ritat ut en urtavla med siffror och minutmarkeringar samt den långa visaren. Den korta visaren tänkte jag vänta ett slag med. Det jag jobbade med för tillfället var funktionalitet för att kunna flytta den långa visaren runt urtavlan genom att dra fingret över surfplattan. Det som gjorde det hela icke-trivialt (relativt sett....) var att eftersom den långa visaren alltid skall gå från mitten av urtavlan till dess perferi men fingret som styr den i de flesta fall inte kommer att befinna sig på urtavlans rand måste jag projecera fingrets position på rätt ställe på randen. Inte superkomplicerat så klart, men det kräver lite trixande med trigonometri. Sen måste man hålla koll på i vilken kvadrant fingret befinner sig också för att veta hur man skall justera koordinaterna på visarens slutpunkt.

Vad var då det där "plötsligt händer det"-ögonblicket nu då? Jo, det var att det funkade precis som jag hade tänkt mig med en gång! Inte en enda omkompilering pga att det var något jag missat eller något fall jag glömt eller så. Det funkade direkt. Helt otroligt. Det händer ju i princip aldrig. Inte mig i alla fall.

Blev så uppspelt att jag gick bort till frugan som satt och såg på TV i soffan och visade upp den fina nya funktionaliteten. Kommentaren blev ett förstrött "Vad bra.", med undertonen "gå nu så kan jag se klart på programmet". Vissa förstår inte hur ovanligt det är att något i mjukvaruvärlden funkar på en gång ;)

Varför är det på detta viset då? Att det är så få gånger som man skriver något funkar med en gång. En förklaring kan vara att det vi sysslar med som programmerare är så komplext att det är svårt att få det rätt på första försöket. En annan, mindre välvillig, förklaring kan vara att tiden det tar att genomgå en write-compile-(deploy)-run-test-cyklel ofta är så kort så att det inte är lönt mödan att tänka igenom sitt program ordentligt. Det är lättare att bara köra på och låta testerna avgöra om programmet är korrekt eller inte. Antagligen är det väl en kombination av de två. Egot vill dock gärna propagera för den första förklaringen ;)

Skönt var det i alla fall att ha ett "plötsligt händer det"-ögonblick. Får väl se när det händer nästa gång. Misstänker att det lär dröja...

Bloggen i år och planer inför nästa år

2014-12-23

Året som gått

Det har varit ett roligt första bloggår för mig. Har skrivit ca 30 inlägg om varierande ämnen, som har det gemensamt att alla är datanördiga på något sätt. En del inlägg som till exempel mini-serien om Java 8, har varit planerade och andra mer oplanerade. Exempel på de senare är de inlägg jag gjort i kategorin Dagens lärdom. Tycker själv att det blivit en ganska bra mix. Retar mig lite på att bokrecensionerna har klumpat ihop sig lite. Får försöka att sprida ut dessa lite mer nästa år.

Just när det gäller böckerna har det varit ett bra år. Jag har läst ut 7 böcker (programmeringsrelaterade böcker alltså, det är ju bara de som räknas ;). Det är fler än jag mäktat med något annat år sedan dess jag blev pappa (och fick radikalt mycket mindre tid att disponera på läsning). Tycker att det fungerat väldigt bra att skriva en liten recension om varje bok. Föreställer mig att jag kommer ihåg innehållet lite bättre och har dessutom något att gå tillbaka till för en snabb repetition.

Rörande hobbyprojekten har det också gått ganska bra. Jag har kommit igång dels med bloggapplikationen och dels med matteappen. Får säga att jag är jättenöjt med att ha startat upp de två småprojekten. Speciellt roligt är att de, till skillnad från många av mina tidigare hobbyprojekt, verkligen används (om än inte av så många). Superkul!

Jag har någon liten halvhjärtad idé om att bredda mig lite när det gäller vilka programspråk jag kan då jag tycker att jag är lite för smal på den punkten. Kodar mest Java och Python, men vill gärna lära mig fler språk. I år gjorde jag en ansats att lära mig Groovy. Läste en bok och kodade lite små exempelprogram. Kan dock inte säga att jag kan Groovy speciellt bra. Får fortsätta med Groovy:andet nästa år. Har dessutom vissa planer på att lära mig fler språk. Se nedan...

Året som kommer

Vad har jag då för planer nästa år? Ja, angående utseendet på bloggen skall jag försöka hotta till det lite. När en kollega fick syn på bloggen första gången utbrast han något i stil med "Du har inte funderat på det här med färger?". He, he. Det är ju bara att hålla med. Så mycket färger finns det ju inte på den. Får se om jag får tummen ur och färgsätter den lite mer. Lite snyggare skall jag försöka göra den i alla fall.

En annan ändring jag har tänkt mig att göra är att börja skriva på engelska. Anledningen till det är att jag vill kunna nå ut till fler. Inte säkert det gör någon större skillnad, men man kan ju alltid prova.

Angående ämnen för blogginläggen då? Vad tänkter jag när det gäller dem? Jag har köpt böckerna Seven Languages in Seven Weeks och Seven More Languages in Seven Weeks. Dessa tänkte jag beta av under det första halvåret. Blir med andra ord "14 språk på 26 veckor" om den planen går i lås. Har tänkt skriva ett blogginlägg om varje språk; vad jag tycker om det, vilka egenheter det verkar ha, vilka utvecklingsmiljöer jag har provat och så vidare. Det blir nog ganska intensivt, men det borde också kunna bli roligt och lärorikt.

Jag har också köpt boken The Coding Dojo Handbook. I den finns en katalog med kodkata, vilka jag tänkte mig att pröva på att implementera i några av de språk som beskrivs i Seven LanguagesWeeks-böckerna. Tänkte börja med att skriva en grafisk klient som kan visa upp "världen" i Game of Life. Tanken är att skriva ett litet REST-interface till den med vilket man kan ange vilket tillstånd världen skall ha. På så sätt skulle jag kunna skriva program som "spelar" game of life och visar upp sitt tillstånd mha den grafiska klienten. Får se om jag hinner med det. Det vore roligt i alla fall.

Almas matteapp tänker jag fortsätta koda på i alla fall. Vi använder det flera gånger varje vecka för att träna matte. Nu har Alice börjat använda den så smått också, vilket är roligt. Just nu är det så att jag nästan inte hinner med att göra nya uppgifter i den takt som Alma gör klart de gamla (av de som är relevanta. Hon är inte riktigt på 12:ans gångertabell än...). Näst i pipen nu är divisionsuppgifter. Funderar även på att göra en digitalklocka så det går att göra uppgifter för att träna på den. Sen hade det varit kul att får tummen ur och göra appen tillräckligt färdig föra att kunna laddas upp på Play-butiken också. Tror dock att det är en del jobb med det. Speciellt jobbigt kan det nog vara att få appen att se OK ut i alla olika upplösningar. Vi får se om jag orkar med det eller inte.

Så, det var en liten genomgång av vad jag åstadkommit på hobbykodar-/blogg-fronten i år och vad jag har för planer inför nästa år. Om ett år år vi se hur väl de planerna slog in. Känner jag mig själv rätt kommer det säkert bli en del ändringar i dem. Det brukar ju aldrig gå som man har tänkt...

God Jul och Gott Nytt År!

The Blog Year 2015 in Retrospective

2015-12-31

This year

So now it's time to sum up another year. My second year blogging. What have accomplished blog-wise this year then? Well, let me start admitting that the number of blog post have gone down. In fact I just wrote 17 blog posts this year compared to the 30 of last year. That's not good. What is the reason for that then? My excuse for that poor figure is that the blog post this year on the average is longer than those of 2014. Most of the posts this year have also been either a book review or a part of the "14 Languages" series, and blog posts of both of those types take quite a long time to research. For book reviews you have to read the book (obviously ;) and for parts of the 14 Languages series you have to study the language in question in enough detail that you actually can write something about the language that is correct and doesn't sound too stupid for anyone that knows the language.

If I compare what I said that I would accomplish in 2015 in the retrospective for 2014, I've done some of the things I said I would do, but failed in doing others. I've started writing in English and added some colours to the site. That's good. I've also finished the book Seven Languages in Seven Weeks and written a blog entry about each of the languages.

I've not written a graphical Game of Life client, which I regret, but I've simply not had the time. There hasn't been much Groovy-programming done either :(

Regarding reading programming related books, I think I've done fairly well. I've read six such books. One less than last year, but I think that that is compensated by the fact that the books read this year covers a broader set of topics than the ones I read last year. This year I've read books about: general programming, Mule, Python, Erlang, networking and of course the Seven Languages-book.

The math app has also seen some progress. I've added a digital clock and exercises for that. I've also added division exercises and mixed addition/subtraction exercises.

Next year

What about 2016? What are my plans regarding the blog, the math app, reading programming books and doing other stuff that I like? I will try to focus a bit on learning Clojure better. When reading the Clojure part of Seven Languages, I felt that I enjoyed programming in it, so I've bought a book (Clojure for the Brave and True) which I will read. I'll will also a course (my 22:nd at Mittuniversitetet) in...hmmm...Java. Why Java? Haven't you coded in that language since 1998? Yes, I have, but that course was the only one that I felt like taking this coming semester. I might try to get a degree from Mittuniversistet, I thing I'm quite close, so I need to take some more classes there, and this was the only one that was even remotely interesting. And how is a course in Java related to Clojure? To make things a little more interesting, I'll try, when possible, to also code the course assignments in Clojure. That could be fun. I hope.

I plan to continue working on the math app. Alma is progressing quite rapidly through the exercises, so I need to keep adding such. More multiplication exercises and mixed multiplication/division exercises will have to be added. Perhaps I'll finally get around to make the app ready for Google Play, but to be honest I doubt that I will.

I also with to continue and, hopefully, complete the 14 Languages-series. I'm not sure that I will be able to complete it, it takes so much time, but at least I will give it a try. I feel that I learn much from reading about different languages. What languages that are included in the Seven More Languages in Seven Weeks book I don't have a clue about. That will come as a, hopefully pleasant, surprise.

That was that for this year. Have a really Happy New Year! Let's hope that 2016 will be a much better year than 2015!

Challenge: Python Algorithm Books

2019-07-30

Since I took the first programming course not focusing entirely on teaching the language in question, I've been interested in algorithms. Solving a problem in different ways and comparing the solutions and the execution times of them have always appealed to me. Sadly, my daily work does not include very much of such. This, both the interest and the lack of exposure at work, is, I'm sure, something that I'm sharing with a large percentage of working programmers.

Some time ago I bought the book Classic Computer Science Problems in Python. It describes some interesting computer science problems and algorithms for how to solve them. I then saw some books that I thought looked interesting at a Manning.com sales. One of them was Grokking Algorithms, which it an introductory book to algorithms with examples in Python.

Mostly to persuade myself that I should by by the book, I started to think about reading a number of Python algorithm books, write a short comparison about them them and publish that on the blog. I already have Python Algorithms by Magnus Lie Hetland, so if I bought Grokking Algorithms I would have three books on the topic. That could work.

Then I found a Algorithms and Data Structures in Action on the same Manning sales...so now I have four Python algorithm books.

Well, the code examples on Algorithms and Data Structures in Action is actually in pseudo code, but that's close enough to count as Python ;)

So what I'll do is the following:

  1. Read all four books (and try to do all exercises in them).
  2. Write the usual book review after having read each book.
  3. Write a comparison of them after I've read all four.
Simple enough.

I suspect it will take some time to accomplish the feat however. The exercises in the books may not be east to solve. Also, Algorithms and Data Structures in Action is in MEAP, so I won't be able to end my small blog entry series until that book is finished, which it is supposed to be in September 2020.

Another thing that I will try to do is not buying any more books until I'm finished with these ones (and of course the other ones that I'm reading right now (Python Workbook MEAP and Cloud Native Patterns)). This might be even harder than solving the exercises in the algorithm books... ;)