Wie kann man einen Schritt zurücktreten und Code mit neuen Augen betrachten? [geschlossen]


53

Ich habe das letzte Jahr als Ein-Mann-Team mit der Entwicklung einer Rich-Client-Anwendung verbracht (35.000+ LoC, für das, was es wert ist). Es ist derzeit stabil und in Produktion. Ich weiß jedoch, dass meine Fähigkeiten zu Beginn des Projekts verrostet waren, so dass es ohne Zweifel große Probleme im Code gibt. Zu diesem Zeitpunkt sind die meisten Probleme in Bezug auf Architektur, Struktur und Interaktionen aufgetreten - die einfachen Probleme, sogar Architektur- / Designprobleme, wurden bereits beseitigt.

Leider habe ich so viel Zeit mit diesem Projekt verbracht, dass es mir schwerfällt, darüber nachzudenken - mich ihm aus einer neuen Perspektive zu nähern, um die Fehler zu erkennen, die tief im Design vergraben oder inhärent sind.

Wie gehe ich über meinen Kopf und meinen Code hinaus, damit ich ein frisches Aussehen bekomme und es besser mache?


15
Bitte kreuzen Sie in Zukunft nicht mehr an . Wenn Sie beim Posten auf der falschen StackExchange-Site einen Fehler gemacht haben, melden Sie sich für die Migration und erläutern Sie, wo Sie sich zugehörig fühlen. Ein Moderator migriert die Frage dann für Sie.
maple_shaft

OK mach ich! :) Ein paar Leute hatten sich zum Schließen gemeldet, nicht zum Bewegen, also habe ich die gesamte Frage gelöscht und hierher gebracht.
BenCole

Jep! - Die Leute hatten auf die Schaltfläche "Schließen" geklickt, nicht auf die Schaltfläche "Markieren" (zumindest glaube ich, dass dies der Fall war). Von nun an werde ich es selbst melden und auf die Migration warten.
BenCole


IMO, wenn du keine Möglichkeiten findest, Dinge zu verbessern, dann weißt du nicht genug. Ich habe in der Vergangenheit einige wirklich großartige Designs entworfen, aber wenn ich später darauf zurückkomme, frage ich mich immer, warum ich etwas so Dummes tun würde. Sie können jedoch davon ausgehen, dass Ihr Design in Ordnung ist. Wenn Sie dann Funktionen hinzufügen und es schwierig war, dann finden Sie heraus, wie Sie es einfach hätten machen können.
Dunk

Antworten:


46

Möglichkeiten, dies zu erreichen:

  • Finden Sie jemanden, der mit dem Technologie- und Geschäftsproblem vertraut ist, und besprechen Sie es. Dies mag in einem Ein-Personen-Team schwierig sein, ist jedoch im Allgemeinen die beste Option.
  • Arbeiten Sie eine Weile an einem anderen Projekt. Dies kann auch schwierig sein, aber selbst eine Woche Pause kann Ihnen eine neue Perspektive geben.
  • Schauen Sie sich ähnliche Projekte oder Produkte an, z. B. Open Source-Produkte, falls vorhanden. Achten Sie darauf, den Code nicht zu kopieren, aber sie haben die Idee möglicherweise ganz anders angegangen.
  • Lerne eine neue Sprache, Bibliothek oder ein neues Framework. Die Techniken geben Ihnen möglicherweise einen Einblick, wie Sie dieselben Probleme unterschiedlich angehen können.
  • Lesen Sie ein gutes Buch / Blog / Magazin über Design oder die Sprache / das Framework. Ich bin mir nicht sicher, auf welchem ​​Niveau Sie sind, aber es gibt viele Alternativen in anderen Antworten auf dieser Website.

Wenn Sie spezifische Beispiele haben, die Sie ansprechen möchten, können Sie diese hier posten.


6
+1 eine neue Sprache / ein neues Framework lernen. Wenn Sie in einer Skriptsprache arbeiten, lernen Sie eine objektorientierte. Wenn OO, lernen Sie eine funktionale (lisp-ish). +1 Lesen - insbesondere Datenstrukturen, Entwurfsmuster, Refactoring und Best Practices. Lesen Sie die Joel on Software-Bücher, falls Sie dies noch nicht getan haben. Ich würde auch Benutzergruppen empfehlen und diese Seite, um Sie immer wieder neuen Ideen auszusetzen. Wenn die ACM in Ihrer Nähe Vorträge hält, nehmen Sie teil!
GlenPeterson

2
Insbesondere für die Sprachen, wenn Sie es noch nicht gelernt haben, lernen Sie Haskell, ich dachte, jeder übertreibt und ist ein Fan von dem, wie es die Art und Weise, wie Sie mit Programmierproblemen umgehen, grundlegend verändern wird. Als guter Wissenschaftler habe ich meine Hypothese auf die Probe gestellt, indem ich sie gelernt habe. Ich habe mich so geirrt. Sie werden Ihr aktuelles Design anders danach nähern , wenn Sie Haskell nicht bereits gelernt.
Jimmy Hoffa

1
Zur Konferenz gehen sollte hier hinzugefügt werden, IMO. Siehe meine ausgearbeitete Antwort unten.
Macke

+1 für ein anderes Projekt. Probieren Sie etwas völlig anderes aus, als Sie es täglich tun. Hier finden Sie einige Parallelen sowie eine neue architektonische Herausforderung.
Kronzeugenregelung

13

Rubber Duck Debugging : Setzen Sie sich mit einem Stück Code oder einem Modul oder einer Funktion hin und erklären Sie es laut. Wenn Sie feststellen, dass Sie etwas sagen, das sich falsch, dumm oder einfach nicht richtig anhört, schreiben Sie es als zu untersuchendes Problem auf.


9

Lernen Sie weiter und erweitern Sie Ihre Fähigkeiten. Es ist schwer zu wissen, was du nicht weißt, aber wenn du es siehst, wird dich dieser "Aha" -Moment treffen. Es könnte durch das Erlernen einer anderen Sprache oder eines anderen Entwurfsmusters entstehen.

Sie werden gebeten, eine Änderung vorzunehmen. Möglicherweise finden Sie Teile Ihres Codes, die nicht so flexibel sind und viel Nacharbeit erfordern. Dies ist nicht unbedingt ein Fehler, da Sie zunächst nicht an alles denken können.

Die Benutzer werden anfangen, sich zu beschweren. Gerade wenn du denkst, dass alles großartig ist ...


7

Eine kurze Erinnerung hilft. Ich war bekannt dafür, mich über den "Idioten" zu beschweren, der vor einer Woche etwas verändert hat, nur um herauszufinden, dass ich es war.

Ein guter erster Schritt besteht darin, Code zu identifizieren, der verbessert werden könnte. Suchen Sie in Ihrer Quellcodeverwaltung nach den Dateien, die sich am häufigsten ändern. Mit welchem ​​Code ist es am schwierigsten zu arbeiten? Welcher Code produziert die meisten Fehler? Welche Arten von Änderungen verursachen einen Ripple-Effekt im gesamten Code? Zu diesem Zeitpunkt müssen Sie nicht wissen, warum der Code störend ist , sondern nur, dass er störend ist.

Wenn Sie die Bereiche identifiziert haben, an denen gearbeitet werden soll, versuchen Sie herauszufinden, wo das Problem tatsächlich liegt. Es gibt Bücher, die einen systematischen Ansatz zur Kategorisierung von Designproblemen verfolgen. Schauen Sie sich Martin Fowlers Refactoring , Herb Sutters C ++ - Codierungsstandards , Robert Martins Clean Code usw. an. Sie haben eine Reihe von "Regeln", mit denen Sie Ihren Code objektiv betrachten können.

Sobald Sie das wahrscheinliche Problem erkannt haben, können Sie es auf verschiedene Arten beheben. Wenn Sie beispielsweise die Regel "Komposition gegenüber Vererbung bevorzugen" gebrochen haben, ändern Sie sie in Komposition und sehen Sie, wie sie sich anfühlt.

Natürlich kann es hilfreich sein, wenn sich jemand anders den Code ansieht, aber es ist nicht immer so hilfreich, wie Sie vielleicht denken, da Sie mit den Arten von Problemen, die der Code verursacht, und den Gründen für das Design viel besser vertraut sind als jeder andere . Das Erlernen einiger Methoden zur objektiven Bewertung Ihres eigenen Designs zahlt sich aus.


3
+10 für die Ehrlichkeit des Kommentars "Idiot". :)
Jennifer S

2
Im Zusammenhang mit dem auf Regeln basierenden Ansatz können statische Analysetools (z. B. Lint für C, JsLint für JavaScript, Findbugs für Java, FxCop für .NET) häufig nützliche Hinweise geben und Codemetriken (z. B. zyklomatische Komplexität, LCOM4) zeigen Sie, welche Teile des Codes möglicherweise problematisch sind. Natürlich sollten Sie immer Ihr Gehirn benutzen und die Ratschläge solcher Werkzeuge mit einem Körnchen Salz befolgen.
Daniel Pryden

4

Lassen Sie Ihren Code von einer anderen Person überprüfen. Wenn Sie keine andere Person zum Anschauen finden, schreiben Sie eine vollständige Beschreibung der Interaktion auf, so als würden Sie sie einer anderen Person zeigen. Der Versuch, Ihre Entscheidungen einer anderen Person zu erklären (auch wenn er nur zu Übungszwecken dient), kann Ihnen dabei helfen, wirklich zu überlegen, WARUM Sie die Dinge auf eine bestimmte Art und Weise tun, und Ihnen dabei helfen, mögliche Lücken in Ihrer Logik zu erkennen.


3
Ich finde es hilfreich, Dinge auch einer nicht-technischen Person zu erklären. Wenn ich einem Nicht-Programmierer das Design verständlich machen und zufriedenstellend erklären kann, warum man eine Fensterfabrik-Fabrik-Fabrik braucht, dann wäre es vielleicht gut, eine Fensterfabrik-Fabrik-Fabrik zu verwenden.
Leif Carlsen

4

Ich kenne diese Situation sehr gut. Wenn ich so feststecke, versuche ich, verschiedene Sichtweisen auf das Projekt zu vertreten.

1.) Sichtweise Benutzer / Kunde - Feedback verwenden

Leider sind wir in unserem Code so gefangen, dass wir unsere eigenen Fehler nicht erkennen können, weil wir unsere Anwendungen so verwenden, wie wir sie codiert haben. Schauen Sie sich an, wie Benutzer es verwenden, und versuchen Sie, die intuitivste Benutzerführung zu finden. Spielen Sie mit UI-Prototypen. Dies scheint Spaß zu machen, aber wenn Sie herausfinden, dass Sie gezwungen wären, große Teile Ihres Codes neu zu codieren, indem Sie einfach die Verwendungslogik ändern, ist es Zeit, einen Neugestaltungszyklus zu starten.

2.) Führen Sie eine Funktionsanalyse Ihres Codes durch und visualisieren Sie diesen

Einige IDEs und Frameworks fordern Sie auf, zB UI- und Backend-Code zu mischen. Wenn Sie dies zulassen, werden Sie eines Tages mit der Situation konfrontiert sein, dass Ihre Codebasis aufgrund nebulöser und schwer zu brechender Abhängigkeiten kaum mehr gewartet werden kann. Insbesondere das Mischen von UI-Code mit anderem Code kann zu Spaghetti-Code und redundanten Funktionen führen. Teilen Sie Ihren Code in Funktionsblöcke wie z. B. Datenbankklassen, Kommunikationsklassen, UI-Klassen, Kernklassen usw. ein und geben Sie den Funktionsblöcken sprechende Namen. Visualisieren Sie dann die Funktionalität mit einem grafischen Tool (ich verwende ein Mind-Mapping-Tool), um herauszufinden, ob Ihre Struktur logisch und modular genug ist, dass Sie riesige Codeblöcke für verschiedene Projekte wiederverwenden und sie durch neuere Versionen ohne ersetzen können große Schmerzen.

Nach meiner Erfahrung ist es am besten, ein Dokument zu erstellen, das alle Abhängigkeiten zwischen Ihren Klassen und deren Aufrufen aus Ihrem Code sichtbar macht. Das Ergebnis ist eine Visualisierung Ihres Interface-Designs. Wenn diese Codezuordnung wie ein kompletter Cluster aussieht, ist es Zeit zu handeln. Wenn dies noch nicht geschehen ist, sollten Sie sich eine geeignete Namenskonvention überlegen, die Ihre Codestruktur so darstellt, dass Sie nicht darüber nachdenken müssen, wie Sie sie aufrufen und wie sie funktioniert.

3.) Verwenden Sie gemeinsame Ansätze zur Qualitätssicherung

Mein Favorit ist die FMEA. In Bezug auf die Codierung bedeutet dies nicht nur zu analysieren, was in der Vergangenheit schief gelaufen ist, sondern auch darüber nachzudenken, was schief gehen könnte. Ein häufig vorkommendes Beispiel ist eine plötzlich unterbrochene Netzwerkverbindung. Danach können Sie die Fehlerbedingungen nach Folgen wie Datenverlust, Absturz, falscher Berechnung klassifizieren und die Auswirkungen auf den Benutzer beurteilen. Wenn dies noch nicht geschehen ist, können Sie mithilfe optimierter Fehler- und Ausnahmeklassen und -routinen Ihren Code sauber und einfach halten. Am besten implementieren Sie diese in jeden neuen Code, bevor Sie überhaupt etwas anderes schreiben. (Nun, ich bin schuld, diesen Rat nicht immer selbst zu befolgen.)

Außerdem half es mir, eine "Verbesserungsvorschlagsliste" für meinen eigenen Code zu erstellen und regelmäßig zu aktualisieren. (Um ehrlich zu sein, meine Projekte enthalten immer noch eine Menge Code, auf den ich definitiv nicht stolz bin.) Ich versuche mir auch die Zeit zu nehmen, um Best-Practice-Code aus API-Dokumentationen, Entwicklerkonferenzen oder Entwicklermagazinen zu sammeln und zu betrachten.

Bis zu diesem Zeitpunkt müssen Sie Ihren Code nicht berühren. Es geht einfach darum, sich darüber im Klaren zu sein, was falsch läuft, und einen Weg zu finden, wie Sie Ihren Code verbessern können.

Zum Schluss noch ein paar Tipps für die tägliche Arbeit von einem alten Furz. Versuchen Sie zu vermeiden, mehr zu beißen, als Sie essen können. Dies führt zu einem zu hohen Druck für eine saubere Codierung. Sie haben selten die Zeit, es richtig zu machen, aber Sie müssen sich die Zeit nehmen, um die Fehler danach zu beheben.

Nichts ist so langlebig wie die vorläufige Lösung, aber wenn es kaputt geht, ist es oft zu spät, es rechtzeitig zu beheben. Beispiele sind böse Hacks oder seltsame Ausnahmen, die ich verwendet habe, um etwas zum Laufen zu bringen, obwohl z. B. das zugrunde liegende Framework oder das Betriebssystem fehlerhaft waren. Und dann wird der Fehler behoben oder die neue Version löscht einfach die API ...

Wenn Sie nicht weiterkommen und gezwungen sind, eine Problemumgehung zu finden, machen Sie Kommentare und machen Sie sich Notizen, die von Zeit zu Zeit überprüft werden sollten. Normalerweise werden wir immer besser, weil wir etwas Neues lernen. Wenn Sie einen besseren Weg finden, setzen Sie ihn so schnell wie möglich um. Andernfalls codieren Sie möglicherweise die Problemumgehung für die Problemumgehung und die Ausnahme der Ausnahme eines Tages. (Wer unter euch ohne Sünde ist, der werfe das erste Byte auf mich.)


2

Schwitzen Sie nicht die kleinen Sachen.

Jeder könnte besser codieren. Wir erledigen die Dinge schnell und stellen einige Wochen später fest, dass es effizienter hätte sein können. Der Punkt ist, dass 90% Ihres Codes wahrscheinlich gut genug ist.

Durchsuchen Sie Ihre Fehlerprotokolle und finden Sie die Routinen, die möglicherweise Probleme verursachen. Wenn Sie die Fehler finden, können Sie auch den Code überprüfen und darüber nachdenken, was den Code effizienter machen könnte. Meistens werden Sie feststellen, dass Sie nicht in der Lage sind, den Fehler selbst zu beheben, sondern auch keine spürbare Verbesserung erzielen können. Manchmal werden Sie jedoch feststellen, dass es eine bessere Möglichkeit gibt, etwas zu tun.

Sprechen Sie mit Benutzern und sehen Sie, wo sie Probleme bemerken, entweder UX- oder Geschwindigkeitsprobleme. Beheben Sie diese Probleme, indem Sie versuchen, Ihren Code zu verbessern.

Irgendwann werden Sie feststellen, dass Ihr Code zu spröde geworden ist und es einfach keine Möglichkeit gibt, die Änderungen vorzunehmen, die Sie vornehmen müssen. Überlegen Sie sich dann, wie Sie das System flexibler machen könnten, entweder über APIs oder durch testgetriebene Entwicklung. In vielen Fällen werden Sie feststellen, dass Sie mit dem Einfügen dieser APIs in den Code ohne große Änderungen beginnen können. In anderen Fällen werden Sie feststellen, dass sich die Mühe, den Code zu verbessern, nicht lohnt.

Inkrementelle Änderungen können schwierig sein. Das Ziel besteht darin, die Codebasis nicht vollständig neu zu schreiben, wenn dies nicht erforderlich ist. Sicher, Sie sind jetzt ein besserer Programmierer als vor einem Jahr, aber was Sie haben, muss jetzt funktionieren. In 5 Jahren, wenn sich ein Junior-Programmierer bei Ihnen über den Legacy-Code beschwert, muss er versuchen, ihn zu reparieren, nur lächeln und nicken und nicht zugeben, dass Sie ihn geschrieben haben.


1

Haben Sie darüber nachgedacht, ein Unternehmen zu verlassen und zu finden, in dem Sie ein Team bilden können? Ich bin der festen Überzeugung, dass den Entwicklern isoliert oder in einem stagnierenden Team vieles entgeht, was der Beruf zu bieten hat.

Peer Reviews lassen Sie jemanden, der sich bereits außerhalb Ihres Kopfes befindet, beraten. Stack Exchange Code Review ist möglicherweise ein guter Ort, um Code zu überprüfen, der für Ihr Unternehmen nicht besonders geschützt ist. Es kann wahrscheinlich keine großen Blöcke verarbeiten, aber viele Programme bestehen aus viel einfachem Code und anderem Code, der nicht einfach ist und viele Probleme verursacht. Wenn Sie ein Beispiel für einen typischen Code haben, der jedoch an vielen Stellen wiederholt und geändert wird, ist er möglicherweise auch ein guter Überprüfungskandidat. Wenn Sie beispielsweise Nachrichten formatieren, sollten Sie nicht alle Nachrichten überprüfen lassen, sondern nur eine recht komplexe Beispielnachricht.

Wenn Sie objektiver mit Ihrem eigenen Code umgehen möchten, können Sie ihn vermutlich mit einem Codierungsstandard vergleichen, statische oder dynamische Codeprüfungen ausführen oder wenn Sie nur spärlich dokumentiert sind, können Sie möglicherweise Kommentare hinzufügen.

Es gibt eine Testpsychologie, die es schwierig macht, Ihren eigenen Code zu testen, aber wir versuchen auf jeden Fall unser Bestes, um dies während des Unit-Tests zu tun. Das Lesen Ihres eigenen Codes kann ein ähnliches oder noch schlimmeres Problem sein. In vielen Bereichen werden Mentoren, Leistungsbeurteiler, Trainer usw. eingesetzt. Dies gilt auch für Architekten, Systemingenieure und Tester. Kunden, die Zugriff auf ein Tool zur Fehlerberichterstattung oder eine Kundendienstabteilung haben, geben Ihnen Feedback von außerhalb Ihres Kopfes, sobald das Produkt auf den Markt gebracht wurde. Dies ist ein weiterer wichtiger Grund für Agiles Ansatz, früh und häufig zu veröffentlichen. Sie sind zwar der einzige Entwickler in Ihrem Unternehmen, aber es gibt Personen, die von Ihrem Code betroffen sind und Ihnen aus einem bestimmten Blickwinkel Feedback dazu geben können.


0

"Ist das ein kleineres Problem als ich denke, oder ist das auch ein Problem für andere?"

Meine Güte. Genug jetzt. Wenn der Code fehlerfrei ist und das tut, was er tun soll, ist Architektur unwichtig. Zumindest für jetzt.

Wir alle lernen hoffentlich, während wir gehen. Ich habe eine Menge Code geschrieben, auf den ich zu dem Zeitpunkt, als ich ihn schrieb, stolz war, nur um zu entscheiden, dass er ein oder zwei Jahre später schrecklich war. Im Moment arbeite ich an einem mehrjährigen Projekt, das mit unglaublich kniffligem Code gefüllt ist, aber der Code funktioniert. Ich gehe sehr konservativ vor, wenn es darum geht, etwas davon anzufassen.

Und das solltest du auch. Wenn Sie nach einem Jahr Arbeit im Moment keine größeren architektonischen Probleme sehen, kann es sicher sein, dass Sie vorerst davon ausgehen, dass es keine wichtigen gibt. Das ist keine schlechte Handwerkskunst. Es geht voran.


0

Zusätzlich zu anderen Antworten würde ich empfehlen, an einer Entwicklerkonferenz teilzunehmen.

Dadurch werden Sie vielen Themen und Personen ausgesetzt, die Sie zum Nachdenken über Ihre eigene App und Ihren Arbeitsplatz anregen. Zumal sie darüber reden werden, was funktioniert und nicht für dann und welche Probleme auftauchen. Es besteht eine große Wahrscheinlichkeit, dass sich Ihre App überschneidet.

Nehmen Sie sich dafür vorzugsweise 3 Tage Zeit. Ich habe festgestellt, dass dies lang genug ist, um die notwendige mentale Distanz zu meiner eigenen Arbeit zu schaffen und sie (sozusagen) mit den Augen einer größeren Gemeinschaft zu betrachten, anstatt mit meinen eigenen.

Dies gilt im Übrigen auch für Teams von Menschen, da Gruppendiskussionen überall vorkommen können.

Wenn Sie dafür keine Genehmigung erhalten, z. B. einmal pro Jahr, wechseln Sie den Job.


-1
  • Üben Sie Designmuster und Best Practices
  • Wählen Sie ein Framework, Tools, Pakete usw. basierend auf Ihren App-Anforderungen und -Bedürfnissen. Dazu müssen Sie viele Etch-Blogs lesen und Lösungen für jedes einzelne technische Problem finden
  • Erstelle einen Entwurf für Design / Architektur und diskutiere mit jemandem, der sich mit technischen / architektonischen Dingen auskennt. Verbessern Sie diesen Entwurf mithilfe von Feedback und Kommentaren. Mach so weiter, bis du einen stabilen Zustand erreicht hast.
  • Implementieren Sie Code so, dass alles, was die App benötigt, konfigurierbar und wartbar ist

    Neuarchitektur und Neuimplementierung Ihres Projekts führen definitiv zu einer besseren Konsistenz, Leistung usw. der App.


-1

Ich glaube, dass es hilfreich ist, die Bedenken mit ein paar klugen Leuten auszuräumen. Es muss spezifische Informationen geben. Ist es eine 24x7x365 Website? LoB App? Wo läuft es oder wird es gehostet?

Sobald Sie sich mit den Kernzielen und den gewünschten Ergebnissen befasst haben, können andere dazu beitragen, Ihre Aufmerksamkeit zu fokussieren und zu lenken. Ihr Code ist möglicherweise der beste Code, der jemals für eine bestimmte Aufgabe geschrieben wurde - oder der schlechteste. Es ist wirklich egal - wie wirkt sich das auf das gewünschte Ziel aus?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.