24 Stimmen

Welches ist das unsolideste Programm, das Sie betreuen mussten?

Regelmäßig werde ich zu Wartungsarbeiten an einem System gerufen, das von einem echten Raketenchirurgen gebaut wurde. Es gibt so viele Fehler, dass man gar nicht weiß, wo man anfangen soll.

Nein, warten Sie, ich fange am Anfang an: In den ersten Tagen des Projekts wurde dem Designer gesagt, dass das System skaliert werden muss, und er hatte gelesen, dass eine Quelle von Skalierbarkeitsproblemen der Datenverkehr zwischen den Anwendungs- und Datenbankservern ist, also stellte er sicher, dass dieser Verkehr minimiert wird. Und wie? Indem er die gesamte Anwendungslogik in SQL Server Stored Procedures unterbrachte.

Ganz im Ernst. Der größte Teil der Anwendung funktioniert, indem das HTML-Frontend XML-Nachrichten formuliert. Wenn die mittlere Ebene eine XML-Nachricht erhält, verwendet sie den Tag-Namen des Dokumentenelements als Namen der gespeicherten Prozedur, die sie aufrufen soll, und ruft die SP auf, wobei sie ihr die gesamte XML-Nachricht als Parameter übergibt. Die von der SP zurückgegebene XML-Nachricht wird direkt an das Frontend zurückgegeben. Es gibt keine weitere Logik in der Anwendungsschicht.

(Dort war etwas Code in der mittleren Schicht, um die eingehenden XML-Nachrichten anhand einer Bibliothek von Schemata zu validieren. Ich habe ihn jedoch entfernt, nachdem ich festgestellt hatte, dass 1) nur für eine kleine Handvoll von Nachrichten entsprechende Schemata vorhanden waren, 2) die Nachrichten nicht wirklich mit diesen Schemata übereinstimmten und 3) die Methode nach der Validierung der Nachrichten diese verwarf, wenn Fehler auftraten. "Dieser Sicherungskasten ist eine echte Zeitersparnis - er wird ab Werk mit vorinstallierten Groschen geliefert!")

Ich habe schon öfter Software gesehen, die das Falsche tut. Sehr viel sogar. Ich habe eine ganze Menge geschrieben. Aber ich habe noch nie etwas gesehen wie die stahlharte Entschlossenheit, das Falsche zu tun, bei jede mögliche Wendung die in der Gestaltung und Programmierung dieses Systems zum Ausdruck kommt.

Wenigstens hat er sich an das gehalten, was er wusste, oder? Hm. Offenbar war das, was er wusste, Access. Und er hat nicht wirklich verstehen. Zugang. Oder Datenbanken.

Hier ist ein häufiges Muster in diesem Code:

SELECT @TestCodeID FROM TestCode WHERE TestCode = @TestCode

SELECT @CountryID FROM Country WHERE CountryAbbr = @CountryAbbr

SELECT Invoice.\*, TestCode.\*, Country.\*
   FROM Invoice
   JOIN TestCode ON Invoice.TestCodeID = TestCode.ID
   JOIN Country ON Invoice.CountryID = Country.ID
   WHERE Invoice.TestCodeID = @TestCodeID AND Invoice.CountryID = @CountryID

Okay, gut. Sie trauen dem Abfrageoptimierer auch nicht. Aber wie wäre es damit? (Ursprünglich wollte ich dies unter Was ist der beste Kommentar im Quellcode, der Ihnen je begegnet ist? aber ich merkte, dass es so viel mehr zu schreiben gab als nur diesen einen Kommentar, und die Dinge liefen aus dem Ruder). Am Ende vieler gespeicherter Utility-Prozeduren sehen Sie Code, der wie der folgende aussieht:

\-- Fix NULLs
SET @TargetValue = ISNULL(@TargetValue, -9999)

Ja, dieser Code tut genau das, was Sie sich nicht vorstellen können, um nicht verrückt zu werden. Wenn die Variable eine NULL enthält, alarmiert er den Aufrufer, indem er ihren Wert in -9999 ändert. Hier sehen Sie, wie diese Zahl üblicherweise verwendet wird:

\-- Get target value
EXEC ap\_GetTargetValue @Param1, @Param2, OUTPUT @TargetValue
-- Check target value for NULL value
IF @TargetValue = -9999
    ...

Wirklich.

Eine weitere Dimension dieses Systems finden Sie in dem Artikel auf thedailywtf.com mit dem Titel Ich denke, ich werde sie "Transaktionen" nennen. . Ich denke mir das alles nicht aus. Ich schwöre es.

Wenn ich an diesem System arbeite, werde ich oft an die berühmte Antwort von Wolfgang Pauli an einen Studenten erinnert: "Das ist nicht richtig. Es ist nicht einmal falsch."

Dies kann nicht wirklich das schlechteste Programm aller Zeiten sein. Es ist definitiv das schlechteste, an dem ich in meiner gesamten 30-jährigen (huch) Karriere gearbeitet habe. Aber ich habe nicht alles gesehen. Was haben Sie gesehen?

2 Stimmen

So.... Das ist eigentlich keine Frage, sondern eher eine Entlüftung! Ich nehme an, du fragst rhetorisch: Kannst du das toppen! ...Hmmm...

0 Stimmen

Dies scheint besser für Ihren Blog oder eine Website geeignet zu sein der Diskussion gewidmet .

0 Stimmen

Ich habe die Frage gestellt, weil ich dachte (und immer noch denke), dass die Antworten darauf nützlich sein könnten. Fehleranalysen bei Software werden in der Regel erst dann durchgeführt, wenn die Software komplett versagt hat (wenn überhaupt); schreckliche Fehler, die nur durch Mühen am Leben erhalten werden, werden oft nur von ein oder zwei Personen wirklich verstanden. Wie schlecht kann eine Software sein und trotzdem nützlich sein? Wie sind solche Dinge entstanden, und welche Anstrengungen sind nötig, um sie zu unterstützen? Es ist schwer, diese Fragen systematisch zu erforschen, aber sie sind es wert, erforscht zu werden.

41voto

C. Broadbent Punkte 763

Ich habe einmal versucht, ein Buch zu schreiben MP3 Decoder. Es hat nicht funktioniert.

1 Stimmen

In der Annahme, dass das Wortspiel beabsichtigt war, erhalten Sie meine "Upvote", Sir, sehr schön, und es ist ja nicht so, dass diese subjektiven Fragen überhaupt eine ernsthafte Antwort verdienen.

13 Stimmen

"unsolide", denke ich. Nicht das beste Wortspiel, das ich je gehört habe :P

0 Stimmen

Bonuspunkte gibt es allerdings dafür, dass sie schwer zu entdecken sind.

19voto

Schwern Punkte 138322

Ich habe behauptet ExtUtils::MakeMaker . MakeMaker ist sicherlich nicht der schlechteste Code, den ich zu pflegen hatte; er ist tatsächlich ein technisches Wunderwerk. Er gehört jedoch zu jener einzigartigen Klasse von Programmier-Horror, bei der der aufgabenkritischste Code auch der schrecklichste ist.

MakeMaker ist das Installationsprogramm für die meisten Perl-Module. Wenn Sie "Makefile.PL" ausführen, rufen Sie MakeMaker auf. Wenn MakeMaker versagt, versagt auch Perl. Perl läuft auf allem, also muss auch MakeMaker auf allem laufen. Wenn ich "alles" sage, meine ich "ALLES". Jede bizarre Unix-Variante. Ab Windows 95 aufwärts. Und VMS . Ja, VMS.

Was macht MakeMaker? Makefile.PL ist ein Perl-Programm, das ein Makefile schreibt, das Shell-Befehle enthält, die oft Perl ausführen, um ein Perl-Modul zu bauen und zu installieren. Ich wiederhole: Es schreibt Shell-Befehle, um Perl auszuführen. Perl, die Sprache, die die Shell-Skripte ersetzt.

Oh, es kann auch C-Code kompilieren und verknüpfen. Und es kann auch statisch Perl-Module in Perl linken. Oh, und es kann RCS-Checkouts verwalten. Oh, und rollt Tarballs Ihrer Distribution... und Zip-Dateien. Und all diese anderen Dinge tun, die vage mit der Installation von Modulen zu tun haben.

Und all dies muss auf tragbare, rückwärtskompatible Weise geschehen. Es muss sich mit Varianten und Fehlern in...

  • make (GNU make, BSD make, nmake, dmake, mms, mmk, um nur einige zu nennen)
  • Shell
  • Perl
  • Das Dateisystem (wenn Sie glauben, dass das keine große Sache ist, versuchen Sie VMS)
  • C-Kompilierer und Linker

Es darf auf keinen Fall scheitern und muss zu 100 % abwärtskompatibel bleiben.

Oh, und es hat sehr wenig in der Art einer echten Erweiterung API, so dass es mit der ad hoc Makefile hackery Leute zu tun haben, um es zu erweitern kompatibel bleiben.

Warum tut sie das alles? Vor 15 Jahren, als Perl nur unter Unix lief, schien dies eine großartige Idee zu sein. Warum ein ganzes Build-System schreiben, wenn man einfach make benutzen kann? Perl ist eine Textverarbeitungssprache; wir werden sie einfach benutzen, um ein Makefile zu schreiben!

Zum Glück gibt es einen Ersatz, Modul::Bauen und ich habe gehofft, dass es MakeMaker schnell erledigen würde. Aber es wurde nur langsam angenommen, und die Community war sehr resistent gegen die Änderung, so dass ich MakeMaker weiterhin beibehalten werde.

12voto

Rob Punkte 1963

Welches ist das unsolideste Programm, das Sie betreuen mussten?

Alles, was ich je geschrieben habe!

Ganz im Ernst. Je mehr ich Blogs lese, Podcasts höre und Seiten wie diese verfolge, desto mehr lerne ich jeden Tag. Und jeden Tag wird mir klar, dass alles, was ich gestern geschrieben habe, in irgendeiner Weise falsch ist. Ich habe Mitleid mit den armen Trotteln, die die Dinge, die ich zu Beginn meiner Karriere geschrieben habe, aufrechterhalten.

3 Stimmen

Oh, ich auch. Aber es gibt einen Unterschied zwischen schlechtem Code und Code, der grundlegend und entsetzlich falsch ist. Es braucht mehr als nur Unerfahrenheit, um diese Art von Code zu schreiben; es braucht riesige Mengen an ungerechtfertigtem Selbstvertrauen.

7voto

graham.reeds Punkte 15745

Die, mit der ich gerade begonnen habe.

  1. Keine Quellenkontrolle.
  2. Alle Quellen werden live bearbeitet. Um Fehler zu vermeiden, gibt es Sicherungsdateien wie db-access.php.070821, die den Quellbaum übersäen.
  3. Der Code ist außerordentlich spröde - es gibt nur sehr wenige Fehlerkontrollen und absolut keine Rückzugsmöglichkeiten, wenn ein Fehler auftritt.

2 Stimmen

Warten Sie auf jeden Fall ein paar Tage, während sie versuchen, ihren Fehler rückgängig zu machen. Das macht die daraus resultierenden Gesichtsausdrücke viel interessanter.

1 Stimmen

Es ist ein verteiltes Internetprojekt, aber mit echtem Geld. Ich habe auf svn herumgehämmert und bisher ist nichts passiert.

0 Stimmen

Brechen Sie den Bau einfach ab. Dann lassen Sie es eine Woche lang kaputt sein. Dann werden sie vielleicht den Nutzen der Versionskontrolle erkennen =D

5voto

MikeJ-UK Punkte 620

Ich musste einmal eine alte C-Anwendung warten, die zuvor von Programmierern geschrieben und gewartet worden war, die den Willen zum Programmieren (und möglicherweise zum Leben) verloren hatten. Es gab zu viele WTFs, um sie zu erwähnen, aber ich erinnere mich an eine boolesche Funktion, die in verschiedenen Sonderfällen WAHR+1, WAHR+2 usw. zurückgab.

Dann las ich Roedy Green's Essay und habe viel gelacht, bis mir klar wurde, dass ich es deshalb lustig fand, weil ich die meisten Beispiele aus dem Code wiedererkannte, den ich pflege. (Dieser Aufsatz ist im Laufe der Jahre etwas aufgebläht worden, aber er ist immer noch einen Blick wert).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X