为什么需要提前撰写Spec文档
Joel on Software(中文名叫《Joel软件随想录》)算得上是一本旧书了,但里面的建议和讨论,真的是历久弥新。特别是,Joel是个有趣、牛逼的家伙:前微软Excel的职员、Stack Overflow的创始人、Trello的创始人,以及他和他的boyfriend走入了婚姻殿堂。这本书,是Joel自己blog文章的一个精选集。
Joel在这本书里谈到了很多技术性的观点,高屋建瓴地从思想方法上去讨论如何看待程序、看待公司、看待构建过程。著名的The Joel Test也出自于此。
这本书我很早就知道,但一直没有机会亲自阅读。最近读了几章,便爱不释手。按理说,我应该将这本书读完后再写点评论。可是,它已经如此优秀,让我在这个阶段就想要开始对它做一些介绍和吹捧。
很遗憾,自己读这本书还是晚了些。要是能够在最开始学习技术的时候就读到,想必能少走不少弯路。以我自己的观点来看,要掌握任何一个领域的技术,一个很重要的点就是一定要聆听大师的指导。如果你运气够好在自己身边遇到了一位大神,你可以直接向他请教。而如果没有这样的运气,那自己便需要多花费点功夫,去找大师写的文章和著作阅读,特别是那些关于review和观点的著作。因为,对于一个初学者来讲,刚进入一个领域,他有且只能看到繁复的细节,并不知道该以何种方式在脑海中把这些凌乱的碎片,系统、有条理地在脑海中组织起来。所以,阅读大师的这些综述性的著作,其目的,就是要在脑海中建立正确的看待这个领域的思维框架。
Joel关于Specification文档撰写的讨论,就是一个很好的例子。对大部分不合格的programmer来讲,写文档、写注释是一件无足轻重、讨厌至极的事情。在他们眼中,唯有代码是真正值得关心的东西,因为只有代码才可以让计算机工作啊,而一堆论述性的文档,写出来也无法被运行,那不就是浪费时间吗?!
而对另一群程序员来讲,代码恰恰是最后的、水到渠成的结果性的东西,不是你应该花费大量时间耕作的东西。对他们来讲,如果你能够写出清晰、细致的文档,代码自然就会优质卓越。如同揠苗助长这个故事的寓意,你无法通过把秧苗拔高,来加速秧苗的成长,你能做的,是更好地耕耘、施肥,尽力提供促进植物生长的环境。单纯地把精力花费在代码的细节上,就是在强制性地拔高秧苗,希望通过最直接的方式,来加速你项目的完成。而写文档,则是提前为后面复杂的代码提供良好的生长环境——清晰准确的逻辑。在这样的牢实的基础上,你的项目自然可以快速成长。
大部分做技术的人,会过分地注重勤于动手,而忘记了更重要的一步——先动脑。在他们看来,“开大会、打嘴炮、写文档”,都是一些business上的该死的流程,都是在务虚,不务实。由于已经在脑海中定下“无用”的论调,自然更是没有机会去理解其中的精髓。
“开大会、打嘴炮、写文档”,如果用讽刺的话来讲,就是“纸上谈兵”。可是,还有另一个褒义的描述——沙盘演练。对于任何一个项目来讲,前期的需求确认,是极其重要的。因为它是后续所有流程的根基。流程的更改、方向的变更,如果发生在技术开发的过程中,其损害的成本非常巨大,你不得不调整构架、重新组织甚至删除你已投入大量精力的工作。而如果这个事情发生在似乎不怎么有用的“开大会、打嘴炮、写文档”呢?那无非就是多耗费一点口水,重新写一行文字罢了。
撰写spec文档,就好比是画家最开始在画板上勾勒的辅助线。粗糙的一横、一竖,潦草的正方形框、椭圆形脑袋,不一而足。而如果你去观察刚学画的小朋友,大多有一个共同特征:几乎无法经受住描绘细节的诱惑,一开始就精细地刻画眼睛、嘴巴、肌肉的纹路。而最后的结果也是理所当然的四不像,错位、扭曲、畸形的五官与大小各异的四肢组合。通常,老师会花费大量的时间去纠正初学者这种从局部出发的坏习惯,让他们逐渐适应、掌握从整体的框架出发,再逐步深入细节的技巧。
写代码和写文档的关系,就是这样精致描绘细节和简单勾勒草图的关系。
当你所写的项目稍微多涉及几个现实的事务,其业务逻辑就不会如你现象中的那样简单。例如写一个用户登录的输入框,乍一看,似乎没什么精细复杂的地方,于是大摇大摆地动手写起代码来。行至途中,通常会发现各种小问题,前面忘记一个验证数据,后面忘记一个记录cookie,搞得自己狼狈不堪。可如果你肯多花费一点时间,将spec文档写好,把每一个流程图、状态图庙会清楚,就等于是为后面的代码撰写提前做了一次沙盘演练,能让你成竹在胸。
而另一方面,软件开发是协作性的事物,仅仅是团队工作中的一个环节。你对代码的理解,往往只是代表你自己的个人意见,难保与你合作的产品经理、老板、其他部门会有不同看法。难道要把整个项目都写完,才去征求他们的意见吗?!
这就是提前撰写spec文档的另一个好处:你可以在写代码之前,就把流程理解记录下来,让项目相关人士提前审阅,从而以最小的成本,提前修正方向性的争论和问题。
近期回顾
《叫兽的逻辑 | #Metoo》
《不会谈》
《编程语言吐槽之Java与C》
如果你喜欢我的文章或分享,请长按下面的二维码关注我的微信公众号,谢谢!
更多信息交流和观点分享,可加入知识星球:
VIP赞赏专区:
为什么需要提前撰写Spec文档的更多相关文章
- 使用 VS Code 撰写 Markdown 文档
众所周知, VS Code 是微软和社区一起开发的一款很优秀的高级代码编辑器.它不仅可以写出一手好代码,还能写出一篇好文章.利用 Markdown 就可以写出一篇排版美观的技术文章了. 而 Markd ...
- 产品需求文档(PRD)的写作方法之笔记一
1.写前准备(思维导图): http://www.woshipm.com/?p=80070 1.在写之前,请先很区分清楚什么是MRD文档(市场需求文档),BRD文档(商业需求文档),什么是PRD文档( ...
- [转]产品需求文档(PRD)的写作
产品需求对产品研发而言非常重要,写不好需求,后面的一切工作流程与活动都会受到影响.转载一篇文章,关于产品需求文档写作方面的,如下: 本文摘自(一个挺棒的医学方面专家):http://www.cnblo ...
- 产品需求文档(PRD)的写作 【转】
产品需求文档(PRD)的写作 一.文章的摘要介绍 无论我们做什么事都讲究方式方法,写产品需求文档(以下称PRD文档)也是如此,之前我通过四篇文章分享了自己写PRD文档的一些方法,而这一篇文章主要是 ...
- Laravel框架内实现api文档:markdown转为html
前后端分离的工作模式于今是非常流行了,前后端工作的对接,就离开不了API文档的辅助. 根据自己以往的工作经历,以及了解的一些资讯,API文档的建立,无非以下几种方式: 1. word文档模板 2. 第 ...
- es之文档更新过程中并发冲突问题
1:乐观锁控制 ES是分布式的,也是异步并发的,我们的复制请求是并行发送的:这就意味着请求到达目的地的顺序是不可控制的,是乱序的: 如果是乱序的方式,很有可能出现这样的一个问题,新version的文档 ...
- 文档驱动开发模式在 AIMS 中的应用与实践
摘要:程序员常会说:我最讨厌别人写的代码没有文档,我也最讨厌自己需要写文档. 有一个很老的梗: 我最讨厌别人写的代码没有文档,我也最讨厌自己需要写文档. 有这种想法的程序员应该算是一个老鸟了,对于大多 ...
- 有了Swagger2,再也不用为写Api文档头疼了
1.为什么要写Api文档 现在,前后端分离的开发模式已经非常流行,后端开发工程师只负责完成后端接口,前端页面的开发和渲染完全由前端工程师完成. 问题来了,前端工程师怎么知道后端接口的具体定义呢?答案是 ...
- 如何写Markdown格式文档
Markdown Markdown是一种轻量级标记语言,创始人为约翰·格鲁伯.它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档.这种语言吸收了很多在电子邮件中 ...
随机推荐
- Left Join B表,只取B表一条记录
--用OUTER APPLY select b.* FROM a表 a OUTER APPLY () * from b表 WHERE [Name] = a.[AName] ORDER BY BNo d ...
- jmeter导入DB数据再优化
由于同一个迭代中每天都在执行.之前设计的思路是同个迭代只执行一次插入DB操作!! 因而没有在插入数据前没有做版本.产品类型.页面类型.接口名.接口名是否相等判断操作. 因此,若是这些条件相等,数据不是 ...
- java 爬坑记-@WebServlet异步 不支持@Autowired
上篇文章解决了500那个错误, 程序能接受到request ,进行到调用service 服务时,提示线程空指针异常, 检查发现 //@Autowired //OpHistoryService ophi ...
- vuex状态管理
msvue组件间通信时,若需要改变多组件间共用状态的值.通过简单的组件间传值就会遇到问题.如:子组件只能接收但改变不了父组件的值.由此,vuex的出现就是用作各组件间的状态管理. 简单实例:vuex的 ...
- MongoDB的Replica Set以及Auth的配置
http://blog.0x01.site/2017/01/13/MongoDB%E7%9A%84Replica-Set%E4%BB%A5%E5%8F%8AAuth%E7%9A%84%E9%85%8D ...
- echart 图例
说明:stack相同,两个bar合并但是不会重叠 如果需要重叠 用barGap: '-100%', 根据不同的需求来使用两者. <template> <div> echart ...
- Oracle启动和停止
概述 只有具备sysdba和sysoper系统特权的用户才能启动和关闭数据库. 在启动数据库之前应该启动监听程序,否则就不能利用命令方式来管理数据库,包括启动和关闭数据库. 虽然数据库正常运行,但如果 ...
- 手绘raft算法
手绘raft算法 互联网技术窝 2019-04-07 12:06:05 在现实的分布式系统中,不能可能保证集群中的每一台机器都是100%可用可靠的,集群中的任何机器都可能发生宕机.网络连接等问题导致集 ...
- jieba库词频统计
一.jieba 库简介 (1) jieba 库的分词原理是利用一个中文词库,将待分词的内容与分词词库进行比对,通过图结构和动态规划方法找到最大概率的词组:除此之外,jieba 库还提供了增加自定义中文 ...
- java Quartz任务调度器
1.quarz对java1.5实现的简单调度做了封装 /** * quartz对任务调度进了高度抽象: 1调度器:2任务:3触发器 * Job接口(任务):定义需要调度的任务 ...