Ingenieria de software 50 años despues
Un analisis de la evolución de la ingeniería de software hasta el punto de diferentes áreas el día de hoy
Camilo Niño
10/29/20247 min leer
En el año 1972 el científico computacional alemán Friedrich L. Bauer definió la Ingeniería de Software como: “El establecimiento y uso de principios de ingeniería para obtener software que es confiable y trabaje en máquinas reales eficientemente”, tal vez esta fue la primera aproximación conceptual de esta nueva rama de la ingeniería. Otras aproximaciones se dieron para considerar la elaboración del software como ingeniería, por ejemplo se celebraron las conferencias sobre Ingeniería de Software NATO en el año 1968, en cuyo evento se discutieron principios y problemáticas que serían relevantes en las siguientes décadas.
Los paradigmas y tiempos han cambiado mientras los proyectos de software siguen incrementándose, pasando por los problemas generados por la así llamada “Crisis del software”, donde la mayoría de los proyectos en los años 70 y 80 incurrieron en retrasos y sobrecostos dada la manera artesanal que se realizaba el trabajo, dejando muy mal parada la reputación de los desarrolladores. En esa época muchas respuestas prometieron ser la solución definitiva a estos problemas, sin que realmente una de ellas lo fuera. Muchos años después, aún no se puede tener una práctica de ingeniería bien definida, consecuentemente estas inquietudes no han sido totalmente resueltas, probablemente porque los problemas no se abordan de manera estructurada.
Lejos quedó aquel enfoque egoísta de pensar en una única solución, ahora muchas técnicas han cambiado para proponer un enfoque más sistémico, con la complejidad que amerita un producto de software. Prueba de ello es que hoy en día la tecnología apoya más que nunca la aplicación de técnicas confiables y sobre todo medibles para hacer software, sea por medio de metodologías de gestión, nuevos conceptos, paradigmas de desarrollo o herramientas tecnológicas hechas en sí mismas de software.
Debemos pensar que al igual que cualquier ciencia, está evoluciona de acuerdo al comportamiento de la sociedad y las necesidades de las empresas que son direccionadas por el mercado y políticas de gobierno. Así es que hereditariamente los esfuerzos del pasado generan una base de conocimiento que se abstrae cada vez más para dar soluciones más tangibles para a la gente.
Ahora bien, siempre resulta más fácil dimensionar la complejidad y esfuerzo de un producto cuando este es visible, cuando muchos de los problemas pueden ser considerados desde el sentido común, es lo que aleja la Ingeniería de Software de otras Ingenierías más fácticas como la Ingeniería Civil.
Por dar un ejemplo, y alejados de problemas de corrupción o ineptitud, un proyecto de Ingeniería Civil como la construcción un puente, se ejecuta en tiempo y recursos muy bien definidos, cuidando los plazos, entregando a tiempo y con pocas desviaciones de presupuesto; todas estas cosas generan confianza. Por otro lado nuestra ciencia no ha sido considerada como aplicada, más bien ha sido vista como artesanal y con amplio margen de incertidumbre, a diferencia de otras ciencias que se aplican desde hace siglos y han alcanzado su madurez.
Hoy en día contamos con una sólida base de conceptos y definiciones, que aunque algo abstractas, deben ser pilares en la construcción de definiciones de alto nivel a medida que la evolución lo requiera. Por esto la exploración e investigación deben seguir aportando con conocimiento que enriquezca el desarrollo de esta redituable profesión. En este sentido es de vital importancia la conjunción academia-industria que se alimente de nuevas tendencias en el mercado y líneas de investigación novedosas en las universidades. Por ello, aquí se muestra un conjunto de disciplinas que apoya esa labor:
Gestión de proyectos de software
Dadas las dinámicas complejas y de alta incertidumbre que supone el desarrollo de proyectos de software, y los requerimientos de clientes de prontitud y tiempo en el mercado, es importante tomar en consideración nuevos procesos y metodologías de desarrollo que mantengan la disciplina y potencien la productividad de equipos de desarrollo bien organizados.
Atrás quedaron marcos de referencia para el trabajo a largo plazo basados en documentación y fases muy bien definidas, para dar paso a actividades donde el desarrollador tiene mayor autonomía y está más cercano al negocio, mientras continúa investigando sobre métodos de estimación más certeros.
Arquitecturas de solución ágiles
El auge de metodologías ágiles de desarrollo propicia prontas entregas de funcionalidad en los productos, sin embargo, en este marco de entrega ágil podemos descuidar atributos de calidad del software en sí mismo, que terminan siendo determinante para el producto.
Para gestionar estos aspectos técnicos se propone crear un backlog de arquitectura paralelo, aunque retrasado, al backlog funcional del producto, donde en cada iteración se mejoren los atributos de calidad para el negocio, realizando pruebas de concepto, experimentos y encontrando puntos singulares de fallo.
Automatización por medio de metamodelos
Se pueden crear gramáticas y modelos propios de cada dominio de negocio que se utilizan para crear herramientas de automatización que agilicen la generación de código automáticamente. Estas bondades se logran con transformaciones de modelo-a-texto, modelo-a-modelo o texto-a-modelo y con procesadores de texto que se crean para cada lenguaje definido, estos pueden presentar una interfaz gráfica o simplemente operar con texto como entrada del usuario.
Este nuevo nivel de abstracción supone un reto adicional en los ingenieros, pues conceptos complejos son introducidos y semánticas propias de un lenguaje deben ser consideradas. Para estos desarrollos se pueden utilizar frameworks de tratamiento de objetos y modelos como Epsilon.
Lenguajes e implementaciones para Epsilon
Fábricas de software
Los principios de las líneas de producción pueden ser implementadas en la fabricación de software. Por ejemplo, se pueden utilizar técnicas de construcción basadas en componentes, o modelos de arquitectura agnósticas, se puede construir un catálogo de funcionalidades que esté disponible para ensamblar un producto final con el mínimo esfuerzo, también se pueden definir “aspectos” como solución de inyección de código transversal como autenticación o registro de logs, siempre necesarios en la construcción de cualquier aplicación.
En este sentido es siempre importante realizar un análisis de la complejidad que puede suponer un producto con conceptos como FODA, dadas que las intersecciones entre los componentes pueden restringir o promover funcionalidades de la solución.
FODA: Análisis dominio de orientado a características notación estándar
Tecnologías cloud
El avance en hardware y software de virtualización permitió a los proveedores de infraestructura utilizar más eficientemente sus recursos de cómputo, de esta manera los mismos fueron sub-arrendados y un nuevo modelo de aprovisionamiento de infraestructura apareció. Hoy en día estos proveedores ofrecen una amplia cantidad de soluciones para construir sistemas distribuidos de alta disponibilidad o simplemente para usar servicios administrados por ellos mismos sin la necesidad de mucha configuración. Sin embargo, la habilitación de las diferentes capas de solución en la nube conlleva a un uso consciente y efectivo de los recursos, considerando temas legales para cada uno de los niveles IaaS, PaaS y SaaS en modelos on-premise, en cloud o mixtos ahora último con contenedores.
Pruebas automatizables
Toda una rama de investigación. El futuro de las pruebas automatizables está en considerar oráculos (que son los evaluadores del resultado de la prueba) confiables; mientras que los casos de prueba se escriben en un lenguaje entendible por el negocio y son redactados en forma de criterios de aceptación.
Por otro lado, se exploran diferentes herramientas para realizar pruebas que se ejecuten automáticamente en todo tipo de dispositivos, entendiendo aspectos del software muy puntuales de probar: Regresión visual, mutantes y headless, son solo unos de los tipos de pruebas que se pueden implementar rigurosamente de la mano de una bien diseñada estrategia donde el enfoque de pruebas unitarias cobre mayor importancia.
Enfoques de pruebas unitarias
Criptografía y seguridad
Con unas sólidas bases matemáticas, la criptografía nos explica cómo los principios de generación de números aleatorios, la ofuscación y la generación de llaves criptográficas, pueden ser usadas como bloques constructores de herramientas de seguridad que apalanquen la robustez nuestros proyectos. Estos bloques se vuelven habilitadores para nuevas tecnologías emergentes como blockchain y contratos inteligentes, mientras algoritmos de encriptación intensivos en memoria y CPU, utilizados en minería, prometen reducir costos del hardware paulatinamente.
Arquitectura de procesos
Los procesos son fundamentales en las operaciones de una empresa y la tecnología puede usarse como habilitante de técnicas de análisis y simulación de los mismos. Para ello, la generación de modelos de procesos es vital, donde estos deben estar basados en lenguajes formales como BPMN o Archimate y además que sean compartidos entre los stakeholders de negocio. Es así como el ingeniero aporta una definición de negocio más concreta, no solo aportando soluciones de tecnología sino de organización de las áreas y actividades de la compañía.
Las anteriores disciplinas son importantes focos de investigación y están abiertas para obtener de ellas soluciones que se apliquen en nuestros trabajos o emprendimientos. En cualquier caso, no hay que dejar de prestar especial atención a tecnologías emergentes con “gran hype” como son: DevOps, agilísimo escalado, blockchain, microservicios con serverless y nuevos enfoques de experiencia de usuario como realidad aumentada y soluciones cognitivas. Todas estas tecnologías deberían ser tratadas interactuando con otras profesiones, que aportan otro punto de vista y trabajando con responsabilidad y profesionalismo.
Como ingenieros de software debemos ser íntegros, porque no se trata solo de la programación del software (aunque en esta área haya mucha especialización por lenguajes o paradigmas), es en desarrollo continuo de otras áreas del conocimiento donde veo una oportunidad para impulsar la formalización de las ciencias de la computación y su aplicación a la vida diaria, no solo de grandes empresas si no de personas en común, así ganarnos la confianza de nuestros clientes con productos de calidad, en tiempo justo y además con un impacto en la sociedad.
Referencias
Gráficos vectoriales diseñados por Freepik
https://en.wikipedia.org/wiki/Friedrich_L._Bauer
https://www.eclipse.org/epsilon/doc/
http://www.floppybunny.org/robin/web/virtualclassroom/chap12/s4/articles/foda_1990.pdf