Contexto
La compañía Boeing es el mayor fabricante de aviones comerciales en el mundo. El proceso de manufactura que esta compañía sigue para producir cada avión inicia a partir de un diseño general de las características de la aeronave, para después ir detallando cada elemento hasta llegar a las especificaciones de cada parte.
Para fabricar las piezas, Boeing se apoya de cientos de proveedores de diversas partes del mundo. Cada proveedor recibe las especificaciones de las piezas, las fabrica y una vez terminadas, las envían a las plantas ensambladoras. Boeing recibe cada pieza para proceder a ensamblarlas y así poder cumplir con pedidos que provienen diversas latitudes del mundo.
Este proceso de fabricación requiere de un diseño a gran escala que determina las características generales del avión y llega a especificar con lujo de detalle cada pieza que lo conforma. Cualquier error de diseño pone en riesgos cientos de vidas que han puesto su confianza en las aerolíneas como un medio de transporte.
El diseño también está presente en el proceso de desarrollo de software, y al igual que el proceso de fabricación de aviones, se requiere de un diseño de alto nivel que especifica las características generales del software y se va detallando hasta especificar cada módulo o componente que será construido por un equipo de programadores para finalmente ensamblarlo en lo que será la aplicación final.
Explicación
1.1 Introducción al diseño
En cualquier actividad humana podrás observar que el diseño aparece cada vez que deseamos resolver un problema como una forma en la que permita idear la mejor solución antes de implementarla. Así puedes encontrar el diseño de interiores, diseño gráfico, diseño industrial, eco diseño, entre otras.
Observa que el diseño es diferente al arte, ya que el primero está acotado por reglas o parámetros que obligan al diseñador a proponer una solución basándose en la funcionalidad, mientras que en el arte no existe la limitante de tener que producir algo funcionalmente útil.
El diseño del software es la etapa del desarrollo de un sistema basado en computadora que le sigue al análisis o ingeniería de requerimientos, y en la que se detalla la forma que tendrá el software para responder a las necesidades el usuario.
Uno de los primeros autores que habló sobre el diseño fue E. S. Taylor (1959), y definió al diseño como “el proceso de aplicar distintas técnicas y principios con el propósito de definir un dispositivo, proceso o sistema con los suficientes detalles como para permitir su realización física”.
Pressman (2010) por su parte considera que un buen diseño de software tiene esencialmente tres características fundamentales: resistencia, funcionalidad y belleza.
Una aplicación que tiene resistencia es robusta en su construcción, se mantiene en constante operación sin fallas; es funcional porque puedes obtener los resultados esperados de forma consistente y tiene belleza porque es grato al sentido de la vista.
Tetera para masoquistas. Imagen recuperada de http://impossibleobjects.com/catalogue/coffeepot-for-masochists.html Sólo para fines educativos
Estos atributos hacen que el diseño sea una de las tareas principales en el desarrollo de software, y a la vez sea una de las más difíciles, ya que debe interpretar la funcionalidad esperada que se encuentra en el documento de especificaciones de software y ofrecer otras especificaciones que puedan ser utilizadas en la construcción, y así generar un producto terminado de calidad. En otras palabras, el diseño de sistemas debe transformar el “Qué”, en el “Cómo”.
La etapa del diseño, como parte del proceso de desarrollo de software, requiere de ciertas habilidades creativas, ya que deberá proporcionar la mejor forma posible de atender a los requerimientos del usuario, considerando variables como tecnología, presupuesto y tiempo. El producto generado por el diseño es un conjunto de elementos que incluyen la arquitectura del software, sus componentes, interfaces y estructuras de datos necesarias para iniciar la construcción.
Pressman (2010) considera que el diseño es crucial en el proceso de desarrollo de software porque introduce calidad en la ingeniería del software al traducir los requerimientos a un producto o sistema, y además es posible que el equipo de desarrollo pueda evaluar los atributos de calidad antes de implementarse.
Un buen diseño producirá un producto de calidad que el usuario utilizará con gusto, mientras que un mal diseño generará un software inestable que será mucho más caro porque se le tendrá que asignar más recursos (económicos y humanos) para corregir problemas que no siempre son fáciles de detectar.
1.2 El proceso de diseño
El diseño de software tiene 4 etapas que inician desde el análisis o ingeniería de requerimientos, se construye el diseño del sistema, pasa por una revisión técnica, que permitirá realizar algunos ajustes al diseño, se procede a realizar una aprobación del diseño y finalmente se tendrá un diseño terminado que podrá ser utilizado para la etapa de construcción, pruebas e implementación.
Haz clic en cada concepto para conocer más detalle.
Figura 1. Proceso del Diseño de Software.
Según Pressman (2010) en la etapa del diseño se realizan las siguientes transformaciones:
Lineamientos del diseño:
Algunas recomendaciones para elaborar el diseño son:
1.3 Conceptos generales
El diseño de software introduce algunos conceptos que son importantes aclarar para poder aplicarlos de forma correcta y producir atributos relacionados con la calidad del software.
Haz clic en cada concepto para conocer más detalle.
El diseño de software se hace posible porque el ingeniero de software puede abstraer conceptos para después generar una solución, en otras palabras puede ignorar cierto detalle de información para comunicar de manera sencilla los aspectos más relevantes que darán solución al problema.
Existen diferentes niveles de abstracción, y en los niveles inferiores podrás encontrar detalles específicos que pueden ser utilizados para construir el sistema. Según SWEBOK (2014), en el contexto del diseño de software existen mecanismos clave de abstracción: parametrización y especificación.
Pressman (2010) propone 2 tipos de abstracción:
Es la visión global de sistema. Permite conocer la estructura general que tendrá el software: módulos, interfaces y estructuras de datos. A partir de este panorama amplio del software se realizan las actividades de diseño que detallan la solución que ofrece el sistema.
Sirven para encontrar una solución que ya fue probada. Es decir, te sirven para no tener que inventar el hilo negro, sino poder reutilizarlos al resolver problemas dentro de un contexto específico, permitiendo ahorrar tiempo de diseño o servir de base para generar otros patrones.
Se basa en la premisa de divide y vencerás. Cualquier problema complejo es más sencillo subdividirlo en elementos que puedan ser resueltos de una manera más fácil que tratar de solucionar el problema como un todo. En el diseño de software este concepto es bastante útil, ya que permite proponer soluciones para elementos manejables con un esfuerzo menor.
Dentro de división de problemas puedes encontrar los siguientes conceptos:
En el diseño de software, la modularidad permite que el trabajo de construcción sea asignado a equipos de trabajo independientes, que pueden trabajar en paralelo. Una vez terminado y probado, los módulos se pueden ensamblar para obtener la funcionalidad completa del software.
Otra ventaja de la modularidad es que es más sencillo ubicar errores y realizar futuros cambios, que tener un software monolítico.
Para evaluar la independencia funcional es posible utilizar la cohesión y el acoplamiento. Un módulo debe tener la capacidad de unirse o adherirse a otro siempre y cuando ejecute una sola tarea con la mínima intervención de otros módulos, en este caso se dice que el módulo mantiene una cohesión.
El acoplamiento se refiere a la conectividad o dependencia que existe entre los módulos. Entre más sencillo o independiente sea el acoplamiento del módulo será:
“La independencia funcional es la clave para el buen diseño y éste es la clave del software de calidad” Pressman (2010).
El diseño de software permite agrupar o empaquetar ciertos detalles internos de implementación de módulos, de tal forma que los haga inaccesibles (los detalles) para entidades externas que no requieran de ellos. Esto permite que evitar propagar errores entre otros módulos del software con los que no se tiene relación.
Según SWEBOK (2014), este término (en inglés “concern”) está relacionado con establecer un área específica de interés que puede ser relevante para uno o más stakeholder. El diseño de software debe proveer una vista para atender los aspectos más relevantes del sistema manejando así la complejidad, de tal manera que las personas involucradas pueden enfocar su atención en lo que más les interesa.
Permite ir bajando desde un nivel de abstracción alto de la función que se está diseñando hasta llegar a describir el procedimiento a detalle. Este proceso de elaboración inicia con un enunciado conceptual que describe de forma general la función, ocultando los detalles. Después se va detallando de forma sucesiva el diseño que solucionará el requerimiento.
Es frecuente encontrar requerimientos en los que solicitan reutilizar funcionalidades implementadas en otros sistemas, en ese caso se procede a rediseñar el software, es decir, se construye un nuevo diseño que ofrece la misma funcionalidad buscando hacerlo más eficiente. El rediseño implica realizar un análisis del diseño existente, buscando posibles problemas o errores que deben ser corregidos en el nuevo diseño. Por ejemplo: un componente que genera un reporte que tarda varias horas, puede ser analizado con el objetivo de encontrar errores en las estructuras de datos, determinar el tiempo el acceso a la base de datos o cerciorarse si la misma sentencia SQL es la adecuada. Este análisis puede dar una idea de cómo abordar el nuevo diseño que genere el mismo reporte en menos tiempo.
Cierre
La calidad debe estar presente en la mente del equipo de desarrollo en cada una de las etapas del ciclo de vida del desarrollo del software y sobre todo en la etapa del diseño. El diseño es el momento ideal para establecer la arquitectura del software que resolverá los requerimientos del usuario. Es un trabajo muy importante y a la vez complicado, ya que deberá analizar una situación específica y buscar la mejor alternativa de solución, tomando en cuenta restricciones de tiempo y presupuesto.
El proceso de esta etapa del desarrollo de software, comienza en una perspectiva amplia que después se va detallando poco a poco hasta que se describen los subsistemas que componen el software.
Entre los conceptos del diseño más importantes se encuentran la abstracción y la modularidad. El primero es un mecanismo indispensable de diseño y que evita llegar a especificar tipo del lenguaje de programación, que es una acción destinada al equipo de programación. Mientras que la modularidad permite que el sistema sea fácil de entender y tenga la capacidad de irse adaptando a nuevas necesidades o cambios sin afectar el resto del sistema.
Checkpoint
Asegúrate de poder:
Referencias
Glosario
Stakeholders: son las diferentes personas que serán afectadas por el software, por ejemplo, personas que ingresarán datos, personas que obtendrán información, o aquellos que definen cómo debe operar, venderse o cambiar el sistema: administradores, gerentes, personas jurídicas, usuarios finales, etc., todo aquel que tiene influencia (directa o indirecta) en la definición de los requisitos del sistema.