Angenommen, es gibt zwei mögliche Lösungen für ein Problem: Die erste ist schnell, aber hackig; Die zweite ist vorzuziehen, würde aber länger dauern, um sie zu implementieren. Sie müssen das Problem schnell lösen, damit Sie den Hack so schnell wie möglich einrichten und anschließend mit der Arbeit an der besseren Lösung beginnen können. Das Problem ist, dass das Problem, sobald es behoben ist, auf der To-Do-Liste landet. Sie planen immer noch, irgendwann die bessere Lösung einzuführen, aber es ist schwer zu rechtfertigen, sie jetzt zu implementieren. Plötzlich stellen Sie fest, dass Sie fünf Jahre damit verbracht haben, die nicht perfekte Lösung zu verwenden, und sie dabei verflucht haben.
Kommt Ihnen das bekannt vor? Ich weiß, dass es mehr als einmal passiert ist, wo ich arbeite. Ein Kollege beschreibt, wie er absichtlich eine schlechte Benutzeroberfläche erstellt, damit diese langfristig nicht versehentlich übernommen wird. Hast du eine bessere Strategie?
quelle
Antworten:
Schreiben Sie einen Testfall, bei dem der Hack fehlschlägt.
Wenn Sie keinen Test schreiben können, bei dem der Hack fehlschlägt, ist entweder am Hack nichts auszusetzen, oder Ihr Test-Framework ist unzureichend. Wenn erstere, laufen Sie schnell weg, bevor Sie Ihr Leben mit unnötiger Optimierung verschwenden. Wenn letzteres der Fall ist, suchen Sie einen anderen Ansatz (entweder zum Markieren von Hacks oder zum Testen ...).
quelle
Strategie 1 (fast nie ausgewählt): Implementieren Sie die Kluge nicht. Lassen Sie die Leute nicht einmal wissen, dass dies eine Möglichkeit ist. Mach es einfach beim ersten Mal richtig. Wie ich bereits sagte, wird dieser aus zeitlichen Gründen fast nie ausgewählt.
Strategie 2 (unehrlich): Lügen und Betrügen. Teilen Sie dem Management mit, dass der Hack Fehler enthält, die später zu größeren Problemen führen können. Leider sagen die Manager die meiste Zeit nur, sie sollen warten, bis die Fehler zu einem Problem werden, und dann die Fehler beheben.
Strategie 2a: Wie Strategie 2, außer dass es wirklich Fehler gibt. Das gleiche Problem.
Strategie 3 (und mein persönlicher Favorit): Entwerfen Sie die Lösung, wann immer Sie können, und machen Sie es gut genug, dass ein Praktikant oder Code-Affe es tun könnte. Es ist einfacher zu rechtfertigen, den kleinen Betrag an Code-Monkey-Geld auszugeben, als Ihr eigenes Gehalt zu rechtfertigen, sodass es möglicherweise einfach erledigt wird.
Strategie 4: Warten Sie auf ein Umschreiben. Warte noch. Früher oder später (wahrscheinlich später) muss jemand das Ding neu schreiben. Könnte es auch richtig machen.
quelle
Hier ist ein großartiger Artikel über technische Schulden .
Grundsätzlich ist es eine Analogie der Verschuldung mit allen technischen Entscheidungen, die Sie treffen. Es gibt gute und schlechte Schulden ... und Sie müssen die Schulden auswählen, die die gewünschten Ziele mit den geringsten langfristigen Kosten erreichen.
Die schlimmste Art von Schulden sind kleine, kleine Abkürzungen, die mit Kreditkartenschulden vergleichbar sind ... jede tut nicht weh, aber ziemlich bald bist du im armen Haus.
quelle
Dies ist ein wichtiges Problem bei termingerechten Arbeiten. Ich finde, dass das Hinzufügen sehr detaillierter Kommentare darüber, warum dieser Weg gewählt wurde, und einige Hinweise, wie er codiert werden sollte, helfen. Auf diese Weise sehen Leute, die den Code betrachten, ihn und halten ihn frisch.
Eine weitere Option, die funktioniert, ist das Hinzufügen einer bug.feature in Ihrem Tracking-Framework (Sie haben eine, oder?), Die die Überarbeitung detailliert beschreibt. Auf diese Weise ist es sichtbar und kann das Problem irgendwann erzwingen.
quelle
Das einzige Mal, dass Sie das Reparieren dieser Dinge rechtfertigen können (weil sie nicht wirklich kaputt sind, nur hässlich), ist, wenn Sie eine andere Funktion oder Fehlerbehebung haben, die denselben Codeabschnitt berührt, und Sie können sie genauso gut neu schreiben.
Sie müssen rechnen, was die Zeit eines Entwicklers kostet. Wenn die Softwareanforderungen erfüllt werden und das einzige, was falsch ist, ist, dass der Code unter der Haube peinlich ist, lohnt es sich nicht wirklich, ihn zu reparieren.
Ganze Unternehmen können ihr Geschäft aufgeben, weil eifrige Ingenieure jedes Jahr oder so auf einer Neuarchitektur bestehen, wenn sie nervös werden.
Wenn es fehlerfrei ist und die Anforderungen erfüllt, ist es erledigt. Es versenden. Mach weiter.
[Bearbeiten]
Natürlich befürworte ich nicht, dass immer alles gehackt wird. Sie müssen den Code im normalen Verlauf des Entwicklungsprozesses sorgfältig entwerfen und schreiben. Wenn Sie jedoch Hacks haben, die nur schnell durchgeführt werden mussten, müssen Sie eine Kosten-Nutzen-Analyse durchführen, um festzustellen, ob es sich lohnt, den Code zu bereinigen. Wenn Sie im Laufe der Lebensdauer der Anwendung mehr Zeit damit verbringen, einen unordentlichen Hack zu programmieren, als Sie hätten, dann reparieren Sie ihn natürlich. Wenn nicht, ist es viel zu teuer und riskant, eine funktionierende, fehlerfreie Anwendung neu zu codieren , nur weil Sie krank werden, wenn Sie sich die Quelle ansehen.
quelle
SIE MACHEN KEINE ZWISCHENLÖSUNGEN.
Manchmal denke ich, dass Programmierern dies nur gesagt werden muss.
Tut mir leid, aber im Ernst - eine hackige Lösung ist wertlos und kann bereits bei der ersten Iteration länger dauern, als einen Teil der Lösung korrekt auszuführen.
Bitte hör auf, mir deinen Mistcode zu hinterlassen, um ihn zu pflegen. CODE ES IMMER RICHTIG. Egal wie lange es dauert und wer dich anschreit.
Wenn Sie dort sitzen und Ihre Daumen drehen, nachdem Sie früh geliefert haben, während alle anderen ihre dummen Hacks debuggen, werden Sie mir danken.
Auch wenn Sie nicht glauben, ein großartiger Programmierer zu sein, bemühen Sie sich immer, das Beste zu geben, nehmen Sie niemals Abkürzungen - es kostet Sie KEINE Zeit, es richtig zu machen. Ich kann diese Aussage rechtfertigen, wenn Sie mir nicht glauben.
quelle
Wenn Sie es verfluchen, warum steht es am Ende der TODO-Liste?
quelle
quelle
Es ist ein harter Anruf. Ich habe getan , Hacks persönlich führen, manchmal Sie MÜSSEN , um dieses Produkt aus der Tür bekommen und in die Kunden Hände. Die Art und Weise, wie ich mich darum kümmere, ist jedoch, es einfach zu tun.
Sagen Sie dem Projektleiter, Ihrem Chef oder dem Kunden: Es gibt einige Stellen, die bereinigt und besser codiert werden müssen. Ich brauche eine Woche, um es zu tun, und es wird jetzt weniger kosten, es zu tun, dann wird es in 6 Monaten sein, wenn wir eine Erweiterung auf dem Subsystem implementieren müssen.
quelle
Normalerweise ergeben sich solche Probleme aus einer schlechten Kommunikation mit dem Management oder dem Kunden. Wenn die Lösung für den Kunden funktioniert, sieht er keinen Grund, eine Änderung zu beantragen. Daher müssen sie über die Kompromisse informiert werden, die Sie zuvor getroffen haben, damit sie zusätzliche Zeit einplanen können, um die Probleme zu beheben, nachdem Sie die schnelle Lösung implementiert haben.
Wie es zu lösen ist, hängt ein wenig davon ab, warum es eine schlechte Lösung ist. Wenn Ihre Lösung schlecht ist, weil es schwierig ist, sie zu ändern oder zu warten, ist dies der richtige Zeitpunkt, um auf eine bessere Lösung zu aktualisieren, wenn Sie zum ersten Mal Wartungsarbeiten durchführen müssen und etwas mehr Zeit haben. In diesem Fall ist es hilfreich, wenn Sie dem Kunden oder Ihrem Chef mitteilen, dass Sie überhaupt eine Verknüpfung erstellt haben. Auf diese Weise wissen sie, dass sie beim nächsten Mal keine schnelle Lösung erwarten können. Das Verdreifachen der Benutzeroberfläche kann ein guter Weg sein, um sicherzustellen, dass der Kunde zurückkommt, um Probleme zu beheben.
Wenn die Lösung schlecht ist, weil sie riskant oder instabil ist, müssen Sie wirklich mit der Person sprechen, die die Planung durchführt, und etwas Zeit einplanen, um das Problem so schnell wie möglich zu beheben.
quelle
Viel Glück. Nach meiner Erfahrung ist dies fast unmöglich zu erreichen.
Sobald Sie den rutschigen Hang hinuntergehen, um einen Hack zu implementieren, weil Sie unter Druck stehen, können Sie sich genauso gut daran gewöhnen, für alle Zeiten damit zu leben. Es bleibt fast NIE genug Zeit, um etwas zu überarbeiten, das bereits funktioniert, egal wie schlecht es intern implementiert ist. Was lässt Sie denken, dass Sie "zu einem späteren Zeitpunkt" auf magische Weise mehr Zeit haben werden, um den Hack zu beheben?
Die einzige Ausnahme, die ich mir von dieser Regel vorstellen kann, ist, wenn der Hack Sie vollständig daran hindert, eine weitere Funktionalität zu implementieren, die von einem Kunden benötigt wird. Dann haben Sie keine andere Wahl, als die Überarbeitung durchzuführen.
quelle
Ich versuche, die Hacky-Lösung so zu erstellen, dass sie so schmerzlos wie möglich auf langfristige Weise migriert werden kann. Angenommen, Sie haben einen Mann, der eine Datenbank in SQL Server erstellt, weil dies seine stärkste Datenbank ist, aber Ihr Unternehmensstandard ist Oracle. Erstellen Sie die Datenbank mit möglichst wenigen nicht übertragbaren Funktionen (wie Bit-Datentypen). In diesem Beispiel ist es nicht schwer, Bittypen zu vermeiden, aber es erleichtert den späteren Übergang.
quelle
Informieren Sie jeden, der für die endgültige Entscheidung verantwortlich ist, warum die hackige Art, Dinge zu tun, auf lange Sicht schlecht ist.
Grundsätzlich haben Leute, die Software nicht verstehen, nicht das Konzept, Dinge zu überdenken, die bereits funktionieren. So wie sie es sehen, sind Entwickler wie Mechaniker, die jedes Mal, wenn jemand eine Funktion hinzufügen möchte, die für sie verrückt klingt, das gesamte Auto auseinander nehmen und wieder zusammenbauen möchten.
Es hilft, Analogien zu alltäglichen Dingen zu machen. Erklären Sie ihnen, wie Sie bei der Zwischenlösung Entscheidungen getroffen haben, die für einen schnellen Bau geeignet sind, anstatt stabil, wartbar usw. zu sein. Es ist, als würde man mit Holz anstelle von Stahl bauen, weil Holz leichter zu schneiden ist und somit Sie könnten die Zwischenlösung schneller erstellen. Das Holz kann jedoch das Fundament eines 20-stöckigen Gebäudes einfach nicht tragen.
quelle
Wir verwenden Java und Hudson für die kontinuierliche Integration. 'Zwischenlösungen' müssen kommentiert werden mit:
Jedes Mal, wenn Hudson einen Build ausführt, wird ein Bericht über jedes TODO- Element bereitgestellt , sodass wir eine aktuelle, gut sichtbare Aufzeichnung aller ausstehenden Elemente haben, die verbessert werden müssen.
quelle
Gute Frage. Das stört mich auch sehr - und meistens bin ich die einzige Person, die für die Priorisierung von Themen in meinen eigenen Projekten verantwortlich ist (yep, kleines Unternehmen).
Ich fand heraus, dass das Problem, das behoben werden muss, normalerweise nur eine Teilmenge des Problems ist. IOW, der Kunde, der dringend eine Lösung benötigt, muss nicht das gesamte Problem lösen, sondern nur einen Teil davon - kleiner oder größer. Dadurch kann ich manchmal eine Problemumgehung erstellen, die nicht für das gesamte Problem, sondern nur für die Teilmenge des Kunden geeignet ist und die es mir ermöglicht, das größere Problem im Issue-Tracker offen zu lassen.
Das gilt natürlich möglicherweise überhaupt nicht für Ihre Arbeitsumgebung :(
quelle
Das erinnert mich an die Geschichte von "CTool". Am Anfang wurde CTool von einem unserer Entwickler vorgeschlagen, ich werde ihn Don nennen, als eine Möglichkeit, das Problem zu lösen, das wir hatten. Als ernsthafter fleißiger Typ steckte Don sich ein und lieferte einen funktionierenden Prototyp. Sie wissen, wohin ich damit gehe. Über Nacht wurde CTool Teil des Arbeitsablaufs des Unternehmens, von dem eine ganze Abteilung abhängig war. Am zweiten oder dritten Tag strömten bittere Beschwerden über die Mängel von CTool herein. Die Benutzer stellten Dons Kompetenz, Engagement und IQ in Frage. Dons Proteste, dass dies niemals eine Produktions-App sein sollte, stießen auf taube Ohren. Das ging jahrelang so. Schließlich kam jemand dazu, die App neu zu schreiben, lange nachdem Don gegangen war. Zu diesem Zeitpunkt war der Name CTool so verabscheut, dass eine Benennung von CTool Version 2 nicht in Frage kam. Es gab sogar eine formelle Beerdigung für CTool, die etwas an die Ausführungsszene des Kopierers (oder war es ein Drucker?) In Office Space erinnerte .
Einige könnten sagen, Don hätte die Schlingen und Pfeile verdient, weil er es nicht richtig gemacht hat, CTool zu reparieren. Mein einziger Punkt ist, dass es in der realen Welt wahrscheinlich nicht zu rechtfertigen ist, zu sagen, dass man niemals eine Lösung hacken sollte . Aber wenn Sie derjenige sind, der es tut, gehen Sie vorsichtig vor.
quelle
Erhalten Sie es schriftlich (eine E-Mail). Wenn es später zu einem Problem wird, "vergisst" das Management nicht, dass es nur vorübergehend sein sollte.
Machen Sie es für die Benutzer sichtbar. Je sichtbarer es ist, desto weniger werden die Menschen vergessen, zurück zu gehen und es richtig zu machen, wenn die Krise vorbei ist.
Verhandeln Sie, bevor die temporäre Lösung für ein Projekt, Ressourcen und Zeitpläne vorhanden ist, um die eigentliche Lösung zu finden. Die Arbeit an der realen Lösung sollte wahrscheinlich beginnen, sobald die temporäre Lösung fertig ist.
quelle
Sie melden einen zweiten sehr beschreibenden Fehler gegen Ihr eigenes "Update" und geben direkt in den betroffenen Bereichen einen To-Do-Kommentar ein, der besagt: "Dieser Bereich erfordert viel Arbeit. Siehe Fehler Nr. 555" (verwenden Sie natürlich die richtige Anzahl). . Leute, die sagen "Mach keinen Hack", scheinen die Frage nicht zu verstehen. Angenommen, Sie haben ein System, das jetzt betriebsbereit sein muss, Ihre Nicht-Hack-Lösung umfasst 8 Arbeitstage, Ihr Hack dauert 38 Minuten, der Hack ist dazu da, Ihnen Zeit für die Arbeit zu verschaffen und dabei kein Geld zu verlieren du machst es.
Jetzt müssen Sie Ihren Kunden oder das Management noch dazu bringen, die N * 100 Minuten Zeit einzuplanen, die für die eigentliche Korrektur erforderlich sind, zusätzlich zu den N Minuten, die jetzt für die Reparatur benötigt werden. Wenn Sie sich weigern müssen, den Hack zu implementieren, bis Sie eine solche Vereinbarung erhalten, müssen Sie das vielleicht tun, aber ich habe mit einigen verständnisvollen Leuten in dieser Hinsicht zusammengearbeitet.
quelle
Der eigentliche Preis für die Einführung einer Schnellkorrektur besteht darin, dass eine andere Person, die eine zweite Schnellkorrektur einführen muss, diese basierend auf Ihrer eigenen Schnellkorrektur einführt. Je länger eine schnelle Lösung vorhanden ist, desto fester wird sie. Sehr oft dauert ein Hack nur ein bisschen länger als das Richtige, bis Sie auf einen zweiten Hack stoßen, der auf dem ersten aufbaut.
Offensichtlich ist (oder scheint) es manchmal notwendig, eine schnelle Lösung einzuführen.
Eine mögliche Lösung, vorausgesetzt, Ihre Versionskontrolle unterstützt dies, besteht darin, bei jedem solchen Hack eine Abzweigung von der Quelle einzuführen. Wenn die Leute ermutigt werden, das Codieren neuer Funktionen in diesen speziellen "Get It Doed" -Gabeln zu vermeiden, wird es letztendlich mehr Arbeit sein, die neuen Funktionen in die Gabel zu integrieren, als den Hack loszuwerden. Wahrscheinlicher ist jedoch, dass die "gute" Gabel weggeworfen wird. Und wenn Sie weit genug von der Veröffentlichung entfernt sind, dass die Herstellung einer solchen Gabel nicht praktikabel ist (weil es sich nicht lohnt, die oben erwähnte doppelte Integration durchzuführen), sollten Sie wahrscheinlich sowieso nicht einmal einen Hack verwenden.
Ein sehr idealistischer Ansatz.
Eine realistischere Lösung besteht darin, Ihr Programm in so viele orthogonale Komponenten wie möglich zu unterteilen und gelegentlich einige der Komponenten vollständig neu zu schreiben.
Eine bessere Frage ist, warum die hackige Lösung schlecht ist. Wenn es schlecht ist, weil es die Flexibilität verringert, ignorieren Sie es, bis Sie Flexibilität benötigen. Wenn es schlecht ist, weil es das Verhalten des Programms beeinflusst, ignorieren Sie es und es wird schließlich eine Fehlerbehebung und wird behoben. Wenn es schlecht ist, weil es hässlich aussieht, ignorieren Sie es, solange der Hack lokalisiert ist.
quelle
Einige Lösungen, die ich in der Vergangenheit gesehen habe:
HACK
im Code (oder einem ähnlichen Schema wieXXX
)HACK
Kommentare angezeigt werdenDies ist eine ausgezeichnete Frage. Eines ist mir aufgefallen, als ich mehr Erfahrung gesammelt habe: Hacks verschaffen dir sehr wenig Zeit und kosten dich oft sehr viel mehr. Eng verwandt ist die 'schnelle Lösung', die das löst, was Sie für das Problem halten - nur um festzustellen, wenn es explodiert, dass es überhaupt nicht das Problem war.
quelle
Nehmen wir die Debatte darüber beiseite, ob Sie es tun sollten, nehmen wir an, dass Sie es tun müssen. Der Trick besteht nun darin, dies so zu tun, dass Auswirkungen auf große Entfernungen minimiert werden, es später leicht herausgerissen wird und sich selbst zu einem Ärgernis macht, sodass Sie daran denken, es zu beheben.
Der störende Teil ist einfach: Lassen Sie ihn jedes Mal eine Warnung ausgeben, wenn Sie den Kludge ausführen.
Der herausgerissene Teil kann einfach sein: Ich mache das gerne, indem ich den Kludge hinter einen Subroutinennamen setze. Dies erleichtert die Aktualisierung, da Sie den Code unterteilen. Wenn Sie Ihre permanente Lösung erhalten, kann Ihre Subroutine sie entweder implementieren oder ein No-Op sein. Manchmal kann eine Unterklasse auch dafür gut funktionieren. Lassen Sie andere Menschen jedoch nicht davon abhängen, was Ihre schnelle Lösung ist. Es ist schwierig, eine bestimmte Technik zu empfehlen, ohne die Situation zu sehen.
Das Minimieren von Effekten mit großer Reichweite sollte einfach sein, wenn der Rest des Codes nett ist. Gehen Sie immer die veröffentlichte Oberfläche durch und so weiter.
quelle
Versuchen Sie, den Geschäftsleuten die Kosten des Hacks klar zu machen. Dann können sie so oder so eine fundierte Entscheidung treffen.
quelle
Sie könnten es absichtlich so schreiben, dass es zu restriktiv und zielgerichtet ist und ein erneutes Schreiben erforderlich wäre, um es zu ändern.
quelle
Wir mussten dies einmal tun - eine kurzfristige Demoversion erstellen, von der wir wussten, dass wir sie nicht behalten wollten. Der Kunde wollte es auf einer winTel-Box, deshalb haben wir den Prototyp in SGI / XWindows entwickelt. (Wir sprachen beide fließend, es war also kein Problem).
quelle
Bekenntnis:
Ich habe '#define private public' in C ++ verwendet, um Daten aus einer anderen Codeschicht zu lesen. Es ging als Hack rein, funktioniert aber gut und das Reparieren hat nie Priorität. Es ist jetzt 3 Jahre später ...
Einer der Hauptgründe, warum Hacks nicht entfernt werden, ist das Risiko, dass beim Beheben des Hacks neue Fehler auftreten. (Insbesondere beim Umgang mit Pre-TDD-Codebasen.)
quelle
Meine Antwort ist etwas anders als die anderen. Ich habe die Erfahrung gemacht, dass die folgenden Methoden Ihnen helfen, agil zu bleiben und von Hacky First Iteration / Alpha-Lösungen zu Beta / Production Ready überzugehen:
Testgetriebene Entwicklung
Kleine Refactoring-Einheiten
Und es sollte selbstverständlich sein, dass Sie die Unterstützung von Stakeholdern benötigen, um dies korrekt durchzuführen. Mit diesen Produkten verfügen Sie jedoch über die richtigen Tools und Prozesse, um ein Produkt schnell und sicher zu ändern. Manchmal ist Ihre Fähigkeit zur Änderung Ihre Fähigkeit, das Risiko der Änderungen zu steuern, und aus Sicht der Entwicklung bieten Ihnen diese Tools / Techniken eine sicherere Grundlage.
quelle