Om de context even scherp te zetten doe ik even de volgende aannames over de "reviewer" en de "knoeier" programmeur:
* Beide programmeurs werken aan hetzelfde product.
* De reviewer weet wat de doelstellingen van het product zijn.
* De reviewer heeft voldoende context informatie om een stuk code te kunnen begrijpen.
In dit geval denk ik wel degelijk dat een reviewer code zou kunnen herschrijven voor een "brakke collega". Het is de vraag of dit gewenst is.
Ten eerste: welke code review je? Kijk je alle code door van anderen? Waarom doe je dat? Heb je tijd over of vertrouw je het resultaat van anderen niet? Ik zou zelf liever niet hebben dat het hele programmeerteam continu elkaars werk zit te controleren. Dit kost heel veel tijd, levert een vreemde sfeer op en vereist dat het volledige team van alle ins en outs op de hoogte blijft.
Ten tweede: waarom schrijf je zelf de code opnieuw? Heeft de brakke collega hier geen tijd voor? Denk je dat je hem niet kunt uitleggen/overtuigen waarom iets beter anders kan? Waarom niet? Waarschijnlijk heb je een veel groter probleem dan een lapje rotte code als je niet in overleg mensen zelfstandig dit kunt laten oplossen.
Code kan wel degelijk slecht zijn zonder dat het "bugs" bevat in de normale zin van het woord. Een bug betekent normaliter dat de gecompileerde functionaliteit van de code een ander resultaat oplevert dan gewenst is. Code kan rare namen, onvoldoende commentaar, rare structuren bevatten en onvoldoende (robuust) performen, zonder dat het meteen leidt tot een nieuwe entry in de bug database. Met een code review kun je veel fouten vinden die tijdens het testen heel moeilijk zijn op te sporen: zoals foutafhandeling in bijzondere situaties, rare kronkels in code branches die 98% van de tijd goed gaan, en memory leaks die zich pas na een week manifesteren. De code op thedailywtf is wat dat betreft een prima voorbeeld: het is vaak productiecode dat doet wat het moet doen, maar wel op een manier dat je denkt: "grote grutjes".
Een goed ontwerp beschermt je niet tegen veel van dit soort fouten, omdat het ontwerp typisch slechts een abstracte beschrijving van de oplossing is. Een goed ontwerp wil dit niet eens, omdat het anders de eenvoud, flexibiliteit en abstractie zou verliezen die je juist nodig hebt om een goede overview te hebben. Binnen de kaders die een ontwerp biedt is er dus nog steeds veel ruimte voor de brakke collega om te prutsen in de code.
Bovendien kan een ontwerp ook natuurlijk gewoon overtreden worden. Dat is ook niet altijd fout, want soms zie je een probleem in het ontwerp pas als je het implementeert in code. In dit geval moet de programmeur wel zorgen dat het ontwerp zo snel mogelijk wordt bijgesteld, en niet te review af te wachten. Het is echter zeker zo dat een ontwerp net zo goed "slecht opgezet" kan zijn als code, en net zo min een heilige status verdient. Programmeurs zouden zeker het ontwerp ter discussie moeten (kunnen) stellen als ze vinden dat dit een goede implementatie in de weg staat.
De reviews die ik doe worden ondersteund door standaards en richtlijnen, algemene afspraken,het ontwerp en mijn eigen ervaring. Voor ieder probleem wat ik tijdens reviews aangeef heb ik een concrete argumentatie, ik geef aan wat er niet goed is, wat de risico's zijn als het zo blijft, en wat er zou kunnen gebeuren om het op te lossen. Dat is geen subjectieve mening, maar een objectieve analyse van de code. Over subjectieve dingen neuzelen als de curly brace op een nieuwe regel of het gebruik van ternaire operators vind ik ook zonde van de tijd, maar het is zeker niet zo dat per definitie iedere opmerking op een stuk code gebaseerd is op een subjectieve mening.
Het is volgens mij niet zo dat je in een project een situatie moet hebben van JOUW code en MIJN code, of JOUW bugs en MIJN bugs, maar ONZE code en ONZE bugs. Het hebben van goede code is een belang van het hele team, en je moet als team ook samenwerken en elkaar helpen om dat belang goed te dienen.
Elkaars code opnieuw schrijven is een uiterste maatregel die ik alleen doe als ik al geprobeerd heb het iemand anders zelf aan te laten passen, niet omdat het ZIJN code is, maar omdat ik normaal geen tijd om het werk van iemand anders over te doen. Bovendien is het opnieuw het belang van het team dat mensen van elkaar leren zodat ze niet steeds dezelfde fouten maken. Ik wil niet dat mensen leren dat als ze gaan prutsen misfire het wel even op komt lossen.