Ein besserer Bug-Fixer werden

24

Ich liebe es, Programmierer zu sein. Da habe ich es gesagt. Allerdings habe ich in letzter Zeit gemerkt, dass ich es nicht ertragen kann, Fehler zu beheben. Überhaupt.

Während ich etwas entwickle, ist meine Produktivität extrem hoch. Selbst wenn ich Unit-Tests schreibe und meine Entwicklung selbst teste, bin ich im Allgemeinen sehr produktiv. Ich kann mich gut konzentrieren und Aufgaben erledigen.

Wenn sich jedoch die Zeit für die Qualitätssicherung abzeichnet und ich an der Behebung von Fehlern arbeite, wird meine Inspiration massiv beschleunigt. Ich muss mich mit ziemlich extremen Maßnahmen (Sie wissen, hohe BPM-Musik, übermäßige Mengen an Koffein usw.) dazu zwingen, etwas zu tun. Meine Aufgabe besteht normalerweise darin, in ein bestehendes umfangreiches Projekt einzusteigen und neue Funktionen hinzuzufügen oder Fehler zu beheben. Daher kann ich meinem Arbeitgeber nicht genau sagen, dass ich ein paar Wochen benötige, um Komponententests für den gesamten Code zu schreiben Die von uns häufig verwendete Servertechnologie ist sowohl für Unit- als auch für Integrationstests sehr unerschwinglich, da sie einige Java-Classloader-Probleme aufweist. Ich bin nicht ganz gegen Fehlerbehebung, manchmal kann es Spaß machen, aber es macht überhaupt keinen Spaß wenn Sie kleinere Änderungen vornehmen müssen und 30 Sekunden bis 3 Minuten warten müssen, um zu sehen, ob sie funktioniert haben oder nicht (aufgrund der Funktionsweise des Systems).

Wie kann ich meine Produktivität und Motivation beim Beheben von Fehlern verbessern? Beschäftigen sich die meisten Programmierer damit?

Naftuli Kay
quelle
4
"Also kann ich meinem Arbeitgeber nicht genau sagen, dass ich ein paar Wochen brauche, um Unit-Tests für den gesamten Code zu schreiben . " Gibt es einen Grund dafür? Ich mache das sehr oft und es zahlt sich wirklich für alle aus. Ich meine, wenn Sie 3 Wochen zum Unit-Test brauchen, sparen Sie vielleicht nur 3 Wochen für die Fehlerbehebung. Normalerweise finde ich sogar eine Menge möglicher Fehler, die völlig unter dem Einfluss von QA standen. Sicher, du willst das wahrscheinlich nicht alleine machen.
Netcoder
10
Schreiben Sie keine Fehler in Ihren Code ... Problem gelöst.
Michael Brown
3
Ich ziehe es fast vor, Fehler zu beheben, anstatt neuen Code zu schreiben. Ich bevorzuge es besonders, Unit-Tests zu schreiben. Vielleicht bin ich komisch.
Paul Tomblin
1
@ PaulTomblin Ich verstehe, was du sagst. Ich kenne einige Entwickler, die Frontend-Entwicklung lieben ... mir gefällt Nicht-UI-Code am besten. Das Schreiben von neuem Code ist manchmal schwierig, weil man manchmal "Schreibblockade" bekommt
Michael Brown
1
Es ist schwierig, die "Produktivität" der Fehlerbehebung zu messen, da Sie möglicherweise viel Zeit damit verbringen, herauszufinden, was "nicht das Problem" ist, genau wie Edision angeblich gesagt hat, dass er "1000 Wege gefunden hat, keine Glühbirne herzustellen" ", und ich denke, dass die Nicht-Fixes oft lehrreich sind, welche Hinweise wichtig sind und welche aktuellen (und zukünftigen) Fehlerbehebungsaufgaben zu erledigen sind.
Zeke Hansell,

Antworten:

21

Es macht überhaupt keinen Spaß, wenn Sie kleinere Änderungen vornehmen und 30 Sekunden bis 3 Minuten warten müssen, um zu sehen, ob sie funktioniert haben oder nicht

Das ist das eigentliche Problem hier. Sie fühlen sich unproduktiv, wenn Sie so lange auf Rückmeldungen warten müssen, ich kenne das Gefühl. Vielleicht ist es möglich, mehr Dienste herauszufiltern und bessere Testwerkzeuge zu erstellen, damit Sie sofort ein Feedback erhalten.

Das Testen von Legacy-Codes in Einheiten ist teuer oder kann gefährliche Nachbesserungen nach sich ziehen. Wenn Sie jedoch bessere Testvorrichtungen erstellen, können Sie den Test in Sekunden statt in Minuten durchführen und erzielen fast die gleiche Produktivität wie bei der Arbeit mit neuem Code, der auf Einheiten getestet werden kann.

Das Warten auf Feedback ist langweilig und demotivierend, nicht das Beheben von Fehlern.

Garrett Hall
quelle
Schon mal den Mythischen Mann-Monat gelesen? Stellen Sie sich vor, Sie warten bis zum nächsten Morgen und versuchen, den Stapelspeicherauszug / den Registerinhalt zu analysieren, der zum Zeitpunkt des Fehlers vorhanden war ...
sq33G
@ sq33G Oder noch schlimmer: Sie haben ein Testteam in Indien, mit dem Sie nur per E-Mail sprechen (echte Geschichte).
Garrett Hall
13

Fehlerbehebung ist eine äußerst wichtige Fähigkeit, die Sie lernen sollten. Ich habe irgendwo gelesen, dass man normalerweise 80% der Zeit damit verbringt, die 20% der Probleme in einer Anwendung zu beheben.

Ich glaube daran, aus Fehlern zu lernen , und die Fehlerbehebung ist eine Gelegenheit, aus anderen Fehlern zu lernen . Sie können es lernen und helfen, in Zukunft ein besserer Programmierer zu sein. Dies ist die Motivation, die ich hatte, als ich anfing, viele Fehler zu beheben und den Code neu zu faktorisieren .

ManuPK
quelle
1
Was Sie schreiben, ist wahr; Ihre 80% / 20% sind jedoch nur wahr, weil es in freier Wildbahn so viel beschissenen Code gibt. Mit beschissen meine ich untergestaltete oder überarchitektete oder falsch gestaltete oder einfach nur schlampige Praktiken (Crack-Head-Programmierung). Davon abgesehen gibt es nichts auszusetzen, wenn ein Entwickler die Entwicklung der Fehlerbehebung vorzieht. Fügen Sie hinzu, dass die meisten Programme von Anfang an schlecht gestaltet sind und Sie bereits die meisten Fehlerbehebungsprogramme auf Fehler einstellen.
Wil Moore III
@wilmoore: Du hast Recht mit dem beschissenen Code, und es gibt auch die sich ändernden Anforderungen.
ManuPK
6

Ich persönlich fand es hilfreich, Fehler nicht mehr als 'kleine Dinge', sondern als große Showstopper zu betrachten, die genauso wichtig sind wie große Features, obwohl sie nach stundenlangem Debuggen nur ein paar Codezeilen ändern müssen. Auf diese Weise ist es weniger bedrückend, einen ganzen Tag damit zu verbringen, 3 Bug-Tracker-Einträge zu töten (der Ansatz hängt ein wenig von Ihrer persönlichen Fähigkeit ab, sich dazu zu überreden, es zu glauben :-).

Vielleicht hilft es, ein Spiel daraus zu machen, zum Beispiel zusammen mit Ihren Mitarbeitern ( wer behebt die meisten Fehler pro Tag? Oder, noch schlimmer, wer hat die geringste Anzahl von Neuerungen pro Tag durchgeführt? )

Alexander Gessler
quelle
Ich bin absolut nicht einverstanden, wenn es darum geht, die meisten Fehler an einem Tag oder dergleichen zu beheben. Einige Bugs sind trivial zu isolieren und zu beheben, sobald Sie wissen, wie man sie auslöst: Fügen Sie diesen bestimmten Wert in dieses Feld ein und beobachten Sie: Die verbleibende Länge ist jetzt falsch. (Möglicherweise zählen Sie Bytes anstelle von Zeichen und haben das oben stehende Leerzeichen vergessen, z. B. U + 007F.) Bei anderen (insbesondere bei Fehlern, die verschiedene Race-Bedingungen oder Multithreading betreffen) kann es Tage dauern, bis sie reproduziert werden im Feld auftreten. Beide garantieren jedoch nur einen einzigen Eintrag im Bug-Tracker.
ein CVn
Solche Fehler gleichermaßen zu zählen, würde bedeuten, dass jeder nur die einfachen Fehler behebt, anstatt zB die Rennbedingungen in Angriff zu nehmen. Aber ist das nicht auch bei unmotivierter, unkonzentrierter Fehlerbehebung der Fall? :-) Nicht 'harte' Käfer zugunsten einfacher Dinge ruhen zu lassen, ist ein ganz anderes Thema.
Alexander Gessler
Es geht auch um die Qualität des Fixes. In vielen Fällen können Sie einen Fehler schnell beheben, ohne zur Ursache zu gelangen, aber dann tritt ein ähnlicher Fehler entweder an einer anderen Stelle oder in einer anderen Situation auf. Das Verstehen und Beheben der Fehlerursache dauert oft länger, führt jedoch im Allgemeinen zu einer wesentlich zuverlässigeren Fehlerbehebung. Es sei denn, es ist "dies scheitert die ganze Zeit in der Produktion und wir müssen jetzt eine Korrektur veröffentlichen ". Ich weiß, welchen Ansatz ich bevorzugen würde (und selbst wenn dies der Fall ist, würde ich zurückgehen, um den gebrochenen Knochen zu reparieren, anstatt nur den Schnitt zu bandaiden eine gute Idee).
ein Lebenslauf vom
5

Ich war in deinen Schuhen. Erstellen Sie automatisierte Tests, wann und wo Sie können. Es muss nicht alles auf einmal sein. Nehmen Sie sich eine Minute Zeit, um einen Testfall zu programmieren, wenn Sie einen Fehler finden. Wenn Sie einen Testfall nicht programmieren können, schreiben Sie irgendwo eine kurze Beschreibung, wie Sie ihn manuell testen können, z. B. hier klicken, dies eingeben usw., und stellen Sie ihn in eine Art Wissensdatenbank.

Das Debuggen kann sehr mühsam sein, insbesondere bei kompliziertem Code, den Sie nicht geschrieben haben. Überlegen Sie sich ein Ziel: "Fix Bug 13533 by Friday". Richten Sie dann eine Belohnung ein, wenn Sie das Ziel "Schnappen Sie sich am Freitagabend ein Pint mit meinen Freunden" erreichen. Dies wird dazu beitragen, dass es ein bisschen lohnender wird.

Abgesehen davon ist Arbeit manchmal genau das ... Arbeit.

Michael Rice
quelle
Für dieses aktuelle Projekt habe ich in der Tat Unit-Tests geschrieben. Das einzige Problem ist, dass egal, was ich mit meinen Unit-Tests zu beweisen scheine, aufgrund der Probleme mit der Servertechnologie in der Produktion / im realen Leben alles zur Hölle geht. Leider gibt es keine andere Alternative und ich bin sozusagen nicht in der Lage, den Motor zu wechseln.
Naftuli Kay
Sie müssen eine "unerwartete Fehlerbehandlungsroutine" schreiben, damit Sie diese abfangen können ;-)
Zeke Hansell
2

In einer solchen Situation brauchen Sie eine kreative Herausforderung. Normalerweise schreibt es Code, aber hier ist es nicht.

Aber es ist nicht alles verloren. Arbeiten Sie an der Lösung Ihrer Metaprobleme und stecken Sie Ihre Energie in diese. Warum dauert es 30 Sekunden bis 3 Minuten, um Feedback zu erhalten? Wie können Sie diese Zeit verkürzen? (Vielleicht können Sie ein Skript oder eine Utility-App schreiben, die Sie nicht einchecken. Dies hilft Ihnen dabei.) Das ist Ihre neue Problemdomäne - Ihre neue kreative Herausforderung.

Persönlich stelle ich jedes Mal, wenn ich mich in einer Phase der Fehlerbehebung befinde, meine größten Hindernisse für eine schnelle und schmerzlose Ausführung fest und automatisiere das, was ich automatisieren muss, um diese Hindernisse zu beseitigen. Dies führt häufig zu Produktivitätssteigerungen und Ergänzungen meines persönlichen Portfolios.

Kurz gesagt würde ich sagen, dass wir uns immer weiterentwickeln. :)

Erik Dietrich
quelle
Ich höre dich. Ich wünschte, ich könnte etwas tun, um Dinge zu automatisieren. Ich habe einen Server und einen Client und kann den Client nicht einfach automatisieren. Es gibt mehrere Phasen im Workflow dieser Sache und viele der Fehler treten zwischen den Phasen auf, so dass ich eine 30-Sekunden-Phase, dann eine 3-Minuten-Phase oder umgekehrt machen muss. Unterm Strich ist es ziemlich albtraumhaft :)
Naftuli Kay
2

Ist Ihr Problem beim Debuggen oder bei der Fehlerbehebung? Wenn Sie genug debuggen können, um die Komponente zu isolieren, die das Problem verursacht, betrachten Sie es als eine neue Entwicklungsaufgabe.

  1. Schreiben Sie einige Komponententests nur für den Code, der kaputt geht. Stellen Sie sicher, dass Sie Tests haben, mit denen alle gewünschten Funktionen überprüft werden, und dass einige Tests das Verhalten des Buggys besonders eingrenzen.
  2. Schreiben Sie neuen Code, der alle Tests besteht, die Sie gerade geschrieben haben.
  3. Ersetzen Sie den alten Code durch den neuen.
  4. Führen Sie einige Integrationstests durch. Hier werden Sie einen dreiminütigen Serverneustart ausführen, der jedoch minimiert werden sollte, wenn Sie die Schritte 1 bis 3 ordnungsgemäß ausgeführt haben.
  5. Voila!
Matthew Flynn
quelle
2

Vielleicht sollten Sie sich Brian Hayes ' Debugging Myself ansehen , einen Artikel, der 1995 in American Scientist erschien. Sie könnten Schritte unternehmen (wie die gewohnte Verwendung von Yoda-Bedingungen ), um die am meisten gehassten Arten von Fehlern, die Sie produzieren, zu reduzieren oder zu beseitigen.

Ich bin der Meinung, dass das Debuggen eine andere Fähigkeit als das Programmieren ist, obwohl es verwandt ist. Insbesondere das Debuggen von Multithread-Programmen unterscheidet sich fast vollständig vom Schreiben.

Bruce Ediger
quelle
1

Wenn die Softwareentwicklung langweilig ist, machen Sie es falsch. Mit anderen Worten, es ist kein Problem mit Ihnen, sondern ein Problem mit Ihrer Plattform und Ihrem Prozess. Haben Sie darüber nachgedacht, eine Position mit einer dynamischen Sprache (z. B. Python, Ruby, JavaScript) zu suchen, bei der Sie nicht auf einen Neustart des Servers warten müssen?

Kevin Cline
quelle
Leider ist dies derzeit keine Option. Außerdem erfordert der Workflow, wie oben erwähnt, mehrere Phasen und Schritte, und die Fehler treten zwischen diesen Phasen auf. Wenn ich das von Grund auf neu schreiben würde, würde ich sicher eine Skriptsprache verwenden, aber wir bleiben bei dem, was wir jetzt haben.
Naftuli Kay
1
@TK: In meiner letzten Firma hatten wir großen Erfolg damit, Groovy in unseren Java-Entwicklungsprozess zu integrieren, um früher manuelle Prozesse zu automatisieren. Es ist nicht Java, aber es war nah genug dran und so effektiv, dass wir kaum zurückgedrängt wurden.
Kevin Cline
1

Das gehört leider zum Job. Sie werden beschissene Projekte und beschissene Arbeitgeber haben (ich sage hier auch nicht, nur verallgemeinernd).

Sie können Komponententests anhand ihres Codes schreiben. Schleichen Sie es ein, wie Sie können. Sobald Sie etwas haben, das Sie den Chefs zeigen können, können Sie möglicherweise das Blatt wenden.

Verwenden Sie Debugging-Tools, um die Langsamkeit zu beheben, verwenden Sie Komponententests, um neuen Code zu testen, und verwenden Sie sie, um Probleme mit vorhandenem Code zu beheben sowie den vorhandenen Code in kleinere Teile aufzuteilen.

Sie können es zu einer Herausforderung machen und ein Held der Prozessverbesserung werden. Und wenn es nicht funktioniert, haben Sie gute Erfahrungen, die Sie zum nächsten Arbeitgeber mitnehmen können.

Alan Delimon
quelle
1

Die meisten Programmierer müssen sich irgendwann in ihrer Karriere mit der Behebung persönlicher Probleme befassen.

Der richtige Abstand zwischen Mensch und Arbeit ist für Ihre Motivation von entscheidender Bedeutung. Identifizieren Sie sich bei Ihrer Arbeit nicht zu stark oder zu wenig. Wenn Sie sich zu sehr mit Ihrer Arbeit identifizieren, können Probleme wie die von Ihnen beschriebenen auftauchen: Sie können die Fehler nur sehr ungern beheben, da Sie die Hälfte der Zeit für sich selbst verantwortlich machen. Holen Sie sich innere Distanz und finden Sie heraus, wie Sie Ihr Problem rational lösen können.

In Bezug auf die speziellen Probleme auf Ihrer Plattform gibt es einige Möglichkeiten, um lange Bereitstellungs- und Testzeiten zu verkürzen (und nebenbei bemerkt, Ihre sind nicht besonders lang).

Erstens, je länger Ihre Testzeit ist, desto eher sollten Sie dem Frachtkult abgeneigt sein. Wenn Sie eine Änderung vornehmen, denken Sie darüber nach, bis Sie sicher sind, dass der Fehler behoben wird . Wie sicher Sie sind, hängt natürlich von der Länge Ihres Testzyklus ab. Wenn Ihre Testzyklen jedoch länger werden und lange Tests nicht vermieden werden können, denken Sie länger nach, und Sie werden beim Debuggen belohnt und zufriedener, weil es schneller ist und die lohnende Wirkung eines guten Augenblicks von "fiat lux" hat ".

Zweitens, neigen Sie mehr zu Unit-Tests und weniger zu Integrationstests. Entfernen Sie alle Fehlerquellen von der schwer zu debuggenden Plattform, die Sie verwenden können.

Thiton
quelle
1

Fehlerbehebung kann "großartig" oder "langweilig" sein. Ich habe einige Spielguthaben, die ausschließlich auf die Behebung eines einzelnen Fehlers zurückzuführen sind - des Absturzfehlers, den sonst niemand beheben konnte. Aber die tägliche Pflege von Bugzilla ist betäubend. Kleinere Fehler sind langweilig. Große Bugs sind es wert.

Hier ist die Erkenntnis: Die Tatsache, dass Sie eine riesige Liste kleinerer Fehler haben, ist selbst ein großer Fehler. Es ist einfach kein Codefehler. Es ist ein Prozess- oder Verwaltungsfehler.

Finden Sie diesen Fehler und beheben Sie ihn.

jamie
quelle
1

Eine Sache, die ich unter Kollegen und Bekannten gefunden habe, die gute "Debugger / Bugfixer / Problemlöser" sind, ist, dass sie im Allgemeinen gerne Rätsel lösen. Das kann Kreuzworträtsel, Zahlenspiele (wie Sudoku) und Logikrätsel usw. bedeuten.

Ein Weg, wie Sie ein besserer Bugfixer werden können, besteht darin, einige Zeit an Ihren Fähigkeiten zur Problemlösung oder zum Lösen von Rätseln zu arbeiten.

Hier ist ein Wikipedia-Link , der möglicherweise ein guter Ausgangspunkt für Dinge ist, die Ihnen helfen, ein besserer Problemlöser zu sein.

Wohlgemerkt, manche Leute sind einfach besser darin, Probleme zu lösen, oder sie genießen es einfach mehr. Einige Leute mögen es überhaupt nicht, was es schwierig macht, sich selbst dazu zu zwingen - aber machen Sie keinen Fehler - wenn Sie sich zwingen, zu lernen, ein Rätsellöser zu sein, wird es Ihnen in Zukunft leichter fallen, ein guter Bugfixer zu sein .

Zeke Hansell
quelle
0

Das Beheben von Fehlern fühlt sich normalerweise wie eine lästige Pflicht an, da Sie das Gefühl haben, dass Fehler Ihre ganze Zeit in Anspruch nehmen und Sie von den lustigen neuen Dingen fernhalten. Die Realität ist jedoch, dass die Fehlerbehebung einen großen Teil unserer Arbeit ausmacht. Sie beginnt bereits mit dem Schreiben der ersten Codezeile und dem Ausführen des Compilers. Wenn Sie Code zum ersten Mal veröffentlichen, haben Sie wahrscheinlich bereits Stunden damit verbracht, Fehler zu beheben. Dies scheint jedoch nicht der Fall zu sein, da Sie sie im Rahmen der Implementierung von Features behoben haben. Egal, wie gut Sie als Programmierer sind, in Ihrem System werden sich realistisch gesehen Fehler einschleichen.

Also, wie machst du es Spaß? Nun, das kann ich Ihnen nicht wirklich beantworten, da ich mir wirklich nicht vorstellen kann, was Ihr individuelles Boot treibt. Für mich bin ich ein kleiner Tool-Junkie. Die Antwort bestand darin, eine sehr zuverlässige Toolkette und einen flexiblen Entwicklungsprozess zu haben, die alle dazu beitragen, dass die Fehlerbehebung weniger lästig und das Problem einfacher zu lösen ist schnell. Ich entwickle derzeit hauptsächlich in C # und bin immer auf der Suche nach Tools, mit denen die mühsame Zeit, die beim Schreiben von Software anfällt, entfällt. Ich verwende einen Test-First-Development-Ansatz, der mit einer sehr guten BDD-API namens StoryQ unterstützt wird . Ich benutze Resharper , um einen Großteil meines Refactorings zu automatisieren, und StyleCop, um Dinge wie den Codierungsstil im Auge zu behalten. Meine letzte Erweiterung der Toolkette war die AufnahmeNCrunch , der meine Tests kontinuierlich und gleichzeitig im Hintergrund ausführt, während ich programmiere , und es ist wirklich NCrunch, der sich als der Game Changer erwiesen hat.

Die Kombination all dieser Tools hat meine Produktivität in letzter Zeit erheblich gesteigert, da ich nur sehr wenig Zeit darauf warte, dass Dinge kompiliert oder ausgeführt werden. Ich erhalte visuell ein sofortiges Feedback in meiner IDE, um mich darauf hinzuweisen, dass Probleme zu beheben sind, und ich lege meinen Testcode so aus, dass ich innerhalb weniger Codezeilen genau feststellen kann, wo sich nicht nur das befindet Es tritt ein Fehler auf, aber der Grund für den Fehler liegt in der ausführlichen Berichterstattung, die ich von StoryQ erhalteDas sagt mir genau, welche Teile meines Tests bestanden wurden, welche nicht bestanden wurden und wo im Code die Fehler liegen. Da all die Zeitverschwender meiner Entwicklungszeit entfallen, verbringe ich nur sehr wenig Zeit mit dem aktiven Debuggen und dem Lösen von Problemen sowie dem Schreiben von Tests und Code. Die hohe Fluktuation hält mich auf Trab und bringt eine Menge Abwechslung in meine Aufgaben. Es hat mir auch viel Zeit gegeben, mich während meines Arbeitstages mit anderen Interessengebieten zu befassen, damit ich neue und innovative Ideen in unsere Produktlinie und unsere Prozesse einbringen kann.

S.Robins
quelle