Scrum 沉思录

2024-08-19 pv

最近对软件工程很感兴趣。

一方面,软件工程让编程这种“手工”技艺规范化,变得专业,另一方面,标准的流程和机制,很大程度上保证了开发质量。

之前经历过几次,因为单测不完备,导致线上出问题,进而返工的情况。于是之后每次写新的需求,都会写单测,这样上线的时候心里有底。同时,代码的可测试性(Software testability),也是设计良好的体现。

不过今天不打算讲具体的工作流,讲讲更高层的问题,项目管理。

Scrum 是目前使用比较广泛的模型。

1. 历史演进

Scrum 最初是用在橄榄球运动。

在 1986 年,竹内弘高和野中郁次郎发表文章,首次提到将 Scrum 与产品开发结合。提出传统的“接力式”开发,已经不能满足日益灵活的市场变化,团队应作为一个整体前进。

1993 年,Jeff Sutherland 首次将 Scrum 用于软件开发,在 Easel 公司定义并实施该流程。

越说越抽象了。那么 Scrum 到底是什么?能解决什么问题?

软件开发流程的发展,大致有四个阶段:混沌时期;瀑布模型;敏捷开发(Agile Development);DevOps。

在软件开发早期,无论技术还是管理方法都不成熟,不存在规范的流程。开发者和使用者都不多,对软件质量要求不高。这是混沌时期的状态。

后来伴随项目规模扩大,需要对复杂性进行管理,瀑布模型(Waterfall)应运而生。这是一个线性模型,将开发分为:需求分析、设计、开发、测试、部署和维护。思路清楚,和现在个体开发流程基本一致。缺点是不够灵活,因为下一个阶段必须在前一个阶段完成后才能继续推进。阶段间也不能重叠,开发周期较长,返工成本很高。

于是敏捷开发兴起。强调迭代开发、小批量发布、团队合作和用户反馈。这是一种能高度适应变化的模型,我个人一般理解为“放松”了的瀑布模型。

再到现在(2024),普遍推崇 DevOps,开发即发布,发布即部署。借助自动化的 CI/CD 工具,迭代频率更快,交付周期更短了。

Scrum 扮演的是一种敏捷开发框架。

敏捷开发的框架有很多,之所以单拎出 Scrum 讲,是因为这套框架使用广泛,国内互联网大厂基本都在使用。

2. Scrum 的内涵

Scrum 执行的基本单元是团队。

团队通常较小,10 人以内。

角色主要有三个:负责人(Master)、产品负责人(Product Manager)和开发者(Developers)。

每个团队都有一个待办事项(Backlog),其中记录了改进产品所需要的工作内容,自然也会标记优先级。Backlog 可以被拆解,比方说,一个新功能特别大,那就可以将其拆分成几个子功能分别完成。

在一个迭代周期内,Scrum 里的术语是 Sprint,时间通常为两周或团队自行调整,整个团队聚焦在一份任务上。在迭代周期内,完成任务交付。

进度管理用一种叫做燃尽图(Burn-down Chart)的工具,记录 Sprint 中剩余的工作量。

日常实践中,还会有每日站会(Stand-up),定期同步团队各成员进展,确保在 Sprint 内,交付不会被推迟。

只要产品不死,Sprint 不会间断。

我们手机里如此多形形色色,功能强大,简单易用的 App,背后正是由一个个密密麻麻的 Sprint 构建出来的。

3. 启示

Scrum 并不难理解,角色,任务,目标,很清晰。

执行中的难点,主要在于理论和现实的落差。因为实际开发中有太多不可控因素,比如,对于外部的依赖,成员生病,低估复杂度,等等。

但这并不意味着这个模型是无效的。软件工程从不追求完美,能做的,就是尽最大努力交付(Best-effort delivery)

我认为,Scrum 给我的启示主要有两个:

  1. 清晰的定义

我是一个比较喜欢抽象的人,在我看来抽象里蕴藏着某种弹性。到后来工作中才发现,在与人沟通这件事情上,具体的才是好的

这也是我老板平时教导的,只有那些明确的、具体的目标,才是最有可能被完成的。

Scrum 里对于角色、行为、目标的定义,都是明确的,这样团队中大家容易达成共识。

小,意味着敏捷。越小,越灵活,越强大。团队小,所以容易协调;Sprint 小,所以目标不会太大,也不会太远,可达性高。

无论多大的产品还是系统,其实都来自一次次微小的增量迭代。

有方向,可实践,就容易拿到结果。

4. 总结

Scrum 是个有用的框架,不仅在软件开发上,在生活中遇到大的问题时,也可以借鉴 Sprint 的思想。

我将其视为一种,目标拆解,分阶段达成的方法论

形式,倒不一定非得严格遵循。

将大的目标分解成一个个小的目标,然后渐进地完成。

有人说,这不就是 Map/Reduce 吗?

(完)

参考

  1. 软件可测试性 - 维基百科,自由的百科全书🔗
  2. 什么是 Scrum? - Scrum 中文网🔗
在 GitHub 上编辑本页面

最后更新于: 2024-08-19T08:29:00+08:00