这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
01. 为什么要有流程
1.1 团队规模和流程关系
为什么要有流程?
- 个人开发是不需要流程的
- 超过一个人的团队就需要协作
- 随着团队规模上升,会出现全新的问题
复杂项目的问题
- 需求阶段:每个人都有自己的想法,团队决策需要有一个过程
- 开发阶段:多人/多端协作开发,每个人有自己的安排,相互配合需要有一个流程
- 测试阶段:产物怎样交付,测试如何开展,BUG怎么修都需要流程
- 发布阶段:怎样确保发布过程平稳丝滑,版本和流量如何控制,需要有规范
- 运维阶段:线上问题如何应急响应,处理用户反馈和线上问题需要有流程
1.2 传统的瀑布模型
主要分为五个部分:
1、需求 2、开发 3、测试 4、发布 5、运维
传统的瀑布模型是以流程为本的理想化模型
1.3 敏捷开发
敏捷开发宣言的价值观如下
- 个体和互动 高于 流程和工具
- 工作和软件高于详尽的文档
- 客户合作高于合同谈判
- 响应变化高于遵循计划
也就是说,尽管右项有其价值,我们更重视左项的价值
敏捷开发应该做到
- 以小团队快速迭代
- 团队成员之间的合作更加紧密
- 以人为本,和用户沟通
1.4 SAFe简介
SAFe(The Scaled Agile Framework)是一套管理框架,这套框架是为企业中实施敏捷开发提供一套方法论,如果说敏捷开发是一个团队内部的协作方式子,那么SAFe就是在企业中,多个敏捷团队之间怎样配合
- 精益产品开发
- 敏捷软件开发
- 系统思考
现在的Scrum
- 敏捷教练
- 产品负责人
- 敏捷团队
- 敏捷发布火车
现在软件开发的阵型像是特种部队,每个人都是身怀绝技,虽然大家会分工
但是并不是说产品设计只由产品经理负责,领导负责分配任务
大家的决策和配合都是非常有凝聚力的行动
如果一个scrum就是一个战术小队
敏捷教练就好比是小队的队长,产品负责人是负责联络指挥部和发布任务的人,其他团队成员就是特种兵
大家也不是按照一个方阵去前进,而是用更敏捷的方式去前进,也就说敏捷发布火车
1.5 团队的流程
人员&名词解释
- RD:研发
- PM:产品经理
- PRD:需求文档
- UED:用户体验设计
- QA:测试
- Scrum1:敏捷团队1
- P0/P1:优先级0/优先级1
- Backlog:规划列表
会议解释
-
待办事项整理会议(Backlog Grooming Meeting)
- 产品负责人描述下个选代希望实现的用户故事,PM提出需求列表
-
迭代计划会议(Sprint Planning Meeting)
- 选择选代的任务和估算工作量
-
每日站会(Standup Meeting)
- 昨天你做了什么?
- 今天你将要做什么?
- 你有需要帮助的地方吗?
-
评审会(Review Meeting)
- 小组向产品负责人展示选代工作结果
-
反思会(Retrospective Meeting)
- 在每个选代后召开简短的反思会,总结哪些事情做得好,哪些事情做得不好
02. 有哪些流程
2.1 需求阶段
说到需求阶段,马斯克在接受一个采访的时候讲过一个故事
他们在做特斯拉生产线的自动化的时候,有一个零件的安装自动化总是出问题
特斯拉的工程师为了优化这个自动化流程,投入了大量的资金和精力
后来马斯克问他们的技术人员,为什么需要这个零件,结果发现大家居然并不清楚
最后证明其实在电动车上,根本不需要这个零件 所以围绕着这个不应该存在的问题,进行了大量投入,造成了很多浪费
所以,这个故事就告诉我们一个道理,不要浪费时间讨论不应该存在的问题
MVP的思维方式
如果我们要给用户造一辆车,我们不应该第一天给他一个轮子,第二天给两个轮子,第三天给他一个底盘,第四天才让他开上车
我们应该先给用户一个简单能用的产品,比如一个滑板车,一个自行车,根据用户的反馈我们再逐步把车的功能升级,最终变成用户想要的产品
2.2 开发阶段
云原生的发展,深刻改变了后端开发的工作
云原生的开发阶段
部署形式转变
-
传统虚拟机
- 在物理主机中虚拟出多个虚拟机,每个虚拟机拥有自己的操作系统
- 运维人员负责维护和交付虚拟机
- 每个虚拟机中都要安装相应的依赖环境
-
容器化
- 容器是在操作系统中虚拟出来的
- 通过cgroup, namespace和Union Mount等技术实现了容器之间的相互隔离,同时容器只有很低的开销
- 应用和其依赖作为一个整体,打包成镜像交付
架构形式转变
-
单体架构
- 多个模块共同组成一个服务,服务体量较大
- 模块之间之间调用,不需要RPC通信
- 服务整体扩缩容量
- 多人开发一个代码仓库,需要充分集成测试
-
微服务架构
- 各个功能在不同的服务中
- 不同模块需要进行RPC通信
- 不同模块可以独立扩缩容
- 每个服务的代码仓库仅由少部分人维护
开发过程
- 开发环境逐渐云原生化
- FaaS, PaaS 等等技术,让开发逐渐从本地 IDE向线上转变从
- 入职领到电脑搭建完一套完整的开发环境需要很久,通过WEB IDE等技术,环境未来将会开箱即用
团队的分支策略
- 多个团队成员之间各自用什么分支开发?
- 修改之间有冲突怎样解决?
- 出了问题的代码如何回退到之前版本?
代码规范、自测和文档
代码规范
- 养成良好的注释习惯,超过三个月的代码,自己都会忘了当时在想什么
- 不要有魔法数字,魔法字符串
- 重复的逻辑抽象成公共的方法,不要copy代码
- 正确使用IDE的重构功能,防止修改错误
自测
- 单元测试
- 功能环境测试
- 测试数据构造
文档
大型改造需要有技术设计文档,方案评审
好的接口文档能更方便的和前端进行沟通
2.3 测试阶段
测试种类
- 单元测试
- 集成测试
- 系统测试
- UI测试
越底层的测试粒度越细,就需要越多的数量去覆盖所有场景,越顶层的测试越能用少量的case覆盖大多数场景
但是有一个软件开发中的常识:越早发现的缺陷解决成本越低
因为85%的缺陷是在开发阶段引入的,而如果要在上线之后修复他们,话费的成本可能是一开始就解决他们的数百倍 所以我们还是要尽可能早的发现bug,进行充分的单元测试
环境种类
-
功能环境
- 需要一个能模拟线上的环境进行开发和测试
- 环境和环境之间能够隔离,不影响其他功能的开发和测试
-
集成环境
- 不同人开发的功能合并在一起测试,相互之间的影响可能产生缺陷
- 迭代发布的所有功能合并在一起测试,确保发布的所有功能之间的影响不产生缺陷
-
回归环境
- 确保新的功能不对老的功能产生影响
- 回归测试一般会借助自动化测试脚本
2.4 发布阶段
发布过程中要做的事
-
发布负责人
- 负责按照计划执行发布
- 需要通知各个相关人员发布进展
- 观察各个服务的发布状态,及时处理异常
-
变更服务的相关
- 按照上线checklist检查服务的日志,监控,响应上线过程中的告警
- 对于自己负责的改动,在小流量或者是预览环境进行功能验证
- 执行发布计划中的其他操作(如线上配置,数据处理等)
-
值班同学
- 发布过程中的监控和告警需要特别关注,如果有异常需要立刻判断是否由变更引起
- 如果有变更引起的告警或者用户反馈,需要及时中止发布
各种发布模式
1、蛮力发布
简单粗暴,直接用新版本覆盖老版本
-
优点
- 简单
- 成本低
-
缺点
- 出问题服务会中断
- 影响全部用户
-
使用
- 测试环境部署
- 小公司或者非核心的业务服务
2、金丝雀发布
-
优点
- 相对简单
- 能够用少量用户验证新版本功能
-
缺点
- 发布过程中服务会中断
- 发现不了随着用户增大才会暴露的问题
-
使用
- 测试环境部署
- 小公司或者非核心业务
3、滚动发布
每个实例都通过金丝雀的方式逐步放大流量,对用户影响小,体验平滑
-
优点
- 发布过程中用户体验不会中断
- 可以充分验证服务功能
-
缺点
- 流程比较复杂,对发布系统又比较高的要求
- 发布速度较慢
- 新老版本不兼容的情况不能使用
-
适用
- 发布系统能力较强,可以平滑切换流量
- 发布自动化程度较高,可以自动滚动
4、蓝绿发布
把服务分成蓝绿两组,先把蓝组流量摘掉然后升级,只用绿组提供服务,之后切换全部流量,只用蓝组提供服务,然后升级绿组服务,最终两组全部升级
-
优点
- 发布速度快
- 流程相对简单
-
缺点
- 需要有一半机器承担所有流量的能力
- 出问题会影响全部用户
-
适用
- 服务器资源丰富
- 新老版本不能兼容的情况,需要一次性升级到新版
5、红黑发布
和蓝绿发布类似,但是发布时会动态扩容出一组新的服务,而不需要常备两组服务
-
优点
- 发布速度快
- 流程相对简单
-
缺点
- 对机器数量仍然有要求,需要能扩容一倍
- 出问题会影响全部用户
-
适用
- 服务器资源丰富
- 新老版本不能兼容的情况,需要一次性升级到新版
2.5 运维阶段
当故障发生之后,我们是有几个关键的动作的:
首先是止损,尽快去让服务恢复功能
其次是要让服务的上下游感知到出了问题
当上面两个动作做了之后大家才需要去定位和修复问题
03. 流程怎样优化
3.1 怎样让生活更美好
- 技术的发展会带来质量和效率的同时提高
- 将质量保障融入到流程,将流程自动化
- 从需求到上线全流程自动化,同时提高质量和效率
3.2 DevOps
- 代码管理
- 自动化测试
- 持续集成
- 持续交付
效率竖井
- 流程中实际产生价值的部分很短
- 大量时间在等待和传递上
- 人与人沟通很慢
3.3 全流程自动化
-
通过效能平台串联各个阶段
- 需求发起研发流程的自动化
- 写代码,测试环境部署的自动化
- 自动化测试触发和报告分析
- 发布过程可观测融入流程
-
减少无价值的等待
- 分析整个流程的耗时,计算真正产生价值的时间
- 不断优化流程,让有价值的流程时间占比上升
04. 总结
软件从需求到上线这个过程是一个逐渐成长的过程
一开始进入一家公司,我们肯定要学习公司的流程,团队成员分工,开发的节奏这些
背后其实是有理论依据的,就我们现代软件开发的几种模型
然后当我们真正成为了一个后端开发的角色,在需求到上线的各个阶段,我们需要去执行 需求评估,开发,测试,发布,运维
更进一步,当我们越来越有经验,甚至以后可能有些会承担团队的管理,那么就需要去思考怎样去优化这个流程,让大家的生活越来越美好