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.


  • ¿Cuál es el proceso de diseño del software?
  • ¿Qué conceptos debes reconocer al diseñar y por qué son importantes?
  • ¿Cómo asegurarte que el diseño genere un producto de software con calidad?

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:

  • Los diagramas de clases y el modelo CRC, se transforman en el diseño de datos o clases donde se detallarán las clases de cada componente del sistema.
  • El documento de casos de uso describe las entidades que interactúan con el sistema y los pasos a seguir para obtener un resultado. Esta información será útil para darle forma al diseño de la interfaz que utilizará el usuario para darle instrucciones al sistema y obtener la información que necesita.
  • Los diagramas de flujo de datos y diccionario de datos son particularmente útiles para crear el diseño de arquitectura ya que determinan la relación que existen entre las entidades, la información y los procesos.
  • El diseño en el nivel de componente se basa en la descripción de los modelos de clase, flujo y de comportamiento.

Lineamientos del diseño:

Algunas recomendaciones para elaborar el diseño son:

  • Debe estar basado en el análisis de requerimientos, por lo que el diseñador debe estar en constante comunicación con el ingeniero de requerimientos para aclarar cualquier duda o problema de interpretación.
  • Hacer uso de patrones de diseño reconocibles que pueda ser interpretado por los programadores y testers.
  • Debe mostrar una construcción modular en la que se muestren diferentes niveles de abstracción entre el sistema y sus subsistemas.
  • Incluir los cuatro tipos de diseños: datos, arquitectura, interfaces y componentes.
  • La descripción de componentes deben tener características funcionales independientes. Reducir la complejidad en las interfaces necesarias para interconectar los componentes.

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.

  • Abstracción por parametrización: permite abstraer los detalles de la representación de datos conocidos como parámetros.
  • Abstracción por especificación: permite describir tres tipos de abstracción: de procedimiento, de datos y de control.

Pressman (2010) propone 2 tipos de abstracción:


  • Abstracción de procedimiento: Permite omitir detalles específicos relacionados a un procedimiento que puede ser utilizado en la aplicación. Por ejemplo, en una instrucción que contenga la acción de “almacenar datos”, puede incluir una secuencia de acciones como acceder a una base de datos, elegir la tabla, acomodar la información en campos específicos, agregar un registro nuevo, actualizar la tabla, etc.

  • Abstracción de datos: Agrupa atributos que dan forma a los objetos que manipulan los datos. Por ejemplo, la abstracción “base de datos” describe un sistema de archivos con el que puedes manipular (agregar, modificar y borrar) los datos. En un nivel de abstracción general no es necesario entrar a detalle sobre cómo lo hace.

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:

  • Modularidad:Cualquier sistema puede ser dividido en componentes que solucionan un problema específico. A estos componentes se les conoce también como módulos. Son unidades de software que pueden ser ensamblados para obtener una funcionalidad con mayores características. Es parecido a piezas de lego que puedes ir ensamblando para construir algo mayor.
  • 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.

  • Independencia funcional:Los módulos que se diseñen deben resolver un subconjunto de requerimientos. Esto facilita desarrollarlos, probarlos e implementarlos, evita que existan errores que provoquen daños colaterales a otros módulos y pueden ser reutilizados en otros desarrollos.
  • 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:

  • Reconocer la importancia del diseño de software como parte esencial del proceso de desarrollo de software para generar un producto que cumpla con las expectativas del cliente.
  • Conocer el proceso de diseño de software que genera las especificaciones para construir un sistema de calidad.
  • Distinguir los diferentes conceptos relacionados con el diseño de software para utilizarlos en la generación de modelos de diseño que ayuden a las siguientes etapas del ciclo de vida del desarrollo de software.

Referencias


  • Pressman, R. (2010).Ingeniería de Software. Un enfoque práctico (7ª ed.). México: McGraw Hill.
  • Swebok v3.0. (2014).Guide to software engineering body of knowledge. Recuperado de http://www.computer.org/web/swebok
  • Taylor, E. (1959).An Interim Report on Engineering Design. USA: Massachusetts Institute of Technology.

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.