DSN_XP y la genialidad de John Guttag

 La abstracción como tipo de dato


DSN_XP entre en contacto con John Guttag cuando comenzamos a analizar tanto a la ingeniería que da soporte al proceso de abstracción en el desarrollo de software y a la ingeniería de software / ciencias de la computación en el desarrollo e implementación de dicho software.
Para la arquitectura, la ingeniería es la base fundamental para el desarrollo de las perspectivas de diseño que necesariamente requieren de una estructura modular. 
El concepto de tipo de dato abstracto (TDA, Abstract Data Type), fue propuesto por primera vez hacia 1974 por John Guttag y otros, pero no fue hasta 1975 que por primera vez Barbara Liskov lo propuso para el lenguaje CLU.

El diseño de especificaciones de tipos de datos

Documento de conferencia 
Enero de 1976
John V. Guttag *, Ellis Horowitz * y David R. Musser **

Resumen

Este artículo trata sobre el diseño de tipos de datos en la creación de un sistema de software. El punto principal es explorar un significado para especificar un tipo de dato que es independiente de su eventual implementación. El estilo particular de especificación denominado axiomas algebraicos, se exhibe axiomatizando muchos tipos de datos de uso común.  Como tal, estos ejemplos revelan mucho sobre las complejidades de la especificación del tipo de datos a través de axiomas algebraicos y, además, un estándar con el que se pueden comparar formas alternativas. Más allá del uso de esta técnica de especificación para probar la exactitud de las implementaciones y en la ejecución interpretativa de un diseño de sistema grande antes de que comience la implementación real.

Términos de indexación: 

Tipo de datos, especificación, axiomas algebraicos, software diseño, programación recursiva, corrección del programa.

Introducción

El proceso de creación de un sistema de software es generalmente considerado como un proceso de cuatro etapas: requisitos, diseño, codificación y pruebas. Para algunas de estas etapas, las herramientas, las técnicas o ambas han sido desarrolladas para mejorar significativamente el proceso. 

Recientemente ha habido una creciente preocupación por el desarrollo de ayudas para la etapa de diseño. El diseño es esencialmente un proceso creativo, sintético y una herramienta completamente automatizada es muy poco probable que lo sea. 
Lo que se sugiere es seguir una "metodología" o un estilo de trabajo, que se supone produce diseños mejorados.
El diseño de arriba hacia abajo es un proceso mediante el cual se transforma una tarea en un programa ejecutable. Este proceso en su forma más pura, requiere refinar cuidadosamente, paso a paso, los requisitos funcionales de un sistema en programas operativos, más las directrices sobre la elección de declaraciones apropiadas y el aplazamiento de decisiones de diseño, se puede encontrar en [Dahl 72].
El propósito de este artículo es explorar una estrategia complementaria de diseño, el diseño de tipos de datos. 
Un sistema completo de software puede contener una variedad de tipos de datos (listas, pilas, árboles, matrices, etc.) y una variedad de operaciones. 
Un procedimiento de diseño útil es tratar aquellas operaciones que actúan principalmente sobre un solo tipo de datos como parte de una unidad y considerar la semántica de estas operaciones como la definición del tipo. 
Esta idea estaba implícita en el lenguaje de programación SIMULA 67 [Dahl 70], en el que la designación sintáctica class denota una colección de tales operaciones. Sin embargo, el concepto de clase aplica este principio a nivel de lenguaje de programación en lugar de en tiempo de diseño

Cada operación de una clase es directamente un programa ejecutable. También es útil considerar una colección de operaciones en tiempo de diseño y luego el proceso de diseño (de tipos de datos) consiste en especificar esas operaciones a cada vez mayor nivel de detalle hasta que se logre una implementación ejecutable, la idea que deseamos explorar aquí es cómo crear una especificación inicial de un tipo de dato.

Una especificación de un tipo de dato (o tipo de dato abstracto) es una definición formal independiente de la representación de cada operación de un tipo de datos. Por lo tanto, el diseño completo de un solo tipo de datos procede dando primero su especificación, seguido de una (eficiente) implementación que esté de acuerdo con la especificación. Esta separación del diseño de tipos de datos en dos fases distintas es muy útil desde un punto de vista organizacional. Cualquier proceso que necesite hacer uso del tipo de datos puede hacerlo examinando solo la especificación.
No es necesario esperar hasta que el tipo esté completamente implementado ni necesario para comprender completamente la implementación.
Hay dos preocupaciones principales al diseñar una técnica para especificación de tipo datos:
  • La primera es idear una notación que permita una definición rigurosa de operaciones pero sigue siendo una representación independiente y 
  • la segunda es aprender a usar esa notación. Ahí hay muchos criterios que se pueden usar para medir el valor de una notación de especificación, pero las dos principales son las siguientes: 
  1. ¿pueden las especificaciones ser construidas sin dificultad indebida? y,
  2.  ¿es la especificación resultante fácil de comprender?. 
Al igual que con la programación, hay potencialmente un gran número de formas de especificar una operación. Una buena especificación de tipo de dato debe proporcionar la información suficiente para definir el tipo, pero no tanto que la elección de sus implementaciones que son basadas en la especificación es limitada. Por tanto, decimos que una especificación de tipo de dato es una abstracción de un concepto cuya implementación final es solo una instancia.

En este artículo, nuestra intención es explorar una técnica de especificación particular [Guttag 75], [Zilles 75], [Goguen 75], al exhibir especificaciones para una serie de tipos de datos de uso común.

Los que hemos elegido son típicos de los que son discutidos en un curso sobre estructuras de datos, ver [Horowitz 76]. Por proporcionar estos ejemplos esperamos convencer al lector de que el estilo de especificación que discutimos aquí es especialmente apropiado para diseñar tipos de datos y que cumpla con los dos criterios previamente fijados. En segundo lugar, esperamos que estas especificaciones de ejemplo proporcionen un estándar por el cual se pueden comparar con otros métodos. 

Nosotros no pretendemos haber proporcionado especificaciones definitivas de los tipos de datos de ejemplo. Tanto nuestra elección de operaciones como la semántica que asociamos con algunas de las operaciones son algo arbitrarias. En el último apartado indicamos cómo se pueden realizar estas especificaciones más utilizadas para probar la exactitud de las implementaciones y para  probar, en tiempo de diseño, grandes sistemas de software. 

Sin embargo, desde que estos temas son bastante largos para discutir, limitamos nuestra presentación aquí para una discusión informal de lectura y escritura del tipo de especificaciones de datos. Los temas restantes solo se insinuarán aquí y que son tratados en [Guttag 76b].

Muchas otras personas han estado trabajando en estas áreas relacionadas y nos hemos beneficiado de sus ideas. Una bibliografía útil de este trabajo se da en [Liskov 75]. Algunas de las particulares axiomatizaciones ya han aparecido en la literatura, en particular pilas, colas y conjuntos, consulte [Liskov 75], [Guttag 76a], [Goguen 751 [Standish 73] y [Spitzen 75].

Las especificaciones

¿Cómo se puede describir un tipo de datos sin restringir indebidamente su eventual forma implementada? 
Un método es definir el objeto utilizando lenguaje natural y la notación matemática. 
Por ejemplo, una pila puede ser definida como una secuencia de objetos (al, ..., an) n>=0, donde solo se permiten inserciones o eliminaciones a su extremo derecho. 
Este tipo de definición no es satisfactorio desde el punto de vista informático en donde es preferible definir constructivamente un tipo de dato por definir las operaciones que crean, acumulan y destruyen instancias del tipo. 
Dado que los diseñadores de software generalmente saben cómo programar, el uso de un lenguaje de programación para la especificación es especialmente deseable.

Las características que elegimos permiten solo lo siguiente:
  1. variables libres
  2. if-then-else expresiones
  3. Expresiones booleanas
  4. recursividad
Además restringimos el uso de procedimientos para aquellos que son de valor único y no tienen efectos secundarios. Tenga en cuenta que muchas características normalmente que se presumen que están presentes en los lenguajes de programación convencionales (como la asignación a variables, una declaración de iteración) no están permitidas en este formalismo. 

Este enfoque puede parecer tan arbitrario como para eliminar la posibilidad de lograr las metas previamente establecidas, pero en realidad tiene varios puntos fuertes por los que se lo recomienda. 
  • Primero, el conjunto restringido produce una representación independiente para suministrar una especificación. 
  • Segundo, las especificaciones resultantes pueden expresar muy claramente los conceptos si el lector se siente cómodo con la lectura de programas recursivos. (Aunque muchos programadores no están tan acostumbrados, una lectura fiel de este documento servirá como tutorial sobre este tema).
  • En tercer lugar, la separación de valores y efectos secundarios aporta claridad y simplifica una especificación. Aunque requerir esta separación puede ser demasiado restrictivo para una implementación, los criterios de eficiencia pueden relajarse en la etapa de especificación
  • Cuarto, las características anteriores pueden ser fácilmente axiomatizadas, que es un primer paso necesario para realizar con éxito pruebas de implementación, ver [Guttag 76b].
Comencemos con un ejemplo muy simple de una pila que está dada en la Figura 2.1. 

Las operaciones que están disponibles para manipular una pila son: 
  1. NEWSTACK, que produce una instancia de una pila vacía; 
  2. PUSH, que inserta un nuevo elemento en la pila y devuelve la pila resultante; 
  3. POP, que elimina el elemento superior y devuelve la pila resultante; 
  4. TOP, que devuelve el elemento superior de la pila; 
  5. ISNEWSTACK, que prueba si una pila está vacía. 

Para cada operación, los tipos de entradas y salidas son enumerados en la sentencia de la declaración. Observe que todas las operaciones son verdaderas funciones que devuelven un valor único y no permiten efectos secundarios. Si las operaciones de pila se implementan mediante procedimientos con efectos secundarios, su efecto se puede especificar fácilmente en términos de las operaciones que se han dado. La extensión del formalismo de esta manera se analiza en la sección 3.

En este punto, introduzcamos las convenciones de notación que se utilizan a lo largo de este documento. 
  • Todos los nombres de las operaciones están escritos en mayúsculas.
  • Los nombres de los tipos comienzan con una letra mayúscula, por ejemplo, Pila. Minúscula
  • Los símbolos se consideran variables libres, como s e i en la figura 2.1. que se toman como de tipo Pila y artículo respectivamente
  • Los nombres de tipo se pueden modificar enumerando "parámetros" dentro de corchetes. Estos parámetros pueden ser nombres de tipos o variables libres cuyo rango es un tipo, por ejemplo , el elemento es una variable e indica que el tipo Pila puede aplicarse a cualquier otro tipo de datos . Las ecuaciones dentro de for all y final son los axiomas que describen la semántica de las operaciones.
Al principio, estos axiomas pueden resultar difíciles de comprender. Una ayuda consiste en interpretar los axiomas como la definición de un conjunto de funciones recursivas.

La pila vacía está representada por la función con entrada sin argumentos NEWSTACK. Luego preguntando por el elemento superior de NEWSTACK se considera una condición excepcional que no dan como resultado un elemento, por lo tanto, lo llamamos INDEFINIDO. La única otra pila que podemos tener debe ser de la forma PUSH (s, i) donde s es cualquier pila e i es el elemento insertado más recientemente. 

Luego por la línea 12 el último elemento insertado es el primero devuelto. Note que no debemos preocuparnos por expresiones de la forma TOP (POP (s)), ya que los axiomas 9 y 10 nos dan reglas para expresar cualquier valor de tipo Pila en términos de NEWSTACK y PUSH.

Desafortunadamente, el ejemplo de la pila es demasiado simple al respecto para ilustrar adecuadamente las complejidades de la especificación de tipo de datos. Un ejemplo algo más rico es el tipo de datos Oueue o lista de primero en entrar, primero en salir. Su especificación se da en la Figura 2.2. Ahí son seis operaciones, cuatro de las cuales producen colas, una devuelve un elemento y otra tiene valor booleano. Los axiomas de la cola son más complejos que los axiomas de una pila en el sentido de que hacen uso de la construcción if-then-else y recursión

Una forma fácil de entender estos axiomas es concebir el conjunto de todas las colas como representado por el conjunto de cadenas que consta de

NEWQ o ADDQ (... ADDQ (ADDQ (NEWQ, it), i2), ..., in), n> l.

El artículo i1 está en la parte delantera y en la parte trasera. Entonces los axiomas pueden ser concebidos concretamente como reglas que muestran cómo cada operación actúa sobre cualquier cadena de este tipo. Por ejemplo, tomando el FRONTQ de la cola vacía es INDEFINIDA. De lo contrario, FRONTQ se aplica a una cola cuyo elemento insertado más recientemente es i, y q representa el resto de la cola. Si q está vacío, entonces i es el resultado correcto, de lo contrario, FRONTQ se aplica recursivamente a q. Una situación similar se mantiene para la operación DELETEQ. Tenga en cuenta que ninguna de las formas de representación de la cola, por ejemplo, como listas enlazadas o en una matriz, es implícito ni excluido por esta definición.


Consideremos una tercera estructura familiar, el árbol binario (Btree) y examinar con más detalle la virtud de considerar todos los valores de la estructura de datos representada por cadenas. Su especificación se da en la Figura 2.3.


Las operaciones incluidas son EMPTYTREE que crea el árbol vacío, MAKE, que une dos árboles con una nueva raíz y operaciones que acceden a los datos en un nodo, el subárbol izquierdo y el subárbol derecho de un nodo y busque un elemento de datos determinado. Tres operaciones que, naturalmente, podríamos preguntarnos si incluir los métodos de recorrido son habituales, preorder, inorder y postorder, que coloque los elementos contenidos en el árbol en una cola [Horowitz 76].

Quizás la razón más poderosa para incluirlos es el hecho de que están expresados ​​de manera tan sucinta por nuestra notación recursiva, por ejemplo, 

INORD(Btree) -* Queue y 
INORD(EMPTYTREE) = NEWQ 
INORD(MAKE(I,d,r)) = APPENDQ(ADDQ(INORD(I),d),INORD(r)) 

Para cada I,r perteneciente a Btree y d perteneciente a item. La elección de qué operaciones incluir en una especificación es arbitraria. Hemos omitido esto operación porque hace un uso significativo de las operaciones de otro tipo de datos: Cola. De todos modos, esto nos da la oportunidad de experimentar con la representación de cadenas. 

Hagamos un ejemplo que comienza con el árbol binario.

T = MAKE(MAKE(EMPTYTREE,B,EMPTYTREE),A,
MAKE(EMPTYTREE,C,EMPTYTREE))

y aplica los axiomas a INORD (T) para obtener 

INORD (T) = APPENDQ (ADDQ (INORD (MAKE (EMPTYTREE, B, EMPTYTREE)), A) INORD (MAKE (EMPTYTREE, C, EMPTYTREE))) 

que por la definición de INORD se convierte en 

APENI ~ Q (ADDQ (APENDQ (ADDQ (NEWQ, B), NEWQ), A), APENDQ (ADDQ (NEWQ, C), NEWQ))

y ahora usando los axiomas para APPENDQ obtenemos

APENDQ (ADDQ (ADDQ (NEWQ, B), A), ADDQ (NEWQ, C)) y nuevamente aplicando APPENDQ 

obtenemos 

ADDQ(APPENDQ(ADDQ(ADDQ(NEWQ,B),A),NEWQ),C) lo cual nos lleva al resultado final  

ADDQ(ADDQ(ADDQ(NEWQ,B),A),C)

En este punto, el lector ha visto tres ejemplos y estamos en una mejor posición para argumentar las virtudes de la notación de especificación.

El número de axiomas está directamente relacionado con el número de operaciones del tipo que se describe. La restricción de expresar axiomas usando solo el if-then-else y la recursividad no ha causado ninguna contorsión.

Esto no debería sorprender a los programadores LISP que han encontrado estas suficientes características muchos años de programación. Una crítica que uno generalmente se encuentra es que la recursividad obliga a uno a un código ineficaz, como el evidenciado por la operación FRONTQ que encuentra el elemento frontal de la cola comenzando en el último elemento. A esto respondemos que una especificación no debe verse como una descripción del eventual programa implementado, sino simplemente como un medio para comprender la operación que está por hacer. 

Un segundo comentario supone que los nombres de la operación no están bien elegidos y luego se pregunta ¿Qué tan fácil es es revelar su significado a través de los axiomas?. Esto es difícil de responder, especialmente cuando se trata de imaginar cómo otras técnicas serían justamente bajo esta restricción. Sin embargo, podríamos preguntarle al lector si él puede determinar qué hace la operación MISTERIO donde:

MYSTERY(Queue) --> Queue and
MYSTERY(NEWQ) --> NEWQ
MYSTERY(ADDQ(q,i)) --> APPENDQ(ADDQ(NEWQ,i),MYSTERY(q))

Consideremos otro tipo familiar: String. En la especificación de la Figura 2.4, hemos elegido cinco operaciones primitivas:


NULL, que crea la cadena nula; ADDCHAR, que agrega un carácter a una cadena; CONCAT, que une dos hilos; SUBSTR (s, i, j), que de una cadena s devuelve la subcadena de caracteres j comenzando en el i-ésimo carácter de s; INDICE (s, t), que devuelve el posición de una cadena t como subcadena de una cadena s (0 si t no es una subcadena de s).

Tenga en cuenta que existen varios tipos que componen esta definición además del tipo String; a saber, Carácter, Entero y Booleano. En general, una especificación de tipo de datos siempre define solo un tipo, pero se puede requerir en las operaciones de otros tipos de datos para lograr esto

Otra pregunta que surge de nuevo es ¿Cuándo debería una operación ser parte de la especificación y cuándo no debería serlo?, problema que ya hemos encontrado con árboles binarios. Las operaciones que hemos elegido aquí son básicamente las que se proporcionan en PL / I.

Hasta ahora nos hemos concentrado principalmente en cómo leer los axiomas. Ahora consideremos cómo crearlos. Como esquema general de ataque, comenzamos con un conjunto básico de operaciones fl, ..., fm.  Un subconjunto de estos, digamos 'fl, ..., fk k_ <m, tienen como salida el tipo de datos que es definido. De las k operaciones se elige un subconjunto que llamamos el conjunto de constructores que satisface la propiedad de que todas las instancias de los tipos de datos se pueden representar utilizando solo operaciones de conjuntos de constructores. Entonces, los axiomas que deben escribirse son los que muestran cómo cada operación de conjunto no constructor se comporta en todas las instancias posibles de tipo de datos.

Como un nuevo ejemplo, considere el tipo Set. Las operaciones cuyo rango es de tipo Set son: 

EMPTYSET que tiene el habitual sentido; INSERT y DELSET que ponen un elemento en uno o lo eliminan del conjunto respectivamente. De estas tres operaciones seleccionamos EMPTYSET e INSERT como constructores. Entonces un conjunto arbitrario que contiene n_> 1 elementos viene dado por la expresión

INSERT(...INSERT(EMPTYSET,i 1 ,),...,in).

Una característica muy importante de esta definición es el hecho de que no existe pedido asumido en los artículos. Alternativamente, la especificación podría insistir en que il <i2 <... <in también sea cierto. Una especificación anterior de un conjunto que asumió que se dio un pedido en [Zilles 75].


El tipo de gráfico de la figura 2.6 es interesante en varios aspectos.  La definición matemática de un gráfico es generalmente en términos de dos conjuntos: nodos y aristas. Esto se refleja en los constructores de esta definición que son EMPTYGRAPH, ADDNODE y ADDEDGE. Esta definición permite un gráfico no conectado y para nodos sin incidentes en sus bordes. Una arista está dada por la función REL (i, j) (un constructor del borde del tipo de datos) y no se especifica si los bordes están dirigidos o no.


Observe que tres de las operaciones resultado en conjuntos y la notación de parámetros ha sido naturalmente extendida para distinguir entre conjuntos con diferentes tipos de elementos. ADJAC encuentra todos los nodos adyacentes a algún vértice. NODOUT (g, v) elimina el nodo v y todos los bordes incidentes a v. EDGEOUT elimina un solo borde del gráfico.

El siguiente ejemplo es un tipo de datos de archivo secuencial (Figura 2.7). Las operaciones incluyen READ, WRITE, RESET, ISEOF (fin de archivo check) y SKIP (más allá de un número específico de registros).


Las operaciones secuenciales de archivos no serían, en la práctica, implementados como funciones, sino más bien como procedimientos con efectos secundarios, diga READP (f, r) y WRITEP (f, r). 

Las operaciones que hemos dado pueden utilizarse para especificar los efectos de estos procedimientos:

READP (f, r) significa r <- LEER (f), f ~ SALTAR (f, 1); y WRITEP (f, r) significa f <- WRITE (f, r). 

Nota: Los axiomas implican que si una operación SKIP sigue inmediatamente a una de ESCRIBIR, significa restablecer el archivo a su comienzo, luego saltar más allá de i registros. Además, si se sobrescribe un registro, la parte del archivo más allá se pierde el registro. Para un estudio más detallado de los axiomas, tenga en cuenta que todos los valores de archivos se pueden ver como una de las siguientes formas de cadena:

EMPTYFILE o WRITE (WRITE (, .. (EMPTYFILE, r 1), ..., rn) o 
SKIP (WRITE (WRITE (..., (EMPTYFILE, r 1,), ..., rn), i).

Concluimos este apartado con una presentación de tipo Polinomio. La definición matemática habitual de un polinomio es una expresión de la forma:


donde x es un indeterminado y el ai proviene de algún anillo conmutativo. Si am fO entonces m se llama grado, am el coeficiente principal, y am_lxm-l + ... + alx + a 0 el reductum.

Una especificación de Polinomios como un tipo de datos con once operaciones en la Figura 2.8.


En esta especificación cada polinomio es CERO o construido aplicando ADDTERM a un polinomio. 

Nota: La ausencia de supuestos sobre el orden de los exponentes, distintos coeficientes de cero, etc., que son importantes como decisiones de representación pero no es esencial para la especificación.

La verdadera virtud de esta especificación es que un sistema bastante complejo el objeto se ha definido completamente utilizando solo unas pocas líneas. los programas correspondientes en un lenguaje de programación convencional pueden ser varias veces este tamaño. (Esto será especialmente cierto si algunos de se utilizan los algoritmos "rápidos".)

Procedimientos y tipos finitos

Hasta ahora todos los tipos de datos abstractos que tenemos axiomatizados han sido infinitos. Es relevante observar un paralelo aquí entre la informática y las matemáticas, que los tipos finitos a menudo son más difíciles de definir que los infinitos. Esta sección tiene la intención de hacer frente a las complicaciones añadidas de especificar más tipos de datos realistas. En particular, investigamos cómo especificar un tipo de tamaño finito. Al mismo tiempo relajaremos la restricción que todas las operaciones sean de un solo valor y permitan una notación que se asemeja al uso convencional de procedimientos. Esta notación fue introducida por primera vez en [Guttag 76b].

Ahora será permisible incluir procedimientos en las especificaciones. Un procedimiento P cuyo primer argumento, x, se modifica como un resultado de su ejecución pero no su segundo argumento y, es declarada sintácticamente como P (var x, y). Si P es un procedimiento puro, es decir, no devuelve ningún valor, entonces esto se expresa sintácticamente escribiendo P (var x, y) ->. La definición del procedimiento P se incluirá en la especificación semántica del tipo de datos. Un procedimiento tiene cuerpo y una parte de valor opcional separada por un punto y coma, p. ej.

P (var x, uar y) - x * - F (x, y), y <- G (x); H (x, y).

es una posible definición de P donde F, G, H son funciones y H devuelve un valor, observe que la asignación simultánea a los parámetros ahora es permitido, pero seguimos adhiriéndonos a nuestro enfoque anterior al requerido que cada procedimiento sea expresado por funciones de un solo valor.

En algunos casos, estas últimas operaciones ya no serán accesibles por el usuario del tipo de datos. Las llamamos funciones ocultas e indíquelos colocando una estrella junto a su nombre.

Como ejemplo, damos en la Figura 3.1 la especificación de un cola de tamaño finito. Nótese que en comparación con la cola infinita de la Figura 2.2 se han agregado cuatro nuevas operaciones. ADDQ y DELETEQ ahora se designan como funciones ocultas y en su lugar el usuario aplicará el procedimiento puro ENQ y la función DEQ, los cuales tienen el efecto secundario de alterar su primer argumento. Observe también que hemos aumentado el valor INDEFINIDO operación permitiendo que sea calificado. Esto facilitará la manejo de errores distinguiendo su origen.

Otras direcciones 

En este artículo hemos destacado el arte de la especificación de tipo de datos. Nuestro principal objetivo ha sido explorar una notación que sea especialmente atractiva para definir formalmente un tipo de datos sin tener en cuenta a su implementación. En esta sección queremos indicar brevemente cómo estas especificaciones se pueden utilizar para diseñar software confiable, pero para una discusión completa de especificación reservadas en [Guttag 76b].

El primer uso de una especificación axiomática es como una ayuda al diseñar e implementar el tipo. Se toma la decisión de elegir un forma particular de implementación. Esta implementación estará en términos de otros tipos de datos y asumimos que sus especificaciones ya existen. Para un tipo de datos complejo, este proceso puede continuar a través de varios niveles antes de que una implementación ejecutable sea lograda. La virtud de las especificaciones es que cada etapa se realiza más claro organizando los tipos, valores y operaciones que se pueden usar.


Un segundo uso de estas especificaciones y quizás su mayor importe, es para demostrar que una implementación es correcta.

Establecer la corrección ahora equivale a mostrar que los axiomas originales se satisfacen con la implementación recién desarrollada. A menudo es posible eludir la necesidad de inducción y, en cambio, una sencilla manipulación de la fórmula resulta suficiente. Esta el proceso también se presta con bastante facilidad a la automatización. Este trabajo es descrito en [Guttag 76b].

Otro uso de estas especificaciones es para pruebas tempranas. Eso sería muy deseable si uno pudiera diseñar un sistema de tal manera que podría probarse antes de comprometer a la gente a construirlo.

Dadas las restricciones adecuadas sobre la forma en que las ecuaciones axiomáticas puede tomar, un sistema en el que implementaciones y algebraicos se pueden construir de especificaciones de tipos de datos intercambiables.

En ausencia de una implementación, las operaciones del tipo de datos pueden interpretarse simbólicamente. Por lo tanto, a excepción de una pérdida significativa en eficiencia, la falta de una implementación se puede hacer completamente transparente para el usuario. Curiosamente no es necesario gastar muchos años-hombre desarrollando este sistema. La capacidad es esencialmente disponible en sistemas de manipulación de símbolos basados ​​en LISP como SCRATCHPAD [Griesmer 71], REDUCE [Hearn 71] y MACSYMA [Martín 71]. El uso de REDUCE para este propósito se discute en [Guttag 76b], que también analiza las ideas esenciales de un patrón compilador de coincidencias diseñado especialmente para la compilación de axiomas algebraicos .

Agradecimientos

Varias personas hicieron comentarios valiosos sobre borradores anteriores de este paper, incluidos Ralph London, Mary Shaw, Tim Standish, Dave WIle y los árbitros. Agradecemos a Betty Randall por su experiencia. y paciencia para mecanografiar muchos borradores del documento.

Referencias

[Dahl 70] OJ Oahl, B. Myhrhaug y K. Nygaard, "The SIMULA 67 idioma base común, "Norwegian Computing Center, Oslo, Publicación S-22, 1970.

[Dahl 72] OJ Dahl, EW Dijkstra y CAR Hoare, Strctctred Programación, Londres: académico, 1972, págs. 1-82.

[Goguen 75] JA Goguen, JW Thatcher, EG Wagner y JB Wright, "Tipos de datos abstractos como álgebras iniciales y exactitud de las representaciones de datos, actas, conferencias sobre gráficos por computadora, reconocimiento de patrones y datos Estructura, mayo de 1975.

[Griesmer 71] JH Griesmer y RD Jenks, SCRATCHPAD / Z -Una instalación interactiva para las matemáticas simbólicas " Proc. Segundo Simposio de Simposio y Algebraico Manipulation, ACM, marzo de 1971, págs. 42-58.

[Guttag 75] JV Guttag, "La especificación y aplicación para programación de tipos de datos abstractos, "Ph. D. Thesis, Universidad de Toronto, Departamento de Ciencias de la Computación, 1975, disponible como Informe de investigación de sistemas informáticos CSRG-59.

[Guttag 76a] JV Guttag, "Tipos de datos abstractos y desarrollo de estructuras de datos, "Suplemento del Actas de la Conferencia SIGPLAN / SIGMOD sobre Datos: abstracción, definición y estructura, marzo de 1976, págs. 37-46.

[Guttag 76b] JV Guttag, E. Horowitz y DR Musser, "Tipos de datos abstractos y validación de software", USC Informe técnico del Instituto de Ciencias de la Información, 1976.

[Hearn 71] AC Hearn, "Reduce 2: un sistema y un idioma para manipulación algebraica, " Proc. Segundo Simposio sobre Manipulación simbólica y algebraica, ACM, marzo de 1971, págs. 128-133.

[Horowltz 76] E. Horowitz y S. Sahni, Fundamentos de datos Estructuras, Computer Science Press, junio de 1976.

[Liskov 75] BH Liskov y $. N. Zilles, "Especificación técnicas de abstracción de datos, " Transacciones IEEE en Ingeniería Softusare, Vol. SE-I, No. 1, marzo de 1975, págs. 7-18.

[Martin 71] WA Martin y RJ Fateman, "The MACSYMA sistema, " Proc. Segundo Simposio sobre Simbólicos y Algebraicos Manipulation, ACM, marzo de 1971, págs. 59-75.

[McCarthy 63] J. McCarthy, "Base para una teoría matemática de comlbutation, "en CotTtptLter Programming and Formal Systems, P. ~ Braffort y D. Hirchberg (eds.), North-Holland Publishing Compañía, 1963, págs. 33-70.

[Parnas 72] DL Parnas, "Una técnica para la especificación de módulos de software con ejemplos, " Comm. ACM, VoI. 15, págs. 330-336, mayo de 1972.

----------

Esta investigación fue apoyada en parte por Defense Research Agencia de Proyectos bajo contrato No. DAHC15 72 C 0308 y por el National Science Foundation bajo contrato No. MCS76-06089. Las opiniones expresadas son las de los autores.

* Departamento de Ciencias de la Computación, USC, Los Ángeles, CA 90007
** Instituto de Ciencias de la Información de la USC, 4676 Admiralty Way, Marina del Rey, CA 90291

DSN_XP y Alistair Cockburn en gratitud constante

 Metodología del software

Metodólogo Alistair Cockburn
DSN_XP entra en contacto con las ideas de Alistair mediante su familia de esquemas estratégicos para equipos de desarrollo de software o CRYSTAL CLEAR

Fuente de conocimientos

Metodología centrada en el potencial humano

Alistair se convierte en una fuente de conocimientos importantes para DSN_XP al poder tener como ejemplo a un investigador del software y metodólogo, todo un estudios de varios artefactos que ha ido estudiando y experimentando en su blog personal. 

Advanced Use Case

Alistair también se vuelve un referente como metodólogo en el uso avanzado de los casos de uso para el diseño de software. DSN_XP venía desarrollando una mirada similar desde nuestro método de modelando avanzado basado en casos de uso y el poder de abstracción que nos brindaba UML.

Manifiesto Agile

Alistair es uno de los mentores del manifiesto agile, de hecho, nuestros registros sobre la concepción del manifiesto y las fotografías que adornan nuestro blog fueron liberadas por el propio Alistair a la comunidad.

IC Agile y el modelado de competencias

Alistair promovió un modelo de certificación que respondía a las necesidades de la comunidad internacional en base a un diseño muy interesante sobre formación de sus estudiantes.

Scrum

Alistair abandona al equipo IC Agile y comienza su gira internacional mediante su capacitación  en Scrum

Corazón de la agilidad

El último esfuerzo metodológico realizado por Alistar se denomina el Corazón de la Agilidad y sintetiza todo el proceso observado a lo largo del tiempo y hasta la fecha, tanto del proceso de capacitaciones como el material pedagógico de entrenamiento.

DSN_XP y la investigación científica

Investigación Científica

Investigación aplicada al concepto de software
DSN_XP debía empezar a realizar una serie de investigaciones técnicas con el objetivo de ir poblando su base de conocimientos, con el criterio de usabilidad de las herramientas y modelos que habíamos encontrado hasta ese momento en el estudio del os fundamentos del software.

Investigaciones DSN_XP

Como DSN_XP, debíamos explicar la razón fundamental del aporte de nuestras ideas a la academia en Ecuador, esto implicaba ya un esfuerzo mayor que debía ser registrado para efectos de entender y definir un método personalizado para desarrollar software, el mismo que utilizamos en cada una de las actividades académicas requeridas para la obtención del título de Ingeniero en Sistemas.

Búsqueda del método

En este contexto espacio tiempo, frente a la rigidez de un método científico aplicado al desarrollo de la tesis de grado por un lado y por el otro, a la necesidad de un método ágil para el desarrollo evolutivo de soluciones en base al prototipado y la mejora continua, nuestra línea de investigación era más que necesaria, sin embargo, no encontramos en otras universidades investigaciones al respecto.

Habíamos visto tesis que mencionaban a SPICE como marco de trabajo pero ninguna realizaba un análisis profundo al aspecto académico de la ingeniería de software y la necesidad de marcos de trabajo especializados para el desarrollo de software en Ecuador.

Norma SPICE ISO/IEC 15504 - EQA
Habíamos visto tesis que decían (al igual que nosotros) aplican la metodología de programación extrema XP, sin embargo, dichas tesis tampoco lograban observar la necesidad de emplear un marco de trabajo más allá de un método (o el conjunto de buenas prácticas para aplicarse en entornos de desarrollo de software).

Comprender esto es ya tener una mirada profunda hacia el proceso de desarrollar software en Ecuador y su impacto como una nueva carrera que se insertaba en la matriz cognitiva de las mallas curriculares de los institutos superiores y universidades y la carrera de sistemas como tal.

Nuevamente, dado que no existían registros en la academia del Ecuador que estudien este aspecto, nos parecía de vital importancia el profundizar dicho estudio y con ello plantear un conocimiento nuevo (respecto al contexto ecuatoriano) sobre la ingeniería de software y su estructura como ingeniería.

Para resolver esto, se requería necesariamente de un método de investigación y este necesariamente debía ser histórico mediante la lectura misma de la base de conocimientos de la ingeniería de software, entonces... el primer dilema a resolver era demostrar que la lectura como método de investigación era más que evidente para la naturaleza de nuestra investigación y que el método que puede ser empleado para estudiar un fenómeno en movimiento era justamente el método histórico. 

Luego tuvimos la oportunidad de encontrar un documento muy importante de investigación en español que se realizaba justamente aplicado a la ingeniería de software, esta investigación nos permitió dar un paso gigante en el desarrollo de nuestro método y en consecuencia en su prueba en un campo específico como dentro del estudio del método o metodología.

DSN_XP y Mario Bunge en gratitud

 Filosofía en español


Fuente de conocimiento en filosofía
DSN_XP entra en contacto con este actor, cuando profundizamos en la filosofía como fuente de conocimiento en la búsqueda de argumentos que nos permitan sostener teóricamente la maleabilidad del software (como la capacidad de poder manipular su estructura y su comportamiento en tiempo de ejecución).

Mario Bunge

Es fundador de la Sociedad para la Filosofía Exacta que procura emplear solamente conceptos exactos, definidos mediante la lógica o la matemática a fin de evitar la ambigüedad y la imprecisión características de otros estilos filosóficos, entre ellos el fenomenológico, el postmoderno (especialmente el hermenéutico) y provoca (a la vez que estimula) el tratamiento de problemas no triviales como contraste con la gigantesca producción filosófica libresca que interpreta recursivamente las opiniones de otros filósofos o que juega con objetos ideales o mundos posibles.

La concepción sistemista de Mario Bunge tiene dos aspectos principales, uno ontológico y otro gnoseológico. El sistemismo ontológico que Bunge defiende y postula que el mundo es un sistema de sistemas, es decir que toda cosa concreta es un sistema o un componente de algún sistema. 

Un sistema es, en efecto, un objeto complejo estructurado, cuyas partes están relacionadas entre sí por medio de vínculos (estructura) pertenecientes a un nivel determinado. ​Además, puesto que un sistema se caracteriza por poseer propiedades que sus componentes no poseen (vale decir, propiedades globales o emergentes), el sistemismo de Bunge es también emergentista. En otras palabras, la ontología bungeana es monista con respecto a la sustancia y pluralista respecto de las propiedades.

Bunge y la tecnología

Bunge indica que pueden presentarse una serie de «candidatos» plausibles al estatus de generalización sobre el desarrollo tecnológico:
  • Toda cosa o proceso artificial puede ser mejorado, pero solo hasta cierto punto: hay límites naturales y sociales.
  • Toda innovación tecnológica tiene efectos colaterales impredecibles e indeseables.
  • En principio, cada uno de estos defectos puede reparase con la ayuda de más conocimiento o bien de una reforma social.
  • Todo adelanto importante en la alta tecnología explota algún descubrimiento científico.
  • Solo una pequeña fracción de la ciencia básica llega a aplicarse y solo una pequeña fracción de la ciencia aplicada encuentra uso en la tecnología.
  • Habitualmente hay un retraso de varios años entre los hallazgos científicos y su uso tecnológico.
  • La mayoría de las invenciones nunca se llevan a la práctica.
  • La tecnología militar redunda únicamente en mínimos productos secundarios de uso civil y hace más lento el progreso de la tecnología civil porque desvía cerebros, recursos naturales y fondos.
  • En las naciones en desarrollo la tecnología comienza siendo imitativa.
  • La innovación tecnológica como función del tamaño de una empresa es una "u invertida" (∩): en un principio crece y luego declina.

DSN_XP y la perspectiva interna

MYSELF

MINDSET

El denominado MINDSET es incompleto sin la presencia del sentido de estar aquí  y éste sólo es posible gracias a la noción de ahora, el resto del tiempo es procrastinar....

Un esfuerzo justo para estar presente pide una fuerza que sea consciente de la dirección que quiere tomar y que tenga la voluntad de actuar.  La atención viene de todos los centros y debe estar aquí en una proporción justa y quedarse comprometida en tanto que se manifieste la Presencia consciente.

Pero esta atención de uno mismo (MySelf), está constantemente interrumpida por lo que la atrae hacia el exterior.  Es menester tomar consciencia de esta acción, de este deseo de moverse, de crear, de actuar...  Existe además el deseo de ser movido, de ser atraído, de obedecer...

Estas dos fuerzas están allí constantemente en nosotros, su confrontación voluntaria, en un punto determinado, puede producir una concentración de energía que tiene su propia vida independiente.
Es en la fricción entre esas dos fuerzas que se desarrolla la calidad que las reúne
Detrás de todas las vicisitudes, detrás de todas mis preocupaciones, mis penas o alegrías, hay algo más grande que puedo sentir, algo que me da un sentido..., pues siento que existo en relación con esa grandeza...

DSN_XP y el estudio del ciclo

El ciclo y la variable tiempo


El ciclo es un concepto que involucra la noción de tiempo, en este estudio, es una variable auxiliar que se requiere para la planificación.
DSN_XP inicia su estudio del ciclo basado en tiempo cuando, como marco de trabajo aplicado al estudio del desarrollo de software, se nos plantea responder sobre aspectos relacionados con la efectividad de nuestro método para administrar la complejidad para poder estimar el esfuerzo necesario para cumplir con un requerimiento que usualmente está relacionado con un contrato legal y la entrega del objeto de contratación de desarrollo de software.

Nota: Para una lectura formativa sobre el estudio del método visita esta entrada.

Tiempo

El tiempo se mide en unidades de tiempo, pero estas unidades tienen un costo asociado a su consumo que es de mucho interés para el cliente y para la sociedad también.

Se entiende que, la dimensión de negociación del proyecto a cargo del desarrollo de software, implica el cambiar de cualidad en el objeto de estudio (antes de implantar el software) desde una situación inicial, hasta una situación final (una vez puesto en producción el software), si el cambio es imperceptible para el observador, significa que la unidad de medida del ciclo de tiempo es muy lenta o demasiado rápida como para ser percibida.

La negociación del software

Dentro de los aspectos que este estudio requiere sobre el tiempo, es necesario establecer el escenario en el cual se desarrollan las actividades durante el período de desarrollo, en el estudio del software se presenta entonces la noción de proyecto de desarrollo de software y como tal, se supone que la metodología contempla, además del modelo de desarrollo de software, aquellos aspectos administrativos que fueron el dolor de cabeza de la industria durante la crisis metodológica que daría paso a la presencia de los métodos ligeros de desarrollo de software.

El ciclo es un concepto que involucra la noción de tiempo, el tiempo en este estudio es una variable auxiliar que se requiere para la planificación del esfuerzo.

Nota: Para una profundización sobre los aspectos del modelo de ciclo de vida, visita esta entrada

Ciclo de vida del desarrollo de software

La introducción teórica anterior era necesaria para poder comprender la noción de ciclo y en este caso en particular comprender los modelos de desarrollo de software propuesto por las diferentes escuelas de diseño, en concreto, nos interesa la escuela orientada a objetos y sus modelos arquitectónicos de componentes, paquetes hasta los denominados "building blocks".

DSN_XP tomó como referente para los aspectos administrativos que se encuentran englobados en la gestión de proyectos, a una de las herramientas propuesta por MSF o Microsoft Solution Framework 

DSN_XP y el método OOSE

Método OOSE

Método OOSE
Dentro del estudio de UML para el modelado de los proyectos de desarrollo de tesis y sus registros con DSN_XP,  bajamos a las raíces de sus artefactos y esto implicó el desarmar el método propuesto por Jacobson para el Análisis y Diseño orientado a objetos como uno de sus precursores.

Ingeniería de software orientada a objetos

Como DSN_XP, no encontramos registros de proyectos que aplicasen este método como referencia para el desarrollo de software, usualmente, el empleo de los casos de uso se hacía referencia al empleo de UML en lugar de ser artefactos adoptados por OOSE para su sustentación metodológica.

Sin embargo, DSN_XP reconoce a OOSE como una de sus fuentes de conocimiento y adopta algunas de sus observaciones tanto para el proceso de desarrollar un método como para lograr documentar técnicamente los proyectos de software.

Acerca de Ivar Jacobson

Nos interesó de sobremanera el artefacto denominado como caso de uso (Use Case) porque nos pareció genial la capacidad de modelado ágil con el cual se podía abstraer la complejidad de los sistemas, comparado con otras metodologías de corte clásico y estructurado que nos fueron enseñadas en aulas para lograr capturar la esencia del algoritmo de solución.
Nota: Nuestro método 1.0 adopta como estrategia el modelado avanzado con casos de uso para representar los intereses de los estudiantes ante el desarrollo de sus tesis de grado.

CVDS: 

Desarrollo iterativo e incremental, orientado al análisis, diseño y codificación por componentes.

ESCUELA DE DISEÑO: 

Orientación a objetos, orientación a componentes, los casos de uso originan el método

FECHA: 1992 (OBJECTORY)

FLUJOS DE TRABAJO: 

Arquitectura, análisis y diseño orientado a objetos, codificación orientada a componentes e implementación.

MÉTODO: 

El método se divide en 2 procesos una macro y otro micro, ambos procesos incluyen las etapas mencionadas pero se diferencian por el nivel de abstracción requerido de los objetos.

El proceso micro propone:

Una vez realizada la captura de requerimientos y el entendimiento del problema mediante los casos de uso, se define una arquitectura que soporte como guía al proceso de análisis y diseño debido a la noción de componentes como unidades modulares independientes que contienen objetos relacionados entre sí por su razón de uso (use case), el proceso de análisis y diseño se preocupa por definir los objetos, organizarlos, describirlos en sus relaciones y establecer su estructura interna (tipo y atributos), el proceso de construcción contempla objetos propios de la implementación diferentes del análisis y diseño con el objetivo de mantener intacto el diseño inicial, el proceso se repite y se refina continuamente hasta lograr el objetivo planteado por la arquitectura que dirige todo el proceso en sí.

Artefactos y/o Diagramas:

Los artefactos utilizados por OOSE son bastante parecidos a los propuestos por OMT, la diferencia fundamental radica en los denominados casos de uso que se convierten en el corazón del método y de los cuales se realiza los demás artefactos. OOSE potencia el uso de diagramas de interacción, diagramas de secuencia, diagramas de estados, diagramas de clases, diagramas de componentes.

DSN_XP y el método OMT

El Método OMT 

Dentro del estudio de UML como lenguaje para el modelado de soluciones basadas en el diseño de software, como DSN_XP 1.0 bajamos a las raíces gráficas de sus artefactos para modelar y esto implicó el desarmar el método propuesto por Rumbaugh para el Análisis y Diseño orientado a objetos como uno de sus precursores.

Object Modeling Technique (OMT)

CVDS: 

Desarrollo iterativo y secuencial, OMT sólo identifica los flujos de trabajo de análisis y diseño y no contempla los demás flujos.

ESCUELA DE DISEÑO: 

Orientación a objetos

FECHA: 1991 (GENERAL ELECTRIC LABS)

FLUJOS DE TRABAJO: 

Análisis del dominio del problema, diseño del sistema, diseño de objetos, implementación.

MÉTODO: 

El análisis comienza con el descubrimiento del problema y su modelado bajo entidades básicas del dominio (lenguaje apropiado para el negocio), este previo análisis permite definir el comportamiento deseado de las entidades y se define el alcance del sistema; para lograr modelar el sistema, se utiliza la técnica TOP-DOWN (describir la complejidad en partes sencillas) y se definen los subsistemas desde el punto de vista arquitectónico logrando así establecer una estrategia de descomposición; el diseño de objetos considera la estructura de datos de las entidades y los algoritmos necesarios para implementar el comportamiento deseado de las clases principales, se consideran las relaciones entre las entidades (modelo E/R orientado a las clases) y se construye un diccionario de entidades, la herencia se puede usar para generalizar los aspectos comunes de las clases existentes construyendo una superclase o para refinar una clase en subclases especializadas, finalmente se comprueba el diseño de objetos mediante las asociaciones establecidas para responder a inquietudes del negocio (aspectos de consumo y construcción de información sobre data básica de entrada) El proceso de implementación de la solución considera el uso adecuado de lenguajes de programación (sean o no orientados a objetos) y la capacidad de persistencia en bases de datos.

Artefactos y/o Diagramas:

El método utiliza 3 perspectivas: (1) Estática (Modelo de objetos = diagrama del modelo de objetos + diccionario de datos), (2) Dinámica (diagramas de estados + diagrama global de trazado de eventos ) y (3) Funcional (diagramas de flujo de datos + restricciones) 

Nota: se requieren modelos comunes durante el desarrollo desde las 3 perspectivas y se verifican, iteran y refinan las tres perspectivas continuamente.

Perspectiva Metodológica de DSN_XP

El Método OMT proporcionó a DSN_XP un marco robusto, especialmente en la perspectiva de datos, que fue clave para proyectos con alta complejidad transaccional (como el sistema AMBAR).

DSN_XP adopta la naturaleza iterativa (como Booch) y utiliza sus conceptos de análisis como base para el Software View. La escuela de Diseño Orientada a Objetos es objeto del estudio central de DSN_XP , priorizando la estructura sobre la funcionalidad.

Clave de Flujos Análisis del Dominio, Diseño del Sistema, Diseño de Objetos, Implementación. La separación rigurosa entre Dominio (Negocio) y Diseño de Objetos (Software) refuerza la necesidad de nuestras Perspectivas (Views).

Técnica Central TOP-DOWN (Descomposición de complejidad). Complementa el movimiento drillDown() de nuestra herramienta "El Taladro" para la profundización en la abstracción.

Modelo E/R orientado a Clases y Diccionario de Entidades . Proporciona una base sólida para el diseño de la Persistencia de Datos, un aspecto que a menudo se simplifica en otras metodologías OO puras.

Artefactos OMT: La Base de las Perspectivas

El mayor aporte del Método OMT a la filosofía de la Arquitectura DSN_XP es su estructuración del modelado en tres perspectivas esenciales y comunes, que deben verificarse y refinarse continuamente:
  • Modelo de Objetos (Perspectiva Estática): Captura la estructura de las clases, la herencia y las asociaciones (análogo a un diagrama de clases con su diccionario de datos).
  • Modelo Dinámico (Perspectiva Comportamiento): Describe el comportamiento del sistema a lo largo del tiempo utilizando Diagramas de Estados y Trazado de Eventos .
  • Modelo Funcional (Perspectiva Procesos/Flujo): Muestra la transformación de valores (datos) mediante Diagramas de Flujo de Datos (DFDs) y restricciones.
La diferenciación explícita de estas tres perspectivas (Objetos, Dinámica, Funcional) fue un precursor directo de las vistas arquitectónicas que DSN_XP adoptó y refinó posteriormente (ej. Software View , Business View ), asegurando que el diseño fuera completo desde Múltiples ángulos. 

OMT fue especialmente valorado por su solidez en el análisis de sistemas de información con gran cantidad de datos.

DSN_XP y su herramienta Taladro

Herramientas DSN_XP


Principio básico del Observador es confrontar las nociones de adentro y afuera de sí 
Las metodologías en el estudio del método, requieren para efectos de su operatividad de un conjunto de herramientas como artefactos y modelos que permiten en su aplicación, la obtención de la información.
Cuando iniciamos nuestro estudio del software y su proceso de creación, este esfuerzo requería de investigación tanto a nivel de la ingeniería de software como a nivel de su desarrollo localmente en Ecuador y desde una mirada como academia dentro de la formación profesional en universidades de quienes crearían este software.

El método de investigación temática


DSN_XP diseñó este artefacto para poder realizar prototipos mentales sobre el conocimiento de una cosa o de un evento.  El proceso de investigación científica aplicado al diseño del software utilizado por DSN_XP, requiere de una apropiada herramienta que nos permita realizar una minería de información en el vasto contenido publicado en la Internet. 

DSN_XP como método de investigación científica, obtiene su base de conocimientos académicos tanto de libros especializados como de la Internet (incluyendo sus redes sociales), DSN_XP por el principio de ingeniería inversa, requiere además del conocimiento académico, del conocimiento experimental que no necesariamente se basa en la opinión de alguien muy versado en tema o concepto investigado conocido como "Gurú", sino que recoge en sí mismo la noción de fallar como premisa del método y su modelo "codificar y corregir", actividad que denominamos en sintaxis como desarmar() y armar().

Proceso de abstracción en la definición del requerimiento


Por asociación, llamamos "El taladro" al artefacto que posee dos movimientos (BottomUp / TopDown) en el proceso de abstracción para el diseño de software y lo implementamos en su sintaxis como drillUp() y drillDown() 

Ahora bien, ¿pueden funcionar de forma independiente entre sí estos dos movimientos?... 

La respuesta es "depende" del contexto de uso en el cual estamos trabajando, sin embargo, hemos descubierto que para un mejor diseño, se requiere inevitablemente aplicar los dos movimientos pues se complementan entre sí.

El Taladro by DSN_XP

Esta herramienta propuesta por DSN_XP es un "taladro" cuyos dos movimientos permitidos son la profundización o drillDown() y la abstracción o drillUp(). Nos dió el principio de los posibles movimientos del taladro y que puede aplicarse en cualquier dirección y de forma directa o drillDown() o de forma inversa o drillUp().
  • drillDown() significa que el lector desea conocer más sobre el contenido de un post en especial, por lo cual tiene que profundizar sus lecturas hacia los orígenes de las fuentes (DSN_XP.Source), para ello dispone de una base de conocimientos de referencia.
  • drillUp() significa que el lector está en la capacidad de generar un modelo y poner a prueba DSN_XP, registrando todos los puntos e inquietudes que pueda tener al respecto en la base de conocimientos.
Estos dos movimientos son básicos en el método científico aplicado al estudio del diseño de software.

DSN_XP y el método BOOCH

El método de Booch

DSN_XP en su versión 1.0 encuentra en el estudio de UML los modelos técnicos que eran utilizados por las metodologías que dieron soporte al lenguaje de modelado universal.

Metodología Booch

Fuente de conocimientos DSN_XP

El Método de Booch y su Influencia en DSN_XP 1.0

El desarrollo de software ha evolucionado a lo largo de los años, buscando siempre metodologías que permitan crear sistemas más eficientes, robustos y adaptables. En este contexto, el Método de Booch, con su enfoque en la orientación a objetos, ha dejado una huella significativa. En este artículo, exploraremos este método y su relevancia en el desarrollo de DSN_XP 1.0.

¿Qué es el método de Booch?

El Método de Booch es una metodología de desarrollo de software orientado a objetos creados por Grady Booch en Rational Software Corporation (posteriormente adquirido por IBM). Se centra en cuatro pilares fundamentales:

  • Abstracción: Simplificar la complejidad del sistema mediante la identificación de los aspectos esenciales.
  • Encapsulamiento: Ocultar los detalles de implementación y exponer solo las interfaces necesarias.
  • Modularidad: Dividir el sistema en componentes independientes e interconectados.
  • Jerarquía: Organizar los componentes en una estructura jerárquica para facilitar la comprensión y el mantenimiento.

Componentes Clave del Método

El método se compone de tres elementos principales:

  • Notación: Un lenguaje para representar los modelos del sistema (como UML).
  • Proceso: Las actividades que guían la construcción ordenada de los modelos.
  • Herramientas: Los artefactos que automatizan tareas y ayudan a detectar errores e inconsistencias en los modelos.

Modelos en el Diseño Orientado a Objetos

El diseño orientado a objetos, promovido por Booch, busca crear software resistente al cambio y con una expresión concisa. Se basa en la creación de varios modelos:

  • Modelo Lógico: Representa la estructura conceptual del sistema.
  • Modelo Físico: Describe la implementación física del sistema, incluyendo hardware y software.
  • Modelo Estático: Muestra la estructura del sistema en un momento dado.
  • Modelo Dinámico: Describe el comportamiento del sistema a lo largo del tiempo.

Filosofía y Principios del Diseño según Booch

Booch enfatiza la importancia de una etapa de análisis seguida por una de diseño. El diseño se define como una aproximación disciplinada para resolver un problema, guiando desde los requerimientos hasta la implementación.

Principios clave del diseño:

  • Crear una arquitectura interna clara y sencilla.
  • Equilibrar los requisitos en conflicto.
  • Utilizar modelos para razonar sobre las estructuras y facilitar la toma de decisiones.

Los modelos permiten simular y probar el sistema en condiciones controladas, identificando posibles fallos y realizando ajustes antes de la implementación.

Valores en la Construcción de Sistemas

La construcción de un sistema implica:

  • Satisfacer los requisitos funcionales.
  • Adaptarse a las limitaciones del entorno.
  • Cumplir con los requisitos implícitos y explícitos sobre la forma del artefacto.
  • Respetar las restricciones del proceso de diseño, como el tiempo, el coste y las herramientas disponibles.

El Ciclo de Vida Iterativo e Incremental

Booch recomienda el modelo iterativo e incremental para el ciclo de vida del software. Este enfoque permite refinar la arquitectura a través de iteraciones sucesivas y entregar incrementos funcionales del sistema.

DSN_XP 1.0 y la influencia del método de Booch

DSN_XP 1.0 reconoce la importancia de los modelos técnicos utilizados en las metodologías que dieron origen a UML. Se opone a dos extremos: la anarquía (falta de un ciclo de vida definido) y la dictadura (exceso de rigidez que sofoca la creatividad).

DSN_XP 1.0 promueve un proceso iterativo e incremental, donde se refina la arquitectura orientada a objetos a través de iteraciones sucesivas, incorporando la experiencia de cada iteración. Este enfoque permite converger hacia una solución que cumpla con los requisitos del usuario, siendo a la vez simple, confiable y adaptable.

DSN_XP y las triadas o la Ley del 3

Triadas

Tres dimensiones en una

DSN_XP inicialmente como metodología (estudio del método) profundizó el método científico como la herramienta necesaria para poder sostener todos los argumentos requeridos para la concepción filosófica de nuestro marco de trabajo, en especial en la versión 1.0

Creatividad y el pensar

Cuando empezamos a investigar sobre los factores de la creatividad que existían en los diseños codificados de los programadores, pudimos observar la presencia de lo que denominamos como estructuras mentales de pensamiento conocidas como systematics o el estudio de las dimensiones del pensamiento para DSN_XP.

Al buscar los componentes filosóficos que sintetizan el procedimiento de utilizar un lenguaje de programación para estructurar ideas abstractas y con ello poder captar un escenario y luego procesarlo mediante la relación software/hardware, exigía la presencia de nuevas herramientas para la comprensión del fenómeno ya que implicaba por defecto, el estudio de la mente y el proceso cognitivo más un conjunto de marcos de trabajos relacionados con algoritmos, modelizados, estructuras de control, dependencia de fenómenos no conocidos previamente, etc.

El software como artesanía o receta

Un primer acercamiento al modelo científico fue desplegado gracias a las investigaciones del grupo KYBELE, este hecho nos puso de frente a la necesidad de buscar raíces más profundas en la filosofía para comprender justamente los principios del método de razonamiento y la experimentación, dos momentos dentro del proceso de la creatividad del programador y el denominado modelo básico de programación que nos fuera enseñado en las aulas y que se trataba del modelo codificar y corregir.

Al entrar de lleno entonces en el mundo de la filosofía, entendíamos que definir un marco de trabajo para desarrollar software se volvía un tema más complejo que la definición de un modelo del ciclo de vida del desarrollo de software, esto es así porque desde los inicios de la ingeniería del software, los artefactos de diseño fueron tomados prestados desde otras ciencias y adaptados en conjunto con otras tecnologías.

La raíz del mirar DSN_XP

Teníamos como DSN_XP el objetivo el determinar la eficiencia de la experimentación, como uno de los procesos naturales que sostienen la creatividad y el diseño básico soportado por nuestro modelo, esto nos ponía como método de desarrollo de software, entre las escuelas de diseño más criticadas en la década de transición hacia el 2000, ya que se exigía de la industria del software la predictibilidad del software que fue demostrada en su proceso de inserción gracias a la revolución tecnológica y las supercomputadoras para el cálculo estadístico.
La experimentación, como método intuitivo y personalizado del programador era el resultado de todo un proceso de transformación y avance de la tecnología electrónica aplicada al procesamiento de datos, este proceso de diseño se puede comprender cuando se profundiza en el estudio del software como tecnología y no como ciencia, nuevamente, esta observación ya fue estudiada por KYBELE, pero no resuelve el proceso de aprendizaje basado en el error que implica el modelo de codificar y corregir que se vuelve experimental para el programador.
Esta observación de separar la parte blanda del diseño del software de su parte dura por implementación, implica dentro del estudio filosófico del diseño del software a aquellos conceptos de diseño como la ocultación de información y el encapsulado, fenómenos que la ciencia y sus métodos no soportan por concepto de la presencia del cambio en el modelo (falsación) que pondría en evidencia la robustez de la teoría producto resultante del método científico.
Dada esta restricción en nuestro proceso de investigación del software, recurrimos a la lógica dialéctica para el estudio del diseño de software, en especial, del proceso de impacto en el diseño debido al cambio como producto de un aprendizaje en el proceso de abstracción del problema y su solución. 

Más allá de una dualidad

DSN_XP estudia a las triadas como una estructura mental que permite el proceso de abstracción de forma diferente al proceso dual; el ser humano constantemente recurre a la dualidad para abarcar un concepto o evento, esto es así ya que pensamos en extremos para cuantificar diferencias como medio de abstracción, ejemplo: bueno y malo, día y noche, arriba y abajo, si y no, etc., 

En cualquier cosmología o sistema total, existe una diada básica de lo Absoluto y lo Relativo, donde hay manifestación, lo relativo es triple. Por lo tanto, siempre podemos hablar de cuatro mundos o de tres mundos inmanentes en un mundo.  En la tradición hindú esto está de acuerdo con la doctrina Samkhya de las tres gunas, En cosmología de Bennett, las tres gunas corresponden a función, ser y voluntad.

Sólo existen pocos modelos en los cuales de forma natural se recurren a tres (3) dimensiones en una, por ejemplo: largo, ancho y profundidad, ayer, hoy y mañana y sólido, líquido y gaseoso como los únicos ejemplos de triadas, lejos de este punto se concluye que la mayor parte de abstracciones son de tipo dual o basadas en imágenes, fotografías o registros que no pueden incluir la tercera dimensión porque no es visible para este razonamiento 

El estudio de las estructuras mentales del pensamiento como elemento fundamental para el uso de [Perspectivas] dentro del #TEAMVIEW.

Las triadas permiten obtener el pensamiento inverso que se requiere para modelar algo, en la Ingeniería Software existen varios artefactos basados en la noción de triadas, esta sección justamente se dedica a identificar y analizar dichos artefactos con el pensamiento basado en triadas :o)

El sistema basado en triadas relaciona la acción, la relación misma y el escenario de vida en el que se manifiesta, la orientación a objetos contempla también este aspecto al abstraer un acción como el resultado de un procesamiento de acuerdo a un evento en particular, es por esta razón que preferimos al esoterismo sobre el método tradicional en la investigación científica para el diseño del software, ya que es en base al esoterismo que nos es más transparente explicar los conceptos de la orientación a objetos de forma académica, esto es DSN_XP.


El primer acercamiento formal antes del esoterismo que DSN_XP contactó fue una acercamiento sobre ingeniería de software en un foro de discusión, en el cual preguntábamos sobre una nueva forma de aplicar un método basado en triadas al estudio del software.


Descubrimos que la escuela de pensamiento que soportaba los argumentos de mi compañero de foro denominada Unicismo utiliza una muy interesante combinación sobre las triadas que se explicarán en otro post a futuro, también esto nos llevó a conocer las fuentes de la sabiduría ZEN y el Cuarto Camino :o) 

El unicismo aplica el concepto de triada para describir y comprender un sistema, ya que cualquier sistema está integrado por un propósito, una función activa y una función de conservación de energía para asegurar los resultados. 

Ejemplos triádicos aplicados al estudio ontogenético funcional o enfoque funcionalista:
  • La función activa y la función de conservación de energía de la inteligencia de un árbol impulsan su crecimiento y supervivencia. 
  • La elevación y propulsión hacen que los aviones despeguen y vuelen.
  • La música y la letra de una canción definen su estética.

La naturaleza del software y su triada de computo



La naturaleza del desarrollo de software y su triada de uso



El uso de las triadas en la gestión de proyectos de desarrollo de software


Existen tres fuerzas básicas detrás de un proyecto, cualquier alteración a una de estas fuerzas se propaga en las otras dos, la conjugación correcta de las mismas determina la calidad del producto final.

Cada fuerza es asociada a una variable de cálculo, el tiempo se convierte en cronograma, los recursos en costos y el alcance en funcionalidades, la resultante se mide en el éxito o fracaso del proyecto.

El equipo de desarrollo es responsable del alcance, el tiempo y los recursos son asignados al cliente, el proceso creativo del software tiene que ser transformado en retorno de inversión de acuerdo al esfuerzo aplicado a una funcionalidad específica.


Existen tres fuerzas básicas detrás del diseño de un producto, cualquier alteración a una de estas fuerzas se propaga en las otras dos, la conjugación correcta de las mismas determina la demanda del producto final.

Cada fuerza es asociada a una variable de cálculo, el producto se convierte en esfuerzo, el mercado en ingresos y las administración en costos, la resultante se mide en el éxito o fracaso del producto.

El equipo de desarrollo es responsable del producto, la administración y el mercado son asignados al cliente, el costo de fabricación del software tiene que ser transformado en la optimización de recursos de acuerdo al esfuerzo aplicado a una funcionalidad específica.


Existen tres fuerzas básicas detrás de un proyecto software, cualquier alteración a una de estas fuerzas se propaga en las otras dos, la conjugación correcta de las mismas determina el entorno de trabajo.

Cada fuerza es asociada a una perspectiva de interés en el éxito del proyecto, el software determina la usabilidad, el business determina el factor de oportunidad y el team determinan el compromiso de cada uno de los miembros del equipo multidisciplinar.

El adecuado proceso de estimación de esfuerzos tiene que ser equilibrado para evitar cansancio en el team (sobrecarga de trabajo) ya que un equipo cansado y no motivado repercute en el entorno de trabajo, en la calidad del producto y en la entrega a tiempo de las funcionalidades.


Existen tres fuerzas básicas detrás de un proyecto, cualquier alteración a una de estas fuerzas se propaga en las otras dos, la conjugación correcta de las mismas determina la usabilidad del producto final.

Cada fuerza es asociada a una fuente de información, el stakeholder provee las necesidades de requerimientos para la toma de decisiones, el usuario provee el conocimiento y el proceso que se desea abstraer, el desarrollador provee las mejoras al proceso y la simplicidad de la herramienta.

Es responsabilidad del equipo de desarrollo el comprender y balancear estos requerimientos en funcionalidades y servicios para el uso correcto del producto.


Existen tres fuerzas básicas detrás de un producto, cualquier alteración a una de estas fuerzas se propaga en las otras dos, la conjugación correcta de las mismas determina la calidad del producto final.

Cada fuerza es asociada a un factor de diseño, las historias de usuario capturan las necesidades del producto por parte de los usuarios (retorno de inversión), los criterios de aceptación capturan las necesidades del stakeholder principal (priorización) y las sentencias de trabajo definen sin ambigüedades las especificaciones del software (esfuerzo).

Es responsabilidad del equipo de desarrollo el verificar que cada historia posea los tres indicadores para una adecuada gestión del proyecto.

La triada de la permacultura

Tenemos el cuidado de la tierra, el cuidado de la gente y la repartición justa

La triada de la actitud

Tenemos el pienso, el quiero y el hago

La triada de la ética

Tenemos el crecer por mi, el crear por los demás y el cocrear por el mundo

La triada de la calidad

Procesos, entendiéndose como el conjunto de actividades en cierta secuencia que permiten alcanzar un objetivo, usualmente si el proceso no se encuentra bien definido o diseñado, estos aspectos tienen su impacto en la medición de la calidad del software.

Personas, es tal vez el elemento más complicado del desarrollo del software ya que son las personas las que interactúan con el producto software y determinan el conjunto de atribuciones externas que en conjunto definen la calidad del producto.

Producto, entendiéndose este como el objeto de análisis de los factores de la calidad de acuerdo a la injerencia de los otros dos elementos a todo el proceso de desarrollo de software.

La triada de los lenguajes en la solución de problemas

Este es un material que hemos tomado prestado de la base de conocimientos de LeanSight y hace referencia a las tres perspectivas que existen en el desarrollo de soluciones y casi de forma específica en el desarrollo de software.

La triada de la planificación ágil

Este es un material que hemos tomado prestado de Roman Picher respecto al Rol de Product Owner y que contempla la perspectiva táctica o el conjunto de actividades para concretar algo para luego contemplar la perspectiva estratégica de la situación y finalmente contemplar la perspectiva de una visión compartida para la organización.