3个案例,详解如何选择合适的研发模式

简介:3个案例,详解如何选择合适的研发模式,研发模式的选择与产品形态、发布方式、团队规模、协作成熟度密切相关。本文我们将根据不同的团队场景,分析如何选择适合团队的研发模式。

策划&编辑|雅纯

上一讲,我们详细介绍了4种常见的分支模式及其优劣对比。本文我们将根据不同的团队场景,分析如何选择适合团队的研发模式。

研发模式选择看什么

研发模式的选择与产品形态、发布方式、团队规模、协作成熟度密切相关。比如团队规模很小,协作成熟度很高,就直接用主干开发。类似于Web服务端的开发,可以做到持续部署,可以选择GitHub—Flow,或者是TBD。

如果你的团队规模比较大,需要开发的时候做相应的隔离,再看协作的成熟度。如果一般就用GitHub—Flow,成熟度很高就用TBD。

另外,有一些研发场景有固定的发布窗口,它是按版本的方式去发布,我们建议有相应的release分支去做隔离。实际过程中我们应该尽可能地根据自己实际的产品和团队情况,来去制定合适的分支规则。

举一个例子,这张图的上半部分是需求价值流。可以看到他们开发的时候是一个需求一个需求地做,做完一个需求再做另外一个。因此可以看出这是一种持续交付需求的方式,针对一个需求会做相应的代码变更。

与之相应的分支模式为GitHub—Flow。

在做特性开发的时候,只要做特性之间的隔离,但是可以做到持续发布,所以直接在Master上发布就好,因为是在Master上去发布,所以不会同时有两个发布存在。

可以看到分支模式和发布流水线之间是强相关的。发布流水线会基于不同的分支来去做相应地事情。比如特性分支发生变化后,针对特性分支做相应的集成和验证,通过后再合到Master上去做集成,完成集成后做相应的SIT(系统级别的验证),然后再做部署。因此分支模式和发布流水线之间是强相关的。

这是持续发布的方式。

版本制发布模式常见于客户端的发布。例如iOS或安卓,因为有一定的发布节奏。和上面的持续发布模式相比多了一个release分支,用来做版本发布用。从整体来看分支模式比较简单。不建议用Git—Flow,可以对其适当进行裁剪。

研发模式的目的是减少代码协作当中的冲突,减少等待。代码之间的协作冲突有两种,一是开发过程中的冲突和隔离,另一个是发布过程中的隔离,所以组合方式无非是:分支开发和主干发布、分支开发和分支发布、或是主干开发和分支发布等几种。

这个例子初看和Git—Flow一样,但是相对于Git—Flow,它有两个变化。首先,它没有release分支,它的发布表现为在主干上打Tag。第二,它的hotfix不合回主干,而是直接在hotfix上打Tag进行发布。这样它就少了release分支,少了hotfix和master之间的同步。

整个分支模式有这样一个特点,它有四种分支:feature分支、develop分支、master分支和hotfix分支,其中develop和master是长期分支,feature和hotfix是短期分支。开始开发的时候会拉一个feature分支,合并完成后消亡掉,如果是热修复,会拉一个hotfix分支,hotfix分支永远是从tag上创建的,之后创建tag,分支消亡。

所以长期分支就两个,大部分的情况下hotfix就是feature分支,整个流程比Git—flow简化很多。

分支模式实践案例分析

分支模式是和产品的形态和团队是强相关的,以下是几个实践案例。

1、P2P直播CDN产品

第一个案例是P2P直播CDN产品,左边是它的架构图,分为一个客户端和一个服务端。客户端是有多端的,比如手机、路由器、机顶盒等,每一种端的发布形式是不一样的。终端,客户端和服务端之间有两条通信链路,一条是视频数据的链路,另外一条是控制数据的链路。

服务端包括了三部分,控制面、用户面,和数据、运营、监控等服务。每一块都包含多个具体的应用。团队成员物理上在一起,协作紧密,工程能力还可以,有单元测试和功能自动化保证,基本上可以做到比较快的测试反馈。

它有两种应用:一个是服务端应用。一般golang、C++都是通过源码级构建依赖,运行时依赖配置中心,共30个左右应用,一次发布一个应用,每个应用是独立发布,所以不存在发布的依赖性和编排问题。

另外一个是客户端,一个代码多端构建,无运行依赖,有的可以热更新,有的需要通过应用市场发布,比如说iOS,所以发布频率不太一样,会导致长期有多个版本存在。那么,怎样针对服务端和客户端去做研发模式的设计?

首先看服务端,服务端是一个看上去比TBD还简单的模式,因为人很少,服务拆得足够小,几乎每个服务同时只有1—2个人在修改。这样的情况下就没必要再用release分支,直接在主干上开发。基本上一个服务一个库,而且这个服务拆得粒度很小,平均一个人大概是3、4个应用,这个服务是很小的。

这样的情况下,它会有一些自己的纪律,比如因为要保证多端和客户端多版本,代码需要保证向前兼容,同时代码是直接Push在Master分支上的,不存在合并等问题。在Master上一旦代码提交会有对应的测试,如果测试失败,提交者需要在一小时内修复。在Master上创建Tag即会视为一次发布。

如果出现问题,在最新代码上修复,永远发布最新的版本。这就是服务端的流水线,所以如果有类似的团队建议可以尝试一下,基本上来说如果做好纪律,可以做到很高效地发布。

客户端基本上就是TBD的模式。平时还是主干开发,代码在主干上集成,但是要发布的时候会拉一个release分支,因为客户端的发布和升级比较困难,需要做足够多的发布前验证,这个情况下就需要release分支去保护。同时因为它会同时存在多个版本,所以需要在release分支上做bugfix。

但是,release分支还是要保持活跃数尽量地少,所以一般只关注最新的活跃的release分支。这样TBD是一个非常合适的模式,针对发布它会做隔离,另外,因为一个版本需要保持一定时间的维护,所以需要一个相对长期的release分支。

2、基础网络产品

它是在软件层面做的虚拟化网络产品,很多外部做一些底层产品的公司会遇到这样类似的产品。整个产品研发50人左右,分为5个团队,每个团队大概10个人。团队间协作需求很高,一般都是一起发布、一起集成,但开发的时候是很多人一起开发的。

整个团队工程能力中等,有单元测试但是没有其他测试的保护,后面的测试主要是靠具体的环境去测,开发的语言是C+和C++为主,部署到物理机或者虚拟机上。应用是一份代码,多端构建,需要应对多种的硬件和操作系统,底层依赖Hypervisor和硬件。部署时可能需要停机,因为网络问题不是总能做到热更新,一次部署一个应用,发布顺序有要求。

如果有多个应用,应用间的发布有编排顺序,它的发布周期很长,通常几个月发布一次,同时会存在两个都在发布的版本,比如一个版本发布了80%,另外一个版本发布了10%。

这个产品的release分支会更长,它的版本需要固定下来,要有明确的Tag。所以Master不能直接提交,永远指向最后一个已发布的版本,但是整个开发其实是拉release去做,这个release可能会比较久。

在这边做完以后,在release做完整的测试和评审然后发布,完成后合进Master。这个类似于项目制,一个release相当于一个项目,从Master上创建出来以后,所有的开发和发布的工作都在这个release分支上,这个release分支就相当于项目的版本。发布完后release分支进入维护阶段。Master在这里是作为一个稳定基线来管理的。

3、金融安全产品

这个产品一份代码提供两种交付形态,包括SaaS和私有化交付形态。整个应用架构比较简单,包含一些后台服务和API入口,以及一个管理和配置用的控制台。后台服务里面API会调很多其他的服务,比如设备指纹、指标计算、数据服务等。

这是典型的大数据场景,包括很多人工智能的产品都是类似的架构。整个团队在150人左右,它的特点是前端、算法、后端、测试都有专门的职能团队,但是没有运维。

团队之间通常需要协作才能完成一个要求,一般来说不会有一个需求落在某一个团队,工程能力一般,没有单元测试和自动化功能测试的守护,基本上是靠后续的人工测试来去保证质量。

整个技术栈是以Java为主,K8s部署方式。另一个特点是二方包依赖较多,snapshot和release版本都有。运行时应用间有较强依赖,比如在API依赖了设备指纹,API依赖了指标计算,类似这样的依赖其实很多。

整个应用数大概是20个,一个应用很多人协作,一次发布往往是一组应用或者是一个应用,SaaS版本落后私有化版本较多。

它和Git—Flow有点类似,区别是没有Develop分支,release分支用来做了临时的集成分支,Master是发布分支,永远指向最新可发布版本。

作为私有化产品,有固定的版本节奏,一般一个月发布一个版本,于是每个月会拉一个release分支来做这个月的Feature分支的集成。集成完以后会合回Master去做发布,发布完打一个Tag。

所以在这里的release分支相当于一个迭代分支。整个测试是比较长的周期,同时也要维护多个版本,因此会有多个并行的release分支存在。

通过这几个例子可以发现,我们需要根据团队和产品的特征来确定它的分支模式。在这些分支模式里面,我们都尽可能地减少分支,让分支的维护成本低一点,因为每多一个分支意味着多一份维护成本。

除此以外,还有一些其他的场景,比如集成过程中,集成进去以后发现集成分支出现问题,需要把相应地代码摘出来。很多的Feature分支合在一起,合并进去以后想再摘出来就很难。这种情况其实也可以用分支,比如临时的集成分支解决。阿里内部的研发工具Aone,有一个分支模式叫Aoneflow,就可以解决相应的问题。

很多时候分支是可以很灵活地去使用的,但是灵活使用也会给程序员带来特别多理解和维护成本。我们的建议是分支越简单越好,另外尽可能地减少程序员的关注度,只关注在自己开发的分支上就好。这里给出几点建议:

  • 单主干:一个代码仓库应该保证有且仅有一个主干分支。像Gitflow里面Develop和Master就比较迷惑。
  • 最少长期分支:避免冲突的前提下,尽量减少长期分支的数量
  • Promotion(晋级):代码的提交应该是逐级合并,如Feature–Develop-Master,是逐步地Promotion的过程。
  • 发布不可变:发布的版本是不可变且可回溯的,可以根据Commit来追溯到你最早的源头。
  • 自动化事件触发:分支的持续集成过程应该是自动化的,且通过代码提交事件或制品变更事件自动触发。

总结

  • 团队研发本质上是一个异步的、延迟协作的过程,随着产品复杂度和团队复杂度的增加,协作成本快速上升。
  • 研发模式的本质是为高效交付需求,研发团队围绕代码库的一系列行为约束。
  • 通过分支进行隔离,避免冲突;通过小批量频繁提交,减少等待。
  • 控制分支需要考虑最大化生产力及最小化风险。
  • 分支的选择需要综合团队规模、协作成熟度、产品交付形态几个要素。

下一讲,我们将进入可信发布篇,敬请期待。

原文链接

本文为阿里云原创内容,未经允许不得转载。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何打造一款极速数据湖分析引擎

简介:本文向读者详细揭秘了数据湖分析引擎的关键技术,并通过 StarRocks 来帮助用户进一步理解系统的架构。 作者: 阿里云 EMR 开源大数据 OLAP 团队 StarRocks 社区数据湖分析团队 前言 随着数字产业化和产业数字化成为经济驱动的重要动…

如何在 Linux 命令行中按大小对文件进行排序

作者 | 刘光录来源 | TIAPls 命令用于显示目录的内容。使用 -l 选项,可以列出文件和目录及其属性。今天我们来分享一下如何根据文件大小对列表进行排序。ls -l 命令可以显示文件大小,但也仅仅是能让我们看到文件的大小,它默认是按照字母顺序显…

福建品品香茶业有限公司业务迁移上云

福建品品香茶业有限公司数据量较大,进行业务迁移上云时阿里云根据其公司需求综合考虑,推荐将原有IOE架构改为分布式架构,使用ECSRDS承载业务,为客户带来极大价值。 企业介绍 福建品品香茶业有限公司是一家集茶叶种植、加工、销售…

璀璨智行:V2X车路协同智慧交通

V2X车用无线通信技术是指车对外界的信息交换,作为未来智能交通运输系统的关键技术,璀璨智行潜心研究V2X技术,致力于V2X车路协同的落地,在智慧交通领域做出了卓越的贡献。 创业机会点 魏军博表示:“面对交通系统效率低…

Databricks 企业版 SparkDelta Lake 引擎助力 Lakehouse 高效访问

简介:本文介绍了Databricks企业版Delta Lake的性能优势,借助这些特性能够大幅提升Spark SQL的查询性能,加快Delta表的查询速度。 作者: 李锦桂(锦犀) 阿里云开源大数据平台开发工程师 王晓龙&#xff08…

深度解析数据湖存储方案Lakehouse架构

简介:从数据仓库、数据湖的优劣势,湖仓一体架构的应用和优势等多方面深度解析Lakehouse架构。 作者:张泊 Databricks 软件工程师 Lakehouse由lake和house两个词组合而成,其中lake代表Delta Lake(数据湖)&…

1688 复杂业务场景下的 Serverless 提效实践

简介:我们主要负责 PC 端 1688.com 以及手机端阿里巴巴 APP,是目前国内最大的 B 类电商交易平台,主要面向 B2B 电商业务的场景,为中小企业提供零售、批发、分销以及加工定制等电商交易渠道。 前言 首先为大家简单介绍一下我们的…

阿里 蚂蚁自研 IDE 研发框架 OpenSumi 正式开源

简介:经历近 3 年时间,在阿里集团及蚂蚁集团共建小组的努力下,OpenSumi 作为国内首个强定制性、高性能,兼容 VS Code 插件体系的 IDE 研发框架,今天正式对外开源。 作者 | OpenSumi 来源 | 阿里技术公众号 经历近 3 …

剖析 kubernetes 集群内部 DNS 解析原理

作者 | 江小南来源 | 江小南和他的小伙伴们引言说到DNS域名解析,大家想到最多的可能就是/etc/hosts文件,并没有什么错,但是/etc/hosts只能做到本机域名解析,如果跨机器的解析就有点捉襟见肘了。在服务器中还有一个配置值得大家注意…

首次公开,阿里云开源PolarDB总体架构和企业级特性

简介:在3月2日的阿里云开源 PolarDB 企业级架构发布会上,阿里云 PolarDB 内核技术专家北侠带来了主题为《PolarDB 总体架构设计和企业级特性》的精彩演讲。 在3月2日的阿里云开源 PolarDB 企业级架构发布会上,阿里云 PolarDB 内核技术专家 北…

阿里云数据库开源发布:PolarDB HTAP的功能特性和关键技术

简介:在3月2日的阿里云开源 PolarDB 企业级架构发布会上,阿里云 PolarDB 内核技术专家严华带来了主题为《PolarDB HTAP详解》的精彩演讲。在PolarDB存储计算分离架构的基础上,我们研发了基于共享存储的MPP分布式执行引擎,解决了单…

倒计时 2 天!2022 中国算力大会:移动云邀您共见算力网络,创新发展

7 月 29 日 - 31 日由工业和信息化部、山东省人民政府主办的首届中国算力大会将在泉城济南盛大举行!中国移动受邀承办“算力网络,创新发展” 论坛并设立展区分享行业前瞻洞察,构建开放共赢生态7 月 29 日下午,邀您共话算力精彩&am…

什么是好的错误消息? 讨论一下Java系统中的错误码设计

简介:一个好的Error Message主要包含三个部分:Context: 什么导致了错误?发生错误的时候代码想做什么?The error itself: 到底是什么导致了失败?具体的原因和当时的数据是什么?Mitigation: 有什么解决方案来…

阿里巴巴在开源压测工具 JMeter 上的实践和优化

简介:Apache JMeter 是 Apach 旗下的开源压测工具,创建于 1999 年初,迄今已有超过 20 年历史。JMeter 功能丰富,社区(用户群体)庞大,是主流开源压测工具之一。 作者:灵苒、涧泉 Ap…

普洛斯荣获两项“数据中心绿色等级评估”5A级认证

7月29日,由工业和信息化部及山东省人民政府主办的首届中国算力大会在济南成功举办,会上同时公布了本年度“数据中心绿色等级评估”评审结果。普洛斯常熟东南数据中心B栋及普洛斯怀来数据中心3号楼均荣获“数据中心绿色等级评估”(规划类/基础…

深度解读企业云上办公利器「无影云电脑」

简介:信息化进程高速发展的今天,用户桌面办公的需求正不断发生变化:远程办公,BYOD的需求不断增长;快速交付,高效运维的需求接连上升;数据及网络安全的关注度持续提高;整体办公成本在…

云风:不加班、不炫技,把复杂的问题简单化

小学时跟随母亲去成人大学学习编程,初中开始参加信息学奥赛,高中写出人生中第一个成熟软件——Cview,大学发布开源软件风魂系列,后用于网易开发的《大话西游》《梦幻西游》等热门游戏,离开网易创立简悦科技……随着云风…

Timing:在线自习室快速搭建

通过超低延迟的音视频通信技术、视频连麦、弱网传输算法,快速搭建自习场景,提升自习效率。 客户简介 氪细胞主打产品Timing,是国内最早推出,也是规模最大的在线自习室,是新一代的教育与社交融合平台,主打高…

Nacos2.0的K8s服务发现生态应用及规划

简介:Nacos 是阿里巴巴于 2018 年开源的注册中心及配置中心产品,帮助用户的分布式微服务应用进行服务发现和配置管理功能。随着 Nacos2.0 版本的发布,在性能和扩展性上取得较大突破后,社区开始考虑如何提供更加云原生方向的功能和…

webview 和 React Native 中吸顶效果实现

作者 | 👽来源 | Sharing一、前言 在跨端开发中,离不开一些吸顶的交互场景,可以参考淘宝或是京东类电商 app 中一些 tab ,在整个容器滑动的过程中,吸顶效果非常的连贯和丝滑的,当然这些 tab 可能是用 nativ…