Wie bleiben Sie produktiv, wenn Sie mit extrem schlecht geschriebenem Code umgehen?

63

Ich habe nicht viel Erfahrung in der Softwareindustrie, bin Autodidakt und habe an Open Source teilgenommen, bevor ich mich für einen Job entschieden habe. Jetzt, wo ich für Geld arbeite, muss ich mich auch mit unangenehmen Dingen auseinandersetzen, was natürlich normal ist.

Kürzlich wurde ich beauftragt, die Protokollierung einem großen SharePoint-Projekt hinzuzufügen, das von einem Programmierer geschrieben wurde, der offensichtlich gelernt hat, im Job zu programmieren. Nach 2 Jahren Zusammenarbeit ist der Kunde zu unserer Firma gewechselt, aber der Schaden wurde angerichtet, und jetzt muss ich diesen Code irgendwie beibehalten.

Nicht, dass der Code zu schwer zu lesen wäre. Trotz ifaller Probleme - jedes Projekt hat eine Klasse mit mehreren kopierten Methoden, enormen Verschachtelungen, ungarischen Systemen und ungeordneten Verbindungen - ist es immer noch lesbar.

Ich fand mich jedoch absolut unproduktiv, obwohl ich an etwas so Einfachem wie dem Hinzufügen von Protokollierung gearbeitet hatte. Grundsätzlich muss ich nur den Code Schritt für Schritt durchgehen und einige Ablaufverfolgungsaufrufe hinzufügen. Die Idiotie des Codes ist jedoch so ärgerlich, dass ich innerhalb von 10 Minuten nach dem Start müde werde . Anfangs fügte ich usingKonstrukte hinzu, reduzierte das Verschachteln durch Umkehren if, benannte die Variablen in lesbare Namen um - aber das Projekt ist groß, und schließlich gab ich auf. Ich weiß, dass dies nicht die Aufgabe ist, die ich tun sollte, aber zumindest die Unordnung zu reduzieren, gab mir eine Art psychologische Belohnung, damit ich weitermachen konnte. Jetzt hat der Trick aufgehört zu funktionieren und ich habe noch 60% meiner Arbeit zu erledigen.

Ich bekam nach der Arbeit Kopfschmerzen und bekam nicht mehr das Gefühl der Zufriedenheit, das ich hatte - was mir normalerweise erlaubte, 10 Stunden hintereinander zu programmieren und mich immer noch frisch zu fühlen.

Dies ist nicht nur eine große Parole, denn ich habe tatsächlich eine Frage:

Gibt es eine Möglichkeit, produktiv zu bleiben und nicht gegen die Windmühlen zu kämpfen?

Gibt es irgendeine Art von psychologischer Trick zu bleiben konzentrierte sich auf die Aufgabe, anstatt zu denken , „Wie dumm ist das ?“ , Jedes Mal , wenn ich einen anderen cleveren Trick von der früheren Programmierer sehen? Das Problem beim Hinzufügen der Protokollierung besteht darin, dass ich wirklich verstehen muss, was der Code tut, und dies schadet meinem Gehirn auf unangenehme Weise.

Dan
quelle
Ungarische Notation ist nicht schlecht, lesen Sie die Originalarbeit, um zu sehen, wovon er sprach :)
Woot4Moo
14
Ich weiß, dass Ungarisch nicht schlecht ist. Genau aus diesem Grund habe ich Systems Hungarian geschrieben, nicht Apps Hungarian (das Original). Ich sehe keinen Sinn in der Verwendung von ungarischen Systemen in C #, weil es große Typ-System und IDE hat. Es objist entmutigend, 10 Variablen im selben Bereich zu haben, mit denen alle beginnen, weil sie im Grunde nicht lesbar sind.
Dan
2
Ich wünschte, ich könnte dieser Frage mehr als eine Stimme geben!
o6tech
9
Ich mache Dampf, indem ich mürrische Fragen stelle, die mich stören.
Erik Reppen

Antworten:

32

Es tut mir leid, es Ihnen zu sagen, aber nicht alle Jobs sind voller Sonnenschein und Glamour. Der Großteil der Entwicklungsaufgaben besteht aus solchen Plackereien. Traurig aber wahr.

Sie haben einen wichtigen Job zu erledigen, auch wenn es langweilig ist, dem Lack beim Trocknen zuzusehen. Es ist aus zwei Gründen wichtig: 1. Es fügt einem großen System die dringend benötigte Protokollierung hinzu, sodass Sie bei einem Fehler ein Tool zur Verfügung haben, mit dem Sie ihn leichter finden können. und 2. Es macht Sie mit der Codebasis vertraut, so dass Sie, falls und wenn etwas schief geht, hineinspringen und sie reparieren können.

Im Grunde erstellen Sie hier Ihr eigenes Sicherheitsnetz. Glamours, nein, aber wichtig ja!

Wie solltest du dich dann motivieren? Wenn ich bei der Arbeit eine geistesgestörte Aufgabe habe, setze ich mir Ziele. Beende die Aufgabe x bis zum Ende der Woche. Wenn ich mein Ziel mache, belohne ich mich. Neues Restaurant, das ich probieren möchte? Geh Freitag Nacht, wenn ich fertig bin. Neuer Film ist gerade erschienen? Sehen Sie es am Wochenende, wenn ich fertig bin.

Wenn ich mit meinem Vorgesetzten spreche und ihn / sie wissen lasse, wo ich mich befinde und wie ich mich weiterentwickle, bin ich dafür verantwortlich. Wenn ich ihnen sage, dass ich bis Freitag fertig sein werde, bin ich eher geneigt, es bis Freitag fertig zu machen. B / C Ich sagte ihnen, ich würde es tun lassen.

Behalten Sie die Gewissheit, dass, wenn Sie diese Aufgabe erledigt haben und sie gut, rechtzeitig und im Rahmen des Budgets erledigt sind, dass die Leute es bemerken werden, und wenn dieses neue Projekt auftaucht, Ihr Name möglicherweise nur als derjenige vorgeschlagen wird, der sie erhält. :)

Tyanna
quelle
Besonders gut gefällt mir die Sache mit der Freitagsmotivation. Es ist lustig, dass die aktuelle Version auch für Freitag geplant ist. Ich denke, es lohnt sich hinzuzufügen, dass Dankbarkeitsmotivation eine bewegende ist. Sie müssen sicherstellen, dass jemand für Ihre Arbeit dankbar ist, oder Sie müssen ändern, woran Sie arbeiten. Aufrichtiges Dankeschön lässt oft unruhige Stunden aufkommen.
Dan
1
@gaearon - Ich bin froh, dass die Vorschläge für Sie hilfreich sind. Mit einer guten Motivation durch die Strapazen zu kommen, wird sich am Ende auszahlen. Letztes Jahr musste ich bei meiner jetzigen Arbeit etwas Ähnliches tun wie Sie. In diesem Jahr bekam ich eine brandneue App zum Schreiben von Grund auf neu. Die Leute werden merken, was Sie tun und wie gut Sie arbeiten.
Tyanna
3
-1 Warum verbinden Sie Beruf und Privatleben? Dies hört sich an, als würde man I didn't finish my under-estimated task by Friday - so I need to stay at home and feel bad.
ständig
@Vorac ~ Ich sagte, das ist es, was ich tue, um mich zu motivieren. Jeder ist anders. Und ich kann Ihnen versichern, dass ich OT nicht konsequent arbeite. Finde etwas, das dich motiviert und nutze es. Ich finde, eine materielle Belohnung funktioniert am besten, wenn ich eine Aufgabe habe, die ich nicht tun möchte.
Tyanna
1
@IntegrityFirst ~ Für mich ja. Ich werde lange bleiben, um meine Aufgabenliste zu beenden. Ich werde meine Zeit einplanen, um sicherzugehen, dass ich es geschafft habe. Es ist meine Integrität für mich und meine Mitarbeiter, etwas zu erledigen, wenn ich sage, dass ich es erledigen werde. Wenn ich jedoch feststelle, dass in der angegebenen Zeit etwas nicht möglich ist, ändere ich den Plan und informiere meinen Vorgesetzten. Und wenn ich etwas später fertig bin, wird der Film / das Restaurant nächste Woche da sein. :)
Tyanna
30

Bewahren Sie eine Datei mit Kandidatencode-Ausschnitten für die Übermittlung an thedailywtf.com auf. Selbst wenn Sie nicht wirklich vorhaben, sie einzureichen, haben Sie eine gute Seite, wenn Sie einen Code finden, der sogar noch schlechter als der Durchschnitt ist.

Peter Taylor
quelle
Ich wünschte, ich könnte es noch einmal verbessern. Es stellte sich als wirklich großartiger Vorschlag heraus, jetzt, da ich feststellte, dass diese Jungs ihre Änderungsprotokolle in Anwendungskonfigurationsdateien direkt vor den tatsächlichen Einstellungen speichern.
Dan
24

Ich befand mich in einer ähnlichen Situation und hatte die Aufgabe, eine große Menge schlecht geschriebenen, massiv kopierten und eingefügten Codes zu entfernen.

Um meine Motivation und meinen Verstand zu wahren, schrieb ich ein Skript mit dem Namen current_scoreLOC, das den LOC im Projekt zählte (der stetig abnahm, da ich Doppelarbeit eliminierte und auf bessere Algorithmen umstellte) und ihn mit dem LOC verglich, als ich anfing. Wann immer ich entmutigt oder enttäuscht war von dem Berg von Code, dem ich gegenüberstand, current_scoregab mir das Laufen ein Gefühl von greifbarem Fortschritt und erinnerte mich daran, wie viel ich bereits erreicht hatte. Und es hat Spaß gemacht zu sehen, wie hoch die Punktzahl war, die ich erreichen konnte, wenn ich einen besonders schlechten Codeabschnitt anpackte.

Ich würde nach ähnlichen Metriken suchen, die Sie leicht schreiben können, um sich ein Gefühl für Fortschritt zu verschaffen und daraus eine Art Spiel zu machen. Codezeilen (einfach ausführen wc -l), zyklomatische Komplexität (die sinken sollte, wenn Sie diese bösen verschachtelten "ifs" bereinigen), Codezeilen, die Sie anstelle Ihres Vorgängers berührt haben (ich denke, dass FishEye Ihnen dies mitteilen kann) $ 10) usw. Sie können sogar ohne großen Aufwand ein Perl-Skript schreiben, um die Anzahl der Codeblöcke zu ermitteln, für die noch keine Protokollierungsanweisungen vorliegen.

Josh Kelley
quelle
Ich benutze SourceMonitor
UmNyobe
13

Ich habe dieses Buch empfohlen gesehen: Effektiv mit Legacy-Code arbeiten , musste es aber zum Glück nicht lesen.

Überarbeiten Sie genau wie Sie das, was Sie brauchen, damit Sie den Code verstehen und sich daran erinnern können, dass Sie ein System wiederbeleben, was sich auszahlt, wenn Sie es warten.
Das sollte hoffentlich eine Quelle für Ihren Schritt auf dem Heimweg sein.

StuperUser
quelle
2
In diesem Buch geht es darum, vorhandenen Code zu überarbeiten, um ihn testbar zu machen. Ich denke nicht, dass es in Bezug auf die Motivation viel helfen wird.
Billy ONeal
2
Guter Punkt @Billy ONeal, aber testbarer Code und die zugehörigen Metriken können Fortschritte zeigen, die motivierend sein könnten.
StuperUser
1
Ich habe dieses Buch gelesen. Auf jeden Fall lesenswert. Ich fand WEWLC tatsächlich motivierend, nur weil es schön war zu wissen, dass es jemanden da draußen gab, der genau die Art von Frustration verstand, die ich hatte, und effektive Wege gefunden hatte, um diese Frustrationen zu lindern.
Jason Swett
1
Das Buch ist ein bisschen alt und veraltet. Wenn Sie es nicht gelesen haben, warum empfehlen Sie es?
BЈовић
1
@StuperUser Während ich es lese, kann ich sagen, dass es veraltet ist, und kann Anfängern nützliche Ratschläge geben.
BЈовић
6

Versuchen Sie, das Projekt in Teile aufzuteilen. Erfahren Sie jeden Tag, wie ein bestimmter Block funktioniert. Der Versuch, alles auf einmal zu verstehen, ist wahrscheinlich das, was Sie herausfordert.

Seien Sie stolz darauf, das Projekt zu verbessern. Gibt es andere Programmierer, mit denen Sie sprechen können? Es ist hilfreich, um den Wasserkühler herumzustehen und über die neueste Logik zu lachen, die Sie gefunden haben. Ich versuche dies zu tun, um eine fröhliche Atmosphäre bei der Arbeit zu bewahren.

Davidhaskins
quelle
Ja, ich arbeite mit kleinen Stücken und arbeite bereits seit einiger Zeit daran, sodass ich eine ungefähre Vorstellung von jeder Komponente habe. Trotzdem hilft es nicht viel, weil es die winzigen Teile der Logik sind, die normalerweise Zeit brauchen, um verstanden zu werden - und ich ärgere mich, wenn ich feststelle, dass die 30-Zeilen-Methode, für die ich 10 Minuten aufgewendet habe, tatsächlich in zwei Zeilen umgeschrieben werden kann. Leider bin ich der einzige Entwickler in diesem Projekt und arbeite derzeit im Büro des Kunden, sodass ich niemanden finden kann, mit dem ich wirklich sprechen kann.
Dan
@gaearon - Was hindert Sie daran, Ihre 2-Zeilen-Lösung zu implementieren? Sie müssen herausfinden, wie das zu tun ist, wofür Sie beauftragt wurden. Das Problem mit dem Code kann später behoben werden, wenn Sie nicht im Büro des Kunden sind. Sie sollten Ihre Notizen darüber aufbewahren, was Sie getan haben und wie etwas funktioniert, damit Sie später darauf zurückgreifen und Ihre Änderungen implementieren können, damit Codeüberprüfungen und Integrationstests durchgeführt werden können.
Ramhound
@gaearon ah-ha! Du bist der einzige Kodierer. Der Typ vor dir war also der einzige Programmierer. Sie können mit viel davonkommen, wenn Sie der einzige Programmierer sind (wie Sie von Ihrem Vorgänger bemerkt haben). Denken Sie daran, wenn Sie nach Ihrem nächsten Job suchen. ;)
Davidhaskins
@ Ramhound Ich wette, es wird keine Code-Überprüfung geben. Ich wette, es wird keine formalen Integrationstests geben. Ich habe einige Male in diesen Positionen gearbeitet. Im Allgemeinen möchten Menschen nur Code, der gut genug funktioniert, und zwar so schnell wie möglich. "Best Practices" zu erklären, ist wie mit einer Wand zu sprechen, IMHO.
Davidhaskins
@Ramhound, es gibt keine Tests für dieses Projekt, und ich möchte nicht dafür verantwortlich sein, das System für saubereren Code zu ruinieren. In vielen Fällen impliziert der aktuelle Code, dass Ausnahmen verschluckt werden, oder stützt sich auf andere Arten von schlechtem Verhalten, die nicht offensichtlich sind. Dies ist übrigens einer der Gründe, warum ich die Protokollierung hinzufüge.
Dan
6

Machen Sie sich umfangreiche Notizen , um Ihre Fragen, Gedanken und Ihr Verständnis des Systems zu organisieren. Dies hat sich für mich beim Umgang mit großen Altsystemen als wunderbar erwiesen. Es hilft dabei, Ihr Verständnis zu kristallisieren, die offenen Fragen in Worte zu fassen, und da Ihre Gedanken bereits zusammengesetzt sind, ist es einfacher, spontan mit anderen über Probleme / Fragen / Ideen / etc. Zu kommunizieren.

Wenn ich zum Beispiel einen Teil des Codes durcharbeite, mache ich mir ständig Notizen. Das ist mein Gespräch mit mir. Das bloße Schreiben bringt mehr Gedanken zum Vorschein und hilft mir, die Dinge besser zu verstehen. Nach einer Weile habe ich vielleicht eine Eureka und muss ein kleines Diagramm mit dem "größeren Bild" auf Papier zeichnen, um zu veranschaulichen, woran ich gerade gedacht habe oder welche Teile ich gerade zusammengestellt habe. Ich mache das immer nur auf dem Papier, um alle Ablenkungen des Computers loszuwerden. Dadurch kann ich methodischer und nachdenklicher darüber nachdenken, was ich tue.

Dies ist im Grunde eine bequeme Möglichkeit, um ein ständiges Gespräch mit einem Domain-Experten zu führen :)

Doug T.
quelle
3

Ich weiß, dass Sie sich möglicherweise unproduktiv fühlen, weil Sie es aus der Perspektive von "Ich füge nur Protokollierung hinzu" betrachten, obwohl Sie Protokollierung hinzufügen und viele Umgestaltungen vornehmen. Ihr Vorgesetzter ist sich der Codesituation wahrscheinlich bewusst. Möglicherweise wissen es jetzt nicht alle zu schätzen, aber wenn Sie die Aufforderung erhalten, eine wirklich interessante und herausfordernde Funktion hinzuzufügen, sind Sie froh, dass Sie den Code bereinigt haben.

JeffO
quelle
Ich fürchte, ich werde das Projekt am Ende umschreiben, darüber haben wir bereits gesprochen. Obwohl mir diese Option besser gefällt, trägt sie nicht zur Produktivität bei der Bearbeitung von Wegwerfcode bei. Ich weiß, dass in der nächsten Version eine Protokollierung erforderlich ist, und dann kann ich mit meinen Sachen weitermachen, aber es macht mich nur verrückt, diesen Code durch den Kopf laufen zu lassen. Ich habe das Gefühl, dass ich langweilig werde, nachdem ich es verstanden habe :-)
Dan
1
"Es erhöht nicht die Produktivität bei der Arbeit an Wegwerf-Code" . Sie müssen große Teile des Codes durcharbeiten, um Ihr Verständnis zu verbessern, während Sie eine risikoarme Aufgabe ausführen (Protokollierung). Dieses Wissen, das Sie erlangen, hilft immens, wenn es um ein Umschreiben geht. Wenn es keine Umschreibung gibt, freuen Sie sich auf die Belohnung, die Sie erhalten, wenn Sie große Mengen der App bereinigt haben. Um wie viel besser ist die Codebasis aufgrund Ihrer beständigen Bemühungen.
Quentin-Starin
2

In diesen Fällen neige ich dazu, einen Codeabschnitt neu zu schreiben. Um einen Bereich weniger saugen zu lassen, füge ich nur einige hinzu, wo sonst. Dann bereinigen Sie noch etwas Code. Schlechter Code ist nur dann schlecht, wenn Sie ihn dort belassen.

Erin
quelle
Das System stützt sich stark auf schlechte Praktiken. Um eine Methode richtig umzuschreiben, müsste ich das gesamte Projekt umschreiben (was ich wahrscheinlich irgendwann tun werde, aber ich habe einige Fristen für die aktuelle Version).
Dan
Ja, ich verstehe, glaub mir. Ich nehme einfach einen Abschnitt heraus, den ich aufräumen kann, ohne mein Leben schmerzhaft zu machen, und räume ihn auf und dann den nächsten Bereich. Das Korrigieren von Code ist ein Vorgang, für den Sie nie Zeit bekommen, für den Sie sich aber immer Zeit nehmen sollten.
Erin
2

Gamifizieren Sie Ihre Arbeit. Geben Sie sich zum Beispiel jedes Mal 5 Punkte, wenn Sie eine gute Frage zum Code stellen, und 10 Punkte, wenn Sie ihn beantworten. Geben Sie sich jedes Mal ein Abzeichen, wenn Sie eine Methode überarbeiten oder eine neue Funktion hinzufügen. Sobald Sie genug Punkte gesammelt haben, erhalten Sie Privilegien wie Kaffeepausen oder Kekse. Sobald Sie das gesamte Projekt abgeschlossen haben, können Sie sich etwas gönnen, das Sie wirklich wollen.

Richie Cotton
quelle
0

Der Trick, sich nicht zu langweilen oder wütend zu werden, damit Sie produktiv bleiben, besteht darin, zu akzeptieren, dass der Code schlecht gestaltet ist. Wenn Sie akzeptieren, dass Sie den Code verstehen und aktualisieren müssen, können Sie nicht immer wieder kommentieren, wie dumm das ist, sondern ihn ruhig akzeptieren und weitermachen.

Ein weiterer Trick ist, ein gutes Zuhause zu haben, auf das man sich am Ende des Tages freuen kann. Freundin, Freunde, Spiele, alles wird funktionieren, um dir ein Ziel zu geben, durch den Tag zu kommen und den schlechten Code so gut wie möglich zu machen.

Tim
quelle
0

"Effektiv mit Legacy-Code arbeiten" von Michael Feathers kann hilfreich sein.

Wenn Sie befürchten, beim Ändern beschädigte Teile zu beschädigen, schreiben Sie zuerst einige Tests, und stellen Sie sicher, dass diese bestanden werden, bevor und nachdem Sie Änderungen vornehmen. Wenn Sie den Test schreiben, können Sie zusammenfassen und nachvollziehen, was ein bestimmter Code bewirkt, und Sie können ihn mit Zuversicht bearbeiten.

Stephen Paulger
quelle
Leider handelt es sich um ein SharePoint-Projekt, was bedeutet, dass es fast nicht testbar ist. Ich habe in der Vergangenheit einige coole Sandboxing-Dateien für SharePoint mit Microsoft Moles geschrieben, aber es erfordert viel zusätzliche Arbeit.
Dan