lunes, 26 de septiembre de 2016

Dos años después

¡Cumplimos dos años en el blog! Este es el resumen de todo lo acontecido:





¿Cuántas publicaciones hemos hecho este año?, unas 13, de un total de 35.


¡Tenemos redes sociales!


Estamos en Facebook, Google+ y twitter en los siguientes enlaces:


Programación


Temas que tienen que ver directamente con asuntos de programación y código



Seguridad


Temas que tienen que ver con la seguridad en el desarrollo de software






Post relativos a reglas de software de la ingeniería de software


Es un conjunto de reglas o recomendaciones que nos ayudan a diseñar y construir software, con la intención de que aumentar nuestras posibilidades de éxito. Se han publicado las siguientes:




Ingeniera de software en la empresa


Artículos relativos al desarrollo de software en la empresa.





CapicuaGen


CapicuaGen es un producto orientado a la generación automática de código, y a la construcción de software desde un enfoque generativo. ¿Qué quiere decir esto? Bueno básicamente que construiremos un software, cuya misión es construir otro software, o más exactamente el código de dicho software.








Y esto es todo en el segundo año, espero que os haya gustado :-)

jueves, 8 de septiembre de 2016

CapicuaGen: Acerca de la fabricación de software (Breve historia de los lenguajes de programación)

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).