Para muchas personas de TI, incluido yo mismo hace unos años, el proceso de desarrollo de software ideal implicaría la creación de documentos de diseño detallados con muchos diagramas UML antes de que se escriba una línea de código. (Esto parece una descripción del modelo de cascada, pero es lo mismo con ágil, excepto que las iteraciones son más pequeñas).
Durante los últimos dos o tres años, he cambiado completamente de opinión. Todavía creo que una especificación detallada de requisitos con casos de prueba asociados es absolutamente esencial. Para proyectos grandes, también requeriría un resumen de la arquitectura general antes de comenzar a codificar. Pero todo lo demás debe hacerse en código tanto como sea posible. En el caso ideal, no debería haber una descripción del diseño del software, excepto el código mismo.
¿Cómo llegué a esta conclusión? Aquí hay algunos argumentos:
Realimentación
Las herramientas para escribir documentos o crear diagramas proporcionan pocos comentarios. Sí, hay herramientas de modelado que realizan algunas comprobaciones de consistencia en los diagramas UML, pero son limitadas y conllevan muchos gastos generales.
Sin comentarios, es difícil reconocer y corregir errores.
Tan pronto como escriba el código, recibirá muchos comentarios, por ejemplo:
- Errores y advertencias del compilador.
- Resultados de análisis de código estático
- Pruebas unitarias
Los errores se pueden reconocer y corregir rápidamente.
Consistencia
Para asegurarse de que el código sea coherente con sus documentos, debe verificar una y otra vez. Si hay cambios frecuentes, es difícil mantener el código y los documentos sincronizados.
Refactorización
Existen herramientas y técnicas poderosas para refactorizar código, mientras que refactorizar descripciones textuales o diagramas suele ser difícil y propenso a errores.
Hay una condición previa para que esto funcione: el código debe ser lo suficientemente fácil de leer y comprender. Esto probablemente no se puede lograr con Assembler, Basic o Fortran, pero los lenguajes modernos (y las bibliotecas) son mucho más expresivos.
Entonces, si mis argumentos son válidos, debería haber una tendencia hacia una especificación y documentación de diseño de software menos o más liviana. ¿Hay alguna evidencia empírica de esta tendencia?