Woher wissen Quick & Dirty-Programmierer, dass sie es richtig verstanden haben?


166

Wenn Sie Programmierer fragen, warum sie sauberen Code schreiben sollen, lautet die Antwort Nummer eins: Wartbarkeit. Während das auf meiner Liste steht, ist mein Hauptgrund unmittelbarer und weniger uneigennützig: Ich kann nicht sagen, ob mein neuer Code korrekt ist, wenn er zu schmutzig ist. Ich stelle fest, dass ich mich so sehr auf einzelne Funktionen und Codezeilen konzentriert habe, dass es manchmal nicht sehr gut zusammenpasst, wenn ich meinen ersten Entwurf beende und zurücktrete, um das Gesamtbild noch einmal zu betrachten. Ein oder zwei Stunden Refactoring zur Verbesserung der Sauberkeit decken häufig Kopier- / Einfügefehler oder Randbedingungen auf, die im rauen Luftzug nur schwer zu erkennen waren.

Einige Leute halten es jedoch gelegentlich für in Ordnung, absichtlich schmutzigen Code im Interesse der Versandsoftware einzuchecken, mit dem Plan, "später aufzuräumen". Gibt es eine praktikable Technik, die ihnen Vertrauen in die Richtigkeit ihres Codes gibt, wenn die Lesbarkeit nicht optimal ist? Lohnt es sich, diese Fähigkeit zu entwickeln? Oder ist ein Mangel an Vertrauen in den Code für manche einfach leichter zu akzeptieren?


40
Meine Theorie ist, dass alle Codierer irgendwo zwischen "Auswendiglernen" und "Verstehen" liegen, und nur wenige können beides gut. Je mehr Mist Sie sich auf einmal merken können, desto unordentlicher können Sie es sich leisten, Ihren Code zu erstellen. Ob der Code sauber ist oder nicht, lass es funktionieren, teste es!
Job

35
Einige Leute halten es jedoch gelegentlich für in Ordnung, absichtlich schmutzigen Code im Interesse der Versandsoftware einzuchecken, mit dem Plan, "später aufzuräumen". heh ... die Hölle wird erstarren, bevor es " später " ist ...
Carlos Campderrós

28
Nicht alle Programmierer denken gleich - ich habe seit Monaten Code erhalten, der für mich keinen Sinn mehr macht, bis eines Tages ein Lichtschalter betätigt wurde, als mir klar wurde, wie die gesamte Organisationsstruktur und alles war machte Sinn, warum sie es getan hatten, wie sie es taten. Hätte ich das so gemacht? Nein, aber es hat funktioniert.
Joe

12
@joe - +1 - Einige Programmierer sind zu schnell, um Code zu verwerfen, der nicht in ihre persönliche Vorstellung von "gutem Code" passt. Sie sollten immer versuchen, das Denken hinter einem Codekörper und dessen Codestil zu verstehen. Oft werden Sie etwas Nützliches lernen.
James Anderson

10
How do quick & dirty programmers know they got it right?Weil es funktioniert :)
Rachel

Antworten:


100

Der Code ist wahrscheinlich nicht richtig.

Möglicherweise spielt es jedoch keine Rolle.

Schnell und schmutzig kann der richtige Weg sein, wenn:

  • Der Code hat eine kurze Lebensdauer . Beispielsweise wandeln Sie eine Reihe von Daten mit einem Ad-hoc-Programm in ein Standardformat um.
  • Die negativen Auswirkungen von Fehlern sind gering :
    • Die Daten, die Sie transformieren, sind unkritisch und Fehler können leicht korrigiert werden
    • Der Endbenutzer ist ein sympathischer Programmierer, der über Fehlermeldungen nachdenkt und sie umgeht, indem er beispielsweise die Eingabe massiert.

Manchmal ist es nicht wichtig, dass Code robust ist und alle denkbaren Eingaben verarbeitet. Manchmal muss es nur die bekannten Daten verarbeiten, die Sie zur Hand haben.

In dieser Situation, wenn Unit-Tests Ihnen helfen, den Code schneller zu schreiben (das ist bei mir der Fall), dann verwenden Sie sie. Ansonsten Code schnell und schmutzig, erledigen Sie die Arbeit. Fehler, die nicht auslösen, spielen keine Rolle. Fehler, die Sie im laufenden Betrieb beheben oder umgehen, spielen keine Rolle.

Entscheidend ist, dass Sie diese Situationen nicht falsch diagnostizieren. Wenn Sie schnell und schmutzig codieren, weil der Code nur einmal verwendet wird, dann beschließt jemand, den Code in einem Projekt wiederzuverwenden, das besseren Code verdient. Dieser Code verdient mehr Sorgfalt.


24
+1 für "die Auswirkung des Scheiterns ist gering." Meine mathematische Lieblingsrisikoberechnung ist Risiko = tatsächliche Konsequenz des Ausfalls x Ausfallwahrscheinlichkeit x wahrgenommene Konsequenz des Ausfalls (Nach meiner Erfahrung bleibt das wahrgenommene Risiko, auf das die Stakeholder häufig stecken)
Trav

7
"Der Code hat eine kurze Lebensdauer. Beispielsweise wandeln Sie eine Reihe von Daten mit einem Ad-hoc-Programm in ein Standardformat um." Was ist, wenn die Umwandlung nicht korrekt durchgeführt wurde, aber Abweichungen in den Daten erst viel später festgestellt werden?
Joey Adams

3
@Trav Also, um nur zu bestätigen, wenn die tatsächliche Konsequenz eines Ausfalls massiv ist, aber meine wahrgenommene Konsequenz des Ausfalls Null ist, gibt es überhaupt kein Risiko?
Christian Stewart

3
@ChristianStewart Rein rechnerisch wäre Ihre Aussage richtig. In der Praxis würde jedoch eine Wahrnehmung der Konsequenz, die Null ist, das Gewicht der Wahrscheinlichkeit x der tatsächlichen Konsequenz nicht negieren. Die Wahrnehmung wird in die Formel aufgenommen, um organisatorische Ängste zu berücksichtigen, die häufig Einfluss auf Minderungsentscheidungen haben. Das Fehlen einer solchen Angst mindert nicht die tatsächliche Wahrscheinlichkeit oder die tatsächlichen Konsequenzen. Man sollte also davon ausgehen, dass die Wahrnehmung immer mindestens gleich 1 ist (da sie das tatsächliche Risiko vergrößern, aber in keiner Weise negieren kann)
Trav

1
@Trav Alternativ können Sie eine umbenennen. Das Risiko sollte nämlich gegen das wahrgenommene Risiko ausgetauscht werden , denn wenn wir glauben, dass es keine Konsequenzen des Scheiterns gibt, glauben wir wahrscheinlich auch, dass es kein Risiko gibt.
Delioth

237

Sie tun es nicht. Ich arbeite derzeit an einer Codebasis, die von "schnellen und schmutzigen" Programmierern erstellt wurde, die "später aufräumen" würden. Sie sind schon lange nicht mehr da und der Code lebt weiter und knarrt in Vergessenheit. Cowboy- Programmierer verstehen im Allgemeinen einfach nicht alle potenziellen Fehlermodi ihrer Software und nicht die Risiken, denen sie das Unternehmen (und die Kunden) aussetzen.


31
Immer wenn ich höre, wie "später aufräumen" oder "wir werden das tun, wenn sich die Dinge etwas verlangsamen", bin ich immer versucht zu singen. "Morgen, morgen, ich werde dich morgen lieben. Das könnte aber nur ich sein.
JohnFx

8
Viele von uns waren in dieser unglücklichen Lage. Es ist ziemlich entmutigend, die technischen Schulden anderer Leute zu hinterlassen .
Mark Booth

34
Das eigentliche Problem besteht darin, andere Programmierer in Cowboy-, Quick & Dirty- oder andere Titel zu klassifizieren. Jeder Programmierer hat einige Fehlermodi, und das Lesen anderer Codes ist sehr schwierig, und es ist sehr schwierig, eigene Fehler zu finden. All dies zusammen bedeutet, dass die Leute andere Programmierer zu leicht als schlechte bezeichnen, während sie ihren eigenen Code für perfekt halten
tp1

3
@ tp1: Gute Programmierer können Code schreiben, der einfach zu lesen ist. Sie tun dies, indem sie jemanden dazu bringen, es zu lesen und Unklarheiten zu klären. Mit der Zeit wird der Teil, der beim ersten Lesen unklar ist, kleiner.
Kevin Cline

9
@ JimThio, meinen Sie ernsthaft, dass einer der oben genannten Programmierer absichtlich einen schlechten Code geschrieben hat? Haben Sie vor ein paar Jahren jemals selbst geschriebenen Code gelesen? Fanden Sie es gut? Die Chancen stehen gut, dass Sie damals Ihr Bestes gegeben haben, und Sie sehen immer noch eine Menge Dinge, die jetzt in diesem Code verbessert werden müssen.
Péter Török

103

Okay, ich werde die gegnerische Ansicht "verteidigen", da ich das Risiko habe, ein kompletter Downvote-Köder zu sein.

Ich schlage vor, dass wir Entwickler die Tendenz haben, uns übermäßig Gedanken über Dinge wie ordnungsgemäße Vorgehensweise und Code-Sauberkeit zu machen. Ich schlage vor, dass, obwohl diese Dinge wichtig sind, nichts davon zählt, wenn Sie niemals versenden .

Jeder, der schon eine Weile in diesem Geschäft ist, würde wahrscheinlich zustimmen, dass es möglich wäre, mit einem Stück Software mehr oder weniger auf unbestimmte Zeit zu fummeln. Duke Nukem Forever, meine Freunde. Es kommt eine Zeit, in der dieses nette Feature oder diese ach so dringende Umgestaltungsarbeit einfach beiseite gelegt werden sollte und die Sache als FERTIG bezeichnet werden sollte.

Ich habe mich schon oft mit meinen Kollegen gestritten. Es gibt IMMER noch eine Verbesserung, etwas, das "getan" werden sollte, damit es "richtig" ist. Sie können das IMMER finden. Irgendwann in der realen Welt muss gut genug gut genug sein. Keine echte Versand-Software ist perfekt. Keiner. Bestenfalls ist es gut genug.


9
Oder wenn es jahrzehntelang verwendet wird, sieht es wahrscheinlich wie ein Chaos aus. Wenn es nicht (überhaupt oder für lange Zeit) verwendet wird, hat es keine Chance, Kruft anzusammeln.
Nutzlos

7
"Jeder, der schon eine Weile in diesem Geschäft ist, würde wahrscheinlich zustimmen, dass es möglich ist, mehr oder weniger unbegrenzt mit einem Stück Software zu fummeln." Es wäre möglich, aber warum? Sobald Sie Ihren Qualitätsstandard festgelegt haben, entwerfen Sie ihn, implementieren ihn, testen ihn, beheben Fehler, testen ihn erneut und berühren ihn dann nicht mehr. Es dauert länger als nur das Hacken, aber sobald Sie Ihr Ziel erreicht haben (die erforderliche Funktionalität ist implementiert und getestet), ist es klar, dass Sie nicht mehr mit dem Code herumspielen sollten. Nur meine 2 Cent.
Giorgio

7
+1 - in der realen Welt wird es immer einen Kompromiss zwischen Codequalität und Einhaltung von Fristen geben. Ich hätte lieber einen Programmierer, der vernünftigen Code schnell produzieren kann, als einen Perfektionisten, der monatelang darüber nachdenkt, ob er eine Methode "serialize" oder "writeToFile" nennen soll.
James Anderson

3
du hast es gesagt. Ich habe in einer Organisation gearbeitet, in der im nächsten Raum ein Team gearbeitet hat, das in den letzten 5 Jahren an den funktionalen Anforderungen für ein neues System gearbeitet hat, und für das noch nie eine Codezeile geschrieben wurde. Viele Programmierer sind die gleichen (vor allem Junioren, die gerade das College abgeschlossen haben und hohe Vorstellungen davon haben, dass Code schön sein und bestimmte "Standards" erfüllen muss, sonst ist es schlecht) und werden, sofern sie nicht gestoppt werden, endlos mit etwas experimentieren, das vor Monaten perfekt funktionierte (I) Ich denke, wir alle haben manchmal noch diese Tendenz. Aber am Ende geht es darum, es aus der Tür zu bekommen.
14.

6
@Giorgio: Ich bin mit deinem "Aberglauben" nicht einverstanden, dass Qualitätsarbeit länger dauert, als sie nur zu hacken. Das könnte zutreffen, wenn Sie Programmieren mit Tippen gleichsetzen. Betrachtet man den gesamten Software-Lebenszyklus, läuft alles viel reibungsloser und damit schneller, wenn Sie Wert auf Qualität legen.
ThomasX

85

Solche Programmierer wissen fast nie, dass sie es richtig verstanden haben, glauben es nur . Und der Unterschied ist möglicherweise nicht leicht zu erkennen.

Ich erinnere mich, wie ich programmiert habe, bevor ich das Testen von Einheiten gelernt habe. Und ich erinnere mich an dieses Gefühl des Vertrauens und der Zuversicht auf einer ganz anderen Ebene, nachdem ich meine erste Reihe anständiger Unit-Tests durchgeführt hatte. Ich hatte vorher nicht gewusst, dass es ein solches Maß an Vertrauen in meinen Code gibt.

Für jemanden, dem diese Erfahrung fehlt, ist es unmöglich, den Unterschied zu erklären. Vielleicht entwickeln sie sich sogar ihr ganzes Leben lang im Code-and-Pret-Modus weiter, wohlwollend (und unwissend) im Glauben, dass sie angesichts der Umstände ihr Bestes geben.

Das heißt, es kann in der Tat großartige Programmierer und Ausnahmefälle geben, wenn es einem wirklich gelingt, den gesamten Problemraum in seinem Kopf in einem Zustand des Flusses zu halten. Ich habe seltene Momente wie diesen erlebt, in denen ich genau wusste, was ich schreiben sollte, der Code mühelos aus mir herausflog, ich alle Sonderfälle und Randbedingungen vorhersehen konnte und der resultierende Code einfach funktionierte . Ich bezweifle nicht, dass es Programmgenies gibt, die für längere Zeit oder sogar die meiste Zeit in einem solchen Zustand des Flusses bleiben können, und was sie produzieren, ist schöner Code, scheinbar ohne Anstrengung. Ich vermute, dass solche Personen möglicherweise keine mickrigen Unit-Tests schreiben müssen, um zu überprüfen, was sie bereits wissen. Und wenn Sie wirklich so ein Genie sind, ist es vielleicht in Ordnung (obwohl Sie auch dann nicht für immer an diesem Projekt teilnehmen und über Ihre Nachfolger nachdenken sollten ...). Aber wenn nicht...

Und seien wir ehrlich, wahrscheinlich bist du es nicht. Ich selbst weiß, dass ich es nicht bin. Ich hatte einige seltene Momente des Flusses - und unzählige Stunden der Trauer und des Leidens, die normalerweise durch meine eigenen Fehler verursacht wurden. Es ist besser, ehrlich und realistisch zu sein. Tatsächlich glaube ich, dass die größten Programmierer sich ihrer eigenen Fehlbarkeit und ihrer Fehler in der Vergangenheit voll bewusst sind. Sie haben daher bewusst die Gewohnheit entwickelt, ihre Annahmen zu überprüfen und diese kleinen Unit-Tests zu schreiben, um sich auf der sicheren Seite zu halten. ( "Ich bin kein großartiger Programmierer - nur ein guter Programmierer mit großartigen Gewohnheiten." - Kent Beck.)


8
"Wohlwollend (und ignorant) zu glauben, dass sie ihr Bestes geben, wenn man die Umstände berücksichtigt." Perfekte Zusammenfassung des Problems. # 1 eilte wegen Zwängen und tat das Beste, was er konnte. # 2 kommt und hat Chaos sowie neue Deadlines geerbt und tut auch sein Bestes. Bis hinunter zur 20. armen Seele, die nicht ihr Bestes geben könnte, wenn er Jahre Zeit hätte, um den Schaden zu beheben. Deshalb praktiziere ich die Pfadfinderregel: "Lass es sauberer, als du es gefunden hast." Geben Sie dem nächsten Saft eine Chance - vielleicht sind Sie es.
Steve Jackson

1
Komisch, ich fühle das Gegenteil, seit ich angefangen habe, meinen Code zu testen (bei der Arbeit). Es ist wie faul zu werden; Es gibt keinen Grund, Ihren Code wirklich zu verstehen , da andere Codes Fehler für Sie
auffangen werden

8
Sie schreiben zum Teil Komponententests, um zu beweisen, dass Ihr eigener Code funktioniert. Noch wichtiger ist, dass Sie Komponententests schreiben, damit andere Entwickler Ihren Code sicher ändern können.
Stephen Gross

4
Donald Knuth: "Hüten Sie sich vor Fehlern im obigen Code. Ich habe nur bewiesen, dass sie korrekt sind, und nicht ausprobiert." haacked.com/archive/2007/11/29/…
MarkJ

1
@Izkata - Wenn Sie nicht verstehen, was Sie tun, sind die Komponententests wahrscheinlich fehlerhaft und es wird überprüft, ob der Code dieselben Fehler aufweist wie die Tests. Auch bei 100% iger Entscheidungsfreiheit und genauen Komponententests ist es möglich (wenn auch ungewöhnlich), dass ein Fehler auftritt, den das Testen nicht aufdeckt.
Steve314

33

Unit-Tests . Es ist die einzige Möglichkeit, Vertrauen in einen Code zu haben (schmutzig oder nicht).

Als Randnotiz;

Abkürzungen sorgen für lange Verzögerungen (Pippin)


6
Gutes Zitat, aber es war nicht Gandalf. Es war Pippin, der überlegte, warum er, Frodo und Sam nicht gleich auf der ersten Reise von Hobbiton quer durch das Land zur Buckleberry-Fähre fahren sollten.
Daniel Roseman

22
Korrektur: "Unit-Tests. Dies ist die einzige Möglichkeit, ein falsches Sicherheitsgefühl im Code zu haben (schmutzig oder nicht)". Unit-Tests sind gut zu haben, aber sie garantieren nichts.
Coder

8
Wenn ich versteckte Fehler aufdecken möchte, zeige ich die App meinem Chef. Ich nenne es den Boss-Test, er soll nach dem Unit-Test gemacht werden. Er hat eine Aura des Magnetismus, die alle Arten von seltsamen Fehlern und kosmischen Strahlen direkt in die CPU-Register zieht.
Mister Smith

8
Während wir zitieren, könnte Ihnen auch gefallen: "Testen zeigt das Vorhandensein, nicht das Fehlen von Fehlern" - Edsger Dijkstra
Timothy Jones

2
-1-Tests beweisen nicht, dass der Code unordentlich ist - Unit-Tests BEWEISEN nichts, geben Ihnen ein gewisses Maß an Vertrauen, sind aber nichts weiter wert. Sie sind eine gute Maßnahme. Gehen Sie einfach nicht davon aus, dass sie mehr bedeuten, als dass ein kleiner Teil des Codes genau so funktioniert, wie Sie ihn geschrieben haben. Zwar sind sie im Allgemeinen eine gute Maßnahme, aber sie sind keine Hilfe bei beschissenem Code und werden es tatsächlich verschlimmern, indem Sie mit jedem Refactor mehr Code zum Ändern bereitstellen.
Bill K

15

Es ist gut zu lernen, zu akzeptieren, dass kein Softwaresystem mit angemessener Komplexität perfekt ist, unabhängig davon, wie oft Unit-Tests und Code-Optimierungen durchgeführt werden. Im Code lauert immer ein gewisses Maß an Chaos und Anfälligkeit für Unerwartetes. Dies bedeutet nicht, dass man nicht versuchen sollte, guten Code zu erstellen oder Komponententests durchzuführen. Das ist natürlich wichtig. Es muss ein Gleichgewicht gefunden werden, das von Projekt zu Projekt unterschiedlich sein wird.

Die Fähigkeit, die entwickelt werden muss, besteht darin, zu verstehen, welcher Grad an "Perfektion" für ein bestimmtes Projekt verwendet werden muss. Wenn Sie beispielsweise einen Antrag auf elektronische Patientenakten mit einer 12-monatigen Projektlaufzeit schreiben, möchten Sie viel mehr Zeit für das Testen und die Pflege Ihres Codes aufwenden als für eine einmalige Web-App zur Konferenzregistrierung das muss bis Freitag bereitgestellt werden. Probleme treten auf, wenn jemand, der die EMR-App ausführt, schlampig wird oder die Registrierungs-App nicht rechtzeitig bereitgestellt wird, weil der Programmierer zu beschäftigt ist, Code zu optimieren.


1
+1 für den Hinweis, dass Entscheidungen über Qualitätsmaßnahmen durch geschäftliche Anforderungen gerechtfertigt sein müssen.
Stephen Gross

+1 für * "Die Fähigkeit, die entwickelt werden muss, ist ein Verständnis dafür, welches Maß an 'Perfektion' für ein bestimmtes Projekt verwendet werden muss." Risiko in Bezug auf die Qualität, dann bleiben Sie dabei.
S.Robins

11

Schnell und schmutzig ist in einem Subsystem völlig in Ordnung . Wenn Sie eine gut definierte Schnittstelle zwischen Ihrem Mist und dem Rest des Systems haben und eine Reihe von Unit-Tests durchführen, die sicherstellen, dass Sie hässlichen, schnellen und schmutzigen Code verwenden, ist dies möglicherweise in Ordnung.

Möglicherweise haben Sie einen abscheulichen Hack von regulären Ausdrücken und Byte-Offsets, um einige Dateien von Drittanbietern zu analysieren. Angenommen, Sie haben einen Test, der besagt, dass das Ergebnis beim Parsen von Beispieldateien Ihren Erwartungen entspricht. Sie könnten das aufräumen, damit Sie ... Ich weiß nicht, schneller reagieren, wenn ein Dritter ein Dateiformat ändert? Das passiert einfach nicht oft genug. Es ist wahrscheinlicher, dass sie zu einer komplett neuen API wechseln, und Sie werden den alten Parser wegwerfen und einen neuen einsetzen, der der gleichen API entspricht, und voila, Sie sind fertig.

Wo schnell und schmutzig wird ein Problem ist, wenn Ihre Architektur schnell und schmutzig ist. Ihr Kern-Domain-Objekt muss gut durchdacht sein und Ihre Schnittstellen, aber die Ränder Ihres Systems können in der Regel chaotisch sein, ohne dass Sie jemals den Piper bezahlen müssen.


1
Mit anderen Worten: Module können Fragen und Antworten sein, aber die Architektur sollte sauber sein.
Kromster

9

Hier ist eine Geschichte über einen schnellen und schmutzigen Programmierer, den ich kenne.

Ich kenne eine Person, die Unit-Tests als Zeitverschwendung ansieht. Nach langem Streit schrieb er schließlich einen. Es bestand aus einer langen Methode, die mit && und || bestreut war und gab einen Booleschen Wert zurück, um True zu behaupten. Die Aussage umfasst 20 Zeilen. Andererseits schrieb er eine Klasse, in der jede Methode eine Zeile und eine Hauptklasse über 1000 Zeilen ohne Leerzeichen enthielt. Es war eine Textwand. Als ich seinen Code überprüfte und einige neue Zeilen einfügte, fragte er, warum. Ich sagte 'Wegen der Lesbarkeit'. Er seufzte und löschte sie. Er fügte einen Kommentar hinzu: "Fass es nicht an, es funktioniert!"

Als ich das letzte Mal mit ihm gesprochen habe, hat er eine Website für eine Firma codiert. Er versuchte einen Bug zu finden. Er hatte die letzten 3 Tage damit verbracht, dies 8 Stunden am Tag zu tun. Ein bisschen später habe ich wieder mit ihm gesprochen und es stellte sich heraus, dass sein Teamkollege den Wert eines Buchstabens geändert und ihn an keiner anderen Stelle aktualisiert hat. Es war keine Konstante. Also änderte er auch die anderen Literale, so dass sein Fehler behoben wurde. Er beschwerte sich über den Spaghetti-Code seines Teamkollegen. Er sagte zu mir: "Haha, wissen wir nicht alle, wie es ist, die ganze Nacht mit dem Debugger wach zu bleiben und keinen Schlaf über einen bösen Bug zu bekommen?"

Außerdem findet er das Lesen von Programmierbüchern und Blogs nutzlos. Er sagt, "fang einfach an zu programmieren". Er hat das 12 Jahre lang gemacht und er denkt, er ist ein ausgezeichneter Programmierer. / facepalm


Hier ist noch mehr.

Ein anderes Mal haben wir eine DatabaseManager-Klasse für unsere Web-App geschrieben. Er hat alle Datenbankaufrufe darin abgelegt. Es war eine Gottesklasse mit über 50 Methoden für alle erdenklichen Dinge. Ich schlug vor, dass wir es in Unterklassen aufteilen, da nicht jeder Controller über jede Datenbankmethode Bescheid wissen muss. Er war anderer Meinung, weil es "einfach" war, nur eine Klasse für die gesamte Datenbank zu haben, und es "schnell" war, eine neue Methode hinzuzufügen, wann immer wir eine brauchten. Letztendlich verfügte DatabaseManager über mehr als 100 öffentliche Methoden, von der Authentifizierung des Benutzers bis zur Sortierung archäologischer Fundorte.


1
+1. Aus irgendeinem Grund liebe ich es, diese Geschichten zu lesen. Sie machen mich nicht einmal mehr traurig oder wütend.
Sam Hocevar

-1 für das Schreiben von _______Manager-Klassen.
Brian Driscoll

@SamHocevar Lauf, geh nicht zu Fuß zu thedailywtf.com
Mawg

7

Meine Lektion, schnell und schmutzig auszuweichen, bestand darin, dass ich sechs Monate Zeit hatte, um die geschätzte (unterschätzte) Arbeitsleistung von einem Jahr zu erbringen. Ich entschied mich, Methoden zu erforschen, bevor ich mit der Arbeit anfing. Am Ende habe ich drei Monate Forschung investiert und konnte in den verbleibenden drei Monaten liefern.

Wir haben große Gewinne erzielt, indem wir gemeinsame Funktionen identifiziert und die erforderlichen Bibliotheken erstellt haben, um diese Anforderungen zu erfüllen. Ich sehe immer noch Codierer, die ihren eigenen Code schreiben, wenn Bibliotheksroutinen verfügbar sind. Diese Codierer schreiben häufig denselben Code um oder schneiden ihn bestenfalls aus und fügen ihn ein, wenn sie später dasselbe Problem lösen müssen. Fehlerkorrekturen erfassen immer nur einige der Codekopien.

Ein Entwickler gab eine aussagekräftige Antwort, als ich ihn aufforderte, Bibliothekscode zu verwenden: "Betrügt das nicht? Ich musste in der Schule meinen gesamten Code selbst schreiben."


1
Ganz ein ethischer Entwickler, den Sie dort haben!
Stephen Gross

6

In einigen Fällen könnte es eine große Anzahl von Regressionstests geben, die "alle" Fehler finden und das Verhalten überprüfen, wodurch eine schnelle und schmutzige Codierungstechnik ermöglicht wird. Aber meistens ist es nur eine Frage der schlechten Projektplanung und eines Managers, der es für wichtiger hält, es zu erledigen, als es richtig zu erledigen.

Und vergessen Sie "später aufräumen", das passiert nie. In den seltenen Fällen hat der Programmierer den größten Teil des Codes vergessen, was die Arbeit viel teurer macht, als wenn er es beim ersten Mal richtig gemacht hätte.


6

Das Produkt wird versandt.

Code existiert nicht im luftleeren Raum. Ich habe unbeschreibliche Trauer erlitten, als ich die Konsequenzen der schnellen und schmutzigen Codierung und der Cowboy-Codierung bekämpfte. Manchmal ist es jedoch die Priorität, das Produkt fertig zu stellen und nicht herauszufinden, wie der beste Code geschrieben wird. Letztendlich, wenn das Produkt gut ausgeliefert wird und funktioniert, werden die Benutzer und Kunden nicht wissen oder sich darum kümmern, wie "schlecht" der Code im Inneren ist, und ich gebe zu, dass es Zeiten gab, in denen es mir überhaupt nichts ausmachte, es zu bekommen rechts ", solange ich es aus der Tür bekam.

Ja, dies ist ein organisatorisches Problem und "sollte niemals passieren". Wenn Sie jedoch zufällig Code in einer Organisation schreiben, die schlecht verwaltet und stark fristgebunden ist, sind die Optionen für einzelne Programmierer begrenzt.


5

Ich glaube nicht, dass sie ehrlich sagen können, dass sie es richtig gemacht haben, wenn es nicht einfach zu warten ist. Wenn sie zugeben, dass sie "später aufräumen" müssen, dann gibt es wahrscheinlich etwas, das sie nicht genug durchdacht haben. Wenn Sie es gründlich testen, werden nur Probleme mit unsauberem Code aufgedeckt.

Ich persönlich möchte nicht die Fähigkeit entwickeln, schmutzigen Code zu schreiben und sicher zu sein, dass er korrekt ist. Ich würde lieber gleich beim ersten Mal richtigen Code schreiben.


5

Woher wissen sie, dass sie es richtig verstanden haben? Testen ist die einfache Antwort.

Wenn ihr Code von einem guten QA-Team gründlich getestet wurde und bestanden wurde, würde ich sagen, dass sie es richtig gemacht haben.

Das Schreiben von schnellem und unsauberem Code ist keine Gewohnheit, aber es gibt Situationen, in denen Sie 20 Minuten damit verbringen können, Code zu schreiben, der als unsauber eingestuft wird, oder 4 Stunden damit, eine Menge Code zu überarbeiten, um es richtig zu machen. In der Geschäftswelt stehen manchmal nur 20 Minuten zur Verfügung, und wenn die Fristen schnell und schmutzig sind, ist dies möglicherweise die einzige Option.

Ich war selbst an beiden Enden dabei, musste den fehlerhaften Code reparieren und meinen eigenen schreiben, um die Einschränkungen eines Systems zu umgehen, in dem ich mich entwickelt habe. Ich würde sagen, dass ich Vertrauen in den Code hatte, den ich hatte schrieb, weil ich, obwohl es schmutzig und ein bisschen hackig war, manchmal sicherstellte, dass es gründlich getestet wurde und eine Menge eingebauter Fehlerbehandlung hatte. Wenn also etwas schief ging, würde es den Rest des Systems nicht zerstören.

Wenn wir auf diese schnellen und schmutzigen Programmierer herabblicken, müssen wir uns eines merken: Ein Kunde zahlt im Allgemeinen nicht, bis er das Produkt hat, wenn es ausgeliefert wird und er in UAT-Tests geht und die Fehler aus schnellem und schmutzigem Code herausfindet, der ein Fehler ist viel weniger wahrscheinlich, dass sie sich zurückziehen, wenn sie ein fast funktionierendes Produkt vor sich haben, aber wenn sie nichts haben und Sie ihnen sagen: "Sie werden es bald haben, wir reparieren nur x" oder "es wurde verzögert, weil wir es bekommen mussten." Sie arbeiten einfach perfekt. "Sie geben eher auf und gehen mit einem Konkurrenten.

Natürlich sollte niemand, wie dieses Bild zeigt, die Gefahr von schnellem und schmutzigem Code unterschätzen! Bildbeschreibung hier eingeben


4

Ich denke nicht, dass du überhaupt anfangen solltest, diesen Weg zu gehen. Schnell und schmutzig mag Ihnen der zeitliche Vorteil eines schnelleren Endes bringen, aber Sie zahlen am Ende immer das Zehnfache dafür.


5
Manchmal haben Sie kein Geld, wenn Sie jetzt nicht versenden ... aber wenn Sie jetzt versenden, können Sie das "Zehnfache" bezahlen, um es zu bereinigen, und dann einiges, weil Sie Ihre Konkurrenten auf den Markt geschlagen und bekommen haben Markenbekanntheit zuerst.
CaffGeek

2
Ich bin anderer Ansicht. Wenn das Geld schon knapp ist, geben Sie das Einkommen für das nächste Produkt aus und tun dies so lange, bis Ihr Unternehmen stirbt oder groß genug wird. Im letzteren Fall werden die ursprünglichen Entwickler höchstwahrscheinlich nicht mehr da sein, um den alten Code zu reparieren.
Raku

Wenn Sie andere auf den Markt bringen, ist dies keine Garantie dafür, dass die Öffentlichkeit Ihr Produkt akzeptiert. Wenn ein Produkt zu viele Fehler enthält, sollten Sie hoffen, dass Sie das nötige Geld haben, um gutes Rauch- und Spiegelmarketing zu betreiben und eine brillante und nachsichtige Beziehung zu Ihrem Kundenstamm zu pflegen. Dies ist keine entweder / oder Position. Der Schlüssel besteht darin, das Risiko gegen den Ertrag abzuwägen und das qualitativ hochwertigste Produkt, das Sie bereitstellen können, rechtzeitig herauszubringen. Ihre Fähigkeiten werden anhand der Qualität des von Ihnen veröffentlichten Produkts beurteilt, und der Schaden, den fehlerhafte Software Ihrem Image zufügen kann, kann irreparabel sein.
S.Robins

1
Bitten Sie, sich zu unterscheiden, wie Sie möchten, aber die Geschichte steckt voller Beispiele, bei denen es wichtiger war, zur richtigen Zeit da zu sein und für jeden, der es wollte, zur Verfügung zu stehen, als das bestmögliche Produkt zu sein. Es gibt immer Opportunitätskosten, immer immer.
Warren P

1
Warren, das habe ich eigentlich gesagt. In meinen Augen steigen die Opportunitätskosten, um den Code wieder wartbar zu machen, exponentiell, je länger Sie ihn verzögern. Wenn Ihr Unternehmen in einer Position ist, in der es die Katastrophe der Nichtwartbarkeit überstehen kann, weil der Verkauf gut lief und der Code nicht zu schmutzig war, gut, aber was ist, wenn nicht?
Raku

4

Meiner Meinung nach lohnt es sich nicht, zu lernen, Q & D-Codes auf ihre Richtigkeit hin zu beurteilen, da dies nur eine schlechte Übung ist. Hier ist der Grund:

Ich denke nicht, dass "schnell und schmutzig" und "Best Practice" zusammenpassen. Viele Programmierer (ich selbst eingeschlossen) haben als Ergebnis einer Verschiebung der dreifachen Beschränkungen schnellen und schmutzigen Code herausgeholt . Wenn ich es tun musste, war es in der Regel ein Ergebnis von Scope Creep in Kombination mit einer immer näher rückenden Frist. Ich wusste, dass der Code, den ich eincheckte, nicht funktioniert, aber er spuckte bei einer Reihe von Eingaben die richtigen Ausgaben aus. Sehr wichtig für unsere Stakeholder, wir haben pünktlich versendet.

Ein Blick auf den ursprünglichen CHAOS-Bericht macht ziemlich deutlich, dass Q & D keine gute Idee ist und das Budget später zunichte macht (entweder bei der Wartung oder bei der Erweiterung). Zu lernen, wie man beurteilt, ob der Q & D-Code richtig ist, ist Zeitverschwendung. Wie Peter Drucker sagte: "Es gibt nichts Unnützeres, als effizient das zu tun, was überhaupt nicht getan werden sollte."


3

Ich kann nicht sagen, ob mein neuer Code korrekt ist, wenn er zu schmutzig ist.

"Schmutzig" bedeutet für verschiedene Menschen verschiedene Dinge. Für mich bedeutet dies vor allem, sich auf Dinge zu verlassen, von denen Sie wissen, dass Sie sich wahrscheinlich nicht verlassen sollten, von denen Sie aber auch wissen, dass Sie in naher Zukunft mit einer Arbeit rechnen können. Beispiele: Angenommen, eine Schaltfläche ist 20 Pixel hoch, anstatt die Höhe zu berechnen. Festcodieren einer IP-Adresse, anstatt einen Namen aufzulösen; Wenn Sie auf ein zu sortierendes Array zählen, wissen Sie, dass dies der Fall ist, auch wenn die Methode, die das Array bereitstellt, dies nicht garantiert.

Schmutziger Code ist zerbrechlich - Sie können ihn testen und wissen, dass er jetzt funktioniert , aber es ist eine gute Wette, dass er irgendwann kaputt geht (oder Sie zwingen jeden, auf Eierschalen zu gehen, aus Angst, ihn zu zerbrechen).


3

Auf die Gefahr hin, ein wenig kontrovers zu klingen, würde ich argumentieren, dass niemand wirklich weiß, dass sein Code zu 100% korrekt und zu 100% fehlerfrei ist. Selbst wenn Sie eine wirklich gute Testabdeckung haben und gute BDD / TDD-Praktiken konsequent anwenden, können Sie Code entwickeln, der Fehler enthält, und ja, der sogar Nebenwirkungen enthalten kann!

Nur Code zu schreiben und anzunehmen, dass er funktioniert, bedeutet, dass der Entwickler zu viel Vertrauen in seine eigenen Fähigkeiten hat. Wenn Probleme auftreten (die unvermeidlich sein werden), ist der Aufwand zum Debuggen und Verwalten des Codes sehr hoch, insbesondere wenn ein anderer Entwickler dies benötigt um den Code später zu pflegen. Der eigentliche Unterschied ergibt sich aus der Anwendung bewährter Methoden der Softwareentwicklung, die sicherstellen, dass Sie sich darauf verlassen können, dass Ihr Code die meiste Zeit wahrscheinlich funktioniert, und dass das Debuggen einfacher ist, wenn Sie auf einen Fehler stoßen und viel weniger kostspielig zu ändern und zu warten, unabhängig von der Person, die später an diesem Code arbeitet.

Der springende Punkt ist, dass gut faktorisierter und erprobter Code es ANDEREN ermöglicht , Vertrauen in Ihren Code zu haben, was in den meisten Fällen wichtiger ist als Ihr eigenes Vertrauen.


2

Wenn schmutziger Code gut getestet ist, kann man ihm vertrauen. Das Problem ist, dass Unit-Tests von Dirty-Code normalerweise sehr schwierig und umständlich sind. Deshalb ist TDD so gut. Es enthüllt und entfernt Schmutz und Gerüche. Auch Unit-Tests sind oft das erste, was unter Zeitdruck leidet. Also, wenn der sauberste Kerl jemals den saubersten Code gemacht hätte, den er jemals gemacht hatte, würde ich ihm immer noch kein bisschen vertrauen, wenn er die Unit-Tests aus Zeitgründen weglassen würde.


2

Gute Programmierer (Quick & Dirty und andere) haben nicht die Hybris anzunehmen, dass sie es richtig gemacht haben. Sie gehen davon aus, dass alle großen Systeme Fehler und Mängel aufweisen, dass sie jedoch zu einem bestimmten Zeitpunkt ausreichend getestet und überprüft werden müssen, um ein ausreichend geringes Risiko oder ausreichend niedrige Ausfallkosten für die Auslieferung des Codes zu gewährleisten.

Warum gibt es diese sogenannten Quick & Dirty-Programmierer? Meine Hypothese ist die darwinistische Selektion. Programmierer, die funktionierenden Code schnell versenden, versenden gelegentlich, bevor der Wettbewerb ausläuft, oder das Budget knapp wird oder die Firma bankrott geht. Daher sind ihre Unternehmen immer noch im Geschäft und beschäftigen neue Programmierer, um sich über die Unordnung zu beschweren, die beseitigt werden muss. Sogenannte Clean-Code-Schiffe ebenfalls, aber nicht differenziell genug, um Quick & Dirty-Codierer vom Aussterben zu bedrohen.


Das ist wahr. Ich habe mindestens ein Produkt gesehen, das aufgrund von Quick & Dirty-Code, Warzen und allem versenden konnte. Zufällig bedeuteten ein paar Tage gegen einen Monat Vorsprung einen zweimonatigen Vorsprung auf die Konkurrenz. Das Produkt wurde ein Erfolg und der Quick & Dirty-Code wurde schließlich durch besseren Code ersetzt. Seitdem versuche ich, meine Codequalität nicht nur vom technischen Standpunkt aus, sondern auch aus geschäftlicher / wettbewerblicher Sicht besser zu betrachten. Hinweis: Die Schnittstelle des Codes war in Ordnung, die Implementierung war skizzenhaft.
J Trana

0

Man könnte wahrscheinlich denken, dass ein nicht optimaler Teil eines Codes aufgrund der kurzen Lebensdauer, der geringen Auswirkung auf das Geschäft oder der geringen Zeit, die zur Erledigung benötigt wird, keinen Unterschied machen könnte. Die richtige Antwort ist, dass Sie es nicht wirklich wissen. Jedes Mal, wenn ich jemandem zuhöre, der sagt, "das ist ein kleines Feature", oder "machen wir es so schnell und einfach wie möglich", und nicht genügend Zeit zum Nachdenken über das richtige Design aufbringe, die einzigen beiden Dinge, die tatsächlich und immer wieder auftreten sind:

1-) Das Projekt wird größer und die Motivation des Teams geringer. Es arbeitet an einem Code voller "Stiche". In diesem Fall wird das Projekt wahrscheinlich zu einer Überholspur in Richtung Chaos führen.

2-) Es wird bekannt, dass das Projekt eine nicht optimale Lösung ist, und es wird davon abgeraten, eine neue Lösung oder ein Refactoring zu wählen, das so teuer ist wie eine neue Lösung.

Versuchen Sie immer, den bestmöglichen Code zu erstellen. Wenn Sie nicht genug Zeit haben, erklären Sie, warum Sie mehr brauchen. Setzen Sie sich nicht mit schlecht gemachter Arbeit einem Risiko aus. Sei immer ein besserer Profi. Niemand kann Sie dafür bestrafen, wenn Sie vernünftig sind. Wenn ja, ist es nicht der Ort, an dem Sie arbeiten sollten.


0

Besprechen Sie dies mit dem Senior und bewerten Sie die Auswirkungen von Fehlern, falls vorhanden. Zum Beispiel dauert eine Situation, in der Sie das Problem beheben können, 1 Tag und ein robuster Code erfordert Design- und Architekturänderungen, die 4 bis 6 Monate dauern können, und eine zusätzliche Validierungszeit, um alle Workflows, die von der Designänderung betroffen waren, vollständig zu validieren.

Wir müssen eine Entscheidung treffen, die auf Zeit + Kapazität + Prioritäten in der Liste basiert. Eine gute Diskussion im Team mit Senioren oder Personen mit höherer Erfahrung kann dazu beitragen, eine Entscheidung zu treffen, die am besten zum Team und den erzielbaren Ergebnissen passt.

Clean Code ist der erste und wichtigste Ansatz, bei dem als Dirty Code Eskalationen, Go / No-Go-Entscheidungen der Kunden, Aufzeigen von Stoppern, Ansehen des Unternehmens auf dem Spiel stehen und vieles mehr, wo Dirty Code in Clean Code übergeht.


4
dies scheint nicht alles zu bieten erhebliche über Punkte gemacht und erläutert vor 23 Antworten
gnat
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.