Tag Archives: desarrollo software

Patrones de Análisis

Una de las personas que más ha aportado al mundo del desarrollo de software es, sin duda, Martin Fowler.

Analysis Patterns
Martin Fowler; Addison-Wesley Professional 1996

Este autor, en su afán por facilitar dentro de lo posible el desarrollo de software para todo tipo, se ha introducido en las entrañas de lo que es el software de empresa típico y ha definido elementos, objetos, patrones y ayudas específicas que facilitan el análisis, diseño y programación en general de aplicaciones de este tipo. El libro es Analysis Patterns.

La obra nos introduce en el mundo de los patrones, los conceptos y modelos de los negocios e intenta dar una visión general del porqué estos patrones pueden ayudarnos a simplificar la creación de aplicaciones. A través de los capítulos, se van viendo, tema por tema, todos los aspectos que en toda empresa se suelen abordar: contabilidad, plannings, inventario, etc.

Como suele decir Richard Stallman: “para leer buen código hay que leer buen código“; y esta obra la considero un buen sistema de análisis para el que se quiera aventurar a realizar análisis de sistemas de información.

Modelo de Dominio: la importancia de los nombres

Actulizado: se ha corregido el concepto, ya que se confundía con la definición de glosario, cuando se quería detallar que era algo más que un glosario.

En todas las empresas en las que he trabajado, siempre surge el problema de que, cuando sale algo nuevo o se crea un cierto programa, un sistema o una forma de trabajo, si la persona que la ha motivado no sabe su nombre: se la inventa.

Esto pasa con mucha frecuencia, y no es malo, pero es común que toda la empresa termine usando el vocablo en muy poco tiempo y, toda persona que entre nueva, si ese vocablo le parece desconocido o le sugiere otra cosa distinta, le lleve a confusión hasta que se lo expliquen.

Para esto se suelen hacer glosarios o lo que, en ingeniería del software se conoce como: Modelo de Dominio.

Este documento tiene varias partes, una de ellas se especifica como un glosario, estando ordenado alfabéticamente, y recogiendo todas las palabras que se usan, comúnmente en el entorno profesional en el que se mueve la empresa, y las palabras referentes a productos y servicios específicos que se comercializan o adquieren por parte de la empresa. Otra de las partes es la relación que hay entre conceptos que se manejan en la empresa, definición de características de cada uno de los elementos y restricciones de uso de los mismos.

Ceñirse a estándares es una forma de no necesitar un modelo de dominio, pero es complicado no saltarse las normas alguna que otra vez, por lo que, aún tomando precauciones de llamar a todo por su nombre, es conveniente y productivo, sobre todo para las nuevas incorporaciones o subcontratas, tener este documento disponible.

CASE: escribiendo código más fácilmente

Las herramientas CASE (Computer Aided Software Engineering, Ingeniería del Software Asistida por Ordenador), son herramientas diseñadas para dar soporte al programador a través de una interfaz intuitiva y gráfica que le permita, mediante el posicionamiento de objetos gráficos concretos, relacionados entre sí siguiendo una nomenclatura específica, desarrollar la base de un programa automáticamente.

La programación siempre ha estado respaldada por el diseño de gráficos que, de un solo vistazo, den una imagen gráfica de lo que hace un programa, como se estructuran los datos que maneja, o cómo se organiza el código que se está escribiendo. Esto se hace mediante diagramas como los de flujo de datos, organigramas, entidad/relación, jackson, OMT y UML, entre otros.

Actualmente, no hay proyecto de grandes dimensiones que no se desarrolle usando metodologías que no estén respaldadas por diagramas como los de UML. La mayoría de proyectos que se subcontratan actualmente, por consultoras, se desarrollan, principalmente, en Java.

Esto es debido a varios factores, el principal, es que los sistemas heterogéneos a los que se enfrentan los consultores, les hacen decantarse por entornos multiplataforma, como Java, para facilitar su tarea, otro motivo es que Java ha crecido de forma considerable y tiene multitud de herramientas para el desarrollo de aplicaciones de negocio.

A día de hoy, por tanto, la mayoría de herramientas CASE se basan en el uso de diagramas UML que permitan especificar una organización del código, un comportamiento, con definición de casos de uso y secuencias, para después autogenerar la estructura o esqueleto base y escribir el resto del código, dentro de los métodos que quedasen vacíos después de la autogeneración.

Las herramientas CASE más usadas en el entorno laboral y las que hay disponibles de forma libre (algunas no gratuitas) son las siguientes:

  • Visual Paradigm: esta empresa cubre con su oferta de herramientas la generación de casi todo el código y asistentes para el mantenimiento del mismo código una vez acabado, para seguir completándolo, corrigiéndolo y adaptándolo a las nuevas necesidades del cliente. Es una solución no libre y de pago, pero muy completa y aconsejable.
  • ArgoUML: de las herramientas libres que he probado, esta es una de las más completas. El desarrollo a nivel individual es muy potente y permite desarrollar de forma muy rápida una gran cantidad de diagramas UML que después se pueden autoconvertir a Java, C#, C++, Base de Datos…
  • Innovator: este software incluye características para diseño y desarrollo de software de lógica de negocio, basado en SOA y BPM. Es de pago, pero cuenta con una gran cantidad de características.
  • Umbrello: este proyecto, lo usé durante un tiempo, antes de decantarme por ArgoUML y, solo decir que, aunque es libre y tiene bastante buena pinta, el hecho de que haya quedado descontinuado (no se ha liberado ninguna nueva versión desde finales de 2007), tenía bastantes fallos.

Oracle y Sybase también tienen sus entornos para desarrollo rápido de aplicaciones, solo que son de pago y no es fácil acceder a una copia para probarlos, por lo que no los comento en la lista anterior.

Para más información puede ver la página de la wikipedia sobre CASE, la cual completa con algunos conceptos más, y mucho más software.

Paradigmas y Patrones

Al desarrollar un programa, normalmente, el desarrollador elige un paradigma de programación y algún patrón de diseño, ya sea desarrollado por él, por su forma de trabajo a través de los años de experiencia, o tomado de alguna teoría o grupo de trabajo que lo haya conseguido transmitir.

Los grandes paradigmas de programación han llevado a que existan lenguajes de propósito general orientados únicamente a uno de estos paradigmas, o lenguajes que permiten, de una forma muy flexible, usar uno u otro de estos paradigmas.

Así mismo, los patrones de diseño, en sí, no están ligados, de forma estrecha, a un paradigma concreto, con lo que se pueden llevar a cabo, normalmente, en la mayoría de lenguajes de propósito general.

Los paradigmas de programación más importantes son:

  • Spaguetti: este tipo de programación está basada en la consecución de mandatos y órdenes en líneas consecutivas, y una serie de etiquetas o numeración de las mismas líneas, que permitan el salto, en cualquier momento, de una parte del código a otra. Lenguajes de este tipo son: Ensambladores, Basic, Logo y muchos tipos de shell script.
  • Funcional o Procedimental: este tipo de programación se basa en la separación del código en unidades funcionales, normalmente identificadas como verbos o acciones (abrir, cerrar, coge, eliminar, imprime, …). Los lenguajes que hacen uso de este tipo de paradigma son: PHP, Perl, C, Fortran y Pascal, entre otros.
  • Modular: es parecido al tipo anterior, solo que las unidades funcionales se agrupan en módulos, bajo un nombre (o jerarquía de nombres), que le permite tener una organización y uso más lógico, así como seguridad y tipos de optimización al poder incluir solo partes o módulos específicos al código. Los lenguajes que hacen uso de la modularización son: PHP (versión 5.3 y superiores), Perl, Modula-2 y C (con los “namespaces”), entre otros.
  • Orientada a Objetos: este tipo de programación muestra una ideología que se centra en los datos en sí, con una nomenclatura diferente a la funcional, que incluye terminos como: clase, objeto, atributo, método, herencia, etc. Los lenguajes orientados a objetos son: Smalltalk, C++, Java y Python, entre otros.
  • Declarativo: es otra ideología diferente a la funcional, que se usa, sobre todo, en Inteligencia Artificial. Se basa en decir qué es lo que hay que hacer, y no el cómo. En este tipo de lenguajes encajarían todos los de 4ª generación, como puede ser incluso SQL, pero los lenguajes más comunes son: Prolog y Lisp; otros lenguajes que derivan de estos: Scheme y Clips.
  • Orientado a la Concurrencia: en un mundo cada vez más paralelo, donde cada proceso de servidor se ejecuta de forma paralela, pero con necesidad de combinación con otros procesos, nace la necesidad de un paradigma de programación que se base en la concurrencia, más que en los demás aspectos. Con esta visión hay lenguajes como: Haskell, Erlang y Scala, entre otros; que permiten hacer concurrencia de forma más fácil.
  • Orientado a Eventos: este tipo de programación esté íntimamente ligada al lenguaje y entorno en que se programe, ya que los eventos serán dados por el sistema en sí, y su forma de tratarlos y las facilidades que se puedan conseguir vendrán determinadas, en parte, por el lenguaje que se use. Es el caso de la programación de interfaces de usuario con Swing en Java, por ejemplo.

Habiendo elegido el paradigma que más facilite la forma en la que queramos realizar el diseño y codificación, así como el lenguaje, seleccionar un patrón de diseño puede ser el siguiente paso. Patrones hay muchos y sería complicado listarlos todos, pero voy a poner los que más suelo usar y los que he ido aprendiendo… si sabéis alguno más que se me escape, podéis agregarlo como comentario. De todas formas, en la wikipedia se puede tener más información sobre los Patrones de Diseño.

Los tipos de los patrones de diseño son, según la wikipedia:

  • Creacionales: que son los que se usan para la creación o instanciación de datos, objetos o recursos (Factory, Singleton, …).
  • Estructurales: son los que hacen de mediación entre dos partes específicas, como Proxy, que se encarga de agregar seguridad a un código ya programado.
  • Comportamiento: establece la forma de funcionamiento de una parte de código en sí, dando una capa de abstracción al código para su mejor comprensión.
  • Sistema: son patrones de diseño más completos que envuelven a todo el sistema a desarrollar en sí, no solo una parte o un cierto algoritmo. El más característico es el MVC, Modelo-Vista-Controlador, que separa en tres unidades lógicas el desarrollo de la aplicación.

Los patrones de diseño se pueden mezclar entre sí, aunque los de Sistema es más complicado mezclarlos entre sí, sí que pueden ser usados conjuntamente con el resto de patrones, como los creacionales y de estructura, sin problemas.

Desmitificando: software y su mantenimiento

Desde siempre, cuando una empresa apuesta por software privativo frente a software libre o de fuente abierta, lo hace por tener cubiertas las espaldas, por tener garantías y saber que hay una empresa que responde por ese software, tanto en mantenimiento, como en incidencias graves, que pueden llegar a pagar indemnizaciones.

Este es el principal motivo de que se abogue por software propietario, simple y llanamente. Cualquier otro motivo es un mito, como cualquiera de los siguientes:

  • Una empresa te dará más y mejor soporte: normalmente suele… o solía ser así. Las empresas de software contratan programadores, analistas y una serie de personal que son capaces de desarrollar un software más o menos eficiente y después mantenerlo… pero, existen muchos casos en los que este soporte y mantenimiento, no se ha pensado, no se da o es ineficiente. Por:
    • El software se ha desarrollado contra-reloj, sin fuerte planteamiento flexible a cambios y falto de documentación sobre la filosofía que sustenta que todo esté “ensamblado” de la forma en la que lo está.
    • La programación ha sido realizada “sobre la marcha” haciendo el software inconsistente, con gran cantidad de fallos y las soluciones no terminan de llegar. Con cada incidencia reportada aparecen nuevas.
    • El equipo de desarrollo cambia íntegramente o parcialmente, haciendo que el nuevo equipo programe el hard-coding de una forma distinta al anterior grupo, con lo que el software va mutando y distnaciándose del planteamiento original, que fue informado únicamente al primer grupo.
    • Una empresa tiene los recursos humanos limitados y, en caso de tener mucho trabajo, puede que incluso esos recursos humanos ya no respondan de la misma forma que al principio.
  • Una empresa te garantiza el software: hay cláusulas que limitan ese tipo de garantía y, en muchos casos, incluso las incumplen con lo que tienen que tirar de un seguro que les pague la indemnización. Tener una garantía no te asegura que funcione y, sobre todo, si quien te da la garantía tiene una veracidad y credibilidad dudosa.
  • El software propietario está mejor hecho: no se sabe, puesto que no se puede ver. Lo que sí se sabe es que no debe de estar tan bien hecho cuando necesita ser reescrito entre versiones, muchas veces. De igual forma, sería mejor no fiarse de una empresa que no tenga departamento de calidad, que certifique que el proceso de desarrollo ha sido llevado usando un cierto proceso lógico y se han llegado a cumplir una serie de espectativas de forma satisfactoria.
  • Es mejor tener el producto que no un servicio: ciertamente, y por eso se debería de preferir tener un software con una licencia que te permite ciertas libertades sobre él, y no un producto del que solo se ha comprado una licencia que te permite usarlo con muchas limitaciones. Muchas veces incluso limitaciones en el tiempo. Adquirir una licencia es como adquirir el servicio de uso sobre un producto, a modo de alquiler, pero sin la ventaja de poder reemplazarlo sin coste adicional en caso de deterioro, el servicio de mantenimiento se suele contratar aparte.
  • Software a medida es caro, difícil de hacer y no suele cubrir las espectativas: si se piensa esto es que no se ha pedido su desarrollo a una empresa seria. El desarrollo de software es un proceso que se debe de seguir, desde una especificación hasta obtener el producto que el cliente quiere usar. Cuando se desarrolla sin seguir un protocolo, con limitaciones o simplemente saltándose pasos… esto deriva en un software “mal acabado”, que no cumple con los requisitos iniciales y que deja la sensación de que, cualquier “chapuza” sobre un software ya hecho (como Office o similar) hubiese sido mejor.

Bueno, la verdad es que podría extenderme mucho más, porque las chapuzas en el campo de la informática están a la orden del día, pero con tener presentes estos puntos, creo que es suficiente para tener una visión un poco más amplia de lo que hay y lo que realmente se debería de buscar en cada caso.

Recordar también que, el software libre es una gran librería de programas que sirven para probar, seleccionar algo que guste usar y solicitar modificaciones y/o ampliaciones sobre ese software en caso de necesitarlas.

PHP no es para todo

La popularización de los lenguajes de programación, hace que muchas veces, una aplicación que se desarrolló en otro lenguaje, sea portada a ese nuevo lenguaje, para demostrar su potencia, sencillez o capacidades.

Algunas veces, esos nuevos lenguajes, resultan ser muy buenas herramientas que nos permiten trabajar más rápido sin necesidad de centrarnos mucho en problemas típicos y ya salvados desde hace tiempo (como las cadenas de texto y los tamaños de memoria han sido un gran problema a la hora de escribir programas en C/C++).

Lenguajes como Perl, PHP, Python, Tcl, Ruby… son lenguajes que no requieren de compilación, tienen un nivel de programación muy alto y no suelen estar ligados a una plataforma concreta, con lo que el mismo código puede ejecutarse sin problemas en otras plataformas (Windows, GNU/Linux, BSD…), su código es muy fácil de escribir y, en pocas líneas, se hacen muchas operaciones.

No obstante, cabe recordar que, los lenguajes que se escriben con particularidades específicas y especiales, suelen servir de forma muy óptima y potente a esas particularidades, pero de forma contraria, e incluso ser un lastre, en otros entornos de la programación.

Como ejemplo, tal y como dice el titular, PHP, que nació para la web, ahora se emplea como lenguaje de scripting para la consola e incluso con GTK para generar scripts fáciles que permitan automatizar el equipo. Pero, PHP no es para todo, y con esto quiero decir que PHP tiene sus pequeñas limitaciones.

Una aplicación en GTK o en un entorno de ventanas, por ejemplo, debe de tener capacidad multihilo y capacidad para compartición de memoria entre dichos hilos. PHP carece de ello. Es normal, la web no requiere estos mecanismos.

Al igual que para la rápida detección de ciertos tipos de texto y conversión de formatos o cálculo de datos en formato CSV se ha empleado siempre Perl, y ahora se comienza a emplear también Ruby, en línea antecesora del uso de herramientas dispersas como sed, awk y shell script. PHP también se emplea para estos cometidos, pero no es óptimo para ello, puesto que su núcleo de ejecución no está optimizado para una sola ejecución, sino para una repetición de ejecuciones secuenciales y/o paralelas.

Si comparamos la velocidad de ejecución de PHP y Perl, veremos que Perl se ejecuta casi tan eficientemente como C, puesto que está pensado para tareas de administración de sistemas y automatización de tareas, mientras que PHP no requiere de ello para su tarea cotidiana, que es la web, donde el intérprete de PHP no tiene que cargarse en cada ejecución, sino que permanece cargado a espera de ser llamado.

Pero, al igual que PHP no es para todo, los demás también tienen sus limitaciones. Por ejemplo, Perl se ha usado históricamente como CGI, mientras que Perl no es óptimo para la web en sentido de que PHP es más rápido en este contexto (gracias a técnicas de caché y aceleradores que se integran en el motor de Zend), más fácil de desarrollar y mantener.