Färdigt programmeringsspråk och den icke programmerande programmeraren

31 maj 2010 kl. 6:41 e m | Publicerat i Personligt | 6 kommentarer
Etiketter: ,

Då börjar detta läsår närma sig sitt slut. Det är bara en tenta kvar att genomföra (10 juni) och sen kan jag koncentrera mig på de projekt jag har planerat att genomföra under sommaren.

Hur som helst är vi nu färdiga med konstruktionen av eget programmeringsspråk. Dokumentationen är även den färdig.

Det går att hitta dokumentationen här och den kompletta koden här. Installationsinstruktioner finns i dokumentationen tillsammans med användarhandledning, systemdokumentation och våra personliga kommentarer kring att ta fram ett eget språk (bestående av parser, lexer  och en grammatik baserad på BNF-notation).

För inte så länge sedan skrev jag ett inlägg med sju tips om att bli en professionell programmerare. Ett av tipsen är att lära sig lösa problem på ett smart sätt. Men det är inte bara att lära sig lösa problem på ett smart sätt, utan också att över huvud taget kunna lösa enklare logiska problem!

I ett inlägg på Imran On Tech (läs här) observeras att 199 av 200 jobbkandidater inte kan skriva kod alls.

After a fair bit of trial and error I’ve come to discover that people who struggle to code don’t just struggle on big problems, or even smallish problems (i.e. write a implementation of a linked list). They struggle with tiny problems.

Han använder FizzBuzz som exempel. Det är ett spel som går ut på att räkna från 1 till 100. Om talet är delbart med tre säger personen ”Fizz”, om talet är delbart med 5 säger personen ”Buzz”. Om talet är både delbart med 3 och 5 säger personen ”FizzBuzz”. Med delbart menas att den ger resten 0. Underligt nog har jobbkandidaterna svårigheter med att lösa detta problem, vilket kan ta upp till 10 minuter att genomföra. Testa att implementera det i ditt favoritspråk och se hur lång tid det tar. I Java skulle det se ut så här:

public class FizzBuzz {
	public static void main(String[] args) {
		for(int i = 1; i < 100; i++) {
			if ((i % 5) == 0 && (i % 3) == 0) {
				System.out.println("FizzBuzz");
			} else if ((i % 3) == 0) {
				System.out.println("Fizz");
			} else if ((i % 5) == 0) {
				System.out.println("Buzz");
			} else {
				System.out.println(i);
			}
		}
	}
}

Det här är alltså ett enklare problem. Ett annat enklare problem som även visat sig vara ganska svårt för kandidater är hur man ”swappar” mellan två värden. I Python skulle det se ut så här:

a, b = b, a

Det är kort och koncist, men antagligen inte vad som rekryteraren syftade på. Det skulle se ut så här i Java:

a = c;
a = b;
b = c;

Min fråga är då kanske framför allt: varför kan programmerare inte programmera? Det finns förmodligen flera anledningar till det, men den främsta anledningen jag kan tänka mig är att lösningar på problem finns tillgängliga på internet, serverade på silverfat. Detta gör att man slipper tänka – det är m a o bara att ladda ner källkoden och integrera den. Vi kan hitta källkoden för FizzBuzz på mindre än en minut genom att googla på ”FizzBuzz Java”. Detta är vad som i boken The Pragmatic Programmer kallas för ”Programming By Coincidence”.

We should avoid programming by coincidence – relying on luck and accidental successes – in favor of programming deliberately.

The Pragmatic Programmer, sid 172 (Programming By Coincidence)

Färdiga lösningar är inte helt och hållet fel. Det går betydligt snabbare att använda ett ramverk som Django eller Ruby on Rails än att skriva sitt eget. Men när vi väl löser problem så är det fördelaktigt om vi även förstår varför de fungerar. Om vi testar oss fram kan det bli till en vana där vi istället för att planera och tänka ut en lösning, gissar oss fram till en lösning.

Inlägget som först presenterade det här problemet kanske inte har något vetenskapligt underlag, men det väcker frågor för programmerare som söker programmeringsrelaterade jobb. Detta är visst något som förekommer på de flesta stora företag – där rekryteraren presenterar ett problem av ett enklare slag, för att sedan stegvis presentera allt svårare problem. Ett enkelt och effektivt sätt att gallra ut s.k. icke-programmerande programmerare.

Så, vad kan vi – som jobbkandidater – göra för att säkra ett jobb? Det första är förmodligen att kunna lösa enklare problem och även kunna implementera vissa algoritmer, som t.ex. sökalgoritmer, sorteringsalgoritmer, eller annat som vi förlitar oss på Google att göra åt oss. Detta kräver förvisso mer arbete av oss, men det lönar sig. Att läsa några böcker om just detta kan nog säkert också hjälpa. Jag har sammanställt en lista över böcker som ser ut att vara till hjälp:

Det var allt jag hade att säga nu. Jag återkommer med mer inlägg när jag väl har genomfört tenta. På återseende.

6 kommentarer »

RSS feed for comments on this post. TrackBack URI

  1. Hej.

    Intressant inlägg. Jag är hobbyprogrammerare (nybörjare) och provade implementera både swap och fizzbuzz i Perl vilket inte var vidare värst svårt. För att göra det extra svårt provade jag med ett annat favvospråk, Common Lisp, men gav upp då jag ligger till sängs och skriver på en bärbar och parenteserna inte är så lätta att hitta i hastigheten.

    Det låter sannerligen skrämmande att programmerare inte kan programmera. Samma utveckling ser man i grundskolans elevers språkkunskaper. När ordet får röd understrykning är det felstavat för att Microsoft Words ordlista inte känner igen det – därför justerar man ordet, inte för att man inser sitt misstag. Eller Googles stavningkontroll – av ondo rent kunskapsmässigt.

    Hur som helst gav du mig en tankeställare – vilket var både roligt och lite skrämmande. Tack!

  2. Hej Henrik. Tack för din kommentar.

    Granskningskontroller av text kan vara av godo ifall man använder det rätt – dvs. att man faktiskt lär sig av de språkliga felen man gör. Personligen har jag genom att köra granskningskontroller fått möjlighet att se över vilka som är de vanligaste språkliga felen jag gör, vilket innebär att jag inte gör dem senare. Att använda ett verktyg innebär samtidigt att kunna använda det på rätt sätt.

    Ett annat problem är så kallade code wizards som genererar kod åt en så att man inte behöver sitta och koda det manuellt. Koden skapas m a o automatiskt. Det finns vissa för- och nackdelar med detta. Fördelarna är att du snabbt kan konstruera infrastrukturen för att kunna koncentrera dig på problemdomänen. Nackdelen är att om man ständigt använder code wizards utan att förstå hur det är uppbyggt kommer man inte heller förstå eventuella problem som uppstår.

    Ett exempel på det är NetBeans där man kan placera ut grafiska komponenter utan att ens behöva skriva en rad kod, vilket är en form av code wizard.

    Att koda grafik är en ganska tråkig uppgift där man inte löser några logiska problem, det gäller bara att få allting att passa ihop och se bra ut. Därför slipper jag helst det och använder NetBeans för att åstadkomma detta. Men ifall man vill in och ändra i koden manuellt måste man ha en viss förståelse för hur grafiska applikationer byggs upp med Swing, varför jag anser att man ändå måste ha en rudimentär förståelse för Swing.

  3. Angående Swap: En person i korridoren utmanade mig med att implementera swap utan att använda en temporär variabel för mellanlagring. De ledtrådar jag fick var:
    1. Det kan göras med tre instruktioner.
    2. Du behöver endast använda + (plus) och – (minus)

    Ge det ett försök! Lösningen finns i kommentaren nedanför…

  4. Lösningen är (scrolla ner för att se svaret)…:
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

    a = a + b
    b = a - b
    a = a - b
    

    • Det finns även ett problem med att ”swappa” på detta sätt. Någon som kan klura ut det?

  5. […] Boken har tidigare blivit rekommenderad i det här inlägget. […]


Lämna ett svar till Nils Fredrik Karlsson Avbryt svar

Blogg på WordPress.com.
Entries och kommentarer feeds.