Uno de los principales problemas de la industria del software, en comparación con otro tipo de industrias, es que las herramientas y las metodologías no han seguido la misma evolución que las plataformas tecnológicas que sirven de base para la construcción del software. Podemos conectar sistemas heterogéneos separados cientos de miles de kilómetros a través de las últimas tecnologías de servicios web, ubicar nuestros procesos en la "nube", ofrecer nuestro software como un servicio a través de internet (SaaS), . . . Sin embargo, en la mayoría de las ocasiones, siempre es necesaria la intervención "manual" en las nuevas construcciones, como si cada una ellas fuese la primera que se realiza bajo esa tecnología.
Imaginemos por un momento que la industria del hardware utilizase un enfoque similar al anteriormente descrito. En ese caso, la construcción de circuitos integrados se realizaría mediante el soldado de transistores en lugar del método actual (utilización de software específico encargado de generar las implementaciones). ¿Podría la industria del software aplicar un enfoque similar?
Otras industrias han resuelto problemas similares a los que nos ocupan descubriendo cómo, de manera ágil, se pueden personalizar y ensamblar componentes estándar de modo que se puedan construir productos iguales pero distintos, mediante la integración, estandarización y automatización de sus líneas de producción, mediante el desarrollo de herramientas altamente extensibles, configurándolas de modo que puedan realizar tareas repetitivas y minimizando el riesgo y los costes en las relaciones con los clientes y proveedores. Partiendo de este punto se han construido líneas de producción para las variantes de los productos, se han generado cadenas de suministros distrubuyendo los costes y los riesgos a lo largo de diferentes suministradores especializados y relacionados entre si, habilitando de este modo la producción de una variada gama de productos capaces de satisfacer las necesidades de un amplio abanico de clientes. En resumen, industrialización.
Mi intención no es sugerir que la construcción de software es un proceso mecánico capaz de ser llevado a cabo por trabajadores no cualificados sino que, al contrario, no se debe malgastar el tiempo de los buenos desarrolladores realizando tareas automáticas y repetitivas, de modo que dichos trabajadores puedan pasar más tiempo pensando y no realizando tareas que podrían estar automatizadas. Deberíamos de ser capaces de encapsular el conocimiento en lenguajes, patrones, dsl, herramientas, frameworks, etc de modo que se puedan aplicarl de manera sistemática, automatizando de este modo el ciclo de vida del software.
La construcción de componentes software reutilizables es un reto apasionante, y posiblemente no sea tan sencillo ensamblarlos como los circuitos integrados, aunque, personalmente, creo que la industria del software debería moverse en esa dirección.