Programas Correctos: Parte 2. Las buenas ideas no caducan

Los diferentes métodos de diseño de programas a lo largo de la historia, han enfatizado elementos que resultan ser aspectos esenciales de la actividad, y son útiles sin importar el paso del tiempo. Hay elementos de forma (como algunos diagramas) que ya no serán útiles, pero si te enfocas en eso, ya te fuiste por otro lado, perdiéndote el punto importante: mantén frescos los conceptos para que te asistan en cada decisión de diseño. Desde esta perspectiva, la opinión de que los métodos de generaciones pasadas ya son obsoletos y no vale la pena dominarlos, me parece –por decir lo menos– absurda. Igualmente absurdo me parece equiparar la actividad de diseño y programación, a simplemente conocer la sintaxis de algún lenguaje de programación, o las cualidades de una tecnología.Métodos formales.- Describir y razonar matemáticamente tus programas por medio de lógica aplicada, es un complemento útil en el diseño de programas correctos; es probable que el rigor matemático requerido en métodos formales, no sea adecuado para todo el ciclo de desarrollo en los proyectos comunes, pero ha resultado muy valioso en la especificación del diseño en combinación con la técnica de diseño, conducido por aserciones[1], así como en la actividad de validación y verificación. Lo valioso del estilo de pensamiento involucrado en estas técnicas, es la capacidad de identificar propiedades en los problemas y soluciones observados, diferenciando las esenciales de las accidentales.

La generación estructurada.- Un número considerable de conceptos y técnicas fueron apalancados en esta generación, iniciando con la programación estructurada, seguida del diseño y análisis estructurado –desde entonces, la vanguardia está donde están los detalles de la programación–. Edsger Wybe Dijkstra nos explicó separación de aspectos[2], un rasgo del pensamiento ordenado para la resolución efectiva de problemas, donde el enfoque mental se expande y se contrae por demanda, para considerar en profundidad un asunto en particular, aislándolo del resto, conciliando múltiples líneas de pensamiento simultáneo. Niklaus Wirth nos explicó refinamiento gradual o escalonado[3], donde cada paso contiene la expresión esencial y completa de la solución en un cierto nivel de abstracción, la cual será cernida de los elementos menos concretos en la siguiente refinación, eligiendo el siguiente nodo en el árbol de decisiones de diseño, por medio de una minuciosa deliberación.

La generación orientada a objetos.- la agrupación más general de métodos de diseño en esta generación son dos escuelas: el elaboracionismo y el traduccionismo, está de más decir que dominar ambas es muy útil para el oficio de diseño y programación, pues nos deja en una mejor posición para elegir la técnica más adecuada para cada tipo de problema. Una de las ganancias de explorar estas familias de métodos de diseño, es la habilidad de designar un mejor balance entre los tres aspectos fundamentales de los objetos: identidad, estado y conducta; la carencia de dicha habilidad es muy común y se puede notar en la omisión del aspecto de identidad y conducta de los objetos, provocando que las vistas estáticas de los diseños sean únicamente representaciones entidad-relación. ¿Dónde están los objetos ahí? La reflexión que viene de la práctica de diseño usando estos conceptos y otros —como encapsulado, herencia, polimorfismo— enfatiza de una manera sutil que los límites entre los conceptos análisis, diseño y programación son difusos, y ya no se consideran etapas secuenciales sino que, simplemente son actividades que suceden concurrentemente durante el ciclo de vida del software. La opinión de varios maestros practicantes del oficio, es que la aportación más importante del paradigma es: la administración de dependencias[4] como fundamento para el diseño evolutivo de software a gran escala.

La generación ágil.- Un siguiente paso a partir del estado de conciencia que te deja la práctica de los métodos de diseño de las generaciones antes mencionadas, es intentar el diseño de programas correctos con un estilo más cooperativo, más orientado a las personas que a la tecnología, más como desde hace muchos años lo describen autores como Gerald M. Weinberg[5]. El énfasis en la comunicación con el usuario y entre los otros miembros del grupo de desarrollo, así como la atención permanente al diseño del software y su continua evolución, me parecen de las aportaciones más valiosas de los métodos ágiles, no porque presenten algo novedoso, sino porque presentan descripciones asequibles —a diferencia de meras prescripciones— para llevar a cabo las buenas prácticas.

Referencias
1. Test Driven Development
www.objectmentor.com/writeUps/TestDrivenDevelopment
2. On the role of scientific thought. Edsger Wybe Dijkstra
www.cs.utexas.edu/users/EWD/transcriptions/EWD04xx/EWD447.html
3. Program Development by Stepwise Refinement. Nicklaus Wirth
www.acm.org/classics/dec95/
4. Designing Object Oriented C++ Applications Using The Booch Method. Robert C. Martin
5. Quality Software Management Vols. I-IV. Gerald M. Weinberg

Acerca del autor
Marco A. Dorantes es un consultor en el diseño y formulación de software desde 1987, oficio que lo llevó a la investigación aplicada en el campo de los métodos sistemáticos para diseño de software. Ha realizado diversas contribuciones públicas en la comunidad mundial de programación, tanto en foros técnicos como en software, por ejemplo AutoTest for .Net y CppUnit for C++Builder disponibles desde www.xprogramming.com. Publica un diario electrónico en blogs.msdn.com/marcod