Aunque tradicionalmente se nos indica en la ingeniería de software que este se construye,
la verdad es que la tendencia desde finales de los años noventa es tender a la fabricación
de software.
La diferencia entre construir y fabricar, es que cuando se construye algo, se analiza,
se diseña y se construye por única vez y por proyecto, como por ejemplo “construir
una casa”, sin embargo cuando algo es fabricado, se diseña y analiza una vez y,
generalmente en cadena, es ensamblando con partes previamente fabricadas, generando
una serie de productos por un costo reducido. Un ejemplo de esto es la industria
automotriz.
Si vemos la evolución de los lenguajes y metodologías de programación, cada vez
se basan más en reusar software creados.
Repasemos brevemente las circunstancias sobre cómo esta tendencia se ha ido dando.
Analizando la historia de los lenguajes de programación vemos que estos se han ido
simplificando desde sus inicios a la actualidad, para centrarse en conceptos cada
vez más abstractos y alejándose de las instrucciones que realmente procesa una CPU.
Asm (ensamblador) con sus saltos de memoria y macros, dio paso a C, un lenguaje
estructurado, diseñado para facilitar la programación, a un nivel más alto que ASM,
sin embargo fácilmente traducible a este. C tiene un conjunto básico de librerías
ampliable, se pueden usar "módulos" y estos son fácilmente insertados en otras aplicaciones
y sistemas. A C, le siguió C++ "C con clases", que abstraía más la programación
y la reusabilidad de componentes .
Debido a que asm, C y C++, se usaban en multitud de dispositivos (no solo computadoras,
sino aparatos electrónicos programables en general), y que cada dispositivo parecía
manejar su propia versión de estos lenguajes, era necesario generar un programa
específico para controlar a cada uno de ellos, programas que prácticamente hacían
los mismo, pero cuyo código era diferente, dificultando en exceso la portabilidad
de los sistemas. Ante este problema, casi a mediados de los 90, surgió Java, un
lenguaje pensado para programase exactamente igual en todos los dispositivos. Java
está basado en C++, pero depurado de todas las funcionalidades confusas y peligrosas
de este lenguaje, simplificando mucho la programación, a la vez que hacia posible
que un mismo programa (compilado), funcionara en varias arquitecturas disparejas.
A Java le siguió la contraoferta de Microsoft (que por aquel entonces tenía un compilador
de C++, bastante popular y su IDE y lenguaje tradicional “Visual Basic”), creando
su arquitectura .NET a principios de los años 2000. Dicha arquitectura, está inspirada
en Java, simplificando aún más su uso, en C++, y buscando un enfoque de sencillez
al momento de programar, en Visual Basic y Delphi (es de notar que Delphi y C#,
comparte un creador común, El arquitecto principal del equipo encargado de Delphi
(en Borland) y C# (en Microsoft) fue el danés Anders Hejlsberg.). Además .NET ofrecía
programar en varios lenguajes (originalmente Visual Basic .NET, C# y J#), y posibilidad
de usar componentes creados en unos lenguajes en otros.
Es curioso también señalar la relevancia que tuvo Visual Basic (versión 6 y anteriores),
en los 90 y buena parte de los 2000, a pesar de ser un lenguaje poco práctico, muy
poco escalable, y tener un gran número de problemas de fondo. Visual Basic enfoco
el desarrollo a través de componentes que eran fáciles de desarrollar y de incrustaban
de forma gráfica en los desarrollos, comunicándose con otros componentes en forma
de eventos (mensajes que lanzaba el mismo componentes esperando a que un oyente
que los interpretara). En estos casos realmente estamos “fabricando” software ensamblando
distintas piezas, desde un catálogo disponible, de una forma sencilla y clara. Adema
Visual Basic unifico el acceso a base de datos, enmascarándolo dentro de un esquema
común (independiente del motor subyacente), de tal forma que se podía establecer
comunicación, y ejecutar sentencias SQL, sin importar la base de datos.
Linus Torvald, creador de Linux, alabo en el 2006 a Visual Basic, diciendo que a
pesar de no ser un gran lenguaje de programación hizo más por la programación que
los lenguajes orientados a objetos, al introducir interfaces sencillas de conexión
a base de datos. Si bien el comentario es muy discutible, es más que curioso por
provenir de quien viene, la conclusión sobre esto, es que de todos los lenguajes
se puede aprender algo.
Para la WWW, tenemos una evolución parecida. HTML comenzó con un conjunto de etiquetas
pare definir formato y contenido, y se les fue añadiendo programación en forma de
scripts, para añadirle funcionalidad. En la actualidad, está dividido en varias
aspectos, el contenido que es definido por HTML, la presentación que lo define CSS,
y la funcionalidad que es implementada a través de JavaScript. Es de espera que
cada uno de estos elementos sean componentes independientes que se pueden separar
y juntar, según convenga, por ejemplo un mismo contenido, se pueden mostrar de forma
diferente en una pantalla de ordenador, y un dispositivo móvil. Igualmente para
el desarrollo de las sitios web, se puede usar un amplio catálogo de framework y
“librerías” para facilitar su desarrollo, como JQuery, Angular, o Bootstrap (nuevamente
se reúsa y se ensamblan componentes para crear software ).
El enfoque de “Fabrica” es muy evidente en los productos que nos ayudan a crear
sitios web automáticamente, un ejemplo muy claro es Blogger, que sin conocer nada
de HTML, ni de desarrollo de software, podemos tener un blog completo solo dando
instrucciones sobre cómo queremos que sea, y que elementos querernos que lo compongan.
La evolución hacia la reusabilidad también tomo el enfoque de componentes y servicios.
Se comenzaron a crear librerías, cuya funcionalidad eran utilizada por diversos
sistemas, posteriormente se realizaron componentes que podrían invocarse remotamente
(RPC, CORBA, DCOM,…), y por ultimo servicios que exponen funcionalidad de una forma
estándar y fácilmente consumibles por cualquier sistema en cualquier tecnologías
(SOA, RESTFul,..). Muchas de estos componentes y servicios están expuestos públicamente
para su uso de forma gratuita, por ejemplo para Ruby, Perl, C# y Java, tenemos RubyGem,
CPAN, NuGet y Maven respectivamente, como repositorios donde obtener componentes,
y como servicios tanto Google como Apple o Amazon, exponen multitud de ellos, los
cuales podemos consumir desde nuestros sistemas.
Como vemos, la historia nos lleva a lenguajes, metodologías y ambientes en los que
se tiende a lo siguiente:
- Lenguajes de programación cada vez más abstractos
y enfocados a la manera de pensar de los programadores, no a la manera de operar
de las maquinas.
- Sistemas que tienden a la reutilización del software,
a crearse a través del ensamblado de componentes previamente desarrollados.
- Sistemas que delegan en componentes y servicios
de diversas arquitecturas, de los que no se tiene conocimiento de cómo realizan
su tarea, sino de la funcionalidad que realizan (Se sabe el “que” no el “como”).
Con respecto a este enfoque, podemos diseñar nuestra metodóloga de “Fabrica”, en
la se creara una “Línea de producción”, que será configurada con los requisitos
y características del software deseado y creara un sistema de la forma más automática
que sea posible (Contra más característica tengamos disponibles en el catálogo de
la fábrica, más funcionalidad podrá crearse de forma automática).