Periódicamente me llaman para hacer trabajos de mantenimiento en un sistema que fue construido por un verdadero cirujano espacial. Hay tanto problema con eso que es difícil saber por dónde empezar.¿Cuál es el programa más incorrecto que has tenido que mantener?
No, espera, comenzaré por el principio: en los primeros días del proyecto, al diseñador se le dijo que el sistema necesitaría escalar, y había leído que una fuente de problemas de escalabilidad era el tráfico entre la aplicación y los servidores de la base de datos, por lo que se aseguró de minimizar este tráfico. ¿Cómo? Al poner toda la lógica de la aplicación en los procedimientos almacenados de SQL Server.
En serio. La mayor parte de las funciones de la aplicación se realiza mediante la interfaz HTML que formula los mensajes XML. Cuando el nivel medio recibe un mensaje XML, utiliza el nombre de etiqueta del elemento del documento como el nombre del procedimiento almacenado al que debe llamar, y llama al SP, pasándole todo el mensaje XML como parámetro. Toma el mensaje XML que devuelve el SP y lo devuelve directamente al frente. No hay otra lógica en el nivel de aplicación.
(No fue algo de código en el nivel medio para validar los mensajes XML entrantes contra una biblioteca de esquemas. Pero me lo quitó, después de cerciorarse de que: 1) sólo un pequeño puñado de mensajes había correspondientes esquemas, 2) los mensajes en realidad no se ajustaban a estos esquemas, y 3) después de validar los mensajes, si se encontraban errores, el método los descartaba. "Esta caja de fusibles ahorra mucho tiempo, viene de fábrica con un centavo preinstalado")
He visto software que hace algo mal antes. Montones. He escrito bastante. Pero nunca he visto nada como la determinación acerada de hacer lo incorrecto, en en cada vuelta posible, que se materializa en el diseño y la programación de este sistema.
Bueno, al menos se fue con lo que sabía, ¿verdad? Um. Aparentemente, lo que sabía era Access. Y realmente no entendió Acceso. O bases de datos.
Aquí hay un patrón común en este código:
SELECT @TestCodeID FROM TestCode WHERE TestCode = @TestCode SELECT @CountryID FROM Country WHERE CountryAbbr = @CountryAbbr SELECT Invoice.*, TestCode.*, Country.* FROM Invoice JOIN TestCode ON Invoice.TestCodeID = TestCode.ID JOIN Country ON Invoice.CountryID = Country.ID WHERE Invoice.TestCodeID = @TestCodeID AND Invoice.CountryID = @CountryID
Bueno, está bien. Tampoco confías en el optimizador de consultas. Pero ¿qué tal esto? (Originalmente, iba a publicar esto en What's the best comment in source code you have ever encountered? pero me di cuenta de que había mucho más por escribir que solo este comentario, y las cosas se salieron de control.) Al final de muchos de los procedimientos almacenados de utilidad, Veremos código que tiene el siguiente aspecto:
-- Fix NULLs SET @TargetValue = ISNULL(@TargetValue, -9999)
Sí, que el código está haciendo exactamente lo que no puede permitirse que creen que está haciendo para que no sean llevado a la locura. Si la variable contiene un NULL, está alertando a la persona que llama al cambiar su valor a -9999. Así es como se usa comúnmente este número:
-- Get target value EXEC ap_GetTargetValue @Param1, @Param2, OUTPUT @TargetValue -- Check target value for NULL value IF @TargetValue = -9999 ...
Realmente.
Para obtener más información sobre este sistema, consulte el artículo en thedailywtf.com titulado I Think I'll Call Them "Transactions". No estoy haciendo nada de esto. Lo juro.
A menudo recuerdo, cuando trabajo en este sistema, la famosa respuesta de Wolfgang Pauli a un alumno: "Eso no está bien. Ni siquiera está mal."
Este no puede ser realmente el peor programa de la historia. Es definitivamente el peor en el que he trabajado en toda mi carrera de 30 años. Pero no lo he visto todo. ¿Qué has visto? ?
ERROR Así que .... Esto realmente no es una pregunta tanto como un respiradero! Supongo que estás preguntando retóricamente: ¿Puedes superar esto? ... Hmmm ... –
Esto parece más adecuado para su blog o un sitio [dedicado a la discusión] (http://meta.stackexchange.com/questions/13198/). –
Hice la pregunta porque pensé (y aún creo) que las respuestas podrían ser útiles. El análisis de fallas en el software generalmente solo se lleva a cabo después de que el software ha fallado por completo (si es así); Cuerpos terribles que solo se mantienen vivos a través del trabajo a menudo solo son realmente entendidos por una o dos personas. ¿Qué tan malo puede ser un software y aún ser útil? ¿Cómo surgieron tales cosas y qué esfuerzos se requieren para apoyarlas?Es difícil explorar sistemáticamente esas preguntas, pero vale la pena explorarlas. –