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.

Que le pido a un control de versiones: favorecer comits atómicos

Todos hacemos comits constantemente en nuestros sistemas de control de versiones. Una de las características que valoro en estas herramientas es la facilidad que den para hacer comits atómicos.

En decir, cuando tienes un cambio que afecta a muchos ficheros, muchas veces se cae en la tentación de ir revisando cada fichero para ir seleccionando cual hay que comitear y cual no, pero comiteando cada fichero revisado, en vez de todos juntos.

Aunque obviamente tienes todos los cambios en el control de versiones, no tienes todos agrupados, porque has ido haciendo varios commits, según revisabas.

Esto hace que si quieres llevarte el cambio a otro sitio o sacarlo de una versión sea más difícil con varios commits que con uno único.

De los controles de versiones con los que he trabajado, solo hay dos que facilitan estos commits atómicos, y son el Git y el Rational Team Concert.

Ni el Visual Source Safe, ni el CVS, ni el Subversión lo hacen.

Que le pido a un control de versiones: suspender trabajos a medias

Inicio con esta entrada una serie de sobre que requisitos creo que debe cumplir un sistema de control de versiones. La intención es hacer entradas cortas reflejando las características que me gustaría tener.

La primera característica es la de poder suspender trabajos. Es decir, mientras estas realizando una tarea poder guardar el estado de tu entorno de trabajo para atender otra tarea más prioritaria, por ejemplo, un error en producción, y una vez solucionado esa tarea prioritaria, poder continuar con la tarea que originalmente estabas realizando.

De los controles de versiones con lo que he trabajado los únicos que lo implementan de forma nativa son el Git y el Rational Team Concert.

El resto de herramientas con las que he trabajado (Visual Source Safe, CVS y Subversion) no lo soportan de forma nativa, así que hay que recurrir a métodos más manuales como comitear los cambios a medias o bien a guardárselo en otra carpeta. Ambas soluciones muy poco elegantes.

Mudanza de dominio finalizada

Pues resulta que después de 12 años con el dominio albergado en un proveedor americano, de Nueva Orleans para más señas, decidí hace unos meses pasarlo a un proveedor español.

Originalmente estaba en USA, porque por el año 2001, que es cuando lo compré, no había ese tipo de servicio por aquí. Pero hoy día si lo hay y prefiero que me atiendan en mi idioma, y darle las «perras» a alguien más cercano. Cuando trabajaba en Bilbao, pasaba todos los días delante de sus oficinas.

El traspaso ha sido un poco problemático como ya comenté . Hay varias lecciones aprendidas.

  • Si quieres traspasar un dominio americano (.com o .net) estate seguro de que tienes deshabilitada la protección contra robos, sino no vas a poder traspasarlo. 
  • Hazlo con tiempo, yo lo hice con un mes de antelación antes de que me caducase y aun así me quedé sin la redirrección durante diez días.
  • Te tienen que pedir un AuthCode, para verificar que tu eres el dueño.
  • Para comprobar como están los DNS en Linux hay una herramienta que se llama whois, que hace las consultas a los registros. También es útil el usar el nslookup para realizar consultas a los DNS directamente.

Existe la posibilidad con Blogger de redirigir tu nombre de dominio (www.inigoserrano.com) a tu blog sin tener que andar con trucos como los frames. La opción la tienes en el menú configuración, opción Básica.

Así que me he pegado un poquito estos últimos días con DNS y demás.

Como sobrevivir a un jefe dificil

Una de las cosas que más me preocupa a la hora de industrializar un desarrollo de software es la actitud de los compañeros. Es algo que va a marcar decididamente el devenir del proyecto. Herramientas de ticketing, Auditorias de código, herramienta de pruebas funcionales y demás artillería no sirve de gran cosa si las personas involucradas en el proyecto no tienen la actitud adecuada. Actitud que es muy difícil de tener en estos tiempos de crisis.

He encontrado un artículo muy interesante sobre como sobrevivir a un jefe difícil. Iba a ponerlo simplemente como una entrada en twitter y en linkedIn, pero me parece que es lo suficientemente interesante como para darle algo más de entidad y dedicarle esta entrada del blog.

Leyéndolo me ha recordado algo que me enseño un antiguo jefe, el intentar ponerse en la situación del otro para intentar entender porqué hace lo que hace. Suele dar buenos resultados.

Es muy tentador el quedarse solo en echarle las culpas de los problemas a otro y no intentar hacer algo de autocrítica, aunque sea de forma privada. Por experiencia se que si las cosas van muy mal normalmente no hay un solo culpable, suele haber más de uno.

Uno de los objetivos de las entradas del blog referidas a la industrialización del desarrollo es poder compartir vivencias que puedan servir a otras personas para entender mejor como funciona un proyecto de desarrollo que tenga un cierto tamaño. Estás son mis vivencias, si las contrastas con tus propias experiencias y las de otras personas, podrás sacar tus propias conclusiones, y te enriquecerás. Como habrás podido comprobar muchas veces hago referencia a otros compañeros, jefes o no, que me aportaron sus puntos de vista. Unas veces esas opiniones me convencieron y las incorporé a mi «mochila» y otras no. Creo que es bueno escuchar a los jefes, o a compañeros con más experiencia, ya que ya han recorrido el camino por donde tu estás transitando.

Que mal venden el Git

Estoy empezando a usar el repositorio de código Git, como ya comenté en unas entrada de mi proyecto MyCloudChest. Cada día me gusta más, pero tengo que reconocer que me parece que se venden muy mal y me ha costado verle las mejoras que aporta.

Me explico. Si miras por Internet lo primero que te destacan es que es un repositorio de código distribuido, que te permite trabajar, por ejemplo, mientras vas de viaje en un avión y no tienes conexión. 

Me imagino que la gente que escribe eso viajará mucho en avión, pero cuando te lo planteas para tu empresa, pues no se en estados unidos, pero en los sitios en los que yo he trabajado, los programadores están en la oficina en su mesa trabajando con un ordenador de sobremesa, así que de primeras no le ves mayor utilidad y lo descartas.

Por circunstancias, que ya explique, si que me ha sido útil el usar un repositorio de código distribuido, para avanzar en el pueblo en este proyecto personal, porque allí (o más bien aquí que ahora mismo estoy escribiendo esto desde el pueblo) no dispongo de ADSL, solo móvil.

Los viajes en avión no, pero en cambio si hay situaciones que se me han planteado en varias empresas y con varios clientes en las que un repositorio como Git puede ser útil. Muchas empresas te obligan a dejar el código en sus repositorios, normalmente Subversion. Pero claro, no siempre tienes una buena conectividad con esos sitios, ya que suelen darte acceso mediante VPN. Esto te obliga a tener tu repositorio Subversion en tu empresa, para poder trabajar con eficiencia y luego hacer un corta y pega al repositorio del cliente y subirlo mediante la VPN.

Como el Git permite trabajar con varios repositorios «servidores» si puede ser más adecuado que un Subversion.

Esto si me parece una situación más cercana, no como el trabajar desde el avión.

Otra de las cosas que no veo bien explicadas es el uso de la zona de staged, cuando lo ves lo primero que piensas es, vaya rollo, tengo que añadirlo a la zona de staged, luego comitearlo y luego empujarlo. Si en subversion hago un commit y ya está, se me van a liar los programadores y siempre procuro gestionar la capacidad de la gente.

Me dio la pista un vídeo de aprendegit.com

Lo que si que he visto en muchos casos, y he de reconocer que yo también he hecho, es el comitear cambios de una única incidencia en varias veces, porque tienes muchos ficheros modificados y vas revisando uno a uno a ver si es un cambio que tienes que subir o no.

En esta situación si que es claramente interesante el disponer de la zona de staged. Voy revisando los ficheros y decidiendo cual debo subir y cual no, y una vez que los tengo todos revisados los comiteo en bloque.

A esta situación de ejemplos poco realistas, a mi parecer, no ayuda mucho tampoco los clientes gráficos de Git, con Eclipse y su pluggin no he sido capaz de actualizarme unos cambios que tenia en el servidor, me daba un error de que no tenia un branch configurado. Menos mal que ha salido hace no mucho el programa SourceTree que es mucho más intuitivo y con ese funciono mucho mejor.

En resumen, un repositorio de código que tiene muy buena pinta, pero con una entrada bastante dura.

Gestionar la capacidad de la gente

Una de las cosas a las que más atención presto cuando tengo que diseñar la arquitectura de una aplicación o plantear la industrialización de un desarrollo es el gestionar la capacidad de la gente. No todo el mundo tiene la misma capacidad de «coco», pero si que hay una cosa cierta, nadie la tiene infinita. Así que hay que pensar muy bien con que cosas quieres llenarla.

Normalmente, independientemente de la capacidad natural de cada persona, con el tiempo esa capacidad se va aumentando, porque ya vamos teniendo cimientos sobre los que asentar los nuevos conocimientos.

Como he comentado en alguna otra entrada, llevo en el mundillo del desarrollo de webs con Java, de cuando eran webs y no aplicaciones lo que se hacían. Así que he visto como se ha ido complicando todo. Todavía recuerdo en uno de los primeros proyectos de envergadura en los que participé como un compañero me decía, que para que me preocupaba tanto por el código, si no lo mira nadie.  Hoy día casi todo el mundo tiene controles da calidad en el código.

Alguna vez comentando con compañeros de trabajo sobre estos temas, ponía de relieve que a los programadores se les empezaba a exigir saber de Java, JavaScript, Html, Bases de datos, etc y encima con auditoria de código, normas de base de datos, normas de usabilidad, etc, pero luego se les daba nada de tiempo para que hiciesen el mantenimiento en cuestión.

Así que siempre intento dejar las arquitecturas de las aplicaciones o las metodologías de trabajo lo más sencillas posibles. Recuerdo una presentación que vi en Internet de la arquitectura de Pinterest, en la que recomendaban justo esto mismo. Decían que mejor dejar la arquitectura lo más sencilla posible, porque siempre acabará fallando y cuando más sencilla sea más fácil será de arreglar. Explicaban la arquitectura que habían ido siguiendo ellos y como tuvieron que simplificarla.

Me ha sorprendido lo simple que es la arquitectura de desarrollo que se propone en el Google App Engine. No hay capas y más capas de servicios. Es todo mucho más plano.

Me he dado cuenta también de la cantidad de cosas que hacemos sin reflexionar, dejándonos llevar por lo que se hace en el mercado, sin ser un poco críticos con ello. Montamos arquitecturas aplicando mil patrones para dotarnos de una flexibilidad que luego en la mayor parte de las veces no usamos. Pero lo que si que encarecemos es la creación de las aplicaciones.

Recuerdo en una de las empresas en las que trabajé que se tenia una arquitectura de hacer las aplicaciones en las que se tardaba unos 5 días por mantenimiento, hasta que se marchó la persona que definía esas cosas y le pudimos meter mano. Aligeramos la arquitectura y se dejó cada mantenimiento en 4 días. Habíamos bajado un 25 % el tiempo de desarrollo en cada mantenimiento. Simplemente quitando flexibilidad que no servia para nada.

Sigue a los mejores

En este negocio del desarrollo de aplicaciones, cuando te enfrentas tanto a la definición de Arquitecturas Web, como a la Industrialización del desarrollo hay multitud de herramientas y de técnicas disponibles.

Supone un trabajo ingente el valorar y monitorizar la evolución de tal número de herramientas. Yo desde hace mucho tiempo he optado por una estrategia que me ha dado buen resultado.

Normalmente suelo monitorizar algún sitio de referencia para estar al tanto de las novedades que van surgiendo y cuando sale alguna herramienta o tecnología que no conozco y está en el área en el que me muevo le echo un vistazo, para estar al día.

He tenido compañeros que aparte de ir al web y enterarse a nivel teórico, incluso hacían una prueba por ellos mismos. A mi esto me parece dedicar mucho esfuerzo a conocer las interioridades de algo que no sabes si vas a llegar a necesitar en algún momento. Yo prefiero quedarme con el nombre de la herramienta y para que sirve y si en algún momento necesito esa funcionalidad recuperar la información y si procede probarlo, pero ya con un objetivo concreto.

Últimamente sigo bastante a Google, que aparte de tener una multitud de servicios para usuarios finales también tiene una sección de desarrollo con multitud de herramientas, guías, etc.

Son los que tienen la nube más grande y sus productos están diseñados para soportar una carga de trabajo muy alta.

Normalmente no vas a necesitar esos niveles de rendimiento, pero está bien ver como lo han resuelto ellos, para tomar ideas.

Negociar con tu jefe

Cuando hablamos de industrializar, lo normal es que se nos venga la cabeza la típica imagen de una fábrica de coches, en contraposición a cuando hablamos de la artesanía, en la que lo normal es que se nos venga a la cabeza la imagen de algún orfebre, una encajera, etc.

La principal diferencia es que en la industrialización hay implicadas más de una persona y en la artesanía normalmente solo una.

Uno de los puntos que van a marcar la diferencia en la industrialización es lo ajustado que estén todas las personas involucradas y en lo afinado que esté el procedimiento de trabajo.

Negociar

Hoy quiero comentar respecto a la industrialización del desarrollo la importancia de la negociación y el saber delegar. Ambos son actitudes muy importantes para lograr que la maquinaria de producción vaya fina (No producimos coches ni lavadoras, pero si programas).

En mi vida profesional he tenido jefes y personas a mi cargo de todo tipo.

Con los jefes, hasta los más intransigentes, he procurado negociar las tareas. Digo negociar, no regatear. Me explico.

Puede ser que tu jefe te pida realizar alguna tarea o bien que tu mismo le propongas algún tipo de mejora. Entre dos personas puede suceder que haya un entendimiento a la primera, con lo que no hay nada que negociar, o bien que no lo haya. En este caso lo ideal es que cada uno de sus argumentos para intentar convencer al otro de la bondad de sus planteamientos. Puede ser que uno convenza al otro. Si esto no es así al final se aplica la jerarquía. Cada uno tiene su parcela de responsabilidad, por la que tiene que rendir cuentas, y consiguientemente su autoridad correspondiente. Así que normalmente no es una negociación muy larga.

Recuerdo una conversación que tuvimos un par de compañeros con el jefe, en la que le comentábamos (bueno realmente le recriminábamos) sobre otro compañero, que a nuestro entender no estaba haciendo las cosas bien y nos estaba perjudicando seriamente. La verdad es que era un jefe muy tolerante, que nos dijo algo que me parece muy importante tener siempre en cuenta. «Yo creo que es mi obligación escucharos y tener en cuenta vuestras opiniones, pero al final el que tengo que tomar las decisiones soy yo, porque soy el que tengo todos los datos».

Una vez que se llega a un acuerdo, como he comentado en otras ocasiones, lo que queda es cumplirlo de la mejor forma posible, estés o no de acuerdo. Todo el mundo está en su perfecto derecho de pensar lo que quiera, pero no de hacer lo que quiera.

Es muy raro que alguien confíe en otro si una vez llegado a un acuerdo no lo cumple. Tuve un jefe que nos comentaba que a lo largo de la vida te vas rodeando de la gente que te funciona. Era en medio de una conversación sobre una serie de personas que no le estaban funcionando y que al final acabó despidiendo.

Recuerdo un caso de una persona que tenia a mi cargo que pensaba que el era lo más de lo más y consiguientemente iba por libre. Total, si era lo más de lo más para que me iba a comentar nada y no se le ocurrió otra cosa que, en vez de hacer las cosas como le había pedido, secuencialmente, hacerlas de otra forma, en paralelo. Solo que no tuvo en cuenta que era un proyecto con hitos intermedios y penalizaciones… Lo más de lo más…

Tu jefe tampoco tiene porque estar justificando todas y cada una de sus decisiones. Por eso hablo de negociar, no de regatear, ni de pedir justificaciones.

Recuerdo una vez que me comentó una compañera, que según la planificación tenia que hacer un mantenimiento, pero que su compañera estaba haciendo uno muy parecido en ese momento y que igual mejor se ponía con el siguiente y así cuando su compañera lo terminase a ella le serviría de base. Por supuesto le dije que si. Hay que sacar lo mejor de los compañeros en beneficio del proyecto y no recurriendo a la solución clásica de que metan horas.

La negociación no siempre es aplicable o interesante.

Hay veces que la situación es crítica y no hay tiempo para andar negociando, es ordeno y mando, porque está en juego la supervivencia del proyecto.

Otras veces te encuentras con jefes que no saben delegar, todo lo tienen que hacer ellos, decidir ellos, proponer ellos, etc. Esos jefes te van a dejar poco margen de maniobra.

Lo que hay que tener muy en cuenta es que lo que vas a proponer a tu jefe. Puede llegar a ser contraproducente si le andas planteando cosas que den muestra de que tienes la cabeza llena de pajaritos. Este tema de estar muy seguro de lo que propones ya lo he tratado anteriormente.

El hacer que todas las piezas de la maquinaria funcione de la mejor forma posible es una responsabilidad de todos.

Levanta la mano y pide ayuda

Hay un concepto que es primordial, tanto en tu profesión, como en la vida misma: Cumplir los compromisos

Si no cumples corres el riesgo de que te consideren poco fiable y eso es algo que no es para nada interesante.

Cuando quieres industrializar el desarrollo de software no siempre es fácil de cumplir los compromisos, ya que dependes, de muchos factores que escapan de tu control.

Hoy quiero hablar de uno de los elementos más determinantes, los compañeros, el equipo de trabajo. Con suerte compañeros con experiencia que saben como funciona el negocio y otras veces compañeros con poca experiencia.

Creo que es importante insistir a los compañeros con menos experiencia lo importante que es el hecho de cumplir los compromisos. Y que cumplir el compromiso global de entregar la aplicación se basa en el cumplimiento de todos los pequeños compromisos de cada una de las pequeñas tareas que se van encomendando.

Cuando se acerca tu jefe y te indica que tienes que realizar tal mantenimiento para tal fecha y dices «vale» o simplemente no dices nada, has contraído un compromiso. Puedes tener suerte y que tu jefe esté sentado cerca tuyo y tenga pocas personas bajo su responsabilidad y pueda estar haciendo un seguimiento cercano, para ver que tal vas. Pero puede ser que no sea el caso y no pueda estar (o no quiera) como una madre preocupándose de todo. Pero esta situación no hace que los compromisos desaparezcan, siguen ahí.

Yo he estado en ambas situaciones, siendo responsable de un grupo de gente y poder dedicar tiempo al seguimiento y en otras ocasiones no pudiéndoles dedicar tiempo a ese seguimiento.

En estas ocasiones de falta de dedicación aplico un criterio que me comentó un antiguo jefe: «Mientras no digas lo contrario asumo que todo va conforme al plan y si tienes algún problema levanta la mano y se te ayudará».

Concepto simple, pero ¡que difícil es de llevar a la práctica!. Con suerte te encuentras con compañeros que te avisan justo el día de entrega, cuando ya no tienes margen de maniobra. Sin suerte, tienes que ir tu a preguntar: oye esto que tenias que acabar hace dos días está acabado?

Yo por lo menos nunca me he enfadado con alguien que se ha encontrado con dificultades y ha pedido ayuda cuando ha notado que se atascaba. Otra cosa es que igual no se le ha podido ayudar. Pero si que me molesta mucho los que incumplen sus compromisos y no alertan, porque afectan al cumplimiento de los objetivos del proyecto.

Hay un colateral al tema de levantar la mano y pedir ayuda, y es cuando la gente recurre muy alegremente a pedir ayuda. Hay que tener en cuenta el hecho de que alguien te ayude significa que sumas más horas a la tarea, las tuyas y las de quien te ayuda, y aunque cumplas el plazo no cumples el coste. Y el compañero que te ayuda también tiene compromisos que cumplir y te está dedicando su tiempo.

Es difícil dar una regla de cuando levantar la mano y cuando seguir intentándolo por tus propios medios. Solo dos reflexiones. El plazo de entrega hay que cumplirlo, si ves que no vas a llegar, levanta la mano. A más levantes la mano más van a pensar que no vales para hacer ese trabajo… tu mismo.