如何制定软件项目规划

《礼记·中庸》里面提到:“凡事豫则立,不豫则废

言前定则不跲,事前定则不困,行前定则不疚,道前定则不穷。”

意思是要想成功,得提前做准备。


《孙子兵法》中提到:“上兵伐谋,其次伐交,其次伐兵,其下攻城”。

最好的用兵策略是以谋略胜敌,其次是以外交手段胜敌,

再其次是通过交兵胜敌,最下等的是攻城。


《寤言二·迁都建藩议》:“不谋万世者,不足谋一时;不谋全局者,不足谋一域”。

不能长远地考虑问题的人,眼前的问题他也看不到;

不能全面地把握局势的人,在细节上他也处理不好。


以上是古人传承给我们的智慧,教会我们 “不打无准备之仗”。

1. 软件开发过程

软件开发方法 经历过多次变革,

例如,70 年代的 “结构化编程”,90 年代的 “敏捷开发”,

再到后来的 “精益开发”,以及 “DevOps” 等等。


人们提出过各种各样的模型,“瀑布模型”、“螺旋模型” 等,

但不论什么样的方法、模型,都是为目的服务的。


  • 消除软件开发过程中的不确定性,尽早暴露风险

  • 提高全流程的效率,降低软件开发成本

  • 形成行业标准,最终实现量产


在七八十年代,在软件开发实践中,人们大量借鉴了工业化生产中的概念,

把软件开发过程划分成不同的工序

按照 计划、分析、设计、编码、测试、维护 6 个步骤进行管理。


工序之间相互衔接,按照固定的次序逐级下落,称之为 “瀑布模型”。

这在当时是先进的理念,进行了关注点的分离,有效促进了分工合作


但后来人们发现,软件开发更像是一种 “知识生产活动”,

有别于工业生产的 “体力活动”。

软件开发过程中最难管理的是人们大脑中的 “抽象概念”。


于是人们向 “知识管理” 中借鉴了很多方法,

  • 迭代:以最小原型为基础,不断的打磨精进

  • 拆分:从不确定的工作中,拆分出确定的部分

  • 阶段:制定里程碑,对较长的时间段进行划分


此外,从 “社会” 和 “心理” 活动中也借鉴了很多,

  • 预期:预期与现实之间的落差,定义了问题

  • 利益:软件项目的进展,受参与者的利益关系影响

  • 沟通:系统架构取决于组织的沟通结构


总之,人们对软件开发过程的管理,还在不断的发展中,越来越先进。

使得我们可以用最低的成本得到最大的价值,帮助组织获得利润。

在这种大环境下,我想谈一下 “制定软件项目规划” 的方法论。

2. 消除不确定性

虽然很多人意识到了 “规划” 的重要性,但依然很难做好规划。

这是因为人们过往大部分工作和学习过程,都建立在 “确定的任务” 之上。

当面向不确定的工作任务时,就容易乱了阵脚。


  • 目标不确定:在很多情况下,我们做什么都行,都有用都有价值

  • 资源不确定:没做之前谁也不知道花多久才能做完,也不知道需要多少人

  • 进度不确定:什么时候做成什么样,很难说清楚


除此之外,甚至还会有 “外部不确定性”,外部市场一直在发生变化,这里先不谈。

但不论如何,制定规划首先要考虑的问题是,如何消除不确定性

(1) 目标不确定

做好一个项目,最关键的因素就是确定目标了,如果连项目目标都不能确定,

这就是一个注定要失败的项目。


但项目目标的确定,又不能通过 “拍脑袋” 的方式 “猜” 出来。

它需要一些套路,来把目标从错综复杂的外部环境中 “选择” 出来。


  • 收集问题:最好采用问题驱动的方式来立项,而不是采用想法驱动的方式

  • 对齐预期:分析项目的影响人群,找到大家的共赢点

  • 确立定位:找出自己的优势,确定做什么不做什么

  • 验证假设:与用户保持沟通,不断修正自己的假设


项目的目标是做出一个:

满足大家预期的、以用户为中心的、能解决问题的、合理定位的产品。

(2) 资源不确定

一个现实中问题的解法,很难在事先完全确定下来,确定了也就做完了。

所以我们要做的是尽量识别出 不确定事情 中的 “可确定” 部分。


  • 任务拆分:把确定的部分拆出来,把不确定的部分继续拆分

  • 里程碑计划:通过短平快的节奏,用实践频繁探索


在前期调研的时候,我们应该肯花足够多的精力去做这些事情。

一个可能需要一个月才能完成的工作,甚至需要花费两三天时间来调研。


很多项目在开始的时候,就处于一个不确定的泥沼中了,

大多数情况是,很多开发人员不知道在调研阶段应该做什么。

(3) 进度不确定

进度不确定是最难把控的,因为没人有那么强的预言能力。

但我们总能做到,尽早的把进度风险暴露出来。


这是因为项目资源的持续投入,并不是开发者说了算的。

它更多的是取决于项目团队的外部因素

及早的暴露进度风险,可以在更高层面,进行跨项目资源调整。


  • 风险管理:尽早的向外暴露风险,提高项目的可见性

  • 流程管理:识别整条链路中最缓慢的、停顿卡住的环节,疏通优化


在项目团队内部,应该努力消除一个个卡点,让价值流速始终处于高水平。

但不论是风险管理还是流程管理,从管理者角度来推进会更快一些。


进度出现问题的项目,常常是对外孤立无援,对内互相绊脚。

3. 项目规划细节

那么一个好的项目规划应该包含哪几个方面呢?我认为有以下 4 个维度,

  • 蓝图:做什么事情、定位、跟其他事情的关系、包含哪几块

  • 价值:短期价值、长远价值、竞品

  • 进度:里程碑事件、验收节点、降级方案

  • 资源:需要哪些人哪些团队配合、具备什么前提条件

(1) 蓝图

蓝图就是大家的愿景和目标,这个目标越早达成一致越好

它不需要告诉我们演化路径,但它必须是美好的。

与现存事物之间进行配合,能形成一块完整的版图


需要考虑我们要做哪几件事情,边界怎么划分,与其他事情的关系如何。

需要考虑我们不做什么,我们的定位。

(2) 价值

价值包括眼前的事情,还有长期的重要但不紧急的事情。

能解燃眉之急,能创造高杠杆率的回报,这就是一件值得做的事情。


事情不是本身就具有价值的,需要我们主动赋予意义。

这是因为价值是通过累积出来的,而不是识别出来的。

在一个领域不断深耕,并持续的解决问题,事情的价值取决于发起者的付出。

(3) 进度

我们需要制定一个时间维度的阶段性验收计划,不能做一揽子买卖。

这不仅仅是给外部相关者以信心,更是对进展程度的衡量和把控。


如果某个时间节点,不像想象中的那样发展,就给了我们修改的机会。

这是反馈机制在时间维度的一种应用。

拿到反馈之后我们可以及时止损,并调整战略战术。

(4) 资源

资源是我们可以利用的外部条件,一般而言资源是很难充沛的。

所以我们需要跟外部协调 达成目标所需要最少资源。

以及现有的资源条件下,目标可以达成到什么程度。


资源协调的过程,其实是内外部事情的优先级达成一致的过程。

资源总是流向优先级更高的事情中。

结语

本文从 软件开发过程 中的 消除不确定性 出发,

分析了制定项目规划时,要考虑到 4 个方面:蓝图、价值、进度、资源


一个好的项目规划,需要前期进行缜密的系统思考和调研,

需要在执行过程中不断的观察和反馈,才能拿到一个看似平平无奇的结果。


规划所能发挥的价值,并不是立竿见影的,

但是有没有一个清晰的规划,却又是显而易见的。

不论是项目参与者,还是管理者,清晰的规划能增强人们对项目的把控力。


因上努力,果上随缘。