作者回复: 好问题,这个通常有两种方案:
方案一:v1.1可以不合并回master,如果有bug修复,现在v1.1上修复,然后把修复的代码同时cherry-pick到master,就是要提交两个PR,内容一样。
方案二:v1.1在部署后合并到master,这样就可以把v1.1上的修改合并到master,但是可能会有不少代码冲突
各有优缺点,具体怎么做还是看项目组的决策。
作者回复: 谢谢支持!
这里有两种策略:
1. 每次线上bug,修复后只合并到预部署分支,最后统一把预部署分支合并会主分支。优点是简单,缺点是合并时可能会有很多冲突;
2. 每次线上Bug,修复后同时合并预部署分支和主分支。优点是以后就不用再合并回去,还有可以及时同步bug修复,缺点是麻烦,每次要cherry pick。
我们项目中选的是后一种策略,因为能及时同步Bug修复到主干对我们很重要。
作者回复: 赞,可以先实验,看看扑克估算是不是适合,如果好的话就可以进一步固定下来。
你说的那种不算结对编程。
结对编程(英语:Pair programming)是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作。 一个人输入代码,而另一个人审查他输入的每一行代码。 输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。 两个程序员经常互换角色。
作者回复: 项目经理、产品经理兼多个项目是正常的,也没大问题。
但是让程序员同时兼做开发和项目经理工作就很不好,因为项目经理需要更多全局掌控,而一旦要花精力在开发上,很难跳出具体的开发工作,会极大影响项目管理工作;项目管理工作也会频繁打断开发,造成进度延迟。
所以我建议应该有专职的项目经理,不应该让程序员兼职项目管理。
新旧项目交织并不是问题,可以放在一个项目一个Sprint里面一起管理,也就是同一个Sprint里面有维护的Ticket,也有新需求的Ticket,只要保证开发人员同一时间只是做一件事,而不要几件事并行,就可以最大化发挥敏捷优势。
作者回复: 这个问题我真帮不上你,因为我C++不懂,你得自己去网上问问别人。
帮你发了条微博问问,希望有用:https://weibo.com/1727858283/Hko9VyVbI
更新:微博上大家都推荐gtest,应该不错。
作者回复: 这个呀,有一些建议参考:
1. 招人和开人都很重要,招优秀的,开掉没有责任心,没能力的。这两点都不容易做到,不过得坚持做;
2. 设置合理的流程,配合一定的奖惩制度;你奖励什么,团队就会往哪方面发展;
3. 团队要有梯队,不能都是资历浅的也不能都是资深的,保持一个合适的比例是比较健康的;
4. 实战中锻炼,实战中磨合;给他们有挑战的任务,给予合适的指导(这就是有梯队的原因,需要高一级别的待低一级别的)
仅供参考
作者回复: 我觉得当前Sprint的测试,还是应该和当前Sprint一起走比较好,因为这个Sprint的内容是不是上线,还是要看测试是不是已经通过。另外两个Sprint或多个Sprint是可以同时存在的。
针对文章中的流程,以下工作流可以参考:
ToDo->开发中->代码审查中->合并master->部署测试环境->测试通过->已部署
设置“测试中”取决于测试人员是不是很多,任务可能有冲突,要不要知道测试人员当前正在干嘛,不需要的话其实不需要,只需要知道测试结果就好了:测试通过移动到“测试通过”栏,测试没通过,回到“To Do”栏。
有些测试只有开发能测试的,这种应该在Ticket中标明,例如在标题上加上“[开发]”标签,然后由组内其他开发人员辅助测试,或者根本不需要测试。
自动化测试要放作为日常开发任务的一部分,比如一个任务,你可以创建两条Ticket,一条是开发的ticket,一条是自动化测试代码的Ticket,分别进行打分。
后面还会有测试章节。
作者回复: 其实早期我试过在一个Sprint里面开发和测试,后来发现测试时间不充分,上线后老有小问题,所以调整为一周开发,一周测试,错开的这种方式,就特别稳定了,每周也有发布。
作者回复: 👍
是的,测试需要时间的,如果功能开发星期五才完成,那么下周一部署就没时间测试。
线上Bug的修复优先级是最高的,其次是预部署环境的Bug,高于新功能开发的优先级。
作者回复: 好问题👍
v1.1的更新,同步更新到master,这样从master创建v1.2的时候,就包含了v1.1的更新。
例如用git的cherry-pick可以方便的选取v1.1的更新commit到master。
作者回复: 抱歉这是我没表达清楚。
我把时间上的Sprint和看板的Sprint混在一起说了。
我们以文中的Sprint1.1为例,Sprint1.1在第一周,某个功能(例如:Ticket-123)属于Sprint 1.1。
然后到了第二周,Sprint1.2开始开发了,这时候,Sprint1.1开始测试了。发现了Ticket-123的Bug,测试提了一个Bug(例如:Ticket-234),这个Bug的Ticket属于Sprint 1.1,而不是Sprint 1.2。
像Jira这种软件,可以多个Sprint共存,也就是你看Sprint 1.1,可以看到Sprint 1.1的所有的Ticket状态;切换到Sprint 1.2,可以看到Sprint 1.1的所有的Ticket状态。
这就是为什么我建议alan把Bug放到当前的sprint里。
希望我这么补充说明能说清楚,而不是更混乱了。
如果不清楚请继续留言。
作者回复: 👍分析的很到位
分支不一定要合并,也可以考虑一个Commit放到两个Branch,git用cherry-pick可以支持
新分支开发也是个不错的办法,有一个小问题就是如果线上版本要打补丁,而这时候开发版本和master合并了,就稍微麻烦一点。
作者回复: 微服务的架构下,通常一个微服务的小组要么前后端都做,要么通过架构将前后端分离:只做前端或者只做后端。
因为拆成微服务一个主要目的就是要将大开发团队分拆成小开发组,一个微服务小组通常只有3-6个开发,在做微服务的架构拆分时就要同时考虑好组织架构的设计。
参考《45 | 从软件工程的角度看微服务、云计算、人工智能这些新技术》中提到的康威定律:
> 你设计的软件系统架构,会以某种方式反映出构建软件背后团队的组织架构。你在设计软件的系统架构时,同时也在设计你的组织架构,反之亦然。也可以简单理解为:组织架构的设计等同于系统架构的设计。
作者回复: 是每一个功能创建一个新的分支,分支会频繁的创建和删除。
但这对git来说不是任何问题的,每个人主要是拉取master和自己关心的分支,所以还好。
作者回复: 是这样的,开发当前Sprint新功能的时候,同时要修改上个Sprint的bug。比如说这周是Sprint 1.2,那么同时要修改Sprint1.1的Bug。而且Sprint 1.1的Bug的优先级要高于Sprint 1.2新功能的开发。
其实改Bug通常不需要花太多时间,所以一般影响不大。
如果偶尔Bug修改时间过长,不能如期完成的,需要推迟上线。
如果团队不适应这种节奏,那么应该延长Sprint周期,例如两周一个Sprint。
文章的例子只是一个参考,并不是说一定要这样做。
作者回复: 这是个好问题。
我的建议是模块要换着做,宁可慢一点,不然的话不仅仅是其他人不能帮忙不能估算,万一有人离开团队了,麻烦更多的。
如果团队不大,甚至于做的时候,分工都不要太细,都不要太局限前端后端,这样其实对整个团队来讲是最好的,互相能替换。
当然,也不要着急,慢慢来,不要一下子改变很大。
作者回复: 不知道你们有没有测试环境,merge到master后是不是会部署到测试环境,还是直接部署到生产环境?
如果有从master部署到测试环境测试的阶段,其实差不多的。
如果没有测试环境,我想主要差别在于没有专门测试人员的测试,或者说除了负责开发的人以外,其他人不方便去这个分支测试。
因为通常测试环境也只有一个,不方便每个分支都部署到上面测试,所以测试环境通常是部署master上的代码或者专门测试分支的代码。
文章中这种有专门测试分支的方式,优点就是可以通过测试分支,在测试分支上不增加新功能只修复bug,这样可以保证分支的质量趋向稳定;缺点就是比较繁琐。
作者回复: 架构设计上,一定要定期需要重构,优化设计,不然后续新需求效率会降低,包括代码上也会越来越臃肿。比如我现在所在项目组,每1-2年会有一次大的架构升级调整,日常每隔几周会有小的架构优化,这样基本上可以保证快速迭代不会受太大影响。
部署的话,一个是要自动化,可以快速方便的部署,另外一个部署后,需要有配套的数据监控和高于阈值报警的机制,因为上线后可能会有严重问题,需要及时发现,及时处理。
作者回复: 是的,软件工程的知识并不神秘,把很多项目的经验和知识点一结合,你会发现对于你来说那些知识一直在,只是没有理论化。
前天有人问c++的,大家都推荐gtest,不知道是不是适合C语言,建议还是问问专业人士。
作者回复: 文档这个事呀,和是不是敏捷开发真没多大关系,敏捷开发从来没说文档不重要,只是说“工作的软件 高于 详尽的文档”。就算是敏捷开发的团队,必要的文档也是要写的。
瀑布模型的时候我也没看大家多爱写文档,文档质量也差得很,很多人无非就是找个借口不写文档罢了。
你知道对于代码来说最好的文档是什么吗?——良好的代码规范和单元测试!
要是真能按照敏捷开发的要求,保证一定量的单元测试代码覆盖率,从命名和测试代码很容易就可以看出来一个方法的输入和输出,边界条件等。