jueves, 25 de enero de 2018

Regla N°16 de la Ingeniería de Software: Por defecto todo es privado (principio de ocultación)


Esta semana me paso algo que definitivamente creo que merece una nueva regla. Me encontraba con la necesidad de modificar la implementación de una funcionalidad dentro de un componente de uso común, el motivo es porque se comportaba de forma errónea. Hasta allí todo era normal, una modificación de un componente que no debiera impactar en absoluto al comportamiento ni a la implementación de los sistemas que lo consumen. Cuando me di a la tarea, apareció una variable pública dentro de la clase, que además era parte fundamental de la implementación… y allí comenzaron todos los problemas.




El hecho que estuviera pública la variable implicaba que cualquier cambio hacia la misma afectaría a los módulos que ajenos al sistema que la consumieran (y en este caso así era). La funcionalidad estaba horriblemente implementada (y era incorrecta), y la variable francamente era innecesaria, sin embargo debiera mantener compatibilidad con la multitud de sistemas que la usaban. Aquí había dos opciones, mantener la variable y de alguna forma modificar a funcionalidad para que la sigan usando en los mismo términos (cosa que se me hacía un malabarismo completamente innecesario y perjudicial, a la vez que chapucero) o rediseñar la funcionalidad y solicitar a todos los sistemas que se adecuaran a ella, con lo que implicaba coordinar una liberación múltiple de sistemas. Una tercera opción es mantener los dos componentes productivos, el que tiene el error y el que no, pero eso implicaría un doble mantenimiento en supuesto caso que hubiera que mover nuevamente el componente.

Intentando comprender que motivos tenía el programador para crear un variable (que claramente tiene un ámbito privado), como publica, me doy cuenta que se comparte entre dos módulos del mismo componente, esto de por si era innecesario, pero no solo no se redujo el ámbito de la variable al nivel del componente, si no que se hizo totalmente pública.

He observado que esto es un problema muy común de muchos programadores noveles, escriben la palabra "public" por inercia al momento de crear una nueva funcionalidad, sin pararse realmente a pensar que están haciendo, y solo cuando lo meditan bien escriben "privado". A veces no se dan cuenta de esta circunstancia, otra veces piensan que es más sencillo, si todo es público, a veces incluso piensan que le dan cierto sentido de "libertad", cuando lo que se hace abrir puerta al desastre (la “libertad” la da en todo caso, compartir el código fuente, no habilitar métodos privados como públicos).

La verdad es que se lo único que se está haciendo es romper el "principio de ocultación". El principio de ocultación indica que cualquier implementación interna de una clase debe estar oculta para los consumidores, no debiera mostrarse variables de ningún tipo, si no que la interacción y la modificación de la instancia de una clase se hacen mediante mensajes (representados genialmente a través de métodos, o propiedades). Generalmente esto se consigue mediante el encapsulamiento, agrupar dentro de la clase todo lo que le de identidad como tal (tanto funcionalidad, como datos), y solo exponer los mensajes necesario para interactuar con ella.

Partamos de una clase que tiene todo privado. Ok… ese tipo de clase no sirve de nada, puesto que necesita comunicarse con el exterior, o más bien el exterior necesita comunicarse con ella para que sea útil, eso es porque la clase tiene una responsabilidad (debemos asegurarnos que solo y exclusivamente tenga una). Debemos asegurarnos de exponer solo los métodos (o propiedades), mínimas indispensables para poder comunicarse, cuanto menos sean mucho mejor será.

Con esto estoy garantizando otro principio, que es el del desacoplamiento. Esto es que las clases dependan muy poco entre ellas y de sus implementaciones particulares, de forma que pueden ser sustituidas fácilmente por otro tipo de la implementación, o incluso con otras clases, sin mayor impacto en sus consumidores. Esto era imposible en mi escenario, el hecho que los sistemas usaran una variable pública implicaba que dependía mucho de cómo internamente se usaba ese variable, impidiendo cualquier sustitución, con los que estaban demasiado acoplados.

Existen los siguientes grados de ocultamiento (en la mayoría de los lenguajes):

  • Privado: El más restrictivo. Cuando más privado sea todo más desacoplado será, Solo la misma clase puede usar un método privado.
  • Protegido: Solo puede usarlo la misma clase o sus descendientes. Por lo que por lo menos garantizamos que no hay un consumo indeseado desde el exterior de clase. Si no hay algún motivo para hacerlo protegido, debiera seguir siendo privado, es más fácil cambiar un método de privado a protegido, que al revés.
  • Interno: Aquí entramos un poco un terreno más público. Indica que todos los módulos (clases) que pertenezca al mismo componente, podrán usar el método, en este escenario seguimos teniendo el control de lo que es público y privado, ya que siguen siendo llamadas que ocurren en el interior de nuestro componente.
  • Público: Aquí ya estamos en el ámbito publico totalmente, cualquiera podría usar el método o la variable en cualquier momento y forma, con lo que sí está mal expuesta (como nuestro caso), los métodos que la implementan lo harán de forma incorrecta, dificultando el poder reemplazar el componente por otro más optimo debido al acoplamiento sufrido.
  • Amistoso "friendly”: Este es algo curioso, es cuando un componente tiene “derecho” de acceso a un método privado de otro componente. Tenemos en este caso dos componentes que no tienen nada que ver entre ellos y sin embargo uno puede acceder a los métodos privados del otro. Aquí hay un problema de cohesión, debido a que si es realmente necesaria la “amistad” seguramente debieran ser el mismo componente y no dos componentes separados. Además hay un problema de acoplamiento debido a que estamos haciendo que un componente que no tiene nada que ver con otro, conozca detalles de su implementación interna.

En definitiva debemos usar el modificador más restrictivo siempre e ir haciendo publico según tengamos la necesidad, cuestionándonos siempre si realmente es necesario el cambio. Esto reducirá el acoplamiento de los componentes y nos facilitara el mantenimiento en nuestros sistemas.

jueves, 11 de enero de 2018

Regla N°15 de la Ingeniería de Software: Haz que las cosas sucedan

"... En la guerra puede haber cambios de circunstancias ante las cuales el general debe reaccionar. Decir que debe esperar las órdenes del soberano para decidir es como esperar las órdenes para apagar un fuego. Antes de que lleguen las órdenes pertinentes, todo estará reducido a cenizas." Sun Tzu, el arte de la guerra.

Una de las cosas que más afectan al éxito del desarrollo de un sistema es la pasividad y falta de proactividad. Esto es, principalmente, quedarse esperando a que las cosas pasen por si solas.

Muchas veces existen escenarios de incertidumbre en que no queda claro que es lo tenemos que hacer en cuanto al sistema que se está construyendo, esto puede ser por muchos motivos, puede ser una falta de visibilidad del objetivo real o que no se nos ha comunicado apropiadamente.

Pero es necesario comprender que mientras el sistema no esté finalizado (satisfaga las necesidades del cliente), hay tareas pendientes que hay que resolver y es responsabilidad de cada integrante del equipo conocer cuáles son y conseguir se lleve a cabo. Es responsabilidad de cada uno hacer que las cosas sucedan.


Los escenarios por los se puede caer en la pasividad son, entre otros, los siguientes:

  • No existe una fecha de finalización del proyecto. Esto provoca que no se dé la suficientemente importancia a acabar el proyecto, siendo laxos con los compromisos y avanzando de manera inadecuada e irregular.

    Toda tarea debe tener una fecha. Cada vez que surja una tarea, ponle una fecha, si no puedes ponerle una en ese momento, ponle una fecha para volver a revisar la tarea, pero nunca dejes nada sin que este establecido una tiempo para ser atendido.

  • No existe un objetivo claro. Esto provoca que no se sepa que es lo que hay que hacer y por lo tanto no se hada nada relevante, agregando módulos al sistema o quitándolos sin sentido alguno. Es necesario tener unos objetivos definidos, cerrados y limitados.

  • No existen unas tareas claras. Dicho de otra forma se tiene un objetivo, pero no se ha analizado claramente y no se sabe cómo llegar a él, con lo que se va dando tumbos, realizando código (u otras tareas), sin saber muy bien como llega a buen puerto. Es necesario trazar una ruta para poder conseguir nuestros objetivos, dividir el problema en pasos y recorrerlos uno a uno.

  • No hacer una tarea por estar esperando un correo o una llamada. No hagas eso, nunca van a llegar en el tiempo adecuado y el resultado es que no vas a hacer nada. Finalmente el trabajo de las personas no es responder correos, así que no estarán pendientes para contestarte o lo harán cuando acaben sus tareas, o incluso si son bien organizados tendrán un día, o una hora al específica para contestar todos los correos. Mi recomendación es que mandes un correo, y después llames por teléfono para avisar que mandaste cierta información por correo. Sobretodo que establezcas un tiempo prudencial determinado y concreto para obtener respuesta a ese correo, y que además la persona receptora sea consciente de dicho tiempo, si no se ha cumplido vuelve a llamarla. Es mucho mejor ser molesto, que no hacer tu trabajo.

  • Diferentes áreas, diferentes intereses. Este problema es muy común, dos áreas involucradas tienen responsabilidades diferentes con respecto al proyecto, esto es un problema de difícil solución y tiene que ver con que no se percibe que un sistema incompleto no le sirve a ninguna de las dos áreas (es del famoso caso de "No es el lado de mi barco el que se hunde"), es necesario aumentar la comunicación entre áreas, para llegar a un mutuo acuerdo, a veces solo es un mero problema de comunicación.


  • Plantear un problema sin la solución. Es necesario que cuando tengamos un problema, intentemos buscar una solución antes de delegárselo a otra área. Es importante presentar los problemas junto con las soluciones

  • Para cada solución tiene un problema o más. Es un caso curioso, cuando se dan soluciones a un problema, inmediatamente surgen nuevos problemas que invalidan la propuesta, de forma que al final ninguna acción es tomada, nada se hace. Hay que considerar que ninguna solución resuelve completamente un problema, pero es mejor tener una solución que haga algo a no tener nada en producción.

Ahora bien, ¿Puedes tomar decisiones desde cualquier puesto? Si, por que si realmente no tuvieras que tomar decisiones en tu puesto, sería más fácil reemplazarte con algún tipo de proceso automatizado, si no es el caso, es que tus decisiones afectan a tu trabajo y a la forma de desarrollarse de este, y puedes influir en el éxito del proyecto.

sábado, 23 de diciembre de 2017

Acerca del uso de las metodologías de desarrollo en la empresa

Hace unos días un lector del blog me hizo la siguiente pregunta:

Me he estado preguntando que metodologias del desarrollo de software utilizas? Sería interesante conocer ese tipo de detalles para los ingenieros que apenas estamos comenzando nuestra etapa profesional
Me he estado preguntando que metodologías del desarrollo de software utilizas? Sería interesante conocer ese tipo de detalles para los ingenieros que apenas estamos comenzando nuestra etapa profesional

La verdad es que de manera inadvertida, la respuesta a esa pregunta creció mucho y decidí convertirlo a una entrada del blog sobre el uso de metodologías en el empresa, para ofrecer un opinión desde un punto de vista personal a la vez que profesional. En los siguientes párrafos esta mi respuesta.

Es una pregunta muy interesante la que planteas. Aquí hay un tema importante; no siempre vas a poder usar la metodología que quieras o incluso la adecuada para el tipo de problema planteado, porque a veces viene establecida por la empresa encargada del desarrollo directamente.

Cuando comencé a trabajar formalmente dentro de equipos de desarrollo de software, teníamos que usar metodologías tradicionales y pesadas, en las que pasábamos por cada fase en estricta secuencia y había que documentar cada paso (c-a-d-a p-a-s-o). Las metodologías agiles estaban todavía muy verdes (en implantación) y no ofrecían confiabilidad con respecto a la forma de desarrollar software que llevaban vigente durante décadas.

En lo personal a mi no me gustaba mucho esa forma de trabajo, era algo bastante frustrante, que enaltecía el análisis y el diseño frente a la codificación, a la que prácticamente nulificaba en cuanto a importancia.

He de decir que no creo que ningún problema pueda ser comprendido en su totalidad hasta que no está resuelto y eso quedaba patente en el desarrollo de software, cuando muchos elementos deben volver al análisis (una y otra vez), porque su conclusión es insatisfactoria. Aquí comienzan los problemas, porque siempre hay una fecha de entrega, y muchas veces no definida por el tamaño y complejidad del sistema, sino por cuestiones de mercado y contractuales. En este punto lo más frecuente es que se empiecen a saltar partes del proceso para llegar cuanto antes a la finalizaciones. Pero saltarse partes de la metodología de desarrollo, sea la que fuera, solo lleva el desastre.

Recuerdo como anécdota ir a una serie de conferencias de PMI (Project Management Institute ) y pensar "Esta gente debe ser genial construyendo edificios, pero no han hecho un software en la vida". Mi comentario no es del todo objetivo y justo, incluso se pudiera decir "erróneo", pero realmente es lo que sentí en ese preciso momento.

Afortunadamente ya mediados de los 2000, se comenzaron a aceptar de forma empresarial a las metodologías agiles (aunque existan desde muchos antes).

Ahora intento usar Programación Extrema (XP) y Scrum.

  • XP nos da una pauta para poder desarrollar (programar) software con calidad y rapidez, valorando las capacidad del software frente al cambio (si un software puede cambiar fácilmente, es que está bien construido), que el seguir un plan cerrado sobre el producto.
  • Scrum abarca otras partes del proceso de manera más global, ya considerando iteraciones con diversos elementos del equipo de una forma adecuada.
En lo que posible, fomento la comunicación verbal, y disminuyo a lo mínimo necesario la documentación y la comunicación por escrito, sobre todo cuando no aportan ningún al sistema.

Aquí es importante la situación real por la que pase el equipo de trabajo. Comentaba en otro post, que cuando mas maduro y capaz de comunicarse sea el equipo (de desarrollo) más éxito tendrá una metodología ágil, mientras que si el equipo es "novato", o tiene fricciones es mejor una metodología mas pesada y documental.

No hay que confundir la falta de documentación, con el desorden y el caos. Scrum propone mecanismos muy claros sobre cómo tiene que ser la comunicación en el equipo, el seguimiento y la asignación de tareas.

Comentar que igual que he tenido éxitos, también he tenido fracasos por aplicar determinadas metodologías en momento y con equipos inadecuados (para dichas metodologías). Hay que considerar que el éxito no es que un software llegue a estar productivo (cosa que siempre suele llega a pasar, porque es raro que se deje una necesidad de negocio sin suplir), sino que se haya desarrollado en el tiempo y la calidad requerida, además de al le equipo haya quedado satisfecho con el resultado y no exhausto después de hare maratónicas sesiones de codificación.

En cualquier caso es posible que otras áreas que no tengan que ver con el desarrollo de sistemas tengan procesos más pesados y documentales, generalmente es porque su proyectos son (en cuanto tiempo) de más corto alcance, con lo que no tiene la necesidad de "agilidad" propia de un desarrollo software. En este caso puede haber "rozamiento" entre áreas, por las diferentes metodologías. En este punto hay que llegar a la forma correcta de comunicación entre una área y otra, afectando lo mismo posible la metodología de desarrollo "de puertas para adentro".

Algunos artículos relativos a este tema son:

sábado, 16 de diciembre de 2017

Regla N°14 de la Ingeniería de Software: Evita la ceguera voluntaria


La ceguera voluntaria es ignorar de forma deliberada situaciones que si bien son perjudiciales, no suponen un daño inmediato, con lo que no se hace nada para corregirlas, convirtiéndose en una posible situación catastrófica a futuro.


Ejemplo de ceguera voluntaria en la serie Silicon Valley, Capítulo 03x05.

Aunque pudiera parecer absurdo intentar ignorar o omitir posibles problemas dentro del desarrollo de software (o realmente en cualquier tipo de proyecto) es algo bastante común.

Cuando aparecen problemas en mitad de un desarrollo y no son atacados y mitigados cuando son pequeños, aumentaran de forma progresiva hasta ser de tal tamaño que afecte al tiempo, calidad o costo del proyecto.

Lo elementos que más se suelen ignorar son:

  • Retrasos en el desarrollo del software: El producto saldrá claramente después de la fecha estimada, sin embargo ninguna alerta es disparada, haciendo creer al cliente que tendrá su sistema cuando se le indico. Aparentemente nadie quiere decir la palabra "retraso" en voz alta, aunque es algo claramente palpable.

  • Problemas tecnológicos: El equipo no tiene la capacidad técnica suficiente para llevar a buen término el sistema, ya sea por una sobreestimación de sus posibilidades, o porque directamente se construyo un equipo sin la preparación necesaria.

  • Problemas de recursos: No hay algún factor tal como dinero, tecnología necesaria (teléfonos, tablet o computadores) o gente disponible.

  • Problemas de integración de equipos: Aquí simplemente el equipo (de personas), no puede trabajar juntos, ya sea porque no tiene una buena relación o porque tienen una idea del trabajo tan individualizada que no son capaces de entender el concepto de trabajo en equipo.


Hay que entender que la ceguera temporal es algo que se da en todos los niveles, el programador puede omitir datos críticos, pero un buen líder de proyecto debe detectar omisiones y faltas al plan de desarrollo y buscar la forma de mitigarlos y sobretodo que emerjan a la luz, y estén claros, es decir asegurarse que hayan sido comprendidos (al nivel jerárquico que corresponda). Un líder de proyecto que ignora lo que ocurre en su equipo y en la construcción de un sistema, es un mal líder de proyecto y posiblemente un irresponsable que echarla la culpa del fracaso de "su" sistema a otras personas.

sábado, 25 de noviembre de 2017

Recomendaciones: El libro negro del programador

Es bastante sencillo encontrar libros sobre cualquier tipo de tecnología, herramienta o lenguaje de programación, pero al momento de localizar literatura sobre desarrollo profesional (o empresarial) de software dentro de un ambiente “real” (es decir no académico), es bastante más complicado y si además, estamos hablando de materiales en español, se vuelve una tarea completamente imposible.

El libro negro del programador, de Rafael Gomez Blanes, es una obra que nos ofrece una visión práctica, profesional y realista del desarrollo de software en un ambiente laboral. El libro no profundiza en ningún aspecto tecnológico en particular, si no en las buenas y malas prácticas en la construcción de sistemas.




Al leer el libro del programador, cualquier desarrollador, con un mínimo de experiencia laboral, se sentirá identificado con los problemas tratados allí. Generalmente la parte difícil no es reconocer que hay un problema en la forma de desarrollar sistemas en nuestra empresa o equipo, eso es bastante obvio cuando se acumulan las horas extras, el software de baja calidad, y la tensión palpable en el ambiente, el acierto del libro es listar las circunstancias que nos llevan a dichos problemas. Es necesario leer sobre nuestros problemas y escenarios laborales para poder comprenderlos completamente, aunque los estemos viviendo en primera persona.

El libro hace hincapié, entre otras cosas, en los siguientes temas:

  • La importancia del refactoring y la creación de software que pueda ser mantenible.
  • La capacidad de un sistema para ser probado y depurado.
  • Que el éxito no es tener un sistema que funcione en producción, sino un sistema de calidad, que además permita evolucionar con las necesidades de nuestro cliente.
  • Que no hay que trabajar muchas horas, sino ser productivo.

Por todo esto considero que El libro Negro del Programador es un texto que todos los desarrolladores debieran tener en su escritorio, para que no les olvide como hacer buen software.

Puedes obtener más información en http://mybook.to/elndp.

viernes, 10 de noviembre de 2017

Regla N°13 de la Ingeniería de Software: Simplifica las cosas


Cuanto te enfrentes a un problema grande, simplifícalo en problemas más pequeños. Si estos problemas siguen siendo demasiado grandes repite el proceso hasta que tengas un problema lo suficientemente pequeño para poderlo resolver.

Lo anterior parece un consejo bastante razonable, no solo para la ingeniería de software, sino para cualquier circunstancia en general. Sin embargo parece que es difícil entenderlo al momento de enfrentar un nuevo desarrollo software.




Es común que caigamos en el error de ver los sistemas como un todo unido de enormes dimensiones, pero como ingenieros debemos ver las partes que componen un sistema, y centrarnos en el diseño y la construcción de dichas partes, de forma unitaria, además de en su correcta interacción.

Para simplificar partimos siempre de un problema grande que es irresoluble en su tamaño actual, e identificamos las partes que lo componen. Lo dividimos en pequeños problemas que son más fáciles de resolver, repitiendo el proceso hasta que podémonos identificar dichos problemas con una solución clara y sencilla, y además que solo sirva para resolver exclusivamente una necesidad.

En la medida que las “mini-soluciones” estén bien diseñadas será más fácil juntarlas, para resolver nuestros problema de origen (Curiosamente cuando más “desacopladas” sean, más fácil será unirlas).


Las ventajas de la simplificación son las siguientes:

  • Nos obliga a ser ordenados y metódicos a la hora de resolver un problema.

  • Con la simplificación es más fácil distribuir el trabajo dentro de un equipo de trabajo con varios recursos.

  • Cuando comenzamos a resolver los problemas identificados, estos, por su tamaño nos permiten concentrar nuestro esfuerzo en un solo “tema” a la vez, y son además lo suficientemente pequeños para ser manejables.

  • Cada solución aportar una funcionalidad concreta y finalizada al sistema.

  • Las soluciones se deberían poder probar de forma individual. Las pruebas unitarias nos garantizan que todo funciona correctamente antes de integrarlo al conjunto global. Igualmente el sistema es modificado nos permite probar los elementos por separado, evitándonos realizar un complicado flujo hasta llegar al punto que deseamos probar.

  • Simplificar nos permite desarrollar un sistema más desacoplado. Un sistema desacoplado permite que se cambien los componentes por otros que agreguen funcionalidad o la mejoren, sin afectar al resto de los componentes. Cuando más desacoplado e un sistema más mantenible es.

jueves, 12 de octubre de 2017

CapicuaGen, Generador automático de Código Empresarial


Hace aproximadamente un año presente la tesis de mi máster en investigación en ingeniera de software, la cual base en la creación de un sistema generador automático de código llamado CapicuaGen. Durante todo este año decide tomarme un descanso del proyecto, al haberle delicado, en su momento, mucho tiempo y esfuerzo. Sin embargo he decido que ya es hora de continuarlo, para establecerlo como una buena herramienta de generación de código empresarial.

Mi tesis puede encontrarse en el siguiente enlace:


Con una pequeña presentación:


También puede encontrarse más información sobre los fuentes y compilados del proyecto en:


Contexto


CapicuaGen se ubica dentro de los tipos de herramientas conocidas como "Generadores de código", siendo su especialidad la generación de código con enfoques empresariales.

Los "Generadores de código" son sistemas (o partes de sistemas) cuya funcionalidad, como dice su mismo nombre, es crear el código fuente de un sistema destino a través de una configuración o especificación de una necesidad establecida previamente.

El cómo se especifica dicha necesidad puede variar entre distintos enfoques para cada generador en particular, pudiendo ser mediante un diseño en UML, un lenguaje específico del domino (DSL) o cualquier otro mecanismo, pero teniendo todos ellos en común que son más afines a características y elementos de negocio que a temas de índole técnicos en concreto. Esto es porque intentan llevar la abstracción de la construcción de sistema a un nivel más elevado que la programación directa en un lenguaje en particular.



Ilustración 1. Ejemplo de generador de código.


CapicuaGen nace dentro de un contexto empresarial basándose en dos principios, por los que se considera que es beneficioso el uso de generadores de código.
  • El software va a cambiar: Los cambios son necesarios para el negocio , además se dan de forma cada vez más frecuente, lo cual tiene un alto impacto en las empresas. Debemos poder responder a la necesidad de dicho cambio para que nuestra empresa siga vigente en el mercado de la forma adecuada. Los generadores de código nos pueden ayudar a gestionar dichos cambios de una manera más sencilla y rápida.
  • El software se parece entre sí: Casi todo el software empresarial se parece entre sí. La mayoría de las compañías gestionan recursos de algún tipo (humano, económico, etc.) y generan un producto (dinero, servicios, o bienes de alguna naturaleza). Técnicamente hablando, casi todos los sistemas tienen características como acceso a datos, seguridad, interacción con el usuario o trazabilidad. Los generadores de código nos ayudarán a crear apropiadamente todos estos elementos comunes, disminuyendo el tiempo y los recursos dedicados a tal efecto.

Acerca de CapicuaGen


CapicuaGen es un proyecto de código abierto, bajo licencia LGPL, que puede ser usado tanto para crear software comercial, como software libre.

Es un proyecto modular, basado en un generador central, que delega en elementos más pequeños conocidos como "Generadores de características", cuya misión es generar un aspecto en particular de un software destino, como puede ser la interfaz gráfica, la capa de acceso a datos, o la exposición de servicios y funcionalidades a través de una red corporativa o pública.

Los generadores de características son intercambiables e independientes, pudiendo elegir los que sean más convenientes para un escenario en particular, y cambiándolos cuando sea necesario. Igualmente pueden organizarse en repositorios públicos o privados (empresariales) y ser de fácil acceso para su uso, implementación y ampliación.

El uso del generador y la contracción de los repositorios se sustentan sobre lenguajes y tecnologías ampliamente adoptados por la industria, como Git, Ruby o repositorios públicos como GitHub, o RubyGems, con lo que su curva de aprendizaje es corta y sus capacidades de distribución y ampliación son altas.

El funcionamiento general de CapicuaGen es representado por el siguiente diagrama:




Ilustración 2. Diagrama de funcionamiento de CapicuaGen.

CapicuaGen es, a la fecha, un proyecto personal construido durante un periodo de seis meses, que contiene una serie de generadores de características sencillas expuestas a nivel didáctico, pero plenamente funcionales. Debido a su naturaleza de índole abierta, y su escalabilidad, es de desear que pronto pueda ampliarse con nuevas e interesantes características, aumentando cada vez más su potencia y utilidad.

Las capacidades generadoras que posee en la actualidad son las siguientes:

  •  Generación de proyectos para Visual Studio 2015.
  •  Creación de proyectos de escritorio.
  •  Creación de proyectos para exposición de servicios Web.
  • Generación de proyectos para Android Studio 2.0.

No hay ninguna restricción en cuanto a la tecnología o lenguajes para los que es posible generar código fuente, siempre que exista un generador adecuado para tal efecto. En los ejemplos anteriores generamos elementos para Windows, Web, Android, y en C#, Java o XML.

Igualmente y tal como se verá en la descripción específica de la solución desarrollada, CapicuaGen está pensado para ser parte del ciclo de trabajo del desarrollo de un sistema, permitiendo ampliar su funcionalidad y reciclándola para nuevos proyectos según se muestra en el siguiente diagrama:



Ilustración 3. Diagrama de flujo de trabajo de CapicuaGen.

Objetivos de CapicuaGen


Los objetivos a conseguir son los siguientes:

  • Agilizar la construcción de un sistema a partir del uso de generadores de código que creen de manera adecuada las características comunes ensamblándolas apropiadamente.
  • Reducir la programación manual de un sistema a los elementos particulares que así lo requieran, esto es, a aquellas partes que son exclusivas de dicho sistema y por lo tanto no están incluidas en otros.

Con el cumplimiento de estos dos objetivos se espera satisfacer las siguientes necesidades:

  • Aumento de la calidad del software al generarse en parte de forma automática. Los fallos detectados se podrían corregir en los elementos generadores y aplicar, por ende, al código de los sistemas.
  • Los codificadores no perderían tiempo realizando tareas repetitivas y se concentrarían en las que realmente dan valor al sistema y no en aquellas que se duplican desarrollo tras desarrollo.
  • Reducción de tiempo de desarrollo , con base en la generación de código automático.