Blog: Reverse Engineering af en programmørvittighed

Jeg undskylder på forhånd for den gamle vittighed, som jeg hørte fortalt igen for nylig. Denne gang var der ét eller andet, som did not compute. Og heldigvis bliver vittigheden meget mere interessant, når vi begynder at se på, hvor dårlig den i virkeligheden er:

En programmør bliver bedt af sin kone om at gå ned i supermarkedet og købe 2 liter mælk. På vej ud af døren råber hun: “Hvis de har æg, så køb 12!”

Da han vender tilbage, har han favnen fuld af de 12 liter mælk, han har købt. Da konen spørger, hvorfor han har købt al den mælk, svarer han: “De havde æg.”

Denne vittighed har cirkuleret længe, og på overfladen er den jo også meget finurlig, selvom den ikke er en lårklasker. Den har også været på Reddit, hvor brugerne forsøgte at kode sig til en forklaring. Reddit-brugerne overser imidlertid en meget væsentlig detalje, nemlig at ovenstående scenarie aldrig ville have udspillet sig, hvis der var tale om en rigtig programmør.

(Jeg gætter på, at vi ikke skal tre kommentarer ned under dette indlæg, før der er en supernørd, der påpeger noget i stil med, at der findes en obskur variant af LISP, som ville fortolke det helt ligesom i vittigheden)

Lad os se på noget kode!

Sådan ser kernen i konens instruks ud. Allerede her kan vi se, at der er noget galt. Vi ved godt nok ikke helt, hvordan KØB-funktionen er implementeret, men det er vanskeligt at forestille sig en implementering, hvor den blot ville acceptere et heltal som argument.

Altså ville programmøren returnere “invalid or missing argument” til sin kone (og nu vil onkelhumor-segmentet udbryde: “Og det skal man aldrig gøre!”).

Umiddelbart ville en overlæsning af funktionen KØB nok ligne noget i stil med:

I så fald ville KØB(12) formentligt blive fortolket som en streng “12″, hvor man med lidt god vilje kunne antage, at funktionen matcher med varenavne i butikken. Hvis det var tilfældet her, ville vi forvente, at programmøren returnerede med varen “12″.

Muligvis kan vi nøjes med at matche strengen med begyndelsen af et varenavn, og så ville programmøren returnere med den første vare, der begyndte med “12″. Det ville næppe være “12 æg”, hvis varerne i butikken er sorteret alfabetisk. Måske snarere “12 Albani Classic Pilsner”.

Lad os se på, hvad der kunne være gået galt i programmørens implementering af instruktionen fra konen. Vi udvider lidt med min kludetæppekode:

Ud fra denne kode er det vanskeligt at se, hvordan programmøren endte med 12 liter mælk. Men han kunne måske være endt med 14 liter, hvis “vare” var en global variabel, og en overlæsset KØB-funktion, der kun modtog et heltal, brugte den globale vare-variabel, som var blevet sat til mælk. Nu er vi ude i noget meget dårlig kode.

Lad os prøve at reverse engineere koden ud fra instrukserne og resultatet:

… er umiddelbart den mest enkle fungerende implementering, jeg kan finde frem til. Men det forudsætter, at vores programmør går lidt videre end instruktionerne fra konen, og dels antager, at “12″ er et antal, og dels sjusker ved at erklære den samme antalsvariabel med en ny værdi, og så begynder det at ligne en vittighed om en programmeringsfejl, og det er ikke noget, man skal spøge med.

Samtidig ændrer vi lidt på kontinuiteten ved faktisk først at forsøge at købe de første to liter mælk, efter vi har vurderet værdien af udsagnet “æg”. Vi kan komme lidt tættere på intentionen i vittigheden ved at bytte rundt og implementere indkøbsturen objektorienteret således:

Eller:

Vi er altså ude i nogle helt specielle forudsætninger for koden bag en supermarkedstur for at opnå det samme resultat, hvor programmøren fortolker kravspecifikationen ud over det udtalte.

Paradokset er derfor, at netop dén type programmør, som vittigheden handler om, aldrig ville begå fejlen, men derimod returnere en fejlmeddelelse til sin kone.

Skarpsindige læsere vil nok fra begyndelsen have indvendt, at hele øvelsen er forgæves. Dét, der i virkeligheden ville være sket var, at programmøren forsvandt i nogle timer, hvorefter han var vendt tomhændet tilbage efter lukketid.

Alt sammen på grund af den allerførste instruks fra konen:

Posted in computer.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>