DSN_XP y el proyecto BONO

Sistema de control y facturación de gas licuado 



BONO

Año: 2008
Localidad: Quito
Institución: Edwin Vargas Consultores

Descripción:

Uno de los problemas que tiene un alto impacto en la economía del Ecuador es el tema relacionado con el subsidio que se establece al consumo de gas licuado. Un problema adicional consistía en la forma en la cual se puede contar con datos mucho más certeros del nivel de consumo en Ecuador.

Edwin Vargas desarrolla un sistema que permite generar esa información detallada, gracias a la genialidad de sus ideas de sistematización y adaptación a tecnologías adicionales al software.

BONO es un proyecto para determinar la distribución de gas licuado por parte del Estado mediante el uso de dispositivos RFID para el control de la demanda territorial de consumo y la forma de cancelación mediante un bono popular de subsidio.

DSN_XP:

Se requiere el  modelado tanto a los aspectos de despliegue de la solución, así como una narración técnica de las posibles aplicaciones que pueden darse al considerar este proyecto en la magnitud de su implementación a nivel nacional.




Para lograr la abstracción del proyecto, se recurre a las perspectivas técnicas de diseño propuestas por el modelo arquitectónico de  Kruchten y su estándar UML.

La característica especial de poder implementar componentes lógicos de control como los dispositivos remotos y los protocolos de comunicación fueron posibles por las nociones de interfaz y de nodos de procesamiento y control.

Una vez más que DSN_XP y sus artefactos de diseño estaban en la capacidad de abstraer hasta este momento cualquier tipo de proceso, procedimiento, actividad, tarea, etc.

DSN_XP y su framework

DSN_XP Framework

Estructura conceptual del framework DSN_XP
DSN_XP fue inicialmente conceptuado como método de investigación, luego se amplió su cobertura de aplicación a un conjunto de: herramientas, buenas prácticas, artefactos y modelos que fueron tomados de nuestra investigación sobre metodologías de desarrollo de software, hasta considerarnos como una metodología de análisis y diseño (postergando la implementación y su desarrollo a proyectos experimentados con terceros).

Base de conocimientos

"Un framework es un diseño abstracto para una clase de aplicación en particular y usualmente consiste de un número de clases, las cuales puedes ser tomadas desde una librería de clases o pueden ser específicas de la aplicación." R. Johnson, B. Foote.

Conocimientos base de DSN_XP

Al respecto, el método se enfoca en el ¿Cómo? mientras que el marco de trabajo se enfoca en resolver una necesidad específica de uso mediante los componentes del framework. 

Componentes del framework

Al mirar que podíamos extender el uso de DSN_XP como método a otros contextos fuera del desarrollo de software, tuvimos la visión de emplear registros para analizar la eficacia del método y de sus componentes, ya sean estos propios o prestados de otros métodos, marcos de trabajo, buenas prácticas, etc. 

  • "Un framework ayuda a los desarrolladores a proveer soluciones a problemas de un dominio y mejorar el mantenimiento para dichas soluciones. 
  • Un framework provee una infraestructura bien diseñada y pensada que cuando se crean nuevas piezas, las mismas pueden ser sustituidas con un impacto mínimo en las otras piezas del framework." C. Nelson

Para poder adaptar otros artefactos, dentro del conjunto de herramientas de análisis y diseño requeridas por DSN_XP, realizamos de forma intuitiva (y reutilizable si fuese posible el contexto), comparaciones buscando un uso común, las metas las propiedades y la estructura que debe cumplir un marco de trabajo para ser considerado como tal. 

"Un framework es un diseño reutilizable para un sistema de software o subsistema, esto se expresa como el conjunto de clases abstractas y la forma en que sus casos colaboran para un tipo específico de software"  Gamma, E et al

 Experimentación

Para poder comprender la estructura de un marco de trabajo, analizamos otro marco de trabajo y debido al proyecto que participamos codirigiendo, fue posible aplicar SCRUM y con ello, comenzar a entender los aspectos que teníamos que reforzar para crear la versión 3.0 como marco de trabajo DSN_XP para contextos que soporten los principios LEAN y Agile.

Inverse Refactoring

DSN_XP 3.0 REFACTORING

Mejora continua de DSN_XP

Kernel(3.0).Método.Drill()
Toda metodología contiene en principio una filosofía de diseño, DSN_XP desde su versión 0.1 ha trabajado con la ingeniería inversa como driver para el diseño de su marco de trabajo documental.

El kernel que estamos desarmando en estos momentos contiene en su interior los artefactos necesarios para comprender a otros métodos y replicarlos mediante experimentación para descubrir las capacidades del artefacto investigado.

Kernel(3.0).Método.Drill()

DSN_XP y Twitter

Twitter como canal de expresión de ideas


Agradecemos (mientras realizamos una investigación) a Twitter por permitirnos un medio en el cual podemos expresar nuestras ideas, inferencias, conclusiones, etc.

Muchos de nuestros seguidores [@DSN_XP] en twitter nos recomendaron que hagamos un blog en el cual podamos plasmar toda aquella información que habíamos manifestado mediante nuestros tweets para seguirnos adecuadamente en nuestras investigaciones.

Les manifestamos entonces que utilicen una lista o filtren nuestros mensajes por #DSN_XP para un adecuado seguimiento, pese a esta indicación, insistieron en la idea de un blog.

Una vez creado el blog, comprendemos que tenían mucha razón en su demanda y por ello dedicamos este post para agradecer su gentileza y adoptar esta mejora en el manejo del contenido acerca de DSN_XP.

Informamos también a nuestros seguidores y usuarios, que pese a que existe este blog, seguimos requiriendo los servicios de un micro blog como Twitter, pues necesitamos expresar nuestras ideas durante una investigación para registro público y propiedad intelectual de su contenido :o)

ARQUITECTURA DSN_XP

DSN_XP y el tablero de ideas

DSN_XP.Tablero



Necesitábamos un tablero de ideas para organizar formalmente los lineamientos propuestos por DSN_XP como escuela de pensamiento sobre el diseño de software en Ecuador.

Decidimos aplicar DSN_XP para hacer ingeniería inversa a DSN_XP como metodología de investigación científica del software.

La idea de crear un tablero como blog fue posible gracias a las sugerencias de varias personas que desean seguir nuestras ideas ya sea por curiosidad, porque les parece interesante, porque necesitan referencias, etc.

Tablero

  • Este blog está escrito en español porque toda la información técnica acerca del software usualmente suele estar escrita en inglés y es necesario para América Latina propagar el conocimiento en español :o)
  • Este blog está dedicado a publicar nuestras investigaciones (desde el año 2003) sobre la ingeniería de software y recopila todos aquellos comentarios teóricos que hemos publicado en varios sitios de la Internet, esperamos que nuestras investigaciones sean de apoyo para nuestros lectores y usuarios.

DSN_XP


  • DSN_XP es un marco de trabajo que originalmente fue creado para aplicar ingeniería inversa al diseño y desarrollo de software (esto es ingeniería de software)
  • Como el software se ha convertido en una herramienta fundamental para los negocios, por extensión también probamos que DSN_XP puede aplicarse para la ingeniería inversa al mundo de los negocios
  • Una vez que aplicamos DSN_XP tanto al diseño de software como al diseño de procesos del negocio, pudimos aplicar DSN_XP al estudio del comportamiento humano y el proceso del pensamiento en base al diseño de modelos (a esto lo denominamos como perspectivas)
DSN_XP como metodología (estudio del método) tiene la capacidad de adoptar cualquier artefacto definido en otros métodos y recomendar su aplicación en cierto contexto de uso. DSN_XP utiliza un marco de trabajo basado en los principios propuestos por el manifiesto ágil.

DSN_XP es un producto Ecuatoriano y por lo tanto en espíritu es libre por lo cual recomendamos su utilización para consultas o soporte teórico en la ingeniería de software.

DSN_XP y Fail Fast de Chile Ágil

Fail Fast y Chile Ágil

Estimados Chile Ágil (@ChileAgil) agradecemos la oportunidad que nos dieron de poder expresar nuestras ideas como DSN_XP en el portal FAIL FAST de su dominio.


Agradecemos a Agustín Villena por la confianza depositada en DSN_XP y ponemos a su disposición este blog para transmitir las ideas expresadas por Chile Ágil sobre el movimiento ágil en Chile.

Nuestra intención es también formar la comunidad ágil en Ecuador por lo que estaremos modificando este post con los avances hacia este objetivo.



DSN_XP y las redes sociales

Nuestras redes sociales



Nota: desde el 11 de abril del 2021 cerramos nuestros canales oficiales tanto en facebook como en twitter por temas internos relacionados con el uso de nuestro datos y la manipulación del algoritmo base de estos dos canales.

Queremos dejar constancia de aquellas personas que nos aconsejaron utilizar herramientas sociales para la difusión de nuestras ideas :o)

Twitter: @jlsandovaln @byriton @edwinvargaslara, @runakawsai, @jorgegamba, @agustinvillena
Facebook: Centro el Pungu

DSN_XP está en constante evolución y aprendizaje, paradójicamente, este comportamiento también lo sufren los codificadores mientras adquieren experiencia en el desarrollo de software, esta observación nos permitió poder realizar ingeniería inversa de las redes sociales.

Para comprender las redes sociales debemos por principio desarmar su contexto de uso y de allí la necesidad de forzar el modelo para identificar los límites de la abstracción, es por esta causa, que la forma en la cual nosotros utilizamos tanto Facebook como Twitter rompen los esquemas o estereotipos comúnmente aceptados para estas redes sociales.

DSN_XP había publicado cientos de conceptos en la Internet pero no tenía la gobernanza de su contenido, la idea de aceptar el reto y experimentar con las redes sociales (en estos momentos con herramientas para un blog) nos ha permitido captar en nuestros registros una cultura alrededor de este fenómeno denominado "Redes sociales".

Por lo tanto el contenido de este post u otros se irá modificando mientras más afinado se encuentre el modelo de la idea que deseamos transmitir para una mejor comprensión sobre DSN_XP.

DSN_XP y la mindset comunitario

El estudio de la comunidad 

DSN_XP estudia dentro de su perspectiva TEAM VIEW, todos aquellos aspectos relacionados con el ser humano y su proceso formativo y colaborativo.

Mindset

Este es uno de los tantos términos que tenemos que abarcar para poder igualar lenguaje con terceros que generan contenido que es utilizado por la comunidad para discutir ideas.  Dentro de nuestros estudios, habíamos tenido acercamientos con el concepto de "Cosmovisión" siendo esta la palabra que describía la forma de contemplar al mundo desde un rol de observador.

Para contextos LLM, la definición de Mindset es:

El mindset se refiere a la mentalidad fija o de crecimiento que influye en cómo las personas abordan los desafíos, el fracaso y el éxito. No es solo una creencia sobre uno mismo, sino una forma de ver el mundo.

La psicóloga estadounidense Carol S. Dweck acuñó y popularizó el término "mindset" en su libro de 2006, "Mindset: The New Psychology of Success" . Dweck, una de las principales investigadoras mundiales en los campos de la personalidad, la psicología social y del desarrollo, ha dedicado su carrera a estudiar por qué algunas personas prosperan frente a los reveses y otras se desmoronan. Su trabajo en la Universidad de Stanford sentó las bases para la comprensión de que la mentalidad no es una cualidad innata, sino algo que se puede cultivar.

Ahora bien, todos los aspectos relacionados con el uso del lenguaje para el entendimiento del ser humano tanto como individuo como colectivo, nos motivaron a estudiar estos aspectos desde varias áreas del conocimiento como la filosofía, la psicología, la política y el desarrollo social, por lo que tuvimos que adaptar un nuevo componente de estudio al marco de trabajo DSN_XP 

Comunidad

Cuando comenzamos a experimentar con la metodología propuesta por XP o Programación Extrema, la parte que nos llamó mucho la atención fue la necesidad implícita de una disciplina interna mental para la mejora continua del programador y su colectivo asociado o equipo de desarrollo, si deseabas que la palabra extremo sea apropiada para definir al más apto para la codificación de la solución buscada.

DSN_XP y los Casos de uso

 Advanced Use Cases

DSN_XP y el modelado avanzado de casos de uso
DSN_XP desde su versión 1.0 adoptó para efectos de modelado avanzado, el uso de UML como guía para la generación de documentos basados en el pensamiento visual y la necesidad de un modelo que represente los límites del proceso de abstracción.

Use Case

De todos los artefactos que hemos estudiado al desarmar las diversas escuelas de modelado de soluciones software y la historia del software, nos sentimos inmediatamente identificados con el modelo de casos uso, luego entenderíamos que esta naturalidad de nuestro confort en el uso de los casos de uso, se debía a nuestro razonamiento descendente proveniente de la programación estructurada e incluso de la programación orientada a la sintaxis y formatos con Fortran y Cobol, pasando por la programación dirigida por las etiquetas y/o subrutinas.

Cuando encontramos los casos de uso, notamos que consideraban dos dimensiones que más tarde darían forma a las perspectivas Software View y Business View, justamente por el uso de la palabra CASE que nos permitía encapsular observaciones en abstracciones delimitadas por la usabilidad que representaba el escenario observado y el conjunto de casos de control o comportamiento que se encapsulaban en esa observación. 


¿Qué es un modelo de caso de uso?

Estudio realizado en base a este artículo que hacemos referencia por la importancia del modelo de casos de uso dentro de los requisitos de software. Comprender los fundamentos de los modelos de casos de uso y poder crear su propio modelo de casos de uso, como comprender ¿Qué es una especificación de casos de uso?, e intentar aplicar casos de uso y el modelado avanzado con los modelos de casos de uso.

Definición

El modelo de caso de uso se utiliza para definir los elementos y procesos centrales que componen un sistema. Los elementos clave se denominan "actores" y los procesos se denominan "casos de uso". El modelo de casos de uso muestra qué actores interactúan con cada caso de uso. Esta definición establece de qué se compone principalmente un modelo de casos de uso: actores y casos de uso.

Un modelo de caso de uso debe capturar los componentes funcionales del sistema. Realza los procesos comerciales dentro del sistema. Mientras recorre su sistema, aprenderá importantes atributos del sistema que captura en el modelo de caso de uso. Debido a que los modelos de casos de uso son simples por naturaleza, están libres de jerga técnica, los modelos de casos de uso son una excelente manera de generar flujos de guiones gráficos con los usuarios. 

Los modelos de casos de uso tienen otra función fundamental. Los modelos de casos de uso definen los requisitos del sistema que se modela y ayudan a redactar los escenarios que se utilizarán posteriormente en las pruebas.

¿Qué es un modelo de caso de uso de UML (modelo de caso de uso) y cuándo debería utilizarlo?

Los modelos de casos de uso de UML se pueden utilizar para describir la funcionalidad de un sistema de forma horizontal. Es decir, en lugar de simplemente representar los detalles de las características individuales de su sistema, los modelos de casos de uso se pueden utilizar para mostrar toda su funcionalidad disponible. Sin embargo, es importante tener en cuenta que los modelos de casos de uso son fundamentalmente diferentes de los diagramas de secuencia o diagramas de flujo porque no intentan representar el orden o el número de veces que las acciones y subacciones del sistema deben ejecutarse. Hay varios ejemplos gráficos en estas preguntas frecuentes; es posible que desee examinarlos para familiarizarse con su aspecto.

Los modelos de casos de uso tienen solo 4 elementos principales: 
  1. los actores con los que interactúa el sistema que está describiendo, 
  2. el sistema en sí, 
  3. los casos de uso o servicios que el sistema sabe cómo realizar y 
  4. las líneas que representan las relaciones entre estos elementos.
Debe utilizar modelos de casos de uso para representar la funcionalidad de su sistema desde una perspectiva de arriba hacia abajo (es decir, de un vistazo, la funcionalidad del sistema es obvia, pero todas las descripciones están en un nivel muy alto. Más adelante se pueden agregar más detalles a la diagrama para dilucidar puntos interesantes en el comportamiento del sistema).

Ejemplo: Un modelo de caso de uso se adapta bien a la tarea de describir todas las cosas que se pueden hacer con un sistema de base de datos, por todas las personas que podrían usarlo (administradores, desarrolladores, personal de entrada de datos).

NO debe utilizar modelos de casos de uso para representar un comportamiento de excepción (cuando ocurren errores) o para intentar ilustrar la secuencia de pasos que se deben realizar para completar una tarea. Utilice diagramas de secuencia para mostrar estas características de diseño. 

Ejemplo: Un modelo de caso de uso no sería adecuado para describir el protocolo de red TCP / IP, porque hay muchos casos de excepción, comportamientos de ramificación y funcionalidad condicional (¿Qué sucede cuando un paquete se pierde o se retrasa, qué pasa cuando la conexión se interrumpe? )

¿Cuáles son los componentes de un modelo de caso de uso?

Los componentes clave del modelo de casos de uso son los propios actores, los casos de uso vinculados a los actores, los límites donde se ubican los casos de uso y las asociaciones entre los componentes anteriores. 

Al revisar el material a continuación y leer el ejemplo a continuación, debería poder obtener una buena comprensión para construir su propio modelo de caso de uso.

¿Cómo saber quiénes son los actores en un modelo de caso de uso?

Cuando se trabaja desde una tabla Acción / Respuesta, identificar los actores es fácil: las entidades cuyo comportamiento aparece en la columna “Acciones del actor” son los actores y las entidades cuyo comportamiento aparece en la columna “Respuesta del sistema” son componentes del sistema.
Si está trabajando desde una narrativa informal, un diagrama de secuencia o una descripción de escenario, los actores suelen ser aquellas entidades cuyo comportamiento no puede controlar o cambiar (es decir, agentes que no son parte del sistema que está construyendo o describiendo). los candidatos más obvios para los actores son los humanos en el sistema; excepto en casos raros cuando el sistema que está describiendo es en realidad un proceso humano (como un método específico para tratar con los clientes que los empleados deben seguir), los humanos con los que debe interactuar serán todos actores. 

Si su sistema interactúa con otros sistemas (bases de datos, servidores mantenidos por otras personas, sistemas heredados), será mejor que los trate también como actores, ya que no es su comportamiento lo que está interesado en describir.

Ejemplo: al agregar un nuevo sistema de base de datos para administrar las finanzas de una empresa, su sistema probablemente tendrá que interactuar con su software de administración de inventario existente. Dado que usted no escribió este software, no tiene la intención de reemplazarlo y solo usa los servicios que proporciona, tiene sentido que ese sistema sea un actor.

¿Cómo sabe qué poner en el cuadro "Sistema" del modelo de caso de uso?

El cuadro del sistema solo aparece en el diagrama de nivel superior (recuerde que una descripción típica de caso de uso de UML estará compuesta por muchos diagramas y sub-diagramas) y debe contener óvalos de casos de uso, uno para cada servicio de nivel superior que proporciona su sistema. a sus actores. 

Cualquier tipo de comportamiento interno que pueda tener su sistema y que solo sea utilizado por otras partes del sistema no debería aparecer en el cuadro del sistema. Una forma útil de pensar en estos servicios de nivel superior es la siguiente: si un caso de uso representa un servicio de nivel superior, entonces debería tener sentido que los actores que interactúan con él soliciten solo ese servicio de su sistema en una sola sesión. (en cualquier sentido, una "sesión" es inteligible en su sistema).

Ejemplo: en el siguiente diagrama, nos gustaría representar los casos de uso de una cámara. 

Supongamos que elegimos "Abrir obturador", "Flash" y "Cerrar obturador" como los casos de uso de nivel superior. Ciertamente, todos estos son comportamientos que tiene una cámara, pero ningún fotógrafo tomaría su cámara, abriría el obturador y luego la dejaría, satisfecho con su sesión fotográfica del día. Lo fundamental que hay que tener en cuenta es que estos comportamientos no se realizan de forma aislada, sino que son parte de un caso de uso de más alto nivel, "Tomar una foto". (Tenga en cuenta que tiene sentido que un fotógrafo "tome una foto" solo una vez durante una sesión con su cámara).

Los actores de mi modelo de casos de uso tienen interacciones. ¿Cómo los represento?

Si hay interacciones entre los actores de su sistema, no puede representar esas interacciones en el mismo diagrama que su sistema. Lo que puede hacer en su lugar es dibujar un modelo de caso de uso separado, tratando a uno de los actores en sí mismo como un sistema y ​​su sistema original (junto con los otros actores) como actores en este nuevo diagrama.

Ejemplo: suponga que desea diagramar las interacciones entre un usuario, un navegador web y el servidor con el que contacta. Dado que solo puede tener un sistema en el diagrama, debe elegir uno de los "sistemas" obvios, como el servidor. 
Es posible que luego se sienta tentado a trazar líneas de interacción entre los actores, pero esto es un problema porque no está claro qué significa la interacción, por lo que no es útil mostrarlo aquí. Una solución más útil sería dibujar dos diagramas que muestren todas las interacciones, como se muestra a continuación.

¿Los modelos de casos de uso muestran secuencias o procedimientos? 

Usando un modelo de caso de uso de UML, no puede. 
Los modelos de casos de uso están pensados ​​para ser una descripción horizontal de arriba hacia abajo de la funcionalidad, no una descripción detallada del comportamiento. En su mayor parte, no es una buena idea intentar representar secuencias de acciones con modelos de casos de uso. En su lugar, debería utilizar un diagrama de secuencia o un diagrama de flujo tradicional. (Es posible representar condiciones de ramificación simples con un modelo de caso de uso, como se describe a continuación, pero debe usar esta técnica con moderación porque puede hacer que un diagrama sea ilegible).

¿En qué se diferencia un modelo de caso de uso de UML de un diagrama de flujo tradicional?

Como se mencionó anteriormente, los modelos de casos de uso representan la funcionalidad de arriba hacia abajo, mientras que los diagramas de flujo representan el comportamiento de una manera lineal basada en el tiempo. Además, la forma en que los desarrolla es completamente diferente.

Ejemplo: (Este texto se refiere a los siguientes diagramas). 

Al construir un modelo de caso de uso, el paso inicial es identificar todo el comportamiento de nivel superior. Una vez que haya hecho esto (un proceso no muy complicado), ya ha descrito, al menos de una manera de alto nivel, todas las cosas que su sistema sabe hacer. 

Luego, puede continuar agregando detalles al descomponer sus casos de uso en más casos de uso que son utilizados por los casos de uso de nivel superior. Sin embargo, en cada etapa del desarrollo, su modelo de caso de uso es una descripción completa de la funcionalidad del sistema: puede carecer de detalles, pero no carecerá de elementos de conjunto de características. 

Y si se agrega o elimina funcionalidad o comportamiento durante la vida de su proyecto, el alcance del cambio que necesita hacer es proporcional tanto al alcance del cambio en el sistema como a la madurez de su modelo. Esto es útil porque significa que cuando su modelo es muy joven (solo se dibujan diagramas de alto nivel), realizar cambios radicales en el sistema no implica perder mucho trabajo. Sin embargo, un diagrama de flujo no describe correctamente el sistema hasta que haya terminado de dibujarlo, e incluso entonces, pequeños cambios en el sistema darán como resultado una reelaboración significativa de sus diagramas de flujo. En general, los modelos de casos de uso respaldan el proceso de análisis y diseño mucho mejor que los diagramas de flujo.

¿Cuándo debo usar la flecha de usos en un modelo de caso de uso?

La flecha de usos (o usa un límite como se llamaría en la teoría de grafos tradicional) se extrae de un caso de uso X a otro caso de uso Y para indicar que el proceso de hacer X siempre implica hacer Y al menos una vez (aunque puede implicar hacer muchas veces, "al menos una vez" es la única relación garantizada por este símbolo.) Este símbolo puede denominarse operador de agregación, porque indica que un caso de uso dado es un agregado (formado por partes) cuyos componentes son los casos de uso que utiliza. Si un caso de uso determinado usa varios otros, eso significa que todos los casos de uso de componentes deben completarse en el proceso de completar el caso de uso agregado, aunque no hay una especificación en los Modelos de casos de uso del orden en que se completan. Una breve,

Ejemplo: suponga que desea agregar detalles al diagrama que se muestra a continuación, que representa el sistema de reserva de una aerolínea. Primero, crearía un diagrama separado para los servicios de nivel superior y luego agregaría nuevos casos de uso que conforman los de nivel superior. 

Hay un margen de usos de “Facturar pasajero” a “Pesar equipaje” y de “Facturar pasajero” a “Asignar asiento”; esto indica que para poder facturar un pasajero, se debe pesar el equipaje y asignar un asiento. De igual forma, el diagrama indica que para agregar una reserva al sistema se debe verificar el espacio disponible y se debe registrar la información del pasajero. Podrías imaginar desglosar estos casos de uso para mostrar más detalles.

¿Cuándo utilizo la flecha de extensión?

La flecha de extensión (o borde de extensión) se extrae de un caso de uso X a un caso de uso Y para indicar que el proceso X es un comportamiento de caso especial del mismo tipo que el proceso más general Y. Utilizaría esto en situaciones en las que el sistema tiene varios casos de uso (procesos) que tienen algunas subtareas en común, pero cada uno tiene algo diferente que hace que sea imposible agruparlos todos juntos en el mismo caso de uso.

Ejemplo: suponga que desea agregar detalles al diagrama que se muestra a continuación, que representa el sistema de reserva de una aerolínea. Específicamente, lo que le gustaría mostrar es que no todos los asientos a bordo del avión son exactamente iguales (algunos en las ventanas y otros en los pasillos) y, a veces, los pasajeros expresarán una preferencia por uno de estos tipos de asientos pero no por el otro. Pero, por supuesto, no se les puede dar su preferencia de inmediato, porque el asiento que desean podría no estar disponible. Por lo tanto, el proceso de asignación de un asiento junto a la ventana implica verificar la disponibilidad de asientos junto a la ventana, mientras que el proceso de asignación de un asiento en el pasillo implica verificar la disponibilidad de los asientos en el pasillo. Pero a pesar de que estos procesos son diferentes, son bastante similares en varias otras formas, por lo que no tiene sentido ignorar sus similitudes. Por suerte,

¿Cuál es la diferencia entre usos y extensiones?

Para el concepto de generalización, un caso de uso describe una variación de otro caso de uso, use un enlace de generalización. En el siguiente ejemplo, el límite de casos de uso excedido describe una situación en la que no se realiza el escenario habitual de compra en línea. Los casos de uso que generalizan otro caso de uso solo deben especificar un escenario alternativo, incluso excepcional, al caso de uso que se está generalizando. El objetivo general de los casos de uso debe ser el mismo.

Para el concepto de extensión, en algunos casos desea describir una variación en el comportamiento de una forma más controlada. En tales casos, puede definir puntos de extensión en el caso de uso extendido. En el siguiente ejemplo, se dice que la búsqueda por nombre extiende la búsqueda en el punto de extensión del nombre. El enlace de extensión está más controlado que el enlace de generalización, ya que la funcionalidad solo se puede agregar en los puntos de extensión.

Armado de su modelo de caso de uso

Al iniciar un modelo de caso de uso (o modelo de caso de uso), es muy importante mantenerlo simple. A menudo, es más fácil determinar primero los actores del sistema y luego eliminar los casos de uso que realizan. Sus modelos de casos de uso pueden ser tan simples o complejos como desee, sin embargo, los diagramas más simples y menos desordenados son más fáciles de entender y, a menudo, son más poderosos para capturar las tareas del sistema.

DSN_XP y el proyecto AMBAR

Sistema de ticketing AMBAR

Año: 2006
Localidad: Quito
Institución: Aerolíneas Galápagos
Autor: Edwin Vargas Lara



DSN_XP: 

Participó documentando técnicamente el sistema AMBAR para la generación de reservaciones, itinerarios, emisión de tickets y reporte de ventas, el sistema fue diseñado y desarrollado por Edwin Vargas Lara para la aerolínea privada más grande del Ecuador Aerogal.

La documentación técnica se generó mediante modelos UML bajo los principios del diseño orientado a objetos, lo que permitió abstraer los procesos involucrados en:
  • la generación de reservas (planificación de vuelos, asignación de flota, itinerarios, rutas, etc.)
  • manejo de puntos de venta (agencias IATA/no IATA, puntos propios incluido la Web, cuentas corporativas, distribuidores, etc.) 
  • manejo de reservaciones (reservaciones, cancelados, manejo de grupos, tiempos límite, etc.)
  • manejo de inventario de ticktes (distribución, descarga de inventarios, etc.)
  • manejo de itinerarios (cambios, cancelaciones y publicación de vuelos por rutas y frecuencias, etc.)
  • emisión de documentos de tráfico (tickets, PTAs, MPDs, revisiones, exchange, etc.)
  • manejo de formas de pago (contado, crédito, tarjeta, prepagos, aerobonos, reportes de ventas, estados de cuenta, etc.)
  • chequeo en aeropuertos (No show, Go show, cancelaciones por operaciones involuntarias, etc.
Todos estos procesos importantes al rededor de la generación de las reservas y la emisión de los boletos de venta para una aerolínea, fueron automatizados mediante el sistema AMBAR por lo que había que modelarlos bajo la perspectiva del negocio y transformarlos en modelos bajo la perspectiva del software y que definían la arquitectura del sistema AMBAR, comprobándose una vez más que DSN_XP y sus artefactos de diseño estaban en la capacidad de abstraer hasta este momento cualquier tipo de proceso, procedimiento, actividad, tarea, etc.


Para poder agrupar las diversas funcionalidades que participaban en un escenario funcional (usualmente asociado a un departamento o unidad administrativa de una aerolínea y conforme lo determinaba incluso las reglas IATA), recurrimos a la noción de paquete y su propiedad como contenedor para poder distribuir los casos de uso de la programación soportada por el sistema.


Muchas de las decisiones técnicas estaban destinadas a soportar la demanda de diseño de un sistema complejo como lo es el conjunto de procedimientos tanto en cielo como en tierra respecto a cómo debe administrarse la data para que luego de procedimientos de ajustes y registros contables, pueda determinarse un dominio de datos centralizados en cuanto fuese posible por Ambar y su estructura de datos.

Se utilizó un paradigma de diseño de Cliente / Servidor desplegado localmente (pero con cobertura nacional operativamente hablando gracias a la tecnología Web aplicada en su diseño).




Dada la complejidad operativa de una aerolínea, la navegabilidad del sistema contemplaba muchos estados compartidos por los objetos del negocio que debían ser registrados adecuadamente y luego adaptados a los ajustes operativos que sufren entidades como los boletos y su capacidad anual de vida operativa bajo principios IATA.

Para lograr controlar los cambios en la documentación técnica debido a los continuos cambios en los diversos escenarios de usabilidad, adoptamos los principios de OOHDM para lograr establecer una estrategia de control de los atributos de estado de los diversos objetos que coexisten en el proceso de comercialización de una aerolínea.

DSN_XP y nuestro Sherpa en agilidad

 SHERPA AGILISTA



DSN_XP entra en contacto con Agustín Villena cuando iniciamos nuestro viaje de experimentación de los métodos ágiles; como marco de trabajo, nuestro mirar siempre abarcó Ecuador, sin embargo, al comenzar a trabajar en entornos internacionales de foros y grupos de trabajo, siempre resaltó la imagen de un luchador del pensamiento sistémico latinoamericano, de un hacker cultural, siendo este detalle lo que nos impresionó de tan grata manera a nuestro mirar, que consideramos actualmente a Agustín Villena como una de las mentes que tiene influencia en las bases de conocimiento que utiliza DSN_XP.

Nuestra gratitud por su mirar y por considerarnos dignos de mirar junto a él la forma como impacta el marco agilista en el mundo entero y de forma especial en Latinoamérica siendo Chile su centro de acción.


La necesidad de investigar, de experimentar, de ordenar sistémicamente la información, de mirar profundo en los aspectos intelectuales de la sociedad, de la comunidad, del poder de transformación interno y el gesto humilde de acompañar a otros para que estos desarrollen su potencial máximo en la búsqueda de una meta común en beneficio de la humanidad lo convierten en el primer SHERPA que hemos conocido en nuestro caminar siguiendo los pasos de aquellos grandes hombres que se convierten en actores para DSN_XP.



DSN_XP y las enseñanzas de Craig Larman

UML Y PATRONES

Larman Craig

DSN_XP entra en contacto con la fuente de conocimientos de Craig Larman, mientras realizábamos nuestra investigación sobre el diseño orientado a objetos.

Larman también influyó en nuestro estudio sobre UML como lenguaje de modelado y con las primeras nociones respecto al uso de patrones de diseño.


En 1997, Larman fue el autor de Applying UML and Patterns: An Introduction to Object-Oriented Analysis & Design , un libro de texto muy popular que contribuyó a la posterior adopción generalizada del desarrollo orientado a objetos. 

En este libro nos permitió conocer sobre los principios GRASP de diseño orientado a objetos, contribuyendo a la codificación de los principios de diseño de software e impactando en el modelado y documentación técnica de los proyectos que participamos.

GRASP como escuela de diseño

General Responsibility Assignment Software Patterns
Cuando fuimos entrenados en la época de la programación estructurada, las estructuras de diseño utilizaban el patrón fundamental de fragmentar la complejidad en factores funcionales que puedan controlar el flujo de transformación de la DATA y el control de los eventos que determinan la dirección del flujo o algoritmo de resolución del problema.

Como DSN_XP encontramos que GRASP como escuela de diseño, hace referencia de forma exclusiva a todo el ciclo de desarrollo de software y académicamente nos fue de gran influencia en la forma en la cual versionamos DSN_XP y limitamos nuestra primera versión de forma exclusiva al análisis y diseño para postergar en las diferentes versiones las fases restantes del modelo de desarrollo de software.
  • Fase de planeación y de elaboración 
  • Fase de análisis
  • Fase de diseño
  • Fase de construcción
Este fenómeno por los años 1995 al 2000 exigían a los proyectos nacionales de desarrollo de software, el presentar una  documentación técnica acompañando a la solución final codificada y es en este contexto que mundialmente se presenta la crisis del software respecto a las guerras metodológicas que darían paso en la actualidad a las escuelas de diseño AGILE

DSN_XP y el genio de Edsger W. Dijkstra

 Humildemente programador



Uno de los actores fundamentales para el pensar filosófico de DSN_XP es Edsger W. Dijkstra de quien se transcribe uno de sus artículos para entendimiento de nuestro planteamiento.

Programador (Codificador)

Como resultado de una larga secuencia de coincidencias, entré oficialmente a la profesión de programador la primera mañana de primavera de 1952 y, por lo que he podido rastrear, fui el primer holandés en hacerlo en mi país. En retrospectiva, lo más sorprendente fue la lentitud con la que, al menos en mi parte del mundo, surgió la profesión de la programación, una lentitud que ahora es difícil de creer. Pero agradezco dos vívidos recuerdos de ese período que establecen esa lentitud más allá de toda duda.

Después de haber programado durante unos tres años, tuve una discusión con A. van Wijngaarden, que entonces era mi jefe en el Centro Matemático de Ámsterdam, una discusión por la que le estaré agradecido mientras viva. El punto era que se suponía que debía estudiar física teórica en la Universidad de Leiden simultáneamente y como encontraba las dos actividades cada vez más difíciles de combinar, tuve que tomar una decisión, o dejar de programar y convertirme en un verdadero y respetable teórico. físico, o llevar mi estudio de física a una finalización formal solamente, con un mínimo de esfuerzo, y llegar a ser ....., ¿sí qué? 

¿Un programador? ¿Pero era esa una profesión respetable? Porque después de todo ¿Qué era la programación? ¿Dónde estaba el sólido cuerpo de conocimientos que podría respaldarlo como una disciplina intelectualmente respetable? 

Recuerdo muy vívidamente cómo envidiaba a mis colegas de hardware, quienes, cuando se les preguntó sobre su competencia profesional, al menos pudieron señalar que sabían todo sobre válvulas de vacío, amplificadores y demás, mientras que yo sentí que, al enfrentarme a esa pregunta, yo se quedaría con las manos vacías. 

Lleno de recelo, llamé a la puerta de la oficina de van Wijngaarden, preguntándole si podía “hablar con él un momento”; cuando salí de su oficina varias horas después, era otra persona. Porque después de haber escuchado mis problemas con paciencia, estuvo de acuerdo en que hasta ese momento no había mucha disciplina de programación, pero luego pasó a explicar en voz baja que las computadoras automáticas llegaron para quedarse. que estábamos al principio y ¿no podría ser yo una de las personas llamadas a hacer de la programación una disciplina respetable en los próximos años? 

Este fue un punto de inflexión en mi vida y completé formalmente mis estudios de física tan rápido como pude. Una moraleja de la historia anterior es, por supuesto, que debemos tener mucho cuidado cuando damos consejos a los más jóvenes; ¡a veces lo siguen!

Otros dos años más tarde, en 1957, me casé y los ritos matrimoniales holandeses requieren que declares tu profesión y yo dije que yo era programador. Pero las autoridades municipales de la ciudad de Ámsterdam no lo aceptaron alegando que no existía tal profesión. Y, lo crea o no, ¡pero bajo el título "profesión" mi acto matrimonial muestra la ridícula entrada "físico teórico"!

Hasta aquí la lentitud con la que vi emerger la profesión de programador en mi propio país. Desde entonces he visto más del mundo y tengo la impresión general de que en otros países, aparte de un posible cambio de fechas, el patrón de crecimiento ha sido muy similar.

Estructuras programáticas

Permítanme intentar capturar la situación de aquellos tiempos con un poco más de detalle, con la esperanza de comprender mejor la situación actual. Mientras continuamos con nuestro análisis, veremos cuántos malentendidos comunes sobre la verdadera naturaleza de la tarea de programación se remontan a ese pasado ahora lejano.

Las primeras computadoras electrónicas automáticas eran todas máquinas únicas de una sola copia y todas se encontraban en un entorno con el emocionante sabor de un laboratorio experimental. Una vez que la visión de la computadora automática estuvo ahí, su realización fue un tremendo desafío para la tecnología electrónica disponible en ese momento y una cosa es cierta: no podemos negar el coraje de los grupos que decidieron intentar construir un equipo tan fantástico. 

En cuanto a piezas de equipo fantásticas, lo fueron: en retrospectiva, uno solo puede sorprenderse de que esas primeras máquinas funcionaran, al menos a veces. El problema abrumador era conseguir y mantener la máquina en funcionamiento. La preocupación por los aspectos físicos de la computación automática todavía se refleja en los nombres de las sociedades científicas más antiguas en el campo,

El codificador

¿Y el pobre programador? Bueno, a decir verdad: apenas se notó.

Por un lado, las primeras máquinas eran tan voluminosas que apenas se podían mover y, además, requerían un mantenimiento tan extenso que era bastante natural que el lugar donde la gente intentaba usar la máquina fuera el mismo laboratorio donde se había desarrollado la máquina.

En segundo lugar, su trabajo un tanto invisible carecía de glamour: se podía mostrar la máquina a los visitantes y eso era varios órdenes de magnitud más espectacular que algunas hojas de codificación. 

Pero lo más importante de todo, el propio programador tenía una visión muy modesta de su propio trabajo: su trabajo se derivaba de toda la importancia de la existencia de esa maravillosa máquina. Como se trataba de una máquina única, sabía muy bien que sus programas solo tenían un significado local y también, como era claramente obvio que esta máquina tendría una vida útil limitada, sabía que, muy poco de su trabajo tendría un valor duradero

Finalmente, existe otra circunstancia que influyó profundamente en la actitud del programador hacia su trabajo: por un lado, además de poco fiable, su máquina solía ser demasiado lenta y su memoria solía ser demasiado pequeña, es decir, se enfrentaba a una "rozadura de zapato", mientras que, por otro lado, su código de pedido generalmente algo extraño se adaptaría a las construcciones más inesperadas. 

Y en aquellos días, muchos programadores inteligentes obtenían una inmensa satisfacción intelectual de los astutos trucos con los que se las ingeniaba para meter lo imposible en las limitaciones de su equipo, sabía que muy poco de su trabajo tendría un valor duradero.

Escuelas de diseño

Dos opiniones sobre la programación datan de esos días. Las menciono ahora, volveré a ellas más tarde. Una opinión era que un programador realmente competente debería tener una mentalidad de rompecabezas y ser muy aficionado a los trucos inteligentes; la otra opinión fue que la programación no era más que optimizar la eficiencia del proceso computacional, en una dirección u otra.

Esta última opinión fue el resultado de la circunstancia frecuente de que, de hecho, el equipo disponible era un dolorosa remordedura de zapato y en aquellos días uno se encontraba a menudo con la ingenua expectativa de que, una vez que se dispusiera de máquinas más potentes, la programación ya no sería un problema, porque entonces la lucha por llevar la máquina al límite ya no sería necesaria y de eso se trataba la programación, ¿no? 

Pero en las décadas siguientes sucedió algo completamente diferente: se dispuso de máquinas más potentes, no solo en un orden de magnitud más potente, incluso varios órdenes de magnitud más potentes. Pero en lugar de encontrarnos en el estado de eterna felicidad de todos los problemas de programación resueltos, ¡nos encontramos hasta el cuello en la crisis del software! ¿Cómo?

Crisis del software debida al hardware

Hay una causa menor: en uno o dos aspectos, la maquinaria moderna es básicamente más difícil de manejar que la vieja. En primer lugar, tenemos las interrupciones de E / S, que ocurren en momentos impredecibles e irreproducibles; en comparación con la vieja máquina secuencial que pretendía ser un autómata completamente determinista, este ha sido un cambio dramático y las canas de muchos programadores de sistemas dan testimonio del hecho de que no debemos hablar a la ligera sobre los problemas lógicos creados por esa característica

En segundo lugar, tenemos máquinas equipadas con almacenes multinivel, que nos presentan problemas de estrategia de gestión que, a pesar de la extensa literatura sobre el tema, siguen siendo bastante esquivos. 

Hasta aquí la complicación añadida debido a los cambios estructurales de las máquinas reales.

Pero llamé a esto una causa menor; la causa principal es ... ¡que las máquinas se han vuelto varios órdenes de magnitud más poderosas! Para decirlo sin rodeos: mientras no habían máquinas, la programación no suponía ningún problema; cuando teníamos algunas computadoras débiles, la programación se convirtió en un problema leve y ahora tenemos computadoras gigantes, la programación se había convertido en un problema igualmente gigantesco

En este sentido la industria electrónica no ha resuelto un solo problema, solo los ha creado, ha creado el problema del uso de sus productos. Para decirlo de otra manera: a medida que el poder de las máquinas disponibles creció en un factor de más de mil, la ambición de la sociedad por aplicar estas máquinas creció en proporción y fue el pobre programador quien encontró su trabajo en este campo explosivo de tensión entre fines y medios

El aumento de potencia del hardware, junto con el aumento quizás aún más dramático de su confiabilidad, hicieron factibles soluciones con las que el programador no se había atrevido a soñar unos años antes. Y ahora, unos años después, él tuvo que soñar con ellas y, lo que es peor, ¡tuvo que transformar esos sueños en realidad! ¿Es de extrañar que nos encontremos en una crisis de software? No, ciertamente no, y como puede suponer, incluso se predijo con mucha anticipación; pero el problema con los profetas menores, por supuesto, es que sólo cinco años después se sabe realmente que tenían razón.

Luego, a mediados de los sesenta, sucedió algo terrible: aparecieron los ordenadores de la llamada tercera generación. La literatura oficial nos dice que su relación precio / rendimiento ha sido uno de los principales objetivos de diseño. Pero si toma como "rendimiento" el ciclo de trabajo de los diversos componentes de la máquina, poco le impedirá terminar con un diseño en el que la mayor parte de su objetivo de rendimiento se alcance mediante actividades internas de mantenimiento de dudosa necesidad. Y si su definición de precio es el precio a pagar por el hardware, poco le impedirá terminar con un diseño que es terriblemente difícil de programar: por ejemplo, el código de pedido puede ser tal que lo imponga, ya sea al programador o sobre el sistema, decisiones vinculantes tempranas que presentan conflictos que realmente no se pueden resolver.

Cuando se anunciaron estas máquinas y se conocieron sus especificaciones funcionales, algunos de nosotros debieron de ser bastante miserables; al menos yo lo estaba. Era razonable esperar que tales máquinas inundaran la comunidad informática y, por lo tanto, era aún más importante que su diseño fuera lo más sólido posible. 

Pero el diseño contenía defectos tan graves que sentí que de un solo golpe el progreso de la informática se había retrasado al menos diez años: fue entonces cuando tuve la semana más negra de toda mi vida profesional.

Diseño de hardware e impacto en software

Quizás lo más triste ahora es que, incluso después de todos esos años de experiencia frustrante, muchas personas creen honestamente que alguna ley de la naturaleza nos dice que las máquinas tienen que ser así. Silencian sus dudas al observar cuántas de estas máquinas se han vendido y de esa observación derivan la falsa sensación de seguridad de que, después de todo, el diseño no puede haber sido tan malo. Pero si se examina más de cerca, esa línea de defensa tiene la misma fuerza convincente que el argumento de que fumar cigarrillos debe ser saludable porque mucha gente lo hace.

Es en este sentido que lamento que no sea habitual que las revistas científicas del área de la informática publiquen reseñas de computadoras recién anunciadas de la misma manera que revisamos publicaciones científicas: revisar las máquinas sería al menos tan importante. 

Y aquí tengo una confesión que hacer: a principios de los años sesenta escribí una reseña de este tipo con la intención de presentarla al MCCA, pero a pesar de que los pocos compañeros a los que se envió el texto en busca de sus consejos, me urgieron todo para hacerlo, no me atrevía a hacerlo, temiendo que las dificultades para mí o para el consejo editorial fueran demasiado grandes. 

Esta represión fue un acto de cobardía de mi parte por el que me culpo cada vez más. Las dificultades que preveía eran consecuencia de la ausencia de criterios generalmente aceptados y aunque estaba convencido de la validez de los criterios que había elegido aplicar, temía que mi reseña fuera rechazada o descartada por “cuestión de gusto personal”. Sigo pensando que estas revisiones serían extremadamente útiles y anhelo verlas aparecer, ya que su apariencia aceptada sería un signo seguro de madurez de la comunidad informática.

Diseño de software programable

La razón por la que he prestado la atención anterior a la escena del hardware es porque tengo la sensación de que uno de los aspectos más importantes de cualquier herramienta informática es su influencia en los hábitos de pensamiento de quienes intentan utilizarla y porque tengo razones para creer que esa influencia es muchas veces más fuerte de lo que comúnmente se supone. Pasemos ahora nuestra atención a la escena del software.

Aquí la diversidad ha sido tan grande que debo limitarme a unos pocos escalones. Soy dolorosamente consciente de la arbitrariedad de mi elección y le ruego que no saque ninguna conclusión con respecto a mi apreciación de los muchos esfuerzos que quedarán sin mencionar.

Estructura modular en el software

Al principio existía el EDSAC en Cambridge, Inglaterra y creo que es bastante impresionante que desde el principio la noción de una biblioteca de subrutinas haya jugado un papel central en el diseño de esa máquina y en la forma en que debería usarse. Han pasado casi 25 años y la escena de la computación ha cambiado drásticamente, pero la noción de software básico sigue con nosotros y la noción de subrutina cerrada sigue siendo uno de los conceptos clave en la programación.

Deberíamos reconocer las subrutinas cerradas como uno de los mayores inventos de software; ha sobrevivido a tres generaciones de computadoras y sobrevivirá a algunas más, porque se encarga de la implementación de uno de nuestros patrones básicos de abstracción

Lamentablemente, su importancia se ha subestimado en el diseño de las computadoras de tercera generación, en el que el gran número de registros explícitamente nombrados de la unidad aritmética implica una gran sobrecarga en el mecanismo de subrutina. Pero incluso eso no acabó con el concepto de subrutina y solo podemos rezar para que la mutación no sea hereditaria.

El segundo desarrollo importante en la escena del software que me gustaría mencionar es el nacimiento de FORTRAN. En ese momento se trataba de un proyecto de gran temeridad y los responsables del mismo merecen nuestra gran admiración. Sería absolutamente injusto culparlos por deficiencias que solo se hicieron evidentes después de una década de uso extensivo: ¡los grupos con una anticipación exitosa de diez años son bastante raros! En retrospectiva, debemos calificar a FORTRAN como una técnica de codificación exitosa, pero con muy pocas ayudas efectivas para la concepción, ayudas que ahora se necesitan con tanta urgencia que ha llegado el momento de considerarlas obsoletas

Cuanto antes olvidemos que FORTRAN ha existido, mejor, porque como vehículo del pensamiento ya no es adecuado: desperdicia nuestra capacidad intelectual, es demasiado arriesgado y, por lo tanto, demasiado caro de usar. El trágico destino de FORTRAN ha sido su amplia aceptación, encadenando mentalmente a miles y miles de programadores a nuestros errores pasados. Rezo a diario para que más de mis compañeros programadores encuentren la manera de liberarse de la maldición de la compatibilidad.

El tercer proyecto que no me gustaría dejar sin mencionar es LISP, una empresa fascinante de una naturaleza completamente diferente. Con algunos principios muy básicos en su base, ha demostrado una estabilidad notable. Además de eso, LISP ha sido el portador de un número considerable de, en cierto sentido, nuestras aplicaciones informáticas más sofisticadas. LISP se ha descrito en broma como "la forma más inteligente de hacer un mal uso de una computadora". Creo que esa descripción es un gran cumplido porque transmite todo el sabor de la liberación: ha ayudado a algunos de nuestros congéneres más dotados a pensar en pensamientos que antes eran imposibles.

El cuarto proyecto a mencionar es ALGOL 60. Si bien hasta el día de hoy los programadores de FORTRAN todavía tienden a entender su lenguaje de programación en términos de la implementación específica con la que están trabajando —de ahí la prevalencia de volcados octales y hexadecimales—, mientras que la definición de LISP sigue siendo una mezcla curiosa de lo que significa el lenguaje y cómo funciona el mecanismo, el famoso Informe sobre el lenguaje algorítmico ALGOL 60 es el fruto de un esfuerzo genuino por llevar la abstracción un paso vital más allá y definir un lenguaje de programación en una implementación en forma independiente

Abstracción del lenguaje por su sintaxis

Se podría argumentar que a este respecto sus autores han tenido tanto éxito que han creado serias dudas sobre si podría implementarse en absoluto. El informe demostró gloriosamente el poder del método formal BNF, ahora bastante conocido como Backus-Naur-Form, y el poder del inglés cuidadosamente redactado, al menos cuando lo usa alguien tan brillante como Peter Naur. 

Creo que es justo decir que muy pocos documentos tan breves como este han tenido una influencia igualmente profunda en la comunidad informática. La facilidad con la que en años posteriores se han utilizado los nombres ALGOL y ALGOL-like, como marca comercial desprotegida, para prestar algo de su gloria a una serie de proyectos más jóvenes, a veces apenas relacionados, es un elogio algo sorprendente a su prestigio.

La fuerza de BNF como dispositivo de definición es responsable de lo que considero una de las debilidades del lenguaje: una sintaxis demasiado elaborada y no demasiado sistemática podría ahora apiñarse en los confines de muy pocas páginas. Con un dispositivo tan poderoso como BNF, el Informe sobre el lenguaje algorítmico ALGOL 60 debería haber sido mucho más breve. Además de eso, tengo muchas dudas sobre el mecanismo de parámetros de ALGOL 60: le permite al programador tanta libertad combinatoria, que su uso seguro requiere una fuerte disciplina por parte del programador. Además de caro de implementar, parece peligroso de usar.

Finalmente, aunque el tema no es agradable, debo mencionar PL / 1, un lenguaje de programación para el cual la documentación definitoria es de un tamaño y complejidad aterradora. Usar PL / 1 debe ser como volar un avión con 7000 botones, interruptores y manijas para manipular en la cabina. No veo absolutamente cómo podemos mantener nuestros programas en crecimiento firmemente dentro de nuestro control intelectual cuando, por su puro barroquismo, el lenguaje de programación —¡nuestra herramienta básica, claro! - ya escapa a nuestro control intelectual. Y si tengo que describir la influencia que PL / 1 puede tener en sus usuarios, la metáfora más cercana que me viene a la mente es la de una droga. 

Recuerdo de un simposio sobre lenguaje de programación de nivel superior una conferencia que dio en defensa de PL / 1 un hombre que se describió a sí mismo como uno de sus devotos usuarios. Pero dentro de una conferencia de una hora en alabanza de PL / 1. se las arregló para solicitar la adición de unas cincuenta nuevas "características", suponiendo poco que la principal fuente de sus problemas podría muy bien ser que ya contenía demasiadas "características". El hablante mostraba todos los deprimentes síntomas de la adicción, reducido como estaba al estado de estancamiento mental en el que solo podía pedir más, más, más ... Cuando se ha llamado a FORTRAN un trastorno infantil, PL / 1 completo, con sus características de crecimiento de un tumor peligroso, podrían convertirse en una enfermedad fatal.

Demasiado para el pasado. Pero no tiene sentido cometer errores a menos que a partir de entonces podamos aprender de ellos. De hecho, creo que hemos aprendido tanto, que dentro de unos años la programación puede ser una actividad muy diferente de lo que ha sido hasta ahora, tan diferente que es mejor que nos preparemos para el impacto

El futuro de la programación

Déjeme esbozarle uno de los futuros posibles. A primera vista, esta visión de la programación quizás ya en un futuro próximo puede parecerle absolutamente fantástica. Permítanme, por tanto, añadir también las consideraciones que podrían llevarnos a la conclusión de que esta visión podría ser una posibilidad muy real.

La visión es que, mucho antes de que la década de los setenta se complete, seremos capaces de diseñar e implementar el tipo de sistemas que ahora están agotando nuestra capacidad de programación, a expensas de solo un pequeño porcentaje en años-hombre de lo que cuestan. nosotros ahora y que además de eso, estos sistemas estarán prácticamente libres de errores

Estas dos mejoras van de la mano. En este último aspecto, el software parece ser diferente de muchos otros productos, donde, por regla general, una calidad superior implica un precio más elevado. Aquellos que quieran un software realmente confiable descubrirán que deben encontrar la manera de evitar la mayoría de los errores y, como resultado, el proceso de programación será más barato. Si desea programadores más efectivos, descubrirá que no deben perder el tiempo depurando, para empezar, no deben introducir los errores.

Un cambio tan drástico en tan poco tiempo sería una revolución y para todas las personas que basan sus expectativas de futuro en una suave extrapolación del pasado reciente, apelando a algunas leyes no escritas de inercia social y cultural, la posibilidad de que este se producirá un cambio drástico que debe parecer insignificante. ¡Pero todos sabemos que a veces se producen revoluciones! ¿Y cuáles son las posibilidades de este?

Parece haber tres condiciones principales que deben cumplirse. El mundo en general debe reconocer la necesidad del cambio; en segundo lugar, la necesidad económica debe ser suficientemente fuerte; y, en tercer lugar, el cambio debe ser técnicamente factible. Permítanme discutir estas tres condiciones en el orden anterior.

Con respecto al reconocimiento de la necesidad de una mayor confiabilidad del software, ya no espero ningún desacuerdo. Hace solo unos años esto era diferente: hablar de una crisis de software era una blasfemia. El punto de inflexión fue la Conferencia sobre Ingeniería de Software en Garmisch, octubre de 1968, una conferencia que causó sensación al producirse la primera admisión abierta de la crisis del software

Y a estas alturas se reconoce generalmente que el diseño de cualquier gran sistema sofisticado va a ser un trabajo muy difícil y cada vez que uno se encuentra con personas responsables de tales empresas, los encuentra muy preocupados por el tema de la confiabilidad y con razón. En resumen, nuestra primera condición parece cumplida.

Ahora por la necesidad económica. Hoy en día, a menudo se encuentra la opinión de que en los años sesenta la programación ha sido una profesión sobre pagada y que en los próximos años se espera que bajen los sueldos de los programadores. 

Por lo general, esta opinión se expresa en relación con la recesión, pero podría ser un síntoma de algo diferente y bastante saludable, a saber. que quizás los programadores de la última década no hayan hecho un trabajo tan bueno como deberían haberlo hecho

La sociedad está insatisfecha con el desempeño de los programadores y de sus productos. Pero hay otro factor de mucho mayor peso. En la situación actual es bastante habitual que para un sistema específico, el precio a pagar por el desarrollo del software sea del mismo orden de magnitud que el precio del hardware necesario y la sociedad más o menos lo acepta. 

Pero los fabricantes de hardware nos dicen que en la próxima década se puede esperar que los precios del hardware caigan en un factor de diez. 

Si el desarrollo de software continuara siendo el mismo proceso torpe y costoso que ahora, las cosas se desequilibrarían por completo. No se puede esperar que la sociedad acepte esto y, por lo tanto, nosotros debemos aprender a programar un orden de magnitud de manera más eficaz. Para decirlo de otra manera: mientras las máquinas sean el elemento más importante del presupuesto, la profesión de programación podría salirse con la suya con sus técnicas torpes, pero ese paraguas se doblará rápidamente. En resumen, también nuestra segunda condición parece cumplida.

Y ahora la tercera condición: ¿es técnicamente factible? Creo que podría y le daré seis argumentos en apoyo de esa opinión.
  • Un estudio de la estructura de los programas había revelado que los programas —incluso programas alternativos para la misma tarea y con el mismo contenido matemático— pueden diferir enormemente en su manejabilidad intelectual. 
  • Se han descubierto una serie de reglas, cuya violación dañará gravemente o destruirá totalmente la capacidad de gestión intelectual del programa. 
Estas reglas son de dos tipos. Los del primer tipo se imponen fácilmente de forma mecánica, a saber. mediante un lenguaje de programación adecuadamente elegido. Algunos ejemplos son la exclusión de sentencias goto y de procedimientos con más de un parámetro de salida. Para los del segundo tipo, al menos —pero eso puede deberse a una falta de competencia de mi parte— no veo forma de imponerlos mecánicamente, ya que parece necesitar algún tipo de demostrador automático de teoremas para el que no tengo pruebas de existencia. Por lo tanto, por el momento y quizás para siempre, las reglas del segundo tipo se presentan como elementos de disciplina requeridos por el programador

Algunas de las reglas que tengo en mente son tan claras que se pueden enseñar y que nunca es necesario discutir si un programa determinado las viola o no. Algunos ejemplos son los requisitos de que ningún bucle debe escribirse sin proporcionar una prueba de terminación o sin indicar la relación cuya invariancia no será destruida por la ejecución de la declaración repetible.

Sugiero ahora que nos limitemos al diseño e implementación de programas intelectualmente manejables. Si alguien teme que esta restricción sea tan severa que no podamos vivir con ella, puedo tranquilizarlo: la clase de programas intelectualmente manejables es todavía lo suficientemente rica como para contener muchos programas muy realistas para cualquier problema capaz de solución algorítmica

No hay que olvidar que no es nuestro negocio el hacer programas, nuestro negocio es diseñar clases de cálculos que se mostrarán con un comportamiento deseado. La sugerencia de limitarnos a programas intelectualmente manejables es la base de los dos primeros de mis seis argumentos anunciados.

El argumento uno es que, dado que el programador solo necesita considerar programas manejables intelectualmente, las alternativas entre las que está eligiendo son muchas, mucho más fáciles de afrontar.

El segundo argumento es que, tan pronto como hemos decidido restringirnos al subconjunto de los programas intelectualmente manejables, hemos logrado, de una vez por todas, una reducción drástica del espacio de soluciones a considerar. Y este argumento es distinto del argumento uno.

El tercer argumento se basa en el enfoque constructivo del problema de la corrección del programa. Hoy en día una técnica habitual es hacer un programa y luego probarlo. Pero: la prueba del programa puede ser una forma muy efectiva de mostrar la presencia de errores, pero es desesperadamente inadecuada para mostrar su ausencia. La única forma eficaz de elevar significativamente el nivel de confianza de un programa es dar una prueba convincente de su corrección

Pero no se debe hacer primero el programa y luego probar que es correcto, porque entonces el requisito de proporcionar la prueba solo aumentaría la carga del pobre programador. Al contrario: el programador debe dejar que la prueba de corrección y el programa crezcan de la mano. El argumento tres se basa esencialmente en la siguiente observación
Si uno se pregunta primero cuál sería la estructura de una prueba convincente y, habiendo encontrado esto, luego construye un programa que satisface los requisitos de esta prueba, entonces estas preocupaciones de corrección resultan ser una guía heurística muy efectiva. Por definición, este enfoque solo es aplicable cuando nos limitamos a programas intelectualmente manejables, pero nos proporciona medios efectivos para encontrar uno satisfactorio entre ellos.
El argumento cuatro tiene que ver con la forma en que la cantidad de esfuerzo intelectual necesario para diseñar un programa depende de la duración del programa. Se ha sugerido que existe algún tipo de ley de la naturaleza que nos dice que la cantidad de esfuerzo intelectual necesario aumenta con el cuadrado de la duración del programa. Pero, gracias a Dios, nadie ha podido probar esta ley. Y esto se debe a que no tiene por qué ser verdad. 
Todos sabemos que la única herramienta mental por medio de la cual un razonamiento muy finito puede cubrir una miríada de casos se llama "abstracción"; como resultado, la explotación efectiva de sus poderes de abstracción debe considerarse como una de las actividades más vitales de un programador competente. 
A este respecto, podría ser conveniente señalar que el propósito de abstraer no es para ser vago, pero para crear un nuevo nivel semántico en el que uno puede ser absolutamente preciso. Por supuesto, he tratado de encontrar una causa fundamental que impida que nuestros mecanismos de abstracción sean suficientemente efectivos. 

Pero no importa cuánto lo intenté, no encontré tal causa. Como resultado, tiendo a suponer —hasta ahora no refutado por la experiencia— de que mediante la aplicación adecuada de nuestros poderes de abstracción, el esfuerzo intelectual necesario para concebir o comprender un programa no necesita crecer más que proporcional a la longitud del programa

Pero un subproducto de estas investigaciones puede tener una importancia práctica mucho mayor y es, de hecho, la base de mi cuarto argumento. El subproducto fue la identificación de una serie de patrones de abstracción que juegan un papel vital en todo el proceso de composición de programas. Ahora se sabe lo suficiente sobre estos patrones de abstracción como para dedicarle una conferencia sobre cada uno de ellos. 

Lo que la familiaridad y el conocimiento consciente de estos patrones de abstracción implican se me ocurrió cuando me di cuenta de que, si hubieran sido de conocimiento común hace quince años, el paso de BNF a compiladores dirigidos por sintaxis, por ejemplo, podría haber tomado unos minutos en lugar de unos años. 

Por tanto, presento nuestro conocimiento reciente de los patrones de abstracción vitales como el cuarto argumento.

Ahora para el quinto argumento. Tiene que ver con la influencia de la herramienta que estamos tratando de usar sobre nuestros propios hábitos de pensamiento. Observo una tradición cultural, que con toda probabilidad tiene sus raíces en el renacimiento, para ignorar esta influencia, para considerar a la mente humana como el amo supremo y autónomo de sus artefactos. 

El mindset de la programación

Pero si empiezo a analizar los hábitos de pensamiento de mí mismo y de mis semejantes, llego, me guste o no, a una conclusión completamente diferente, a saber. que las herramientas que estamos tratando de usar y el lenguaje o la notación que estamos usando para expresar o registrar nuestros pensamientos, son los factores principales que determinan lo que podemos pensar o expresar

El análisis de la influencia que los lenguajes de programación tienen en los hábitos de pensamiento de sus usuarios y el reconocimiento de que, a estas alturas, la capacidad intelectual es, con mucho, nuestro recurso más escaso, juntos nos brindan una nueva colección de criterios para comparar los méritos relativos de varios lenguajes de programación. 
El programador competente es plenamente consciente del tamaño estrictamente limitado de su propio cráneo; por eso se acerca a la tarea de programar con total humildad y entre otras cosas evita trucos ingeniosos como la peste. 
En el caso de un conocido lenguaje de programación conversacional me han dicho desde varios lados que, en cuanto una comunidad de programación está equipada con un terminal para ello, ocurre un fenómeno específico que incluso tiene un nombre bien establecido: se llama “ las frases ingeniosas ”. 

Toma una de dos formas diferentes: un programador coloca un programa de una línea en el escritorio de otro y dice con orgullo lo que hace y agrega la pregunta "¿Puedes codificar esto con menos símbolos?" —¡Como si esto tuviera alguna relevancia conceptual! - o simplemente pregunta "¡Adivina qué hace!".
De esta observación debemos concluir que este lenguaje como herramienta es una invitación abierta a trucos ingeniosos; y aunque exactamente esta puede ser la explicación de parte de su atractivo, a saber. para aquellos a quienes les gusta mostrar lo inteligentes que son, lo siento, pero debo considerar esto como una de las cosas más condenatorias que se pueden decir sobre un lenguaje de programación. 
Otra lección que deberíamos haber aprendido del pasado reciente es que el desarrollo de lenguajes de programación "más ricos" o "más potentes" fue un error en el sentido de que estas monstruosidades barrocas, estos conglomerados de idiosincrasias, son realmente inmanejables, tanto mecánica como mentalmente. 

Veo un gran futuro para los lenguajes de programación muy sistemáticos y muy modestos. Cuando digo "modesto", me refiero a que, por ejemplo, no solo la "cláusula for" de ALGOL 60, pero incluso el "bucle DO" de FORTRAN puede resultar descartado por ser demasiado barroco. 

He realizado un pequeño experimento de programación con voluntarios muy experimentados, pero apareció algo bastante inesperado y no intencionado. 
Ninguno de mis voluntarios encontró la solución más obvia y elegante. Tras un análisis más detallado, esto resultó tener una fuente común: su noción de repetición estaba tan estrechamente conectada con la idea de una variable controlada asociada que debía intensificarse, que estaban mentalmente bloqueados para no ver lo obvio. Sus soluciones eran menos eficientes, innecesariamente difíciles de entender, y les llevó mucho tiempo encontrarlas. 
Fue una experiencia reveladora, pero también impactante para mí. Finalmente, en un aspecto, uno espera que los lenguajes de programación del mañana difieran mucho de los que estamos acostumbrados ahora: en mucha mayor medida que hasta ahora deberían invitarnos a reflejar en la estructura de lo que escribimos todas las abstracciones necesarias para afrontar conceptualmente la complejidad de lo que estamos diseñando. Hasta aquí la mayor adecuación de nuestras herramientas futuras, que fue la base del quinto argumento.

Como un aparte me gustaría insertar una advertencia a quienes identifican la dificultad de la tarea de programación con la lucha contra las deficiencias de nuestras herramientas actuales, porque podrían concluir que, una vez que nuestras herramientas sean mucho más adecuadas, la programación ya no será suficiente, será un problema. 

La programación seguirá siendo muy difícil, porque una vez que nos hayamos liberado de la incomodidad circunstancial, nos encontraremos libres para abordar los problemas que ahora están mucho más allá de nuestra capacidad de programación.

Puedes discutir con mi sexto argumento, porque no es tan fácil recolectar evidencia experimental para su apoyo, un hecho que no me impedirá creer en su validez. Hasta ahora no he mencionado la palabra “jerarquía”, pero creo que es justo decir que este es un concepto clave para todos los sistemas que incorporan una solución bien factorizada. Incluso podría dar un paso más y convertirlo en un artículo de fe, a saber. que los únicos problemas que realmente podemos resolver de manera satisfactoria son aquellos que finalmente admiten una solución bien factorizada

A primera vista, esta visión de las limitaciones humanas puede parecerles una visión bastante deprimente de nuestra situación, pero yo no lo siento así, ¡al contrario! La mejor forma de aprender a vivir con nuestras limitaciones es conocerlas. En el momento en que seamos lo suficientemente modestos como para probar solo soluciones factorizadas, Debido a que los otros esfuerzos escapan a nuestro control intelectual, haremos todo lo posible para evitar que todas esas interfaces perjudiquen nuestra capacidad para factorizar el sistema de una manera útil. 

Y no puedo dejar de esperar que esto conduzca repetidamente al descubrimiento de que, después de todo, se puede factorizar un problema inicialmente imposible de resolver. Cualquiera que haya visto cómo la mayoría de los problemas de la fase de compilación llamada "generación de código" se pueden rastrear hasta las propiedades divertidas del código de pedido, sabrá un ejemplo simple del tipo de cosas que tengo en mente. La aplicabilidad más amplia de soluciones bien factorizadas es mi sexto y último argumento a favor de la viabilidad técnica de la revolución que podría tener lugar en la década actual

#AskYourSelf

En principio, dejo que usted decida por sí mismo cuánto peso le va a dar a mis consideraciones, sabiendo muy bien que no puedo obligar a nadie más a compartir mis creencias. Como cada revolución seria, provocará una oposición violenta y uno puede preguntarse dónde esperar las fuerzas conservadoras que intentan contrarrestar tal desarrollo. 

No los espero principalmente en las grandes empresas, ni siquiera en el negocio de las computadoras; Los espero más bien en las instituciones educativas que brindan capacitación hoy en día y en esos grupos conservadores de usuarios de computadoras que piensan que sus viejos programas son tan importantes que no creen que valga la pena reescribirlos y mejorarlos

A este respecto, es triste observar que en muchos campus universitarios la elección de la instalación informática central ha estado determinada con demasiada frecuencia por las demandas de unas pocas aplicaciones establecidas pero costosas, sin tener en cuenta la cuestión de cuántos miles de "pequeños usuarios" que estén dispuestos a escribir sus propios programas iban a sufrir esta elección. 

Con demasiada frecuencia, por ejemplo, la física de altas energías parece haber chantajeado a la comunidad científica con el precio del equipo experimental restante. La respuesta más fácil, por supuesto, es una negación rotunda de la viabilidad técnica, pero me temo que se necesitan argumentos bastante sólidos para ello. 
Desafortunadamente, no se puede obtener ninguna tranquilidad con la observación de que el techo intelectual del programador promedio de hoy impedirá que se produzca la revolución:
También puede haber impedimentos políticos. Incluso si sabemos cómo educar al programador profesional del mañana, no es seguro que la sociedad en la que vivimos nos lo permita
El primer efecto de enseñar una metodología —más que difundir conocimientos— es el de potenciar las capacidades de los ya capaces, magnificando así la diferencia de inteligencia. En una sociedad en la que el sistema educativo se utiliza como instrumento para el establecimiento de una cultura homogeneizada, en la que se impide que la crema llegue a lo más alto, la formación de programadores competentes podría resultar políticamente imparable.

El movimiento mental TopDown

Déjame concluir. Las computadoras automáticas han estado con nosotros durante un cuarto de siglo. Han tenido un gran impacto en nuestra sociedad en su capacidad de herramientas, pero en esa capacidad su influencia no será más que una onda en la superficie de nuestra cultura, en comparación con la influencia mucho más profunda que tendrán en su capacidad de desafío intelectual sin precedente en la historia cultural de la humanidad. 
Los sistemas jerárquicos parecen tener la propiedad de que "algo" considerado como "una entidad indivisa" en el primer nivel, se considera un objeto compuesto en el siguiente nivel inferior de mayor detalle; como resultado, el grano natural de espacio o tiempo que es aplicable en cada nivel disminuye en un orden de magnitud cuando cambiamos nuestra atención de un nivel al siguiente nivel inferior. 
Entendemos las paredes en términos de ladrillos, los ladrillos en términos de cristales, cristales en términos de moléculas, etc. Como resultado, el número de niveles que se pueden distinguir de manera significativa en un sistema jerárquico es proporcional al logaritmo de la relación entre el grano más grande y el más pequeño, y por lo tanto, a menos que esta relación sea muy grande, no podemos esperar muchos niveles. 
En programación de computadoras, nuestro bloque de construcción básico tiene una granularidad de tiempo asociado de menos de un microsegundo, pero nuestro programa puede tomar horas de tiempo de cálculo. No conozco ninguna otra tecnología que cubra una proporción de 10 elevado a la 10 o más: el ordenador, en virtud de su fantástica velocidad, parece ser el primero en proporcionarnos un entorno en el que los artefactos altamente jerárquicos son posibles y necesarios. 
Este desafío, a saber. el enfrentamiento con la tarea de programación, es tan singular que esta novedosa experiencia puede enseñarnos mucho sobre nosotros mismos. Debería profundizar nuestra comprensión de los procesos de diseño y creación, debería darnos un mejor control sobre la tarea de organizar nuestros pensamientos. Si no fuera así, ¡a mi gusto no deberíamos merecer la computadora en absoluto!
Ya nos ha enseñado algunas lecciones y la que he elegido enfatizar en esta charla es la siguiente.
Haremos un trabajo de programación mucho mejor, siempre que abordemos la tarea con una plena apreciación de su tremenda dificultad, siempre que nos ciñamos a lenguajes de programación modestos y elegantes, siempre que respetemos las limitaciones intrínsecas de la mente humana y abordemos la tarea. como programadores muy humildes.