När du läser detta är jag åter på jobbet, men jag skriver under de sista skälvande timmarna på sommarsemestern. Tidigare i dag var jag ute på en joggingrunda. Tankarna vandrade som vanligt fritt mellan roliga saker och problem att lösa, men jag noterade att jag gång efter gång missade att höra vad Runkeeper berättade för mig var femte minut om fart och puls. Jag kan inte påminna mig att jag brukar missa det en enda gång. Konstigt. Kan det vara så att semestern gjort mig superavslappnad och svåravbruten? Det är säkert bra.

Hur som helst, en av sakerna jag tänkte på är hur laddade vissa ord är i antingen negativ eller positiv riktning. Ta till exempel ordet bieffekt, som är kraftigt negativt laddat för många utvecklare.

Inom funktionell programmering påtalas ofta vikten av att undvika bieffekter. Man undviker det genom att inte göra tillståndsändringar, alltså modifiera data. Tack vare detta blir det enklare och mindre farligt att sätta samman sitt program av mindre delar i flera led utan att veta exakt hur varje del i sig är gjord. Eftersom de inte modifierar data så har de inga bieffekter.

Den stilen av programmering kan med fördel användas även i objektorienterade språk. Man låter objekt vara icke muterbara och att dess metoder levererar sitt svar i form av nya icke muterbara objekt. Det fordrar mer disciplin från programmeraren, men samma effekt kan uppnås även där.

Ordet bieffekt har en negativ klang för mig, men som vanligt så är det viktigt att komma ihåg att det är kontexten som styr vad som är bra och vad som är dåligt. I ett system som jag arbetade med att renovera blev det tydligt.

Renoveringen delade upp systemet i tre mindre delsystem (låt oss kalla dem A, B och C) med strikta gränser och satte till att börja med allt fokus på att renovera ett av de tre delsystemen (nämligen A).

Bland annat fick det renoverade delsystemet A en bättre lämpad modell. Likaså gjordes lagringen om helt. Tidigare lagrades en stor del av data för både A och B i samma struktur, men all data för det renoverade delsystemet lyftes alltså bort till en ny struktur och lösning. Över 99 procent av den datamängd, som tidigare fanns för A och B tillsammans, tillhörde A.

I efterhand är det inte så förvånande (det gäller allt som oftast att saker och ting blir bättre om man tar bort) men utan att ändra någonting för B så gick plötsligt en stor del av databasinteraktionen för B mycket snabbare som en ren bieffekt.

Troligen var det tidigare så att databasens optimerare ganska ofta bestämde sig för att traska genom allt data snarare än att läsa via index och nu när det bara var en bråkdel så mycket data kvar så gick det snabbt. Det kunde förstås lösts när vi satte i gång med att arbeta på delsystem B, men poängen är att nu fick vi den positiva effekten automatiskt och utan att ens försöka. Alltså, alla bieffekter gör inte ont!