开发流程。
OKR 的设立
OKR 是企业进行目标管理的一个简单有效的系统,能够将目标管理自上而下贯穿到基层。
技术驱动反映在:
-
在确定
Roadmap的过程中,采用调查(Survey)模式,确保工程师的声音可以准确地触达管理层。公司一般分为产品组和系统架构组。总的说来,在系统架构组的
OKR里,工程师的声音会很大。 -
项目怎么做,怎么规划,一般是由工程师来决定。
OKR只确立目标,是不是要构建新的服务,是不是要沿用现有的架构,如何进行技术选型等等,这些不是OKR的组成部分。 -
估算
OKR目标工期时,除去一些用来做技术创新和支持的时间,预留一定时间缓冲。
主项目及其子项目的确立
主项目是主要的技术或商业产品,一般由产品经理、技术经理和一些技术骨干经过产品需求和技术讨论之后,确定要做什么(Scope),不做什么(Non Scope)和大的里程碑(Milestone)。
主项目确定了,就需要安排不同的人做不同的模块,即子项目。一般团队协作有两种方式:
-
每个人负责一个子项目。
- 优点:责任清晰,每个人都知道自己的职责,工程师们也有更多的拥有感,他们可以独立负责产品的设计、实现、测试和维护,工作贯穿整个项目过程。
- 缺点:子项目比较独立,很容易因为负责该子项目的工程师设计或者实现能力不足成为路障或者瓶颈;工程师之间缺乏互相学习的机会。另外,因为是按人并行推进项目,需要根据每个人设置里程碑,技术管理者需要常常跟进每个人的进度,管理代价更高。
-
所有人一起逐次完成每个模块或需求(大家先一起完成基本框架,然后逐个需求、逐个模块推进,最终一起完成整个项目)。
- 优点:工程师之间合作最大化,可以彼此协调、彼此学习、在对方有事的时候相互补位。项目管理有明确的统一的里程碑,每个工程师都有机会接触更多的工作,每个人的代码可以有更多人参与审核。
- 缺点:每个工程师的责任不是那么明显,很容易出现能者多劳、勤者多劳的现象。一些新人总是做一些执行或打杂的事,得不到锻炼。
两者各有利弊,现实中应该根据情况组合使用。如,两到三个人合作负责一个模块,也可以在每人一个模块的基础上,将小模块组合成大模块。然后每个大模块有个技术负责人(Tech Lead),对一些能力不足的工程师给予指导和支持等。
每个子项目的生命周期
-
开发初期的设计文档。
一般使用可以共享的文档形式,不同的人可以编辑或者评论、阅读。
一般设计文档会先由组内工程师和产品经理审核,然后到大组评审。如果涉及公司的整体架构,还需要发给全公司审核。
设计文档不仅包括怎么实现,还有选型的理由、考虑的因素、支持和不支持的属性、时间线等等。
-
设计测试实验(可选)。
如果针对某个产品需求我们想知道用户的反馈,就需要数据工程师参与设计实验,即
A/B测试。实验中的数据埋点也会在下一步的实现中完成。 -
开始实现。
不论是单人负责还是多人合作,实现都是按照多次代码提交(
Pull Requests)来迭代的。每次代码提交要写清楚代码改动的摘要和测试。并通知不同的工程师审核。
-
所有实现都要加入监控、日志、预警代码。
-
所有实现都隐藏在一个开关后。
当代码都就位后,就开始灰度发布。通常是先发布给几个开发人员测试,然后到项目组,然后到其他员工,最后按照百分比推给用户。
推送的过程中会结合
A/B测试,只有测试结果显示对用户体验、公司主要的指标没有明显的负面影响,才会正式发布给所有用户使用。 -
对一些需要重构的关键产品链路,有时候也会使用双重写入(
Dual Write),就是新特性和旧特性都写入数据库,并通过不同方式比较两个实现的结果。只有验证结果一致时,才从旧实现切换到新实现。 -
扫尾工作,如移除用来做
A/B测试和灰度发布的代码开关等,有时候还会有一些次要需求的实现。
主项目的生命周期
- 整体设计文档输出,界定所有子项目的范围和相关性、时间线等。
- 就子项目发现的一些共同需要的架构或者服务,单独提取成公共服务库。
- 给相关人员做进度报告,包括主项目的里程碑。
- 子项目完成时间可能不一样,需要进行人员的重新配置。
- 在开发过程中不断更新文档。
- 因为不确定的需求变动,会取消或者生成新的子项目。
- 因为公司的方向变化或战略调整,对主项目做比较大的变更,同时对应调整相关的子项目。
- 在项目开始和结束的时候,需要做好对外的交流和沟通。一来确保自己的项目改动不会影响到其他组的项目,二来让将来会依赖这个项目的产品组了解相关信息,确定计划。
收尾、维护、复盘
整个项目结束后,一般都会做一些代码清理和文档的更新和整理,有时还需要写新的用户手册或 Wiki 等。一些基本的错误和异常处理要写到运维手册(Oncall Playbook)里,便于以后运维的人知道怎么处理一些已知的问题。
每个项目结束都会进行复盘,总结整个项目的教训和经验。有时候还需要在组内做些演讲,让更多的人了解这个项目。