Si me preguntan cuáles son las prácticas que deberían aplicarse a un proyecto de desarrollo de software hoy en día, sin importar su tamaño, yo rápidamente respondería:
- Utilización de containers para levantar entornos de trabajo.
- Código versionado en herramienta moderna. Hoy en día el estandar de la industria es GIT
- Aplicar refactorización a ese código.
- Que ese código tenga una buena cobertura.
- Integrar las modificaciones al código continuamente y que un server compile el código y verifique que no haya roto nada.
- Hace un análisis de mi código que me asegure que sigo standard, que me de métricas sobre mi código, etc.
- Test automatizados
- Delivery / deploy automatizado y continuo
Y si me apuran aún mas, respondo "
como mínimo integrar las modificaciones al código continuamente y que un server compile el código y verifique que no haya roto nada" aunque a veces en mucho pedir.
Ahora, déjenme que les cuente una historia a ver si les suena familiar.
Este año me sume a trabajar a un equipo que desarrollaba una aplicación web para un cierto cliente. El código ha sido tocado por mucha gente, de distintos senorities y ni hablar de los errores inexplicables que se encuentran o del código dulpicado que hay.
El código fuente del proyecto estaba hosteado en el TFS del cliente con un
Jenkins build server y deploy server (que no controlamos). Este build server no está configurado como
integración continua
El Jenkins ejecuta un análisis de código con
SonarQube aunque tampoco tenemos acceso. El acceso a los análisis de SonarQube nos serviría para tener métricas de nuestro código, ver como evoluciona / involuciona y ayudaría a los desarrolladores más juniors a que aprendan y mejoren.
A pesar que no hacemos
TDD (y que la arquitectura de app no lo permite), hay algunos
unit test escritos que nunca se ejecutan.
Conclusión: casi ninguno de los puntos nombrados al principio se cumplen.
¿Seguimos desarrollando así? la respuesta es muy simple NOOOOOOOOOOOO
¿Qué opciones tengo? ahi la cosa es más compleja pero nada complicado gracias a la cantidad de herramientas con las que contamos hoy en día:
- Utilizar un GIT controlado por nosotros y luego integremos los cambios en el TFS. Esto es facil de hacer con GIT TFS, un comando que nos permite clonar en un repo GIT el código fuente hosteado en un TFS y tener una comunicación bidireccional. Una vez que controlamos el repo, el resto es más facil!
- Como integración continua podemos usar algo como Azure DevOPS para que buildee el código continuamente y ejecute las tareas que necesitamos:
Ya con el hecho de usar
GIT TFS y
Azure DevOPS junto a los Unit Test y SonarQube logramos tener mucho más de lo que originalmente teníamos y hemos mejorado notablemente nuestra calidad.