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.
0 Stimmen
Das ist so ziemlich das, was ich zu sagen versuchte: Dies ist der Anfang dieser Art von Erkundung und ist nicht wirklich eine Frage, die beantwortet werden kann. Sie scheint an anderer Stelle besser aufgehoben zu sein (aber das schmälert nicht unbedingt ihre Nützlichkeit). FWIW, ich fand diese Frage als Teil der wtf tag cleanup . @rob
0 Stimmen
Es ist auf jeden Fall
isc-dhcp-server
(d.h. der Quellcode) Gute Arbeit, Leute!