根据过去在许多无人监督的初级开发人员手中多年发展而来的“泥泞大球”代码库的经验,我想指出一下当您不与那些开发人员一起实践CI 时会发生什么。
编辑/更新:根据RubberDuck的评论;该答案假定您的集成合并目标是开发分支,而不是评估或发布分支。
- 显然,需要对发布和实时部署的代码进行更多控制;如果没有单独的生产分支,则有必要考虑更改分支/合并策略,以便与主发布分支一起运行主开发分支(用于集成测试,而不用于发布)。这样就保留了CI的所有优势,并且可以频繁合并,而不会冒破坏生产代码的风险。
1.初级开发人员与同事或主管沟通的可能性较小
持续集成不仅仅是合并代码的问题,而是在某个时间点上,开发人员被迫与其他利益相关者进行交互。
沟通很重要,并且不希望过于笼统,它往往是一种博学的技能,对于没有经验的开发人员而言,它比那些习惯于在团队环境中工作的开发者更不自然。
如果您允许初级开发人员坐在小隔间里,在不要求频繁报告/审阅的情况下猛烈抨击代码,那么他们更有可能完全避免交流。
2.他们正在生成的代码可能需要更严格的审查
您是否曾经审查过如此糟糕的东西,以至于希望您早点拿起它并阻止它被编写?这经常发生。
您不能阻止编写错误的代码,但是可以限制浪费的时间。如果您承诺进行频繁的审核和合并,则可以将浪费时间的范围最小化。
最坏的情况是,您可能将一个初级开发人员留在自己的微型项目上几个星期,而当他们终于准备好进行代码审查时,根本没有足够的时间让他们把整个混乱离开,然后从头开始。
许多项目之所以成为一个泥潭,仅仅是因为在没有人注意的时候写了一大堆不良代码,直到为时已晚。
3.您应该不太确定初级开发人员或其他新团队成员已了解要求
有时,开发人员可能会为错误的问题提供完美的解决方案。这个问题很可悲,因为它通常归结为简单的误解,如果只有某个人在此过程中早些时候提出了正确的问题,就很容易避免。
同样,这是一个问题,很可能会影响没有经验的开发人员,这些开发人员更可能从表面上接受“不好的”需求,而不是回退并质疑该需求的智慧。
4.他们可能不太熟悉通用模式,现有代码的架构以及众所周知的工具和解决方案
有时,开发人员不必要地花费全部时间来重新设计轮子,只是因为他们不知道甚至存在更好的解决方案。否则,他们可能会花费数天的时间试图将一个方形钉钉入一个圆孔中,而没有意识到自己在做错什么。
同样,没有经验的开发人员更可能发生这种情况,解决此问题的最佳方法是确保定期进行审查。
5.两次代码提交/合并之间的时间间隔过长,使缺陷难以识别和修复
在将价值几周的代码更改合并到master分支中后,如果立即出现错误,则识别哪个更改可能导致该错误的挑战就变得更加困难。
显然,您的总体分支策略也在这里发挥作用;理想情况下,所有开发人员要么在自己的分支中工作,要么在功能分支中(或同时在两个方面)工作,并且永远不要直接在主/主干之外工作。
我见过这样的情况:整个团队都同时直接在主/主干中工作,这对于CI来说是一个糟糕的环境,但是幸运的是,使每个人脱离主/主干的解决方案通常为单个工作提供了足够的稳定性。物品/门票/等
对于任何开发人员来说,中断 master / trunk分支始终是“确定”的,这应理解到合并应该在这样的规则基础上进行,应该更快地识别出更改和缺陷,并因此也可以更快地解决。最严重的缺陷通常是几个月甚至几年都未被发现的缺陷。
综上所述; 持续集成/持续部署的主要优点是:
- 团队之间的沟通得以改善
- 代码质量通常保持较高的标准
- 需求被遗漏或误解的可能性较小
- 应该更快地发现架构和设计问题,
- 缺陷更可能在早期被发现并修复
因此,如果您不与初级开发人员一起练习CI,那么您将承受很多重大的不必要风险,因为这些是团队中比其他人更需要的风险。
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
-这是基于意见的;)恕我直言,要确保独立服务部署的成功要比采用整体方法要困难得多:softwareengineering.stackexchange.com/a/342346/187812。有了真正的CI(没有功能/集成分支),您不必等待一个星期。