Die Daily WTF sammelt seit 14 Jahren lustige, wilde und / oder traurige Geschichten aus der IT-Welt. Ich übersetzte mehrere Geschichten, die mir interessant erschienen. Alle Firmennamen und Namen wurden geändert. Der erste Teil ist
hier .
Die erste Geschichte. Trotz Großmutter ...
[ Original ]Clive verglich den Inhalt seines Bankkontos mit dem Tagessatz, der ihm angeboten wurde, wie es viele Freiberufler tun, und entschied, dass unter solchen Umständen
jeder Job zu ihm passen würde. Eine freie Stelle schien fast erträglich: Die Versicherungsgesellschaft benötigte ein neues Softwarepaket, mit dem sie einige gesetzliche Anforderungen erfüllen konnte. Darüber hinaus benötigte das Management jemanden, der den Entwicklern moderne Tools und Techniken beibringt ... zum Beispiel die Codeversionierung.
Clive ging das Interview brillant durch und ging eine Woche später zur Arbeit. Ein Brief von jemandem namens Brandon wartete im Briefkasten auf ihn. Es lautete: "Wir müssen uns treffen."
Brandon saß in seinem Büro, klebte an dem ergonomischen Stuhl Mitte der 90er Jahre und als würde er eins mit ihm. Er sah vom Monitor auf und sah Clive an. "Du arbeitest für mich."
In kurzen, aus einsilbigen Sätzen bestehenden Sätzen erklärte Brandon, dass keiner derjenigen, die die Einstellungsentscheidung getroffen hatten, sich mit Clive treffen würde. Clive ist nur ihm gegenüber verantwortlich.
„Okay ... Als ich eingestellt wurde, sagten sie, dass Sie Subversion konfigurieren müssen. Soll ich damit anfangen? “, Fragte Clive.
"Nein".
"Kann ich herausfinden warum?" Bevorzugen Sie etwas anderes? Möchten Sie Optionen besprechen? "
"Nein".
Clive wartete. Brandon hatte es nicht eilig, seine Gedanken zu entfalten. Er sah nur Clive an. Weiter zu sehen und zu sehen.
Clive kehrte langsam zu seinem Würfel zurück und begann mit dem Studium der Codebasis. Es befand sich auf einer Netzwerkfreigabe, und die Versionskontrolle lautete "file.pl.old", "file.pl.old.old". Es stellte sich heraus, dass der Code in Perl geschrieben ist und selbst nach Perl-Standards nicht lesbar ist. Er wuchs in einer Kultur von „Wenn es analysiert, beginnt es“ auf, enthielt keine Kommentare und hatte absolut keine Tests. Clives einziger Verbündeter war Lee, ein weiterer angestellter Spezialist, der
ebenfalls Brandon Bericht erstattete, aber ein zweiwöchiges Handicap bei der Code-Analyse hatte. Als Clive irgendwo feststeckte, schaute er hinter der Wand seines Würfels hervor und fragte Lee.
Wie ein Gletscher, der von einem Berg herabsteigt, ging Clive langsam durch den Code. Woche für Woche gewann er allmählich Verständnis. Und dann kam ein Brief von Brandon: "Wir müssen uns treffen."
"Sie stören das Entwicklungsteam", sagte er.
"Was?"
„Du und Li sind zu laut. Dies ist ein Büro, kein Interessenclub. “
„Das ist verrückt. Ich habe ihm gerade Fragen zur Arbeit gestellt! "Möchten Sie, dass wir Besprechungen im Konferenzraum arrangieren, um Fragen zu stellen?"
"Ja."
Brandon verstummte und starrte Clive erneut an. Er sah und sah ... Clive verstand den Hinweis und floh zu seinem Würfel.
Die Anforderungen waren verwirrend und änderten sich ständig, was nicht überraschend war. Der einzige Benutzer, der sie genau kannte, war Carol, was auch nicht überraschend war. Clive schickte ihr einen Brief mit Fragen und versuchte, seinen Job zu machen. Er wartete ein paar Tage auf ihre Antwort, dann hatte er neue Fragen und schickte neue Briefe.
In einer Woche schickte er ungefähr ein Dutzend Briefe, erhielt aber keine Antwort. Er schickte neue, um neue Informationen herauszufinden. In dieser Zeit haben sich noch mehr Fragen angesammelt. Clive versuchte sie anzurufen, stieß jedoch auf eine Voicemail. Er versuchte ein Treffen zu planen, aber Carol nahm seine Einladungen nie an.
Und dann kam ein Brief von Brandon: "Wir müssen uns treffen."
»Carol sagt, du drückst sie«, sagte Brandon.
"Was?"
„Du schickst ihr Briefe, auch nachdem sie die Fragen beantwortet hat. Sie sagte, dass Sie ein Treffen einberufen haben, aber nicht zu ihm gekommen sind. Das muss gestoppt werden. “
„Das ist verrückt. Sie hat nie geantwortet, ich kann meinen Posteingang zeigen und es beweisen. “
"Carol verwendet keine E-Mail", erklärte Brandon. „Die Praktikantin druckt ihre E-Mails aus und antwortet per E-Mail im Büro. Sie ist sehr beschäftigt. Sie haben eine technische Aufgabe. Folge ihm und hör auf, sie zu belästigen. “
„Was? "Soll ich die Lösung implementieren, ohne mit einem Benutzer zu sprechen, der alle Anforderungen kennt?"
Brandon sah ihn an. Er sah weiter zu und ...
Mit Lees Hilfe machte Clive in den nächsten Monaten bedeutende Fortschritte. Er lernte mit dem absurden Datumsformat umzugehen (Datumsangaben wurden als Anzahl der Tage ab dem 3. April 1974 sowie als Anzahl der
Monate ab dem vorhergehenden Montag und auch als Anzahl der
Wochen ab dem nächsten Sonntag gezählt). Sie befassten sich mit der Tatsache, dass niemand in der Lage sein sollte, Firefox auf Versionen höher als 3 zu aktualisieren, und mit der Tatsache, dass es unmöglich war, Überstunden zu leisten, da alle Server genau um 18 Uhr getrennt wurden. Carol blieb nicht in Kontakt, Brandon sah sie nur an und der Rest des Personals behandelte sie wie Aussätzige.
Einige Wochen vor Abschluss des Sechsmonatsvertrags untersuchte Clive den Inhalt des Netzwerklaufwerks des Unternehmens auf der Suche nach einer Tabelle mit Beispieldaten. Er fand einen Tisch mit dem Namen der Rekrutierungsfirma, die ihn eingestellt hatte, und hoffte, dass es etwas Nützliches war. In gewisser Weise war es.
Die Tabelle war ein Bericht, in dem angegeben wurde, wie viel das Personalvermittlungsunternehmen für Clive und Lee erhält. Die Summen waren so schamlos, dass selbst ein Gebrauchtwagenhändler rot wurde. Das Dokument enthielt Änderungsverfolgung und kollaborative Bearbeitung, sodass Clive Kommentare verschiedener Benutzer lesen konnte.
Auf der Ebene der Geschäftsleitung gingen Kommentare im Sinne von "Egal wie viel Sie ausgeben müssen" ein. Die Buchhalter warnten: "Wenn wir uns dafür entscheiden, haben wir am Ende des Jahres kein Geld mehr für Prämien!"
Brandon hinterließ eine eigene Notiz: „Unser Geschäft ist zu spezifisch. Sie werden nicht damit fertig. Geldverschwendung.
Sie können es nicht tun . "
Alles passte zusammen. Brandon sagte es nicht voraus,
machte aber
ein Versprechen . Und er wird es erfüllen - in den nächsten Wochen werden Clive und Lee nicht in der Lage sein, das zu tun, was ursprünglich versprochen wurde.
Bald erhielt er einen Brief von seinem Personalvermittler. „Dieses Unternehmen benötigt noch zusätzliches Personal. Möchten Sie den Vertrag um weitere sechs Monate verlängern? “
Von Brandon unterrichtet, antwortete Clive kurz: "Nein."
Die zweite Geschichte. Lass alles Unmögliche fallen ...
[ Original ]Lass alles Unmögliche fallen ...... und was bleibt, ist XML, wie unglaublich es auch sein mag.William Hogarth, eine absurde PerspektiveEntwickler haben viele Schwächen, und eine davon ist folgende: Sie sagen nicht gern, dass etwas nicht getan werden kann. Deshalb antwortete ein Kunde von
Glenn M , TelCo, als er fragte, ob ihre Aufgabe
wirklich unmöglich sei, anstatt sich zu entschuldigen und entschlossen den Kopf zu schütteln: "Nun,
theoretisch ..."
Infolgedessen schrieb Glenn Folgendes:
<value> <mult> <op> <mult> <op> <add> <op> <div> <op> <bitwise_and> <op> <baseNToInt base="16"> <regex> <op>(?:0x)?([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])</op> <op><getRowOid>.1.3.6.1.4.1.2011.2.217.1.4.1.1.6</getRowOid></op> <op>%4$s%3$s%2$s%1$s</op> </regex> </baseNToInt> </op> <op>8388607</op> </bitwise_and> </op> <op>8388608</op> </div> </op> <op>1</op> </add> </op> <op> <left_shift> <op>1</op> <op> <sub> <op> <bitwise_and> <op> <right_shift> <op> <baseNToInt base="16"> <regex> <op>(?:0x)?([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])</op> <op><getRowOid>.1.3.6.1.4.1.2011.2.217.1.4.1.1.6</getRowOid></op> <op>%4$s%3$s%2$s%1$s</op> </regex> </baseNToInt> </op> <op>23</op> </right_shift> </op> <op>255</op> </bitwise_and> </op> <op>127</op> </sub> </op> </left_shift> </op> </mult> </op> <op> <if> <op> <eq> <op> <bitwise_and> <op> <right_shift> <op> <baseNToInt base="16"> <regex> <op>(?:0x)?([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])</op> <op><getRowOid>.1.3.6.1.4.1.2011.2.217.1.4.1.1.6</getRowOid></op> <op>%4$s%3$s%2$s%1$s</op> </regex> </baseNToInt> </op> <op>31</op> </right_shift> </op> <op>1</op> </bitwise_and> </op> <op>1</op> </eq> </op> <op>-1</op> <op>1</op> </if> </op> </mult> </value>
Dies ist XML DDF, Datendefinitionsdatei für die von Glenn unterstützte Systemüberwachungsanwendung. Sie sehen, ein System kann Daten von jedem Gerät lesen, das Modbus / TCP- oder SNMP-Protokolle unterstützt, wenn es eine DDF-Datei hat, die die Datenpunkte definiert und wie sie angezeigt werden. Das DDF-Schema enthält die oben gezeigten arithmetischen, booleschen, regulären und bedingten Operatoren, die erforderlich sind, damit das System weiß, wie die Daten gelöscht werden.
XML-Logik? Ja, das ist WTF an sich. Aber die
echte WTF ist das, was der obige Code
tut . Das Unternehmen überwachte ein Gerät, das Temperaturwerte anzeigte (dies ist recht einfach zu lösen), diese jedoch in Form einer achtstelligen Zeichenfolge darstellte, die den Hexadezimalwert einer 32-Bit-Gleitkommazahl im IEEE-754-Format angibt. Die Aufgabe, die Glenn sofort als unmöglich erkennen musste, bestand darin, diesen verrückten Wert in eine numerische Form umzuwandeln. In DDF gab es trotz aller Ausdruckskraft keinen Typgussoperator.
Daher schrieb Glenn das oben gezeigte DDF, das Folgendes tat:
- Da die Bytereihenfolge umgekehrt wurde, verwenden Sie
<regex>
, um sie in die Reihenfolge zurückzusetzen, mit der Sie arbeiten können - Verwenden Sie
<baseNtoInt>
, um von octetString nach uint_32 zu konvertieren - Verwenden Sie
<bitwise_and>
und <right_shift>
, um das Vorzeichenbit, den Exponenten und die Mantisse zu trennen - Konvertieren Sie das vorzeichenbehaftete Bit in +/– 1
- Wir eliminieren den Exponentialoffset und führen dann
<left_shift>
1 mit diesem Wert aus - Teilen Sie die Mantisse durch 2 23
- Multiplizieren Sie die letzten drei Elemente, um das Endergebnis zu erhalten. Da
<mult>
und andere Operatoren nur zwei Operanden akzeptieren, müssen Aktionen verschachtelt werden
Beim nächsten Mal entschied sich Glenn, dieselbe Taktik anzuwenden, da er kürzlich gehört hatte, dass TelCo das Gerät so modifiziert, dass es die Temperatur in Ganzzahl anzeigt.
Die dritte Geschichte. Team A (nti)
[ Original ]In den 1980er Jahren wurde eine Fernsehserie namens Team A gedreht. In ihm war ein Schleicher, der jeden austricksen konnte. Um das zu bekommen, was er brauchte, machte er wahrheitsgemäße Versprechungen (wie Marketing?). Es gab einen coolen Mann im Team, der jeden einschüchtern konnte, um sein Ziel zu erreichen. Er wusste, wie man das Ziel erreicht, aber tief im Inneren war er ein guter Kerl. Das Team hatte einen Anführer, der immer einen Plan ausarbeiten und die Situation retten konnte. Und dann gab es einen etwas verrückten (aber auf gute Weise) Typen, auf den man sich im Kampf immer verlassen kann. Von Zeit zu Zeit erschien ein Assistent im Team, der sich mit Intervention und Intelligenz befasste. Diese Gruppe von Leuten arbeitete wie eine gut geölte Ausrüstung. Sie konnten nicht scheitern! Sie waren ein Team!
Team "A" hat nie eine Dokumentation zur Projektmanagement-Methodik geschrieben. Es überrascht nicht, dass sie alle gesuchte Kriminelle sind.Alex bekam einen Job in einem neuen Projekt, um ein veraltetes und nicht unterstütztes System zu ersetzen. Natürlich wurde festgestellt, dass das Unternehmen "alles richtig machen will!" Das Projekt ist vollständig finanziert. Das Team verfügt über die für die Ausführung der Arbeiten erforderliche Ausrüstung und das erforderliche Personal. Es gibt volle Unterstützung für sechs Führungsebenen sowie alle Benutzer. Alex war optimistisch.
Das erste, was das Unternehmen tat, war die Koordination zwischen all diesen unzähligen Führungsebenen, Endbenutzern, Supportmitarbeitern, Veteranen, die das Projekt unterstützten (damit sie die Probleme erklären konnten, die das alte System verschlimmerten) und den drei Architekten des neuen Systems. Die neue Architektur wurde von allen oben genannten Personen umfassend dokumentiert, genehmigt und signiert. Eine kritische Überprüfung wurde sogar von einer unabhängigen externen Aufsichtsbehörde durchgeführt, um sicherzustellen, dass die Aufsichtsbehörden zuversichtlich waren, dass der richtige Ansatz gewählt wurde.
In einem achtseitigen Dokument wurden Empfehlungen für die Codeentwicklung ausführlich beschrieben (z. B. Code-Formatierungsoptionen, Namenskonventionen, Komponententests, Codeabdeckung und andere ähnliche Aspekte, die für das Team wichtig sind). Das Dokument wurde überprüft und sollte von allen Personen befolgt werden, die an dem Projekt arbeiten.
Der Start des Projekts war gut.
Die erste Aufgabe bestand darin, Entwickler für das Team einzustellen. Zu diesem Zweck suchte das Unternehmen (sehr weit) nach Offshore-Spezialisten, um das günstigste Talent zu finden. Schließlich kann jeder trainiert werden, oder? Ein Team von insgesamt 11 Entwicklern verfügte über 13 Jahre Erfahrung, und ein Leiter mit fünfjähriger Erfahrung wurde beauftragt, diese zu verwalten.
Die nächste wichtige Entscheidung war die Wahl der zu verwendenden Datenbank. Das Unternehmen hat drei aktiv genutzt. Da alle Datenbanken auf zentralen Servern gespeichert waren, wurde einer von ihnen sofort ausgeschlossen: Die Ausrüstung der Datenbankserver war übermäßig leistungsfähig, um die erwartete Last innerhalb eines angemessenen Zeitraums zu bewältigen. Von den verbleibenden zwei nutzte eines der Teammitglieder aktiv eines. Sie kannten die Syntax, die Kuriositäten und die Einschränkungen. Der dritte wurde falsch eingerichtet und hatte daher den Ruf, unzuverlässig zu sein. Sie war jedoch auch der Unternehmensstandard. Trotz der Einwände des Teams wurde ein dritter ausgewählt.
Das Projektmanagement entschied, dass die Qualitätssicherung später eingestellt werden könnte.
Schließlich ist es Zeit, eine detaillierte Struktur zu implementieren. Der Leiter des Offshore-Teams entschied, dass Sie viel Zeit sparen können, wenn Sie das Design im laufenden Betrieb gemäß den Anforderungen erstellen. Natürlich waren die Architekten dagegen, aber der Projektmanager stimmte zu.
Architekten haben mit dem Bau der Controller-Engine und anderer grundlegender Prinzipien des Projekts begonnen. Das Junior-Team, das aus vielen Remote-Systemen eine Warteschlange für die Dateneingabe, das Kombinieren, Filtern und Vorverarbeiten erstellen sollte, entschied, dass es besser abschneiden würde als in der Architekturdokumentation beschrieben, und begann, eine eigene Methode zur Durchführung von Vorgängen zu entwickeln. Ohne dies den Architekten oder dem Management zu sagen.
Es war Zeit, den ersten Sprint zu überprüfen, und während der Überprüfung des Codes wurden viele Arten von „roten Fahnen“ entdeckt. Junior Lead sagte, dass Architekturdokumentation nur eine Empfehlung sei, die er ignorierte, um den Wünschen der Entwickler zu entsprechen. Dies löste natürlich eine Reaktion aus wie "Bist du wirklich da ...?" und ein paar Briefe entlang der Führungskette. Aber der Projektmanager und die Führung oben schienen daran nicht interessiert zu sein: Sie sagten, dass die Junioren dies nicht hätten tun sollen, aber sie vertrauten ihnen.
Die Arbeit ging weiter. Die Architekten wiesen weiterhin auf Mängel und Implementierungsfehler hin, die nicht mit den Anforderungen vereinbar waren. Alle Angebote wurden ignoriert, da der Leiter des Offshore-Teams sagte: „Google fördert eine Atmosphäre der Innovation und Kreativität. das müssen wir auch tun! “ Er wurde daran erinnert, dass Google (größtenteils) der „Think Tank“ ist und der Lead mit einem streng standardisierten Projekt in einer streng regulierten Branche arbeitet. Diese Architektur, die von mehr als vierzig Managern genehmigt wurde, ist keine Option oder Empfehlung, sondern eine Anforderung. Dass dies kein Kindergarten ist, in dem Kreativität gefördert wird - Sie müssen sich an den genehmigten Plan halten! Wir sprechen nicht darüber, wie eine Unterprozedur korrekt geschrieben oder ein Objekt gekapselt werden kann, aber diese Thread-Verarbeitung wurde falsch und an den falschen Stellen verwendet, und der Datenbankzugriff und die Interprozesskommunikation sind nicht skalierbar. Sie müssen nicht mehrere Prozesse erstellen, sondern nur Threads verwenden. Dass Sie Dateien nicht als Semaphoren verwenden sollten, nur weil sie dies in der Schule getan haben. Und die Liste wird noch lang sein.
Aber nichts davon wurde bemerkt. Die Juni-Entwickler beschwerten sich, dass sie bei der Erstellung der Architektur ihre Meinung nicht berücksichtigt hätten und sie daher weiterhin ignorieren würden (mit dem Segen ihres Leads). Der Projektmanager sagte weiterhin, er sei sich der Probleme bewusst, habe aber nichts damit gemacht. Probleme wurden in der Kette gemeldet, aber niemand tat etwas. Schließlich hat jeder im Team das gleiche Wahlrecht.
Wenn ein Schüler in der realen Welt denkt, dass der Lehrer sich irrt, ändert er seine Note nicht. Der Praktikant schneidet dort, wo der Chirurg ihn zeigt, und nicht umgekehrt. Der General bespricht die Strategie nicht mit der Basis. Wenn Sie einer Gewerkschaft beitreten und als Neuling die gleichen Befugnisse wie Gewerkschaftsführer fordern, ruhen Sie sich neben Jimmy Hoff aus
[einem amerikanischen Gewerkschaftsführer, der unter mysteriösen Umständen plötzlich verschwunden ist] . Erfahrung spricht mit Ausrufezeichen. Unerfahrenheit spricht zu Vernehmern.
Aber nicht in diesem "Team".
Die Junioren machten weiter, was sie für am besten hielten, und ignorierten alle Anfragen der Architekten. Der größte Teil ihres Codes wurde mehrmals geschrieben und kopiert, da die Jones beim ersten Mal nicht alles berücksichtigen konnten. Erfahrene Entwickler würden wissen, worauf sie sich verlassen können. Nach 8 Monaten erlitt das Projekt einen solchen Schaden, dass es einfach unmöglich war, die komplexesten Anforderungen zu erfüllen, und in einem Entwicklungsprojekt, das von vorne begann, musste vor einem Monat ein Rollback durchgeführt werden.
Ungefähr zu dieser Zeit erlag das Management Anfragen und forderte mehrere kommerzielle Benutzer auf, Tests auf kommerzieller Ebene zu schreiben (z. B. eine Tabelle, die für JUnit-Tests an JBehave gesendet werden kann). Die Entwickler stellten Code und einige einfache Beispiele in Tabellenkalkulationen zur Verfügung. Architekten sagten, sie müssten QS-Mitarbeiter einstellen, da Benutzer selten wissen, wie sie mit Grenzfällen, Genauigkeitsproblemen usw. umgehen sollen. Aber Geld konnte nicht ausgegeben werden. Nach sechsmonatigem Betrieb sagten kommerzielle Benutzer, dass alle Tests für die gesamte Anwendung (d. H. Die gesamte technische Aufgabe) bereit waren. Schon beim Betrachten konnte man verstehen, dass Grenzfälle, leere Beispiele, Genauigkeitsprobleme und die meisten anderen Aspekte, die normalerweise getestet werden müssen, nicht berücksichtigt wurden. Tatsächlich haben sie alle Datensätze, die theoretisch (aus ihrer Sicht) existieren könnten, in einem großen Pass-Fail-Test zusammengefasst. Wenn sich etwas ändert und ein Fehler unvermeidlich auftritt, gibt es natürlich keine Möglichkeit herauszufinden, wo es passiert ist.
Schließlich ging es so weit, dass die Architekten eine physische Wand zwischen den Teilen der Anwendung mit dem Setup-Code (geschrieben von einem Offshore-Team) und der Hauptmaschine (erstellt von Architekten) bauten. Unmittelbar nachdem die Hauptmaschine begonnen hatte, Daten zu mahlen, wurde jede Variable im System auf eine Statustabelle in der Datenbank zurückgesetzt, so dass bei unvermeidlichen Problemen Eingabedaten angezeigt wurden und Offshore-Entwicklern eine Korrekturanforderung gesendet werden konnte. Zumindest auf diese Weise konnten sie den Hauptmotor vom Müll isolieren.
Das Ministerium sparte eine Menge Geld durch den Einsatz billiger Arbeitskräfte, das Fehlen einer QS-Abteilung und die Verwendung einer „politisch soliden“ Datenbank. Natürlich war der gesamte vom Offshore-Team geschriebene Konfigurationscode schrecklich. Das meiste davon war schwer zu lernen, zu warten, zu debuggen und zu verbessern.
Das Produkt wurde noch nicht auf den Markt gebracht, und Benutzer beschweren sich bereits zu lange über die Diagnose und Behebung von Problemen (dies war einer der Hauptgründe für das Umschreiben eines alten Projekts). Und wenn das Umschreiben die Hauptaufgabe des Umschreibens nicht gelöst hat, dann ist wahrscheinlich etwas schiefgegangen ...
Die vierte Geschichte. Übergeben Sie den Nullzeiger
[
Original ]
Maxine hatte Probleme, die Website in einem Browser mit NoScript-Add-On anzuzeigen. Dies ist nicht überraschend - einige Browser funktionieren möglicherweise nicht richtig mit NoScript, aber es war überraschend, dass der Browser Java-Ausnahmen auslöste. Wenn Sie JavaScript aktivieren, verschwindet die Fehlerseite, aber wie ist es? Das Fehlen von JavaScript führt zu Java-Ausnahmen !?
Sie öffnete den Seitencode und stellte fest, dass der Server einen „innerCHK“ -Parameter erwartete. wahrscheinlich eine Art Sitzungs- oder Sicherheitstoken, das in der URL-Abfragezeichenfolge übergeben werden sollte. Wenn nicht, gibt der Server eine Fehlerseite zurück, auf der java.lang.NullPointerException angezeigt wird. Glücklicherweise haben die Front-End-Entwickler das folgende
großartige Stück JavaScript entwickelt, um das Problem zu lösen:
// Fehlerprüfung
if (document.body.innerHTML.indexOf ('java.lang' + '. NullPointerException')! = -1) {
if (document.location.href.indexOf ('innerCHK =') == -1) {
document.location.href = document.location.href + "& innerCHK =" + Math.random () * 10000;
}}
}}
// Prüfung beenden
Dies ist jedoch nur die Spitze des Eisbergs; Die Seite war mit Antimustern, neu erfundenen Rädern, Reserverädern und platten Reifen überladen. All dies wurde auf
Band festgehalten. Um ein Gefühl für den Stil einiger seltsamer String-Konvertierungen und des bevorzugten Antipatterns der Entwickler zu bekommen - schließen Sie Skripte, um in der nächsten Zeile ein neues zu öffnen. Schauen wir uns an, wie Dojo importiert wird. Bitte beachten Sie, dass das Dojo-Cookie importiert wird.
<script type = "text / javascript">
if (typeof dojo == "undefined") {
document.writeln ('<scr' + 'ipt src = "' + '/wps/themes/./dojo/portal_dojo/dojo/dojo.js' + '"> </ scr' + 'ipt>');
}}
if (typeof dijit == "undefined") {
document.writeln ('<scr' + 'ipt src = "' + '/wps/themes/./dojo/portal_dojo/dijit/dijit.js' + '"> </ scr' + 'ipt>');
}}
</ script>
<script type = "text / javascript">
dojo.require ("dijit.form.Button");
dojo.require ("dojo.cookie");
//dojo.require("dijit.form.DropDownButton ");
dojo.require ("dijit.Dialog");
dojo.require ("dijit.form.TextBox");
dojo.require ("dijit.form.CheckBox");
dojo.require ("dijit.form.ComboBox");
</ script>
Einige, wenn nicht alle CSS-Links werden auf diese Weise behandelt. Ich habe im Quellcode mindestens drei (identische) Vorkommen gefunden. Wiederholen Dojo.cookie wird importiert.
<script name = "DojoEnable_script" language = "JavaScript"> if (typeof dojo == "undefined") {
dojo.require ("dojo.cookie");
dojo.require ("dojo.parser");
djConfig = {parseOnLoad: false, isDebug: false};
document.write ("<script src = 'http: //www.****************.com: 80 / ps / PA_WPF / factory / dojo / dojo / dojo.js. '> </ "+" script> ");
document.write ("<link rel = 'stylesheet' type = 'text / css' href = 'http: //www.****************.com: 80 / ps /PA_WPF/factory/dojo/dojo/resources/dojo.css '/> ");
document.write ('<link rel = "stylesheet" type = "text / css" href = "http: //www.****************.com: 80 / ps /PA_WPF/factory/dojo/dijit/themes/tundra/tundra.css "/> ');
document.write ('<link rel = "stylesheet" type = "text / css" href = "http: //www.****************.com: 80 / ps /PA_WPF/factory/dojo/dijit/themes/tundra/tundra_rtl.css "/> ');
dojo.addOnLoad (function () {if (! document.body.className) document.body.className = 'tundra'});
}}
Jemand hat einmal gesagt, wenn Sie ein Problem mit regulären Ausdrücken lösen möchten, haben Sie
zwei Probleme. Ich denke, als er „zwei“ sagte, unterschätzte er die Situation.
var locale = 'en'.replace (/ _ /,' - '). replace (/ iw /,' he '). toLowerCase ();
Denken Sie daran, Kinder verwenden immer gut durchdachte Namen für Konstanten! Magische Zahlen sind schlecht. Außer 2008 ist alles in Ordnung mit ihm.
if (typeof (MONTHS_IN_YEAR) == 'undefined')
{
MONTHS_IN_YEAR = 12;
}}
if (typeof (isDisableDate) == 'undefined') {
var isDisableDate = Funktion (Datum, Jahr, Monat, Tag)
{
if (date.getFullYear () == 2008)
{
return true;
}}
return false;
}}
};
Keine schlecht implementierte Anwendung ist ohne die schlecht implementierte DateTime-Bibliothek vollständig. Es muss eine Art wissenschaftliches Gesetz geben.
var month = neues Array (12);
Monat [0] = "1";
Monat [1] = "2";
Monat [2] = "3";
Monat [3] = "4";
Monat [4] = "5";
Monat [5] = "6";
Monat [6] = "7";
Monat [7] = "8";
Monat [8] = "9";
Monat [9] = "10";
Monat [10] = "11";
Monat [11] = "12";
if (typeof (MONVALUE) == 'undefined')
{
MONVALUE = neues Array
("Jan",
"Feb",
"Mar",
"Apr",
"Mai",
"Jun",
"Jul",
"Aug",
"Sep",
"Okt",
"Nov",
"Dec");
}}
// Funktion konvertiert Datum von str nach Num
Funktion Month2Num (Monat)
{
if (month == "JAN") gibt "01" zurück; if (month == "FEB") gibt "02" zurück; if (month == "MAR") gibt "03" zurück; if (month == "APR" ) return "04"; if (month == "MAY") return "05";
if (month == "JUN") gibt "06" zurück; if (month == "JUL") gibt "07" zurück; if (month == "AUG") gibt "08" zurück; if (month == "SEP" ) "09" zurückgeben; if (month == "OCT") "10" zurückgeben;
if (month == "NOV") gibt "11" zurück; if (month == "DEC") gibt "12" zurück;
}}
Der Code enthält viele (häufig doppelte) CSS-Stile. Dies ist beispielsweise kein sehr blauer Stil.
div.wpfThemeBlueBackgroundPanelTable
{
Hintergrund: # F6F9FC;
Polsterung: 10px;
}}
/ * ---- Blaues Feld ---- * /
table.wpfThemeBlueBackgroundPanelTable
{
Hintergrund: # F6F9FC;
Polsterung: 10px;
}}
Als nächstes folgen zwei identische Arrays, von denen nur eines verwendet wird.
var arr_location_001 = new Array ();
var arr_location_002 = new Array ();
arr_location_001 ['AU'] = {Wert: 'AU', Titel: 'Australien', Text: 'Australien'};
arr_location_002 ['0'] = {Wert: 'AU', Titel: 'Australien', Text: 'Australien'};
arr_location_001 ['CA'] = {Wert: 'CA', Titel: 'Kanada', Text: 'Kanada'};
arr_location_002 ['1'] = {Wert: 'CA', Titel: 'Kanada', Text: 'Kanada'};
arr_location_001 ['CN'] = {Wert: 'CN', Titel: 'China', Text: 'China'};
arr_location_002 ['2'] = {Wert: 'CN', Titel: 'China', Text: 'China'};
arr_location_001 ['FR'] = {Wert: 'FR', Titel: 'Frankreich', Text: 'Frankreich'};
arr_location_002 ['3'] = {Wert: 'FR', Titel: 'Frankreich', Text: 'Frankreich'};
arr_location_001 ['HK'] = {Wert: 'HK', Titel: 'hong_kong', Text: 'Hong Kong'};
arr_location_002 ['4'] = {Wert: 'HK', Titel: 'hong_kong', Text: 'Hong Kong'};
/ * Fragment vieler Zeilen ähnlichen Codes * /
Hier ist ein weiteres schönes kleines Skript, das es geschafft hat, viel zu vermeiden, einschließlich seiner eigenen Skript-Tags! Der Entwickler erhält Bonuspunkte, wenn er sie in eine Zwangsjacke schreibt, die in einem mit Skorpionen gefüllten Sarg an einem Hubschrauber über dem Hudson hängt. (Tatsächlich ist dies möglicherweise die logischste Erklärung für den größten Teil des Codes.)
<SPAN name = "onloadScript"> <input type = "hidden"> Funktion onSelectInfo (Kalender, Datum, elem_date) {
elem_date = document.getElementById (& quot; Day_NArr & quot;);
elem_mon_year = document.getElementById (& quot; Month_NArr & quot;);
hidden_elem = document.getElementById (& quot; temp_date_NArr & quot;);
doOnSelect (Kalender, Datum, elem_date, elem_mon_year, hidden_elem);
}}
Calendar.setup (
{
inputField: & quot; temp_date_NArr & quot;, // ID des Eingabefelds
ifFormat: "% b,% e,% Y",
onSelect: onSelectInfo,
Bereich: [aktuelles Jahr, nächstes Jahr],
dateStatusFunc: dateStatusHandler,
Schaltfläche: & quot; cal_dep & quot; // ID der Schaltfläche
}}
);
var _InfoVerAccurateFunc = Klon (genaues Datum);
initializeDate (neues Array ('Month_NArr', 'Day_NArr'), _InfoVerAccurateFunc); ">
<script type = "text / javascript">
Erinnerst du dich an all die oben importierten dojo.cookie? Jemand hat eine Bibliotheksfunktion zum Lesen von Cookies hinzugefügt.
Trotzdem hielt es jemand anderes für notwendig , eine Copy-Paste-Funktion Get_Cookie aus dem Internet zu schreiben , aber nicht einmal, sondern viermal! Funktion Get_Cookie (check_name) {
// Zuerst teilen wir dieses Cookie in Name / Wert-Paare auf
// Hinweis: document.cookie gibt nur name = value zurück, nicht die anderen Komponenten
var a_all_cookies = document.cookie.split (';');
var a_temp_cookie = '';
var cookie_name = '';
var cookie_value = '';
var b_cookie_found = false;
für (i = 0; i <a_all_cookies.length; i ++) {
// Jetzt teilen wir jedes Name = Wert-Paar auf
a_temp_cookie = a_all_cookies [i] .split ('=');
// und schneiden Sie das linke / rechte Leerzeichen, während wir gerade dabei sind
cookie_name = a_temp_cookie [0] .replace (/ ^ \ s + | \ s + $ / g, '');
// wenn der extrahierte Name mit übergebenem check_name übereinstimmt
if (cookie_name == check_name) {
b_cookie_found = true;
// Wir müssen den Fall behandeln, in dem ein Cookie keinen Wert hat, aber existiert (also kein = Zeichen):
if (a_temp_cookie.length> 1) {
cookie_value = unescape (a_temp_cookie [1] .replace (/ ^ \ s + | \ s + $ / g, ''));
}}
// Beachten Sie, dass in Fällen, in denen Cookies initialisiert werden, aber kein Wert vorhanden ist, null zurückgegeben wird
return cookie_value;
Pause;
}}
a_temp_cookie = null;
cookie_name = '';
}}
if (! b_cookie_found) {
return null;
}}
}}
Ich denke, dass die von diesem Team verwendete Softwareentwicklungsmethode ein neu erstelltes System namens "Dolby auf STRG-C- und STRG-V-Tasten !!!!!! 11 !!!! 11! 11" ist. Ich bin sicher, dass es in naher Zukunft Agile ersetzen wird.Die fünfte Geschichte. Menschliche Roboter
[ Original ]Während der Gründung von SuperbServices, Inc florierte ihr Geschäft. Es war ein Segen und ein Fluch; Wie bei jedem Startup gab es mehr Arbeit als Hände. Die Verkaufsabteilung konnte ihren Erfolg nicht aufgeben, daher mussten sich die Techniker anpassen.Der CEO von SuperbServices, Inc gab Roland eine ernste Aufgabe, die das Unternehmen oder zumindest die psychische Gesundheit der Mitarbeiter retten könnte. "Wir müssen die gesamte Verarbeitung automatisieren, damit wir uns auf die Bereitstellung von Diensten konzentrieren können", sagte der CEO. „Das Wertvollste bei uns sind unsere Dienstleistungen, und alles andere ist unnötiger Aufwand. Sie müssen es automatisieren, und das werden Sie tun. Sie werden mit menschlichen Robotern zusammenarbeiten, um alles zu automatisieren: Bestätigung von Vorgängen, Einkäufe, Geldtransaktionen, Kunden-E-Mail - das ist alles! “"Mit ... menschlichen Robotern?"Roland hat eine neue Phobie. Die Serverabteilung des Unternehmens war selbst für Industriestandards ungewöhnlich exzentrisch. Nur wenige sahen seine Angestellten und nur seltsame Gerüchte kamen zu Roland.Als Roland an die Tür des Serverraums klopfte, erwachte die Überwachungskamera über seinem Kopf zum Leben und die teilnahmslose Stimme des Roboters fragte ihn: "WAS SUCHEN SIE?"„Äh, hi ... ich bin Roland, Projektmanager. Es scheint, als ob wir Jungs, oder wer seid ihr da, die Aufgaben automatisieren sollten? “"WAS BIETEN SIE UNS AN?", Antwortete die bedrohliche Metallstimme."Nun, ähm ... Roboter lieben Donuts?" Ich habe bei mir Das ist alles was es gibt. ""PASS". Das elektronische Schloss an der Tür öffnete sich mit einem Klick. Roland zog die Tür zu sich heran und die eisige Luft platzte von hinten. Tausende Lichter und Gestelle flackerten drinnen, in der Nähe stand ein kleiner Tisch. Über dem Tisch blitzte ein Licht. "HIER ANGEBOT", sagte das Maschinengewehr aus den Schatten.Roland stellte die Donutbox auf den Tisch und ging langsam weg. Ein Schrei von "DANKE!" Kam hinter ihm hervor. Roland sprang auf. Der mickrige Mann mit einem Sprachmodulator kicherte und schnappte sich einen Donut.„Hallo Roland, ich bin Roy“, sagte er und legte den Modulator beiseite. "Wir haben nicht viele Besucher, deshalb verspotten wir sie gerne. Müssen Sie etwas automatisieren? “Roland war überrascht, wie gewöhnlich Roy war und nicht, dass er wirklich ein Mensch war. "Ah, ja, der CEO sagte, dass Sie viel mit Robotern arbeiten und dass wir sie verwenden können, um alles zu automatisieren, was wir können", erläuterte Roland die Anforderungen und Spezifikationen.Roy seufzte. „Es ist schade, Sie zu enttäuschen, aber wir haben wirklich nichts mit Robotern zu tun, egal was das Geschlecht denkt. Er besteht darauf, dass Ruby der Name des Roboters ist, obwohl es nur eine Programmiersprache ist. Die meisten dieser Prozesse können wir jedoch automatisieren. Geben Sie uns zwei Wochen, so viele Donuts und Energy-Drinks, wie wir konsumieren können, und wir können damit umgehen. “In den nächsten zwei Wochen brachte Roland die angeforderten Angebote mit und erhielt im Austausch Informationen über den Fortschritt und die Demos von Funktionen. Roy und andere Roboter haben den Code geschrieben, und bald wurde der Berg Papierkram, den alle an der Spitze erledigten, auf die Server im Keller verlegt. Roland erklärte, dass der Großteil der Arbeit von „menschlichen Robotern“ geleistet wurde, aber der CEO lobte seine Bemühungen."Roland, das Meisterwerk ist erledigt, jetzt ziehen diese Maschinen die Hebel, die unser Geschäft in Gang setzen", klopfte ihm der Generaldirektor auf den Rücken. „Ihre Belohnung wird ein neues Projekt sein - ein weiteres Projekt mit der höchsten Priorität. Unsere Finanzabteilung bewältigt das Transaktionsvolumen nicht. Ich habe mit dem CFO gesprochen und sie möchte, dass Sie und die Roboter das neue Produkt, das wir gekauft haben, automatisieren - MoneyWorx. Lass mich nicht im Stich! "Roland kehrte in den Serverraum zurück. Wenn das vorherige Automatisierungsprojekt so einfach war, wird alles gleich sein, oder? Er zeigte Roy die Forderungen.Roys im Licht der Monitore gebräunte Haut wurde noch blasser. „Das ist schlecht, sehr schlecht! Gefahr! “, Rief Roy. Er winkte entsetzt mit den Händen. „Dies ist nicht MoneyWorx, sondern MoneyDoesntWorx. Selbst wenn Dienste ausgeführt werden, benötigen sie RSA-SecurID-Token. Jemand muss den Code manuell eingeben. ""Manuell?" Das heißt, damit das System funktioniert, muss jemand in der Leitung sein? “„Ja. Wir verwenden drei SecurID-Token. Wenn MoneyWorx nach einem neuen Code fragt, sollten normalerweise drei Personen in der Leitung sein. ""Also wird es nicht funktionieren. Wenn für Transaktionen Nachtanrufe entgegengenommen werden müssen, ist der CEO wütend. Und er hat bereits eine Vereinbarung unterzeichnet - wir müssen sicherstellen, dass das System funktioniert, ohne Menschen anzurufen. “Roy öffnete den Energiemann und schauderte. „Gib mir ein Wochenende, ich werde darüber nachdenken. Und ich werde mehr davon brauchen “, schüttelte er das Glas. "Und dieser", er zeigte auf eine Schachtel Donuts.Roland erschien am Wochenende und legte seine Angebote nieder. Roy akzeptierte sie, sagte aber nichts. Menschliche Roboter waren zu beschäftigt, um sich zu unterhalten. Als Montag ankam, kehrte Roland mit neuen Donuts und Energy Drinks zurück. "Eureka!", Rief Roy aus, als Roland eintrat. "Lass mich dir mein Meisterwerk zeigen!"Das „Meisterwerk“ war eine leere Donutbox, die zur Seite gestellt war. RSA-SecurID-Token wurden auf die Box geklebt. Das ganze System wurde vor einer billigen Webcam installiert. "Wenn MoneyJerks ein neues Zwei-Faktor-Token benötigt, kann jemand remote auf diesen Computer zugreifen, die Token überprüfen und den richtigen Code eingeben.""Glaubst du nicht, dass diese Box passwortgeschützt sein muss?", Schlug Roland vor."Glauben Sie, dass Benutzer sich daran erinnern werden, wie sie sich anmelden sollen?", Widersprach Roy.Es war wahrscheinlich die dümmste Idee, von der Roland gehört hatte, aber er berichtete sie oben und zeigte eine Demo der Lösungen im Büro des CEO. Nachdem er sich mit einer Webcam vom Auto getrennt hatte, duckte er sich und wartete auf Wutanfall.„Das ist großartig! Sie haben ihre Roboteraugen auf diese Scheiße gerichtet, und jetzt muss niemand in der Firma MoneyWorx sagen, was zu tun ist! Großartige Arbeit, Roland. Gratuliere mir von den Robotern. Ihr Roboter ist nur ein Wunder. “Roland war froh, dass die Arbeit abgeschlossen war, konnte aber das Gefühl nicht loswerden, dass er einen schrecklichen Fehler gemacht hatte. Die finanzielle Sicherheit des Unternehmens lag in den Händen einer billigen Webcam ohne jeglichen Schutz, mit Ausnahme des Fehlens einer öffentlichen IP-Adresse.Als die Katastrophe schließlich ausbrach, handelte es sich nicht um eine betrügerische Transaktion. Eine Donutbox fiel am späten Mittwochabend. Roland musste Roy anrufen, der ins Büro fuhr und die Box wieder aufstellte. Nach der Analyse der Fehlerursachen klebte Roy die Box mit Klebeband an das Server-Rack und sorgte so für eine konstante Betriebszeit.