De l'expérience passée avec une base de code Big Ball Of Mud qui a évolué naturellement pendant de nombreuses années entre les mains de nombreux développeurs juniors non supervisés, je voudrais souligner ce qui se passe lorsque vous ne pratiquez pas CI avec ces développeurs.
Édition / mise à jour : selon le commentaire de RubberDuck; cette réponse suppose que votre cible de fusion pour l'intégration est une branche de développement plutôt qu'une branche d'évaluation ou de publication.
- De toute évidence, il doit y avoir beaucoup plus de contrôle sur le code pour la publication et le déploiement en direct; s'il n'y a pas de branche de production distincte, il serait utile d'envisager une modification de votre stratégie de branchement / fusion pour exécuter une branche de développement principale (qui est utilisée pour les tests d'intégration et jamais pour la publication) à côté de la branche de publication principale. Cela conserve tous les avantages de CI et les fusions fréquentes sans risquer de casser le code de production.
1. Les développeurs juniors sont moins susceptibles de communiquer avec leurs collègues ou leur superviseur
L'intégration continue n'est pas simplement une question de fusion dans le code, c'est un moment où un développeur est obligé d'interagir avec d'autres parties prenantes.
La communication est importante, et sans vouloir trop généraliser, elle tend à être une compétence acquise qui arrive moins naturellement aux développeurs inexpérimentés qu'à ceux qui ont l'habitude de travailler en équipe.
Si vous permettez aux développeurs juniors de s'asseoir dans leur cabine et de se défouler sur le code pendant des semaines sans qu'on leur demande des rapports / révisions fréquents, alors ils sont plus susceptibles d'éviter complètement la communication.
2. Le code qu'ils produisent nécessitera probablement un examen plus rigoureux
Avez-vous déjà revu quelque chose de si mauvais que vous auriez aimé l'avoir ramassé plus tôt et l'avoir empêché d'avoir été écrit? Cela arrive souvent.
Vous ne pouvez pas empêcher l'écriture de mauvais code, mais vous pouvez limiter le temps perdu. Si vous vous engagez à effectuer des révisions et des fusions fréquentes, vous réduisez la possibilité de perte de temps.
Le pire des cas est que vous puissiez laisser un développeur junior seul pendant plusieurs semaines sur son propre projet miniature, et quand ils sont enfin prêts pour la révision du code, il ne leur reste tout simplement pas assez de temps pour jeter tout le bordel loin et recommencer à zéro.
De nombreux projets deviennent une grosse boule de boue simplement parce qu'une charge entière de mauvais code a été écrite lorsque personne n'y prêtait attention jusqu'à ce qu'il soit trop tard.
3. Vous devez être moins certain qu'un développeur junior ou un autre nouveau membre de l'équipe a compris les exigences
Parfois, un développeur peut créer la solution parfaite au mauvais problème; celui-ci est triste car il s'agit généralement de simples malentendus qui seraient si faciles à éviter si seulement quelqu'un avait posé les bonnes questions plus tôt dans le processus.
Encore une fois, c'est un problème qui est plus susceptible d'affecter les développeurs inexpérimentés qui sont plus susceptibles d'accepter les «mauvaises» exigences à leur valeur nominale au lieu de repousser et de remettre en question la sagesse de l'exigence.
4. Ils connaissent probablement moins les modèles courants, l'architecture du code existant et les outils et solutions bien connus.
Parfois, un développeur passe beaucoup de temps à réinventer la roue inutilement simplement parce qu'il ne savait même pas qu'une meilleure solution existait. Ou ils pourraient passer des jours à essayer de marteler une cheville carrée dans un trou rond sans réaliser ce qu'ils font de mal.
Encore une fois, ce genre de chose est plus susceptible d'arriver aux développeurs inexpérimentés, et la meilleure façon de résoudre le problème est d'assurer des révisions régulières.
5. De longues périodes entre les validations / fusions de code rendent les défauts plus difficiles à identifier et à corriger
Lorsqu'un bogue émerge immédiatement après plusieurs semaines de modifications de code ont été fusionnées dans la branche principale, le défi d'identifier quel changement peut avoir causé le bogue devient plus difficile.
De toute évidence, votre stratégie globale de branchement entre également en jeu ici; idéalement, tous vos développeurs travailleront soit dans leurs propres branches, soit dans des branches de fonctionnalités (ou les deux), et ne fonctionneront jamais directement depuis le master / trunk.
J'ai vu des situations où des équipes entières travaillent toutes directement dans le maître / tronc en même temps, et c'est un environnement terrible pour CI, mais heureusement, la solution consistant à éloigner tout le monde du maître / tronc offre généralement suffisamment de stabilité pour le travail individuel articles / billets / etc.
Il devrait toujours être "OK" pour tout développeur de rompre la branche maître / tronc, étant entendu que la fusion devrait avoir lieu de manière régulière, que les modifications et les défauts de rupture devraient être identifiés plus rapidement, et donc résolus plus rapidement aussi. Les pires défauts sont généralement ceux qui ne sont pas détectés pendant des mois, voire des années.
En résumé; les principaux avantages de l'intégration continue / du déploiement continu sont:
- La communication entre votre équipe s'améliore
- La qualité du code est généralement maintenue à un niveau plus élevé
- Les exigences sont moins susceptibles d'être manquées ou mal interprétées
- Les problèmes d'architecture et de conception doivent être détectés plus rapidement,
- Les défauts sont plus susceptibles d'être détectés et corrigés à un stade plus précoce
Donc, si vous ne pratiquez pas CI avec vos développeurs juniors, vous acceptez beaucoup de risques inutiles importants, car ce sont les membres de votre équipe qui en ont plus besoin que les autres.
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
- c'est basé sur l'opinion;) À mon humble avis, il est beaucoup plus difficile d'assurer le succès d'un déploiement de service indépendant qu'avec une approche monolithique: softwareengineering.stackexchange.com/a/342346/187812 . Et avec un véritable CI (pas de branche fonctionnalité / intégration), vous ne devriez pas avoir à attendre une semaine.