Arquitecto: la visión desde la atalaya

Una vez un jefazo que tuve comentó (no literalmente) en una reunión que un jefe de proyecto debía de gestionar el proyecto desde la atalaya, no pegado al barro de la máquina.

Creo que el arquitecto de software debe tener un planteamiento similar. Por una serie de motivos:

Todologo

Es prácticamente imposible en un proyecto un poco grande el que una única persona conozca al detalle todas las herramientas y tecnologías como para poder ayudar a un programador. De algunas si que podrás ayudar a un programador, porque en tu carrera te hayas tenido que pelear con ella. Pero de otras no.

Un arquitecto tiene que lidiar tanto con el desarrollo puro con todas sus herramientas, que si JSF, que si JPA, que si,…. También con las bases de datos, con la gente de sistemas, para la arquitectura de las máquinas, de las comunicaciones, etc

Como dice la sabiduría popular: «el que mucho abarca, aprieta poco».

Por eso creo que un arquitecto debe tener la siguiente actitud:

Coordinador

Por eso es importante que la persona que lleve la arquitectura sea alguien con un perfil de coordinación. Que tenga un equipo de trabajo con diferentes especialistas.

Si te pegas mucho al barro pierdes la visión de la globalidad del proyecto y acabas corriendo el riesgo de dar soluciones parciales y lo que arreglas en un apartado lo estropeas en otro. O también corres el riesgo de dar soluciones poco elaboradas, que se acaban volviendo en contra del proyecto.

En el libro sobre Expreme Programing se hacia referencia a un cuadro de mandos en el que se ponía todos los mandos al máximo y el sistema era estable, porque una técnica se compensaba con la otra.

Esta es la labor del arquitecto, ver la globalidad y hacerlo estable. Por ejemplo, tengo MySQL y como tiene ciertas carencias lo tengo que diseñar con un sharding y eso me provoca ciertos problemas que puedo solucionar con una caché transversal. Esa visión transversal es la que debe tener un arquitecto. No tanto el ponerse a instalar el caché o a optimizar el JSF.

Sino los de sistemas acaban viendo solo los problemas de sistemas y los de desarrollo solo los de desarrollo y eso no es bueno. Es el planteamiento tradicional que se intenta superar con planteamientos de DevOps.

No caer en las tentaciones

A mi, a pesar de venir de la rama de desarrollo, me gusta el tema de sistemas, más como hobby que profesionalmente. Tengo mi nube casera y cosas similares.

A veces es muy tentador cuando te encuentras con cosas de sistemas, por ejemplo, que no van bien, remangarte y hacerlas tu. Pero ese no es el trabajo del arquitecto. En todo caso si es el hacer que la gente de sistemas haga las cosas bien. Lo mismo pasa con temas de desarrollo. Si por ejemplo un código no pasa la auditoria de código. Es muy tentador el adecuarlo tu.

El problema no es lo que puedas hacer sino lo que dejas de hacer. He conocido a más de un jefe de proyecto que venia de la rama técnica y que ayudaba mucho a los programadores cuando no sabían hacer cosas. El problema es que descuidaban sus verdaderas responsabilidades. Y que un programador no lo haga muy bien, es delicado, pero que no lo haga bien un jefe de proyecto lo es mucho más.

Componente != Código con muchos parámetros

Uno de los proyectos personales que he realizado ha sido ISValidator. Fue a finales del año 2001, así que ha llovido mucho desde entonces.

Mi intención era muy simple. En todas las aplicaciones típicas CRUD lo primero que realizas es coger los datos y validarlos. Así que me propuse hacer una librería para ello. Le dediqué mucho tiempo a pensarla, ha hacer algo modular, etc. No la típica situación «quick and dirty» que suele haber en los proyectos.

No me quedó mal, pero por decirlo de alguna manera me empecé a emocionar y a contemplar más casuísticas. Así que se fue complicando todo, hasta un punto en el que casi yo mismo me perdía en el código.

También es cierto que por aquel entonces era un programador.

Para lo que si me sirvió es para aprender algunas cosas.

  • Los componentes tienen que estar muy bien pensados para que sean buenos, y a veces aun a pesar de estar muy pensados no son del todo buenos. Se necesitan personas con muchos conocimientos de diseño.
  • Un componente no es un código con muchos parámetros, que es lo que suele pasar cuando se hacen las cosas con prisas.
  • Hay que ser humilde y no pretender abarcar mucho, ya que puede que si abarcas demasiado acabes generando un monstruo que no controles.

Recuerdo una empresa en la que trabajé en la que tenían desarrollado un framework para hacer las cosas más rápidas, habían invertido mucho tiempo, pero por ejemplo para hacer un simple combo había que tocar en 7 sitios. ¡7 sitios! . Si era super flexible, flexibilidad que dudo mucho que nunca se llegase a usar, pero lo que si era cierto es que costaba un huevo y parte del otro sacar adelante cualquier mantenimiento.

Que le pido a un control de versiones: Sencillez

Hasta ahora todos los requisitos que le pedía a un control de versiones eran de índole técnico. Pero hay una, quizá la más importante y subjetiva: la sencillez (de la que ya he hablado otras veces)

Por muchas características técnicas que pueda tener un control de versiones si los compañeros no lo entienden y lo usan mal, no vale para gran cosa.

Siempre cuento la misma anécdota. Hace ya tiempo jugué a un juego de carreras de coches, alguna versión del need for speed, no recuerdo cual. La cuestión es que de todos los coches que había para correr, siempre hacia los mejores tiempo con el que sobre el papel era el peor, simplemente porque era el más sencillo de conducir e iba más tiempo por el asfalto que por fuera, como me pasaba con el resto de coches.

El problema a la hora de valorar la sencillez es que es lo más subjetivo de todo. Si estás acostumbrado a CVS/SVN el paso a Git es relativamente asumible, pero por ejemplo el paso al Rational Team Concert puede ser más complejo, ya que no tiene como tal ramas, por ejemplo.

En ese aspecto si se quiere migrar de control de versiones o implantarlo por primera vez se debe valorar si las funcionalidades que te aporta el control de versiones compensa la dificultad de uso.

Así que en este apartado no voy a dar ningún ranking de cuales creo que sean mejores o peores, porque depende de la experiencia de las personas que lo van a usar.

Industrialización del Software, mi visión.

Llevo bastantes entradas hablando de la industrialización del desarrollo de software, pero en ninguna de ellas he dicho que es para mí, aunque algo ya se habrá ido adivinando, sobre todo cuando lo contrapongo a la artesanía.

Cuando estás en un proyecto pequeño, de una o dos personas, con unos requisitos bajos, normalmente se funciona como un artesano. Es decir, te ocupas de todo y es tu valía personal y tu calidad la que se ve reflejado en el producto que vendes. Esto es así tanto si haces una figurita como si haces un programa.

Cuando los proyectos son más grandes, de decenas de personas, esta forma de trabajar en la que cada uno hace las cosas según su criterio ya no sirve. Básicamente porque tu trabajo es una parte de un todo y el resultado final ya no va a depender tanto de tu valía personal y tu calidad, como cuando trabajas como un artesano, sino que aparte de esto va a depender de lo bien afinado que esté todo el equipo.

He comprobado en mis propias carnes que por muy bueno que tengas a uno en un equipo, si el resto no está a la altura el proyecto no marcha bien. Es como si una maquinaria de un reloj tuvieses una pieza muy buena, pero el resto no. El reloj no marchará bien. Tampoco lo hará si las piezas son buenas, pero no están bien ajustadas. También se suele utilizar el símil de la orquesta.

Por eso habréis podido comprobar que la mayor parte de las entradas referidas a la industrialización del desarrollo del software están dedicadas a las personas. Para mi es lo más importante, el poner más o menos herramientas lo único que hace es facilitar o mecanizar las cosas.

Para mi la industrialización del desarrollo de software es la definición de que es lo que pasa, es decir los procedimientos y herramientas asociadas, desde que una petición llega del cliente hasta que esa petición se pone en producción (o se descarta).

Entran multitud de elementos, desde la captura de requisitos, la asignación de tareas, planificación, desarrollo, verificación, traspaso, etc. Va muy en la línea de lo que serían la ISO 9000 y el CMMI, por citar algunas normativas.

Hay gente que considera la industrialización del desarrollo de software como la aplicación de herramientas estilo MDA (model drive arquitecture). Para mi esto no es industrialización del desarrollo, es automatización del desarrollo. Es decir es tener la super churrera, que te genera, ya no un trozo de programa, sino el programa completo. No digo que la automatización sea algo malo, solo que para mi son conceptos diferentes.

Auditoria de código, un arma de doble filo

Llevo utilizando herramientas de auditoria de código desde hace más de diez años. Concretamente el PMD y Checkstyle y durante un periodo de tiempo muy corto, el Together. Siempre he estado muy interesado en estos temas de hacer las cosas no solo que funcionen sino además procurar hacerlas bien.

En estos más de diez años he ido pasando por una serie de estadios con respecto a la auditoria de código. Inicialmente me parecía muy importante y ponía a mis proyectos una configuración con muchas reglas. Eran épocas en las que estos temas de cuidar la calidad no estaban muy en boga que digamos, así que era una especie de bicho raro.

Con esas configuraciones tan exigentes aprendes una cosa, que si te pasas poniendo reglas no eres capaz de pasar del hola mundo. Y no siempre acaba compensando la mejora de la calidad con el incremento de coste.

Así que empiezas a aligerar las reglas, haciendo una selección más racional.

Poco a poco afortunadamente estas herramientas se han ido popularizando y cada vez más clientes para los que he trabajando lo han ido exigiendo.

Pero cuando extiendes estas herramientas a todo el proyecto te empiezas a dar cuenta de la dificultad y del lado oscuro de las mismas. 

El que no tiene criterio para hacerlo bien, no lo hará por mucha herramienta que le pongas. He visto a programadores arreglar errores dejándolo objetivamente peor, pero eso si había desaparecido la alerta.

Esto ocurre por un motivo, estas herramientas no solo detectan errores, sino que detectan patrones sospechosos, por eso hay que tener cierto criterio.

Hay que dejar las cosas sencillas. Algunas empresas para las que he trabajado tienen definidas reglas de auditoria de código en las que el pasar o no el criterio no solo depende del nivel de error sino de cuantas alertas tengas. Es decir por ejemplo el tener un número determinado de alertas de nivel Info puede hacer que no pases el criterio.

Este planteamiento es entendible, en el sentido de que una cosa que igual no está mal, pero se repite mucho puede ser una fuente de problemas. Por ejemplo si usas mucho las conexiones a base de datos, puede ser que cierres todas correctamente, pero es un punto de riesgo.

Este planteamiento puede resultar un poco complicado de hacer cumplir a un equipo de trabajo, porque no saben si lo tienen que cambiar o no.

Yo suelo preferir, siempre y cuando el cliente no tenga sus propias reglas, obviamente, planteamientos más sencillos. Los errores son eso errores y hay que arreglarlos si o si, y el resto de cosas, warnings, info, etc es opcional el arreglarlos.

Una de las cosas que si suelo incorporar a las reglas de auditoria son todas aquellas reglas que aunque no son importantes si son automatizables por los entornos de desarrollo. Por ejemplo el hacer que los if lleven siempre llaves.

Que le pido a un control de versiones: Acceso sin cliente

No siempre que necesitamos acceder a un fichero que se almacena en una herramienta de control de versiones tenemos un cliente en el dispositivo desde el que queremos hacer la consulta, o simplemente, no queremos obtener todo el contenido para solo hacer una comprobación puntual.

El poder disponer de un acceso mediante el navegador web puede suplir esta necesidad de consulta puntual.

En este aspecto casi todas las herramientas modernas disponen de esta posibilidad, de una forma más o menos fácil. Así que no hay un claro ganador en este apartado.

Que le pido a un control de versiones: Backups

Una de las funcionalidades que creo que están bien en un control de versiones, aunque no es que sea primordial, es el facilitar el tener una copia del código en el servidor, de tal forma que si se estropea el disco duro de tu ordenador no pierdas todo el trabajo que has realizado.

Muchas veces se utilizan los comits en el servidor a modo de backups, pero esto no debiera de ser así, un comit debiera de representar un trabajo terminado. El disponer de una copia de seguridad hace que sea más fácil el mantener los comits como lo que son.

Aquí la única herramienta de las que conozco que realiza de forma nativa esto es Rational Team Concert. El resto no tiene ese soporte.

Bien es cierto que se podría realizar el backup dentro de la política de copias de seguridad de todo el equipo, no solo del código. Pero esas políticas suelen ser un poco precarias.

Comparativa de frameworks web

Empece en esto del desarrollo de webs con Java, cuando no había más que los servlets. Luego vino los JSP, los EJB, el Struts, etc.

Es curioso cuando ves que en una comparativa en la que uno de los «frameworks» que más rendimiento tiene son los simples servlets.

Como comenté en otra entrada, quizá debiéramos de plantearnos el simplificar las cosas.

También me ha llamado mucho la atención la simplicidad en el servidor de los planteamiento del GAE

Que le pido a un control de versiones: Trazabilidad

Trazabilidad. Creo que es la madre de todas las características de un control de versiones.

Es la capacidad de poder identificar que código corresponde con cada petición que te han realizado, normalmente en algún sistema de ticketing, como Bugzilla, Mantis, etc.

Cuando tienes que realizar un traspaso el poder saber que tareas tienes que traspasar y tenerlas perfectamente reflejadas en la herramienta ayuda mucho.

Aquí nuevamente el que mejor lo hace es Rational Team Concert. No hay que hacer ningún esfuerzo para tenerlo, viene de serie, además con una característica añadida y es la posibilidad de forzar administrativamente que todos los «commits» lleven obligatoriamente asociado una tarea dentro del ticketing.

Otro que lo hace relativamente bien también es el Git, ya que dispone de muchas facilidades para realizar ramas y mergeos.

El resto de los que conozco (VSS, CVS y SVN) no destacan tanto en esta funcionalidad

Que le pido a un control de versiones: Flujos

Hoy vamos con una característica que me gusta tener en los controles de versiones y que hace muy bien el Rational Team Concert y es la definición de flujos.

Es decir poder tener definido que, por ejemplo, de una rama de trabajo se pasa a una rama de integración y de esta a una rama de Preproducción, etc.

Esto te permite tener definido y reflejado tu flujo en la propia herramienta, sin tener que andar definiendolo en una normativa en papel que se puede ir saltando a discreción.

En Rational Team Concert de hecho existe el concepto de flujo en el que puedes definir de un Stream (para entendernos una rama) a donde puedes liberar el código.

Otra herramienta que lo hace bastante bien es Git, sobre todo por la posibilidad de tener diferentes repositorios remotos y la posibilidad que te proporciona el gitFlow. Este añadido a Git te define un flujo típico dentro de la propia herramienta. Bueno siempre y cuando utilices SourceTree.

El resto de herramientas de control de versiones con las que he trabajo como Visual Source Safe, CVS y Subversion no disponen de estas funcionalidades de forma nativa, así que los flujos los tienes que hacer tu a mano. Lo cual es más tedioso y propenso a errores.