¿Cuántos desarrolladores antes de que la integración continua sea efectiva para nosotros?

34

Hay una sobrecarga asociada con la integración continua, por ejemplo, configuración, reentrenamiento, actividades de concientización, interrupción para corregir "errores" que resultan ser problemas de datos, separación forzada de estilos de programación de preocupaciones, etc.

¿En qué punto se paga la integración continua?

EDITAR: Estos fueron mis hallazgos

La configuración fue CruiseControl.Net con Nant, lectura de VSS o TFS.

Aquí hay algunas razones para el fracaso, que no tienen nada que ver con la configuración:

Costo de la investigación : el tiempo dedicado a investigar si una luz roja se debe a una verdadera inconsistencia lógica en el código, la calidad de los datos u otra fuente, como un problema de infraestructura (por ejemplo, un problema de red, una lectura de tiempo de espera del control de fuente, un servidor de terceros está abajo, etc., etc.)

Costos políticos sobre infraestructura : consideré realizar una verificación de "infraestructura" para cada método en la ejecución de la prueba. No tenía solución para el tiempo de espera, excepto para reemplazar el servidor de compilación. La burocracia se interpuso y no hubo reemplazo del servidor.

Costo de arreglar las pruebas unitarias : una luz roja debido a un problema de calidad de datos podría ser un indicador de una prueba unitaria mal escrita. Por lo tanto, las pruebas unitarias dependientes de los datos se reescribieron para reducir la probabilidad de una luz roja debido a datos incorrectos. En muchos casos, los datos necesarios se insertaron en el entorno de prueba para poder ejecutar con precisión sus pruebas unitarias. Tiene sentido decir que al hacer que los datos sean más sólidos, la prueba se vuelve más sólida si depende de estos datos. ¡Por supuesto, esto funcionó bien!

Costo de la cobertura, es decir, escribir pruebas unitarias para el código ya existente : existía el problema de la cobertura de las pruebas unitarias. Había miles de métodos que no tenían pruebas unitarias. Por lo tanto, se necesitaría una cantidad considerable de días hombre para crearlos. Como esto sería demasiado difícil de proporcionar un caso de negocios, se decidió que las pruebas unitarias se utilizarían para cualquier método público nuevo en el futuro. Aquellos que no tenían una prueba unitaria se denominaron 'potencialmente infrarrojos'. Un punto de prueba aquí es que los métodos estáticos eran un punto discutible en cómo sería posible determinar de manera única cómo había fallado un método estático específico.

Costo de los lanzamientos a medida : los guiones de Nant solo llegan hasta cierto punto. No son tan útiles para, por ejemplo, compilaciones dependientes de CMS para EPiServer, CMS o cualquier implementación de base de datos orientada a UI.

Estos son los tipos de problemas que ocurrieron en el servidor de compilación para ejecuciones de prueba por hora y compilaciones de control de calidad durante la noche. Considero que esto no es necesario ya que un maestro de compilación puede realizar estas tareas manualmente en el momento del lanzamiento, especialmente con una banda de un solo hombre y una pequeña compilación. Por lo tanto, las compilaciones de un solo paso no han justificado el uso de CI en mi experiencia. ¿Qué pasa con las compilaciones de varios pasos más complejas? Puede ser una tarea difícil de construir, especialmente sin un script de Nant. Entonces, incluso después de haber creado uno, estos no tuvieron más éxito. Los costos de solucionar los problemas de luz roja superaron los beneficios. Finalmente, los desarrolladores perdieron interés y cuestionaron la validez de la luz roja.

Después de intentarlo de manera justa, creo que CI es costoso y hay mucho trabajo en los bordes en lugar de solo hacer el trabajo. Es más rentable emplear desarrolladores experimentados que no hagan un desastre de grandes proyectos que introducir y mantener un sistema de alarma.

Este es el caso incluso si esos desarrolladores se van. No importa si un buen desarrollador se va porque los procesos que sigue asegurarán que escriba especificaciones de requisitos, especificaciones de diseño, se adhiera a las pautas de codificación y comente su código para que sea legible. Todo esto es revisado. Si esto no está sucediendo, entonces el líder de su equipo no está haciendo su trabajo, que debe ser recogido por su gerente, etc.

Para que CI funcione, no es suficiente escribir pruebas unitarias, intentar mantener una cobertura completa y garantizar una infraestructura de trabajo para sistemas de gran tamaño.

El resultado final: Uno podría preguntarse si corregir una cantidad de errores antes del lanzamiento es incluso deseable desde una perspectiva empresarial. CI implica mucho trabajo para capturar un puñado de errores que el cliente podría identificar en UAT o que la compañía podría recibir un pago por la reparación como parte de un acuerdo de servicio al cliente cuando el período de garantía expire de todos modos.

CarneyCode
fuente
13
Puede ser beneficioso incluso para un equipo de uno. Especialmente si tiene un conjunto de pruebas de larga ejecución, es mucho mejor obtener automáticamente los resultados de una compilación y ejecución de prueba durante la noche que hacerlo manualmente todo el tiempo.
SK-logic
3
@Carnotaurus, el clon local del repositorio de git remoto elimina el tiempo de espera del control de origen. Problemas de red: ¿para construir el producto? Ahora, realmente ...
3
La luz roja de @Carnotaurus debido a la calidad de los datos o la infraestructura es un código de pruebas frágiles . Ver también : gestión de la carga de mantenimiento de las pruebas unitarias
k3b
1
Cuanto más depende una prueba de aspectos externos, más frágil es. Ejemplo: si una prueba solo tiene éxito si el cliente XY está en la base de datos, la prueba es frágil, a menos que la configuración de la prueba asegure que este requisito previo existe insertando los datos si es necesario.
k3b
66
"En pocas palabras: ¿por qué hacer productos que funcionan cuando podemos hacer que alguien más nos pague por arreglarlo, porque no es como si esperaran que el software funcionara en primer lugar"? Puede que no cumpla con la definición legal, pero eso me parece fraude.
Chris Pitman

Respuestas:

43

Configurar un motor CI es similar a configurar una alarma de incendio en una casa.

En mi opinión, los beneficios no se correlacionan con muchos desarrolladores, sino con una gran base de código. El motor CI hace todo el trabajo aburrido que no desea hacer usted mismo, y lo hace siempre.

Si interrumpe un módulo remoto que no ha tocado en mucho tiempo, se le informa de inmediato. No solo es una compilación inteligente, sino también funcional si ha configurado pruebas unitarias.

También tenga en cuenta que si deja que CI-engine haga todo el trabajo aburrido, incluida la instalación de instaladores, etc., no tiene que hacerlo manualmente. Puede verificar su fuente y esperar a que el producto terminado se construya en la ubicación estándar. (EDITAR: el motor CI también funciona en un entorno bien definido, evitando cualquier configuración específica del desarrollador, asegurando la reproducibilidad)

Esto también es parte del aseguramiento de la calidad.


EDITAR: Después de escribir lo anterior, he tenido experiencia con la herramienta de compilación Maven para Java. Esencialmente, esto nos permite mantener la configuración de CI completa dentro del proyecto (con pom.xml), lo que hace que sea mucho más simple mantener la instalación de CI y / o migrar a otro motor de CI.


fuente
1
@Carnotaurus, en ese caso la luz roja también se usa para errores transitorios. Suena como una limitación en el motor de CI que está utilizando.
2
@Carnotaurus, en mi experiencia, el trabajo realizado para documentar a fondo cada aspecto de todo, por ejemplo, hacer un lanzamiento y luego hacer dichos lanzamientos varias veces, es más grande que capturar el flujo de trabajo en un script de hormiga o experto que luego puede ser ejecutado por un robot cualquier cantidad de veces Dicho robot también funciona en un ambiente de sala limpia asegurando que las construcciones sean reproducibles.
1
Tenga en cuenta que la ruptura que estoy buscando no está fallando en las pruebas unitarias, sino que los programas reales que enviamos aún pueden construirse. Ya no es tan importante como migramos a artefactos maven en lugar de compilar todo para cada versión, pero aún es importante saber que la compilación es completamente funcional. Solo necesitamos la parte de Implementación continua también.
2
@Carnotaurus: no estoy hablando de un sistema de alarma. Si las pruebas fallan, el parche no se integra en el repositorio principal (en absoluto), lo que garantiza que cada vez que realice el pago / clonación obtenga una copia completamente funcional y pueda comenzar a funcionar de inmediato. Ahora, estoy de acuerdo con usted en que las pruebas pueden ser difíciles de escribir y mantener ... pero he trabajado con y sin prueba, y veo una mejora de calidad definitiva con ellas. Entonces la pregunta es: ¿automatizada o no? En mi experiencia, lleva más tiempo probarlo manualmente que escribir el script de automatización (pero trabajo en una gran corporación con herramientas para eso).
Matthieu M.
55
" De todos modos, es mucho trabajo capturar un puñado de errores que a la compañía se le pagaría por corregir como parte de un acuerdo de servicio al cliente ", bueno, en ese caso, tiene un incentivo económico para NO producir software con el menor número de errores posible, y en ese caso, todo esto no se aplica a usted.
33

No se trata de cuántos desarrolladores, sino cuántos pasos se necesitan para llegar de 1 a n (inclusive), donde están 1 & n ...

1: Conceptos básicos acerca de código
Y
n: tener instalable \ paquetes de despliegue

Si n <2 quizás no necesite CI
, de lo contrario, necesita CI

Actualización Al
leer sus hallazgos, solo puedo concluir que se acercó a CI desde la dirección incorrecta y por los motivos equivocados.

Binario Worrier
fuente
1
+1: tengo muchas cosas que podría agregar a lo anterior, pero esto está muy cerca del núcleo de por qué me gusta CI ... no solo por lo que hace sino también por lo que requiere que hagas para hacerlo trabajo (esos requisitos son cosas que realmente debes hacer de todos modos).
Murph
2
@murph: Sí, y trae pequeñas ventajas como 1) saber qué creará en su repositorio, 2) construir con un solo clic, 3) poder lanzar una versión en cualquier momento y mucho más
Binary Worrier
Entonces, ¿es justo decir que depende de la complejidad de lo que se lanzará, medido por su número de pasos para la implementación como capaz de "probar" capas separadas?
CarneyCode
1
@Carnotaurus: Lo siento amigo, pero no estoy seguro de saber lo que estás tratando de decir. CI no tiene nada que ver con las pruebas. Sí, puede y debe ejecutar pruebas unitarias como parte de la compilación, pero no deben depender de nada que no esté configurado como parte de la prueba. Sin embargo, CI ayuda a las pruebas. Uno de los muchos beneficios de CI es que permite que un equipo de control de calidad recoja de forma inmediata y aparentemente nuevos cambios de código. CI = La capacidad de liberar inmediatamente
Binary Worrier
1
@BinaryWorrier - Creo que el paso 1 es verificar el código;)
10

Puede valer la pena incluso para un equipo de uno. Esto es especialmente cierto cuando está desarrollando código multiplataforma y necesita asegurarse de que sus cambios funcionarán en ambas plataformas. Por ejemplo, el compilador de C ++ de Microsoft acepta más que GCC, por lo que si desarrolla en Windows pero necesita admitir Linux también, tener un sistema de CI le avise cuando su compilación se rompa en Linux es de gran ayuda.

Algunos sistemas de CI son bastante fáciles de configurar, por lo que la sobrecarga no es realmente tan grande. Prueba Jenkins o Hudson, por ejemplo.

mch
fuente
No había considerado un escenario multiplataforma. Si se necesitan compiladores diferentes para crear compilaciones diferentes, entonces hay un caso sólido para CI: tome un voto positivo.
CarneyCode
4

Como usted dice, hay un costo adicional de configurarlo y mantenerlo en funcionamiento.

Pero la cuestión de dónde está el punto de equilibrio no es una función de cuántas personas tiene en su equipo, sino una función de la duración de su proyecto.

Dicho esto, hay una parte del costo de instalación que puede usar en todos sus proyectos futuros, por lo que a largo plazo el costo indirecto puede acercarse a cero.

Stephen Bailey
fuente
Entonces, ¿la longitud del proyecto (tamaño del proyecto) es importante para usted, CI? He descubierto las falsas alarmas a ser muy costoso.
CarneyCode
Sí, debe tener tiempo para pagar los costos de la curva de configuración y aprendizaje. En teoría, con el tiempo debería aprender a eliminar las falsas alarmas.
Stephen Bailey
Sí, esto es teoría
CarneyCode 05 de
Bueno, no, es práctica. Con el tiempo, toma nota de qué pruebas son frágiles y qué pruebas no lo son, y no se preocupe demasiado si sus pruebas frágiles se rompen a menos que se rompan varias veces seguidas. Escribes pruebas más aisladas y robustas a medida que aprendes cómo, y dejas que la cobertura heredada se desarrolle con el tiempo en lugar de hacerlo todo a la vez. En la práctica, CI no es una bala de plata, es un cambio de proceso que lleva tiempo y finalmente conduce a un software con menos errores.
philosodad
3

Configuré Jenkins esta semana para construir un pequeño proyecto .NET en el que estoy trabajando. Lo integré con mi control de fuente Git para que activara una compilación en cada confirmación. Integré las pruebas unitarias en la construcción. Integré el análisis estático en forma de violaciones de FxCop y StyleCop.

Ahora, cada vez que me registre, verifica todo mi código, lo compila, incrementa el número de versión en todos los ensamblajes, lo prueba, lo analiza en busca de violaciones de FxCop y StyleCop, archiva la compilación y registra los resultados en una serie de gráficos. Tengo visibilidad en el tiempo de los resultados de las pruebas y las infracciones.

Hacerlo desde cero lleva aproximadamente una hora (tal vez un día con Google si no lo ha hecho antes). No cuesta nada porque todas las herramientas están disponibles de forma gratuita.

Si, a medida que se construye el proyecto, tengo una infraestructura de alta calidad que crecerá sin costo alguno. Si o cuando nuevos desarrolladores se unen al proyecto, puedo obtener visibilidad total de su trabajo y su impacto en el proyecto sin costo alguno.

Entonces, el único escenario en el que puedo ver que CI no vale la pena es para un proyecto que tomará un día más o menos y luego nunca será revisado, o uno en un idioma donde no hay herramientas disponibles / gratuitas disponibles y el costo de adquirirlas es desproporcionado para el trabajo.


fuente
Como dije, son las pruebas unitarias para cubrir el código heredado las que presentan un costo mayor. Además, tampoco estamos hablando de un equipo de un solo hombre aquí ... Sin embargo, agradezco la información sobre Jenkins.
CarneyCode
1
Por lo que vale, obtuve un beneficio considerable al ejecutar un servidor CI sin tener ninguna prueba, solo por la confianza en compilaciones limpias y la disponibilidad de paquetes de implementación.
Murph
1

Si puede verificar todos los aspectos de su proyecto después de cada cambio, entonces no necesita CI.

En todos los demás casos, es una ganancia neta.

Macke
fuente
Creo que de aquí también vengo. También es mucho más barato.
CarneyCode
¿Qué quiere decir con verificación en este caso? Si está automatizado, ocurre con la mayor frecuencia posible y ayuda a identificar fallas y descuidos mentales, entonces estoy de acuerdo. :-)
William Payne
1

Los gastos generales son mínimos. Yo diría que para proyectos de un hombre sería útil. Una vez que alcanzas dos es invaluable.

Estoy de acuerdo en que para proyectos de un solo hombre si tiene una "compilación / verificación en un solo paso", entonces podría estar bien con la integración continua, pero en esos casos ha hecho la mayor parte del trabajo duro para configurar CI, así que podría simplemente poner en un sistema formal (CC, Hudson, TeamCity, etc.).

Micro
fuente
¿Quieres decir sin CI?
CarneyCode
1

La pregunta de cuándo CI se paga sola es difícil de responder en un nuevo proyecto.

En un proyecto existente, es mucho más fácil de ver. Si encuentra un error crítico en la parte de desarrollo de la cadena de suministro, sabrá que el problema existe lo antes posible. El costo de la reparación que ahora es el más bajo. Si ese problema existe en cualquier entorno superior al desarrollo, su costo es mayor.

Ahora, la administración podría decidir lanzar con un error, pero eso es un riesgo comercial. Al menos ahora puede mitigarse a través de esa evaluación de riesgos, en lugar de llamadas telefónicas / pánico a altas horas de la noche, que, si se facturaban a tarifas por hora, terminarían siendo muy caras.

Otra cosa a considerar en términos de costo. ¿Cómo es su departamento de control de calidad? ¿Es una prueba manual? Si va a CI, es posible que pueda reducir los costos generales de control de calidad al automatizar esos scripts en su cuadro de desarrollo. Es posible que pueda reducir la cantidad de personas de control de calidad que apoyan su proyecto al involucrarlos en la fase de CI.

Mike Cornell
fuente
1
Reemplazar una prueba de regresión manual con algunas pruebas automatizadas de UI requiere bastante tiempo y habilidad. En una compañía, un tipo escribió alrededor del 40% de las pruebas y dejó la compañía. Varios años después, las pruebas aún no se han escrito. Apuesto a que esto es típico.
CarneyCode
No, no es típico.
quant_dev
No he visto mucha evidencia contraria
CarneyCode 05 de
Si escribe pruebas de integración / aceptación en lenguaje natural DSL como Gherkin, puede traducir fácilmente la prueba automatizada a manual. Así que no veo eso como un problema.
Mike Cornell
@Carnotaurus: creo que es típico. Lo he visto dos veces también. Las pruebas automatizadas de IU son difíciles.
Rocklan
1

CI siempre vale la pena: la sensación de seguridad que le brinda le permite trabajar a un ritmo más rápido de lo que sería posible de lo contrario. El problema que tiene parece girar en torno a las pruebas unitarias. Estoy de acuerdo en que las pruebas unitarias son muy caras, pero también creo que (para muchas cosas) son la peor opción que tenemos. Personalmente, y para los tipos de sistemas en los que tiendo a trabajar, juro por las pruebas a nivel de sistema que operan en una combinación de casos patológicos del mundo real y (posiblemente sintéticos); Es más barato que las pruebas unitarias, y entra en esos rincones difíciles de alcanzar de su universo conceptual: las "incógnitas desconocidas" de Donald Rumsfeld.

William Payne
fuente
Me gusta un poco sobre las pruebas de IU a nivel de sistema. Gran parte de las pruebas se pierden en una niebla de pruebas unitarias de calidad y cobertura cuestionables.
CarneyCode
La cobertura también es una cuestión de psicología humana; Tenemos una tendencia innata a escribir pruebas para aquellos casos en los que ya hemos pensado. Es por esta razón que ser certificada en un alto nivel SIL, pruebas unitarias deben ser escritos por un equipo independiente de aquello que desarrolló el sistema bajo prueba, y aún así, hay muchos casos y situaciones que son evidentes para todo el mundo sólo se en retrospectiva. Se necesita una verificación rigurosa de la cobertura del código; pero extraordinariamente difícil y costoso.
William Payne
... De ahí el beneficio que obtienes al lanzar la basura más desagradable que puedes encontrar en el sistema en el nivel superior y ver lo que sucede ... :-)
William Payne
1
+1 - Totalmente de acuerdo. Algunas partes de un sistema simplemente no son probables por unidad (es decir, los bordes como en la base de datos). Claro que puedes burlarte de la base de datos, pero eso deja el código que habla con la base de datos sin probar. En algún momento, debe escribir algunas pruebas del mundo real que integren sus sistemas y hablen con otros sistemas. Cuando haces eso, siempre encuentras errores que te perdiste en el mundo limpio y acogedor de la prueba de la unidad y el marco burlón (me viene a la mente LINQ to SQL).
En realidad, recientemente descubrí una versión interesante de las pruebas de fuzz que podrían canjear las pruebas unitarias: jester.sourceforge.net
William Payne
0

Úselo siempre, independientemente del tamaño del equipo. Si solo eres tú, por ejemplo, quién sabe, ¿podrías estar codificando desde tu computadora portátil en Starbucks y luego continuar desde tu sistema más robusto en casa?

Los gastos generales realmente no son tan malos.

Julio
fuente
0

Uno. Sí, uno es suficiente para comenzar a usar la integración continua.

java_mouse
fuente
0

No se trata de cuántos desarrolladores, sino de

a. Cuánto tiempo ahorra usando la automatización y con qué frecuencia.

  • Tiempo ahorrado en la construcción después de las integraciones, ejecutando pruebas automatizadas y creando configuraciones * frecuencia de check-in = porcentaje de tiempo ahorrado.

si. Cuántas versiones / sucursales / productos tiene.

  • Si tiene un desarrollador trabajando en dos sucursales diferentes, el tiempo ahorrado se duplica, ya que cada sucursal requeriría construcción, prueba y empaque.
Danny Varod
fuente