DSN_XP y SCRUM personalizado

 Primer Proyecto SCRUM en Ecuador 


Se respetan derechos de propiedad intelectual 
de aquellos que son mencionados en este registro 

Es importante para la comunidad ágil del Ecuador que existan registros sobre la aplicación de los métodos ágiles en cualquier tipo de proyecto, estos registros permitirán que la misma comunidad se beneficie con casos de estudio que pueden ser referidos para la adopción del agilismo, al menos, este es un principio básico para DSN_XP.

La información que estamos publicando en este blog, se limita a nuestras investigaciones, por lo que dejamos por escrito nuestra constancia de que honramos la propiedad intelectual de terceros que coparticiparon en el desarrollo del proyecto.

Antecedentes:

  • Este es un proyecto tecnológico de propiedad intelectual de la UTPL, bajo nuestros registros, el proyecto de desarrollo de la plataforma educativa para la universidad fue encargado a la empresa BAYTEQ y estaba siendo administrado por la oficina de proyectos PMO de la UTPL.
  • Bajo nuestros registros, la UTPL contrata a la empresa SAMASAT para dar un impulso al macro proyecto debido a que en su planificación del tiempo, existía una diferencia considerable respecto a lo comprometido por agenda.
  • SAMASAT entra en contacto con Francisco Toscano Morales y consulta nuestra opinión como metodólogos debido al diseño de DSN_XP como marco de trabajo para el desarrollo de software en Ecuador.
Para estas épocas, DSN_XP tenía desarrollada en su versión 2.0 que nos permitía documentar técnicamente aquellos proyectos basados en el desarrollo de software en Ecuador.

Los contextos del retraso no son analizados en este blog por falta de hechos y datos, sin embargo, para la fidelidad de nuestro registro del primer proyecto tecnológico en el Ecuador en el cual se aplica SCRUM, narraremos las experiencias de implementarlo dentro del siguiente contexto bajo las perspectivas DSN_XP.

Ingeniería inversa al proyecto de desarrollo

¿Cómo se puede evaluar el estado de un proyecto tecnológico?

Para responder a esta pregunta, DSN_XP como marco de trabajo, realizó las siguientes acciones.
  1. Se trata de un proyecto de alta complejidad y alcance pues la plataforma educativa debe acoplarse a los otros sistemas informáticos que coexisten y se tienen pensado implementar dentro de la universidad.
  2. Al tratarse de un tema complejo, se le entrega la gestión del proyecto a la oficina de proyectos de la UTPL quienes tienen que lidiar con complejidades externas relacionadas con el marco legal que le fue impuesto a las universidades respecto al uso de sus recursos económicos y la necesidad de desacoplarse de los proyectos de inversión (por temas de competencias para universidades y su naturaleza de acción).
  3. El punto anterior se establece dentro de la coyuntura política del Ecuador (2009-2010) en la cual se insertan cambios profundos en el modelo de gestión de las universidades del país, cambios que de una u otra forma impactan en el macro diseño establecido previamente
  4. Dentro del proyecto, coexisten varias empresas mediante un modelo de contratación por prestación de servicios que el proyecto macro contempla para el desarrollo de toda la plataforma educativa, dentro de este contexto multi-empresas, se contrata a SAMASAT para recuperar el proyecto del ritmo establecido por la PMO y darle el giro necesario para ser considerado como una fábrica de software que desarrolle la plataforma educativa y administrativa que requiere la UTPL para impulsar su modelo de negocio.
  5. La fábrica de software a su vez, contrataría a las empresas AQA Solutions para efectos de asegurar la calidad del software de la plataforma educativa acorde a los intereses de la UTPL.
  6. La fábrica de software también contrataría a emprendimientos tecnológicos locales como Enova Training y a personal UTPL.
  7. La fábrica de software tiene personal contratado, quienes a su vez son coordinados a nivel de diseño con el arquitecto principal de la empresa BAYTEQ y a la vez se recibe acompañamiento externo con Jorge Gamba un pionero de la tecnología DDD aplicada al software. 
Nota: La sección anterior hace referencia a terceros en honor a su participación dentro del proyecto; aspectos relacionados con el diseño principal de la plataforma no son considerados en esta entrada porque no corresponden a diseños realizados por DSN_XP en su aplicación al desarrollo de software.











La planificación del producto:



Uno de los grandes retos del proyecto fue satisfacer las necesidades del cliente. La planificación del producto consume una gran cantidad de energía en las etapas iniciales del proyecto. Para nuestros registros, el proyecto ya había sido previamente analizado, diseñado y estaba en ejecución.

Este evento implica que puede aplicarse el marco de trabajo ágil en cualquier fase del proyecto inspeccionado y adaptado. 

La planificación del producto es entonces una de las primeras reuniones que se requieren dentro de la adopción del agilismo.

La planificación de la liberación del producto:


La planificación de las liberaciones de un producto tiene por concepto el uso de las herramientas para la integración continua del código publicado.

Cuando esta planificación se basa en estimaciones sobre un diseño vago del producto y la presión de cronogramas irreales existe como consecuencia la denominada deuda técnica que implica usualmente un desborde en el control del proyecto respecto al seguimiento estricto de un plan. 

Este es un punto crucial para el agilismo ya que la planificación es continua antes que el seguimiento de un plan.

El Backlog:


Este es quizás el artefacto más poderoso de la metodología propuesta por Scrum, el backlog es poblado en nuestro estudio por macro funcionalidades o paquetes funcionales de la herramienta, esta forma de poblar el backlog se utilizó en lugar de las historias de usuario propuestas usualmente por la Alianza Scrum

El Sprint Plannig:


Es la reunión de la planificación del producto a liberar en el Sprint, todo el enfoque de esta reunión consiste en analizar los componentes que se requieren en esta fracción de tiempo acorde a la línea de producción planificada.

DSN_XP y Winston W. Royce en gratitud

 Escuelas de diseño para sistemas grandes



DSN_XP descubre a Royce, como el referente de un modelo de desarrollo de software para el diseño de soluciones que implican mayor cobertura funcional o macro sistemas.

Este es el escrito original sobre el cual se derivará un modelo más general que usualmente se lo denomina como el modelo en cascada, sin embargo, si el lector lee esta entrada, notará que Royce tiene ideas interesantes sobre establecer un modelo general para desarrollo de software en sistemas grandes.

Gestión del desarrollo de grandes sistemas de software

Dr. Winston W. Rovce
1974
Peimpreso de Proceedings, IEEE WESCON, agosto de 1970, páginas 1-9. 
Copyright © 1970 por The Institute of Electrical and Electronics Engineers 
.328 Inc. Publicado originalmente por TRW

Introducción

Personalmente voy a describir mis puntos de vista sobre la gestión de grandes desarrollos de software. Yo he tenido varias asignaciones durante los últimos años, principalmente relacionadas con el desarrollo de paquetes de software para la planificación de la misión de la nave espacial, el mando y el análisis posterior al vuelo. En estas asignaciones he experimentado diferentes grados de éxito con respecto a llegar a un estado operativo, a tiempo y dentro de los costos. He llegado a tener prejuicios por mis experiencias y voy a relatar algunos de estos prejuicios en esta presentación.

Funciones para el desarrollo de programas computables

Hay dos pasos esenciales comúnmente a todos los desarrollos de programas software, independientemente del tamaño o complejidad. Primero hay un paso de análisis, seguido de un paso de codificación como se muestra en la Figura 1. 


Esta clase de concepto de implementación muy simple es de hecho todo lo que se requiere si el esfuerzo es suficientemente pequeño y si el producto final debe ser operado por quienes lo construyeron, como se hace típicamente con programas de computadora para uso interno. 

También es el tipo de esfuerzo de desarrollo por el que la mayoría de los clientes están felices de pagar, ya que ambos pasos implican un trabajo genuinamente creativo que contribuya directamente a la utilidad del producto final. Un plan de implementación para fabricar largos sistemas de software y codificado solo por estos pasos, sin embargo, está condenado al fracaso. Se requieren muchos pasos de desarrollo adicionales, ninguno contribuye tan directamente al producto final como el análisis y la codificación y todos aumentan los costos de desarrollo. 

El personal del cliente normalmente preferiría no pagar por ellos y el personal de desarrollo preferiría no implementarlos. La función principal de la gestión es vender estos conceptos a ambos grupos y luego hacer el cumplimiento por parte del personal de desarrollo.

En la Figura 2 se ilustra un enfoque más grandioso del desarrollo de software. El análisis y la codificación los pasos todavía están en la imagen, pero están precedidos por dos niveles de análisis de requisitos, están separados por un paso de diseño del programa, seguido de un paso de prueba. Estas adiciones se tratan por separado del análisis y codificación porque son claramente diferentes en la forma en que se ejecutan. 


Deben ser planificados y dotados de personal de manera diferente para la mejor utilización de los recursos del programa. 

La Figura 3 muestra la relación iterativa entre las sucesivas fases de desarrollo de este esquema. El orden de los pasos se basa en el siguiente concepto: que a medida que avanza cada paso y el diseño avanza detallado, hay una iteración con los pasos anteriores y posteriores, pero rara vez con los pasos más remotos en la secuencia. La virtud de todo esto es que a medida que avanza el diseño, el proceso de cambio se reduce a límites manejables.  

En cualquier punto del proceso de diseño después de que se completa el análisis de requisitos, existe una línea de base firme y segura que se mueve hacia donde quiera girar en el caso de dificultades de diseño imprevistas y tener una posición de respaldo efectiva que tiende a maximizar la extensión del trabajo inicial que se puede salvar y preservarlo.


Creo en este concepto, pero la implementación descrita anteriormente es arriesgada e invita al fracaso.

El problema se ilustra en la Figura 4. La fase de prueba que ocurre al final del ciclo de desarrollo es el primer evento para el cual se experimentan transferencias de tiempo, almacenamiento, entrada / salida, etc., a diferencia del analizado. Estos fenómenos no son precisamente analizables. No son las soluciones al estándar parcial de ecuaciones diferenciales de la física matemática, por ejemplo. Sin embargo, si estos fenómenos no logran satisfacer las diversas restricciones externas, entonces invariablemente se requiere un rediseño importante. Un simple parche octal o rehacer de algunos códigos aislados no solucionará este tipo de dificultades. Es probable que los cambios de diseño necesarios sean tan perjudiciales que los requisitos de software en los que se basa el diseño y que proporcionan la justificación de todo son violados. O se deben modificar los requisitos o se requiere un cambio sustancial en el diseño. 


En efecto, el proceso de desarrollo ha regresado al origen y se puede esperar hasta un 10 por ciento de sobrepaso en el cronograma y / o costos. 

Uno podría notar que ha habido un salto en las fases de análisis y código. Uno no puede, por supuesto, producir software sin estos pasos, pero generalmente estas fases se gestionan con relativa facilidad y tienen poco impacto en los requisitos, el diseño y las pruebas. En mi experiencia hay departamentos enteros consumidos con el análisis de la mecánica de la órbita, determinación de la actitud de la nave espacial, optimización matemática de la actividad de carga útil y así sucesivamente, pero cuando estos departamentos han completado su trabajo difícil y complejo, los pasos del programa resultantes implican unas pocas líneas de código aritmético en serie. Si en la ejecución de su difícil trabajo es complejo, los analistas han cometido un error, la corrección es invariablemente implementada por un menor cambio en el código sin retroalimentación disruptiva en las otras bases de desarrollo

Sin embargo, creo que el enfoque ilustrado es fundamentalmente sólido. El resto de esta discusión presenta cinco características adicionales que deben agregarse a este enfoque básico para eliminar la mayoría de las riesgos de desarrollo.

Paso 1: El diseño del programa es lo primero 

El primer paso hacia una solución se ilustra en la Figura 5. Se ha realizado una fase de diseño preliminar del programa, insertado entre la fase de generación de requisitos de software y la fase de análisis. Este procedimiento puede ser criticado sobre la base de que el diseñador del programa se ve obligado a diseñar en el vacío relativo del software inicial, requisitos sin ningún análisis existente

Como resultado, su diseño preliminar puede estar sustancialmente en error como en comparación con su diseño si tuviera que esperar hasta que el análisis estuviera completo. Esta crítica es correcta pero falla el punto. Mediante esta técnica, el diseñador del programa asegura que el software no fallará debido al almacenamiento, razones de tiempo y flujo de datos

A medida que avanza el análisis en la fase siguiente, el diseñador del programa debe imponer al analista las restricciones de almacenamiento, tiempo y funcionamiento de tal manera que perciba las consecuencias. Cuando necesita justificadamente más de este tipo de recursos para implementar sus ecuaciones, deben arrebatarse simultáneamente a sus compatriotas analistas. De esta forma todos los analistas y todos los diseñadores de programas contribuirán a un proceso de diseño significativo que culminará en la asignación adecuada de tiempo de ejecución y recursos de almacenamiento. Si los recursos totales por aplicar son insuficientes o si el embrión del diseño operacional es incorrecto, se reconocerá en esta etapa anterior y la iteración con requisitos y el diseño preliminar se pueden rehacer antes de que comience el diseño final, la codificación y la prueba. 

¿Cómo se implementa este procedimiento? Se requieren los siguientes pasos. 
  1. Inicie el proceso de diseño con diseñadores de programas, no analistas ni programadores. 
  2. Diseñar, definir y asignar los modos de procesamiento de datos incluso a riesgo de equivocarse. Asignar procesamiento, funciones, diseñar la base de datos, definir el procesamiento de la base de datos, asignar tiempo de ejecución, definir interfaces y modos de procesamiento con el sistema operativo, describir el procesamiento de entrada y salida, y definir procedimientos operativos preliminares. 
  3. Escriba un documento de descripción general que sea comprensible, informativo y actual. Todos y cada uno de los trabajadores debe tener un conocimiento elemental del sistema. Al menos una persona debe tener un profundo conocimiento del sistema que proviene en parte de haber tenido que escribir un documento de resumen.

Paso 2: Documentar el diseño 

En este punto es apropiado plantear la cuestión de "¿cuánta documentación?" Mi propio punto de vista es "bastante;" ciertamente más de lo que la mayoría de los programadores, analistas o diseñadores de programas están dispuestos a hacer si se les deja sus propios dispositivos. La primera regla para administrar el desarrollo de software es la aplicación despiadada de la documentación de requisitos

De vez en cuando se me pide que revise el progreso de otros esfuerzos de diseño de software. Mi primer paso es investigar el estado de la documentación, si la documentación está en grave incumplimiento mi primera recomendación es simple. Reemplazar la gestión de proyectos. Detenga todas las actividades no relacionadas con la documentación. 

Lleve la documentación a niveles aceptables. La gestión del software es simplemente imposible sin muy alto grado de documentación. Como ejemplo, permítanme ofrecer las siguientes estimaciones para comparar. Para adquirir un dispositivo de hardware de 5 millones de dólares, esperaría una especificación de 30 páginas que proporcionara el detalle adecuado para controlar la contratación. Para adquirir 5 millones de dólares en software, calcularía 1000 páginas de especificaciones correctas para lograr un control comparable, 

¿Por qué tanta documentación? 
  1. Cada diseñador debe comunicarse con los diseñadores de interfaz, con su gerencia y posiblemente con el cliente. Un registro verbal es demasiado intangible para proporcionar una base adecuada para una interfaz o gestionar decisiones. Una descripción escrita aceptable obliga al diseñador a adoptar una posición inequívoca y proporcionar evidencia tangible de finalización. Evita que el diseñador se esconda detrás de "estamos a 90 porciento terminado"- síndrome de mes tras mes. 
  2. Durante la fase inicial del desarrollo de software, la documentación es la especificación y el diseño. Hasta que comience la codificación, estos tres sustantivos (documentación, especificación, diseño) denotan algo. Si la documentación es mala el diseño es malo. Si la documentación aún no existe, aún no hay diseño, sólo gente que piensa y habla sobre el diseño, que tiene cierto valor, pero no mucho
  3. El valor monetario real de una buena documentación comienza en el proceso de desarrollo durante la fase de prueba y continúa a través de operaciones y rediseño. El valor de la documentación puede ser descrita en términos de tres situaciones concretas y tangibles a las que se enfrenta todo director de programa. 
    • Durante la fase de prueba, con buena documentación, el gerente puede concentrar al personal en los errores en el programa. Sin una buena documentación, cada error, grande o pequeño, es analizado por un solo hombre quien probablemente cometió el error en primer lugar porque es el único hombre que comprende el área del programa
    • Durante la fase operativa, con una buena documentación, el gerente puede utilizar personal para operar el programa y hacer un mejor trabajo, más barato. Sin una buena documentación, el software debe ser operado por quienes lo construyeron. Generalmente estas personas están relativamente desinteresadas en las operaciones y no hacen un trabajo tan eficaz como el personal orientado a las operaciones. Cabe señalar a este respecto que en una situación operativa, si hay algún bloqueo, siempre se culpa primero al software. Para absolver al software o para corregir la culpa, la documentación del software debe hablar claramente. 
    • Después de las operaciones iniciales, cuando las mejoras del sistema están en orden, una buena documentación permite el rediseño, actualización y adaptación efectivos en el campo. Si no existe documentación, generalmente todo el marco existente de software operativo debe desecharse, incluso para cambios relativamente modestos. 
La Figura 6 muestra un plan de documentación que se ajusta a los pasos mostrados anteriormente. Tenga en cuenta que seis documentos se producen y en el momento de la entrega del producto final, Documentos No, 1, No 3, No 4, los números 5 y 6 debe ser vigentes y actualizados.


Paso 3: Hazlo dos veces 

Después de la documentación, el segundo criterio más importante para el éxito gira en torno a si el producto es totalmente original. Si el programa informático en cuestión se está desarrollando por primera vez, importa que se organice para que la versión finalmente entregada al cliente para la implementación operativa sea en realidad la segunda versión en lo que respecta a las áreas críticas de diseño / operaciones. 

La figura 7 ilustra cómo podría llevarse a cabo mediante una simulación. Tenga en cuenta que es simplemente todo el proceso realizado en miniatura, a escala de tiempo que es relativamente pequeña con respecto al esfuerzo total


La naturaleza de este esfuerzo puede variar ampliamente dependiendo principalmente en la escala de tiempo general y la naturaleza de las áreas críticas del problema que se modelarán. Si el esfuerzo corre 30 meses, entonces este desarrollo temprano del modelo piloto podría programarse para 10 meses. 

Para este horario, se pueden utilizar controles bastante formales, procedimientos de documentación, etc. Sin embargo, si el esfuerzo general fuera reducido a 12 meses, entonces el esfuerzo piloto podría comprimirse a tres meses quizás, con el fin de ganar suficiente apalancamiento en el desarrollo de la línea principal. 

En este caso, un tipo muy especial de amplia competencia es requerido por parte del personal involucrado. Deben tener una sensación intuitiva para el análisis, la codificación y diseño del programa. Deben detectar rápidamente los puntos problemáticos en el diseño, modelarlos, modelar sus alternativas, olvídese de los aspectos sencillos del diseño que no vale la pena estudiar en este punto inicial y finalmente llegar a un programa sin errores. 

En cualquier caso, el punto de todo esto, como con una simulación, son las cuestiones de tiempo, el almacenamiento, etc., que de otro modo serían cuestiones de juicio, ahora se pueden estudiar con precisión. Sin esta simulación, el director del proyecto está a merced del juicio humano. 

Con la simulación puede al menos realizar pruebas experimentales de algunas hipótesis clave y analizar lo que queda para el juicio humano, que en el área del diseño de programas de computadora (como en la estimación del peso bruto de despegue, los costos diarios para completar al doble) es invariable y seriamente optimista.

Paso 4: Planificar , controlar y monitorear las pruebas 

Sin duda, el mayor usuario de los recursos del proyecto, ya sea mano de obra, tiempo de computadora o juicio de la gerencia, es la fase de prueba. Es la fase de mayor riesgo en términos de dólares y cronograma. Eso ocurre en el último punto de la programación cuando las alternativas de respaldo están menos disponibles, si es que las hay. 

Las tres recomendaciones anteriores para diseñar el programa antes de comenzar el análisis y la codificación, para documentarlo por completo y para construir un modelo piloto, todos tienen como objetivo descubrir y resolver problemas antes entrando en la fase de prueba. Sin embargo, incluso después de hacer estas cosas, hay una fase más tranquila y todavía hay cosas importantes por hacer. La Figura 8 enumera algunos aspectos adicionales de las pruebas. 

Al planificar las pruebas, sugiera lo siguiente para su consideración. 
  1. Muchas partes del proceso de prueba son manejadas mejor por especialistas en pruebas que no necesariamente contribuyeron al diseño original. Si se argumenta que solo el diseñador puede realizar una prueba exhaustiva porque solo él entiende el área que construyó, esto es un signo seguro de que no se documenta correctamente. Con buena documentación es factible utilizar especialistas en garantía de productos de software que, a mi juicio, harán un mejor trabajo de prueba que el diseñador.
  2. La mayoría de los errores son de naturaleza obvia, por lo que pueden detectarse fácilmente mediante una inspección visual. Cada pedacito de un análisis y cada fragmento de código debe ser sometido a un simple escaneo visual por una segunda parte que no hizo el análisis o el código original, pero quién detectaría cosas como signos negativos caídos, factores faltantes de dos, salta a direcciones incorrectas, etc., que tienen la naturaleza de corregir el análisis y el código. No utilice el computador para detectar este tipo de cosas, es demasiado caro.
  3. Pruebe cada ruta lógica en el programa de computadora al menos una vez con algún tipo de verificación numérica. Si soy cliente, no aceptaré la entrega hasta que este procedimiento haya sido completado y certificado. Este paso descubre la mayoría de los errores de codificación. Si bien este procedimiento de prueba parece simple, para un programa de computadora grande y complejo es relativamente difícil para recorrer cada camino lógico con valores controlados de entrada. De hecho, hay quienes argumentarán que es casi imposible. A pesar de esto, persistiría en mi recomendación de que todo camino lógico sea sometido al menos a un control auténtico.
  4. Después de eliminar los errores simples (que son la mayoría y que oscurecen a los grandes errores), entonces es el momento de entregar el software al área de prueba para fines de pago. En el momento adecuado durante el curso de desarrollo y en manos de la persona adecuada, la computadora en sí es el mejor dispositivo para revisa. Las decisiones clave de gestión son: ¿Cuándo es el momento y quién es la persona que realizará el pago final?

Paso 5: Involucrar al cliente 

Por alguna razón, lo que va a hacer un diseño de software está sujeto a una amplia interpretación incluso después de acuerdo previo. Es importante involucrar al cliente de manera formal para que se haya comprometido él mismo en puntos anteriores antes de la entrega final. Dar rienda suelta al contratista entre requisitos la definición y el funcionamiento invitan a los problemas. La figura 9 indica tres puntos siguiendo la definición de requisitos donde el conocimiento, el juicio y el compromiso del cliente pueden reforzar el esfuerzo de desarrollo. 


Resumen 

La Figura 10 resume los cinco pasos que considero necesarios para transformar un proceso de desarrollo riesgoso en uno que proporcione el producto deseado. Destacaría que cada artículo cuesta una suma adicional de dinero. Si el proceso relativamente más simple sin las cinco complejidades descritas aquí funcionara con éxito, entonces, por supuesto, el dinero adicional no está bien gastado. En mi experiencia, sin embargo, el método más simple nunca ha funcionado en grandes esfuerzos de desarrollo de software y los costos de recuperación superaron con creces los necesarios para financiar el proceso de cinco pasos enumerado.


DSN_XP y David Lorge Parnas en gratitud

 La mirada clásica del desarrollo de software



DSN_XP entra en contacto con las ideas de David L Parnas cuando nos era necesario descubrir aquellos aspectos importantes en el proceso de desarrollar software para terceros y la necesidad de trabajar en equipos multidisciplinares.

Por otro lado, las nociones de modularidad del software no eran muy bien comprendidas tanto por nosotros al venir de la programación estructurada como por parte de quienes nos enseñaban o conversaban sobre los criterios con los cuales se descompone un escenario que requiere automatización y control y la gestión de datos usualmente asociados a reportes tipo.

Para poder responder adecuadamente a todas las inquietudes que surgen del estudio del desarrollo de software, era necesario crear como herramienta una nueva perspectiva que como tal, daría el apoyo académico necesario para sostener nuestro mirar arquitectónico que en esencia pregunta:

  1. ¿Cómo se diseña software modularmente?
  2. ¿Cómo se organiza el software desarrollado para una reutilización apropiada?
M. Broy, E. Denert (Eds.): Software Pioneers
© Springer-Verlag Berlin Heidelberg 2002

David L. Parnas
Professor of Software Engineering
McMaster University
parnas@qusunt.cas.mcmaster.ca

La historia secreta de la ocultación de información

El concepto de "ocultar información" como principio de diseño de software es ampliamente aceptado en los círculos académicos. Muchos diseños exitosos pueden verse como aplicaciones exitosas de abstracción u ocultación de información. Por otro lado, la mayoría de los desarrolladores de software industrial no aplican la idea y muchos lo consideran poco realista. 
Este artículo describe cómo se desarrolló la idea, discute las dificultades en su aplicación y especula sobre por qué no ha sido completamente exitoso. 

Una aventura holandesa

La cuestión de cómo dividir los sistemas en módulos no estaba en mi mente en 1969 cuando tomé un año de excedencia de mi puesto académico para trabajar con una nueva empresa, Philips Computer Industry, en los Países Bajos. 

Estaba interesado en el uso de la simulación en el desarrollo de software y quería ver si mis ideas podían funcionar en la industria. Nunca me encontré afuera. En cambio, llegué a comprender que el desarrollo de software en la industria estaba en un nivel mucho más primitivo de lo que mi experiencia académica habría sugerido. Las ideas que había ido a Holanda a explorar eran obviamente poco realistas.

Había escuchado y leído muchos argumentos a favor de la programación modular y esos argumentos parecían obviamente correctos. El mensaje fue claro;  el software debe diseñarse como un conjunto de componentes. Con experiencia en ingeniería eléctrica, ni siquiera podía imaginarme a cualquiera que intente construir un producto complejo excepto como un ensamblaje de componentes o módulos más pequeños. Además, estaba acostumbrado a tener módulos con interfaces bien diseñadas y relativamente simples

Estaba desconcertado por la flexibilidad y naturaleza arbitraria de las interfaces que se estaban discutiendo. En ese momento, en ingeniería eléctrica, los módulos o componentes se presentaban a nosotros; aprendimos cómo ensamblarlos en circuitos. Nunca tuvimos ocasión de debatir la naturaleza de un componente. Era la exposición al desarrollo de software industrial real lo que me hizo darme cuenta que en software, la naturaleza de un componente o módulo no es obvia

De hecho, la gente rara vez puede definir esos términos a menos que las herramientas los definan. En la academia y en los periódicos había visto algunos sistemas bien organizados (El sistema THE de Dijkstra, por ejemplo [5]), pero a medida que me familiaricé con software comercial, comencé a darme cuenta de que se necesita una comprensión profunda y mucho esfuerzo para mantener el software simple y fácil de entender.

Frases como "Diseño limpio" o "Hermoso" no son significativas

Philips me dio la oportunidad de ver el diseño de un nuevo producto. Como se desarrolló, me hacía sentir cada vez más incómodo y comencé a confiar mis inquietudes a mi supervisor. Le dije repetidamente que los diseños no eran "limpios" y que deben ser "hermosos" en la forma en que los diseños de Dijkstra eran hermosos

No le pareció un comentario útil. Él me recordó que éramos ingenieros, no artistas. En su mente yo estaba simplemente expresando mi gusto y quería saber qué criterio estaba usando para elaborar mi juicio. ¡No pude decírselo! Porque no pude explicar qué principios estaban siendo violados, mis comentarios fueron simplemente ignorados y el trabajo continuó. 

Sintiendo que debe haber una manera de explicar y proporcionar motivación para mi "gusto", comencé a tratar de encontrar un principio que distinguiría los buenos diseños de los malos...
. Los ingenieros son muy pragmáticos; pueden admirar la belleza, pero buscan la utilidad. Traté de encontrar una explicación de por qué la "belleza" era útil. 

La servilleta fatal

El primer atisbo de comprensión llegó durante el almuerzo. Dos miembros del equipo de software comenzaron a discutir el trabajo. Jan, que estaba creando un compilador, preguntó a Johan, el experto en bases de datos, "¿Qué significa abrir un archivo de todas formas?" 

Johan y yo lo miramos con extrañeza; seguramente él sabía lo que "abrir" era. No podía hacer nada con un archivo hasta que lo hubiera abierto. Johan dijo eso y Jan respondió: “No, ¿Qué significa realmente? Tengo que implementar el comando de apertura y necesito saber qué código generar". 

Johan agarró una servilleta del dispensador de la mesa y empezó a dibujar un diagrama de un bloque de control. Mientras dibujaba, explicó el significado de cada campo e indicó dónde se ubicaban las direcciones específicas y los bits de control.

Sentí que dibujar el diagrama era un error y traté de detenerlos. les dije que se arrepentirían si continuaban. Cuando preguntaron por qué?, yo sólo respondí que no deberían tener que intercambiar dicha información. Ellos insistieron en que los redactores del compilador necesitaban esa información y trataron de deshacerse de mí porque estaba interfiriendo con su progreso.

¿Por qué no pude ni explicar? ¿Por qué pensé que estaban cometiendo un error y ni les ofrecí una mejor manera de resolver el problema?, me quedé extrañamente silencioso y observé mientras se completaba la discusión. 

La servilleta fue llevada arriba, se le perforaron dos agujeros y se la insertó en una carpeta. Más tarde, otro de los miembros del equipo del compilador hicieron copias de la servilleta y las pusieron en sus propios archivos.

Meses después, tenía pruebas de que había tenido razón. 

Johan se olvidó de la servilleta. Cuando era necesario cambiar el formato del bloque de control, la servilleta no se actualizó. El equipo de Jan continuó trabajando como si el bloque de control no había cambiado. Cuando se integraron los dos productos, no funcionaron correctamente y tomó algún tiempo averiguar por qué e incluso más para corregir el compilador. 

Cada cambio en el formato del bloque de control desencadenaba un cambio tanto en el compilador como en el sistema de base de datos; este acoplamiento  no deseado a menudo consumía un tiempo valioso.

En este punto, estaba claro para mí que había tenido razón, pero todavía estaba molesto por lo que habían dicho Jan y Johan. Ellos también tenían razón. El grupo del compilador necesitaba alguna información que permitiera que el código necesario sea generado. No pude decirles lo que podrían haber hecho en lugar de intercambiar los detalles de la servilleta.

Distribución de información en el software 

Cuando mi tiempo en Europa llegó a su fin, tenía algo del concepto pero no todo ello. Mi primer trabajo sobre "ocultación de información" se presentó en la conferencia IFIP en 1971 [8]. Aunque estas conferencias están destinadas a juntar personas de todo el mundo, las sesiones no cuentan con una amplia asistencia ni los procedimientos son bien leídos. No obstante, el periódico explicó que fue la distribución de información lo que ensució los sistemas al establecer conexiones casi invisibles entre módulos supuestamente independientes

Impartición de un curso temprano de ingeniería de software

Cuando volví a la docencia, me dijeron que, como era ingeniero1 y ahora tenía experiencia en desarrollo de software industrial, debería enseñar el nuevo curso de “ingeniería de software”. Nadie pudo decirme cual es el contenido que debería ser de ese curso o cómo debería diferenciarse de un curso de programación avanzada. Me dijeron que enseñara lo que pensara que era importante2, después pensé, me quedó claro que la distribución de información y cómo evitarlo, tenía que ser una gran parte de ese curso. 
  1. En realidad, yo no era un ingeniero pero tenía títulos de ingeniería. Para esa vez no había aplicado para una licencia en ingeniería como yo no practicaba la ingeniería. Como la mayoría de los científicos, el jefe de departamento no entendería la diferencia.
  2. me temo que lo mismo sucede en muchos departamentos de ciencias de la computación actualmente 

Decidí hacer esto por medio de un proyecto con distribución de información limitada y demostrar los beneficios de un diseño “limpio” [11]. También encontré una definición de "módulo" que era independiente de cualquier herramienta, una asignación de trabajo para un individuo o un grupo

Para impartir este primer curso, decidí tomar el concepto de modularidad seriamente. Diseñé un proyecto que se dividió en cinco módulos y dividió la clase en cinco grupos. Cada individuo en un grupo tendría la misma asignación de trabajo (módulo) pero usaría un método diferente para completarlo. Con cuatro miembros por grupo, esperábamos obtener cuatro implementaciones de cada módulo. Las implementaciones de un módulo fueron requeridas para ser intercambiables para que (si todo funcionara) terminarían con 1024 combinaciones ejecutables. Veinticinco seleccionados al azar, se probaron combinaciones y (eventualmente) se ejecutaron. 

Los resultados de este experimento me parecieron importantes porque la construcción de módulos de software intercambiables parecía inalcanzable por otros en ese momento. De hecho, incluso hoy veo lo difícil que puede ser instalar una actualización del software que todos usamos. El intercambio de una implementación de un módulo a otro rara vez va bien. Casi siempre hay interfaces complejas y muchos pequeños detalles que mantienen ocupadas las "líneas de ayuda" siempre que se instalen nuevas versiones de módulos menores.

Lo que Johan debería haberle dicho a Jan

Al realizar el experimento como ejercicio educativo, finalmente había encontrado la respuesta al problema planteado un año antes por Jan y Johan
Debido a que cada módulo tenía cuatro implementaciones realmente diferentes, mis estudiantes no podían intercambiar hablado el tipo de información detallada que Jan y Johan habían discutido. En su lugar, diseñé una interfaz abstracta, una que todas las versiones de un módulo podrían tener en común. Tratamos la descripción de la interfaz como una especificación, es decir, todas las implementaciones fueron necesarias para satisfacer esa descripción. Porque no les dijimos a los estudiantes qué combinaciones serían probadas, no podrían utilizar ninguna información adicional. 
De hecho, los detalles de implementación se mantuvieron en secreto. Se publicó el artículo que describía el experimento y su resultado en una conferencia importante, pero no ha sido ampliamente leído ni citado [12].

Dos artículos de revistas sobre ocultación de información

Hubieron dos artículos de revistas que siguieron y estos son ampliamente citados aunque a veces parece que quienes los citan no los han leído y muchos de los que los han leído se refieren a ellos sin citarlos. Lo mejor de los dos artículos [10] fue rechazado por primera vez por la revista. El revisor declaró: “Obviamente, Parnas no sabe de qué está hablando porque nadie lo hace de esa manera". Me opuse señalando que uno no debería rechazar una idea que dice ser nueva simplemente porque es nueva. El editor luego publicó el artículo sin mayores cambios. 

Lenguaje: a menudo es un problema incorrecto

Debido a que había tardado tanto en encontrar una solución al dilema planteado por Jan y Johan, lo primero que pensé fue que era la notación de la especificación, eso fue significativo. En consecuencia, las primeras comunicaciones de la ACM El artículo [9] discutió la técnica de especificación e ilustró la idea por publicar las especificaciones con muchos errores tipográficos introducidos en el proceso de composición tipográfica (manual)

Fueron necesarias varias discusiones con personas que habían leído el artículo antes que me de cuenta de la importancia del hecho (obvio) de que el método de especificación no funcionaría con un conjunto arbitrario de módulos. Lo más importante, sería no haber trabajado con módulos de diseño convencional. El secreto del éxito del experimento no fue la notación de especificación sino la descomposición. 

A lo largo de los años, he propuesto y estudiado enfoques más generales para la especificación del módulo [1, 18]. Muchos otros también han examinado este problema. Lentamente me he dado cuenta de que la notación estándar de las matemáticas es mejor que la mayoría de los lenguajes que pueden inventar los científicos informáticosHe aprendido que es más importante aprender a utilizar los conceptos matemáticos y su notación que inventar nuevas notaciones ad hoc. 

Lo que realmente importa es el diseño

Fue el hecho de que la modularización limitó la cantidad de información que tenía que ser compartida por los implementadores del módulo que hicieron del esfuerzo un éxito. Después de reflexionar me di cuenta de que había encontrado la respuesta a la pregunta que me había hecho mi gerente en Philips. La diferencia entre entre los diseños que encontré "hermosos" y los que encontré feos, fue que los hermosos diseños encapsulaban información cambiante o arbitraria. Debido a que las interfaces contenían solo información "sólida" o duradera, parecían simples y podían llamarse hermosas. Para mantener las interfaces "Hermosas", es necesario estructurar el sistema de modo que toda información arbitraria o cambiante o muy detallada está oculta.

El segundo artículo explicó esto, aunque nunca usó la frase "ocultación de información". Es posible formalizar el concepto de información escondida usando la teoría de la información de Shannon
Las interfaces son un conjunto de suposiciones que un usuario puede hacer sobre el módulo. Cuanto menos probable sea que estas suposiciones deban cambiar (es decir, cuanto más arbitrarias son las suposiciones), cuanto más "bellas" parecen.  Por tanto, las interfaces que contienen menos información en el sentido de Shannon son más "hermosas". Desafortunadamente, esta formalidad no es muy útil. Las aplicaciones de las teorías de Shannon nos exigen para estimar la probabilidad de las "señales" y nunca tenemos tales datos.

De los módulos de Parnas a los módulos de ocultación de información

El primer grupo grande que se basó en la idea de ocultar la información fue SRI Internacional. Introdujeron el HDM o método de desarrollo jerárquico descrito en [19-22]. Se refirieron a los módulos como “Módulos de Parnas”. Solicité que cambiaran a una terminología más descriptiva, "módulos de información, "ocultación" y el término "ocultación de información" es el que ha sido aceptado. Este término ahora se usa a menudo en libros y artículos ya sea cita o explicación. 

Ocultar información es más difícil de lo que parece

Ocultar información, como hacer dieta, es algo que se describe más fácilmente que hacerlo. El principio es simple y se explica fácilmente en términos de la matemática y la teoría de la información. Cuando se aplican correctamente suelen tener éxito. Abstracciones como tuberías Unix, postscript o X-windows logran el objetivo de permitir varias implementaciones de la misma interfaz. Sin embargo, aunque el principio se publicó hace 30 años, el software actual está lleno de lugares donde la información no está oculta, las interfaces son complejas y los cambios son irracionalmente difíciles. 

En parte, esto puede ser atribuido a la falta de estándares educativos para profesionales desarrolladores de software.  Es bastante fácil conseguir un trabajo desarrollando software con poca o sin exposición al concepto. Además, si el gerente y los compañeros de trabajo no conocen el concepto, no apoyarán el esconder el uso de la información por alguien que lo entienda. Ellos argumentarán que, "nadie lo hace de esa manera" y que no pueden permitirse experimentar con nuevas ideas. 

Además del hecho de que los estándares educativos de ingeniería de software son mucho más bajos que los de otros campos de la ingeniería, he observado otras razones de fallo al aplicar la ocultación de información. 

El instinto del diagrama de flujo

Mis experimentos originales con el índice KWIC revelaron que la mayoría de los los firmantes diseñan software pensando en el flujo de control. A menudo ellos comienzan con un diagrama de flujo. Los cuadros de los diagramas de flujo se les denomina módulos. Desafortunadamente, los módulos desarrollados de esta manera intercambian grandes cantidades de información en estructuras de datos complejas y tienen interfaces "feas"
La descomposición basada en diagramas de flujo casi siempre viola el principio de ocultación de la información. El hábito de comenzar con un diagrama de flujo termina mal. Puedo enseñar el principio, advertir contra la modularización en base de un diagrama de flujo y ver a mis alumnos hacer exactamente eso una hora más tarde. 

La planificación para el cambio parece ser demasiada planificación

La aplicación adecuada del principio de ocultamiento de información requiere mucho de análisis. Hay que estudiar la clase de aplicaciones y determinar qué es poco probable que los aspectos cambien al identificar decisiones cambiantes.

La simple intuición no es adecuada para esta tarea. Al diseñar software, yo he identificado ciertos hechos como susceptibles de cambiar solo para saber más tarde que había razones fundamentales por las que no cambiarían. Peor aún, uno podría asumir que ciertos hechos nunca cambiarán (por ejemplo, la longitud de un número de teléfono local o la longitud de un Postleitzahl). Diferenciando lo que no cambiará de las cosas que se pueden mencionar en la descripción de la interfaz tome mucho tiempo. A menudo, un desarrollador se preocupa mucho más por reducir el costo de desarrollo, o el tiempo de comercialización, que reducir el costo de tenencia y mantenimiento. Esto es especialmente cierto cuando el grupo de desarrollo no es responsable del mantenimiento. ¿Por qué un gerente debería gastar dinero de su propio presupuesto para ahorrar dinero a algún otro gerente en el futuro? 

Malos modelos

Los ingenieros de cualquier campo no siempre son innovadores. A menudo toman un producto como modelo haciendo el menor número de cambios posible. La mayor parte de nuestros productos de software, fueron diseñados sin el uso de ocultar información y sirven como malos modelos cuando se usan de esta manera. Ocultación de información innovadora los diseños a menudo se rechazan porque no son convencionales. 

Ampliación de software defectuoso

Dada la gran base de software instalado, la mayoría de los productos nuevos se desarrollan como extensiones a esa base. Si el software antiguo tiene interfaces complejas, el software extendido tendrá el mismo problema. Hay formas de evitar esto, pero no se aplican con frecuencia. Por lo general, si no se ha aplicado la ocultación de información en el software base, las extensiones futuras tampoco la aplicarán 

Las suposiciones a menudo pasan desapercibidas

Mi ejemplo original de ocultamiento de información fue el índice KWIC simple programa descrito en [10]. Este programa todavía se utiliza como ejemplo del principio. Solo una vez alguien ha notado que contiene un defecto causado por no ocultar una suposición importante. Cada módulo del sistema fue escrito con el conocimiento de que los datos comprendían cadenas de strings. 

Esto llevó a un algoritmo de clasificación muy ineficiente porque comparar dos strings, es una operación que se repetiría muchas veces y es relativamente lenta. Se podría obtener una aceleración considerable si las palabras se ordenaran una vez y reemplazadas por un conjunto de números enteros con la propiedad de que si dos palabras son ordenados alfabéticamente, los enteros que los representan tendrán el mismo orden. La clasificación de cadenas de números enteros se puede hacer mucho más rápido que clasificación de cadenas de strings. Las interfaces del módulo descritas en [9] no permiten que esta simple mejora se limite a un módulo. 
Mi error ilustra lo fácil que es distribuir información innecesariamente. Este es un error muy común cuando las personas intentan utilizar el principio de ocultación de la información. Si bien la idea básica es ocultar información que probablemente cambie, a menudo uno puede beneficiarse ocultando otra información también porque permite la reutilización de algoritmos o el uso de algoritmos más eficientes.

Reflejo del entorno del sistema en la estructura del software

Varios "expertos" en diseño de software han sugerido que uno debería reflejar emocionantes estructuras comerciales y estructuras de archivos en la estructura del software. En mi experiencia, esto acelera el proceso de desarrollo de software (tomando decisiones rápidamente) pero conduce a un software que es una carga sobre sus propietarios si intentan actualizar sus estructuras de datos o cambiar su organización.
Reflejar hechos cambiantes en la estructura del software es una violación del principio de ocultamiento de la información. Al determinar los requisitos, es muy importante conocer el entorno, pero rara vez es el "movimiento" correcto para reflejar ese entorno en la estructura del programa. 

"Oh, es una lástima que lo cambiamos"

Incluso cuando la ocultación de información se ha aplicado con éxito, a menudo falla a largo plazo debido a una documentación inadecuada. He visto firmas donde los criterios de diseño no se explicaron al programa de mantenimiento. En estos casos, la estructura del sistema se deterioró rápidamente porque las buenas decisiones de diseño, que no tenían sentido para los encargados del mantenimiento, fueron invertidos. En un caso, señalé las ventajas de una particular estructura de software sólo para ver un rayo de comprensión en los ojos de mi oyente cuando dijo: "Oh, qué lástima que lo cambiamos".

Una estructura modular jerárquica para sistemas complejos

Mis artículos originales usaban sistemas muy pequeños como ejemplos. Sistemas con 5, la mayoría de los programadores pueden comprender 10 o 15 módulos. Sin embargo, al aplicar el principio a un problema con cientos de decisiones de diseño cambiantes, detalles de interfaz y requisitos, reconozco que sería difícil para un programador de mantenimiento tener la visión general necesaria para encontrar partes relevantes del código cuando se necesitaba un cambio. Para superar esto, organizamos los módulos en un jerarquía. Cada uno de los módulos de nivel superior tenía un secreto claramente definido y se dividió en módulos más pequeños utilizando el mismo principio. Esto resultó en una estructura de árbol. El programador puede encontrar los módulos relevantes por seleccionar un módulo en cada nivel y pasar a una descripción más detallada de composición. La estructura y el documento se describen en detalle en [16]. 

¡No hay "niveles de abstracción"!

Algunos autores y profesores han utilizado la frase "niveles de abstracción" cuando se habla de sistemas en los que la abstracción o el ocultamiento de la información ha sido aplicado. Aunque la terminología parece inocente, no está claramente definida y puede dar lugar a errores de diseño graves. El término "niveles" se puede utilizar correctamente sólo si se ha definido una relación libre de bucles [13]. 

Ninguno de los autores que utilizan esta frase han definido la relación, “más abstracto que”, que se necesita para comprender los niveles. ¿Qué haría tal relación realmente qué significa? Es un módulo que oculta la representación de ángulos más (o menos) abstracto que un programa que oculta los detalles de un periférico ¿dispositivo? Si no es así, ¿deberían ambos módulos estar al mismo nivel? Si es así, ¿Qué significa eso? Usar la frase "niveles de abstracción" sin una definición útil la inicialización de la relación definitoria es un signo de confusión o descuido. 

A menudo, la frase "niveles de abstracción" es utilizada por aquellos que no entienden claramente distinguir entre módulos (colecciones de programas) y los programas en sí mismos. Se ha demostrado que es útil organizar programas en un orden jerárquico de estructura basada en la relación "usos" donde A utiliza B significa que B debe estar presente cuando A ejecuta [5]. Sin embargo, como se muestra en [15] no suele ser derecho a poner todos los programas en un módulo al mismo nivel en la jerarquía de "usos". Algunas partes de un módulo pueden utilizar programas a un nivel superior al de otros programas en ese módulo. Se puede encontrar una ilustración de esto en [15]. 

Ideas más recientes: tipos de datos abstractos, OO, componentes

El concepto de ocultamiento de información es la base de tres más recientes conceptos. Los siguientes párrafos los describen brevemente. 

Tipos de datos abstractos

La noción de tipos de datos abstractos corrigió un descuido importante en mi tratamiento original de la ocultación de información. En los ejemplos que motivaron mi trabajo, solo había una copia de cada estructura de datos oculta. Otros (más notablemente Barbara Liskov y John Guttag) reconocieron que podríamos quieren muchas copias de tales estructuras y que esto haría posible para implementar nuevos tipos de datos en los que la implementación (representación más algoritmos) estaba oculto. Pudiendo utilizar variables de estas nuevas, tipos de datos abstractos definidos por el usuario exactamente de la manera en que usamos variables de tipos de datos integrados es obviamente una buena idea. Desafortunadamente, nunca he visto un lenguaje que logró esto. 

Lenguajes orientados a objetos

Un efecto secundario de la aplicación del ocultamiento de información es la creación de nuevos objetos que almacenan datos. Los objetos se pueden encontrar en el sistema THE de Dijkstra [5] y muchos ejemplos posteriores. Se pueden crear objetos que oculten información en cualquier lenguaje; mis primeros experimentos utilizaron versiones primitivas de FORTRAN

Algunos lenguajes posteriores, como Pascal, hicieron las cosas un poco más difícil al introducir restricciones sobre dónde se pueden declarar las variables por lo que es necesario globalizar los datos ocultos. Se descubrió que un familia de lenguajes inicialmente diseñados con fines de simulación, SIMULA [3] y SIMULA 67 [4], resultaron convenientes para este tipo de programación
El concepto de proceso se introdujo para modelar las actividades en curso en el sistema que se está simulando. Cada proceso podía almacenar datos y había formas en que otros procesos envían "mensajes" que alteran estos datos. Así, sobre los criterios que se utilizarán en la descomposición de sistemas en módulos las características de los lenguajes SIMULA se adaptaban bien a la escritura de software que ocultaba datos y algoritmos. Más tarde se encontraron ideas similares en Smalltalk [6]. 

En ambos lenguajes, el concepto de módulo (clase) y proceso estaban enlazados, es decir, los módulos podrían funcionar en paralelo. Esto introduce innecesaria sobrecarga en muchas situaciones. Los lenguajes más recientes han agregado nuevos tipos de funciones (conocidas como herencia) diseñadas para hacer posible el compartir representaciones entre objetos. A menudo, estas funciones se utilizan incorrectamente y dan lugar a una infracción de la ocultación de información y a programas difíciles de cambiar. El efecto más negativo del desarrollo de los lenguajes OO ha sido distraer a los programadores de los principios del diseño

Muchos parecen creer que si escriben su programa en un lenguaje OO, escribirán OO programas. Nada mas lejos de la verdad. 

Diseño orientado a componentes

Los viejos problemas y sueños todavía están con nosotros. Solo las palabras son nuevas. 

Investigaciones futuras: información estándar - Ocultar diseños

Treinta años después de que pude formular el principio de ocultación de información, me queda claro que este es el principio correcto. Además, veo pocas preguntas abiertas sobre el principio. Sin embargo, como se describe en la Sección 8, ocultar información no es fácil. Como se analiza en [2], [14] y [16], diseñar tales módulos requieren mucha investigación. Espero que en el próximo diciembre, veremos investigadores académicos girar en esta dirección (útil) y las revistas que presentan estructuras de módulos e interfaces de módulos para dispositivos, estructuras de datos, clases de requisitos y algoritmos. Ejemplos de Los diseños de módulos reutilizables se pueden encontrar en [17]. 

Referencias

[1] Bartussek, W., Parnas, D.L., “Using Assertions About Traces to Write Abstract
Specifications for Software Modules”, UNC Report No. TR77-012, December 1977;
Lecture Notes in Computer Science (65), Information Systems Methodology, Proceedings
ICS, Venice, 1978, Springer Verlag, pp. 211-236.
Also in Software Specification Techniques edited by N. Gehani & A.D. McGettrick, AT&T
Bell Telephone Laboratories, 1985, pp. 111-130 (QA 76.6 S6437).
Reprinted as Chapter 1 in item .
[2] Britton, K.H., Parker, R.A., Parnas, D.L., “A Procedure for Designing Abstract Interfaces for
Device Interface Modules”, Proceedings of the 5th International Conference on Software
Engineering, 1981.
[3] Dahl, Ol.-J., Nygaard, K., “SIMULA - An Algol-based Simulation Language”,
Communications of the ACM, vol. 9, no. 9, pp. 671-678, 1966.
[4] Dahl, O-J., et al., “The Simula 67 Common Base Language”, 1970, Norwegian Computing
Centre, publication S22.
[5] Dijkstra, E.W., “The Structure of the THE Multiprogramming System”, Communications of
the ACM, vol. 11, no. 5, May 1968.
[6] Goldberg, A., “Smalltalk-80: The Interactive Programming Environment”, Addison-
Wesley, 1984.
[7] Hoffman, D.M., Weiss, D.M. (eds.), “Software Fundamentals: Collected Papers by David L.
Parnas”, Addison-Wesley, 2001, ISBN 0-201-70369-6.
[8] Parnas, D.L., “Information Distributions Aspects of Design Methodology”, Proceedings of
IFIP Congress ‘71, 1971, Booklet TA-3, pp. 26-30.
[9] Parnas, D.L., “A Technique for Software Module Specification with Examples”,
Communications of the ACM, vol. 15, no. 5, pp. 330-336, 1972;
Republished in Yourdon, E.N. (ed.), Writings of the Revolution, Yourdon Press, 1982,
pp. 5-18:
in Gehani, N., McGettrick, A.D. (eds.), Software Specification Techniques, AT&T Bell
Telephone Laboratories (QA 76.7 S6437), 1985, pp. 75-88 .
[10] Parnas, D.L., “On the Criteria to be Used in Decomposing Systems into Modules”,
Communications of the ACM, vol. 15, no. 12, pp. 1053-1058, 1972;.
Republished in Laplante P. (ed.), Great Papers in Computer Science, West Publishing Co,
Minneapolis/St. Paul, 1996, pp. 433-441.
Translated into Japanese - BIT, vol. 14, no. 3, pp. 54-60, 1982.
Republished in Yourdon, E.N. (ed.), Classics in Software Engineering, Yourdon Press, 1979,
pp. 141-150.
Reprinted as Chapter 7 in item [7].
[11] Parnas, D.L., “A Course on Software Engineering Techniques”, in Proceedings of the ACM
SIGCSE, Second Technical Symposium, 24-25 March 1972, pp. 1-6.
[12] Parnas, D.L., “Some Conclusions from an Experiment in Software Engineering Techniques”,
Proceedings of the 1972 FJCC, 41, Part I, pp. 325-330.
[13] Parnas, D.L., “On a ‘Buzzword’: Hierarchical Structure”, IFIP Congress ‘74, North-Holland,
1974, pp. 336-339.
Reprinted as Chapter 8 in item [7].
[14] Parnas, D.L., “Use of Abstract Interfaces in the Development of Software for Embedded
Computer Systems”, NRL Report No. 8047, June 1977;
Reprinted in Infotech State of the Art Report, Structured System Development, Infotech
International, 1979.
[15] Parnas D.L., “Designing Software for Ease of Extension and Contraction”, IEEE
Transactions on Software Engineering, Vol. SE-5 No. 2, pp. 128-138, March 1979;
In Proceedings of the Third International Conference on Software Engineering, May 1978,
pp. 264-277.
[16] Parnas, D.L., Clements, P.C., Weiss, D.M., “The Modular Structure of Complex Systems”,
IEEE Transactions on Software Engineering, Vol. SE-11 No. 3, pp. 259-266, 1985;
In Proceedings of 7th International Conference on Software Engineering, March 1984,
408-417;
Reprinted in Peterson, G.E. (ed.), IEEE Tutorial: “Object-Oriented Computing”, Vol. 2:
Implementations, IEEE Computer Society Press, IEEE Catalog Number EH0264-2,
ISBN 0-8186-4822-8, 1987, pp. 162-169;
Reprinted as Chapter 16 in item [7].
[17] Parker, R.A., Heninger, K.L., Parnas, D.L., Shore, J.E., “Abstract Interface Specifications for
the A-7E Device Interface Modules”, NRL Report 4385, November 1980.
[18] Parnas D.L., Wang, Y., “Simulating the Behaviour of Software Modules by Trace Rewriting
Systems”, IEEE Transactions of Software Engineering, Vol. 19, No. 10, pp. 750 - 759, 1994.
[19] Roubine, O., Robinson, L., “Special Reference Manual” Technical Report CSL-45, Computer
Science Laboratory, Stanford Research Institute, August 1976.
[20] Robinson, L., Levitt K.N., Neumann P.G., Saxena, A.R., “A Formal Methodology for the
Design of Operating System Software”, in Yeh, R. (ed.), Current Trends in Programming
Methodology I, Prentice-Hall, 1977, pp. 61-110.
[21] Robinson, L., Levitt K.N., “Proof Techniques for Hierarchically Structured Programs”,
Communications of the ACM, Vol. 20, No. 4, pp. 271-283, 1977.
[22] Robinson, L., Levitt K.N., Silverberg, B.A.,“The (HDM) Handbook”, Computer Science
Laboratory, SRI International, June 1979.

DSN_XP y la noción de tiempo compartido

Tiempo compartido


Uno de los recuerdos de los inicios de programación en Ecuador trata justamente de la noción de tiempo compartido, entendiéndose como la política que permitía que los estudiantes pudieran correr sus programas escritos mediante las tarjetas perforadas ya sea en Fortran o en Cobol.

Para nuestro comprender, es importante resaltar en la historia del software, los impactos que se dieron en la sociedad por visiones como las de McCarthy, a quien damos nuevamente nuestra gratitud por su trabajo.

Reminiscencias sobre la teoría del tiempo compartido

Traducción al español de este artículo.

John McCarthy, Universidad de Stanford

1983 invierno o primavera

Recuerdo que pensé en tiempo compartido en el momento de mi primer contacto con las computadoras y me sorprendió que ese no fuera el objetivo de IBM y de todos los demás fabricantes y usuarios de computadoras. Esto podría haber sido alrededor de 1955.

Por tiempo compartido, me refiero a un sistema operativo que permite a cada usuario de una computadora comportarse como si tuviera el control exclusivo de una computadora, no necesariamente idéntica a la máquina en la que se ejecuta el sistema operativo. Christopher Strachey bien pudo haber tenido razón al decir en su carta a Donald Knuth que el término ya se usaba para el tiempo compartido entre programas escritos para ejecutarse juntos. Esta idea ya se había utilizado en el sistema SAGE.  No sé cómo se implementó este tipo de tiempo compartido en SAGE. ¿Cada programa tenía que asegurarse de volver a un programa de sondeo de entrada o hubo interrupciones? ¿Quién inventó las interrupciones de todos modos? Pensé en ellos, pero no creo que le mencioné la idea a nadie antes de escucharlo de otras fuentes.

Mis primeros intentos de hacer algo sobre el tiempo compartido fueron en el otoño de 1957 cuando llegué al Centro de Computación del MIT con una beca de la Fundación Sloan de Dartmouth College. Inmediatamente me quedó claro que el tiempo compartido del IBM 704 requeriría algún tipo de sistema de interrupción. Era muy tímido para proponer modificaciones de hardware, especialmente porque no entendía la electrónica lo suficientemente bien como para leer los diagramas lógicos. Por lo tanto, propuse la mínima modificación de hardware que se me ocurrió. Esto implicó instalar un relé para que el 704 pudiera ponerse en modo de captura mediante una señal externa. También se propuso conectar los interruptores de detección de la computadora en paralelo con relés que pudieran ser operados por un Flexowriter (una especie de teletipo basado en una máquina de escribir IBM).

Cuando la máquina entraba en modo de captura, la próxima vez que la máquina intentaba ejecutar una instrucción de salto (entonces llamada transferencia) se producía una interrupción en una ubicación fija. La interrupción ocurriría cuando el Flexowriter hubiera configurado un carácter en un búfer de relé. El programa de interrupción leería entonces el carácter de los interruptores de detección dentro de un búfer, probaría si el búfer estaba lleno y, en caso contrario, volvería al programa interrumpido. Si el búfer estaba lleno, el programa almacenaría el programa actual en el tambor y leería un programa para manejar el búfer.

Se acordó (creo que hablé solo con Dean Arden) para instalar el equipo y creo que se obtuvo permiso de IBM para modificar la computadora. Se logró que el conector que se instalará en la computadora.

Sin embargo, en este momento nos enteramos del "paquete en tiempo real" para el IBM 704. Este RPQ (solicitud de cotización de precio era la jerga de IBM para una modificación de la computadora cuyo precio no estaba garantizado), que se alquilaba por $ 2,500 por mes ha sido desarrollado a petición de Boeing con el fin de permitir que el 704 acepte información de un túnel de viento. Habría estado involucrado algún elemento del tiempo compartido ordinario, pero no buscamos contacto con Boeing. De todos modos se acordó que el paquete de tiempo real, que implicaba la posibilidad de interrumpir después de cualquier instrucción, sería mucho mejor que simplemente poner la máquina en modo de captura. Por lo tanto, nos comprometimos a suplicar a IBM por el paquete en tiempo real. La reacción inicial de IBM fue favorable, sin embargo, tomó mucho más tiempo el obtener el paquete de tiempo real, quizás un año o dos.

Luego se acordó que alguien, tal vez Arnold Siegel, diseñaría el hardware para conectar un Flexowriter a la computadora y luego se diseñaría una instalación con tres de ellos. Siegel diseñó y construyó el equipo, el sistema operativo se modificó adecuadamente (no recuerdo quién lo hizo) y se llevó a cabo una demostración de LISP en línea para una reunión de Afiliados Industriales del MIT. Esta demostración que planifiqué y realicé, tenía al público en una sala de conferencias del cuarto piso y a mí en la sala de computadoras y en un sistema de televisión de circuito cerrado alquilado. Steve Russell, que trabajaba para mí, organizó los detalles prácticos, incluido un ensayo. 

Esta demostración se denominó robo de tiempo y se consideró como un mero preludio de un tiempo compartido adecuado. Se trataba de un programa fijo en la parte inferior de la memoria que recopilaba caracteres del Flexowriter en un búfer mientras se ejecutaba un trabajo por lotes normal.  Solo después de ejecutar cada trabajo, un trabajo que se ocuparía de leer desde el tambor los caracteres introducidos. este trabajo haría lo que pudiera, hasta que se quisieran más entradas y luego dejaría que el sistema operativo regresara al flujo por lotes. Esto funcionó para la demostración, porque a ciertas horas, el Centro de Computación del MIT operaba un flujo por lotes con un límite de tiempo de un minuto en cualquier trabajo. 

En el momento de esta demostración, Herbert Teager llegó al MIT como profesor asistente de Ingeniería Eléctrica y expresó interés en el proyecto de tiempo compartido. Algunas de las ideas sobre el tiempo compartido se superponían a algunas ideas que había tenido en su trabajo anterior, pero no recuerdo cuáles eran. Philip Morse, el director del Centro de Computación, me preguntó si estaba de acuerdo en entregar el proyecto de tiempo compartido a Teager, ya que la inteligencia artificial era mi principal interés. Estuve de acuerdo con esto y Teager se comprometió a diseñar los tres sistemas Flexowriter. No estoy seguro de que alguna vez se haya completado. Se presentó una propuesta de apoyo de tiempo compartido a NSF y se obtuvo dinero. No recuerdo si esto precedió a Teager y no, no recuerdo qué papel tuve yo en prepararlo o lo que él hizo después de su llegada. Este debería ser un documento importante, porque contendrá la concepción de ese año y la justificación del tiempo compartido.

Además de eso, se convenció a IBM para que hiciera modificaciones sustanciales en el IBM 7090 para instalarlo en el Centro de Computación del MIT. Estas incluyeron protección y reubicación de la memoria y 32,768 palabras adicionales de memoria para el sistema de tiempo compartido. Teager fue el principal especificador de estas modificaciones. Recuerdo mi sorpresa cuando IBM aceptó sus propuestas. Supuse que la reubicación y la protección de la memoria ralentizarían enormemente el direccionamiento de la computadora, pero resultó no ser el caso.

Los planes de Teager para tiempo compartido eran ambiciosos y, a muchos de nosotros, nos pareció vago. Por lo tanto, Corbato adoptó una solución "provisional" utilizando parte del apoyo que se había obtenido de NSF para el trabajo de tiempo compartido. Este sistema se demostró en algún momento de 1962, pero no se puso en funcionamiento con regularidad. Eso no fue realmente posible hasta que el soporte de ARPA para el proyecto MAC permitió comprar un IBM 7090 por separado.

Alrededor de 1960 comencé a consultar en BBN sobre inteligencia artificial y expliqué mis ideas sobre el tiempo compartido a Ed Fredkin y JCR Licklider. Fredkin, para mi sorpresa, propuso que el tiempo compartido era factible en la computadora PDP-1. Esta fue la primera computadora de DEC y BBN tenía el prototipo. Fredkin diseñó la arquitectura de un sistema de interrupción y diseñó un sistema de control para el tambor para permitir su uso en un modo de intercambio muy eficiente. Convenció a Ben Gurley, el ingeniero jefe de DEC, para que construyera este equipo. Se planeó pedir apoyo a los NIH, debido a las posibles aplicaciones médicas de las computadoras de tiempo compartido, pero antes de que se pudiera escribir la propuesta, Fredkin dejó BBN. Me hice cargo técnico del proyecto como consultor de un día a la semana, y Sheldon Boilen fue contratado para hacer la programación. Rediseñé el sistema de extensión de memoria propuesto por DEC y los convencí de que construyeran el sistema modificado en lugar de los dos sistemas que ofrecían, pero que afortunadamente no habían construido. También supervisé a Boilen.

Poco después de que se emprendiera este proyecto, DEC decidió entregar un PDP-1 al Departamento de Ingeniería Eléctrica del MIT. Bajo el liderazgo de Jack Dennis, esta computadora se instaló en la misma habitación que la computadora transistorizada experimental TX-0 que se había retirado del Laboratorio Lincoln cuando se construyó la TX-2. Dennis y sus alumnos se comprometieron a crear un sistema de tiempo compartido. El equipo era similar, pero se les dio menos memoria que la que tenía el proyecto BBN. No hubo mucha colaboración.

Lo que recuerdo es que el proyecto BBN se terminó primero en el verano de 1962, pero quizás Corbato recuerde demostraciones anteriores de CTSS. Me fui a Stanford en el otoño de 1962, y no había visto CTSS, y creo que tampoco había visto funcionar el sistema de Dennis. BBN no operó el primer sistema y ni siquiera corrigió los errores. Tenían pocos usuarios de computadoras y estaban contentos de continuar con el sistema mediante el cual los usuarios se registraban para toda la computadora. Realmente emprendieron un proyecto de seguimiento mucho más grande que involucraba un PDP-1 de tiempo compartido que se instaló en el Hospital General de Massachusetts, donde no fue un éxito. La computadora era inadecuada, había errores de hardware y software, y faltaban programas de aplicación, pero principalmente el proyecto fue prematuro.

Al mismo tiempo que se desarrollaban CTSS, el sistema BBN y los sistemas del Departamento de EE, el MIT había comenzado a planificar un sistema informático de próxima generación. La dirección del MIT evidentemente comenzó esto como un ejercicio ordinario de planificación universitaria y nombró un comité de alto nivel formado por Philip Morse, Albert Hill y Robert Fano para supervisar el esfuerzo. Sin embargo, los científicos informáticos reales estaban convencidos de que era necesaria una revolución en la forma en que se usaban las computadoras, en el tiempo compartido. El comité de nivel inferior estaba presidido por Teager, pero después de que sus ideas chocaran con las de todos los demás, el comité se reconstituyó conmigo como presidente. El desacuerdo se centró en cuán ambicioso ser y si optar por una solución provisional. Teager quería ser muy ambicioso, pero el resto de nosotros pensamos que sus ideas eran vagas y quería que el MIT adquiriera una computadora IBM 7030 (Stretch) como solución provisional. Al final resultó que, adquirir un Stretch habría sido una buena idea.

Nuestro segundo informe al MIT propuso que el MIT envíe una solicitud de propuestas a los fabricantes de computadoras. Sobre la base de las respuestas, luego pediríamos el dinero al Gobierno. La RFP se redactó, pero el MIT se estancó quizás por dos razones. La primera razón fue que nuestras estimaciones de costos iniciales eran muy grandes por razones de conservadurismo. En segundo lugar, IBM le pidió al MIT que esperara y dijo que haría una propuesta para satisfacer las necesidades del MIT a un costo mínimo o nulo. Desafortunadamente, el diseño de 360 ​​tomó más tiempo de lo esperado por la gerencia de IBM, y durante ese tiempo, las relaciones entre MIT e IBM se volvieron muy tensas debido a la demanda de patente sobre la invención de la memoria de núcleo magnético.

Como parte del puesto, el presidente Stratton propuso un nuevo estudio con un estudio de mercado más completo para establecer la demanda de tiempo compartido entre los usuarios de computadoras del MIT. Consideraba que esto era análogo a tratar de establecer la necesidad de palas de vapor mediante estudios de mercado entre los excavadores de zanjas y no quería hacerlo. Aproximadamente en ese momento George Forsythe me invitó a regresar a Stanford con la intención de construir un Departamento de Ciencias de la Computación, y estaba feliz de regresar a California.

En todo esto, no hubo mucha publicación. Escribí una nota a Morse con fecha del 1 de enero de 1959 proponiendo que compartiéramos nuestro esperado "IBM 709 transistorizado". Se ha sugerido que la fecha era errónea y debería haber sido 1960. No recuerdo ahora, pero creo que si el memo se hubiera escrito a fines de 1959, se habría referido al 7090, porque ese nombre para entonces estaba vigente. En ese memo, dije que la idea de compartir el tiempo no era especialmente nueva. No sé por qué dije eso, excepto que no quería molestarme en distinguirlo de lo que se hacía en el sistema SAGE con el que no estaba muy familiarizado.

La mayor parte de mi argumentación a favor del tiempo compartido fue oral, y cuando me quejé de que Fano y Corbato atribuían a Strachey el tiempo compartido en su artículo de 1966 en Scientific American, Corbato se sorprendió al encontrar mi memo de 1959 en los archivos. Su corrección en Scientific American fue incorrecta, porque supusieron que Strachey y yo habíamos desarrollado la idea de forma independiente, mientras que dar a cada usuario acceso continuo a la máquina no era idea de Strachey en absoluto. De hecho, ni siquiera le gustó la idea cuando se enteró.

Teager y yo preparamos un resumen conjunto para una reunión de ACM poco después de su llegada, y di una conferencia en una serie del MIT llamada Management and the Computer of the Future. En esta conferencia me referí al artículo de Strachey "Tiempo compartido de grandes computadoras rápidas" presentado en el Congreso IFIP de 1959 en París. Había leído el periódico descuidadamente y supuse que quería decir lo mismo que yo. Como señaló posteriormente, se refería a algo bastante diferente que no involucraba a un gran número de usuarios, cada uno comportándose como si tuviera una máquina para él solo. Según recuerdo, se refirió principalmente a los programas fijos, algunos de los cuales estaban ligados al cálculo y otros ligados a la entrada-salida. Mencionó la depuración como una de las actividades de tiempo compartido, pero creo que su concepto involucró a una persona depurando mientras que los otros trabajos eran del tipo convencional.

Mi memorando de 1959 anunciaba que los usuarios generalmente obtendrían la ventaja de la depuración en línea. Sin embargo, no dijo nada sobre cuántas terminales se necesitarían y dónde se ubicarían. Creo que los imaginaba numerosos y en las oficinas de los usuarios, pero no puedo estar seguro. Hacer referencia a un "intercambio" sugiere que tenía en mente muchos terminales. Ahora no puedo imaginar cuál fue el efecto en el lector de mi incapacidad para ser explícito sobre este punto. Me temo que estaba tratando de minimizar la dificultad del proyecto.

El principal error técnico de mis ideas de 1959 fue una subestimación de la capacidad informática necesaria para compartir el tiempo. Todavía no entiendo a dónde va todo el tiempo de la computadora en las instalaciones de tiempo compartido, y nadie más lo sabe.

Además de la propuesta NSF del MIT, debería haber algunas cartas a IBM y tal vez algunos documentos internos de IBM sobre la propuesta, ya que pusieron más de un millón de dólares en equipos. Gordon Bell habla de que DEC está tomando el tiempo compartido en el libro de Bell y Newell, pero no recuerdo que hablen del papel de Ben Gurley. Fredkin y quizás Alan Kotok lo sabrían.

Después de llegar a Stanford en 1962, organicé otro proyecto de tiempo compartido PDP-1. Este fue el primer sistema de tiempo compartido basado en terminales de pantalla. Se usó hasta 1969 o 1970 para el trabajo de Suppes sobre instrucción asistida por computadora. [Nota de 1994: luego fue donado al Instituto Indio de Tecnología en Kanpur, donde se utilizó durante unos 10 años].