Wie kann ich kritische Fehler in einer neuen Codeumgebung vermeiden?

Ich bin jetzt seit über 3 Jahren Entwickler und habe in meinem Team Vertrauen in meine Programmierfähigkeiten aufgebaut. Kürzlich war mein Team bei einem Unternehmen beschäftigt, das unseren Risikokapitalgebern gehört, in das wir integriert wurden und an dem wir jetzt arbeiten.

Ich habe keine Erfahrung mit Java und obwohl ich weiß, wie man in C# usw. codiert und ich mit APIs vertraut bin, habe ich kürzlich ein großes Problem verursacht, als ich meinen Code in unser Quell-Repository eingecheckt habe.

Ich wurde ins kalte Wasser geworfen und gebeten, Änderungen an einer bestehenden API vorzunehmen (mein Team ist sich meiner Gefährdung und Fähigkeiten bewusst). Nachdem ich die Änderungen verstanden und die Lösungsumgebung auf Verweise auf die API selbst überprüft hatte, nahm ich die Änderungen vor, testete sie mit Einheitentests und Postman auf die Antwort usw.

Alles schien in Ordnung zu sein. Mein Wissen über die Lösung insgesamt und andere Dinge ist jedoch nicht so gut wie das der anderen Back-End-Entwickler in diesem Projekt. Ich bin der einzige Full-Stack-Entwickler, der sowohl Front- als auch Backend macht. Das Problem war, dass auf die API in einer BPMN-Workflow-Datei verwiesen wird, die nicht angezeigt wurde, als ich in der IDE nach den Referenzen oder dem API-Namen als Text gesucht habe.

Dies verursachte ein 4-tägiges Problem, bei dem zwischen 2-4 Back-End-Entwickler untersuchten, warum der Build zu einem bestimmten Zeitpunkt während des Arbeitstages fehlschlug. Während ich zu meinem Fehler stehe und die Verantwortung für ein so großes Problem voll und ganz übernehme, bin ich jetzt sehr enttäuscht von mir selbst und bezweifle noch mehr, dass ich mit so wenig Wissen über Java und die Lösungsstruktur das Backend weiterentwickeln sollte . Ich kann auch nicht umhin, mich schuldig zu fühlen, weil ich so viel Zeit und Geld für etwas verschwendet habe, was ein Fehler war und lange Zeit gedauert hat, es zu finden.

Ich würde zwar gerne Zeit verbringen und mich mit einigen Back-End-Entwicklern zusammensetzen, um es durchzugehen und vollständig zu verstehen, aber sie haben im Moment einfach keine Zeit. Was kann ich noch tun, um sicherzustellen, dass ich in Zukunft keine Fehler mache oder weitaus weniger wahrscheinlich mache, geschweige denn solche kostspieligen?

Ich sollte hinzufügen, dass ich meinen Änderungscode auch von einem der Back-End-Entwickler überprüfen ließ, der sicher gefragt wurde, ob die API irgendwo anders referenziert wird. Da meine Suche und Überprüfung nichts in der IDE zeigte, da sie keine BPMN-Dateien überprüft, antwortete ich mit nein.

Was sollte ich noch tun und was sollte ich tun, um das Risiko, in Zukunft ähnliche Fehler zu machen, zu minimieren?

Zusätzliche Anmerkungen zu den Kommentaren und Antworten:

Code-Reviews: Ich werde immer mit dem Entwickler zusammensitzen und den Code mit ihm besprechen und verstehen, während wir ihn erklären.

Wir führen tägliche Scrums durch. Ich habe dies erwähnt, als ich daran gearbeitet habe, aber es wurden keine Bedenken geäußert, obwohl ich sicher bin, dass wir es morgen im Scrum oder in der nächsten Retrospektive besprechen werden.

Ich sollte klarstellen, dass das Problem darin bestand, dass der Build fehlgeschlagen ist, und ich verstehe, dass ich wahrscheinlich alle Änderungen in meinen Zweig ziehen und bauen und einen letzten Test durchführen sollte, bevor ich ihn festlege, was ich nicht getan habe.

Kommentare sind nicht für längere Diskussionen gedacht; Diese Konversation wurde in den Chat verschoben .
Genau zu diesem Zweck sollten solche Dinge mit der Quelle dokumentiert werden. Sie sind nicht immer. Haben Sie die Dokumentation gelesen, die Sie mit gutem Grund erwarten können?
Das klingt nach Code Smell, Java ist wie C# eine stark typisierte Sprache. Wenn die für die Typprüfung verwendeten Mechanismen in Tests nicht ausgelöst werden, liegt möglicherweise ein tieferes Problem vor, bei dem Schnittstellen nicht richtig verwendet werden.
Genau aus diesem Grund gibt es Code-Reviews. Ich nehme an, Sie verwenden die Quellcodeverwaltung. Warum war es für die Entwickler so schwierig, die letzten Dutzend Commits zu überprüfen, um das Problem zu erkennen?
Aus diesem Grund sollte es auch eine solide Testsuite, einen CI-Server und QA in einer Staging-Umgebung geben, bevor der Code veröffentlicht wird. Es hört sich so an, als ob Ihrem Unternehmen diese Komponenten fehlen, wodurch Fehler, die leicht abgefangen werden könnten, veröffentlicht werden können.
Ich würde vorschlagen, dass Sie keinen Kontakt mit dem Entwickler haben sollten, der Ihre Codeüberprüfung durchführt. Sie sollten die Spezifikationen erhalten, die Sie erhalten haben, und Ihren Code aus dem Repo haben. Wenn sie Fragen zu etwas haben, lassen Sie sie einen anderen Entwickler fragen, nicht Sie. Wenn Sie es erklären, können Sie dazu führen, dass sie einen Fehler übersehen, den sie bemerkt hätten.
@J.ChrisCompton dem würde ich zustimmen. In meiner Firma erhalten wir derzeit jedoch keine End-to-End-Spezifikationen, und vielleicht ist dies eine persönliche Sache, aber ich finde oft, dass Leute eine Code-Review nur überfliegen, wenn Sie nicht da sind, um sie aufzufordern, sich bestimmte Bereiche anzusehen, während Sie gehen . Vielleicht ist das nicht richtig und ich stimme zu, dass sie mich mehr auffordern sollten.
"ein 4-Tages-Problem mit zwischen 2-4 Backend-Entwicklern" - Es wurden also 8 bis 16 Backend-Entwicklertage benötigt, um den Fehler zu lokalisieren? Dann ist das Problem nicht so „trivial zu sehen und zu vermeiden“, wie manche vorgeben mögen. Wenn sie „ihr“ Zeug kennen, können sie den Fehler schnell lokalisieren. Wenn es ein paar Tage dauert, sind Sie nicht schuld daran, dass Sie vorher nicht wussten, was in der neuen Umgebung womit verbunden war. Es sei denn , das Problem wurde eindeutig dokumentiert. Aber warum sollten sie dann Tage brauchen, um es zu reparieren?
@Im-Harrison Ja, ich verstehe, dass Sie wahrscheinlich nur begrenzte Kontrolle haben. (1) Das „Überfliegen“-Problem kann geringer sein, wenn sowohl der Codierer als auch der Code-Reviewer in jedes Meeting gerufen werden, wenn etwas schief geht. Niemand sollte wissen, wer von Ihnen es codiert hat (obwohl sie es im Allgemeinen tun werden). (2) Auch wenn Sie keine End-to-End-Spezifikationen haben, sollten Sie etwas haben. Wenn es mündlich ist, schreiben Sie eine E-Mail und senden Sie sie an die Person, die Ihnen die Spezifikationen gibt - dann haben Sie etwas für den Code-Reviewer (und es kann Ihnen auch einige Angst ersparen :) Erklären Sie es einem Code-Reviewer nicht, es sei denn, es ist erforderlich (durch Richtlinie oder ungeschriebene Regel).

Antworten (8)

Wenn mehrere Entwickler Änderungen an derselben Codebasis vornehmen (und nicht immer auf dem neuesten Stand sind), werden diese Dinge passieren. Ich bin selbst Entwickler; Es ist nichts, woran man sich aufhängen sollte, es wird uns allen mindestens einmal passieren. Es gibt jedoch ein paar Dinge, die Sie tun können, um das Risiko eines erneuten Auftretens zu verringern.

Aus dem Kontext sieht es so aus, als hättest du alles lokal getestet und es hat gut funktioniert. Erst später ging etwas schief. Dies deutet darauf hin, dass entweder Ihre eigene Codebasis leicht veraltet war und/oder jemand anderes veralteten Code hatte, als er seine eigenen Änderungen festlegte. Das Beste, was Sie tun können, bevor Sie Ihren Code festschreiben, ist, alle kürzlich vorgenommenen Änderungen aus Ihrem Repository (oder wie auch immer Sie es nennen) abzurufen, damit Sie sicher sein können, dass Ihre Änderungen mit dem aktuellsten Code funktionieren. Wenn alle Tests bestanden sind, können Sie guten Gewissens zusagen.

Ich würde auch vorschlagen, gegenüber Ihren Kollegen etwas lauter zu sein. Wenn Sie Änderungen an einem kritischen System vornehmen, teilen Sie es ihnen mit. Selbst wenn es sich um eine einfache Anfrage wie „Ich bin dabei, diesen wichtigen Teil zu ändern, haben Sie Zeit für eine Codeüberprüfung?“ . Auf diese Weise verbringt Ihr Team nicht Tage damit, das Problem zu finden, falls es eines gibt, und Sie können beruhigt sein, da Sie wissen, dass Sie UND Ihre Kollegen von den Änderungen überzeugt sind. Einige Entwicklungsteams veranstalten tägliche Stand-ups, in denen sie äußern, woran sie arbeiten. Es hilft dem Team, besser zu wissen, woran Sie arbeiten und ob die Gefahr besteht, dass Ihre Änderungen mit denen anderer kollidieren.

Du lernst, indem du es tust. Wenn Sie sich mit Sprachen wie C# auskennen, lernen Sie Java vielleicht schneller kennen, als Sie denken!

Es wurde durch einen stringly-typisierten Verweis auf die API in dieser „BPMN-Workflow-Datei“ verursacht, sodass nichts veraltet war und das Abrufen der letzten Änderungen nicht geholfen hätte.
@DavidConrad, du hast zu 100% Recht, aber hier geht es weniger um die Vergangenheit und warum es passiert ist, als dass ich mir dessen bewusst bin und verstehe, wie es zu diesem Punkt gekommen ist. Diese Antwort schlägt vor, was meiner Meinung nach in diesem Fall der beste Rat ist - verwenden Sie Ihre Stimme mehr und beziehen Sie andere mit ein. Wäre ich lauter gewesen und hätte anderen Entwicklern mehr darüber gesagt, was ich mache, wäre es wahrscheinlicher gewesen, dass jemand darauf hingewiesen hätte, dass es in den BPMN-Workflows verwendet wurde.
Ah, das alte "funktioniert auf meiner Maschine." :P

Diese Situation passiert von Zeit zu Zeit - Sie tun etwas, das unvorhergesehene Auswirkungen auf etwas anderes hat, von dem Sie vorher nichts wussten.

Die Tatsache, dass Sie nicht sofort entlassen oder auf einen PIP gesetzt wurden, bedeutet, dass das Unternehmen erkennt, dass Fehler passieren, sie aussortiert werden und das Leben entsprechend weitergeht.

Was können Sie dagegen tun? Informieren Sie sich über diese Konsequenz und prüfen Sie, ob es etwas anderes gibt, das Sie hätten berücksichtigen sollen, oder ob Sie ein anderes Team zu den Folgewirkungen einer API-Änderung hätten befragen sollen.

Das alles gehört zum Sammeln von Erfahrungen dazu und sollte Sie nicht davon abhalten, weiterzumachen.

Die Möglichkeit, dieses Problem zu vermeiden, bietet Ihnen auch die Möglichkeit, einen wesentlichen Beitrag zu Ihrem neuen Unternehmen zu leisten: Die Wurzel dieses Problems sind unzureichende Tests, nicht Sie (es sei denn, Sie waren auf eine Weise fahrlässig, die in Ihrem Beitrag nicht auftaucht).

In allen Entwicklungsumgebungen sollte es möglich sein, vor dem Einchecken herauszufinden, ob die von Ihnen vorgenommene Änderung einen größeren Fehler verursachen wird, und herauszufinden, ob der Code den Build beschädigen wird. Während es sicherlich peinlich ist, derjenige zu sein, der ein so klaffendes Ganzes in den Prozessen des Unternehmens findet, können Sie jetzt führend sein, wenn Sie versuchen, einen solchen Prozess in Ihrem neuen Unternehmen zu etablieren.

Sie können vorschlagen, dass das Team mit dem Schreiben von Unit-Tests beginnt und mit der Einrichtung einer kontinuierlichen Integrationsumgebung beginnt, die das Projekt neu erstellt und die Unit-Tests jedes Mal ausführt, wenn Code eingecheckt wird, und in der die Tests einzeln vor dem Einchecken ausgeführt werden können. Die Einheitentests erfordern Engagement des Teams, aber eine grundlegende CI-Umgebung kann ziemlich schnell aus Open-Source-Projekten eingerichtet werden, solange Sie eine VM oder einen Server dafür bereitstellen können.

Bearbeiten: Code-Reviews sind eine weitere gute Programmierpraxis, die diese Art von Fehlern minimieren kann und auch ziemlich einfach in Gang zu bringen ist.

TL;DR nutzen Sie diese peinliche Gelegenheit, um die Entwicklungsprozesse Ihres Unternehmens zu modernisieren. Du wirst nach Rosen riechen.

Das OP kann diese Gelegenheit auch nutzen, um Peer-Review als SOP einzuführen, anstatt jedes Mal ausdrücklich danach fragen zu müssen. Peer Review kann Ihnen helfen, Code zu lernen, indem Sie lesen, was andere tun, und auch lernen, indem Sie gutes Feedback von anderen Entwicklern zu Ihrem eigenen Code erhalten. Ich muss argumentieren, dass nicht alle größeren Fehler vor dem Einchecken abgefangen werden können. Server können einige unterschiedliche Einstellungen haben, die einen Build beschädigen können, der lokal funktioniert. Eine andere Einrichtung von NuGet kann diese Art von Problem verursachen.

Das Problem tritt auf, dass die API in einer BPMN-Workflow-Datei referenziert wird, die nicht angezeigt wurde, als ich in der IDE nach den Referenzen oder dem API-Namen als Text gesucht habe.

Was haben die Teams in Bezug auf diesen Vorfall rückblickend herausgefunden? Welche Abteilungsverfahren könnten eingerichtet werden, damit sich dies nicht wiederholt? Was ist nach Ansicht des Teams beim Onboarding neuer Entwickler notwendig? Und welche neuen Onboarding-Verfahren sollen entwickelt werden?

PS In den oben genannten Bereichen proaktiv zu sein, ist eine großartige Möglichkeit, zu lernen und zu führen.

Darf ich fragen, warum die Leute immer Verbesserungen auf Verfahrens- oder Managementebene vorschlagen? Es ist sehr zweifelhaft, dass ein brandneuer Typ hereinkommt und sagt: "Ändere das alles, damit meine Sachen funktionieren können!" Wenn alle / Dinge bis zu diesem Punkt "gut" funktioniert haben? Etwas kaputt zu machen, dann nicht zu wissen, warum es kaputt gegangen ist, fast eine Woche Arbeitszeit in Anspruch zu nehmen und dann am Ende zu sagen, dass der Prozess stinkt und verbessert werden muss, ist kein guter Weg, um dort Ihre Karriere zu beginnen.
Denn wenn die Frage lautet: "Welche Art von automatisiertem Testen können wir dem Freigabeprozess hinzufügen, der diese Art von Problem bei den nächsten Änderungen erkennen würde", sollten Sie am Ende einen besseren Prozess haben, der keine manuelle Überprüfung erfordert jede Änderung.
Oft werden Probleme auf Verfahrens- und Managementebene von den Veteranen ignoriert, wenn sie sich daran gewöhnen, sie zu umgehen. Sie vergessen, dass die Dinge nicht so sein müssen, also laufen die Dinge für sie "gut". Es braucht ein frisches Paar Augen, um die Mängel zu erkennen. Das heißt, ich stimme zu, dass der neue Typ keine Forderungen stellen sollte, aber es ist ein großer Unterschied, ob er sagt: "Ändere das alles, damit meine Sachen funktionieren können!" und "Wie kommt es, dass wir die Dinge so statt so machen?"
@Dan Ihr Szenario kann neu formuliert werden: "... dann sagen Sie am Ende, dass ihr Prozess stinkt und verbessert werden muss", um solche Probleme in Zukunft zu vermeiden. Als jemand, der genau das getan hat, führte ein wenig hartnäckige Entschlossenheit zu Prozessänderungen, die das Leben aller einfacher machten. Ich habe meine Mitarbeiter mit ca. 3 Monaten im Unternehmen als Juniorentwickler davon überzeugt, es zu tun und dann die Ergebnisse zu zeigen . Wenn sie keine Retrospektiven/Postmortems durchführen, ist dies ein einfacher Ort, um positive Veränderungen herbeizuführen, von denen das Team definitiv profitieren wird.
Wenn ein Problem auftritt, ist es entweder auf Inkompetenz oder einen Prozessfehler zurückzuführen - es ist klar, dass das OP nicht inkompetent ist, sondern einen Fehler gemacht hat, der durch einen Mechanismus vermeidbar ist. Das Unternehmen möchte es vielleicht nicht von einem „Außenstehenden“ hören, aber dies ist ein Problem, das durch ordnungsgemäße Prozesse beseitigt werden würde. Idealerweise sollte das Teammanagement in der Lage sein, dies zu erkennen und neue Prozesse anzuwenden - wenn der Neuling diesen Denkprozess anstößt, dann sind seine Bedenken größer. Ich denke, der Rat der "Proaktivität" ist gültig, obwohl ich zugebe, dass etwas Größeres falsch ist, wenn das OP der Handelnde ist.
@Dan Weil ihr Prozess eindeutig kaputt ist. Es gibt keine Tests, dass die BPMN-Workflow-Datei mit der API übereinstimmt, und das sollte es auf jeden Fall geben.
@Dan, um zu vermeiden, dass es das nächste Mal passiert, wenn ein neuer Entwickler zum Team hinzugefügt wird.

Wo wurden die BPMN-Dateien gespeichert, sodass sie bei der Suche nach anderen API-Konsumenten nicht sichtbar waren?

Das Problem hört sich so an, als ob Sie nicht alle API-Konsumenten kannten/auf sie Zugriff hatten.

Wenn sie nicht Teil Ihres standardmäßigen Entwicklungsarbeitssatzes sind und aus irgendeinem Grund nicht hinzugefügt werden können, müssen alle APIs, die bis dahin verwendet werden, in gleichwertigen Kopfzeilenkommentaren für Methodenaufrufe dokumentiert werden. Je nachdem, wie formal Ihr Überprüfungsprozess ist, kann die ausdrückliche Bestätigung, dass sie nicht betroffen sind, eine gültige Prozessänderung sein.

Das Problem, dass Sie nicht über alles außerhalb der Codebasis, an der Sie arbeiten, Bescheid wissen, muss bei Ihrem nächsten Standup/Ihrer nächsten Retrospektive von Ihnen angesprochen werden, wenn Ihre Kollegen dies nicht tun. So etwas sollte im Rahmen Ihres Einstiegs in das Projekt behandelt worden sein.

Ich denke, eines der Probleme ist, dass IDEs für Sprachen wie Java (ich nehme an, C # ist ähnlich, aber ich habe keine persönliche Erfahrung) Sie in ein falsches Sicherheitsgefühl wiegen können. Sie haben Funktionen zum Auffinden der Benutzer von Klassen, Methoden, Feldern usw. eingebaut, die die bei einer einfachen Textsuche gefundenen Fehlalarme vermeiden, aber diese Methoden sind nur zuverlässig, wenn der gesamte Code im IDE-Projekt enthalten ist UND die Aufrufe direkt erfolgen aus Java-Code und nicht über Reflektion.

Du musst deine Denkweise ändern.

Sie haben keinen „kritischen Fehler“ gemacht. Sie haben nach besten Kräften gearbeitet; Sie waren offen für die Arbeit in einer unbekannten Umgebung; Sie waren transparent in Bezug auf Ihr Wissen und alles andere, davor und danach; Sie haben mit den anderen Jungs zusammengearbeitet, um das Problem zu beheben, Sie haben vermutlich keinen Wutanfall im Büro bekommen. Nach dem Debakel kommen Sie hierher und versuchen, sich noch weiter zu verbessern.

Kurz gesagt: Ich würde mir die Finger lecken, mehr Mitarbeiter wie Sie zu haben.

Zur Beantwortung Ihrer Frage:

  1. Sie persönlich können solche Dinge im Allgemeinen nicht vermeiden. Der technische Fehler lag vollständig außerhalb Ihres Einflussbereichs. Wenn Sie 100% sicher sein möchten, würden Sie bis zum Stillstand mahlen. Sie können keine Teile eines Systems überprüfen, von denen Sie nichts wissen.
  2. Systeme (einschließlich Computer und Menschen) können auch nicht so gebaut werden, dass sie solche Dinge vermeiden, sobald sie komplex genug werden.
  3. Eine Möglichkeit, dies anzugehen, ist der DevOps/Agile-Ansatz , Fehler einzuladen und hart und schnell zu scheitern. Darum geht es bei allen CI- und besonders bei CD-Sachen. Sie setzen so häufig und schnell ein, dass Sie sehr oft scheitern werden ; und jedes Mal, wenn Sie den jeweiligen Grund mit höchster Priorität beheben (unter Verwendung der üblichen Techniken - automatisierte und manuelle Tests, schmerzloses Rollback kleiner Commits, Blau-Grün-Bereitstellungen mit Rollback-Umschaltung im Handumdrehen usw.). Dies führt logischerweise dazu, dass der gesamte Prozess sehr schnell robuster wird. Idealerweise machst du das ab Tag 0. Einfach? Nein. Kann Stück für Stück verbessert werden? Ja.

Unabhängig davon, was Sie oder andere tun, um Fehler zu minimieren, Fehler werden passieren .

Natürlich gibt es technische „Best-Practices“, die helfen, und ja, es gibt all die Plattitüden über das Lernen aus Fehlern. Aber das hast du alles, wie es scheint. Trotzdem fühlst du dich immer noch so schlecht wegen des Vorfalls, dass du dir die Zeit genommen hast, es auf jobs.stackexchange.com zu schreiben?

Ich denke, es gibt etwas Greifbares, das Sie tun können, das Ihnen und den anderen helfen wird, sich bei dieser ganzen Sache besser zu fühlen.

Das Beste, was Sie tun können, ist, die Freundlichkeit und Großzügigkeit, die Ihnen gezeigt wurde, zur Kenntnis zu nehmen und sich dafür zu bedanken .

Anstatt sich noch ausgiebiger zu entschuldigen und schnell vergessene „Nie wieder“-Versprechungen abzugeben, nehmen Sie sich die Zeit, den Leuten, die bei der Lösung des Problems geholfen haben, und denen, die Ihnen Unannehmlichkeiten bereitet haben, persönlich zu DANKEN. Wenn es angebracht ist, bringen Sie zum Beispiel eine Schachtel Donuts mit ins Büro und ergänzen Sie Ihre Kollegen.

Und wenn dann das nächste Mal etwas passiert und jemand anderes einen Fehler macht, sei nett zu ihm, hilf ihm und erwidere die Freundlichkeit, die dir zuteil wurde . Das ist es. Ihr werdet wegen solcher Dinge ein besseres Team sein.

Machen Sie Ihre Commits so klein wie möglich und wenn Sie nach jedem Push vom Build-Server bauen können. (Wenn es nicht oft gebaut wird, möchten Sie vielleicht auch vor Ihrem Push bauen!)

Das wird Ihnen nicht helfen, keine Fehler zu machen, aber es wird sie viel weniger kritisch machen. Wenn Sie wissen, welches Commit/welche Gruppe von Commits den Build zum Absturz gebracht hat, ist es trivial, es zurückzusetzen, während Sie an dem Problem arbeiten, und wenn Commits so klein wie möglich sind, ist es einfacher, die Ursache des Problems zu finden.

Wenn Sie git verwenden, gibt es sogar einen Befehl, der dabei hilft: git-bisect , mit dem Sie eine binäre Suche durch eine Gruppe von Commits durchführen können, um denjenigen zu finden, der das Problem verursacht.