A veces me sorprendo a mí mismo pensando que la evolución, tal como ha sido descripta por el genial Charles Darwin (y ampliada o explicada a la luz de la genética por el neodarwinismo), explica todo. Es decir, explica el funcionamiento de nuestro cerebro, explica la tendencia a la xenofobia, nuestra irracionalidad, y además nuestras cosas buenas, como el amor a nuestras crías.
Incluso más, como propone Stanislav Lem en 'Invencible', creo posible ámbitos de evolución no biológica: el capitalismo de mercado sobrevivió porque es el sistema mejor adaptado a la forma de ser de nosotros los humanos ( lo que no quiere decir que nos tengamos que quedar con su forma actual ), las ideas sobreviven por su adecuación a nuestra idiosincracia, y así unas cuantas cosas. Bueno, también lo propuso, creo que después, Richard Dawkins con sus memes
El mismo fenómeno de evolución se da con el software. El software que detestamos, ese que legamos y que queremos tirar, ha estado sobreviviendo al medio durante mucho tiempo. Eso no quiere decir que sea perfecto, la evolución no encuentra la mejor solución: encuentra una solución que permita que el organismo viva. Y eso ha hecho, ha sobrevivido. Con sus problemas, claro: no sabemos si un determinado código anda de casualidad o no, no nos animamos a tocarlo, es poco claro, si se hubiese pensado de una para el uso actual sería más claro, la tecnología es vieja, y unas cuantas cosas más. Pero aquí esta, y eso es una señal de que tiene algo de conocimiento valioso.
Por eso me irrito cuando se empieza un proyecto de reingeniería y todo el mundo está convencido que el nuevo software será mejor que el anterior, simplemente porque el anterior era una bosta. El anterior vivió muchos años, sobrevivió y se adaptó: el que no hicimos, todavía no demostró tanto mérito y no va ser fácil prepararlo para que lo haga, o, al menos, no lo haremos sin esfuerzo simplemente porque somos más vivos que los anteriores.
Por supuesto que parte de nuestros problemas para hacer algo bueno tiene que ver con las imperfecciones adaptativas del sistema anterior (que si no las tuviera, no lo estaríamos cambiando): no hay documentación, la tecnología es vieja y el código es poco claro, incluso subóptimo (a veces no es subóptimo, nos parece subóptimo porque lo evaluamos con poca información)
Y acá llegamos al punto donde quería llegar: la documentación. Estos sistemas legados no tienen documentación, o si la tienen, no podemos confiar en ella porque está desactualizada. Este es el estado general de las cosas, y creo que vale la pena preguntarse por qué con inexorable fatalidad la documentación falta o está desactualizada. Voy a hipotetizar algunos puntos:
- La documentación se desactualiza porque no se percibe como útil. Y no se percibe como útil porque muchas veces no lo es: antes de documentar algo deberíamos preguntarnos si es más fácil leer la documentación que el código (he visto 'documentación' que ha sido el mismo programa hecho en pseudocódigo).
- Aún cuando la documentación no esté desactualizada, siempre nos inunda la sospecha sobre su pertinencia al estado actual del sistema. Esto es, en parte, porque sabemos que la documentación tiende a desactualizarse, pero hay una causa subyacente ahí: cuando leemos documentación no tenemos más que el auxilio de la fe. Es decir, creemos que la documentación está actualizada porque alguien nos los aseguró, no porque podamos comprobarlo.
Diría que la misma presión del entorno que ha moldeado el sistema a su forma actual ha presionado para que la documentación se abandone. Bueno, y entonces qué? dejamos que el código se comente solo?. Yo creo que tenemos que adoptar una solución basada en criterios robados: es mejor almacenar experimentos que descripción de los resultados del experimento. Los físicos no lo pueden hacer: por ejemplo, el CERN no puede dejarnos jugar con su LHC un rato para ver lo que finalmente salga, pero nosotros tenemos una ventaja: podemos empaquetar el software junto con los experimentos que permitan ver si el mismo anda: test unitarios (como junit, nunit) y de regresión (como jmeter, selenium).
En mi opinión, los scripts de test son la única documentación que podremos utilizar sin temor a que esté desactualizada: el test se puede someter a prueba, se puede ejecutar, sirve para experimentar, mientras que la documentación se queda horriblemente corta al respecto. Incluso, me siento cómodo aplicando esta idea al desarrollo de requerimientos cuando lo que tenemos es un software que reconstruir: más que producir modelos en papel, preferiría producir scripts de test.
Lo anterior no es ni más ni menos que otro triunfo de la experimentación y el positivismo sobre la visión escolástica.
4 comments:
El segundo punto es el fundamental. Aunque la documentación no tenga errores, siempre voy a desconfiar de ella.
Los tests son un avance... pero la desconfianza siempre está.
En definitiva lo único absoluto es, fue y será el requerimiento. Introduzco determinados valores de entrada y obtengo un resultado. Coincide con la documentación. Bien.
¿Y? ¿Cómo sé que está bien (soy un escéptico compulsivo)? Y... le pregunto al usuario... ¿y si no sabe (¿no dije? soy compulsivo)? Bueh, lo mejor es que si no sabe no importa. Si lo usaba así y le servía bienvenido sea. Si no lo usaba no hay por qué reproducirlo.
¿Y si algunos usuarios dicen que está bien y otros que está mal?
Por suerte llegó la pizza...
El requerimiento tiene que estar escrito, por una cuestión fundamental: tomé un compromiso sobre él.
Pero, emho, el requerimiento termina siendo más una herramienta que la descripción de la historia: nos sirve durante el proyecto y luego tiende a quedar desactualizado.
El test es una suerte de requerimiento falsable que diría Popper: podemos saber si ese requerimiento, el que tiene un(os) test(s) asociado(s) está vigente o no.
Los test son barbaros. JUnit/Nunit es una herramienta muy poderosa.
Pero alcanzan para sumplantar la documentacion?
Si un caso de uso complejo esta desactualizado, se suplanta con test unitarios que en general tienen a ser atomicos?
Es posible reproducir todos los casos de uso con pruebas unitarias?
No siempre y en muchos casos, aun de ser posible, es complejo y muchos ni sabem como hacerlo.
Lamentablemente no creo que nos podamos despegar de la documentacion escrita, que es verdad que tiende a desactualizarse, pero con una buena disciplina, se puede minizar el impacto.
Excelente tu blog,
Saludos
Gracias por tu comentario, Esteban.
Hablando del tema de este post, un amigo me pasó esto: http://www.easyb.org . No es que sea rocket science ni algo terriblemente nuevo, pero es una forma de evolucionar de test unitarios a test de comportamiento
Post a Comment