Peculiaridades del Diseño de Software

Diseño de software

El diseño de software de computadora es una experiencia desafiante y creativa, motivada por el deseo de resolver problemas. La tarea de desarrollar incluso un pequeño programa de computadora no es fácil. Se requiere continuamente que los programadores mantengan su atención enfocada en muchos aspectos diferentes tanto de los problemas como de las soluciones. Incluso cuando la estructura estática de un programa está completa, la corrección de su comportamiento dinámico aún debe confirmarse. De hecho, es esta necesidad de tener en cuenta continuamente tanto la forma estática como el eventual comportamiento dinámico al desarrollar una solución, lo que constituye una parte importante del desafío que ofrece la programación.

Durante la década de 1970 se diseñaron una serie de avances en la tecnología del software para mejorar la tarea de desarrollar programas de computadora: lenguajes de programación de alto nivel, compiladores más eficientes, prácticas de programación estructurada e instalaciones de depuración simbólica. Todos estos han ayudado a los programadores a desarrollar, controlar y visualizar sus ideas sobre un programa, principalmente mediante un mayor uso del concepto de abstracción.

La abstracción ha jugado un papel central en el desarrollo de mejores técnicas de programación, permitiendo al diseñador de un programa razonar sobre su estructura y comportamiento sin necesidad de abordar los problemas detallados de determinar las formas de implementación al mismo tiempo. Si bien los beneficios que surgen de estas técnicas mejoradas se identificaron al principio principalmente en términos de actividades de programación, también se comprendió cada vez más la necesidad de desarrollar mejores prácticas para la programación en general, que se ocupa del diseño y desarrollo de sistemas en su conjunto.

Si bien el diseño de programas presenta problemas importantes, el diseño de software de grandes sistemas proporciona un grado de complejidad mucho mayor. Los mayores niveles de abstracción requeridos para diseñar un sistema grande hacen que sea más difícil para el diseñador visualizar y «modelar» el comportamiento del sistema eventual. El intervalo de tiempo mucho mayor que puede ocurrir entre el origen de una idea y su realización real deja a los diseñadores mucho más aislados de su creación real. Esto significa que los diseñadores también deben comunicar sus ideas a los demás de manera clara.

Así que la década de 1970 también vio el desarrollo de formas de representación del diseño y la aparición de métodos de diseño destinados a capturar las experiencias de otros diseñadores y, por lo tanto, ayudar a los diseñadores a describir sus ideas y controlar y estructurar su tarea.  Han surgido nuevas ideas sobre la calidad del diseño de software y nuevos puntos de vista que describen las propiedades del software y, a su vez, se han incorporado tanto a los métodos de diseño nuevos como a los existentes.

Dado que el software juega un papel central en el funcionamiento de muchos sistemas, tan variados como transacciones bancarias, cálculos de hojas de cálculo o sistemas de control de aeronaves («fly by wire»), aplicaciones web de finanzas, es cada vez más importante que dichos sistemas se diseñen lo mejor posible. Un diseño defectuoso puede provocar un desastre e incluso poner en peligro la vida.

Cada vez se acepta más que el estudio de los sistemas basados en software (ya sea que lo llamemos ingeniería de software, informática, ingeniería de sistemas de información o incluso tecnología de la información) debe incluir algunos conocimientos básicos sobre las funciones del diseño de software dentro del proceso de desarrollo de software.

El alto nivel de abstracción requerido en las formas descriptivas, y la ‘distancia’ resultante de la solución final, puede hacer que sea difícil proporcionarles el grado necesario de «feeling» por todos los problemas que están involucrados. 

Un campo que ofrece una buena analogía es el del estudio de la música. La composición musical es otra tarea altamente creativa y, al igual que los diseñadores de software, los compositores necesitan usar una notación estática compleja para describir la eventual interpretación dinámica de una pieza musical. El estudiante de música debe llegar a ser competente en la lectura e interpretación de partituras musicales, antes de intentar dominar las reglas de composición. En el caso del diseño de software, el principiante debe aprender a programar de manera efectiva y estar familiarizado con la manipulación de diversas formas de abstracción, antes de proceder a diseñar un sistema de cualquier tamaño o complejidad.

La analogía no debe llevarse demasiado lejos (pocas sinfonías han sido producidas por ‘equipos de composición’, organizados por gerentes de proyectos), pero debemos darnos cuenta de que enseñar métodos de diseño no enseña a un estudiante sobre diseño, o incluso necesariamente cómo diseñar. El aspirante a diseñador de software debe estudiar ampliamente y obtener una comprensión profunda de los muchos problemas que influyen en el proceso de diseño antes de asumir el papel de diseñador de sistemas, ya sea que esto implique o no el uso de métodos de diseño específicos.