Curiosas perversiones del mundo de TI

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. Se han cambiado todos los nombres y nombres de compañías.

Para trabajar por 3,000 millas


Una historia real de la experiencia personal de nuestro autor Snoofle. [Original]

Hace muchas décadas, el contratista de defensa DefCon Inc trabajó para el ejército de los EE. UU. E intentó obtener un nuevo contrato para crear algún tipo de aplicación utilizada en la batalla. La empresa quería demostrar en su propuesta que tenía suficiente personal para llevar a cabo este proyecto. Por lo tanto, contrató a más de mil programadores, gerentes de proyectos, gerentes, etc. Los militares, que estudiaron varias ofertas comerciales, vieron a un grupo de nuevos empleados que no estaban familiarizados con los procesos, procedimientos y requisitos necesarios, por lo que transfirieron el contrato a otra empresa. El contratista, por su parte, despidió a todas estas miles de personas.

Unos meses después, surgió otro contrato similar. La compañía volvió a contratar a mil personas para demostrar que tiene personal. Unos meses más tarde, el contrato fue transferido nuevamente a otro contratista, y la compañía volvió a despedir a los miles.


En el transcurso de dos años, esto se ha repetido varias veces.

Después de todo esto, la mayor parte del personal disponible para contratar ya conocía el ciclo muy corto de contratación y despido en la empresa, por lo que el contratista no podía atraer a nadie, excepto a los recién llegados que acababan de graduarse de las instituciones educativas. Finalmente, un gerente de alto nivel se sorprendió por el hecho de que todas estas personas solo por el escritorio eran mucho más baratas que los desarrolladores experimentados en el personal de la compañía, y aquellos a quienes la compañía contrató, despidieron por el bien de los contratos. Por lo tanto, emitió una orden de que todo el personal experimentado de la empresa debería ser reemplazado por empleados jóvenes y baratos . El proceso tomó dos años, pero aún sucedió.

Ahora que los costos salariales han disminuido significativamente y enojaron a todos los desarrolladores candidatos con experiencia, la compañía podría aumentar su personal permanente sin inflar el presupuesto salarial. Solo podía contratar desarrolladores jóvenes e inexpertos para finalmente obtener un contrato.

Desafortunadamente, todos estos desarrolladores jóvenes tenían muy poca experiencia, y la compañía ya no tenía personas en las trincheras que pudieran capacitarlos. Por lo tanto, el resultado de su contrato de dos años fue este proyecto poco confiable, que a menudo fallaba, se comportaba de manera impredecible y no podía modificarse. Tales propiedades no son deseables cuando se trata de un sistema que debe disparar y detonar.

En algún momento, uno de los altos ejecutivos se dio cuenta de lo que había sucedido, obligó a la empresa a dejar de actuar como un elefante en una tienda de porcelana y a contratar consultores altamente remunerados. Desafortunadamente, los consultores altamente remunerados recordaban bien el ciclo de contratación y despido y no querían tener nada que ver con la organización. Después de un tiempo, la compañía tuvo que mejorar significativamente las condiciones de empleo, hasta que finalmente varios empleados experimentados acordaron obtener un trabajo como empleados a tiempo completo. Sucedió en Nueva Jersey.

Después de que la gerencia asignó a estos nuevos empleados al proyecto para acelerar el trabajo en él, los nuevos empleados dijeron: "¡Esperen un poco, hay un gran agujero en el medio de este proyecto!" La gerencia respondió que esta parte del proyecto estaba clasificada y solo puede ser estudiada por personas con acceso a información clasificada y solo en una empresa en California. Se solicitaron y recibieron las aprobaciones correspondientes, después de lo cual los empleados experimentados fueron enviados durante dos semanas a una instalación en California.

Antes de aceptar el viaje, los desarrolladores querían saber cómo podrían acceder a los materiales después de estudiar. Después de todo, el acceso solo es posible en el lugar en California, y todos los empleados viven y trabajan en Nueva Jersey. Les dijeron que aprenderían los detalles en California.

Bueno, todos volaron a la costa oeste, se registraron en hoteles y se dirigieron a la oficina.

En ese momento fueron informados de todos los problemas que deben abordarse. El jueves, la segunda semana de trabajo, se decidió que se necesitaban aproximadamente dos años de trabajo para completar todas las actualizaciones necesarias. Los desarrolladores volvieron a preguntar: "¿Cómo obtendremos acceso a los materiales de Nueva Jersey?" Los gerentes respondieron que todo el trabajo debería hacerse localmente y que permanecerían en California durante los próximos dos años. A partir del próximo lunes.

¡Pero esperen, no tuvieron la oportunidad de discutir esto con la familia! ¿Cómo afectará a los hijos la ausencia del 90% del tiempo de uno de los padres? ¿Quieren vivir en hoteles y aeropuertos durante dos años? ¿Por qué demonios la compañía no contrató empleados a nivel local en California, sino en Nueva Jersey?

Resultó que dado que el contratista se encuentra en Nueva Jersey, el personal que contrata también debe estar registrado allí. Por supuesto, si esto se hubiera informado antes del empleo, la mayoría de los empleados (si no todos) se habrían negado a trabajar. Si lo supieran, ninguno de los trabajadores abordaría el avión y volaría a California para familiarizarse con el proyecto.

Ni siquiera se puede decir que el resto del trabajo para los gerentes se refirió a la necesidad de las víctimas por el bien de la empresa, y los desarrolladores se preguntaban: "¿Qué demonios?" El jueves por la noche estaba ocupado con llamadas interminables a casa. El viernes por la mañana, todos los empleados renunciaron y se dirigieron al aeropuerto para regresar a casa.

Los representantes del ejército se comportaron con dignidad y simpatizaron con el hecho de que las personas no quieren abandonar sus hogares y familias durante dos años. Sin embargo, se volvieron mucho más duros a la hora de hablar con el contratista y cumplir sus promesas de contar con personal experimentado en el lugar de trabajo.

Como resultado, el contrato con el contratista fue rescindido y fue contratado para reemplazar el nuevo.

Caso de falla


[Original]

imagen

El primer día en el nuevo trabajo, Sebastian no estaba particularmente entusiasmado. Ya había visto mucho y ganó indiferencia y pesimismo. Este nuevo trabajo no debería haber sido diferente: un grupo de colegas molestos, requisitos mal pensados, viejas bases de código, llenas de código de espagueti. Pero ella pagaba bien, y él estaba cansado de su antiguo grupo, estaba cansado de las mismas caras familiares. Por lo tanto, se preparó internamente para matices ligeramente nuevos de la misma política de oficina y tareas tristes.

No estaba particularmente molesto cuando fue al departamento de TI por sus credenciales y escuchó los zumbidos y clics de los viejos servidores de Packard Bell. Sebastian simplemente bajó su nivel de requisitos para una computadora en funcionamiento a varios niveles, y regresó a su nueva oficina. Sí, su puesto significaba su propia oficina y el pago correspondiente. Para esto, podría llegar a un acuerdo con muchas otras cosas.

Su inicio de sesión funcionó en el primer intento, lo que fue una agradable sorpresa. Él esperaba Windows XP; cuando Vista arrancó, no estaba seguro de si debería alegrarse por el sistema operativo más nuevo, o estar horrorizado de que fuera Vista. Al completar los privilegios de administrador y recortar el UAC, incluso podría pretender por un tiempo que era un "siete". "Se necesitará algo más para asustarme" , pensó, y comenzó Outlook.

Ya había correo en la bandeja de entrada: algunas cartas de bienvenida con información para los nuevos empleados, así como la primera tarea de su gerente. Impresionado, por decir lo menos, por la eficiencia de la asignación de tareas, abrió una carta de su nuevo líder.

La primera carta fue algo como esto:

Hola Sebastián, bienvenido a nuestro entorno de trabajo perfectamente perfeccionado. Todo se hace correctamente. Al crear documentos de proyecto, trabajará con Bonk-Word (la aplicación de documentación basada en web de IBM). ¡Recuerde guardar su trabajo a menudo! Si Bonk-Word se bloquea, deberá escribir una carta al departamento de TI para reiniciarlo.

La empresa elabora documentación de diseño. Escriba todo en voz pasiva, use violeta para indicar encabezados de capítulo y verde para indicar encabezados de sección. El presidente de la compañía verifica los documentos diariamente a las 9 de la mañana, así que prepárese para esto. Los errores en los encabezados se convertirán en una marca negra en su archivo personal.

Comience por diseñar una solución al problema de la fuente Macintosh que no hemos podido resolver durante cuatro años. Mañana a las 9 en punto de la mañana debe tener un documento de proyecto preparado de seis páginas. Gracias

¿Seis páginas para mañana? - se preocupó Sebastian. “Creo que me regocijé en la eficiencia demasiado pronto. Bueno, al menos no será aburrido ", chasqueó los nudillos, abrió Bonk-Word y comenzó a lidiar con los llamados problemas de fuente.

Lo primero que descubrió fue que el gerente no bromeaba acerca de ahorrar con frecuencia. Al final del día, mentalmente hizo apuestas: lo que caerá primero: Bonk-Word o Vista en sí. Ambos se estrellaron después de aproximadamente cada media hora. Pero mantener estadísticas de salidas en un papel tranquilizó a Sebastian por alguna razón. Le recordó: algo más estaba funcionando en el mundo. Las operaciones matemáticas más simples no fueron impresionantes, pero fueron confiables. Regular Estable

Quizás Sebastian estaba solo en esta oficina. Pero él estaba callado y separado. Aunque las salidas constantes eran molestas, Sebastian seguía adelante. Se detuvo en el trabajo para estudiar una variedad de literatura sobre representación de fuentes, incluida la especificación Postscript, literatura que acompaña a cómo usarla y centros de información en la World Wide Web, diseñados para recopilar la sabiduría de las mejores mentes de la industria en un formato familiar y conveniente de preguntas y respuestas. . Describió ampliamente en el documento "crear un programa Python para representar cada personaje". Pasó dos páginas describiendo lo que podría decirse en pocas palabras.

"Si necesitan seis páginas, obtendrán seis páginas", pensó Sebastian.

El primer día resultó ser extraño, pero Sebastian vio que podía soportarlo por al menos varios años. Terminó el trabajo, abandonó el edificio (que olía sospechosamente a ropa interior de cuero vieja) y caminó lentamente hacia su "espacio de estacionamiento gratuito" (otra ventaja que justifica este trabajo en sus ojos). Lentamente, porque el estacionamiento estaba completamente corroído por el óxido y en muchos lugares el concreto se cayó completamente, exponiendo el refuerzo del piso y las columnas.

A la mañana siguiente, exactamente a las 9:00, Sebastian estaba en la oficina de su gerente, esperando la primera verificación del proyecto por parte del presidente de la compañía, quien llamó por teléfono. Sebastian se sintió incómodo con la conversación con el presidente directamente, dado que había sesenta empleados en la empresa, pero tuvo que soportarlo.

“Hice lo solicitado y en la cantidad correcta. Lo más probable es que esto sea solo una formalidad, después de lo cual puedo ir a trabajar ".

Una hora después, humillado y exhausto, Sebastián regresó a su oficina. La crítica absurda pero cruel que recibió todavía resonaba en sus oídos. Según el presidente, sus títulos de sección eran apenas "verdosos", no verdes, como exigía la compañía, y los títulos de los capítulos eran imperdonablemente "rojizos" en lugar del púrpura esperado. Además, le dijeron explícitamente que era "imposible" depurar las fuentes usando Python. En cambio, a Sebastian se le ordenó trabajar en C ++ y usar las bibliotecas de software "maravillosas" de la compañía. Mientras esperaba la llamada del presidente, el gerente de Sebastián elogió el documento, pero durante el cheque no dijo una palabra, mirando inseparablemente la pared de ladrillos en su escritorio.

Sebastian cerró la puerta de la oficina, encerrándose del resto de la compañía. Se sentó en su lujosa silla de cuero y miró la pantalla de una computadora que apenas funcionaba. Reabrió su documento y luego reinició la máquina porque Vista decidió volar. Cuando la computadora se encendió nuevamente, revisó su cuenta bancaria, pensó en los pagos de la hipoteca y apretó los dientes.

"Bueno, entonces", dijo en voz alta en la oficina vacía. "Echa un vistazo a estas bibliotecas".

Lo primero que comenzó a buscar fue documentación. Naturalmente, en una empresa tan obsesionada con los documentos, la documentación de las bibliotecas "maravillosas" debe escribirse con precisión en la fuente correcta con un tono ideal, con los títulos de los capítulos y los nombres de sección correctos. Pero la documentación ... no estaba. Había muchos documentos de diseño con colores verdes y morados perfectos. Pero describieron solo la metodología de desarrollo de la biblioteca y no dijeron nada sobre su uso.

"¿Estoy perdiendo la cabeza?" Sebastian se preguntó cuándo se reinició el automóvil por tercera vez. "Quizás el código se documenta por sí mismo ..."

Experimentó horror, pero no hubo mucha sorpresa: las bibliotecas consistían en envoltorios mal diseñados de funciones de cadena de la biblioteca estándar.

A pesar de la debacle constante, Sebastian sostuvo el golpe. Fue llamado diariamente para otra ronda de intimidación verbal. Durante cuatro años, la compañía no pudo hacer frente a este problema de fuente; sin embargo, ninguno de los propuestos por él no le convenía al presidente. Sebastian abandonó su propia biblioteca de la compañía, comenzando a resolver el problema en el conocido Python; al final, si aún se pudren, ¿por qué hacen lo que te dicen? Pero cualquier cosa que usara: su propio probador en Python, o un probador de Microsoft, Apple o Adobe, la fuente seguía siendo un caos total. 488 errores irreparables, incorregibles, insolubles por parches de diseño.

El presidente se negó categóricamente a admitir la verdad. Afirmó que fue culpa de Sebastián, porque no utilizó las excelentes bibliotecas de C ++.

Después de agotar todas las opciones, Sebastian dejó la llave del garaje oxidado en el escritorio del gerente junto con una carta de renuncia. Se despidió de su dulce oficina y de la máquina de escribir infernal que entregaron como computadora. Respiró hondo, sintió el olor a piel triste por última vez y se fue, de forma completa e irrevocable.

Por alguna razón, dudaba que echaría de menos la compañía.

Usted puede enfermarse por este tipo de atención médica


[Original]

En cualquier industria, hay información que debe transferirse entre sistemas incompatibles. Si viviste la vida de los justos, entonces estos sistemas eran solo aplicaciones diferentes en la misma plataforma. Sin embargo, si se desvió del buen camino, entonces estos sistemas se escribieron en diferentes idiomas para diferentes plataformas que operan en diferentes sistemas operativos con diferente orden de bytes. Imagine alguna aplicación Java en Safari bajo alguna versión de Mac OS , que necesita comunicarse con alguna versión de .NET bajo alguna versión de Windows , que, a su vez, necesita comunicarse con alguna versión de COBOL con EBCIDIC binario que se ejecuta en cualquier mainframe.

Mucho antes de que alguien pudiera imaginar tal pesadilla, trabajamos con SGML que se degradó y evolucionó a XML , que debería ser una forma trivial aceptable de especificar el formato y los campos contenidos en el documento con el analizador disponible en todas las plataformas, para que la información se pueda intercambiar, Sin saber nada más que DTD y / o esquemas de validación y análisis.

Sin esperar lo mejor, para simplificar el trabajo, escribimos sobre la biblioteca del contenedor XML.

Lamentablemente, no hicieron frente a la tarea.


En la industria del cuidado de la salud, algunos chicos de código abierto han creado el proyecto (H) ealthcare (API), o HAPI , que es esencialmente un analizador de mensajes de texto orientado a objetos para la industria del cuidado de la salud. Desafortunadamente, parecían estar sufriendo el síndrome de "no sé cuándo parar" .

En lugar de implementar un analizador generalizado que simplemente divide una cadena delimitada o una cadena de formato fijo en una lista de valores de campo de texto, la última versión implementa 1205 analizadores diferentes, cada uno de los cuales tiene su propia estructura de datos de alto nivel. Las estructuras de más alto nivel tienen docenas de subestructuras. Cada analizador tiene uno o más métodos de acceso para cada campo. Un campo puede ser una sola instancia o una lista de instancias, en cuyo caso es necesario determinar mediante programación qué método de acceso usar.

¡Esta es una API con aproximadamente 15 mil llamadas a métodos! ¿En qué estaban pensando estos desarrolladores?

Por ejemplo, la clase: EHC_E15_PAYMENT_REMITTANCE_DETAIL_INFO puede tener desde cero o más secciones de servicio del producto . Entonces, inmediatamente empiezo a pensar en algún tipo de matriz o lista. Por lo tanto, en lugar de algo como esto:

  EHC_E15_PAYMENT_REMITTANCE_DETAIL_INFO info = ...;
     Lista <EHC_E15_PRODUCT_SERVICE_SECTION> prodServices = info.getProductServices ();
     // iterar

... necesitamos hacer uno de esto:

  // Obtener la subestructura
     EHC_E15_PAYMENT_REMITTANCE_DETAIL_INFO info = ...;
	
     // Obtenga el producto-servicio incorporado de la subestructura

     // ... si sabemos con certeza que solo tiene un mensaje:
     EHC_E15_PRODUCT_SERVICE_SECTION prodSvc = info.getPRODUCT_SERVICE_SECTION ();
	
     // ... si no sabemos cuántos habrá:
     int n = infos.getPRODUCT_SERVICE_SECTIONReps ();
     para (int i = 0; i <n; i ++) {
         EHC_E15_PRODUCT_SERVICE_SECTION prodSvc = info.getPRODUCT_SERVICE_SECTION (i);
         // usa esto
     }

     // ... o simplemente puedes agarrarlos e iterar
     Lista <EHC_E15_PRODUCT_SERVICE_SECTION> allSvcs = info.getPRODUCT_SERVICE_SECTIONAll (); 

... y necesita llamar al método deseado, de lo contrario corre el riesgo de obtener una excepción. Pero si hay muchas formas de realizar una tarea a través de la API, entonces hay muchas formas de ejecutarla en el código utilizando la API, lo que inevitablemente genera problemas.

Puedes decir: "Vamos, no todo es TAN malo" ; solo usa lo que necesitas. Pero luego se da cuenta de que algunas de estas estructuras de datos están incrustadas en diez o más niveles de profundidad, cada una tiene docenas de subestructuras y / o campos, y todas ellas tienen varios métodos de acceso. Además, todos ellos tienen nombres muy largos.Y luego te das cuenta de que los desarrolladores de HAPI están cansados ​​de escribir texto y comenzaron a usar estructuras de datos como LA1, ILT y PCR para la abreviatura.

La API está tratando de ser útil: si no encuentra la esperada en el campo cuyo análisis está solicitando, arroja una excepción, y debe descubrir qué salió mal por su cuenta. Por supuesto, esto implica que ya sabe lo que se le transmite en el flujo de datos.

Anónimotrabajé en el cuidado de la salud y apoyé la biblioteca envuelta alrededor de HAPI. Se le asignaban tareas regularmente (para las cuales tardó varias semanas en completarse) simplemente analizando un campo adicional. Después de pasar mucho tiempo masticando volúmenes de documentación de API, escribió un analizador común de una clase de 300 líneas con varias divisiones, subcadenas, parseDate y parseInt, como reemplazo de toda la interfaz.

Después de eso, agregar un nuevo campo no tomó más de diez minutos.

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


All Articles