敏捷项目管理探讨

0、前言

自去年10月份到今年年初,一直在忙着开发公司的某个软件项目,平时也基本是996或007的工作状态,彼时根本没时间打理这个公众号,所以断更有好几个月了。

每次黄教授或其他朋友问起来,最近怎么不更新了?我都只好打哈哈,说过段时间,过段时间一定更。这话讲的次数多了之后,估计他们都已经有点不相信了。

最近项目开发阶段性完成,平时下班后或者周末稍微有了点自己的时间,终于可以将以往欠下的文章补上,那就从今天开始,继续我们之前的客观世界探索之旅,改造我们的世界观。

这半年来参与证券公司研发中心的组建与招聘工作,对国企的运作模式有了细致的观察,期间还专门去上海信息化培训中心专门学习了敏捷项目管理的培训,也进行了一系列的实践,所以最近的内容将围绕敏捷开发模式、技术人员招聘、券商信息化系统等一系列话题展开,与诸位探讨。

今天先从敏捷项目管理开始。

说起“敏捷”,很多人首先想到的是Scrum、Sprint、站会、看板、用户故事这些具体的方法和工具。实际上,如果仅仅把敏捷理解成一套项目管理流程,很容易学会形式,却没有真正理解它。

这半年参与项目之后,我越来越感觉到,敏捷真正改变的并不是“项目怎么开会”,而是我们如何认识软件项目、如何认识需求、如何认识人与组织之间的关系。

1、兴起的背景

敏捷的兴起,并不是因为某一天突然有人发明了一种更先进的项目管理方法,而是传统项目管理模式在软件行业发展过程中,逐渐暴露出了越来越明显的问题。

在很多传统项目中,项目往往按照“需求分析—概要设计—详细设计—编码—测试—上线”的顺序推进。

这种方式本身并没有错。

对于需求明确、技术成熟、变化较少的工程项目而言,提前规划、严格按照计划执行,是非常有效的。

问题在于,软件项目具有一个非常特殊的特点:

项目开始的时候,我们往往并不知道自己最终真正需要什么。

客户可能不知道。

业务部门可能不知道。

产品经理可能不知道。

甚至开发人员也不知道。

于是就出现了一个非常有意思的现象:

项目最开始花费大量时间讨论需求,形成了厚厚的需求文档;随后根据需求进行设计、开发和测试。等系统终于做出来以后,用户却发现:

“这不是我想要的东西。”

这并不一定是谁工作不认真,而是因为需求本身就是会变化的。

特别是在互联网、金融信息化、企业管理软件等领域,需求变化更加明显。

市场环境会变化,监管政策会变化,用户的使用习惯会变化,竞争对手会变化,公司管理制度也会变化。

甚至有时候,只有当一个功能真正做出来以后,用户才能第一次真正意识到:

“原来我真正想要的是这个。”

这就意味着,软件项目与传统建筑工程存在一个非常大的区别。

一栋楼在施工前,可以把绝大多数结构设计清楚;但软件系统往往必须在不断使用、不断反馈的过程中,才能逐渐明确最终形态。

因此,软件项目面对的核心问题并不是:

如何把一份确定的计划执行得更加精准?

而是:

如何在不断变化的环境中,以尽可能低的成本逐渐逼近正确答案?

这就是敏捷产生的重要背景。

如果把这个问题再抽象一层,就会发现,传统项目管理更适合解决“确定性问题”,而敏捷更适合解决“高度不确定性问题”。

2、主要内容

敏捷虽然有很多具体的方法论,但如果把Scrum、Kanban以及其他敏捷实践去掉一些表层形式,我认为其中最核心的思想主要包括几个方面。

2.1 小步迭代

传统项目经常追求“一次性把事情做完”。

敏捷则更强调:

先做出一个能够运行的版本,再不断完善。

把一个持续一年甚至两年的项目,拆成若干个较短的周期。

每一个周期都不是停留在讨论、设计和计划阶段,而是尽量产生一个可以验证的成果。

这样做的好处是,项目不会在漫长的开发过程中一直处于“看起来什么都没问题”的状态。

真正的问题,会更早暴露。

2.2 快速反馈

敏捷真正重要的其实不是“快”,而是“反馈”。

如果只是加快编码速度,但是方向错了,那么只会更快地做出错误的东西。

敏捷强调让开发人员、产品人员、业务人员和用户之间形成较短的反馈回路:

提出需求 → 开发 → 交付 → 使用 → 获得反馈 → 调整 → 再开发。

这个过程不断循环。

从某种意义上说,敏捷是在不断缩短这个反馈闭环。

反馈周期越短,错误发现得越早,纠错成本通常也越低。

2.3 持续交付价值

传统项目容易形成一种思维:

“项目完成以后才能体现价值。”

于是项目可能经过半年甚至一年,最终才上线。

敏捷则更加关注:

能不能不断交付真正有价值的东西。

一个功能完成了,就可以验证一个功能。

一个业务流程打通了,就可以验证一个业务流程。

一个核心模块完成了,就可以先投入实际使用。

这样项目本身就不再是一个黑箱。

管理层可以看到进度,业务部门可以看到结果,开发人员也可以尽快发现问题。

2.4 拥抱变化

敏捷并不是鼓励“需求随便改”。

真正的意思是:

当变化发生时,不应该简单地认为变化本身就是一种错误。

项目开始时掌握的信息永远有限。

随着项目推进,我们获取的信息越来越多,因此对原有需求产生修正,本身就是一种正常现象。

真正应该管理的,不是“让需求永远不变”,而是:

让需求变化变得可控。

比如,把重要程度不同的需求区分开来,把需求拆解成更小的任务,对新增需求进行优先级排序。

变化依然存在,但是变化不再意味着项目失控。

2.5 强调人与人的协作

敏捷还有一个非常重要的特点,就是强调团队协作。

传统管理往往容易把人理解成组织结构中的岗位:

产品经理负责需求,开发人员负责编码,测试人员负责测试,项目经理负责推动进度。

而敏捷更强调:

最终交付价值的是一个团队,而不是若干个彼此独立的岗位。

一个需求从产生到最终上线,需要很多角色共同参与。

如果产品、开发、测试、业务彼此之间存在巨大的信息壁垒,那么再完善的流程也很难真正提高效率。

因此,敏捷会特别强调沟通、透明和跨职能协作。

3、本质

如果仅仅停留在上述层面,敏捷仍然只是一套项目管理方法。

但我认为,敏捷真正有价值的地方,在于它背后对应着一套更加底层的认识论。

3.1 敏捷的本质是“在不确定性中不断逼近正确答案”

很多管理者喜欢计划。

因为计划能够带来确定感。

今天做到什么,明天做到什么,下个月完成什么,一切都安排得清清楚楚,看上去项目就被管理起来了。

但软件项目最麻烦的地方就在于:

计划可能本身就是错的。

如果前提错了,那么执行得越好,结果反而可能越糟。

因此,敏捷真正改变的是管理逻辑:

传统模式更加关注:

计划 → 执行 → 检查

而敏捷更强调:

假设 → 实践 → 获取反馈 → 修正假设 → 再实践

这其实和科学研究、工程实践、PDCA循环有非常强的相似性。

先提出一个假设,然后通过实际行动获得信息,再根据新的信息调整原来的认识。

所以从更底层来看,敏捷并不是“快一点做项目”,而是:

让组织具备更强的学习能力。

3.2 敏捷本质上也是一种“降低试错成本”的方法

任何复杂系统都不可能一次性获得正确答案。

既然错误无法完全避免,那么真正重要的事情就是:

尽可能早地发现错误,并尽可能低成本地纠正错误。

假设一个需求在项目第一周发现错误,可能只需要修改一个文档。

如果到了第六个月才发现错误,可能已经涉及数据库、接口、前端、测试、部署以及大量业务流程。

两者本质上是同一个错误,但是纠正成本完全不同。

因此,敏捷并不是消灭错误,而是在建立一个机制:

让错误更早暴露,让反馈更加及时,让修正更加便宜。

3.3 敏捷的核心不是“流程”,而是“反馈回路”

站会不是敏捷。

Sprint不是敏捷。

看板也不是敏捷。

甚至Scrum本身也只是实现敏捷思想的一种方法。

如果每天开站会,却没有真正解决问题;

如果每两周做一次Sprint,却没有真正形成产品迭代;

如果任务卡片管理得非常漂亮,但是用户从来没有参与反馈;

那么这些行为只是“敏捷的形式”,并没有形成真正的敏捷。

真正的敏捷,应该看一个团队的反馈回路是否足够短。

从需求出现,到形成产品,再到用户产生反馈,中间经历多长时间?

从发现问题,到完成修复,中间经历多长时间?

从一个错误被发现,到组织真正理解它的原因,中间经历多长时间?

这些问题,比“有没有每天站会”更加重要。

3.4 敏捷实际上是在管理“不确定性”

项目管理经常被理解成:

管进度、管成本、管质量。

但对于复杂的软件项目而言,更底层的问题其实是:

管理不确定性。

我们不知道用户最终想要什么。

不知道政策什么时候变化。

不知道技术方案是否真的可行。

不知道一个系统上线之后会产生什么新的问题。

敏捷所做的事情,就是通过拆分、迭代、反馈、验证等方式,把一个巨大的不确定性问题拆成许多个较小的不确定性问题。

这和一次性押注一个巨大项目相比,风险结构完全不同。

4、实践总结与发展建议

真正参与敏捷项目之后,我越来越感觉到:

敏捷最大的难点,从来不是技术,而是组织。

技术人员一般很容易理解迭代开发。

真正困难的是,当敏捷的方法进入一个层级复杂、部门众多、责任边界清晰的大型组织之后,原有的管理机制会与敏捷产生各种冲突。

4.1 最大的问题不是“不会敏捷”,而是“组织没有准备好”

很多公司引入敏捷之后,会出现一个非常典型的场景:

项目组开始使用Scrum。

每天开站会。

每两周一个Sprint。

系统里也建立了用户故事和任务。

但项目效率并没有明显提高。

原因很简单。

如果需求部门依然层层审批,采购流程依然需要几个月,测试环境申请依然需要走复杂流程,上线依然需要多个部门逐级签字,那么开发团队再敏捷,也无法改变整个系统的速度。

这实际上说明了一个问题:

敏捷不是一个团队的问题,而是一个组织的问题。

一个团队可以做到快速开发,但如果上下游都非常缓慢,那么整个价值链依然缓慢。

4.2 不要为了敏捷而敏捷

这是实践中非常容易出现的问题。

有些企业学习敏捷之后,会大量引入概念:

用户故事、燃尽图、Sprint、Backlog、站会、迭代评审、回顾会议……

然后大家每天忙着维护各种表格和工具。

最后发现:

原来管理工作比开发工作还多。

这就是典型的本末倒置。

工具的存在应该是为了帮助团队减少沟通成本、降低管理成本,而不是增加新的管理负担。

因此,敏捷实践应该遵循一个原则:

能用简单的方法解决的问题,就不要用复杂的方法。

4.3 敏捷并不意味着不要计划

这是我认为最容易被误解的一点。

有人认为敏捷就是“拥抱变化”,所以不用做长期计划。

实际上,恰恰相反。

敏捷仍然需要计划,只不过它不再假设未来所有事情都可以被准确预测。

我们可以制定方向,可以制定阶段目标,可以制定版本计划,可以估算工作量。

但是同时必须承认:

计划只是当前信息条件下的一种假设。

随着新信息出现,我们需要不断修正计划。

所以真正成熟的项目管理,不应该是:

“计划绝对不能变化。”

而应该是:

“计划可以变化,但变化必须有依据、有优先级、有成本意识。”

4.4 敏捷需要与具体行业结合

不同类型的软件项目,敏捷实践的方式也应该不同。

互联网产品可以快速上线、快速试错,所以迭代周期可以非常短。

金融行业则涉及稳定性、安全性、合规性、审计和风险控制,不可能简单复制互联网公司的敏捷方式。

尤其是在证券公司、银行等金融机构中,一些核心系统具有非常强的稳定性要求。

这意味着:

敏捷并不等于降低控制。

真正合理的方式应该是:

在可以快速试错的地方提高速度;

在必须严格控制的地方保持规范;

把“灵活”和“严谨”放在不同层次解决。

例如需求探索可以敏捷,研发过程可以迭代,但是涉及核心数据、生产系统、权限、安全和合规的环节,依然需要严格控制。

所以未来的敏捷发展,不应该是简单照搬某一种标准模型,而应该更加重视:

敏捷与行业特性的结合。

4.5 管理者需要改变对“计划”和“控制”的理解

传统管理中,一个优秀的管理者往往被认为是:

能够准确制定计划,并且让大家按照计划执行的人。

而在高度不确定的软件项目中,管理者还需要具备另一种能力:

能够快速识别变化,并及时调整资源和方向。

这实际上对管理者提出了更高要求。

因为“制定一个计划”并不难。

真正难的是:

当计划与现实发生冲突的时候,能不能承认原来的计划不合理;

当业务部门提出新需求的时候,能不能判断它的重要程度;

当项目延期的时候,能不能找到真正原因,而不是简单要求团队加班;

当一个方案已经被证明不可行的时候,能不能及时停止继续投入。

从这个角度来看,敏捷管理实际上对管理者的要求,比传统项目管理更高。

5、结语

这半年真正参与敏捷项目之后,我越来越觉得,敏捷并不仅仅是一种软件开发方法。

它更像是一种面对复杂世界的方法。

面对未知,我们先提出假设。

面对变化,我们及时调整。

面对错误,我们尽早暴露。

面对结果,我们不断复盘。

面对复杂问题,我们把它拆成可以不断验证的小问题。

从这个角度来看,敏捷与我们之前讨论过的第一性原理、系统论、信息论、实践论乃至PDCA循环之间,其实都有一些内在联系。

一个复杂系统之所以难以管理,往往不是因为我们没有足够强的执行力,而是因为我们掌握的信息不足、反馈太慢、试错成本太高。

因此,真正优秀的管理系统,并不是试图让未来完全按照计划发生,而是要建立一种机制:

即使未来发生变化,系统依然能够及时感知、快速响应,并不断向正确的方向修正。

这或许才是我理解的“敏捷”二字真正的含义。

而对于中国大量的大型企业、国企以及金融机构来说,未来真正值得讨论的,也许已经不是“要不要实行敏捷”,而是:

怎样把敏捷的思想,与现有的组织结构、管理制度、风险控制和行业特点结合起来。

这可能比学习几个Scrum术语,更值得我们认真研究。