Site hosted by Angelfire.com: Build your free website today!

Software Design

Marco A. Dorantes

Con respecto al diseño de software, que es el aspecto más fascinante para mí de lo que hacemos como programadores profesionales, permíteme comentarte mis impresiones y conclusiones actuales acerca de la esencia de esta actividad, por supuesto estas conclusiones están sesgadas por mi enturbiado entendimiento, pero el practicar y estudiar la experiencia de algunas luminarias en nuestro campo hace que dichas conclusiones tengan sentido para mi.

I. El resultado de la actividad 'diseño'

El resultado material de la actividad de diseño debe ser algo ejecutable, cualquier cosa menos que eso, es pura estimulación mental.

II. Arquitectura de software

Todos los aspectos, de alto y bajo nivel de nuestro diseño están expresados, implícita ó explícitamente, en la arquitectura del software. Aunque todavía es un término difuso, pero la exposición más adecuada de arquitectura de software es la de Phillip Kruchten "The 4+1 View Model of Architecture"

The 4+1 View Model of Architecture

http://www.computer.org/software/so1995/s6042abs.htm

IEEE Software November 1995 (Vol. 12, No. 6)

http://www.rational.com/media/whitepapers/Pbk4p1.pdf

En resumen, la arquitectura de software considera 5 vistas, agrupadas por su naturaleza en:

  • Conceptual

    • Vista Lógica (clases y subsistemas)

    • Vista Concurrente (procesos y threads)

  • Física

    • Vista de Componentes (medios para empaquetar los elementos de la Vista Lógica: assemblies, DLLs)

    • Vista Distribuida (comúnmente llamada infraestructura de cómputo: servidores que contienen los elementos de la Vista de Componentes)

  • Funcional

    • Vista de Casos de Uso, ésta gobierna a todo lo que puede existir en las otras vistas, en otras palabras nada debe existir si no aporta a soportar la funcionalidad del software

III. El código fuente es el diseño detallado del software

El diseño de alto nivel puede consistir de diagramas que expresen aspectos de las diferentes vistas de Kruchten, pero el diseño detallado es el código fuente, punto. En software, nuestros planos detallados es un documento técnico llamado comúnmente código fuente, dichos planos de nuestro producto son entregamos al constructor del producto: el compilador o traductor a código ejecutable.

Phillip Kruchten, Jack W. Reeves y otros tienen algunas ideas al respecto:

What is Software Design? by Jack W. Reeves

http://www.bleading-edge.com/Publications/C++Journal/Cpjour2.htm

The Nature of Software: What's so Special About Software Engineering? by Philippe Kruchten

http://www.therationaledge.com/content/oct_01/toc.html

From Craft to Science: Searching for First Principles of Software Development by Koni Buhrer

http://www.therationaledge.com/content/dec_00/f_craftscience.html

IV. Decidir es diseñar

Diseñar requiere decidir constantemente, diseñar es decidir. Decidir sobre los aspectos del diseño detallado, decidir sobre los aspectos de diseño de alto nivel, e incluso decidir que no vamos a decidir nada todavía sobre alguna propiedad particular del software, es decir, vamos a diferir dicha decisión.

Martin Fowler habla acerca del diseño en:

Is Design Dead?

http://martinfowler.com/articles/designDead.html

What's a Model For?

http://martinfowler.com/articles/purpose.pdf

V. Diseño estable y emergente

Diseñar requiere atender a los principios que gobiernan y sustentan la arquitectura de software, como dice Bertrand Meyer, los aspectos a gran escala de la arquitectura de software, se encomiendan o están sustentados en los aspectos de bajo nivel o escala detallada (código fuente). Si estos aspectos no obedecen a principios coherentes y de estilo, difícilmente se logran los aspectos a gran escala.

Existe un cuerpo de conocimiento importante acerca de diseño orientado a objetos, con reglas que representan esos principios coherentes y de estilo:

Principles Of Object Oriented Design

http://c2.com/cgi/wiki?PrinciplesOfObjectOrientedDesign

Las recomendaciones del maestro Stroustrup agregan perspectivas importantes:

Bjarne Stroustrup's C++ Style and Technique FAQ

http://www.research.att.com/~bs/bs_faq2.html

Las prácticas básicas son esenciales, Steve McConnell, ex-programador de MS tiene buen material al respecto:

Code Complete: A Practical Handbook of Software Construction

http://www.stevemcconnell.com/cc.htm

Rapid Development: Taming Wild Software Schedules

http://www.stevemcconnell.com/rd.htm

La técnica de factorización representa una excelente forma para mantener un diseño estable y flexible:

Refactoring

http://www.refactoring.com/

VI. Control empírico del proceso de diseño

Un método de diseño es intrínsecamente iterativo e incremental, se adhiere a un proceso 'gestalt', es decir, no puedes terminar de diseñar software si primero no lo programas, y al mismo tiempo no puedes programar software si primero no lo diseñas.

Existen métodos sistemáticos de diseño y programación, Martin Fowler habla acerca de algunos métodos actuales:

The New Methodology

http://martinfowler.com/articles/newMethodology.html

Continuous Integration (no daily build)

http://martinfowler.com/articles/continuousIntegration.html

VII. Método sistemático de diseño

Un método sistemático de programación consiste de al menos tres partes:

  1. Una notación - el énfasis aquí es contar con un conjunto de conceptos de diseño que guarden coherencia y que puedan ser expresados por medio de dicha notación. Actualmente está de moda UML y es importante tener mentalmente disponibles sus conceptos para comunicar la arquitectura de software. Pero para el diseño detallado (código fuente) la notación más eficiente y efectiva sigue siendo el lenguaje de programación seleccionado.

    En otras palabras, todo lo que se puede expresar en un diagrama de clases en UML se puede expresar en el código fuente; y mientras las herramientas de generación de código carezcan del nivel de abstracción suficiente para eliminar la necesidad de modificar el código generado, el diseño detallado seguirá siendo el código fuente en sintaxis del lenguaje de programación.

    En el futuro, seguramente habrá las herramientas para expresar todos los aspectos del diseño detallado en una notación como UML, y entonces, eso será nuestra nueva forma de código fuente.

  2. Un proceso - actividades, roles y artefactos. Los mejores procesos son los que incluyen un ciclo cerrado de retro-alimentación que se ajusta a la naturaleza 'gestalt' del software.

    Los artículos en el siguiente sitio tienen información relevante acerca de los procesos que varios programadores profesionales han sintetizado:

    http://www.agilealliance.org

    El potencial de los métodos ágiles de diseño está en la esencia del desarrollo cooperativo:

    • Control empírico del proceso de desarrollo

    • Comportamiento emergente o adaptativo

    • Auto-organización

  3. Herramientas - que soporten el conjunto de conceptos disponibles en la notación.

    En la práctica, lo más eficiente y efectivo, si el objetivo es obtener software ejecutable, es usar las herramientas más simples que ayuden con la comunicación entre las personas en el equipo de desarrollo y entre los individuos y la computadora.

    En otras palabras, una simple hoja de papel y lápiz, o un pizarrón son más efectivas que costosas herramientas CASE. No menos importante, el compilador es la mejor herramienta para verificar el aspecto estático de tu diseño detallado, el compilador hará un análisis preciso de tus decisiones de diseño y te dirá invariablemente todo inconsistencia con su sistema de tipos.

    Además, para verificar los aspectos dinámicos de tu diseño, un contexto de pruebas unitarias (unit-testing framework) te ayudará a obtener la retroalimentación para evolucionar tu diseño de forma coherente y concreta, satisfaciendo los aspectos de la Vista de Casos de Uso de tu arquitectura.

    Kent Beck y Erich Gamma exponen el diseño de un contexto de pruebas aquí:

    JUnit Cookbook

    http://junit.sourceforge.net/doc/cookbook/cookbook.htm

    JUnit A Cook's Tour

    http://junit.sourceforge.net/doc/cookstour/cookstour.htm

    Como dice Martin Fowler: 'Never in the field of software development was so much owed by so many to so few lines of code'

    http://www.junit.org

    Contextos de pruebas para varios lenguajes de programación están disponibles aquí:

    http://www.xprogramming.com/software.htm

En general, el material en este sitio provee buen material para el diseño y desarrollo de software:

http://www.objectmentor.com/resources/articles

Los mejores métodos sistemáticos de diseño y programación actuales se derivan del trabajo de las siguientes luminarias:

Profesor Edsger Wybe Dijkstra

http://www.cs.utexas.edu/users/EWD/

Kristen Nygaard

http://www.ifi.uio.no/~kristen/

Ole-Johan Dahl

http://www.ifi.uio.no/%7Eolejohan/

Alan Turing

http://www.turing.org.uk/turing/

Niklaus Wirth

http://www.cs.inf.ethz.ch/~wirth/

Donald E. Knuth

http://www-cs-faculty.stanford.edu/~knuth/

Bjarne Stroustrup

http://www.research.att.com/~bs/homepage.html

Barbara Liskov

http://www.objectmentor.com/resources/articles/lsp.pdf

David Lorge Parnas

http://www.crl.mcmaster.ca/SERG/parnas.homepg

Tom DeMarco

http://www.atlsysguild.com/GuildSite/TDM/Tom_DeMarco.html

Gerald M. Weinberg

http://www.geraldmweinberg.com/books.html

Larry Constantine

http://www.foruse.com/

Edward Yourdon

http://www.yourdon.com/index.htm

Meilir Page-Jones

http://www.technologytransfer.it/it/speakers/meilir_page_jones.asp

Grady Booch, James Rumbaugh, Ivar Jacobson

http://www.rational.com

Bertrand Meyer

http://www.eiffel.com

VIII. Dimensiones en desarrollo de software

Los factores para la calidad del diseño y desarrollo de software se pueden agrupar en cuatro dimensiones:

  1. Personas - el aspecto más importante y que aporta en general los factores determinantes para la calidad del software

    El trabajo de Tom DeMarco y Tim Lister habla de esto desde hace ya muchos años

    http://www.atlsysguild.com/GuildSite/TDM/Tom_DeMarco.html

    First-Order Components in Software Development (People-oriented programming, non-linear response) de Alistair Cockburn

    http://crystalmethodologies.org/articles/panlc/peopleasnonlinearcomponents.html

    Las personas en el diseño y programación orientada a objetos, de un servidor

    http://www.rosenblueth.mx/InterFAR/Vol1Num3/doc/Vol1Num3-48.htm

  2. Proceso - las secciones VI y VII arriba

  3. Arquitectura de Producto - las secciones II,III,IV y V arriba

    Si un producto de software es correcto y robusto, es porque su código fuente tiene una adecuada administración de dependencias internas y conserva un adecuado sentido de estética y orden entre sus componentes; si un producto de software es modular y extensible es porque su código fuente tiene esas propiedades.

    De ninguna otra manera es posible conseguir la calidad externa del software si no se atiende desde el principio la calida interna, de esto trata el siguiente articulo de Bertrand Meyer:

    Factores de la calidad del software

    https://www.angelfire.com/dc/marcodorantes/Docs/CalidadDelSoftware.doc

  4. Tecnología - aquí va todo el conocimiento especifico de una plataforma de cómputo

IX. Pensamiento sistémico

Patrones y la teoría general de sistemas para el futuro (que ya paso) - existe material importante y un cuerpo de conocimiento fundamental que, sin importar lo que digan los de mercadotecnia, es indispensable dominar para ser relevante en desarrollo de software ahora y siempre, se trata de los patrones o mecanismos análogos de la teoría general de sistemas.

Comúnmente se escucha de patrones de diseño, sin embargo, esos pertenecen a una categoría, pero los hay por todos lados, patrones de proceso, patrones organizacionales, patrones arquitectónicos, patrones de implementación (idioms), patrones de análisis; esto equivale a lo que la teoría general de sistemas estudia como situaciones análogas en relación a los procesos de pensamiento en los seres humanos.

Las herramientas de pensamiento para diseño moderno de software están disponibles y serán las bases para el software que estaremos usando en el cual se utilizan múltiples paradigmas para su diseño.

Algunas referencias al respecto:

"Este no es el final, ni siquiera es el comienzo del final; tal vez, tan solo es el final del comienzo" -Winston Churchill