从需求到上线全流程 | 青训营笔记

207 阅读11分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第6篇笔记

一、 本堂课重点内容

1.      为什么要有流程

2.      有哪些流程

3.      流程怎样优化

4.      后端开发的一周

二、 详细知识点介绍

2.1 为什么要有流程

       2.1.1 团队规模和流程的关系

复杂项目没有流程有什么问题

需求阶段:每个人都有自己的想法,团队决策需要有一个过程

开发阶段:多人/多端协作开发,每个人有自己的安排,相互配合需要有一个流程

测试阶段:产物怎样交付,测试如何开展,BUG怎么修都需要流程

发布阶段:怎样确保发布过程平稳丝滑,版本和流量如何控制,需要有规范

运维阶段:线上问题如何应急响应,处理用户反馈和线上问题需要有流程

              2.1.2 传统的瀑布模型

                    

image.png               特点:工作流程的直观表达

                       定义了标准的研发阶段

                       以流程为本,理想化模型

              2.1.3 敏捷开发

image.png               特点:以小团队快速迭代

                       团队成员直接的合作更加紧密

                       以人为本,和用户沟通

 2.1.4 SAFe简介

SAFe是一套管理框架。

现代的Scum:

敏捷教练Scrum Master

产品负责人Product Owner

敏捷团队Scrum Team

敏捷发布火车Agile Release Train

 2.1.5 团队的流程

image.png 人员&名词解释:

RD:研发

PM:产品经理

PRD:需求文档

UED:用户体验设计

QA:测试

Scum1:敏捷团队1

P0/P1:优先级0/优先级1

Backlog:规划列表

会议解释:

待办事顶整理会议(Backlog Grooming Meeting):产品负责人描述下个迭代希望实现的用户故事,PM提出需求列表

迭代计划会议(Sprint Planning Meeting):选择迭代的任务和估算工作量

每日站会(Standup Meeting):

昨天你做了什么?

今天你将要做什么?

你有需要帮助的地方吗?

评审会(Review Meeting:小组向产品负责人展示迭代工作结果

反思会(Retrospective Meeting):在每个迭代后召开简短的反思会,总结哪些事情做得好,哪些事情做得不好

2.2有哪些流程

              2.2.1 需求阶段

                     MVP(minimum viable product,最小化可行产品)思想:

                            站在用户的角度思考,手机用户反馈,快速迭代

                     四象限法——用于评估需求

                     先判断重要性再判断紧急程度

image.png               2.2.2 开发阶段

             

image.png  

云原生下的开发:

传统虚拟机:

在物理主机中虚拟出多个虚拟机,每个虚拟机拥有自己的操作系统

运维人员负责维护和交付虚拟机

每个虚拟机中都要安装相应的依赖环境

容器化:

容器是在操作系统中虚拟出来的

通过cgroup,namespace和Union Mount等技术实现了容器之间的相互隔离,桶时容器只有很低的开销

应用和其依赖作为一个整体,打包成镜像交付

单体架构:

多个模块共同组成一个服务,服务体量较大

模块之间直接调用,不需要RPC通信

服务整体扩缩容量

多人开发一个代码仓库,需要充分集成测试

微服务架构:

各个功能在不同的服务中

不同模块需要进行RPC通信

不同模块可以独立扩缩容

每个服务的代码仓库仅由少部分人维护

云原生下的开发特点:

开发环境逐渐云原生化

FaaS,PaaS等等技术,让开发逐渐从本地IDE向线上转变

从入职领到电脑搭建完一套完整的开发环境需要很久,通过WEB IDE等技术,未来环境将会开箱即用

2.2.3 团队的分支策略

我们日常工作中写代码都是基于主干的某个版本进行修改,改完之后再把代码合并回主干形成新的版本

这里就会有一些协作上的问题:

多个团队成员各自用什么分支?修改有冲突怎么解决?出了问题代码如何回退?

为了应对这些问题:

有些团队会有一个专门的分支叫做release?分支,大家都把代码合并到release分支,然后测试,发布,之后再把release分支合会master

有些团队会直接把开发的分支合入master,然后再用某个master_上的commit发布

之所以有各种各样的分支策略,就是因为我们在后续的测试和发布阶段要按照对应的分支和commiti进行交付

2.2.4 代码规范,自测和文档

代码规范:

养成良好的注释习惯,超过三个月的代码,自己都会忘了当时在想什么

不要有魔法数字,魔法字符串

重复的逻辑抽象成公共的方法,不要copy代码

正确使用IDE的重构功能,防止修改错误

自测:

单元测试

功能环境测试

测试数据构造

文档:

大型改造需要有技术设计文档,方案评审

好的接口文档能更方便的和前端进行沟通

2.2.3测试阶段

             

image.png  功能环境:

需要一个能模拟线上的环境进行开发和测试

环境和环境之间能够隔离,不影响其他功能的开发和试

集成环境:

不同人开发的功能合并在一起汉试,相互之间的影响可能产生缺陷

迭代发布的所有功能合并在一起侧试,确保发布的所有功能之问的影响不产生缺陷

回归环境:

确保新的功能不对老的功能产生影响

回归测试一般会借助自动化测试脚本

2.2.4发布阶段

职责分布:

发布负责人:

负责按照计划执行发布

需要通知各个相关人员发布进展

观察各个服务的发布状态,及时处理异常

变更服务的相关RD:

按照上线checklist检查服务的日志,监控,响应上线过程中的告警

对于自己负责的改动,在小流量或者是预览环境进行功验证

执行发布计划中的其他操作(如线上配置,数据处理等)

值班同学:

发布过程中的监控和告警需要特别关注,如果有异常需要立刻判断

是否由变更引起

如果有变更引起的告警或者用户反馈,需要及时中止发布

各种发布模式:

1.      简单粗暴,直接用新版本覆盖老版本

优点:简单,成本低

缺点:发布过程中服务会中断,出了问题会影响全部用户

适用:测试环境部署,小公司或者非核心的业务服务

2.      金丝雀发布

image.png 由于金丝雀对瓦斯极其敏感,因此以前矿工开矿下矿洞前,先会放一只金丝雀进去探是否有有毒气体,看金丝雀能否活下来,金丝雀发布由此得名。

优点:相对简单,能够用少量用户验证新版本功能

缺点:发布过程中服务会中断,发现不了随用户量增大才会暴露的问题

适用:测试环境部署,小公司或者非核心的业务服务

3.      滚动发布:每个实例都通过金丝雀的方式逐步放大流量,对用户影响小,体验平滑。

优点:发布过程中用户体验不会中断,可以充分验证服务功能

缺点:流程较复杂,对发布系统有比较高的要求,发布速度较慢,新老版本不兼容的情况不能使用

适用:发布系统能力较强,可以平滑切换流量,发布自动化程度高,可以自动滚动

4.      蓝绿发布

把服务分成蓝绿两组,先把蓝组流量摘掉然后升级,只用绿组提供服务,之后切换全部流量,只用蓝组提供服务,然后升级绿组服务,最终两组全部升级。

优点:发布速度快,流程相对简单

缺点:需要有一半机器承担所有流量的能力,出问题会影响全部用户

适用:服务器资源丰富,新老版本不能兼容的情况,雲要一次性升级到新版

5.      红黑发布

和蓝绿发布类似,但是发布时会动态扩容出一组新的服务,而不需要常备两组服务。

优点:发布速度快,流程相对简单

缺点:对机器数量仍然有要求,需要能扩容一倍,出问题会影响全部用户

适用:服务器资源丰富,新老版本不能兼容的情况,需要一次性升级到新版

6.      滚动发布

实际工作中,我们的发布使用的是滚动发布,发布的负责人需要关注滚动的粒度和时间,以及具体执行的进度

因为这种方式对用户的体验最平滑,同时公司也有强大的流量控制能力,能够平滑的切换流量能够支持滚动

但是仍然有一些场景需要使用蓝绿发布

可能有些公司因为发布需要在用户低峰期进行,所以在那些公司发布的时候,往往都是在夜深人静的时候,这也就是程序员经常要晚上加班的很大一个原因

              2.2.5运维阶段

             

image.png               公司在发展过程中,逐渐形成了十分复杂的超大规模微服务体系。为了实现对这些复杂微服务的监控,我们往往会在微服务中添加埋点采集Metrics、.Logging、分布式Trace等多种数据。

2.3流程怎样优化

image.png        2.3.1DevOps

       DevOps解决方案:代码管理、自动化测试、持续集成、持续交付

所谓DevOps,就是由左侧的Dev和右侧的Ops组成,从需求开始,写代码,编译,测试,发布,运维,监控形成了一个闭环。于是我们可以进行特续集成,持续交付,也就是说CI和CD,大家谈CI/CD的时候其实往往独立去谈,其实整个流程是密不可分的

image.png        效率竖井:流程中实际产生价值的部分很短、大量的时间用在等待和传递上、人和人之间的沟通很慢

       2.3.2 全流程自动化

通过效能平台串联各个阶段:

需求发起研发流程的自动化

写代码,测试环境部署的自动化

自动化测试触发和报告分析

发布过程可观测融入流程

减少无价值的等待:

分析整个流程的耗时,计算真正产生价值的时间

不断优化流程,让有价值的流程时间占比上升

2.4 后端开发的一周

周一:产品功能演示和反思会

       针对上个迭代开发的功能进行演示,反思上个迭代的不足,如果没有特殊的问

题可以跳过。此时,PM和UED已经准备好了明天要规划的需求列表

周二:Grooming会议

       之前的一周,backlog里积累了92个需求

在会议上,PO和PM阐述各个需求的价值

Scrum Master和架构师确认需求中包含的技术任务

最终,会议确定下个迭代要做70个需求,并给你安排了10个需求

       周三:提交火车发布车票

              之前开发的需求需要上线,提交一个发布车票

对其他人提交的上线工单进行Code Review

修复代玛缺陷

       周四:发布

              之前提交车票的部分功能要在今天发布

发布过程中发现监控出现异常,马上中止了发布,定位问题原因

发现是自己的代码有问题,需要进行回滚和修复

       周五:Planning会议

              发现下个进代只能完成8个需求,按照优先级把2个需求移出迭代

将8个需求的工作量进行评估

把8个需求各自的开发和上线时间进行排期

三、 课后个人总结

本堂课主要介绍了项目整体的开发流程和协调分工。可以对未来的工作流程有一个大体的认识。

四、 引用参考

青训营官方课程