Ouracademy

La historia de la Ingenieria de software

Una resumen del articulo realizado por Grady Booch por el aniversario de los 50 años de la Ingeniería de software: The History of Software Engineering

¿Como se inició la ingenieria del software, cual es el origen del término, exactamente qué es, que eventos marcaron e hicieron que evolucione, que debo hacer como ingeniero de software? Este post ayuda a aclarar a todas estas interrogantes, gracias al excelente articulo de Grady Booch, uno de los creadores de UML.

Puedes ver el Webinar original de Grady Booch en:

Hace no menos de 100 años las computadoras no existian, eran las personas que se encargaban de realizar el procesamiento manualmente, en especial las mujeres jugaban un rol fundamental en ello. Por ejemplo, en los años 1800s, en Harvard, las mujeres se encargaban de muchas de los calculos matematicos usados en la astronomia, a este equipo se le conocio como "Computadoras de Harvard", aunque no existian computadoras digitales en sí.

Computadoras de Harvard

Sin embargo el término "digital" aparecio a mediados del año 1942 cuando George Stibitz aplico las ideas de George Boole a los dispositivos electromecanicos. El término "Software" vino una década despues, gracias a John Tukey. Pero y que del término "ingenieria de software"?

Origen del término 'Ingenieria de software'

Muchas personas sugieren que fue Friedrich Bauer quien acuño este termino en la conferencia de ingeniería de software de la OTAN en 1968, otros creen que fue Anthony Oettinger, el cual uso este termino en 1966 para hacer referencia a la distincion entre ciencias de la computacion y el desarrollo de sistemas intensivos de software. Sin embargo, años atrás, en la edición de junio de 1965 de la revista 'Computers and Automation', apareció un anuncio de trabajo buscando un "ingeniero de sistemas de software".

Pero no fueron ninguno de los anteriores, Grady Booch sostiene que todos sus datos apuntan a que Margaret Hamilton usó por primera vez el término 'ingenieria de software' para distinguir su trabajo de la ingeniería de hardware mientras trabajaba en un programa espacial, el famoso proyecto Apollo y el Skylab, entre 1963 y 1964.

Ingeniería de software vs Ciencias de la computación

La diferencia entre ellas, es parecida a la diferencia entre la ingeniería química y química: ambas son útiles y válidas; ambas tienen sus conjuntos particulares de prácticas; ambas son cosas muy diferentes. La ingeniería de software es un arte y una ciencia, es el arte de lo práctico.

La ingeniería en todos los campos tiene que ver con la resolución de fuerzas. Podemos pensar sobre fuerzas en una materia que permitan mantener el equilibrio de tal, en ingeniería de software, también se debe equilibrar cosas, estas son: el costo, el cronograma, la complejidad, la funcionalidad, el rendimiento, la confiabilidad y la seguridad, así como las fuerzas legales y éticas. Booch explica muy bien con lo mencionado anteriormente que es la ingenieria de software, y es fácil deducir que debemos hacer como ingeniero de software, debemos mantener el equilibrio, hacer que el software que hagamos no caiga al lado oscuro.

La tecnología ha cambiado mucho a lo largo del tiempo, sin embargo los fundamentos de la ingeniería aún siguen siendo verdad, aunque como veremos, cada época descubre nuevas verdades acerca de la ingeniería de software...

Linea de tiempo de la ingenieria de software

Del siglo XIX al XX: computadoras humanas

El mundo de la computación tiene raices muy antiguas, desde Ada Lovelace quien quizá fue la primera persona en comprender que la programación era algo importante (mucho antes que existiera cualquier computadora en sí) al gran aporte que dio George Boole a la lógica. Además del rol de las "Computadoras humanas" (que vimos antes) - y que sorprendentemente se organizaban de una manera similar a las las prácticas contemporáneas de desarrollo ágil , y que con el pasar los años (el siglo XX), y que a medida que los problemas de computación eran más grandes y con el apoyo de dispositivos mecánicos para hacer calculos, se organizaban en filas, donde cada fila se encargaba de un calculo y se lo pasaba a la siguiente fila, organizandose en forma de lo que conocemos, en arquitectura, como pipelines.

De la Gran Depresión a la Segunda Guerra Mundial: el nacimiento de la computadora electrónica

En esos tiempos el mundo industrial, como ahora, buscaba la eficiencia en sus procesos, muchas de las ideas de Frederick Taylor emerger. Además los Gilbreth promocionaron el concepto de diagramas de proceso, los predecesores a los diagramas de flujo.

Pero la gran Depresión aparecio, con el fin de combatirla, el presidente Roosevelt, lanzo muchos proyectos. Uno de ellos el proyecto de las Tablas Matematicas, liderado por Gertrude Blanche, quien desarrollaría muchas prácticas para hacer computación manual (Computadoras humanas!). En 1940, Wallace Eckert, en base a ello desarrolaría la 1ra metodología de computación.

Mientras que en Europa los aires de que sucedería una guerra estaban ocurriendo, el mundo de la computación digital habia sido iniciada cuando George Stibitz aplico las ideas de logica de George Boole para construir el primer sumador digital hecho a base de réles electromecanicos. Tiempo después nace una nueva forma de pensamiento: el concepto de un ordenador electrónico programable, siendo una de las primeras el famoso ENIAC.

ENIAC

Grace Hooper; muy en el espíritu de Ada Lovelace, quien tenia la idea de que el software podría ser una cosa en sí misma, se percato que se podría crear un lenguaje más cercano a los humanos, un lenguaje de más alto nivel, lejano al hardware. De hecho, uno podría usar su computadora para traducir estas expresiones de alto nivel al lenguaje de máquina, esto marcaría el inicio del compilador. Más importante, en plena Segunda Guerra Mundial, Alan Touring, daría las bases de la computación moderna, de donde Tommy Flowers pondría en práctica estas bases para construir el famoso Colossus.

Después de la Segunda Guerra Mundial: crecimiento de la computación

Al final de la Segunda Guerra Mundial, empezabamos a ver la informática aplicada a dominios problemáticos más allá de la guerra. Herman Goldstine, en base a las ideas de los Gilbreth, junto a John von Neumann, desarrollarían los diagramas de flujo. Maurice Wilkes, David Wheeler y Stanley Gill crerían el concepto de subrutinas, el poder de descomponer algoritmos. John Backus, en base al trabajo de Grace Hooper, desarrolaría el famoso lenguaje de alto nivel Fortran, quien dominaría el mundo por muchos años.

El mundo comercia empezaba a usar las computadoras, quienes daban nuevas oportunidades de crecimiento. La 1ra computadora comercial fue de Lyons Electronic Office (LEO). John Pinkerton, el chief engineer de LEO, se dio cuenta de que muchas tareas de programación se volvian a repetir al desarrolar las computadoras, el junto estas tareas en librerías, formando lo que hoy conoceriamos como Sistemas Operativos y frameworks. Con el famoso System/360 de IBM, se dio la idea de separar el software del hardware, y con ello ahora las personas podrían desarrollar separadamente software. No solo eso, con ello personas como Dina St. Johnson, desarrollarían las primeras empresas de software, otras empresas podrían externalizar el desarrollo de software a ellas!. Incluso una organización SHARE, la llevo al siguiente nivel, al brindar una plataforma para desarrollar software que ellos no controlaban, es decir, fueron los precursores del movimiento open source.

El ascenso de la guerra fría: madurez de la computación y el nacimiento de la ingeniería de software

La Guerra Fría generó otro conjunto de fuerzas que llevaron a la ingeniería de software a la madurez. Con el fin de defenderse ante la Union Sovietica, el sistema SAGE se desarrollo, este daría grandes aportes al mundo del software: el desarrollo de interfaces humano-computador y la toma de conciencia de desarrollar software en ambientes distribuidos. Es decir, desarrollar software se habia vuelto un problema central y complejo.

En los años 60s, era notorio el avance del software comercial, que se estaban desarrollando sistemas complejos (como el SAGE y en general por la industria espacial), es en este contexto donde Margaret Hamilton acuñó el término “ingenieria de software” y en el que la OTAN declaró que había una "crisis del software".

OTAN software crisis

Claro, en esas epocas las computadoras eran muy caras, existian pocos programadores, pero las cosas cambiarían con el ascenso de las microcomputadoras. Con este cambio es que nace el insight de que la ingeniería de software, no solo era un proceso técnico sino tambien muy humano, los principios básicos de la gestión de proyectos serían dados por Fred Brooks, descritas en The Mythical Man Month.

De los años sesenta a la Años ochenta: la maduración

En esta etapa se introdujo la programacion modular junto con conceptos de acoplamiento y cohesión como mecanismos de composicion de algoritmos, Edsger Dijkstra adoptó un enfoque formal y nos dio la idea de la programación estructurada, mucho despúes Ole Dahl y Kristen Nygaard, crearían Simula, el 1er lenguaje de programación orientada a objetos. Las ideas de Barbara Liskov sobre tipos Abstractos de Datos y el modelado de entidad-relación por Peter Chen y muchas más conceptos, aportarían en esta época, y con ello se generaron las primeras metodologías de ingeniería de software, por ejemplo, Winston Royce desarrollaría el famoso proceso en cascada (muy aparte de ello, el apoyaría la idea de desarrollo iterativo y de prototipos), y los métodos de análisis y diseño estructurado como los de Ed Yourdon, Tom DeMarco, entre muchos otros.

Además de los muchos otros trabajos como el de John Backus (sobre functional programming), Leslie Lamport (distributed computing), entre otros.

Los años ochenta y más adelante: la edad de oro

Debido a los crecientes problemas de calidad del software, el auge de los sistemas intensivos de software, la globalización del software y el desarrollo de sistemas distribuidos, nuevos enfoques fueron necesarios. Es aqui cuando las ideas de Ole Dahl y Kristen sobre programacion orientado a objetos (OO) dio lugar a lenguajes de programación como Smalltalk, C with Classes (posteriormente renombrado a C++), Ada, y muchos otros.

Los metódos de análisis y diseño estructurado (como los de Ed Yourdon) se adaptaron al enfoque OO, además de nuevas ideas de diseñar OO, como los de Rebecca Wirfs-Brock sobre Responsability Driven Design, Stephen Mellor sobre Modelos de Dominio Conceptuales, y las notaciones para modelar objetos como el método Booch, Objectory, OMT, estos últimos 3 se unirían para formar UML.

UML

Nacerían entre otras:

  • El modelo de vistas 4+1 por Philippe Kruchten
  • El modelo espiral del desarrollo de software y muchos aportes a la economia de desarrollar software por Barry Boehm
  • Métricas de software por Capers Jones
  • El modelo formal clean-room por Harlan Mills
  • La programación literaria por Donald Knuth
  • El modelo de madurez de capacidades (CMM) por Watts Humphrey
  • Modelos de component-based engineering

Los años noventa y el milenio: la era de las disrupciones

Y el boom de Internet había llegado al mundo de los negocios, de pronto ahora había una nueva plataforma, todo ahora pasaría a ser distribuido! Los clientes tendrían acceso directo desde cualquier parte del mundo a los sistemas y los sistemas se interconectarían con otros programas externos. Todo ello trajo que la Integración Continua y el desarollo Iterativo sea la forma principal de desarollo, el mundo de patrones se lanzaría a la fama con el famoso libro de la Banda de los Cuatro (Gang of Four), y se expandiría a otras áreas como la organización (ver los trabajos de Jim Coplien), de arquitectura (Mary Shaw y David Garlan).

Un cambio parecido pasaría con la llegada de los dispositivos moviles, del mundo de servicios web se iria a un mundo de microservicios, y el crecimiento de infraestructuras Web aparecio y pronto sería la plataforma por defecto gracias a compañias como Amazon, Google, Microsoft, IBM, Facebook, entre otras. Y claro nuevos lenguajes vienen y van: Javascript, Python, Swift, Rust, ... y lo mismo sigue sucediendo con los frameworks: Bootstrap, JQuery, React, MongoDB, Flutter - y seguira dandosé.

Y claro, en los años 90, aparecieron los métodos ágiles, aunque en 1986, Hirotaka Takeuchi y Ikujiro Nonaka acuñaran el término “Scrum” como un enfoque de desarrollo de productos, Ken Schwaber y Jeff Sutherland lo adaptarían al mundo del software, Kent Beck, casi en la misma época lanzaría eXtreme Programming y en sí muchas nuevas métodos y prácticas aparecerían como la técnica de Refactorizar (popularizada por Martin Fowler) que se unirían bajo un mismo término paraguas "Agile" en Febrero del 2001.

Agile Manifesto

Una nueva época dorada en la Ingeniería de software había aparecido, Git y GitHub nacieron; Joel Spolsky creo Stack Overflow; Andrew Shafer y Patrick Debois el término DevOps; el mundo del Internet de las Cosas sigue emergiendo. Y las plataformas de e-learning se expandieron, cualquiera puede programar!

La década que viene: Big Data y la otra IA

Actualmente estamos en un nuevo cambio, aunque la IA ha existido decádas, ella está influyendo el mundo de la ingenieria de software de una forma distinta a como antes. Todo ello gracias al crecimiento de la data de todas partes (imagenes, videos, audio) y el poder de la computación!, el Big Data, ha hecho posible el uso de la IA. Y ya hemos visto grandes hitos, como el de AlphaGo.

Sin embargo, como industria recien estamos viendo como impactará la IA a este campo, ¿Qué ciclo de vida es el mejor para estos componentes que aprenden por si sola? ¿La gestión de la configuración como encaja cuando la data es más importante que la red neuronal en sí? ¿Como se diseña estos tipos de sistemas donde partes de las operaciones no podemos explicar o completamente confiar?

Agregale a estos problemas, los cambios que traerán las nuevas tecnologías como la computación cúantica, la Realidad Aumentada, el Internet de las Cosas...

La ingenieria de software ha crecido y cambiado mucho, sin embargo los fundamentos permanecen: desarrollar abstracciones (de Lenguaje máquina a alto nivel, de subrutinas a componentes y de componentes a servicios); separar intereses; distribuir responsibilidades (sea en Sistemas Operativos, en la gestión de proyectos o al diseñar software); buscar simplicidad. Y seguiran habiendo cambios pero los aspectos fundamentales siempre permanecerán.

Cambios y revisiones:

31/08/2019: initial SE history article completed version

31/08/2019: initial review until human computers section

Si te fue útil este artículo, por favor compártelo. Apreciamos los comentarios y el aliento.
Compartelo por:

Quiza te pueda interesar...

3 amigos y la historia de UML

Una breve historia de UML por parte de 3 amigos, el porqué del termino Unificado y como esta historia se repite con los metodos agiles, lean y los lenguajes de programación.

Más control de versiones

Si usamos Git, SVN y varios control de versiones al desarrollar software, ¿porqué no aplicamos lo mismo en otras áreas, en nuevas aplicaciones?

"La fábrica" vs "el estudio"

¿Cuántos de nosotros hemos trabajado en una "fábrica" de software este término "fábrica" quizá sea un malentendido.