工作的头两三年,养成了一个习惯,对于稍微复杂的开发,都会不自觉地喜欢在纸上画流程图,画类图。

这两年才发现,这种方法的运用能力是高效能开发人员与普通开发人员的一个重要区分。2013年偶然的机会认识乔梁,才知道这种方法叫Onboard Design。Onboard Design可以大大提高效率,遗憾的是大部分的工程师工作多年后才会意识到这种方法的存在。

这种方法,很多经验丰富的工程师、产品经理都在有意识,无意识地使用。

如何做Onboard design?

总结一下个人对onboard design的推荐做法。 清楚需求和目标后,找一个安静的地方,给自己5-15分钟时间。

1.到打印机旁拿一摞白纸,准备好笔。

2.取3-4张,平铺在桌子上,然后对着几张白纸画图, 一张画类图,一张画流程图/序列图,一张写出来要做的需求(TODO List,或者说要考虑的问题)。类图,流程图/序列图两张图,一个TODO List列表,可以根据实际情况确定做3件事中的1-3件。稍微复杂的工作至少要有类图和流程图中的一个图。需求/TODOs/要考虑的问题列表在简单的需求情况下可以忽略。

画出设计初稿后,对着问题列表/要解决的问题,todo list,考虑是否解决了各种要解决的问题,是否会带来新的问题,有哪些风险,接口是否合理,模块是否方便测试。

过程中常常会发现最开始的设计不合理,就会扔掉最初的草稿,换几张纸重新再画。 流程图就是最后要写的代码驱动图,比如说是main函数,或者service的处理过程,或者一段逻辑从输入到最终输出的过程。

设计比较复杂的情况下,可以再加纸张,最后的效果是桌面铺满一堆白纸,脑中有完整的图画,胸中心有成足。

3.这时候到白板上把最终的设计画出来,把团队成员拉到白板前面一起花3-5分钟review和讨论设计。团队会有反馈,根据反馈再审视和调整设计。(如果是个人开发,这一步可以直接省略)

4.这时候留下终稿,你就可以写代码了,可以写得飞快,经过多次训练会越来越快。

为什么onboard design有效?

看起来很简单的方法,但是却非常有效。 因为

1.纸上画速度最快,不需要去考虑用哪种UML工具,也不需要去切换鼠标,键盘,不需要去点击保存。

2.修改非常方便,可以有多份草稿,不断在纸上重构

3.几张白纸平铺,能够对全局和细节,需求和待办事项都一览无余,不需要翻页,点击,查找来看其他内容。

4.用几张固定的图,帮助自己理清思路,也方便团队沟通。类图,流程/序列图,TODO List/要考虑的问题和需求列表,几个方面固定的讨论,会逐渐形成团队内部的沟通语言。

5.有没有这样的经历? 当你在写代码的过程中,突然被别人打断的时候,然后死活也想不起刚才工作到哪里了,要同时把哪些东西装入内存中。另外的场景是写了一半的代码,过了几天再回想,也是需要很长时间接上之前的思路。 有了onboard design就能够很快接上(onboard design让我们的大脑支持断点续传, 让我们的思维也可以有continuation)。

白纸也好,白板也好,都是让我们的思维可视化,逼迫自己更全局,更深入,更早地考虑问题,更加清晰地理解和解决问题。

其他

如何在onboard design的过程中提高团队的设计能力?

可以让几个团队成员同时做设计,每个人都做一份,最后都拿出来一起review。这样有比较,有思考,团队更容易看到其他不一样的思考方式,能够很快成长。

设计的过程,写代码的过程中有觉得需要调整设计的地方,毫不犹豫把设计改掉。 好的设计是不断演进出来的。一开始的设计,往往在我们考虑越来越充分的时候,会被调整得面目全非。

如何把onboard design做得更快,更充分? 通过不断的onboard design练习去提高设计能力,onboard design就会越做越快,设计地更加充分。

为什么onboard design要有时限?(建议通常的开发用5-15分钟的时限,大型的系统可以有更长的时间) 时间越长,就有更大的概率考虑哪些不需要的功能特性。时间越短,就越容易抓住重点,把精力放在解决主要问题上。

不停地问题自己,要解决的核心问题是什么?如何解决这个核心问题?有哪些是跟核心问题不相关地设计?不相关地要全部丢掉。