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

domingo, 28 de agosto de 2016

CapicuaGen: Desarrollo de software en la empresa, Parte II

Si bien las empresas pueden llegar ser muy diferentes entre sí, a nivel de software es más lo que se parece que en los que se diferencia. En cualquier de los enfoques anteriores, se dan dos constantes que hay tener en cuenta:

El software va a cambiar: Los cambios son necesarios para el negocio, estos cambios se darán de forma cada vez más frecuente y debemos poder responder a la necesidad de dicho cambio para que nuestra empresa siga vigente en el mercado de la forma adecuada.

El software se parece entre sí: Casi todo el software empresarial se parece entre sí, casi todas las empresas gestionan recursos de algún tipo (humanos, económicos, etc.) y generan un producto (dinero, servicios, o bienes de alguna naturaleza). Técnicamente hablando casi todas los sistemas software tienen características como acceso a datos, seguridad, interacción con el usuario o trazabilidad.

En el escenario donde una misma empresa fabrica su propio software, se deseara que este sea homogéneo entre los distintos sistemas que posee, para disminuir la curva de aprendizaje entre sus usuario y fomentar la imagen corporativa unificada.

En las fábricas de software, se deseara reusar los máximos componentes posibles entre desarrollos diversos, para optimizar el uso de recursos y reducir los costos de producción.

En el caso de la empresa que vende un producto de software, esta querrá vendérsela al máximo número de posibles clientes, con las mínimas y menos costosas personalizaciones posibles.

En cualquier de estas opciones, se tiende a desarrollar componentes y elementos software, que se reúsan en los diversos sistemas. Los sistemas a su vez, se parecen a otros sistemas con los que comparten una funcionalidad semejante, o tienen elementos técnicos semejantes como características y aspectos comunes. La parte que hace diferencia a un software, aunque en el producto final es la que más destaca, en proporción es la que menor código representa, con respecto a la parte de código que puede reciclarse.

Veamos una serie de ejemplos que muestren las constantes sobre el cambio y las semejanzas del software.

Si existe un mercado que evidencie la necesidad rápida de cambio de un software es el de la telefonía movil. En menos de 10 años se convirtieron en un elemento imprescindible, tanto en lo laboral, como en lo personal. Actualmente viene dominado por dos gigantes de la industria, Apple (con su teléfono iPhone) y Google (con Android), ambos ofrecen sistemas de funcionalidades idénticas, y llevan años en una carrera de cambios, que en el fondo son semejantes en lado y en el otro. La diferenciación entre ambos no se da en los que hace sus sistemas, sino en que Apple ofrece una experiencia ligada a su hardware y a un ecosistemas de productos completo, y Google a se basa en una interconexión de multitud de servicios, independientes del hardware. Anualmente estas compañías presentan cambios y novedades a sus sistemas, y siguen vendiendo teléfonos manteniendo al mercado interesado.

En el lado contrario tememos a RiM, el creador de la BlackBerry. BlackBerry fue el primero en entrar en el mercado de los teléfonos inteligentes con un gran éxito, pero se conformaron con tener un nicho seguro dentro del mundo empresarial, y perdieron de vista los cambios en la sociedad que solicitaba tener al alcance de su mano una forma diferente de servicios y conectividad global. Cuando emergieron los IPhone y los Android Phone, que si supieron entender las necesidades de cambio, se quedaron estancados y terminaron por casi desaparecer del mercado.

Microsoft, en cambio fue el último en entrar en este mercado, si bien entendió las necesidades, no lo hizo en el momento adecuado, sino en uno en que ya no podía competir con los dos grandes ya establecidos. Motorola y Nokia se enfocaron en sacar un producto para cada sector consumidor según sus estudios de mercado, pero no comprendieron que si bien, una persona necesita un teléfono para trabajar, también lo va a necesitar para otras actividades, así que hicieron muchos teléfonos mediocres en lugar de pocos que resuelvan un amplio aspecto de necesidades. Estos fueron ejemplos de empresas que no supieron adaptarse al cambio de una manera adecuada.

Si vemos a las empresas que tuvieron éxito, observamos las constantes que hemos mencionado:


  • El negocio cambia, cambia frecuentemente, y la vigencia del producto viene definido por el cambio, y este debe estar sostenido un sistema software.
  • Los sistemas se parecen entre sí, el software tiene más semejanzas que diferencias.

Si obtenernos el porcentaje del código de un sistema que se asemeja a otro código, en comparación al que es exclusivo de nuestra aplicación, descubriremos que el código semejante es mucho mayor que el que no es.

El problema es que se invierte más tiempo y recursos en desarrollar las partes semejantes (por su volumen) que en desarrollar las partes exclusivas de un sistema, sin embargo las partes exclusivas de un sistema son las que le dan su identidad, con lo que debieran ser en las que se dedique más recursos y tiempo.

Para poder invertir los mencionados recursos y tiempo en el lugar adecuados, necesitamos una herramienta que nos ayude a generar las características comunes del sistema con el mínimo esfuerzo. La herramienta nos debe permitir escoger dichas características de un catálogo general común para una empresa, para un ámbito de negocio, o para un aspecto de nuestro software en particular e implementarla de forma automática en el sistema.

En base a esto se puede construir una línea de desarrollo de productos de software con un enfoque generativo.

martes, 23 de agosto de 2016

CapicuaGen: Desarrollo de software en la empresa, Parte I

Es un hecho que cualquier empresa, sea cual sea su tamaño, necesita un ambiente software adecuado que facilite su negocio, y le ayude en los cambios, constantes y rápidos que se dan en cualquier industria, más aun en la época de globalización e interconectividad en la que vivimos actualmente.

Los escenarios en los que se crean software empresarial son muy variados, vamos a enunciar principalmente tres de ellos:

Empresas con un departamento de desarrollo de software: En este escenario la empresa considero que es más factible para ella, tener un equipo que se dedique a construir el software que necesita en lugar de adquirirlo por medio de un ente externo. Este equipo puede tener más o menos madurez, además tener un tamaño variable.

Las ventajas de este enfoque, es que el equipo de desarrollo, tiene un solo “cliente” (la misma empresa) y debido a la cercanía, entre empresa y desarrollo, el conocimiento y las necesidades son más cercanas entre los unos y los otros, generalmente tiene un costo fijo al basarse principalmente en nóminas.

La desventaja es que no siempre se consigue la madurez necesaria para construir software lo suficientemente escalable para permitir al negocio crecer de manera adecuada. Frecuentemente se mantiene un mismo software durante años, haciéndole los mínimos cambios posibles, porque cada cambio tiene un gran impacto, haciendo sus sistemas difíciles de mantener. Al pasar del tiempo, es necesaria una restructuración completa del sistema software de la empresa, que muchas veces viene impulsara por cambios en el personal del mismo equipo de desarrollo.

Fábricas de software que son contratadas para tal efecto: En este enfoque la empresa contrata recursos externos para construir el software que necesite para para su negocio, puede ser para la creación de un producto, o otros eventos desarrollo y construcción en particular.

Las ventajas de este enfoque es no se debe invertir en recursos de construcción de una forma constante, solo cuando es necesario un desarrollo.

El problema es que posiblemente la fábrica tendrá más de un cliente, con lo que su atención hacia la empresa puede no ser la más adecuada, fases de análisis y diseño se pueden alargar en lo que la fábrica conoce las necesidades de la empresa y por ultimo cualquier cambio en los requisitos (que sin duda se darán en las revisiones de los productos) generada un costo adicional para la empresa.

Empresas de software que vende uno o varios productos: En este caso la empresa busca a otra empresa que venda o proporcione un producto adecuado a sus necesidades.

La ventaja de este enfoque es que generalmente se busca un producto que ya está realizado y construido, con lo que podría decirse que el problema se reduce a la puesta en producción de este.

La desventaja de este acercamiento, es que la empresa debe adaptarse al producto, y no lo deseable, que es que el producto se adapte a las necesidades de la empresa. En cualquier caso es muy posible que el software deba comunicarse con otros sistemas de la empresa, con lo que habrá que desarrollar una serie de interfaces para permitir la comunicación, perdiendo la ventaja de obtener un software completo y funcional desde el primer momento.

lunes, 11 de julio de 2016

Nuestras Redes sociales


Estoy actualizando las redes sociales del blog. Hace unas semanas que tenemos twitter, y recientemente abrimos un canal de Youtube para poder subir algunos videos y tutoriales.

sábado, 14 de mayo de 2016

Primera versión de CapicuaGen publicada


Acabo de publicar mi primera versión de CapicuaGen, el proyecto de mi máster en "Investigación en "Ingeniera de Software", la cual me ha tenido varios meses sin la posibilidad de publicar nada, y posiblemente me tenga algunos meses más debido a que estoy completando la memoria.

Pero no quería dejar pasar la oportunidad de anunciar la publicación del código fuente del proyecto, y de sus gemas.




CapicuaGen es un proyecto modular de generación de código, construido en Ruby, y de código libre, se puede obtener más información de la propuesta en:


Igualmente se puede obtener el código en:

  • CapicuaGen: Núcleo del generador de código.

https://rubygems.org/gems/CapicuaGen
https://github.com/jbautistamartin/CapicuaGen


  • CapicuaGenMelchior: Características comunes del generador.

https://rubygems.org/gems/CapicuaGenMelchior
https://github.com/jbautistamartin/CapicuaGenMelchior


  • CapicuaGenGaspar: Características para C#.

https://rubygems.org/gems/CapicuaGenGaspar
https://github.com/jbautistamartin/CapicuaGenGaspar


  • CapicuaGenBalthazar: Características para Android.

https://rubygems.org/gems/CapicuaGenBalthazar
https://github.com/jbautistamartin/CapicuaGenBalthazar


  • CapicuaGenEssential: Gema base que referencia a las anteriores para facilitar la instalación de un entorno funcional

https://rubygems.org/gems/CapicuaGenEssential
https://github.com/jbautistamartin/CapicuaGenEssential


La descripción publicada en GitHub, Sobre el generador es la siguiente:

CapicuaGen


CapicuaGen es un software que ayuda a la creación automática de sistemas empresariales a través de la definición y ensamblado de diversos generadores de características.CapicuaGenEssential agrega referencia a los generadores de características Melchior, Gaspar, Balthazar, con lo que es posible generar un ejemplo funcional completo.

El proyecto fue iniciado por José Luis Bautista Martin, el 6 de enero del 2016.

Puede modificar y distribuir este software, según le plazca, y usarlo para cualquier fin ya sea comercial, personal, educativo, o de cualquier índole, siempre y cuando incluya este mensaje, y se permita acceso el código fuente.

Este software es código libre, y se licencia bajo LGPL.

Para más información consultarhttp://www.gnu.org/licenses/lgpl.html

Instalación


Agregue la siguiente línea al archivo GemFile de tu aplicación

gem 'CapicuaGenEssential'
y ejecute:

$ bundle
O instálela manualmente con el siguiente comando

$ gem install CapicuaGenEssential

Uso


CapicuaGen permite comenzar a trabajar con él desde el mismo momento en que es instalado. Para obtener un ejemplo funcional simplemente ejecutamos el comando CapicuaGen con el parámetro example:

$ capicuagen example
Se crearan los siguientes archivos:

  • generator.rb: Ejemplo de un generador de codigo
  • GemFile: Archivo de configuración de depencias para bundler .
  • instnwnd.sql: Ejemplo de base de datos NorthWind, para Microsoft SQL Server

Revise el archivo generator.rb para tener una introducción a CapicuaGen.

Contribuir


Reporte de fallos y solicitudes de pull son bien recibidas en https://github.com/jbautistamartin/CapicuaGen

domingo, 6 de marzo de 2016

El problema de "No somos una empresa de software"


Todas las empresas usan software y en muchos casos necesitan software a medida que supla sus necesidades, posibiliten crecer a su negocio y las preparan para los cambios, que seguramente, requieran para mantenerse vigentes en el mercado.


Uno de los principales problemas es que generalmente no le dan la suficiente importancia al software como impulsor de su negocio, no invierten adecuadamente en su desarrollo y ni en su correcta integración  y uso, uno de los principales motivos es que "No son una empresa de software".

El tema es que ninguna empresa es una "empresa de software" como tal, en el sentido de que el software no es un producto final en sí mismo, sino que es un producto, que sirve para "algo",  para conseguir una seria de objetivos o suplir una serie de necesidades.

Si una empresa minimiza la necesidad del software que requiere, ya sea adquirido o desarrollado internamente,  su empresa tendrá problema, puesto que el software es una herramienta para "hacer" su trabajo y cumplir sus objetivos,  y esa es su única finalidad. Si no tiene el software adecuado, seguramente  será superada por otra empresa que si tenga el software necesario.

Muchas empresa tiene un pequeño departamento de desarrollo de software, generalmente integrado por un equipo sin una estructura clara, que resuelve problemas de una forma reactiva, y sin una planificación clara hacia el futuro, y mucho menos hacia el futuro del software y su sostenibilidad, no se invierte en elementos de programación, metodologías, y tecnologías actuales, porque consideran simplemente "que no es para ellos" y "no les hace falta", Al final ocurre un curioso efecto: En lugar de reflejar el software el negocio, el negocio acaba haciendo lo que el software "puede" hacer, limitándose cada vez más la operativa de la empresa. De allí viene la famosa frase "El sistema no me deja hacerlo", que muchas personas oyen perplejos ante peticiones aparentemente sencillas, acerca de sus necesidades, frente a vendedores, o personas de atención directa a clientes (y no hablamos de atención telefónica, donde el problema se agrava más).

Finalmente  dichas empresas deben comenzar un arduo camino, recorriendo los mismos pasos, uno a uno, que recorrió la ingeniera de software,  para poder llegar a resolver las autenticas necesidades que tiene. El problema es que la carga anterior que ya poseen hace ese cambio lento y pesado, y a veces condenado al fracaso.

Por eso es fundamental que las empresas nacientes, consideren el software como un elemento fundamental de su negocio, y aprovechen las tendencias y metodologías actuales de la ingeniera de software, cuya único propósito es construir software de manera más rápida, a menor costo y con mayor calidad, por que dichas tendencias y metodologías ya han recorrido el "arduo camino" mencionado previamente y no es necesario que nosotros lo volvamos a recorrer.

lunes, 8 de febrero de 2016

Diferentes estilos de liderazgo


Actualmente me encuentro leyendo “Liderazgo centrado en principios”, de Stephen R. Covey, el cual me está resultando un libro muy interesante que trata sobre cómo manejar correctamente diversos aspectos relativos al liderazgo. Es común como algunos puestos gerenciales o directivos, no tienen una verdadera formación en cuento a liderazgo, basándose su percepción de este en modelos que han tenido ha tenido la gente a lo largo de su vida, tal como figuras paternas, maestros o antiguos jefes. Sin embargo para conseguir un verdadero liderazgo es necesario un estudio y preparación sobre el tema ya que son características que se aprenden, se desarrollan y se mejoran con el tiempo.

En nuestro sector, es importante tener un buen liderazgo para poder gestionar un equipo que necesita guía y motivación para poder llevar adelante la finalización de un proyecto. Existe muchas variables, e iteraciones personales que se tienen que conducir apropiadamente para llegar a un caso de éxito.

Covey propone los siguientes motivos por los cuales un equipo de trabajo acepta y sigue a un líder:

  • Por coacción: Básicamente es por miedo. Se tiene miedo del poder líder, y de lo que puede hacer este si se le contradice o decepciona (se teme al castigo). Los resultados que se obtiene son siempre reactivos (no tendremos un equipo proactivo o con iniciativa propia), y la influencia del líder desaparece cuando este no está presente. Es común que la gente se organice en contra del líder, y de sus métodos, creando una situación de caos en la empresa.
  • Por utilidad: Se basa en lo beneficios mutuos que pueden obtener tanto líder y equipo uno del otros. No es una relación basada en el miedo, sino en lo útil que puede resultar la cooperación. Es la relación predominante en la mayoría de las empresas. El problema es que el compromiso esta basado en el interés, o en que el equipo sienta que se le retribuye de forma justa a su colaboración. Pero los intereses y necesidades cambian según cada quien y según el momento personal de cada uno. En este modelo es común que parte del equipo cambie de trabajo, cuando el actual no suple o no tiene la capacidad de suplir sus expectativas e intereses.
  • Porque creemos en ellos: El equipo cree que lo que hace el líder es lo correcto. Las metas de la empresa, el líder y el equipo son las mismas, y además el equipo cree que esas metas son buenas, no buenas en lo personal, ni para la empresa, sino buenas en un nivel más alto, en un nivel en el que todos pueden ganar, el equipo, el líder, la empresa, y los clientes de estas, e incluso, en una perspectiva superior, la sociedad en general. En este esquema el equipo sigue al líder, no por miedo, ni por compromiso, sino por respecto. Igualmente cuando se den momentos difíciles, como la necesidad de sacrificar tiempo personal, o un esfuerzo superior, el equipo luchara por acabar los proyectos en los que cree, en lugar de por ejemplo, buscar otro trabajo.


Esta información ha sido consultada en el libro “Liderazgo centrado en principios” de Stephen R. Covey, principalmente del capítulo 9 “El poder centrado en principios”.