Curieuses perversions du monde de l'informatique - 2

Le Daily WTF recueille depuis 14 ans des histoires drôles, folles et / ou tristes du monde informatique. J'ai traduit plusieurs histoires qui m'ont paru intéressantes. Tous les noms et noms d'entreprises ont été modifiés. La première partie est ici .

La première histoire. Malgré la grand-mère ...


[ Original ]

Clive a comparé le contenu de son compte bancaire avec le taux journalier qui lui était proposé, comme le font de nombreux pigistes, et a décidé que dans de telles circonstances, n'importe quel emploi lui conviendrait. Un poste vacant semblait presque tolérable: la compagnie d'assurance avait besoin d'un nouveau progiciel lui permettant de se conformer à certaines exigences légales. De plus, la direction avait besoin de quelqu'un pour enseigner aux développeurs les outils et techniques modernes ... par exemple, le versionnage de code.

Clive a brillamment passé l'entretien et une semaine plus tard, il est allé travailler. Une lettre de quelqu'un nommé Brandon l'attendait dans la boîte aux lettres. Il disait: "Nous devons nous rencontrer."

Brandon était assis dans son bureau, collé à la chaise ergonomique du milieu des années 90 et comme s'il ne faisait qu'un avec lui. Il leva les yeux du moniteur et regarda Clive. "Tu travailles pour moi."

Dans des phrases concises composées de monosyllabes, Brandon a expliqué qu'aucun de ceux qui ont pris la décision d'embauche ne rencontrerait Clive. Clive n'est responsable que devant lui.

«D'accord ... Alors, quand j'ai été embauché, ils ont dit que vous devez configurer Subversion. Dois-je commencer par ça? », A demandé Clive.

"Non"

"Puis-je savoir pourquoi?" Préférez-vous autre chose? Vous voulez discuter des options? "

"Non"

Clive attendit. Brandon n'était pas pressé de dévoiler sa pensée. Il regarda simplement Clive. Continué à regarder et à regarder.

Clive retourna lentement à son cube et commença par étudier la base de code. Il était situé sur un partage réseau et le contrôle de version était «file.pl.old», «file.pl.old.old». Il s'est avéré que le code est écrit en Perl et qu'il est illisible même selon les normes Perl. Il a grandi dans une culture du «si ça analyse, ça va commencer», ne contenait pas de commentaires et n'avait absolument aucun test. Le seul allié de Clive était Lee, un autre spécialiste embauché qui relevait également de Brandon, mais il avait un handicap de deux semaines en analyse de code. Lorsque Clive est resté coincé quelque part, il a regardé derrière le mur de son cube et a demandé à Lee.

Comme un glacier descendant d'une montagne, Clive a lentement parcouru le code. De semaine en semaine, il a progressivement acquis de la compréhension. Et puis une lettre est venue de Brandon: "Nous devons nous rencontrer."

«Vous interférez avec l'équipe de développement», a-t-il déclaré.

"Quoi?"

«Li et toi êtes trop bruyants. C'est un bureau, pas un club d'intérêt. »

«C'est fou. Je lui ai juste posé des questions sur le travail! "Voulez-vous que nous organisions des réunions dans la salle de conférence juste pour poser des questions?"

"Oui."

Brandon se tut et recommença à fixer Clive. Il regarda, et regarda ... Clive comprit l'allusion et s'enfuit vers son cube.

Les exigences étaient déroutantes et en constante évolution, ce qui n'était pas surprenant. Le seul utilisateur qui les connaissait exactement était Carol, ce qui n'était pas surprenant non plus. Clive lui a envoyé une lettre avec des questions et a essayé de faire son travail. Il a attendu quelques jours sa réponse, puis il a eu de nouvelles questions et il a envoyé de nouvelles lettres.

En une semaine, il a envoyé une douzaine de lettres, mais n'a reçu aucune réponse. Il en a envoyé de nouveaux pour découvrir de nouvelles informations. Pendant ce temps, encore plus de questions se sont accumulées. Clive a essayé de l'appeler, mais est tombé sur une messagerie vocale. Il a essayé de planifier une réunion, mais Carol n'a jamais accepté ses invitations.

Et puis une lettre est venue de Brandon: "Nous devons nous rencontrer."

"Carol dit que vous la poussez", a déclaré Brandon.

"Quoi?"

«Vous lui envoyez des lettres, même après qu'elle ait répondu aux questions. Elle a dit que vous aviez convoqué une réunion, mais que vous n'êtes pas venu le voir. Cela doit être arrêté. "

«C'est fou. Elle n'a jamais répondu, je peux montrer ma boîte de réception et le prouver. "

«Carol n'utilise pas le courrier électronique», a expliqué Brandon. «La stagiaire imprime ses courriels et elle répond par le courrier interne du bureau. Elle est très occupée. Vous avez une tâche technique. Suivez-le et arrêtez de la déranger. »

«Quoi? "Voulez-vous que je mette en œuvre la solution sans même parler à un utilisateur qui connaît toutes les exigences?"

Brandon le regarda. Il a continué à regarder et ...

Avec l'aide de Lee au cours des prochains mois, Clive a fait des progrès importants. Il a appris à gérer le format de date absurde (les dates étaient comptées comme le nombre de jours à partir du 3 avril 1974, et aussi comme le nombre de mois à partir du lundi précédent, et aussi comme le nombre de semaines à partir du dimanche suivant). Ils ont traité du fait que personne ne devrait pouvoir mettre à jour Firefox vers des versions supérieures à 3, et du fait qu'il était impossible de faire des heures supplémentaires, car tous les serveurs étaient déconnectés à exactement 18 heures. Carol n'a pas gardé le contact, Brandon les a simplement regardés et le reste du personnel les a traités comme des lépreux.

Quelques semaines avant la fin de leur contrat de six mois, Clive a étudié le contenu du lecteur réseau de l'entreprise à la recherche d'un tableur contenant des exemples de données. Il a trouvé une table avec le nom de la société de recrutement qui l'a embauché et espérait que c'était quelque chose d'utile. D'une certaine façon, ça l'était.

La feuille de calcul était un rapport indiquant combien la société de recrutement reçoit pour Clive et Lee. Les sommes étaient si impudiques qu'elles feraient rougir même un concessionnaire de voitures d'occasion. Le document comprenait le suivi des modifications et l'édition collaborative, afin que Clive puisse lire les commentaires faits par différents utilisateurs.

Du niveau de la haute direction, des commentaires ont été reçus dans l'esprit de «Peu importe combien vous devez dépenser». Les comptables ont prévenu: "Si nous y allons, nous n'aurons plus d'argent pour les primes à la fin de l'année!"

Brandon a laissé sa propre note: «Notre entreprise est trop spécifique. Ils ne s'en sortiront pas. Gaspillage d'argent. Ils ne peuvent pas le faire . "

Tout s'est mis en place. Brandon n'a pas prédit, mais a fait une promesse . Et il le réalisera - au cours des prochaines semaines, Clive et Lee ne pourront pas faire ce qui avait été promis à l'origine.

Bientôt, il a reçu une lettre de son recruteur. «Cette entreprise a encore besoin de personnel supplémentaire. Souhaitez-vous prolonger le contrat de six mois? »

Enseigné par Brandon, Clive a répondu rapidement: "Non".

La deuxième histoire. Lâchez tout impossible ...


[ Original ]

Lâchez tout impossible ...
... et ce qui reste est XML, aussi incroyable soit-il.


William Hogarth, une perspective absurde

Les développeurs ont de nombreuses faiblesses, et l'une d'elles est la suivante: ils n'aiment pas dire que quelque chose ne peut pas être fait. C'est pourquoi lorsqu'un client de Glenn M , TelCo, a demandé si sa tâche serait vraiment impossible, au lieu de s'excuser et de secouer la tête de manière décisive, il a répondu: "Eh bien, théoriquement ..."

En conséquence, Glenn a écrit ceci:

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

Il s'agit de XML DDF, fichier de définition de données pour l'application de surveillance du système prise en charge par Glenn. Vous voyez, un système peut lire les données de n'importe quel appareil qui prend en charge les protocoles Modbus / TCP ou SNMP s'il possède un fichier DDF qui définit les points de données et la façon dont ils sont affichés. Le schéma DDF contient les opérateurs arithmétiques, booléens, réguliers et conditionnels illustrés ci-dessus, nécessaires pour que le système sache comment effacer les données.

Logique XML? Oui, c'est WTF en soi. Mais le vrai WTF est ce que fait le code ci - dessus. La société a surveillé un appareil qui affichait des valeurs de température (c'est assez simple à résoudre), mais il les représentait sous la forme d'une chaîne de huit caractères indiquant la valeur hexadécimale d'un nombre à virgule flottante 32 bits au format IEEE-754. La tâche que Glenn a dû immédiatement reconnaître comme impossible était de convertir cette valeur folle en une forme numérique. En DDF, malgré toute sa puissance expressive, il n'y avait pas d'opérateur de fonte de type.

Par conséquent, Glenn a écrit le DDF illustré ci-dessus, qui a fait ce qui suit:

  • Étant donné que l'ordre des octets a été inversé, utilisez <regex> pour les ramener à l'ordre avec lequel vous pouvez travailler
  • Utilisez <baseNtoInt> pour convertir d' octetString en uint_32
  • Utilisez <bitwise_and> et <right_shift> pour séparer le bit de signe, l'exposant et la mantisse
  • Convertissez le bit signé en +/– 1
  • Nous éliminons le décalage exponentiel, puis <left_shift> 1 par cette valeur
  • Divisez la mantisse par 2 23
  • Multipliez les trois derniers éléments pour obtenir le résultat final. Puisque <mult> et les autres opérateurs n'acceptent que 2 opérandes, les actions doivent être imbriquées

La prochaine fois, Glenn a décidé de suivre la même tactique, car il avait récemment entendu dire que TelCo modifiait l'appareil pour qu'il affiche la température en entier.

La troisième histoire. Équipe A (nti)


[ Original ]

Dans les années 1980, une série télévisée intitulée Team A a été filmée. Il y avait une furtivité à l'intérieur de lui, capable de tromper n'importe qui. Pour obtenir ce dont il avait besoin, il a fait de vraies promesses (comme du marketing?). Il y avait un gars sympa dans l'équipe qui pouvait intimider n'importe qui afin d'atteindre son objectif. Il savait comment atteindre l'objectif, mais au fond, c'était un bon gars. L'équipe avait un leader qui pouvait toujours trouver un plan et sauver la situation. Et puis il y avait un gars un peu fou (mais dans le bon sens) sur lequel vous pouvez toujours compter au combat. De temps en temps, un assistant apparaissait dans l'équipe, engagé dans l'intervention et le renseignement. Ce groupe de gars fonctionnait comme un équipement bien huilé. Ils ne pouvaient pas échouer! C'était une équipe!


L'équipe «A» n'a jamais rédigé de documentation sur la méthodologie de gestion de projet. Sans surprise, ce sont tous des criminels recherchés.

Alex a obtenu un emploi dans un nouveau projet pour remplacer un système obsolète et non pris en charge. Naturellement, il a été déclaré que l'entreprise «cherche à tout faire correctement!» Le projet est entièrement financé. L'équipe disposera de l'équipement et du personnel nécessaires pour effectuer les travaux. Il existe un support complet pour six niveaux de leadership et tous les utilisateurs. Alex était optimiste.

La première chose que l'entreprise a faite a été de passer plusieurs mois à coordonner entre tous ces innombrables niveaux de leadership, utilisateurs finaux, personnes de soutien, vétérans qui ont soutenu le projet (afin qu'ils puissent expliquer les problèmes qui ont aggravé l'ancien système) et les trois architectes du nouveau système. La nouvelle architecture a été largement documentée, approuvée et signée par tout ce qui précède. Un examen critique a même été effectué par une agence indépendante d'audit de la réglementation pour s'assurer que les autorités réglementaires étaient convaincues que la bonne approche avait été adoptée.

Dans un document de huit pages, des recommandations pour le développement de code ont été décrites en détail (telles que: options de formatage de code, conventions de dénomination, tests unitaires, couverture de code et autres aspects similaires importants pour l'équipe). Le document a été révisé et doit être suivi par tous ceux qui travaillent sur le projet.

Le début du projet a été bon.

La première tâche a été d'embaucher des développeurs pour l'équipe. Pour ce faire, l'entreprise cherchait (très loin) des spécialistes offshore pour trouver les talents les moins chers possibles. Après tout, tout le monde peut être formé, non? Une équipe de 11 développeurs au total avait 13 ans d'expérience, et un responsable avec cinq ans d'expérience a été embauché pour les gérer.

La prochaine décision importante a été le choix de la base de données à utiliser. L'entreprise en a activement utilisé trois. Toutes les bases de données étant stockées sur des serveurs centralisés, l'une d'entre elles a été immédiatement exclue: l'équipement des serveurs de bases de données était excessivement puissant pour gérer la charge attendue dans un délai raisonnable. Parmi les deux autres, un des membres de l'équipe en a activement utilisé un. Ils connaissaient sa syntaxe, ses bizarreries et ses limites. Le troisième était mal installé et avait donc la réputation d'être peu fiable. Cependant, elle était également la norme de l'entreprise. Malgré les objections de l'équipe, un troisième a été choisi.

La direction du projet a décidé que l'AQ pourrait être recrutée plus tard.

Enfin, il est temps de mettre en place une structure détaillée. Le chef de l'équipe offshore a décidé que vous pouvez gagner beaucoup de temps si vous créez le design à la volée, conformément aux demandes. Bien sûr, les architectes étaient contre, mais le chef de projet a accepté.

Les architectes ont commencé à construire le moteur du contrôleur et d'autres principes fondamentaux du projet. L'équipe junior, qui était censée créer une file d'attente à partir d'une variété de systèmes distants pour la saisie, la combinaison, le filtrage et le prétraitement, a décidé qu'elle ferait mieux que ce qui est écrit dans la documentation architecturale et a commencé à développer sa propre façon d'effectuer les opérations. Sans le dire ni aux architectes ni à la direction.

Il était temps de vérifier le premier sprint, et lors de la révision du code, beaucoup de toutes sortes de «drapeaux rouges» ont été découverts. Junior Lead a déclaré que la documentation architecturale n'était qu'une recommandation qu'il ignorait pour répondre aux souhaits des développeurs. Naturellement, cela a provoqué une réaction comme "êtes-vous vraiment là ...?" et un tas de lettres dans la chaîne de leadership. Mais le chef de projet et la direction ci-dessus ne semblaient pas intéressés par cela: ils ont dit que les juniors n'auraient pas dû faire cela, mais ils leur faisaient confiance.

Le travail a continué. Les architectes ont continué de signaler des défauts et des défauts de mise en œuvre incompatibles avec les exigences. Toutes les offres ont été ignorées, car le chef de l'équipe offshore a déclaré: «Google favorise une atmosphère d'innovation et de créativité; nous devons le faire aussi! " Il lui a été rappelé que Google est (pour la plupart) le «think tank» et le chef de file travaille avec un projet strictement standardisé dans une industrie strictement réglementée. Cette architecture, approuvée par plus de quarante managers, n'est pas une option ou une recommandation, mais une exigence. Que ce n'est pas un jardin d'enfants, où la créativité est encouragée - vous devez adhérer au plan approuvé! Nous ne parlons pas de la façon d'écrire correctement une sous-procédure ou d'encapsuler un objet, mais ce traitement de thread a été utilisé de manière incorrecte et aux mauvais endroits, et l'accès aux bases de données et aux communications interprocessus ne sera pas évolutif. Ce dont vous avez besoin n'est pas de créer plusieurs processus, mais simplement d'utiliser des threads. Que vous ne devez pas utiliser de fichiers comme sémaphores simplement parce qu'ils l'ont fait à l'école. Et la liste sera encore longue.

Mais rien de tout cela n'a été remarqué. Les développeurs de juin se sont plaints que lors de la création de l'architecture, ils n'ont pas tenu compte de leurs opinions, ils continueront donc de l'ignorer (avec la bénédiction de leur chef). Le chef de projet a continué à dire qu'il était au courant des problèmes, mais n'a rien fait avec eux. Des problèmes ont été signalés en amont, mais personne n'a rien fait. Après tout, tous les membres de l'équipe ont un droit de vote égal.

Dans le monde réel, si un étudiant pense que l'enseignant se trompe, il ne change pas sa note. Le stagiaire coupe là où le chirurgien le montre, et non l'inverse. Le général ne discute pas de stratégie avec la base. Si vous adhérez à un syndicat, et en tant que novice, vous exigez les mêmes pouvoirs que les dirigeants syndicaux, alors vous vous reposerez à côté de Jimmy Hoff [un dirigeant syndical américain qui a soudainement disparu dans des circonstances mystérieuses] . L'expérience parle avec des points d'exclamation. L'inexpérience parle aux interrogateurs.

Mais pas dans cette "équipe".

Les juniors ont continué à faire ce qu'ils pensaient être le mieux, ignorant toutes les demandes des architectes. La plupart de leur code a été écrit et copié plusieurs fois, car les jones ne pouvaient pas tout prendre en compte la première fois. Les développeurs plus expérimentés sauront sur quoi compter. Après 8 mois, le projet a subi des dommages tels qu'il était tout simplement impossible de répondre aux exigences les plus complexes, et dans un projet de développement qui était parti de zéro, il a fallu revenir en arrière il y a un mois.

À cette époque, la direction a succombé aux demandes et a demandé à plusieurs utilisateurs commerciaux d'écrire des tests de niveau commercial (par exemple, une feuille de calcul qui peut être soumise à JBehave pour les tests JUnit). Les développeurs ont fourni du code et quelques exemples simples dans des feuilles de calcul. Les architectes ont déclaré qu'ils devaient embaucher du personnel d'assurance qualité, car les utilisateurs savent rarement comment traiter les cas limites, les problèmes de précision, etc. Mais l'argent ne pouvait pas être dépensé. Après six mois de fonctionnement, les utilisateurs commerciaux ont déclaré que tous les tests pour l'ensemble de l'application (c'est-à-dire l'ensemble de la tâche technique) étaient prêts. Rien qu'en le regardant, il était possible de comprendre qu'ils ne prenaient pas en compte les cas limites, les exemples vides, les problèmes de précision et la plupart des autres aspects qui nécessitent généralement des tests. En fait, ils ont mis tous les enregistrements qui pourraient théoriquement (de leur point de vue) exister dans un énorme test de réussite / échec. Bien sûr, lorsque quelque chose change et qu'un échec se produit inévitablement, il n'y a aucun moyen de savoir où cela s'est produit.

Enfin, les choses sont allées si loin que les architectes ont construit un mur physique entre les parties de l'application avec le code de configuration (écrit par une équipe offshore) et le moteur principal (créé par les architectes). Immédiatement après que le moteur principal a commencé à moudre les données, chaque variable du système a été réinitialisée dans une table d'état dans la base de données, de sorte qu'en cas de problèmes inévitables, les données d'entrée étaient affichées et les développeurs offshore pouvaient recevoir une demande de correction. Au moins de cette façon, ils pourraient isoler le moteur principal des ordures.

Le ministère a économisé une tonne d'argent grâce à l'utilisation d'une main-d'œuvre bon marché, à l'absence d'un service d'assurance qualité et à l'utilisation d'une base de données «politiquement solide». Bien sûr, tout le code de configuration écrit par l'équipe offshore était terrible. La plupart d'entre eux étaient difficiles à apprendre, à maintenir, à déboguer et à améliorer.

Le produit n'a pas encore été lancé, et les utilisateurs se plaignent déjà de diagnostiquer et de résoudre les problèmes depuis trop longtemps (c'était l'une des principales raisons de réécrire un ancien projet). Et si la réécriture n'a pas résolu la tâche principale de la réécriture, alors probablement quelque chose s'est mal passé ...

La quatrième histoire. Passer par un pointeur nul


[ Original ]

Maxine avait du mal à afficher le site Web dans un navigateur avec le module complémentaire NoScript. Ce n'est pas surprenant - certains navigateurs peuvent ne pas fonctionner correctement avec NoScript, mais il était surprenant que le navigateur ait lancé des exceptions Java. Lorsque vous activez JavaScript, la page d'erreur disparaît, mais comment est-elle? Le manque de JavaScript entraîne des exceptions Java!?

Elle a ouvert le code de la page et a constaté que le serveur attendait un paramètre «innerCHK»; probablement une sorte de session ou de jeton de sécurité qui devrait être passé dans la chaîne de requête URL. Sinon, le serveur renvoie une page d'erreur affichant java.lang.NullPointerException. Heureusement, les développeurs frontaux ont trouvé le bon morceau de JavaScript suivant pour résoudre le problème:

  // Vérification des erreurs
 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;
    }
 }
 // Fin du contrôle 

Mais ce n'est que la pointe de l'iceberg; la page était surchargée d'antipatterns, de roues réinventées, de roues de secours et de crevaisons. Tout cela a été enregistré sur bande magnétique . Pour avoir une idée du style de certaines conversions de chaînes étranges et de l'anti-modèle préféré des développeurs - fermer les scripts juste pour en ouvrir un nouveau sur la ligne suivante, examinons comment Dojo est importé. Veuillez noter que le cookie Dojo est importé.

  <script type = "text / javascript">
     if (typeof dojo == "indéfini") {        
         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>

Certains, sinon tous les liens CSS sont traités de cette façon. J'ai trouvé dans le code source au moins trois occurrences (identiques). Répéter Dojo.cookie est importé.

  <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'});
 }


Quelqu'un a dit un jour que si vous voulez résoudre un problème avec des expressions régulières, vous avez deux problèmes. Je pense qu'en disant «deux», il a sous-estimé la situation.

  var locale = 'en'.replace (/ _ /,' - '). replace (/ iw /,' he '). toLowerCase ();

N'oubliez pas que les enfants utilisent toujours des noms bien pensés pour les constantes! Les nombres magiques sont mauvais. Sauf 2008, tout va bien pour lui.

  if (typeof (MONTHS_IN_YEAR) == 'non défini')
 {
     MONTHS_IN_YEAR = 12;
 }

 if (typeof (isDisableDate) == 'undefined') {
     var isDisableDate = fonction (date, année, mois, iday)
     {
         if (date.getFullYear () == 2008)
         {
             return true;
         }
         retour faux;
     }
 };

Aucune application mal implémentée ne sera complète sans sa bibliothèque DateTime mal implémentée. Il doit y avoir une sorte de loi scientifique à ce sujet.

  mois var = nouveau tableau (12);
 mois [0] = "1";
 mois [1] = "2";
 mois [2] = "3";
 mois [3] = "4";
 mois [4] = "5";
 mois [5] = "6";
 mois [6] = "7";
 mois [7] = "8";
 mois [8] = "9";
 mois [9] = "10";
 mois [10] = "11";
 mois [11] = "12"; 

 if (typeof (MONVALUE) == 'non défini')
 {
     MONVALUE = nouveau tableau
     ("Jan",
      "Feb",
      "Mar",
      "Apr",
      "Mai",
      "Jun",
      "Jul",
      "Août",
      "Sep",
      "Oct",
      "Nov",
      "Dec");
 }

 // la fonction convertit la date de str en Num
 fonction Month2Num (mois)
 {
     if (month == "JAN") return "01"; if (month == "FEB") return "02"; if (month == "MAR") return "03"; if (month == "APR" ) retourne "04"; si (mois == "MAI") retourne "05";
     if (month == "JUN") return "06"; if (month == "JUL") return "07"; if (month == "AUG") return "08"; if (month == "SEP" ) retourne "09"; si (mois == "OCT") retourne "10";
     if (month == "NOV") return "11" if if (month == "DEC") return "12";
 }

Le code contient de nombreux styles CSS (souvent en double), par exemple, ce n'est pas un style très bleu.

  div.wpfThemeBlueBackgroundPanelTable  
 { 
     fond: # F6F9FC; 
     rembourrage: 10px; 
 } 
 / * ---- Panneau bleu ---- * / 
 table.wpfThemeBlueBackgroundPanelTable  
 { 
     fond: # F6F9FC; 
     rembourrage: 10px; 
 } 

Viennent ensuite deux tableaux identiques, dont un seul est utilisé.

  var arr_location_001 = new Array ();
 var arr_location_002 = new Array ();

 arr_location_001 ['AU'] = {valeur: 'AU', titre: 'australie', texte: 'Australie'};
 arr_location_002 ['0'] = {valeur: 'AU', titre: 'australie', texte: 'Australie'};

 arr_location_001 ['CA'] = {valeur: 'CA', titre: 'canada', texte: 'Canada'};
 arr_location_002 ['1'] = {valeur: 'CA', titre: 'canada', texte: 'Canada'};

 arr_location_001 ['CN'] = {valeur: 'CN', titre: 'chine', texte: 'Chine'};
 arr_location_002 ['2'] = {valeur: 'CN', titre: 'chine', texte: 'Chine'};

 arr_location_001 ['FR'] = {valeur: 'FR', titre: 'france', texte: 'France'};
 arr_location_002 ['3'] = {valeur: 'FR', titre: 'france', texte: 'France'};

 arr_location_001 ['HK'] = {valeur: 'HK', titre: 'hong_kong', texte: 'Hong Kong'};
 arr_location_002 ['4'] = {valeur: 'HK', titre: 'hong_kong', texte: 'Hong Kong'};

 / * fragment de plusieurs lignes de code similaire * /

Voici un autre petit script magnifique qui a réussi à éviter beaucoup de choses, y compris ses propres balises de script! Le développeur obtient des points bonus s'il l'a écrit dans une camisole de force, embarqué dans un cercueil rempli de scorpions, suspendu à un hélicoptère au-dessus de l'Hudson. (En fait, cela pourrait être l'explication la plus logique pour la plupart du code.)
  <SPAN name = "onloadScript"> <input type = "hidden"> fonction onSelectInfo (calendrier, date, date_elem) { 
     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 (calendrier, date, elem_date, elem_mon_year, hidden_elem); 
 } 

 Calendar.setup ( 
     { 
         inputField: & quot; temp_date_NArr & quot ;, // ID du champ de saisie 
         ifFormat: & quot;% b,% e,% Y & quot;, 
         onSelect: onSelectInfo, 
         plage: [currentYear, nextYear], 
         dateStatusFunc: dateStatusHandler, 
         bouton: & quot; cal_dep & quot;  // ID du bouton 

     } 
 ); 

 var _InfoVerAccurateFunc = clone (preciseDate); 
 initializeDate (new Array ('Month_NArr', 'Day_NArr'), _InfoVerAccurateFunc); ">
 <script type = "text / javascript">

Vous vous souvenez de tous les dojo.cookie importés ci-dessus? Quelqu'un a ajouté une fonction de bibliothèque pour lire les cookies.Néanmoins, quelqu'un d'autre a jugé nécessaire d'écrire une fonction copier-coller Get_Cookie à partir d'Internet, mais pas une, mais quatre fois!

 fonction Get_Cookie (check_name) {
    // nous allons d'abord diviser ce cookie en paires nom / valeur
    // note: document.cookie ne renvoie que nom = valeur, pas les autres composants
    var a_all_cookies = document.cookie.split (';');
    var a_temp_cookie = '';
    var cookie_name = '';
    var cookie_value = '';
    var b_cookie_found = false;

    pour (i = 0; i <a_all_cookies.length; i ++) {
        // maintenant nous allons séparer chaque paire nom = valeur
        a_temp_cookie = a_all_cookies [i] .split ('=');


        // et coupe les espaces gauche / droite pendant que nous y sommes
        cookie_name = a_temp_cookie [0] .replace (/ ^ \ s + | \ s + $ / g, '');

        // si le nom extrait correspond à passé check_name
        if (cookie_name == check_name) {
            b_cookie_found = true;
            // nous devons gérer le cas où le cookie n'a aucune valeur mais existe (non = signe, c'est-à-dire):
            if (a_temp_cookie.length> 1) {
                cookie_value = unescape (a_temp_cookie [1] .replace (/ ^ \ s + | \ s + $ / g, ''));
             }
            // notez que dans les cas où le cookie est initialisé mais sans valeur, null est retourné
            return cookie_value;
            casser;
         }
        a_temp_cookie = null;
        cookie_name = '';
     }
    si (! b_cookie_found) {
        return null;
     }
 }

Je pense que la méthode de développement logiciel utilisée par cette équipe est un nouveau système appelé «Dolby sur les touches CTRL-C et CTRL-V !!!!!! 11 !!!! 11! 11». Je suis sûr que dans un proche avenir, il remplacera Agile.

La cinquième histoire. Robots humains


[ Original ]

Pendant la formation de SuperbServices, Inc, son entreprise a prospéré. C'était une bénédiction et une malédiction; comme dans toute startup, il y avait plus de travail que de mains. Le service commercial n'a pas pu renoncer à son succès, les techniciens ont donc dû s'adapter.

Le PDG de SuperbServices, Inc a confié à Roland une tâche sérieuse qui pourrait sauver l'entreprise, ou du moins la santé mentale des employés. «Nous devons automatiser tout le traitement afin de pouvoir nous concentrer sur la fourniture de services», a déclaré le PDG. «La chose la plus précieuse avec nous, ce sont nos services, et tout le reste est inutile. Vous devez l'automatiser, et c'est ce que vous ferez. Vous coopérerez avec des robots humains pour tout automatiser: confirmation des opérations, achats, transactions de fonds, e-mail client - c'est tout! »

"Avec ... des robots humains?"

Roland a une nouvelle phobie. Le service serveur de l'entreprise était exceptionnellement excentrique, même selon les normes de l'industrie. Seuls quelques-uns ont vu ses employés et seules des rumeurs étranges sont venues à Roland.

Lorsque Roland a frappé à la porte de la salle des serveurs, la caméra de surveillance au-dessus de sa tête a pris vie et la voix impassible du robot lui a demandé: "QUE CHERCHEZ-VOUS?"

«Euh, salut ... Je suis Roland, chef de projet. Il semble que nous, les gars, ou qui êtes-vous là, devrions automatiser les tâches? »

"QUE NOUS OFFREZ-VOUS?" Répondit la voix menaçante du métal.

"Eh bien, euh ... les robots adorent les beignets?" J'ai avec moi. C'est tout ce qu'il y a. "

"PASS". La serrure électronique de la porte s'ouvrit d'un clic. Roland tira la porte vers lui et l'air glacé éclata par derrière. Des milliers de lumières et de supports scintillaient à l'intérieur, à proximité se trouvait une petite table. Une lumière a clignoté au-dessus de la table. "METTEZ L'OFFRE ICI", dit la mitrailleuse depuis l'ombre.

Roland posa la boîte à beignets sur la table et s'éloigna lentement. Un cri de "MERCI!" Vint de derrière lui. Roland sursauta. L'homme chétif avec un modulateur de voix gloussa et attrapa un beignet.

"Salut Roland, je suis Roy", dit-il, mettant de côté le modulateur. "Nous n'avons pas beaucoup de visiteurs, donc nous aimons nous moquer d'eux. Eh bien, avez-vous besoin d'automatiser quelque chose? "

Roland était surpris de voir à quel point Roy était ordinaire, et non pas qu'il était vraiment humain. "Ah, oui, le PDG a dit que vous travaillez beaucoup avec des robots et que nous pouvons les utiliser pour automatiser tout ce que nous pouvons", a expliqué Roland.

Roy soupira. «C'est dommage de vous décevoir, mais nous n'avons vraiment rien à voir avec les robots, quoi qu'en pense le genre. Il insiste sur le fait que Ruby est le nom du robot, bien qu'il ne s'agisse que d'un langage de programmation. Mais la plupart de ces processus peuvent être automatisés. Donnez-nous deux semaines, autant de beignets et de boissons énergisantes que nous pouvons en consommer, et nous pouvons les gérer. »

Au cours des deux semaines suivantes, Roland a apporté les offres demandées et a reçu en échange des informations sur l'avancement et les démos des fonctions. Roy et d'autres robots humains ont écrit le code, et bientôt la montagne de paperasse que tout le monde faisait était déplacée vers les serveurs du sous-sol. Roland a expliqué que la plupart du travail était effectué par des «robots humains», mais le PDG a salué ses efforts.

"Roland, le chef-d'œuvre a été fait, maintenant ces machines tirent les leviers qui mettent notre entreprise en mouvement", lui a tapoté le directeur général dans le dos. «Votre récompense sera un nouveau projet - un autre projet avec la plus haute priorité. Notre service financier ne gère pas le volume des transactions. J'ai parlé avec le directeur financier et elle veut que vous et les robots automatisiez le nouveau produit que nous avons acheté - MoneyWorx. Ne me laisse pas tomber! "

Roland est retourné dans la salle des serveurs. Si le projet d'automatisation précédent était si simple, alors tout sera le même, non? Il a montré à Roy les demandes.

La peau de Roy bronzée à la lumière des moniteurs est devenue encore plus pâle. «C'est mauvais, très mauvais! Danger! »Cria Roy. Il agita ses mains avec horreur. «Ce n'est pas MoneyWorx, mais MoneyDoesntWorx. Même lorsque les services sont en cours d'exécution, ils nécessitent des jetons RSA-SecurID. Quelqu'un doit saisir manuellement le code. "

"Manuellement?" Autrement dit, pour que le système fonctionne, quelqu'un doit être en ligne? »

«Oui. Nous utilisons trois jetons SecurID, donc généralement lorsque MoneyWorx demande un nouveau code, il devrait y avoir trois personnes sur la ligne. »

"Donc ça ne marchera pas. Si pour les transactions les gens doivent prendre des appels de nuit, le PDG sera furieux. Et il a déjà signé un accord - nous devons nous assurer que le système fonctionne sans appeler les gens. »

Roy ouvrit l'homme d'énergie et frissonna. «Donnez-moi un week-end, j'y penserai. Et j'en aurai besoin de plus », a-t-il secoué le pot. "Et celui-ci", il pointa du doigt une boîte de beignets.

Roland est apparu le week-end et a déposé ses offres. Roy les a acceptés, mais n'a rien dit. Les robots humains étaient trop occupés pour discuter. Lorsque lundi est arrivé, Roland est revenu avec de nouveaux beignets et des boissons énergisantes. "Eureka!" S'exclama Roy alors que Roland entrait. "Laissez-moi vous montrer mon chef-d'œuvre!"

Le «chef-d'œuvre» était une boîte à beignets vide mise de côté. Les jetons RSA-SecurID étaient collés sur la boîte. L'ensemble du système a été installé devant une webcam pas chère. "Lorsque MoneyJerks aura besoin d'un nouveau jeton à deux facteurs, quelqu'un peut accéder à distance à cette machine, vérifier les jetons et entrer le bon code."

"Ne pensez-vous pas que cette boîte doit être protégée par un mot de passe?", Suggéra Roland.

"Pensez-vous que les utilisateurs se souviendront comment se connecter?", Objecta Roy.

C'était probablement l'idée la plus stupide dont Roland avait entendu parler, mais il l'a rapportée à l'étage et a montré une démonstration de solutions dans le bureau du PDG. Après s'être déconnecté de la voiture avec une webcam, il grimaça, attendant une crise de colère.

«C'est génial! Ils ont tourné leurs yeux robotiques vers ces conneries, et maintenant, personne dans l'entreprise n'a besoin de dire à MoneyWorx quoi faire! Excellent travail, Roland. Félicitez-moi des robots. Leur robot n'est qu'un miracle. »

Roland était heureux que le travail soit terminé, mais ne pouvait se débarrasser du sentiment d'avoir commis une terrible erreur. La sécurité financière de l'entreprise était entre les mains d'une webcam bon marché sans aucune protection, à l'exception de l'absence d'une adresse IP publique.

image

Lorsque la catastrophe a finalement éclaté, elle n'a pas pris la forme d'une transaction frauduleuse. Une boîte à beignets est tombée tard mercredi soir. Roland a dû appeler Roy, qui s'est rendu au bureau et a remis la boîte en place. Après avoir analysé les causes de la panne, Roy a collé la boîte au rack du serveur avec du ruban électrique, assurant ainsi une disponibilité constante.

Source: https://habr.com/ru/post/fr437376/


All Articles