开发杂谈
《故事一》
一个运营系统,因为某种外在原因,急需作出更改,不然,某个流程会跑不下去。开发团队只有一天时间完成这个紧急任务。
由于改动挺大,团队并没有足够时间分析问题,便凭直觉开始弄了。
一天后,功能勉强可用,流程在半自动半手动的方式撑了下去。后续关于这个功能的变更,因为已经是运营中的代码,不是所有人都有魄力和胆量去冒风险作任何大改动,这段代码成为永远的历史,仍然保持着半自动半手动的操作方式。之后维护这段代码的人,遗传了恶名,真的躺着也中箭。
《故事二》
业务员知道竞争对手的系统都拥有这个那个功能,而我们系统是没有的。要让业务员可以有更充足的理由让客户转用我们的系统,我们必须尽快开发出类似这个那个功能。
经过几番努力,开发团队终于开发出类似的功能,但由于新功能刚刚出台,未免有所欠缺。而且功能是参考竞争对手来做的,总觉得有些精髓的东西没有做出来。业务员当然也拉不到一个客户,原因是[功能不好用]。
《故事三》
在一个关于产品的会议中,参与者纷纷表达了产品必须让用户觉得好用易用,输入必须最少化,系统必须智能,信息必须准确,也需要灵活面对不同的情况。
被问到具体操作细节的时候,此等[云层次]的需求又再次被重复了,而且大家都显得不耐烦,认为这么简单的需求,怎么可能要一说再说。
经过一番努力解释后,大伙儿有点明白从细节上开发团队需要知道什么了。但是这些对细节的要求被认为是技术性的内容,直接以:[这些技术性的内容我们不知道的呀,这个需要你们来想]回应来结束。同时会议就被高效地结束了,需求好像也就沟通清楚了。
随后产品交付了第一个迭代,结果当然不符合大家曾经提过的云层次需求了。开会时,火花四射,中枪的也是技术团队,当中关键字是:不应该这样操作的,不明白为什么不早说,这个功能肯定不能是这样子干的。
《故事四》
有一个项目,内容是针对一种特殊类型的订单,引申出不同的新作业功能。由于该项目一直没有达到预期效果,功能做了出来,就是觉得不怎么对劲。当然也没人用,尽管管理层指示要强迫使用。
团队针对此项目准备下一个迭代计划的时候,在会议中,有人问了一个看来是无聊的问题:什么是订单?我们得出一个结论:在系统中,一个订单是针对一个商品的。
此人再问:我们此项目里的所谓[特殊类型的订单],跟以上所说的[订单]有什么不同?
不同点可大了。在这种特殊订单中,商品还没确定,我们客服会针对客户的要求和成本考虑,再选择适当的商品。
既然不同点那么大,就和之前的所谓[订单],有着明显的处理上的差异。勉强用订单功能来扩展支持这种特殊类型的订单,似乎行不通。也难怪项目之前一直不理想。
《思考》
以上故事,如有雷同,实属巧合。
四个故事都有着一个共通点:项目如何落地。犹如在三万八千尺上空跳降落伞下来,能在某个特定地点着落是非常困难的。
需求
需求大致可以分三几个层次:
- 云层
- 天空层(鸟瞰层)
- 地面层
云层需求是最高层的需求,具备战略意义。
天空层需求可以大概看到地面布局,山川河谷,道路网络。
地面层需求巨细无遗,你可以看到虫子在地上如何爬动。
用户体验,永远都是在地面层,好用与否,都在细节,用户体验决定项目的成败。
但是操作细节是否合理,操作是否具备价值,整体如何协调等问题,必须有一个完整布局,而布局需要鸟瞰层来规划。
永远停留在云层,只强调策略,对项目实施完全没有帮助。
落地
西方思维强调4个问题:WHAT,WHY,WHEN,HOW
WHAT(是什么):问这个问题需要勇气,因为貌似很简单很基本的问题没搞懂,在团队中似乎很没有面子,但往往搞清楚基本问题后,会有拨开云雾见晴天的感觉。
什么需要搞清楚?在一个业务领域中,经常出现的名词和动词需要弄清楚。这样做会组成了一套领域专用术语(Domain Specific Language, DSL)。Eric Evans在《领域模型设计》1上提到,领域专用术语应该无处不在,它必须出现在日常工作的对话中,也需要同样出现在代码中。
WHY(为什么)涉及到为什么会有这个项目,项目目标和目的。在经验中,定义这个不是太大问题,每个人都可以说一大堆理由去启动一个项目,尤其是对自身利益相关,故事二是一个经典的例子。
WHEN(什么时候)涉及到执行的先后顺序,在资源有限的前提下,不能什么都要,也不能马上就要。
HOW(怎样做)比较花时间精力,需要经过设计,好与不好的关键就在这里。同样一个购物网站,核心都可能是处理商品、价格、订单。你如何展示你的商品,如何定价,如何处理订单,每一个[如何]都可以是一个专业,都需要累积经验来设计好。
大多数项目中遇到的困难,都出在 WHAT 和 HOW 两个问题上没有搞清楚。项目要顺利执行,起码需要在鸟瞰层中搞清楚这两个问题。而且这两个问题也同样需要和项目一起迭代更新,不断审视,不断优化,来驱动整个项目的变更。