n+1 sätt att bli en bättre programmerare

IBM 1403 printout (from the power-of-two program)

Det är en enorm skillnad mellan de bästa programmerarna och de mediokra:

… many studies have shown order of magnitude differences in the quality of the programs written, the sizes of the programs written, and the productivity of the programmers. /…/ They studied professional programmers with an average of 7 years’ experience and found that the ratio of intitial coding time between the best and worst programmers was about 20:1; the ratio of debugging times over 25:1; of program sizes 5:1; and of program execution speed about 10:1.

(Notera alltså att studien jämförde programmerare som jobbade aktivt som programmerare och som hade gjort det i genomsnitt i 7 år. Alltså inte praktikanter eller studenter mot företagens superstjärnor.)

Fog Creek Softwares vd och grundare, Joel Spolsky, skriver också om detta, och är känd för att enbart vilja anställa de allra bästa programmerarna:

The real trouble with using a lot of mediocre programmers instead of a couple of good ones is that no matter how long they work, they never produce something as good as what the great programmers can produce.

En slutsats av detta är att om du är en riktigt, riktigt smart och effektiv programmerare så kan du få riktigt bra betalt och välja och vraka bland jobberbjudandena (med brasklappen att du faktiskt måste marknadsföra din kompetens också). Det kan man se exempelvis på hur mycket företagen satsar på att locka till sig oss duktiga programmerare och hur de försöker överträffa varandra i personalförmåner, lön och ”kul på jobbet”.

Hur blir man då en ännu bättre programmerare?

Peter Norvig har en del bra tips i sin artikel Teach Yourself Programming in Ten Years. (Glömde jag nämna att detta är något som tar tid? Programmering är som ett gammalt hantverk, där du behöver din lärlingstid innan du kan bli mästare.) Jeremy Morgan har också en del tips.

Det är dock viktigt att poängtera att erfarenhet inte automatiskt gör dig skickligare:

They found no relationship between a programmer’s amount of experience and code quality or productivity.

Jag skulle säga så här: att byta ramverk, programmeringsspråk eller paradigm är väldigt utvecklande. Men ju längre tid du jobbar med samma tekniker, desto mer avtar din personliga utveckling. Du kanske känner dig trygg som en expert, men du skulle förmodligen bli ännu duktigare om du utmande dig själv och lärde dig något nytt.

Boken The Pragmatic Programmer säger så här:

Learn at least one new language every year. Different languages solve the same problems in different ways. By learning several different approaches, you can help broaden your thinking and avoid getting stuck in a rut.

Jag har själv märkt hur jag har blivit en bredare och smartare programmerare genom exempelvis min utbildning — där vi lärde oss många programmeringsspråk och teoretiska koncept. När jag har bytt jobb har jag ofta också bytt språk och ramverk, och har även programmerat en hel del på fritiden i allt från C++ till Python och Bash. Utan allt detta, tror jag att jag hade varit en mycket sämre programmerare.

Här får du därför några tips för det kommande året — för att du ska utvecklas så mycket som möjligt och bli smartare, effektivare och mer välbetald:

  • Lär dig ett nytt programmeringsspråk, helst så olikt det du vanligtvis använder som möjligt. Har du testat Ruby eller Python än? Har du skrivit något i Erlang och Objective-C? Det finns en oändlig mängd språk, och vill du tänka nytt kan Prolog eller Haskell också vara något att prova på. Har du brottats med pekare och minnesallokering i C?
  • Lär dig ett nytt MVC-ramverk för att se olika implementationer och filosofier kring MVC-mönstret (de skiljer sig åt en del). Exempel beror förstås på ditt programmeringsspråk. Eller varför inte utmana tanken med MVC och prova något annat mönster?
  • Lär dig en ny databasmodell för att utmana dina tankar om hur du kan strukturera data. Du måste tänka om när du ska lagra data i en key-value store istället för i en relationsdatabas! Exempel: MongoDB, Redis, Neo4j.
  • Lär dig ett nytt CMS eller e-handelssystem för att se hur andra system tänker kring innehåll. Om du exempelvis bara jobbar med WordPress, lär dig Joomla, Drupal eller Umbraco.
  • Lär dig en ny plattform för att helt byta kontext; skriv en app för Android, iPhone eller Windows Phone; skriv en webbapplikation; skriv ett Windows/Linux/Mac-program.

Som bonustips föreslår jag att du också läser ett par böcker inom programmering, exempelvis någon av dessa:

Hur gör du själv för att utvecklas och bli en duktigare programmerare?

Smartphones ger sämre lösenord

Föreställ dig att lösenordet till ditt Facebook-konto är Bo4!p&kK=LsG. (Du har väl säkra och unika lösenord till alla dina konton, eller hur?) Nu har du köpt en smartphone och ska logga in för första gången. Vad gör du?

Jag gissar att du loggar in på Facebook på datorn och byter till ett enklare lösenord, ett som du snabbt och enkelt kan skriva in på din smartphones tangentbord.

På iPhone är det enklast att skriva tecknen a-ö (gemener) och mellanslag. För att få fram en uppsättning specialtecken måste du trycka på ”123” för att byta tangentbordslayout. För vissa specialtecken måste du byta ännu en gång genom att trycka på ”#+=”.

Tyvärr är det alltså lite besvärligare att skriva in säkra lösenord på smartphones (framförallt iPhone, Android är bättre på specialtecken), vilket får mig att dra en slutsats och göra en förutsägelse:

Kvaliteten på lösenord kommer försämras framöver, i takt med att pekskärmar används mer och mer. Lösenord kommer bestå av enbart bokstäver och inte vara tillräckligt långa.

Men du som vill ha hyfsat säkra lösenord som är iPhone-vänliga, tänk på detta:

  • Använd bokstäver med accenter och andra tecken, ex. áõêüß, som du snabbt får fram genom att hålla inne respektive bokstav på tangentbordet.
  • Håll inne tangenten ”123” och dra fingret till en siffra eller ett specialtecken och släpp för att komma tillbaka till ”ABC”-tangenterna direkt.
  • Kompensera för dålig variation mellan tecknen med extra långa lösenord, ex. så kallade pass phrases.

Har du tänkt på att det är besvärligt att skriva in lösenord på din smartphone? Har du några knep eller tankar om det? Dela gärna med dig i kommentarerna.

Jag finns nu på Mediastrategi

Observera att jag har slutat på Mediastrategi.

För något år sedan var jag frilansande webbutvecklare på heltid, sedan började jag på Pingdom och blev expert på webbprestanda. Nu har jag återvänt till konsultandet och jobbar på webbyrån Mediastrategi.

Mediastrategi är en liten webbyrå i Västerås som har två avdelningar:

  1. Internetmarknadsföring
  2. Webbproduktion

Vi kan alltså hjälpa dig med exempelvis SEO, sociala medier och webbutveckling (mestadels Joomla och WordPress, men även skräddarsydda system).

Jag kommer successivt ta över allt ansvar för webbproduktionen, medan Daniel Nordahl fortsätter som vd och marknadsförings-guru.

Ring mig på 021-470 88 32 om det finns något som vi kan hjälpa till med!

Hur man publicerar blogginlägg på Twitter och Facebook automatiskt

Jag är bekväm av mig, därför vill jag att bloggandet ska vara så enkelt som möjligt. När jag klickar på knappen Publicera, vill jag att blogginlägget automatiskt ska publiceras på Twitter och Facebook.

Som tur är, har jag hittat sådana plugins till WordPress, som dessutom gör det på ett snyggt sätt: Simple Facebook Connect och Simple Twitter Connect. Låt dig inte luras av namnen, pluginen kan göra nästan allt.

En fördel med just dessa plugins är att de guidar dig till att skapa ”appar” hos både Facebook och Twitter, vilket bland annat gör att det står att inlägget publicerades ”via Apprikos” (eller vad din app kallas).

Så här kommer det se ut:

Du kan också låta dina besökare exempelvis kommentera på inläggen via Facebook och lägga in de officiella Like– och Tweet-knapparna.

Twitter släpper två bra bibliotek: Bootstrap och Hogan.js

I augusti släppte Twitter  Bootstrap, ”a front-end toolkit for rapidly developing web applications”. Det är ett paket med HTML, CSS och Javascript som gör det busenkelt att skapa snygga webbapplikationer. Utseendet kommer förstås påminna väldigt mycket om Twitter, vilket inte borde avskräcka alltför mycket…

Idag släppte de också Hogan.js, ett templating-ramverk för Javascript. Jag har inte tittat närmare på det, men eftersom det kommer från Twitter, utgår jag från att det är bra grejer.

Kolla in och testa genast!

Introduktion till Git

En bra video för dig som vill lära dig versionshanteringssystemet Git:

 

För att sedan kolla upp detaljer, kan du använda ”boken” Pro Git som finns gratis på nätet.

Jag har tidigare skrivit om Subversion, men numera skulle jag nog rekommendera Git eller Mercurial. (Läs Git is like MacGyver, Mercurial is like James Bond om du vill veta skillnaderna på ett övergripande plan.)

Använd inte MD5 eller SHA-1

Det är egentligen ganska enkelt: använd inte md5 eller sha-1 för att hasha dina användares lösenord. Inte ens om du använder salt.

United States Computer Emergency Readiness Team skrev 2008:

Software developers, Certification Authorities, website owners, and users should avoid using the MD5 algorithm in any capacity. As previous research has demonstrated, it should be considered cryptographically broken and unsuitable for further use.

Computer Security Division vid NIST skrev 2006:

Federal agencies should stop using SHA-1 for digital signatures, digital time stamping and other applications that require collision resistance as soon as practical, and must use the SHA-2 family of hash functions for these applications after 2010.

Säkerhetsgurun Ron Rivest skrev 2005: ”… now that md5 and sha1 are both clearly broken (in terms of collision-resistance).”

Förutom att algoritmerna har påvisade säkerhetsbrister går det väldigt snabbt att skapa uppslagstabeller för att ta reda på vilket lösenord som döljer sig bakom ett hash.

Med optimerade algoritmer och genom att använda grafikkort för att beräkna hashsummorna (de är snabbare än vanliga processorer på detta), har man kommit upp i 700 miljoner hashar per sekund för SHA-1. Mina tester visar att MD5 går ännu snabbare.

Det betyder att ditt ”säkra” lösenord på 8 tecken (ex. ”LvZ49l3U”, ”ibOQ3sjL”, ”LwL5opHp”) knäcks på en vecka. Om du är som de flesta och har lösenord på max 6 tecken, är det knäckt på under en halvtimme.

(Det finns också färdiga sådana uppslagstabeller som kallas rainbow tables som man kan använda för att blixtsnabbt knäcka alla tänkbara lösenord.)

Jag skrev tidigare en kort introduktion till hur man lagrar lösenord säkert, men sedan dess har jag lärt mig mer och kan sammanfatta det så här:

Använd SHA-256 med key stretching och dynamiskt salt för varje användare eller bcrypt med Blowfish (PHP-kodare bör använda PHPass). Då klarar du dig rätt bra.

Introduktion till Node.js

Vad är Node.js?

Node.js (kallas oftast ”Node”, rätt och slätt) är i grunden ett program som kan köra din Javascript-kod från kommandoraden – utan en webbläsare. Node.js gör det också möjligt att använda nätverket och filsystemet från Javascript mycket bättre än vad som är möjligt i dagens webbläsare.

I praktiken används Node.js mest som en webbserver, men det är egentligen bara ett av många möjliga användningsområden (men också det som Node.js-folket själva framhåller mest).

Ett av målen med Node.js är att det ska vara skalbart och alltså kunna hantera väldigt många samtidiga besökare på exempelvis en webbtjänst (men det är kanske inte riktigt så enkelt som att Node.js löser alla problem med skalbarhet).

Något som kan vara värt att tänka på är att med Node.js kommer du närmare hårdvaran än med exempelvis PHP på Apache. Node.js är alltså inte en högre abstraktionsnivå utan en lägre – vilket ger större flexibilitet men också mer komplexitet.

Installation

Du kan installera Node.js på flera olika sätt, men det enklaste är via en pakethanterare. I Ubuntu kan du använda apt för att installera Node.js:

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:chris-lea/node.js
$ sudo apt-get update
$ sudo apt-get install nodejs

npm

Node Package Manager (förkortas npm) är en pakethanterare för Node.js, ungefär som PEAR för PHP, RubyGems för Ruby eller pip för Python. Npm gör det enkelt att installera moduler som du behöver.

Det enkla sättet att installera npm på:

$ curl http://npmjs.org/install.sh | sudo sh

”Hello, world!”

Skapa en fil helloworld.js och skriv in denna kodrad:

console.log('Hello, world!');

Kör det sedan från kommandoraden med detta kommando:

$ node helloworld

Enkelt!

Webbserver

En introduktion till Node.js måste förstås inkludera en enkel webbserver också. För att göra det enkelt för oss använder vi modulen Express istället för att använda den råa, inbyggda http-modulen.

$ npm install express

Skapa sedan en textfil, exempelvis webserver.js och skriv lite kod:

var app = require('express').createServer();

app.get('/', function(req, res){
    res.send('Hello, world!');
});

app.listen(3000);

Funktionen require() läser in modulen och createServer() skapar ett server-objekt som vi kallar ”app”. Genom att anropa metoder såsom get() och post() på app, talar vi om för objektet vad som ska hända när en viss URL på servern anropas. Det blir alltså ett slags router eller front controller.

Argumenten req och res står för request och response. req innehåller allt du behöver veta om anropet, och res är objektet som ska returneras till webbläsaren när du är färdig.

Metoden listen() säger sedan åt Node.js att vi vill lyssna på port 3000 och hantera alla http-anrop som kommer in där. Servern kommer fortsätta att lyssna tills du stänger av Node.js (ex. med Ctrl+C) eller tills något undantag eller fel inträffar.

Testkör servern exempelvis så här:

$ node webserver &
$ curl localhost:3000
$ killall node

Läs mer

Jag hoppas att du har lärt dig grunderna i Node.js, men naturligtvis finns det massor att upptäcka och lära sig:

Tips på artiklar om programmering

Riktigt bra artiklar som jag har lärt mig mycket från:

  1. The M in MVC: Why Models are Misunderstood and Unappreciated. ”Controllers must define application behaviour only in the sense that they map user input onto calls in Models, but beyond that role it should be clear all other application logic is contained within the Model.”
  2. ORM is an anti-pattern. ”OO design cannot represent relational data in an efficient way; this is a fundamental limitation of OO design that ORM cannot fix.”
  3. Understanding typeof, instanceof and constructor in JavaScript. ”They say in JavaScript “everything is an object”. They’re wrong. Some types in JavaScript are so-called “primitive types”, and they don’t act like objects.”
  4. One of the Best Bits of Programming Advice I ever Got. ”… And that giving it a better name would tend to make the design more encapsulated, less spaghetti code, in short more object oriented.”
  5. Nobody Understands REST or HTTP. ”Let’s talk about a few cases where either REST or HTTP (which is clearly RESTful in its design) solves a common web development problem.”