Wie verhindern Sie, dass Zwischenlösungen für immer Bestand haben?

79

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?

Tommy Herbert
quelle
Gute Frage - Ich bin gerade zu einem Projekt mit vielen dieser Lösungen übergegangen. Ich bin gespannt auf die Antworten.
Chris Marasti-Georg
Schnell, aber hackig hat eine böse Tendenz, dauerhaft zu werden. In einem persönlichen Projekt (kleine Website) wird heute noch eine "temporäre" Lösung verwendet, die ich vor 10 Jahren geschrieben habe.
Powerlord

Antworten:

37

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 ...).

Steve Jessop
quelle
Das ist möglich die beste Lösung. Fehlgeschlagene Tests haben oft hohe Priorität.
Toon Krijthe
1
Gerade weil fehlgeschlagene Tests eine hohe Priorität haben, ist dies keine Lösung für das Problem, sondern eine gute Möglichkeit, Ihr Team und / oder Ihren Manager zu verärgern.
Michael Borgwardt
1
Wenn es meinem Team widerspricht, dann stimmen sie offensichtlich nicht mit meinem "Plan überein, mit der besseren Lösung zu beginnen". Wenn sie Recht haben, ist die "schnelle" Version kein Hack, sondern eine gültige Lösung. Der Versuch, einen Testfehler zu entwerfen, ist der beste Weg, um herauszufinden, ob mein Code so gut genug ist.
Steve Jessop
1
... mein allgemeiner Punkt ist, dass wenn die "schnelle" Lösung gut genug ist, die Frage ein falsches Problem aufwirft, das nicht gelöst werden sollte: "Wie soll ich arbeiten, die nicht erledigt werden muss?". Wenn die "schnelle" Lösung nicht gut genug für die Veröffentlichung ist, werden Kollegen nicht durch einen Test, der dies sagt, verärgert.
Steve Jessop
1
Bitte beachten Sie auch, dass ich nicht in 8 Worten vorschlage, eine Silver Bullet-Entwicklungsmethode bereitzustellen, die dumme Leute einmal lesen und dann gedankenlos befolgen können, um dadurch alle möglichen Codefehler zu verfolgen und zu beheben ;-) Verwenden Sie einfach den Mechanismus, den Sie haben (Tests ), um Fehler intelligent zu messen, wofür sie schließlich sind. Wenn Sie wirklich keinen Test schreiben können, suchen Sie nach einer anderen Möglichkeit, um festzustellen, ob der Code den Fehler enthält. Wenn der Code mit dem Fehler geliefert werden kann, denken Sie an "optionale" Tests. Vor allem aber das Problem objektiv quantifizieren.
Steve Jessop
17

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.

John Biazo
quelle
Einziges Problem mit Strategie 4 - wenn Sie endlich mit dem Umschreiben fertig sind, gibt es auch große Zeit- und Budgetbeschränkungen - so dass der Hack kopiert wird - oder andere klobige Lösungen in das Umschreiben eingefügt werden.
Ken Ray
1
Ein Problem bei Strategie 4 besteht darin, dass nach 5 Jahren Umgehung und Korrekturen etwas in der Übersetzung verloren geht, wenn Sie zum erneuten Schreiben bereit sind.
Giovanni Galbo
Genau. Nichts macht Geschäftsinteressenten wütender, als für ein 6-monatiges Umschreiben zu bezahlen, das ihnen im Grunde die gleiche Anwendung bringt, die sie hatten, aber mit zusätzlichen Fehlern. Startegy 5: Überarbeiten Sie die Dinge schrittweise und sorgfältig, wenn dies sinnvoll ist.
Eric Z Beard
16

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.

Mike Stone
quelle
Das ist ein großartiger Artikel - danke. Als ich die Frage stellte, dachte ich eher an Schulden vom Typ II-A-1 (die Autokredit-Analogie) als an II-A-2 (Kreditkarten). Ich sehe jetzt, dass solche Schulden gut sein können und dass die Organisation sie explizit planen kann.
Tommy Herbert
14

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.

Craig
quelle
Einverstanden. Fügen Sie dem Tracking-System einen Artikel hinzu. Das Problem ist, dass normalerweise die Zwischenlösung nicht angesprochen wird, es sei denn, es liegt ein erhebliches Problem in Bezug auf die Funktionalität vor. Vielleicht ist dies in Ordnung, es sei denn, Sie pflegen nicht wartbaren Code. Wie sprechen Sie dieses Problem an?
s_t_e_v_e
Ja. Wenn Sie wissen, dass ein Code fehlschlagen wird, ist dies ein Fehler, auch wenn er noch nicht fehlgeschlagen ist, und er sollte als einer nachverfolgt werden. Ein weiterer psychologischer Vorteil ist, dass die Fehleranzahl Ihres Projekts steigt, wenn Sie schlampige Korrekturen vornehmen.
Robert Rossney
13

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.

Eric Z Bart
quelle
1
"Wenn es fehlerfrei ist und die Anforderungen erfüllt, ist es fertig. Versenden Sie es. Fahren Sie fort." Ich stimme dir nicht zu. Ich arbeite derzeit mit einer Codebasis, die so kompliziert ist, dass jede einfache Änderung eher Tage als Stunden dauert. Es hat keine "Bugs", aber seine schlechte Struktur verursacht laufende Kosten.
Kristopher Johnson
Nun, du willst nicht einfach alles hacken , dann kommt es zu einem Durcheinander. Es ist alles Kosten-Nutzen: Wenn es Sie so sehr verlangsamt, muss es neu codiert werden, wenn die Zeit, die es über die Lebensdauer der App spart, lange Bugfixes ohne Neugestaltung überwiegt.
Eric Z Beard
Ich denke, dein Kommentar ist richtig, Eric. Vielleicht könnten Sie Ihre Antwort bearbeiten, um sie wiederzugeben?
Tommy Herbert
7

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.

Bill K.
quelle
Es gibt einige seltene Fälle, in denen ein Hack richtig ist - im Allgemeinen sagt das Gantt-Diagramm, dass 23 andere Leute herum sitzen und nichts tun, während Sie es richtig machen. Die Diskussion gilt sowohl für Prototypen als auch für Hacks IMO.
Steve Jessop
Es gibt keinen Prototyp. Prototyp ist ein anderer Name für Produktionscode.
Greg D
Beachten Sie insbesondere, dass es zwar insgesamt länger dauert, bis der Hack zuerst ausgeführt und dann richtig ausgeführt wird, die Projektzeit jedoch möglicherweise verkürzt wird. Alle anderen können zumindest damit beginnen, ihren Code gegen Ihren Hack zu testen, der beispielsweise funktional vollständig sein kann, aber eine inakzeptable Leistung aufweist.
Steve Jessop
@ Greg D: Ein Prototyp ist ein Produkt, aber es ist nicht das Produkt. Es sei denn natürlich, Sie haben keine Möglichkeit zu verhindern, was der Fragesteller verhindern möchte, weshalb IMO die Probleme ähnlich sind.
Steve Jessop
Machen Sie keinen Prototyp, machen Sie einen Spike. Ein Spike ist ein vertikaler Teil des Produktionscodes, der eine Funktion implementiert, und es sollte niemals länger dauern als der Prototypcode. Schnelleres Hacken ist selbst kurzfristig eine völlige Illusion.
Bill K
7

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.

Wenn Sie es verfluchen, warum steht es am Ende der TODO-Liste?

  • Wenn es dich nicht betrifft, warum verfluchst du es dann?
  • Wenn es Sie betrifft, ist es ein Problem, das JETZT behoben werden muss.
James Curran
quelle
Oft sind die Bedürfnisse des Unternehmens nicht auf Ihre Schmerzen abgestimmt. IT dient dem Geschäft. Wenn das, was wir tun, ihre Ziele nicht vorantreibt, riskieren wir eine gefährliche Trennung. Gelegentlich haben wir die Möglichkeit, nur IT-Projekte durchzuführen, aber selbst dann ...
1
Einverstanden ist es dem Management egal, ob es uns betrifft, solange sein Geschäftsmodell weiter funktioniert. Sie müssen sich einen Business Case ausdenken, warum er JETZT behoben werden muss, sonst stößt Ihr schmerzhaftes Wehklagen auf taube Ohren.
Adam Bellaire
Wenn die geschäftlichen Anforderungen nicht auf Ihre Schmerzen abgestimmt sind, sollten Sie den Hack "nicht" durch die richtige Version ersetzen, und diese Frage lautet "Wie kann ich die Ziele meines Arbeitgebers untergraben, um meinen eigenen zu dienen?". Antwort: Bilden Sie eine Gewerkschaft.
Steve Jessop
5
  • Ich stelle sicher, dass ich über die Priorität des Langzeit-Fixes spreche, INSBESONDERE nachdem der Kurzzeit-Fix eingegangen ist.
  • Ich erläutere die Gründe, warum es sich um einen Hack handelt und keine gute langfristige Lösung, und verwende diese, um die Stakeholder (Manager, Kunden usw.) dazu zu bringen, zu verstehen, warum dies behoben werden muss
  • Je nach Fall kann ich dort sogar ein bisschen Angst vor dem schlimmsten Fall einbringen. "Wenn diese sichere Linie reißt, könnte die ganze Brücke einstürzen!"
  • Ich übernehme die Verantwortung für die Entwicklung einer langfristigen Lösung und stelle sicher, dass diese bereitgestellt wird
Wayne
quelle
4

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.

MagicKat
quelle
Was in Ihrer Programmiererfahrung lässt Sie glauben, dass eine schlecht programmierte Lösung schneller implementiert, getestet und freigegeben werden kann als eine gut programmierte Lösung? Ernsthaft. Ich habe Leute gesehen, die es gesagt haben, normalerweise, wenn sie nicht wissen, wie sie es richtig machen sollen.
Bill K
@ Bill K: Schlecht programmiert war nie in meiner Aussage. Weniger wünschenswerte Lösung vielleicht. Es geht um Schulden, Sie nehmen keine Schulden auf, ich nehme kleine Schulden, die ich schnell abbezahlen kann. Ich kann später jederzeit umgestalten, der Kunde kümmert sich nicht darum, aber er kümmert sich um den Bericht, den er für das Board in einer Stunde benötigt.
MagicKat
@ Bill K: In diesem Fall ist die Codebasis sicher nicht trocken, aber Sie sind ein Held für den Kunden. Sobald Sie in der Hand des Kunden sind, können Sie den Code einfach umgestalten. Was ist wichtiger in der LANGZEIT, eine nicht trockene Codebasis für eine Stunde, aber ein zufriedener Kunde, oder eine trockene Codebasis und ein unglücklicher Kunde.
MagicKat
4

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.

Mendelt
quelle
4

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.

ungewollt leer gelassen
quelle
"Warum glaubst du, du wirst auf magische Weise 'zu einem späteren Zeitpunkt' mehr Zeit haben, um den Hack zu beheben?" Ich weiß jetzt, wie ich darauf antworten kann: Das Unternehmen kann eine Entscheidung treffen, die technischen Schulden zurückzuziehen, wenn die Kosten für die Wartung die Kosten für die Reparatur überwiegen. Siehe den Artikel, auf den Mike Stone verlinkt hat.
Tommy Herbert
2

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
2

Informieren Sie jeden, der für die endgültige Entscheidung verantwortlich ist, warum die hackige Art, Dinge zu tun, auf lange Sicht schlecht ist.

  • Beschreiben Sie das Problem in Begriffen, auf die sie sich beziehen können.
  • Fügen Sie ein Diagramm mit Kosten-, Produktivitäts- und Ertragskurven hinzu.
  • Bringen Sie ihnen technische Schulden bei .
  • Refactor regelmäßig, wenn Sie vorwärts geschoben werden.
  • Nennen Sie es niemals "Refactoring" oder "Zurückgehen und Aufräumen" vor nicht-technischen Leuten. Nennen Sie es stattdessen "Anpassung" des Systems an "neue Funktionen".

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.

Jonathan Tran
quelle
2

Wir verwenden Java und Hudson für die kontinuierliche Integration. 'Zwischenlösungen' müssen kommentiert werden mit:

// TODO: Better solution required.

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.

Johnstok
quelle
1

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 :(

gabr
quelle
1

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.

Andrew Cowenhoven
quelle
1
  • 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.

CrashCodes
quelle
1

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.

Dlamblin
quelle
1

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.

Brian
quelle
1

Einige Lösungen, die ich in der Vergangenheit gesehen habe:

  • Markieren Sie es mit einem Kommentar HACKim Code (oder einem ähnlichen Schema wie XXX)
  • Lassen Sie einen automatischen Bericht ausführen und wöchentlich eine E-Mail an diejenigen senden, die sich darum kümmern, wie oft die HACKKommentare angezeigt werden
  • Fügen Sie Ihrem Bug-Tracking-System einen neuen Eintrag mit der Zeilennummer und der Beschreibung der richtigen Lösung hinzu (damit das Wissen, das Sie vor dem Schreiben des Hacks aus der Forschung gewonnen haben, nicht verloren geht).
  • Schreiben Sie einen Testfall, der zeigt, wie der Hack fehlschlägt (falls möglich), und checken Sie ihn in die entsprechende Testsuite ein (dh, damit Fehler auftreten, die möglicherweise irgendwann bereinigt werden sollen).
  • Sobald der Hack installiert ist und der Druck nachlässt, beginnen Sie sofort mit der richtigen Lösung

Dies 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.

mm2001
quelle
1

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.

brian d foy
quelle
1

Versuchen Sie, den Geschäftsleuten die Kosten des Hacks klar zu machen. Dann können sie so oder so eine fundierte Entscheidung treffen.

David Plumpton
quelle
1

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.

user43625
quelle
0

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).

Dan Hewett
quelle
0

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.)

Jeroen Dirks
quelle
0

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:

  1. Testgetriebene Entwicklung

  2. Kleine Refactoring-Einheiten

  3. Kontinuierliche Integration
  4. Gutes Konfigurationsmanagement
  5. Agile Datenbanktechniken / Datenbank-Refactoring

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.

Daniel Honig
quelle