Archive for the ‘Microsoft’ Category

Tabt i detaljerne

Tuesday, September 7th, 2010

Sådan vasker Microsoft hænderHosstående opslag hænger på herretoilettet hos Microsoft i Hellerup. Det er en detaljeret, illustreret gennemgang af, hvordan man vasker hænder. Hvis vi ser bort fra den reelle risiko for en TL;DR-reaktion, må den minutiøse beskrivelse være tilstrækkelig til at tilgodese selv den mest nidkære bureaukrats behov for information, og ingen skulle således være i tvivl om, hvordan man vasker hænder i Hellerup.

Opslaget er mere underholdende end gavnligt i mine øjne, men det er desværre også et billede på den kode, de fleste af os til tider skriver. Jeg har læst og skrevet masser af kode, der i detaljeringniveau kan måle sig med ovenstående. Jo tættere vi kommer på metallet, desto tyndere bliver vores abstraktioner, og dermed bliver vi nødt til at redegøre for flere detaljer.

Vi kan således ikke helt undgå denne problematik, men jo mere vi kan styre uden om den slags desto bedre.

Problemet er, at det kan være svært at se, hvad målet er. Vi har specificeret, hvad der skal gøres, men det kan være svært at se, hvad det egentlig er, vi gerne vil opnå, og dermed kan det være svært at sige noget konkret om implementeringen. Fungerer den efter hensigten? Er der bivirkninger? Kan den optimeres om nødvendig? Kan den paralleliseres?

Hvad er formålet med instruktionerne i opslaget? Eller sagt på en anden måde: Hvad er det ønskede slutresultat, hvis vi følger proceduren? Er det rene hænder, reduktion af sæbebeholdning eller en sindrig form for håndaerobics i vand? Er det, vi ønsker at opnå, blot en delmængde af det samlede resultat? Hvordan skelner vi i så fald mellem de nødvendige og overflødige trin i processen for at opnå det ønskede?

Det kan være svært at adressere disse spørgsmål, da svarene ligger gemt i detaljerne.

Lad os se på et eksempel mere. Betragt følgende kode.

var numbers1 = new[] { 2, 4, 6, 7, 8, 9 };
var numbers2 = new[] { 1, 2, 3, 4, 5, 6, 9 };
var numbers3 = new[] { 1, 5, 7, 9 };

var result = new List<int>();

foreach (var n1 in numbers1) {
   foreach (var n2 in numbers2) {
      if (n1 == n2) {
         bool found = false;
         foreach (var n3 in numbers3) {
            found |= n2 == n3;
         }
         if (!found) {
            result.Add(n2);
         }
         break;
      }
   }
}

Hvad laver ovenstående? Med mindre man har set konstruktionen et utal af gange, skal de fleste af os nok lige tænke en gang eller to for at gennemskue, hvad formålet med koden er. Problemet er, at der er mange detaljer, så vi er næsten tvunget til at løbe et lille eksempel igennem, før vi kan gennemskue resultatet af koden. Det er ikke et stort problem, men vi skal bruge flere ressourcer på at forstå koden, end vi behøver.

Der er andre nærliggende spørgsmål, der ligeledes kan være svære at svare på her: Kan vi optimere koden, hvis behovet opstår? Hvor mange uafhængige operationer er der i koden? Kan disse paralleliseres?

Som du sikkert har gennemskuet, er indholdet af result alle de elementer, der er i både numbers1 og numbers2, men ikke i numbers3.

Det lugter lidt af mængdeoperationer, og med den erkendelse kan vi pludselig tale om problemet i domænespecifikke termer. Vi kan tilmed omskrive koden til at bruge .NETs mængdeoperationer. Ovenstående kan således udtrykkes som:

result = numbers1.Intersect(numbers2).Except(numbers3).ToList();

Vi kan selvfølgelig glæde os over, at dette er meget kortere, men det er kun en af gevinsterne her. Ved at bruge domænespecifikke abstraktioner kan vi kommunikere i et sprog, der giver mening i forhold til problemet, og vi er fri for at bekymre os om, hvad der skal til for at opnå det ønskede resultat. Vores kode er således mere deklarativ. Vi specificerer, hvad vi vil have, fremfor hvordan vi vil finde frem til resultatet i et sprog, der relaterer til vores problemdomæne.

Vi kan også let identificere antallet af nødvendige operationer, og derved har vi bedre mulighed for at identificere overflødige trin. I og med at vi arbejder med abstraktioner, er det derimod svært at sige noget om hvorvidt disse er implementeret optimalt, men med mindre vores målinger viser, at koden ikke kører optimalt, er vi sikkert bedre tjent med at bruge kode, der er testet og dokumenteret fremfor vores egen hjemmebryggede kode.

Hvis vi forestiller os, at result i stedet repræsenterer listen af kunder, der skal have et specielt tilbud. Således kunne numbers1 repræsentere de kunder, der interesserer sig for hi-fi, numbers2 kunne være listen af kunder, der interesserer sig for vvs-artikler, og numbers3 kunne holde styr på de kunder, der ikke har betalt til tiden. I så fald kunne vi bruge vores mængdeoperationer til at sende brev til relevante kunder omkring et nyt spabad med surround sound (hvis det ikke findes, skal det nok komme).

Koden ville essentielt være den samme, men den nuværende navngivning er helt i skoven. Koden taler om tal og mængder, og vi har således ingen forbindelse mellem koden og domænet. Så selvom .NET tilbyder os de nødvendige operationer, ville vi med fordel kunne indkapsle mængdeoperationerne i en eller flere metoder, hvis navne kan bygge bro til domænet.

Så hvad er lektien her?

Undgå udpenslende kode. Se om problemet kan udtrykkes på en måde, så vi kan bruge eksisterende funktionalitet. Hvis det ikke er tilfældet, så skab de nødvendige abstraktioner. I begge tilfælde bør abstraktioner navngives (evt. indpakkes) i konstruktioner, der giver mening i problemdomænet.

Følger vi disse trin, får vi kode, der er lettere at læse. Vi får muligvis mere kode, men hver del bliver kort, præcis og formuleret i et sprog, der passer til problemet. Vi får lettere ved at ræsonnere om kodens egenskaber, da den er lettere at overskue. Kode, der er let at forstå, er også lettere at vedligeholde og udvide.

Abstraktioner som typer og metoder er blandt af de vigtigste værktøjer i vores værktøjskasse, fordi de giver os mulighed for at opsplitte kompleksitet i overkommelige størrelser og navngive disse i et sprog, der afspejler vores problemdomæne. Brug dem!

Microsoft MVP Award 2010

Thursday, July 1st, 2010

Microsoft MVPFor 3. gang i træk kan jeg sole mig lidt i indforstået, nørdet verdensberømmelse, idet jeg netop har fået besked om, at jeg har modtaget Microsofts MVP Award for 2010. Men selvom jeg har prøvet det før, er jeg alstå ikke mindre stolt af den grund.

ANUG Visual Studio 2010 Launch Event

Friday, May 21st, 2010

Jeg tog en fridag fra min ferie i går og tilbragte dagen i selskab med over 200 andre .NET-entusiaster til ANUGs Visual Studio 2010 Launch Event i Århus. Det var en rigtig god dag med masser af interessant indhold på programmet og god mulighed for networking.

Jeg holdt en lettere reduceret udgave af min Nyheder i C# 4 Tech Talk. Det gik stærkt, da jeg kun havde 45 minutter, men jeg har fået mange positive tilbagemeldinger, så det gik åbenbart ganske fint.

Dagens bedste indlæg var efter min mening Rasmus Kromann-Larsens introduktion til Resharper 5. Demoerne var velvalgte, lærerige og ikke mindst underholdende. Rasmus udviste godt overblik og præsentationen forløb rigtig godt.

Jeg synes også, at Rasmus Wulff Jensens indlæg om nyheder i Visual Studio 2010 fortjener at blive fremhævet. Han havde ligeledes godt styr på materialet, kom fint rundt i nyhederne og havde gode eksempler til at illustrere det hele med.

Dagens største skuffelse var desværre det indlæg, jeg havde set mest frem til. Carsten Juel Andersens indlæg om Task Parallel Library var desværre noget rodet, og der var for mange unøjagtigheder til min smag. Eksempler var fint præsenteret, men desværre ikke alle lige velvalgte. Pointen med en thread safe collection er jo ikke, at man kan gennemløbe den, samtidig med at man modificerer den. Og så er thread safe altså noget man ligesom graviditet enten er eller ikke er. Man kan altså ikke være hverken 30% gravid eller delvis thread safe.

Det ændrer dog ikke ved, at arrangementet som helhed var glimrende og udførelsen i top. Jeg havde tilmed fornøjelsen at spise aftensmad med et par af arrangørerne og de andre taler, hvilket var en god afslutning på en udbytterig dag.

Stor tak til ANUG og de mange fremmødte.

Der er yderligere indtryk fra dagen på ANUGs hjemmeside.

Slides og kode fra TechTalk: Nyheder i C# 4

Thursday, April 22nd, 2010

Jeg har lagt mine slides og eksempler fra gårdagens TechTalk om C# 4 til download. Kommentarer modtages gerne.

ANUG VS2010 Launch EventJeg holder desuden en lignende præsentation i forbindelse med ANUGs Visual Studio 2010 Launch Event. Det er et heldagsarrangement med masser af spændende emner. Deltagelse er gratis og tilmelding foregår her. Håber vi ses!

TechTalk: Nyheder i C# 4

Monday, March 15th, 2010

Jeg afholder TechTalk om nyhederne i C# 4 den 21. april. Det foregår hos Microsoft, og du kan tilmelde dig her.

Smid gerne en kommentar hvis du kommer, så jeg ved, hvem jeg skal kigge efter. Håber vi ses!

Kodehoved på spansk

Tuesday, February 9th, 2010

Der er næppe mange af jer, der vil få glæde af følgende servicemeddelelse, men det er jo ikke hver dag, at man sådan får lov at være verdensberømt for en dag, så derfor vil jeg lige gøre opmærksom på, at februarnummeret af det spanske magasin, dotNetMania, har et langt interview med Tess Ferrandez, hendes kollega Finbar Ryan og undertegnede. Artiklen er en spansk oversættelse af et videointerview om debugging, vi lavede på TechEd i Berlin sidste år. Jeg håber, at videoen også bliver tilgængelig på et tidspunkt, og jeg skal nok smide et link, hvis det skulle blive aktuelt. Indtil da står den på spansk debugging. God fornøjelse!

dotNetMania

Kodegolf: Resultater og vinderne

Monday, November 23rd, 2009

Jeg er imponeret! Ikke alene modtog jeg hele 24 bidrag i konkurrencen, men flere af jer sendte også adskillige forsøg, og der var rigtig mange gode forslag imellem de indkomne svar. Tak for det.

Jeg har modtaget bidrag fra: Jacob Eisenberg, Kristian Vinther, Mark Seemann, Jan Jensen, Janus Egholm, Claus Christensen, Christian Rysgaard, Morten Gejl, Mads Mau Pedersen, ”lajensen”, Dennis Riis, Søren Larsen, Troels Thomsen, Jakob Gade, Carsten Hess, Hakon Baunsgaard, Jacob Tjørnholm, Rune Juhl-Petersen, David Thomas, Allan Thraen, Jesper Harder, Mads Hedegaard, Mads Lützhøft og Niels Rasmussen.

Tusind tak fordi I ville være med.

Ifølge mit optællingsscript ser resultaterne ud som følger.

129 : Hakon Baunsgaard
129 : Jesper Harder
129 : ”lajensen”
129 : Mads Mau Pedersen
129 : Troels Thomsen
132 : Kristian Vinther
137 : Mads Hedegaard
138 : Christian Rysgaard
139 : Niels Rasmussen
141 : Morten Gejl
144 : Jacob Tjørnholm
149 : Jan Jensen
149 : Rune Juhl-Petersen
150 : Søren Larsen
151 : Dennis Riis
152 : Carsten Hess
152 : Jacob Eisenberg
164 : Claus Christensen
168 : Mads Lützhøft
177 : David Thomas
196 : Janus Egholm
228 : Jakob Gade
281 : Allan Thraen
348 : Mark Seemann

Det vil sige, at der ikke er en, men ikke mindre end fem vindere! Tillykke til Hakon Baunsgaard, Jesper Harder, ”lajensen”, Mads Mau Pedersen og Troels Thomsen.

129 tegn er altså godt gået.

Jeg har talt med Microsoft, og jeg har fået lov at indløse min trøstepræmie for fire yderligere præmier, så det betyder, at alle vinderne får en præmie. Stort tillykke til vinderne!

Jeg har lavet en zip-fil med alle besvarelserne, så I kan nyde de andres påfund, men her kommer lige en tilfældig udvalgt blandt de fem vindere.

namespace Kodegolf {
    class MMP {
        public static void MAIN() {
            for (int t = 0; ++t < 66; )
                System.Console.WriteLine(t < 65 ? t + ":" + (1ul << t - 1) : "=" + ~0ul);
        }
    }
}

Læg desuden mærke til hvordan flere af vinderne for alle praktiske formål er nået frem til den samme løsning. Det er åbenbart måden at løse denne opgave.

Jeg er imponeret over, at fem personer kom frem til en løsning med så få anslag, og jeg er ligeledes imponeret over det meget tætte løb mellem deltagerne. Hatten af for jer, tak til jer alle sammen fordi I ville være med og endnu en gang tillykke til vinderne!