Code-Reviews erfordern Lesen
(hauleth.dev)- Code-Reviews sind kein formaler Prozess vor dem Deployment, sondern ein Vorgang, der die Verantwortung für Ausfälle, Sicherheitsprobleme und Datenlöschungen von einer einzelnen Person auf Teamverantwortung verlagert
- Bessere Evals, Tests, Feature-Flags, Guardrails und Observability können Antworten sein, um die Unsicherheit beim Deployment ungelesenen Codes zu verringern, werden hier aber dafür kritisiert, am Ziel der Verantwortungsverteilung von Reviews vorbeizugehen
- Die Forderung, ohne Lesen zu genehmigen, sei so, als würde man Menschen dazu bringen, gedankenlos einen Button zu drücken; daraus entsteht die satirische Idee der Button Roulette, bei der ein zufälliger PR mit komplett grünem CI gemergt wird
- Code-Reviews sorgen dafür, dass Teammitglieder verschiedene Teile einer großen Codebase sehen, senken so den Bus-Faktor und dienen neuen Teammitgliedern als Lerninstrument für Code und Code-Kultur
- Wer verlangt, ungelesenen Code in Produktion zu deployen, müsse eine schriftliche Haftungsfreistellung für Bugs, Sicherheitsprobleme, Downtime usw. geben; genau daran scheitere es meist, so das Fazit
Der Zweck von Reviews ist Verantwortungsverteilung, nicht Genehmigung
- Ausgangspunkt ist die Frage aus Charity Majors’ Artikel “AI enthusiasts are in a race against time, AI skeptics are in a race against entropy”: „Was wäre nötig, damit man sich wohlfühlt, ungelesenen Code in die Produktion zu deployen?“
- Antworten wie bessere Evals, Tests, Feature-Flags, Guardrails, Observability, Entkopplung von Abhängigkeiten, Verkleinerung des Blast Radius oder der Einstieg mit kleinen Änderungen außerhalb kritischer Pfade werden als Antworten behandelt, die am Kern von Reviews vorbeigehen
- Der Zweck von Reviews besteht darin, die Last für Ausfälle, Sicherheitsprobleme und versehentliche Datenlöschungen nicht bei einer einzelnen Person zu belassen, sondern sie als Teamverantwortung auf Autor und Reviewer zu verteilen
- Wenn man „ohne Lesen genehmigen“ verlange, gebe es kaum noch einen Grund, Menschen überhaupt noch manuell Buttons drücken zu lassen; daraus entsteht die Satire
button roulette, bei der einer der zugewiesenen PRs mit komplett grünem CI zufällig gemergt wird
Was beim ungelesenen Review verloren geht
- Code-Reviews zwingen Teammitglieder dazu, andere Teile der Codebase zu sehen, und gleichen so die Grenze aus, dass in zu großen Systemen niemand dauerhaft alle Teile kennen kann
- Der Review-Prozess senkt den Bus-Faktor und hilft mehreren Mitgliedern des Teams, sich stärker mit Codebase und Code-Kultur vertraut zu machen
- Wenn alle nur noch ungelesen genehmigen, geht dieser Lerneffekt verloren; zudem steigt der Bus-Faktor auf 1 und es entsteht zusätzlich das Problem der Auslagerung an Dritte
- Akzeptieren ließe sich die Forderung, ungelesenen Code in die Produktion zu deployen, nur dann, wenn die Person, die diese Anweisung gibt, eine schriftliche Haftungsfreistellung für Bugs, Sicherheitsprobleme, Downtime usw. bereitstellt
1 Kommentare
Lobste.rs-Meinungen
Ich habe eine starke Abneigung gegen die Behauptung, der Zweck von Reviews sei die Verteilung von Verantwortung
Wenn in
maingemergter Code die Produktion kaputtmacht, dann ist das die Verantwortung des Autors, nicht meine oder die des gesamten TeamsEs ist Arbeit mit der eigenen Unterschrift als Fachkraft, und wenn ein Brückenentwurf mit dem Stempel eines Bauingenieurs mit P.E.-Lizenz Menschen tötet, dann ist auch das dessen eigene Arbeit und Verantwortung
Die Verantwortung des Teams liegt als Entwickler und Verwalter der Codebasis darin, zu verhindern, dass irgendjemandes Code die Produktion kaputtmachen kann
maingemergter Code, der die Produktion kaputtmacht, reine Einzelverantwortung sei, nicht für eine gesunde KulturEin Merge nach
mainbedeutet, dass jemand ihn reviewt, die Änderungen geprüft, das Design diskutiert, mehrfach überarbeitet und dann genehmigt hatNiemand baut den Eiffelturm allein, und wenn man im Arbeitsumfeld Einzelpersonen die Schuld zuschiebt, erzeugt das nur Groll und eine toxische Kultur
Wenn es ein wiederkehrendes Verhaltensmuster ist, dann ist das ein Thema für HR
Wenn die Verantwortung 0 ist, sind Reviewer nutzlos, und es gibt keinen Grund, überhaupt Reviews zu machen
Die Verteilung von Verantwortung ist eher ein Ergebnis; der eigentliche Zweck ist, Fehler zu finden, die man allein leicht übersieht, zu zweit oder mit mehr Personen aber schwerer verpasst
Allerdings werden Reviews in der Softwareentwicklung übermäßig eingesetzt, und ich glaube nicht, dass Reviews ein Ersatz für Engineering sein können
Ich halte es nicht für präzise, „freigeben, ohne den Code zu lesen“ mit „gedankenlos freigeben“ gleichzusetzen
Was wäre zum Beispiel, wenn an einem Programm ein Korrektheitsbeweis hängt, man im PR Definitionen und Theoreme lesen kann, CI mit deterministischen Werkzeugen prüft, dass Programm und Beweis zusammenpassen, auch nichtfunktionale Anforderungen wie Kontrastverhältnis, Performance-Benchmarks und Tail-Latenz testet und sich UI-Änderungen über einen Prototyp leicht ausprobieren lassen?
Selbst in so einer Welt ist fraglich, ob man weiterhin so besessen davon sein müsste, den Code Zeile für Zeile zu lesen wie heute
Schon heute überprüft beim Schreiben von SQL kaum jemand jedes Mal im Detail, ob der Query-Plan exakt dem Gewünschten entspricht
Der Originalbeitrag liest sich für mich eher wie: „Lasst uns eine ideale Welt definieren, in der man das Gefühl haben kann, auch ohne den Code buchstäblich zu lesen deployen zu dürfen“, und dann: „Wie können wir uns sanft von der Gegenwart in diese Welt bewegen?“
Man kann darüber streiten, wie weit die Branche oder ein bestimmtes Unternehmen bzw. eine bestimmte Codebasis von diesem Punkt entfernt ist, aber wenn man sich diese ideale Welt ernsthaft vorstellt, fallen den meisten vermutlich einige Kriterien dafür ein
Ich verstehe, dass man es wegen der aktuellen Branchenstimmung als „gedankenlos“ auffasst, aber ich glaube nicht, dass Charitys Text genau das meint
Das ist nur möglich, wenn man den Code liest, egal wie gut die Tests sind
Wenn Alice Code einbringt, Bob ihn reviewt und Alice dann in Urlaub geht, sollte Bob diesen Teil gut genug kennen und sich ausreichend verantwortlich fühlen, um ihn zu ändern oder neue Features hinzuzufügen
Wenn Bob nur den Korrektheitsbeweis abstempelt, ist er später nicht darauf vorbereitet, mit dieser Codebasis zu arbeiten
Wenn die Beteiligung am Commit-Prozess weder Wissen noch ein Gefühl von Besitzverantwortung vergrößert hat, dann war es im Grunde keine echte Beteiligung
Der Compiler ist allerdings deterministisch, während ein LLM ein nichtdeterministisches Werkzeug ist, das potenziell fragwürdige Tests erzeugt
Wir haben bereits Programme, die von Menschen geschriebene Anweisungen oder Code in maschinenlesbaren Code oder eine Zwischenrepräsentation umwandeln, und weil sie garantieren, in welcher Beziehung das erzeugte Ergebnis zur Eingabe steht, kann man den Ausgaben vertrauen, ohne sie eigens prüfen zu müssen
Für Optimierungen liest man Compiler-Ausgaben manchmal mit Werkzeugen wie Godbolt, aber darüber hinaus ist das im Allgemeinen nicht nötig
Wenn man das auf einer anderen, nichtdeterministischen Abstraktionsebene versucht, mag es plausibel wirken, aber es ahmt nur die Korrektheitsgarantien nach, die Compiler liefern, und wird am Ende scheitern
Ich halte die LLM-Debatte grundlegender für ein Symptom des Problems, dass bestehende deterministische Programmiersprachen nicht ausdrucksstark genug und ihre Werkzeuge nicht effektiv genug sind
Es kann sich anfühlen, als würden LLMs dieses Problem lösen, aber sie sind in Wirklichkeit keine Lösung, sondern legen nur noch eine weitere indirekte Schicht und zusätzliche Performance-Kosten auf ein ohnehin zu eingeschränktes Fundament
Eher wie ein teurer, fehleranfälliger Pseudo-Compiler, der auf einem Interpreter läuft, der wiederum auf kompilierter Maschinensprache läuft
Deshalb halte ich das für eine technische Sackgasse
Für Unternehmen mag es ein Weg zu kurzfristigen Gewinnen sein, aber ich glaube nicht, dass es Software oder die Beziehung von Menschen zum Nutzen und Erstellen von Software verbessern wird
Software ist mehr als nur Technik, um ein Produkt auszuliefern
Es hilft, nach Anwendungsfall zu unterscheiden
Wenn es nur darum geht, neues JavaScript für die UI einer internen Anwendung hochzuladen, dann muss man meiner Meinung nach nicht unbedingt auch noch das CSS im Detail durchsehen