¿Se puede hacer un despliegue continuo con programadores junior?

11

Hay un momento en el que comienzas a comprender que, en la arquitectura de micro servicios, es más aterrador esperar una semana para implementar todos los microservicios a la vez para asegurarte de que todo funcione en conjunto, en lugar de aplicar estrictamente el control de versiones de la API, escribir muchas pruebas (un poco de cada: unidad y exploración, integración), y despliegue automático a producción tan pronto como su confirmación pase como pruebas en el escenario.

Ahora, parece una gran idea siempre que recuerde escribir pruebas, probar los cambios antes de confirmar, saber cómo usar el control de versiones de API y no va a soltar la base de datos en su script de actualización incremental de db que se ejecuta en la implementación (que no es un gran problema, ya que debería fallar en el escenario).

¿Pero es factible hacerlo con programadores junior? Tal vez tendré que implementar el esquema de solicitud de extracción. ¿Esto lo haría menos como una implementación continua (eso es lo que supongo)?

Espero que esto no se base en una opinión y puedo contar con que comparta su experiencia, gracias.

Tenga en cuenta que no estoy preguntando sobre CI ni sobre la entrega continua. Ya tenemos eso. Lo que estamos intentando ahora es hacer un despliegue continuo, lo que significa tenerlo todo en producción justo después del check-in del código.

Doker
fuente
it is more scary to wait a week to deploy all micro services at once to make sure that everything works together, than to strictly enforce api versioning, write lots of automatic tests (...), and auto deploy to production as soon as your commit passes as tests on stage- eso está basado en la opinión;) En mi humilde opinión, es mucho más difícil garantizar el éxito con la implementación de servicios independientes que con un enfoque monolítico: softwareengineering.stackexchange.com/a/342346/187812 . Y con un verdadero CI (sin ramas de características / integración) no debería tener que esperar una semana.
Dan Cornilescu
Un buen sistema de CI debería ayudar: todos cometen errores, no solo los juniors. Y las roturas no necesariamente significan que los desarrolladores cometieron errores o no hicieron su trabajo correctamente, vea ¿Cómo pueden los cambios previamente verificados con éxito causar regresiones que deberían haberse detectado?
Dan Cornilescu

Respuestas:

16

Por qué no? Cualquiera de las cosas que describa sería un problema si usa la implementación continua o no. Parece que el problema es que le preocupa que los juniors cometan un error catastrófico. Y que ese error se apresurará a la producción antes de que alguien pueda detectarlo.

Es por eso que haces revisiones de código y pruebas. Antes de que algo se fusione con su rama maestra y esté programado para su lanzamiento, solicite que sea revisado por código, tanto por otros junior (para que obtengan experiencia) como por desarrolladores senior (para usar su experiencia para mejorar el código). Todos deberían estar buscando estos errores catastróficos. Y debería detenerlos. Si no es así, probablemente necesite un mejor control de calidad / prueba en un entorno de ensayo (y tal vez algunos mejores desarrolladores si las revisiones de código pierden estas cosas).

Becuzz
fuente
1
Me preocupa que el uso de ramas de características y solicitudes de extracción reduzca la implementación continua. Uno de los aspectos que quiero resolver es la compatibilidad entre componentes. Estoy seguro de que trabajan juntos después de hacer un cambio en uno de los servicios. Me siento estresado cuando tenemos que empujar todos juntos después de muchos cambios. Si reviso los cambios antes de que se unan a la rama maestra, incluso podría confundir el orden de los cambios ya que los componentes están en repositorios diferentes.
Doker
@doker Si le preocupa tener que juntar muchos servicios, no lo haga. Asegúrese de que cada servicio (y los cambios realizados en él) sean independientes. Si se cambia el servicio A, realice una revisión rápida del código para asegurarse de que funcionará con los nuevos cambios y se puede implementar por sí mismo. Si se realizan cambios importantes, use la revisión de código como un lugar para imponer el control de versiones de API. Si el servicio B depende del servicio A, primero haga el trabajo en A y luego sáquelo. Luego trabaje en B. Si un joven pasa a cambiar a A, B, C y D y todos son interdependientes, deben documentarlo para que pueda revisarlo.
Becuzz
1
@doker Este tipo de escenarios es la razón por la cual las personas de implementación / entrega continuas son a menudo muy profesionales. Si sus cambios suelen estar detrás de los cambios de características (no necesariamente cada pequeño cambio), puede desplegar piezas siempre que las funciones estén desactivadas, activarlas cuando todas las piezas estén en su lugar y desactivarlas si encuentra un problema importante.
Derek Elkins salió del SE
3

La implementación continua funcionará bien si tiene un buen conjunto de pruebas automatizadas.

Los desarrolladores junior pueden entusiasmarse con su propia tarea y no ver que rompen las cosas. Puedes arreglar esto con algo de automatización. Configure un servidor de compilación que ejecute pruebas todo el tiempo y obtenga una herramienta como el notificador de compilación CatLight . Les dará una respuesta rápida y clara cuando rompan las cosas.

Icono de estado de compilación de CatLight

Solucionarán pequeños problemas a medida que sucedan y mantendrán su entrega continua en funcionamiento.

alex
fuente
3

La única forma de aprender buenos hábitos es practicarlos, por lo que sí, los desarrolladores junior también pueden practicar la implementación continua. Es posible que desee considerar agregar pasos en la tubería para hacer cosas como verificar la cobertura de prueba y posiblemente ejecutar un análisis de código estático, y fallar la compilación si la cobertura de prueba no es lo suficientemente alta. Eso asegurará que los desarrolladores junior entiendan las expectativas antes de que algo se considere completo.

IrlandésLagger
fuente
1

No solo eso se puede hacer con desarrolladores junior, sino que se requiere de usted. Primero, reducirá la calidad de su software de otra manera, y en segundo lugar, esto ayuda a los desarrolladores junior a aprender buenas habilidades de desarrollo de software.

Como analogía: ¿Le gustaría que su médico no practique la medicina a su leal saber y entender porque tendrá miedo de los errores de los jóvenes aprendices? ¿Cómo manejan los médicos el daño potencial?

Belgi
fuente
1

De la experiencia pasada con una base de código Big Ball Of Mud que evolucionó naturalmente durante muchos años a manos de muchos desarrolladores junior no supervisados, me gustaría señalar lo que sucede cuando no practicas CI con esos desarrolladores.


Editar / Actualizar : Según el comentario de RubberDuck; Esta respuesta supone que su objetivo de fusión para la integración es una rama de desarrollo en lugar de una rama de evaluación o lanzamiento.

  • Obviamente, debe haber mucho más control sobre el código para el lanzamiento y la implementación en vivo; Si no hay una rama de producción separada, valdría la pena considerar un cambio en su estrategia de ramificación / fusión para ejecutar una rama de desarrollo maestra (que se utiliza para pruebas de integración y nunca para el lanzamiento) junto con la rama de lanzamiento maestro. Esto mantiene todos los beneficios de CI y fusiones frecuentes sin correr el riesgo de romper el código de producción.

1. Los desarrolladores junior tienen menos probabilidades de comunicarse con sus compañeros de trabajo o supervisor

La integración continua no es simplemente una cuestión de fusión en el código, es un momento en el que un desarrollador se ve obligado a interactuar con otras partes interesadas.

La comunicación es importante, y sin desear generalizar en exceso, tiende a ser una habilidad aprendida que llega con menos naturalidad a los desarrolladores sin experiencia que a los que están acostumbrados a trabajar en un entorno de equipo.

Si permite que los desarrolladores junior se sienten en su cubículo y combaten el código durante semanas sin que se les solicite informes / revisiones frecuentes, entonces es más probable que eviten la comunicación por completo.

2. Es probable que el código que están produciendo necesite una revisión más rigurosa

¿Alguna vez ha revisado algo que era tan malo que desearía haberlo leído antes y evitar que se haya escrito? Esto pasa mucho.

No puede evitar que se escriba un código incorrecto, pero puede limitar el tiempo perdido. Si se compromete a revisiones y fusiones frecuentes, minimiza el alcance del tiempo perdido.

El peor de los casos es que puede dejar a un desarrollador junior solo durante varias semanas en su propio proyecto en miniatura, y cuando finalmente estén listos para la revisión del código, simplemente no les queda tiempo suficiente para tirar todo el desastre. lejos y comenzar de nuevo desde cero.

Muchos proyectos se convierten en una gran bola de barro simplemente porque se escribió toda una carga de código incorrecto cuando nadie estaba prestando atención hasta que fue demasiado tarde.

3. Debe estar menos seguro de que un desarrollador junior u otro miembro nuevo del equipo haya entendido los requisitos

A veces, un desarrollador puede construir la solución perfecta para el problema incorrecto; esto es triste porque generalmente se debe a simples malentendidos que serían muy fáciles de evitar si solo alguien hubiera hecho las preguntas correctas anteriormente en el proceso.

Nuevamente, este es un problema que es más probable que afecte a los desarrolladores inexpertos que tienen más probabilidades de aceptar los requisitos "malos" al pie de la letra en lugar de rechazar y cuestionar la sabiduría del requisito.

4. Es probable que estén menos familiarizados con patrones comunes, con la arquitectura del código existente y con herramientas y soluciones conocidas

A veces, un desarrollador pasa una gran cantidad de tiempo reinventando la rueda innecesariamente simplemente porque no sabían que existía una solución mejor. O podrían pasar días tratando de clavar una clavija cuadrada en un agujero redondo sin darse cuenta de lo que están haciendo mal.

Una vez más, es más probable que este tipo de cosas les suceda a los desarrolladores sin experiencia, y la mejor manera de abordar el problema es garantizar revisiones periódicas.

5. Los largos períodos entre confirmaciones / fusiones de código hacen que los defectos sean más difíciles de identificar y corregir

Cuando surge un error inmediatamente después de que se hayan fusionado cambios de código por muchas semanas en la rama maestra, el desafío de identificar qué cambio puede haber causado el error se vuelve más difícil.

Obviamente, su estrategia general de ramificación también entra en juego aquí; idealmente, todos sus desarrolladores estarán trabajando en sus propias ramas, o dentro de las ramas de características (o ambas), y nunca trabajarán directamente desde el master / trunk.

He visto situaciones en las que equipos enteros trabajan directamente en el master / trunk al mismo tiempo, y este es un entorno terrible para CI, pero afortunadamente la solución de alejar a todos del master / trunk generalmente proporciona suficiente estabilidad para el trabajo individual. artículos / entradas / etc.

Siempre debe estar "bien" que cualquier desarrollador rompa la rama maestro / troncal, con el entendimiento de que la fusión debe ocurrir de manera tan regular, que los cambios y defectos de ruptura deben identificarse más rápidamente y, por lo tanto, resolverse más rápidamente también. Los peores defectos suelen ser los que permanecen sin ser detectados durante meses o incluso años.


En resumen; Las principales ventajas de la integración continua / implementación continua son:

  • La comunicación entre tu equipo mejora
  • La calidad del código generalmente se mantiene en un estándar más alto
  • Es menos probable que los requisitos se pierdan o se malinterpreten
  • Los problemas de arquitectura y diseño deben detectarse más rápidamente,
  • Es más probable que los defectos sean detectados y reparados en una etapa anterior

Entonces, si no está practicando CI con sus desarrolladores junior, entonces está aceptando una gran cantidad de riesgos innecesarios, ya que estos son los miembros de su equipo que lo necesitan más que el resto.

Ben Cottrell
fuente
OP está hablando de un modelo en el que los compromisos de master desencadenan una implementación real en producción . Entonces no. No está bien romper la rama maestra en ese modelo.
RubberDuck
El buen punto de @RubberDuck, agregó un comentario para dejar en claro que este enfoque es para pruebas de integración y no para enviar nuevos cambios de código directamente a una rama de producción.
Ben Cottrell
0

Sí, puedes practicar CI con desarrolladores junior. Sería estúpido no hacerlo en el clima de desarrollo actual. ¡Es increíblemente útil poder presionar para repo y luego fusionarlo automáticamente en el código provisional, y verlo todo en tiempo real en Travis (o Bamboo, Pipelines, etc.)!

Lleva a tu chico DevOps y haz que atraviese el proceso con ellos, además de un desarrollador senior en modo de espera solo para vigilar las cosas y vincularlo con sus revisiones de código (lo haces, ¿verdad?)

Si le preocupa que el código de mierda vaya a pasar, eso no está en el CI y no está en los juniors: está en usted .

Así que ayúdelos a mejorar y acostumbrarse a implementar el código de etapa / producción más rápido. Te lo agradecerás a largo plazo.

PrometheanVigil
fuente
1
OP habla de implementación continua, no de integración / entrega continua
RubberDuck