网站改版seo建议,网站开发与应用 论文,百度惠生活怎么优化排名,seo常用的优化工具简介#xff1a;团队研发的本质并不是团队规模越大#xff0c;研发的效率就越高。我们以为团队规模越大#xff0c;研发效率就会越高#xff0c;可以做越多的东西#xff0c;但是我们发现团队规模大到一定程度#xff0c;整个研发效率是会下降的#xff0c;甚至降得非常…简介团队研发的本质并不是团队规模越大研发的效率就越高。我们以为团队规模越大研发效率就会越高可以做越多的东西但是我们发现团队规模大到一定程度整个研发效率是会下降的甚至降得非常快。为什么团队的规模越来越大我们的发布反而越来越慢了 策划编辑雅纯
团队研发的本质 我们曾经接触到一家企业它一开始只有8个人那个时候每个月都可以发一两个版本出去客户都可以用到因为他们是做医院的信息管理HIS系统。他们觉得做得还不错。后来团队发展比较快规模到了80人左右却半年没发一个版本。这导致实施团队没脸见客户因为客户说半年前提的需求怎么还发不出来。
这个时候悖论就来了我们以为团队规模越大研发效率就会越高可以做越多的东西但是我们发现团队规模大到一定程度整个研发效率是会下降的甚至降得非常快。 站在团队的角度来说因为人多协作越来越慢协作的成本也越来越高。我们发现团队的研发模式人越多越会有问题因为冲突更多等待更多。这里冲突是指代码集成发布过程中的冲突而等待也是集成和开发过程中代码彼此的等待。
以下是两个具体的场景。 假设有两个程序员A和B一起工作A一开始每次提交都把工作逐渐成功提交到线上去然后B提交了一个版本导致编译失败了。这时A就无法提交因为提交就会挂要等待B修复问题才能提交这时A的提交和B的工作就产生了冲突。
第二种情况多个分支往同一个分支合并FeatureA先合进主干FeatureB晚了一点结果发现无法合并因为基线不一样了这时候必须先解决掉代码冲突才能合进去。 如上图假设现在有3个人A、B和测试C每个人的点代表它做的任务比如A一直在做自己的事情每完成一个事情就开始做下一个事情做完第三个事情的时候他觉得需要去找B联调一下就给B发了一个ping但是B有自己的节奏在忙他自己的任务所以并未马上响应A的请求。他发现有一个任务可以提测了他就告诉了CC发现有问题就马上Pong了回去但是这时B在忙另外一个任务没有响应。C发现B无响应又发了一次Pong这时B看到了A和C的消息他先处理了A的事情给A回复了一个Pong的消息。
我们发现程序员和程序员测试人员和开发人员之间在整个的开发协作中其实是异步的、延迟协作的过程。每个人并不是收到一个请求就马上回复马上协作往往都是有自己的步调和自己的动作可能会产生延迟。所以当产品更复杂协作更多团队更复杂团队的人多了以后协作成本就会快速上升。
在这样一个异步的、延迟协作的过程中程序员面对日常开发的工作需要有一套相应的研发模式来保证在协作过程中能够持续地把信息同步掉并快速地响应掉。
软件交付过程本质是开发者围绕代码库的协作过程。无论是产品代码、配置、环境和发布流程都可以通过代码来描述并保存到代码库里。
因此研发模式的目的就是约束我们在围绕代码库工作时的行为本质是一种围绕代码库的行为约束。
研发模式我们狭义地理解为分支模式包含一系列的行为约束比如分支类型及其标识、分支的生命周期、Commit在分支间的流转方式以及流转的约束条件还有分支和代码之间的对应关系等。接下来我们会一一探讨。
研发模式是一系列研发行为的约束目标是避免冲突、减少等待。在协作的过程中人多了之后带来的最大的问题就是冲突变多、等待变多所以好的研发模式应该尽可能的避免冲突尽可能的减少等待。
首先看一下研发模式和研发行为之间的对应关系。 这些研发行为和代码库行为有一个Mapping映射关系。开始新的特性开发时我们会创建一个新的特性分支。做一次代码的提交集成其实就是一次Commit和Push完成之后进入集成验证就做了一次分支的Merge。
同样地集成完进入待发布也是在做Merge而完成发布意味着打一个Tag。代码库里的操作记录了我们的研发行为所以研发行为和代码库的操作可以做到一一映射。 要避免冲突唯一的方法是大家彼此隔离分开就没有冲突。在代码库里面很多时候通过分支的方式来做工作之间的隔离避免冲突。
要减少等待而等待是信息不同步造成的尽可能地做到信息同步就不用等待。在代码里面的等待是代码之间基线的同步比如说频繁地提交。所以其实分支是用来避免冲突和做工作隔离而频繁地提交合并是为了做信息同步减少等待。
Q:如果是一个人做软件开发用什么样的分支模式一个人会不会有冲突
一个人做软件开发的时候是不会有冲突的一个人工作的时候不需要很多分支一个分支就足够。一个人做开发也不用等待信息因此可以一条主干走到底。但是如果人数扩张到10人、100人彼此之间就会有工作的隔离彼此之间也会存在着冲突也存在着等待。所以在这个过程中随着协作的人数越来越多分支的模式会不断地发生变化。
4种常见分支模式解析
主干开发 团队人很少比如1~2个人的时候最常见的研发模式是Trunk—BasedDevelopment也叫主干开发方式。
主干开发方式一条主干分支走到底开发的过程中不会有太多的冲突要求代码持续集成到主干上去所以在开发过程中不需要做相应工作的隔离。开发的过程中所有的开发者在主干上面频繁地提交频繁地集成。这种分支模式下唯一的分叉出现在发布的时候为了能够把发布版本隔离出来有了发布分支。
这种模式下不需要做分支隔离信息同步通过持续频繁地提交来保证。在人数比较少并且整个工程能力比较强的时候这是我们推荐的研发模式。
但是当参与开发的人数越来越多时主干开发的冲突几率就大大增加了对工程能力的要求也越来越高。
所以说主干开发不是万能药主干上的人越多代码提交的冲突机率就越大而且解决冲突的风险也越大。如果两个人的时候即便有冲突我知道只是和另外一个人有冲突如果是10个人这中间就会产生很多的问题。
另外在主干开发里面要保持信息地同步需要做频繁持续地提交而且每次提交的力度要很小这针对有一些特性来说可能只做了一半这时需要将它提交上去需要通过特性开关等方式来进行隔离。比如说这个是还未完成的特性提前把它的开关制成Off再做相应的提交但是特性开关本质上也是一个分支。
特性开关只是用代码的形式拉了一个分支但是这个分支只有打开的时候才能跑到本质上还是一个分支。如果特性开关比较多它在一定程度上会把代码变得很脆弱维护起来比较麻烦。
主干开发当很多人同时参与时代码冲突的机率很大而且特性开发的时候也有很多的风险大家彼此之间需要隔离。
Git-Flow Git—Flow的基本原则是需要什么分支就给什么分支任何事都有很明确的分支。比如说要集成就有develop分支要开发就有feature分支要发布有release分支每个都是不同的分支。每种类型的分支都有确定的用途。
比如说feature分支是很多个feature并行开发的时候用来去做工作隔离避免彼此之间有冲突。而release分支是用来做发布的隔离使得发布之间不会有冲突。
我们发现这种模式很好地做了隔离但是在信息同步的过程中它需要基于develop频繁地集成去做同步并且在各个分支中间做相应的cherry-pick或者是rebase这样的方式来做的。
这个时候我们就会发现分支太多而且一个commit从feature开发到最终发布要经历好几个分支其中分支的流转和merge规则非常麻烦。
所以Git—Flow也不是仙丹过多的分支增加了分支管理的复杂度。还有如果Feature分支的生命周期特别长它的合并耗时也会变得很长。而且Develop分支和Master分支同时存在好像Develop分支的意义不是特别大。另外区分Feature分支和hotfix好像意义也不是特别大。
所以Git—Flow虽然增加了很多的分支让各种工作尽可能地隔离开来但是它信息同步是很麻烦的而且它管理这些分支的难度也特别大。
GitHub-Flow GitHub引入了一个分支模式叫GitHub—Flow,明显比Git—Flow简单很多。没有Develop没有hotfix也没有Release当需要开发的时候拉一个Feature分支开发完就合并Master做发布。
这个过程中它的隔离只发生在开发过程中它的信息同步通过持续地往Master去做集成和频繁从Master里面Pull代码来实现。它的发布过程是基于主干Master分支做的因此没有在发布的过程中做相应地隔离。
这时候又会带来一个问题就是Master分支需要做持续集成这个分支既是集成的地方也是发布的地方。一旦集成后出现问题它会把所有的工作堵塞掉无法发布也无法合并。
所以GitHub—Flow很简单可以做相应地隔离但是如果说本身基础设施或工程能力比较弱它会限制你集成和发布的频率。
GitLab-Flow GitLab—Flow和GitHub—Flow区别是在发布过程中有了Pre-production分支和Production分支基于开发、集成和发布过程中不同的环境分配了相应的分支。
完成集成以后是在Master分支上下面一步将会切换到预发分支上。对应Commit的版本已经达到了预发的条件在预发上做完验证以后再将其同步到Production分支说明它已经达到了发布的条件所以它是逐级Promotion晋级的过程。逐步从集成的环境Promotion到预发环境再Promotion到生产环境。
我们简单地介绍了一些常见的分支模式下面我们再来比较一下他们之间的优劣。
常见分支模式优劣对比 TBD分支少实施简单做起来不需要太多的理解成本。但是它对团队协作的成熟度和纪律都有很高的要求一旦有人不遵守纪律那主干就会成为你的梦魇这时就很难很好地去做持续地集成和发布了。一旦它出现问题所有人都被Block这是主干方式的优缺点。
Git—Flow特性之间可以并行开发规则很完善每个分支的职责特别明确再大的团队协作基本上也不会有太多的问题但是它分支太多规则太复杂而且分支生命周期长合并冲突会比较频繁。尤其是DevelopMaster是长期存在的。
对于GitHub—FlowGit—Flow能支持的基本上它也能支持但是这里面有一个问题它的集成只有在Master分支去做因此对集成纪律有很高的要求而且集成和发布在一个分支上一旦集成分支中断无论是集成还是发布都会被中断。
Gitlab—Flow也是并行开发但是开发分支还是会有生命周期长的问题有合并冲突的风险。另外发布分支之间是有耦合的比如说Prodution和Pre—Prodution之间是基于Promotion来耦合所以彼此之间也是一种中断阻塞的方式而且很多的开发分支Prodution和Pre—Prodution也增加了分支管理的复杂性。
因此我们发现没有哪个分支模式是绝对好的也没有哪个是绝对差的。
对于分支有一个简单的原则即控制分支数目小批量频繁集成。控制分支的数目也就是做到工作隔离但是又增加太多管理成本。而小批量频繁集成可以加速信息同步。
所以一个简单的原则就是从最大化生产力和最小化风险的角度尽可能地控制分支的数目和小批量频繁集成。
最大化生产力所有人工作在公共区域内。除了一条长期的不被中断的开发主干外没有任何分支。也并无其他规则代码的提交过程相当简单。但是每一次的代码提交都有可能破坏整个项目的集成进而导致项目进度的中断。
最小化风险所有人都工作自己的分支上。每个人的工作是相互独立的没人可以打断其他人的工作这样减少了开发被打断的风险。但是这种做法却增加了额外的流程负担同时协作变得非常困难所有人都不得不谨小慎微地合并自己的代码即便是整个系统中非常小的一部分也是如此。
那么怎么设计或选择适合自己的分支模式下一篇文章我们将继续分享不同的团队如何选择适合自己的研发模式。
原文链接
本文为阿里云原创内容未经允许不得转载。