Perversiones curiosas del mundo de TI - 2

El Daily WTF ha estado recopilando historias divertidas, salvajes y / o tristes del mundo de TI durante 14 años. Traduje varias historias que me parecieron interesantes. Todos los nombres de compañías y nombres han sido cambiados. La primera parte está aquí .

La primera historia A pesar de la abuela ...


[ Original ]

Clive comparó el contenido de su cuenta bancaria con la tasa diaria que le ofrecían, como hacen muchos freelancers, y decidió que, en tales circunstancias, cualquier trabajo sería adecuado para él. Una vacante parecía casi tolerable: la compañía de seguros necesitaba un nuevo paquete de software que le permitiera cumplir con algunos requisitos legales. Además, la administración necesitaba a alguien para enseñar a los desarrolladores herramientas y técnicas modernas ... por ejemplo, el control de versiones de código.

Clive repasó brillantemente la entrevista y una semana después se fue a trabajar. Una carta de alguien llamado Brandon lo estaba esperando en el buzón. Decía: "Debemos encontrarnos".

Brandon estaba sentado en su oficina, pegado a la silla ergonómica de mediados de los 90 y como si fuera uno con él. Levantó la vista del monitor y miró a Clive. "Trabajas para mí".

En frases concisas que consisten en monosílabos, Brandon explicó que ninguno de los que tomaron la decisión de contratación se reuniría con Clive. Clive es responsable solo de él.

"Está bien ... Entonces, cuando me contrataron, me dijeron que necesita configurar Subversion. ¿Debería comenzar con esto? ”Preguntó Clive.

"No"

"¿Puedo averiguar por qué?" ¿Prefieres algo más? ¿Quieres discutir opciones?

"No"

Clive esperó. Brandon no tenía prisa por desarrollar su pensamiento. Solo miró a Clive. Continúa mirando y mirando.

Clive regresó lentamente a su cubo y comenzó a estudiar la base del código. Estaba ubicado en un recurso compartido de red, y el control de versiones era "file.pl.old", "file.pl.old.old". Resultó que el código está escrito en Perl, y que es ilegible incluso para los estándares de Perl. Creció en una cultura de "si se analiza, comenzará", no contenía comentarios y no tenía absolutamente ninguna prueba. El único aliado de Clive era Lee, otro especialista contratado que también informó a Brandon, pero tenía una desventaja de dos semanas en el análisis de código. Cuando Clive se quedó atascado en algún lugar, miró por detrás de la pared de su cubo y le preguntó a Lee.

Como un glaciar que desciende de una montaña, Clive se abrió paso lentamente a través del código. Semana a semana, gradualmente ganó comprensión. Y luego llegó una carta de Brandon: "Necesitamos encontrarnos".

"Interfieres con el equipo de desarrollo", dijo.

"¿Qué?"

“Tú y Li son demasiado ruidosos. Esta es una oficina, no un club de intereses ".

“Esto es una locura. ¡Acabo de hacerle preguntas sobre el trabajo! "¿Quieres que organicemos reuniones en la sala de conferencias solo para hacer preguntas?"

"Sí".

Brandon se calló y de nuevo comenzó a mirar a Clive. Miró y miró ... Clive entendió la pista y huyó a su cubo.

Los requisitos eran confusos y cambiaban constantemente, lo cual no era sorprendente. El único usuario que los conocía exactamente era Carol, lo cual tampoco fue sorprendente. Clive le envió una carta con preguntas e intentó hacer su trabajo. Esperó unos días por su respuesta, luego tuvo nuevas preguntas y envió nuevas cartas.

En una semana envió una docena de cartas, pero no recibió respuesta. Envió nuevos para descubrir nueva información. Durante este tiempo, se han acumulado aún más preguntas. Clive intentó llamarla, pero se encontró con un correo de voz. Intentó programar una reunión, pero Carol nunca aceptó sus invitaciones.

Y luego llegó una carta de Brandon: "Necesitamos encontrarnos".

"Carol dice que la estás presionando", dijo Brandon.

"¿Qué?"

“Le envías cartas, incluso después de que ella responde las preguntas. Ella dijo que convocaste una reunión, pero no viniste a él. Esto debe ser detenido.

“Esto es una locura. Ella nunca respondió, puedo mostrar mi bandeja de entrada y probarlo ".

"Carol no usa el correo electrónico", explicó Brandon. “La pasante imprime sus correos electrónicos y responde por el correo interno de la oficina. Ella esta muy ocupada. Tienes una tarea técnica. Síguela y deja de molestarla.

"¿Qué? "¿Quieres que implemente la solución sin siquiera hablar con un usuario que conozca todos los requisitos?"

Brandon lo miró. Él continuó mirando y ...

Con la ayuda de Lee durante los próximos meses, Clive hizo un progreso significativo. Aprendió a lidiar con el formato de fecha absurdo (las fechas se contaron como el número de días desde el 3 de abril de 1974, y también como el número de meses desde el lunes anterior, y también como el número de semanas desde el próximo domingo). Se ocuparon del hecho de que nadie debería poder actualizar Firefox a versiones superiores a la 3, y del hecho de que era imposible trabajar horas extras, porque todos los servidores estaban desconectados exactamente a las 6 p.m. Carol no se mantuvo en contacto, Brandon solo los miró y el resto del personal los trató como leprosos.

Unas semanas antes de la finalización de su contrato de seis meses, Clive estudió el contenido de la unidad de red de la compañía en busca de una hoja de cálculo con datos de muestra. Encontró una mesa con el nombre de la empresa de reclutamiento que lo contrató y esperó que fuera algo útil. En cierto modo, lo fue.

La hoja de cálculo era un informe que informaba cuánto recibe la empresa de reclutamiento por Clive y Lee. Las sumas eran tan desvergonzadas que harían sonrojar incluso a un concesionario de autos usados. El documento incluía el seguimiento de cambios y la edición colaborativa, para que Clive pudiera leer los comentarios hechos por diferentes usuarios.

Desde el nivel de la alta gerencia, se recibieron comentarios en el espíritu de "No importa cuánto tenga que gastar". Los contadores advirtieron: "¡Si lo hacemos, no tendremos dinero para las primas al final del año!"

Brandon dejó su propia nota: “Nuestro negocio es demasiado específico. No van a hacer frente. Desperdicio de dinero. No pueden hacerlo ".

Todo cayó en su lugar. Brandon no predijo, pero hizo una promesa . Y lo cumplirá: en las próximas semanas, Clive y Lee no podrán hacer lo que se prometió originalmente.

Pronto recibió una carta de su reclutador. “Esta empresa aún necesita personal adicional. ¿Le gustaría extender el contrato por otros seis meses?

Enseñado por Brandon, Clive respondió brevemente: "No".

La segunda historia. Deja todo imposible ...


[ Original ]

Deja todo imposible ...
... y lo que queda es XML, por increíble que sea.


William Hogarth, una perspectiva absurda

Los desarrolladores tienen muchas debilidades, y una de ellas es esta: no les gusta decir que no se puede hacer algo. Es por eso que cuando un cliente de Glenn M , TelCo, le preguntó si su tarea sería realmente imposible, en lugar de disculparse y sacudir decisivamente la cabeza, respondió: "Bueno, en teoría ..."

Como resultado, Glenn escribió esto:

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

Este es XML DDF, archivo de definición de datos para la aplicación de monitoreo del sistema que Glenn admite. Verá, un sistema puede leer datos de cualquier dispositivo que admita protocolos Modbus / TCP o SNMP si tiene un archivo DDF que defina los puntos de datos y cómo se muestran. El esquema DDF contiene los operadores aritméticos, booleanos, regulares y condicionales que se muestran arriba, necesarios para que el sistema sepa cómo borrar los datos.

Lógica XML? Sí, esto es WTF en sí mismo. Pero el verdadero WTF es lo que hace el código anterior. La compañía monitoreó un dispositivo que mostraba valores de temperatura (esto es bastante simple de resolver), pero los representó como una cadena de ocho caracteres que indica el valor hexadecimal de un número de coma flotante de 32 bits en el formato IEEE-754. La tarea que Glenn tuvo que reconocer de inmediato como imposible fue convertir este valor loco en una forma numérica. En DDF, a pesar de todo su poder expresivo, no había ningún tipo de operador de reparto.

Por lo tanto, Glenn escribió el DDF que se muestra arriba, que hizo lo siguiente:

  • Dado que el orden de bytes se ha invertido, use <regex> para devolverlos al orden con el que puede trabajar
  • Use <baseNtoInt> para convertir de octetString a uint_32
  • Use <bitwise_and> y <right_shift> para separar el bit de signo, exponente y mantisa
  • Convierta el bit firmado a +/– 1
  • <left_shift> el desplazamiento exponencial y luego ejecutamos <left_shift> 1 por este valor
  • Divide la mantisa por 2 23
  • Multiplique los últimos tres elementos para obtener el resultado final. Como <mult> y otros operadores aceptan solo 2 operandos, las acciones deben estar anidadas

La próxima vez, Glenn decidió seguir la misma táctica, porque había escuchado recientemente que TelCo modifica el dispositivo para que muestre la temperatura en número entero.

La tercera historia. Equipo A (nti)


[ Original ]

En la década de 1980, se filmó una serie de televisión llamada Team A. Había un chivato dentro de él, capaz de engañar a cualquiera. Para obtener lo que necesitaba, hizo promesas verdaderas (¿como marketing?). Había un tipo genial en el equipo que podía intimidar a cualquiera para lograr su objetivo. Sabía cómo lograr el objetivo, pero en el fondo era un buen tipo. El equipo tenía un líder que siempre podía idear un plan y salvar la situación. Y luego había un tipo un poco loco (pero en el buen sentido) en el que siempre puedes confiar en la batalla. De vez en cuando, aparecía un asistente en el equipo, dedicado a la intervención y la inteligencia. Este grupo de chicos trabajó como un equipo bien engrasado. ¡No podían fallar! ¡Eran un equipo!


El equipo "A" nunca escribió documentación sobre la metodología de gestión de proyectos. No es sorprendente que todos sean criminales buscados.

Alex consiguió un trabajo en un nuevo proyecto para reemplazar un sistema desactualizado y sin soporte. Naturalmente, se afirmó que la compañía "busca hacer todo bien". El proyecto está totalmente financiado. El equipo tendrá el equipo y el personal necesarios para llevar a cabo el trabajo. Hay soporte completo para seis niveles de liderazgo más todos los usuarios. Alex fue optimista.

Lo primero que hizo la compañía fue pasar varios meses coordinando entre todos estos innumerables niveles de liderazgo, usuarios finales, personas de apoyo, veteranos que apoyaron el proyecto (para que pudieran explicar los problemas que empeoraron el viejo sistema) y los tres arquitectos del nuevo sistema. La nueva arquitectura ha sido ampliamente documentada, aprobada y firmada por todo lo anterior. Incluso una agencia crítica independiente de auditoría reguladora realizó una revisión crítica para garantizar que las autoridades reguladoras confiaran en que se había adoptado el enfoque correcto.

En un documento de ocho páginas, se describieron en detalle las recomendaciones para el desarrollo del código (tales como: opciones de formato de código, convenciones de nomenclatura, pruebas unitarias, cobertura de código y otros aspectos similares importantes para el equipo). El documento ha sido revisado y debe ser seguido por todos los que trabajan en el proyecto.

El inicio del proyecto fue bueno.

La primera tarea fue contratar desarrolladores para el equipo. Para hacer esto, la compañía estaba buscando (muy lejos) especialistas en alta mar para encontrar el talento más barato posible. Después de todo, todos pueden ser entrenados, ¿verdad? Un equipo de 11 desarrolladores en total tenía 13 años de experiencia, y se contrató a un líder con cinco años de experiencia para administrarlos.

La siguiente decisión importante fue la elección de la base de datos a utilizar. La compañía ha utilizado activamente tres. Como todas las bases de datos se almacenaban en servidores centralizados, una de ellas se excluyó de inmediato: el equipo de los servidores de bases de datos era excesivamente potente para manejar la carga esperada en un período de tiempo razonable. De los dos restantes, uno de los miembros del equipo utilizó activamente uno. Sabían su sintaxis, rarezas y limitaciones. El tercero se configuró incorrectamente y, por lo tanto, tenía fama de no ser confiable. Sin embargo, ella también era el estándar corporativo. A pesar de las objeciones del equipo, se eligió un tercero.

La dirección del proyecto decidió que el control de calidad podría reclutarse más tarde.

Finalmente, es hora de implementar una estructura detallada. El líder del equipo offshore decidió que puede ahorrar mucho tiempo si crea el diseño sobre la marcha, de acuerdo con las solicitudes. Por supuesto, los arquitectos estaban en contra, pero el gerente del proyecto estuvo de acuerdo.

Los arquitectos han comenzado a construir el motor del controlador y otros principios fundamentales del proyecto. El equipo junior, que debía crear una cola a partir de una variedad de sistemas remotos para la entrada de datos, combinando, filtrando y preprocesando, decidió que funcionaría mejor de lo que está escrito en la documentación arquitectónica, y comenzó a desarrollar su propia forma de realizar operaciones. Sin decir esto ni a los arquitectos ni a la gerencia.

Era hora de verificar el primer sprint, y durante la revisión del código se descubrieron muchos tipos de "banderas rojas". Junior Lead dijo que la documentación arquitectónica era solo una recomendación que ignoró para satisfacer los deseos de los desarrolladores. Naturalmente, esto provocó una reacción como "¿estás realmente allí ...?" y un montón de cartas en la cadena de liderazgo. Pero el gerente del proyecto y el liderazgo anterior no parecían estar interesados ​​en esto: dijeron que los junior no deberían haber hecho esto, pero confiaron en ellos.

El trabajo continuó. Los arquitectos continuaron señalando fallas y defectos de implementación que eran incompatibles con los requisitos. Todas las ofertas fueron ignoradas porque el líder del equipo offshore dijo: “Google está fomentando una atmósfera de innovación y creatividad; ¡también tenemos que hacer eso! Se le recordó que Google es (en su mayor parte) el "grupo de expertos" y el líder trabaja con un proyecto estrictamente estandarizado en una industria estrictamente regulada. Esa arquitectura, que fue aprobada por más de cuarenta gerentes, no es una opción o recomendación, sino un requisito. Que este no es un jardín de infantes, donde se fomenta la creatividad, ¡debe cumplir con el plan aprobado! No estamos hablando de cómo escribir correctamente un subprocedimiento o encapsular un objeto, pero ese procesamiento de subprocesos se usó incorrectamente y en lugares incorrectos, y el acceso a las bases de datos y las comunicaciones entre procesos no serán escalables. Lo que necesita no es crear múltiples procesos, sino solo usar hilos. Que no debes usar archivos como semáforos simplemente porque lo hicieron en la escuela. Y la lista seguirá siendo larga.

Pero nada de esto se notó. Los desarrolladores de junio se quejaron de que al crear la arquitectura no tuvieron en cuenta sus opiniones, por lo que continuarán ignorándola (con la bendición de su liderazgo). El gerente del proyecto continuó diciendo que estaba al tanto de los problemas, pero no hizo nada con ellos. Se informaron problemas en la cadena, pero nadie hizo nada. Después de todo, todos en el equipo tienen el mismo derecho de voto.

En el mundo real, si un estudiante piensa que el maestro está equivocado, entonces no cambia su calificación. El interno corta donde lo muestra el cirujano, y no al revés. El general no discute la estrategia con el rango y el archivo. Si se une a un sindicato y, como novato, exige los mismos poderes que los líderes sindicales, entonces descansará junto a Jimmy Hoff [un líder sindical estadounidense que de repente desapareció en circunstancias misteriosas] . La experiencia habla con signos de exclamación. La inexperiencia habla a los interrogadores.

Pero no en este "equipo".

Los jóvenes continuaron haciendo lo que les pareció mejor, ignorando todas las solicitudes de los arquitectos. La mayor parte de su código fue escrito y copiado varias veces, porque Jones no pudo tener en cuenta todo la primera vez. Los desarrolladores más experimentados sabrán con qué contar. Después de 8 meses, el proyecto sufrió tanto daño que fue simplemente imposible cumplir con los requisitos más complejos, y en un proyecto de desarrollo que comenzó desde cero, fue necesario retroceder hace un mes.

Alrededor de este tiempo, la gerencia sucumbió a las solicitudes y pidió a varios usuarios comerciales que escribieran pruebas de nivel comercial (por ejemplo, una hoja de cálculo que se puede enviar a JBehave para pruebas JUnit). Los desarrolladores proporcionaron código y algunos ejemplos simples en hojas de cálculo. Los arquitectos dijeron que necesitaban contratar personal de control de calidad porque los usuarios rara vez saben cómo lidiar con casos límite, problemas de precisión, etc. Pero no se pudo gastar dinero. Después de seis meses de operación, los usuarios comerciales dijeron que todas las pruebas para toda la aplicación (es decir, toda la tarea técnica) estaban listas. Con solo mirarlo, era posible comprender que no tomaban en cuenta los casos límite, ejemplos vacíos, problemas de precisión y la mayoría de los otros aspectos que generalmente requieren pruebas. De hecho, pusieron todos los registros que podrían teóricamente (desde su punto de vista) existir en una gran prueba de aprobado / reprobado. Por supuesto, cuando algo cambia y ocurre inevitablemente el fracaso, no hay forma de averiguar dónde sucedió.

Finalmente, las cosas llegaron tan lejos que los arquitectos construyeron un muro físico entre las partes de la aplicación con el código de configuración (escrito por un equipo offshore) y el motor principal (creado por los arquitectos). Inmediatamente después de que el motor principal comenzó a procesar datos, cada variable en el sistema se restableció a una tabla de estado en la base de datos, de modo que en caso de problemas inevitables, se mostraran los datos de entrada y los desarrolladores offshore pudieran enviar una solicitud de corrección. Al menos de esta manera podrían aislar el motor principal de la basura.

El ministerio ahorró una tonelada de dinero mediante el uso de mano de obra barata, la falta de un departamento de control de calidad y el uso de una base de datos "políticamente sólida". Por supuesto, todo el código de configuración escrito por el equipo offshore fue terrible. La mayor parte fue difícil de aprender, mantener, depurar y mejorar.

El producto aún no se ha lanzado, y los usuarios ya se están quejando de diagnosticar y solucionar problemas durante demasiado tiempo (esta fue una de las principales razones para reescribir un proyecto antiguo). Y si reescribir no resolvió la tarea principal de reescribir, entonces probablemente algo salió mal ...

La cuarta historia. Pase a través del puntero nulo


[ Original ]

Maxine tenía problemas para mostrar el sitio web en un navegador con el complemento NoScript. Esto no es sorprendente: algunos navegadores pueden no funcionar correctamente con NoScript, pero fue sorprendente que el navegador arrojara excepciones Java. Cuando habilita JavaScript, la página de error desaparece, pero ¿cómo es? La falta de JavaScript conduce a excepciones de Java!

Abrió el código de la página y descubrió que el servidor esperaba un parámetro "innerCHK"; probablemente algún tipo de sesión o token de seguridad que debería pasarse en la cadena de consulta de URL. De lo contrario, el servidor devuelve una página de error que muestra java.lang.NullPointerException. Afortunadamente, los desarrolladores front-end idearon el siguiente gran fragmento de JavaScript para resolver el problema:

  // Comprobación de errores
 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;
    }
 }
 // Verificación final 

Pero esto es solo la punta del iceberg; la página estaba sobrecargada de antipatrones, ruedas reinventadas, ruedas de repuesto y llantas pinchadas. Todo esto se llevó a cabo en cinta . Para tener una idea del estilo de algunas conversiones de cadenas extrañas y el antipatrón favorito de los desarrolladores: cerrar los scripts solo para abrir uno nuevo en la siguiente línea, echemos un vistazo a cómo se importa Dojo. Tenga en cuenta que la cookie Dojo se importa.

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

Algunos, si no todos los enlaces CSS se manejan de esta manera. Encontré en el código fuente al menos tres ocurrencias (idénticas). Repetir Dojo.cookie se importa.

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


Alguien dijo una vez que si quieres resolver un problema con expresiones regulares, entonces tienes dos problemas. Creo que, diciendo "dos", subestimó la situación.

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

¡Recuerde, los niños siempre usan nombres bien pensados ​​para las constantes! Los números mágicos son malos. Excepto 2008, todo está bien con él.

  if (typeof (MONTHS_IN_YEAR) == 'indefinido')
 {
     MESES_IN_AÑO = 12;
 }

 if (typeof (isDisableDate) == 'undefined') {
     var isDisableDate = function (fecha, año, mes, viernes)
     {
         if (date.getFullYear () == 2008)
         {
             volver verdadero;
         }
         devuelve falso;
     }
 };

Ninguna aplicación mal implementada estará completa sin su biblioteca DateTime mal implementada. Debe haber algún tipo de ley científica sobre esto.

  var mes = nueva matriz (12);
 mes [0] = "1";
 mes [1] = "2";
 mes [2] = "3";
 mes [3] = "4";
 mes [4] = "5";
 mes [5] = "6";
 mes [6] = "7";
 mes [7] = "8";
 mes [8] = "9";
 mes [9] = "10";
 mes [10] = "11";
 mes [11] = "12"; 

 if (typeof (MONVALUE) == 'indefinido')
 {
     MONVALUE = nueva matriz
     ("Jan",
      "Feb",
      "Mar",
      "Abr",
      "Mayo",
      "Jun",
      "Jul",
      "Ago",
      "Sep",
      "Oct",
      "Nov",
      "Dec");
 }

 // la función convierte la fecha de str a Num
 función Month2Num (mes)
 {
     if (mes == "ENE") devuelve "01"; if (mes == "FEB") devuelve "02"; if (mes == "MAR") devuelve "03"; if (mes == "APR" ) devuelve "04"; if (mes == "MAYO") devuelve "05";
     if (mes == "JUN") devuelve "06"; if (mes == "JUL") devuelve "07"; if (mes == "AUG") devuelve "08"; if (mes == "SEP" ) devuelve "09"; if (mes == "OCT") devuelve "10";
     if (mes == "NOV") devuelve "11"; if (mes == "DEC") devuelve "12";
 }

El código contiene muchos estilos CSS (a menudo duplicados), por ejemplo, este no es un estilo muy azul.

  div.wpfThemeBlueBackgroundPanelTable  
 { 
     fondo: # F6F9FC; 
     acolchado: 10px; 
 } 
 / * ---- Panel azul ---- * / 
 table.wpfThemeBlueBackgroundPanelTable  
 { 
     fondo: # F6F9FC; 
     acolchado: 10px; 
 } 

A continuación hay dos matrices idénticas, de las cuales solo se usa una.

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

 arr_location_001 ['AU'] = {valor: 'AU', título: 'australia', texto: 'Australia'};
 arr_location_002 ['0'] = {valor: 'AU', título: 'australia', texto: 'Australia'};

 arr_location_001 ['CA'] = {valor: 'CA', título: 'canada', texto: 'Canadá'};
 arr_location_002 ['1'] = {valor: 'CA', título: 'canada', texto: 'Canadá'};

 arr_location_001 ['CN'] = {valor: 'CN', título: 'china', texto: 'China'};
 arr_location_002 ['2'] = {valor: 'CN', título: 'china', texto: 'China'};

 arr_location_001 ['FR'] = {valor: 'FR', título: 'francia', texto: 'Francia'};
 arr_location_002 ['3'] = {valor: 'FR', título: 'francia', texto: 'Francia'};

 arr_location_001 ['HK'] = {valor: 'HK', título: 'hong_kong', texto: 'Hong Kong'};
 arr_location_002 ['4'] = {valor: 'HK', título: 'hong_kong', texto: 'Hong Kong'};

 / * fragmento de muchas líneas de código similar * /

¡Aquí hay otro pequeño script hermoso que logró evitar muchas cosas, incluidas sus propias etiquetas de script! El desarrollador obtiene puntos de bonificación si lo escribió en una camisa de fuerza, tapiado en un ataúd lleno de escorpiones, colgando de un helicóptero sobre el Hudson. (En realidad, esta podría ser la explicación más lógica para la mayoría del código).
  <SPAN name = "onloadScript"> <input type = "hidden"> función onSelectInfo (calendario, fecha, fecha_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 (calendario, fecha, elem_date, elem_mon_year, hidden_elem); 
 } 

 Calendar.setup ( 
     { 
         inputField: & quot; temp_date_NArr & quot ;, // ID del campo de entrada 
         ifFormat: & quot;% b,% e,% Y & quot;, 
         onSelect: onSelectInfo, 
         rango: [currentYear, nextYear], 
         dateStatusFunc: dateStatusHandler, 
         botón: & quot; cal_dep & quot;  // ID del botón 

     } 
 ); 

 var _InfoVerAccurateFunc = clone (accurateDate); 
 initializeDate (nueva matriz ('Month_NArr', 'Day_NArr'), _InfoVerAccurateFunc); ">
 <script type = "text / javascript">

¿Recuerdas todo el dojo.cookie importado arriba? Alguien agregó una función de biblioteca para leer cookies.Sin embargo, alguien más consideró necesario escribir una función de copiar y pegar Get_Cookie desde Internet, ¡pero no una, sino cuatro veces!

 función Get_Cookie (check_name) {
    // primero dividiremos esta cookie en pares de nombre / valor
    // nota: document.cookie solo devuelve nombre = valor, no los otros componentes
    var a_all_cookies = document.cookie.split (';');
    var a_temp_cookie = '';
    var cookie_name = '';
    var cookie_value = '';
    var b_cookie_found = falso;

    for (i = 0; i <a_all_cookies.length; i ++) {
        // ahora dividiremos cada par nombre = valor
        a_temp_cookie = a_all_cookies [i] .split ('=');


        // y recorta los espacios en blanco a la izquierda / derecha mientras estamos en ello
        cookie_name = a_temp_cookie [0] .replace (/ ^ \ s + | \ s + $ / g, '');

        // si el nombre extraído coincide con check_name pasado
        if (cookie_name == check_name) {
            b_cookie_found = verdadero;
            // necesitamos manejar el caso donde la cookie no tiene valor pero existe (no = signo, es decir):
            if (a_temp_cookie.length> 1) {
                cookie_value = unescape (a_temp_cookie [1] .replace (/ ^ \ s + | \ s + $ / g, ''));
             }
            // tenga en cuenta que en los casos en que la cookie se inicializa pero no tiene valor, se devuelve un valor nulo
            return cookie_value;
            romper
         }
        a_temp_cookie = nulo;
        cookie_name = '';
     }
    if (! b_cookie_found) {
        volver nulo;
     }
 }

Creo que el método de desarrollo de software utilizado por este equipo es un nuevo sistema llamado "Dolby en las teclas CTRL-C y CTRL-V !!!!!! 11 !!!! 11! 11". Estoy seguro de que en el futuro cercano reemplazará a Agile.

La quinta historia. Robots humanos


[ Original ]

Durante la formación de SuperbServices, Inc, su negocio floreció. Fue una bendición y una maldición; Como en cualquier startup, había más trabajo que manos. El departamento de ventas no pudo renunciar a su éxito, por lo que los técnicos tuvieron que adaptarse.

El CEO de SuperbServices, Inc le dio a Roland una tarea seria que podría salvar a la compañía, o al menos la salud mental de los empleados. "Necesitamos automatizar todo el procesamiento para que podamos centrarnos en la prestación de servicios", dijo el CEO. “Lo más valioso con nosotros son nuestros servicios, y todo lo demás es un alboroto innecesario. Necesitas automatizarlo, y eso es lo que harás. Cooperará con robots humanos para automatizar todo: confirmación de operaciones, compras, transacciones de fondos, correo electrónico de clientes, ¡eso es todo!

"¿Con ... robots humanos?"

Roland tiene una nueva fobia. El departamento de servidores de la compañía era inusualmente excéntrico, incluso para los estándares de la industria. Solo unos pocos vieron a sus empleados, y solo llegaron rumores extraños a Roland.

Cuando Roland llamó a la puerta de la sala de servidores, la cámara de vigilancia que estaba sobre su cabeza cobró vida y la voz impasible del robot le preguntó: "¿QUÉ ESTÁS BUSCANDO?"

“Uh, hola ... soy Roland, gerente de proyectos. ¿Parece que nosotros, o quienes somos, deberíamos automatizar las tareas?

“¿QUÉ ME OFRECES?” Respondió la ominosa voz de metal.

"Bueno, eh ... ¿a los robots les encantan las donas?" Tengo conmigo. Eso es todo lo que hay ".

"PASS" La cerradura electrónica de la puerta se abrió con un clic. Roland empujó la puerta hacia él y el aire helado estalló por detrás. Miles de luces y estanterías parpadearon dentro, cerca había una pequeña mesa. Una luz brilló sobre la mesa. "PONGA LA OFERTA AQUÍ", dijo la ametralladora desde las sombras.

Roland dejó la caja de donas en la mesa y se alejó lentamente. Un grito de "¡GRACIAS!" Salió de detrás de él. Roland se levantó de un salto. El hombre endeble con un modulador de voz se rió y agarró una rosquilla.

"Hola Roland, soy Roy", dijo, dejando a un lado el modulador. “No tenemos muchos visitantes, por lo que nos gusta burlarnos de ellos. Bueno, ¿necesitas automatizar algo?

Roland estaba sorprendido de lo ordinario que era Roy, y no de que fuera realmente humano. "Ah, sí, el CEO dijo que trabajas mucho con robots, y que podemos usarlos para automatizar todo lo que podamos", Roland describió los requisitos y especificaciones.

Roy suspiro. “Es una pena decepcionarte, pero realmente no tenemos nada que ver con los robots, sin importar lo que piense el género. Insiste en que Ruby es el nombre del robot, aunque es solo un lenguaje de programación. Pero la mayoría de estos procesos podemos automatizarlos. Danos dos semanas, tantas donas y bebidas energéticas como podamos consumir, y podemos manejarlo ".

Durante las siguientes dos semanas, Roland trajo las ofertas solicitadas y recibió a cambio información sobre el progreso y demostraciones de funciones. Roy y otras personas robóticas escribieron el código, y pronto la montaña de papeleo que todo el mundo estaba haciendo se trasladó a los servidores en el sótano. Roland explicó que la mayor parte del trabajo fue realizado por "robots humanos", pero el CEO elogió sus esfuerzos.

"Roland, la obra maestra ya está hecha, ahora estas máquinas tiran de las palancas que ponen en marcha nuestro negocio", le dio unas palmaditas en la espalda. “Su recompensa será un nuevo proyecto, otro proyecto con la más alta prioridad. Nuestro departamento financiero no hace frente al volumen de transacciones. Hablé con el CFO y ella quiere que tú y la gente del robot automaticen el nuevo producto que compramos: MoneyWorx. ¡No me decepciones! "

Roland regresó a la sala de servidores. Si el proyecto de automatización anterior era tan simple, entonces todo será igual, ¿verdad? Le mostró a Roy las demandas.

La piel de Roy bronceada a la luz de los monitores se volvió aún más pálida. “¡Esto es malo, muy malo! ¡Peligro! ”, Gritó Roy. Agitó las manos con horror. “Esto no es MoneyWorx, sino MoneyDoesntWorx. Incluso cuando los servicios se están ejecutando, requieren tokens RSA-SecurID. Alguien debe ingresar el código manualmente ".

"¿Manualmente?" Es decir, para que el sistema funcione, ¿alguien debe estar en la línea?

"Si. Usamos tres tokens SecurID, por lo que generalmente cuando MoneyWorx solicita un nuevo código, debería haber tres personas en la línea ".

"Entonces no funcionará. Si para las transacciones la gente tiene que atender llamadas nocturnas, el CEO estará furioso. Y ya ha firmado un acuerdo: debemos asegurarnos de que el sistema funcione sin llamar a la gente ".

Roy abrió al hombre de la energía y se estremeció. “Dame un fin de semana, lo pensaré. Y necesitaré más de esto ”, sacudió el frasco. "Y este", señaló una caja de donas.

Roland apareció el fin de semana y dejó sus ofrendas. Roy los aceptó, pero no dijo nada. Los robots humanos estaban demasiado ocupados para conversar. Cuando llegó el lunes, Roland regresó con nuevas donas y bebidas energéticas. "¡Eureka!" Roy exclamó cuando Roland entró. "¡Déjame mostrarte mi obra maestra!"

La "obra maestra" era una caja de donas vacía puesta a un lado. Los tokens RSA-SecurID se pegaron a la caja. Todo el sistema se instaló frente a una cámara web barata. "Cuando MoneyJerks requerirá un nuevo token de dos factores, alguien puede acceder de forma remota a esta máquina, verificar los tokens e ingresar el código correcto".

"¿No crees que esta caja necesita protección con contraseña?", Sugirió Roland.

"¿Crees que los usuarios recordarán cómo iniciar sesión?", Objetó Roy.

Probablemente fue la idea más tonta de la que Roland había oído hablar, pero lo informó arriba y mostró una demostración de soluciones en la oficina del CEO. Después de desconectarse del automóvil con una cámara web, se encogió, esperando la rabieta.

“¡Esto es asombroso! Dirigieron sus ojos robóticos a esta mierda, ¡y ahora nadie en la compañía necesita decirle a MoneyWorx qué hacer! Buen trabajo, Roland. Felicítame de la gente robótica. Su robot es solo un milagro ”.

Roland estaba feliz de que el trabajo se hubiera completado, pero no pudo deshacerse de la sensación de que había cometido un terrible error. La seguridad financiera de la empresa estaba en manos de una cámara web barata sin ninguna protección, excepto por la falta de una dirección IP pública.

imagen

Cuando el desastre finalmente estalló, no tomó la forma de una transacción fraudulenta. Una caja de donas cayó tarde el miércoles por la noche. Roland tuvo que llamar a Roy, quien condujo a la oficina y volvió a colocar la caja en su lugar. Después de analizar las causas de la falla, Roy pegó la caja al bastidor del servidor con cinta aislante, asegurando así un tiempo de actividad constante.

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


All Articles