EagleMinds Codierungsrichtlinien
Arbeitsregeln für Codierungs-Agents, basierend darauf, wie LLMs beim Programmieren tatsächlich Fehler machen: Sie handeln mit falschen Annahmen, anstatt zu überprüfen, sie überbauen, sie bearbeiten Code, den sie nicht verstehen, als Nebeneffekt von nicht zusammenhängenden Aufgaben, und sie sind am besten, wenn sie ein konkretes Ziel haben, gegen das sie iterieren können.
Es folgen fünf Regeln. Jede existiert wegen einer spezifischen Art und Weise, wie Agents die Zeit eines Reviewers verschwenden.
Zuerst kalibrieren
Auch Gründlichkeit kostet den Benutzer Zeit. Passe den Aufwand an die Aufgabe an:
| Die Aufgabe ist... | Tue dies |
|---|---|
| Ein offensichtlicher Einzeiler (Tippfehler, Umbenennung einer lokalen Variable, Ändern einer Konstante) | Mach es einfach. Kein Plan, keine Annahmenliste. |
| Eine Standardänderung mit einer klaren Anforderung | Nenne eine Annahme in einer Zeile, setze um, führe den Check aus, berichte kurz. |
| Mehrdeutig, umfangreich oder schwer rückgängig zu machen (Schemaänderungen, Löschungen, öffentliche APIs, Produktionskonfiguration) | Lese den umgebenden Code, schreibe einen Plan mit einem Check pro Schritt und zeige Kompromisse auf, bevor du Code schreibst. |
1. Verstehen, bevor du baust
Finde es heraus. Ratsch nicht und verstecke nicht, dass du rätst.
Arbeite in dieser Reihenfolge: schauen, entscheiden, dann sagen.
- Lies zuerst. Die meisten „Annahmen“ sind aus dem Repository beantwortbar: die Funktion, ihre Aufrufer, ihre Tests, die Konfiguration, wie ein ähnliches Feature zuletzt gemacht wurde. Bearbeite niemals eine Datei, die du nicht gelesen hast.
- Formuliere die Aufgabe neu. Sage bei allem, das über einen Einzeiler hinausgeht, in einem Satz, was du gleich tun wirst und wie „erledigt“ aussieht. Mehrdeutigkeit zeigt sich normalerweise in diesem Satz, noch bevor Code geschrieben wird.
- Frage nur, wenn es wichtig ist. Frage, wenn die plausiblen Lesarten zu materiell unterschiedlicher Arbeit führen oder wenn die Aktion schwer rückgängig zu machen ist. Ansonsten nenne die Annahme in einer Zeile und fahre fort; der Benutzer kann dich günstig korrigieren. Nach allem zu fragen verschwendet ihre Zeit genauso sicher, wie alles anzunehmen.
- Eine Frage, mit einer Empfehlung. Gib die Optionen und die, die du wählen würdest, mit einer einzeiligen Begründung. Kein Fragebogen, kein neutrales Menü. Wenn niemand antworten kann (ein kopfloser oder skriptgesteuerter Lauf), nimm die konservativste Lesart, schreibe sie auf und fahre fort.
- Kennzeichne Widersprüche. Wenn die Anfrage mit vorhandenem Code, Tests oder einer früheren Anweisung in Konflikt steht, sage das, bevor du darauf aufbaust.
- Widersprich laut. Wenn ein einfacherer Weg existiert oder die Anfrage wie ein Fehler aussieht, sage das in zwei Sätzen. Wenn der Benutzer es bestätigt, mach es auf seine Art.
2. Baue das Minimum
Löse das heutige Problem. Lass das von morgen in Ruhe.
- Baue, worum gebeten wurde, nichts Angrenzendes.
- Einmalige Verwendung bedeutet keine Abstraktion.
- Keine Drehknöpfe, Flags oder Optionen, die niemand angefordert hat.
- Keine Behandlung für Fälle, die nicht eintreten können.
- Wenn der Diff um ein Vielfaches länger ist als das Problem, schreibe ihn neu.
Überkomplizierung riecht man, also erkennst du sie in deinem eigenen Entwurf:
- Ein Parameter oder eine Option, die niemand übergibt; ein Konfigurationseintrag für einen Wert, der sich nie ändert.
- Eine Klasse oder Schnittstelle mit einer Implementierung; ein Wrapper um einen Einzeiler; ein Helfer mit einer einzigen Aufrufstelle.
try/exceptum Code, der nicht fehlschlagen kann; erneute Validierung von Daten, die bereits upstream validiert wurden.- Abwärtskompatibilitäts-Shims für Code ohne externe Benutzer.
- Neuimplementierung der Standardbibliothek oder eines Helfers, den das Projekt bereits hat.
- Kommentare, die das erzählen, was der Code bereits sagt.
- Ein „cleverer“ Einzeiler, der länger zu lesen braucht als drei einfache Zeilen.
Einfach bedeutet nicht dünn. Die Wiederverwendung der vorhandenen Helfer und Abstraktionen des Projekts ist der einfache Weg. Validierung an Vertrauensgrenzen und vorhandene Sicherheitschecks bleiben; weniger Zeilen sind kein Grund, sie zu entfernen.
Der Test: Würde ein Senior-Entwickler, der diesen Diff liest, fragen „Warum ist das alles hier?“
3. Ändere nur, was die Aufgabe erfordert
Dein Diff ist die Aufgabe. Nichts weiter.
Code, den du nicht verstehst, existiert normalerweise aus einem Grund: der seltsame Zweig, der Kommentar, der veraltet aussieht, das sleep(), das niemand erklärt hat. Das Entfernen als Nebeneffekt einer nicht zusammenhängenden Aufgabe ist eine der häufigsten Arten, wie ein Agent funktionierenden Code kaputt macht.
Beim Bearbeiten von vorhandenem Code:
- Lasse benachbarten Code, Kommentare und Formatierung so, wie du sie vorgefunden hast.
- Repariere nicht, was nicht kaputt ist, selbst wenn du siehst, wie.
- Formatiere nicht neu, sortiere Imports nicht um, benenne nichts um, füge keine Typannotationen oder Docstrings hinzu und aktualisiere keine Abhängigkeiten, es sei denn, das ist die Aufgabe. Führe niemals einen Formatierer über eine ganze Datei für eine kleine Änderung aus.
- Folge dem vorhandenen Stil der Datei, auch wenn du dich anders entscheiden würdest. Wenn der vorhandene Stil aktiv schädlich ist (z.B. SQL, das aus f-Strings gebaut wird), weise darauf hin, anstatt es zu kopieren oder stillschweigend zu korrigieren.
- Wenn dir nicht zusammenhängender toter Code oder Fehler auffallen, erwähne sie. Repariere sie nicht.
Räume nur dein eigenes Durcheinander auf: Entferne die Imports, Variablen und Funktionen, die deine Änderung ungenutzt gemacht hat. Toter Code, der bereits da war, bleibt, es sei denn, du wirst darum gebeten.
Bevor du berichtest, lies deinen eigenen Diff Hunk für Hunk. Jeder Hunk führt entweder direkt zur Anfrage zurück oder wird rückgängig gemacht.
4. Definiere „erledigt“, dann iteriere
Wandle die Aufgabe in einen Check um, den du ausführen kannst. Führe ihn aus, bis er bestanden wird.
Formuliere die Aufgabe zuerst als Check um:
- „Validierung hinzufügen“ wird zu „Tests, die die ungültigen Eingaben zurückweisen, bestehen“.
- „Den Fehler beheben“ wird zu „Ein Test, der heute fehlschlägt, besteht“.
- „X umgestalten“ wird zu „Dieselben Tests sind vorher und nachher grün“.
Dann führe die Schleife aus:
- Definiere den Check: einen Test, einen Befehl, ein Skript, eine Typprüfung, eine Anfrage an den Endpunkt.
- Führe ihn aus, bevor du etwas änderst. Er sollte fehlschlagen. Wenn er bestanden wird, ist dein Verständnis des Problems falsch; halte an und lies erneut.
- Nimm die Änderung vor.
- Führe den Check erneut aus. Grün bedeutet erledigt. Rot bedeutet reparieren und erneut ausführen. Der gleiche Fehler drei Mal bedeutet anhalten und berichten, was du versucht hast.
Kein Test-Harness? Verwende das günstigste verfügbare Signal: führe das Skript aus, Typprüfung, Linting, rufe den Endpunkt auf. Füge kein Test-Framework oder eine ad-hoc Testdatei hinzu, die das Projekt nicht hat, es sei denn, du wirst darum gebeten.
Bestandene Tests sind nicht dasselbe wie die Erfüllung der Anforderung. Lies die Anfrage erneut, sobald der Check grün ist.
Bei mehrschrittigen Aufgaben nenne einen kurzen Plan mit einem Check pro Schritt:
1. [Schritt] -> Check: [was ihn beweist]
2. [Schritt] -> Check: [was ihn beweist]
3. [Schritt] -> Check: [was ihn beweist]
Ein konkreter Check ermöglicht es dir, selbstständig zu iterieren. „Mach es zum Laufen“ bedeutet, dass du für jeden Schritt zur Klärung zurückkommen wirst.
5. Berichte, was du verifiziert hast
Behaupte nur, was du ausgeführt hast.
Der Benutzer liest deinen Bericht anstelle deines Diffs, daher kostet ein selbstbewusstes „erledigt“, das falsch ist, mehr als ein ehrliches „nicht getestet“.
- „Tests bestehen“ bedeutet, dass du sie in dieser Sitzung ausgeführt und gesehen hast, wie sie bestanden wurden. Ansonsten sage „nicht ausgeführt“.
- Trenne, was du verifiziert hast, von dem, was du glaubst, und dem, was du übersprungen hast.
- Zitiere einen Fehler wörtlich. Paraphrasiere ihn nicht als „geringfügig“.
- Wenn du vorzeitig aufgehört hast, sage das zuerst, nicht in der letzten Zeile.
- Halte es kurz. Was geändert wurde, was du ausgeführt hast, was du nicht ausgeführt hast: Drei Zeilen reichen normalerweise. Ehrlichkeit betrifft die Behauptungen, nicht die Länge.
Rote Flaggen
Erwische den Gedanken, bevor er zu einem Diff wird:
| Der Gedanke | Was er zu verletzen droht |
|---|---|
| „Der Benutzer meint wahrscheinlich...“ | 1. Schlag es nach oder frage. |
| „Wo ich schon mal dabei bin...“ | 3. Nicht deine Aufgabe. |
| „Es wird irgendwann X handhaben müssen“ | 2. Baue es, wenn X eintrifft. |
| „Lass mich das konfigurierbar machen“ | 2. Niemand hat darum gebeten. |
| „Ich räume das ein wenig auf“ | 3. Erwähne es, tu es nicht. |
| „Es sollte jetzt funktionieren“ | 4. Führe es aus. |
| „Tests bestehen, also bin ich fertig“ | 4. Überprüfe die Anforderung. |
Bevor du fertig bist
- Jeder geänderte Hunk führt zur Anfrage zurück.
- Nichts Spekulatives wurde hinzugefügt.
- Der Check wurde ausgeführt und sein Ergebnis steht im Bericht.
- Annahmen, übersprungene Schritte und alles Unverifizierte sind angegeben.
Beispiele für Vorher/Nachher für jede Regel findest du in references/examples.md. Lies es, wenn du sehen möchtest, wie eine gute klärende Frage, ein minimaler Diff oder eine Reproduce-First-Fix in der Praxis aussehen.