在砌上一块砖或钉下一支钉子之前,建筑设计师会制定好详细的计划。程序员或者软件工程师却不会。这难道就是房子很少塌倒而程序经常会崩溃的原因?

  蓝图保证建筑设计师的设计的建筑按规划建成。“建成”不仅仅意味不会塌倒,还意味达到业主要求的功能。建筑设计师和他们的客户在着手建造之前,通过蓝图来沟通,以理解他们将要建造成的建筑的样子。

  但是很少有程序员在编码之前,会勾画哪怕是简单的草图来说明他们的程序将是会怎么样子。

  大多数程序员认为做任何不产生代码的事情都是浪费时间。思考并不会产生代码,没有想好就开始编码,那只会产生出糟糕代码。我们应该理解这些代码到底要实现哪些功能。理解需要思考,而思考很难。借用一句漫画家迪克·圭尼登的话:

  写作是一种让你知道你想法有多伤感的本能方法

  蓝图让我们想清楚我们打算要建造的建筑。在写下一段代码之前,我们应该先写蓝图。软件的蓝图称为技术说明书。

  已经有太多的借口说撰写技术说明书只是浪费时间。比如:技术说明书毫无用处,我们不能通过它来产生代码。这就好像说建筑设计师应该不要画蓝图,因为他们最终还是需要承包商去建造房子。另外一个反对撰写技术说明书的争论也能够用蓝图的例子来反驳。

  还有一些程序员争辩说,把蓝图和技术说明书作比较是无用功,毕竟程序不是建筑物。他们认为推倒一堵墙要比改变代码难多了,所以程序的蓝图不是必须的。

  错!改变代码也很难,特别是如果我们不想让程序有缺陷的话。

  我最近需要修改一些不是我写的代码,从而给程序增加一个小小的功能。要完成它需要理解一个接口。我花一整天用调试器来研究该接口到底是干什么的——这种事读读技术说明书只要5分钟就能搞定。为了避免导入缺陷,我不得不弄清楚我每次修改之后的结果。因为没有技术说明书,这个事情变得更加困难。我必须要阅读上千行代码,我花了数天来琢磨怎样才能修改尽可能少的代码。最后,我花了一周,新增、修改了180行代码。这可仅仅是这个程序的一个很小的变更啊。

  修改代码只是一项大任务中小小的一块工作,大多数代码已经是我十几年之前写的了。尽管我几乎不记得这些代码是干嘛的,要修改它还是挺容易的——通过阅读我写的技术说明书,很容易就能找到我要修改的地方。尽管这些修改工作量不少,而且还影响到其它代码,我还是能很快搞定它。

  我所说的技术说明书到底是什么?通常它被认为是以正式的技术语言写就的东西。但是撰写正式的技术说明只需要偶尔为之,如果我们仅仅是盖个工具棚的话,就不需要画摩天大楼所要求的那种蓝图。对于大多数软件来说,我们不需要正式的技术说明书。然而就算是写小程序也不能不写技术说明,否则就像没做任何计划就要盖工具棚一样。

  这些日子,我写的程序往往只是小房子级别,不是摩天大楼级的。通常我会写下每个算法的实现方式,大多数算法很简单,可能只需要一两句话就能写清楚。有时写清楚一个算法到底是怎么起作用的需要好好构思,并且可能得花上一段话或者几页纸才能写清楚。我有一个简单的原则:技术说明书应该写清楚该算法的使用者需要知道的每一件事情。在代码写好、编译好之后,估计没有人会再去阅读它了。

  一旦我弄明白了一段代码的目的所在,写代码的工作就容易了。但有些代码并不是这样,它们要求很复杂的算法。想让一个算法运作起来需要精心构思,这就需要有技术说明书了。

  我写的大多数技术说明书都是非正式的。偶尔一段代码很精妙,也很关键,这就需要正式地写。要保证准确性,甚至要使用编写工具仔细检查。这种正式的事情过去十几年只是有那么十几次罢了。

  对于复杂系统的设计师,一份正式的技术说明书是必须的,就好像摩天大楼的蓝图一样。但很少有工程师会撰写技术说明书,因为他们根本没有时间去学如何做好这件事,而且学校里也不教。一些学校会讲授技术说明书用语,但是很少教怎么在实际工作中应用。如果你连一个工具棚的蓝图都不会画的话,怎么能会画摩天大楼的蓝图?

  要学会撰写技术说明书,需要实践。没有简单的规则能保证你写出一份好的技术说明书。不过一个应该避免的事情就是不要用代码。通过代码去理解代码是一个糟糕事情。建筑设计师不会用砖来制作蓝图。

  理解一件复杂的事情的关键是抽象,这意味着技术说明比代码要高一个层次。最简单最准确的语言是数学,初等数学就教过这些了:集合、函数和简单的逻辑。不过,大多数正式的技术说明书使用的语言不在初等数学班里,比如:类型。然而,越是远离简单数学的语言,越会妨碍我们去理解一个复杂的程序或系统。

  无论是为复杂系统使用正式的技术说明书还是简单代码的非正式的技术说明书,撰写技术说明书都会提升我们代码的质量。它有助于我们理解我们正在做的事情并减少出错。当然,即使撰写技术说明书也不保证你的程序就不会崩溃。我们依然要使用已有的其它方法和工具来减少代码缺陷。

  思考不会保证我们不会犯错误。但是不思考肯定会犯错误。

  本文作者莱斯利.兰伯特是计算机科学家,擅长分布式系统、时态逻辑和并行算法。他是工程和国家科学院国家科学院成员。兰伯特在麻省理工学院攻读数学本科,在布兰迪斯大学赢得了他的硕士和博士学位。他为微软研究所工作。

转载于:https://www.cnblogs.com/jizonghai/archive/2013/02/20/2918978.html

为什么我们应该像盖房子那样写程序?相关推荐

  1. 今儿直白的用盖房子为例,给你讲讲Java建造者模式

    本文分享自华为云社区<[Java设计模式]用盖房子案例讲解建造者模式(生成器模式)>,作者: 我是一棵卷心菜 . 现在我们需要建房子,过程为打桩.砌墙.封顶.房子有各种各样的,比如普通房, ...

  2. c语言三只小猪 程序框图,语言教案:三只小猪盖房子

    三只小猪盖房子_300字从前有三只小猪,它们各在一片空地上盖房子.第一只小猪盖的是草房,第二只小猪盖的是木房,第三只小猪盖的是砖房.有一天,大灰狼来了,大灰狼来到三只小猪门前说:"小猪们,你 ...

  3. matlab可以建一个房子吗,做分析师=盖房子

    常有学员问,如何才能成为一名分析师?为此我写了一些日志,比如如何用EXCEL做数据处理.如何用SPSS做对应分析等等,但总感觉这些是管中窥豹,只见一斑.如何才能全面回答这个问题呢?今天玩盖房子游戏时, ...

  4. JS小游戏 - 盖房子

    写这个JS,源于CSDN上看到的一道思考题,挺有趣的一个算法,于是根据规则写了这个JS. < html > < head >      < title > JS小游 ...

  5. 一个计算机爱好者的不完整回忆(三十二)盖房子的思考

    08年左右,老丈人要在农村的老院子里面盖房子,我们这些儿女只要没事就去帮忙--实际上那段时间我大部分时间都是请假去帮忙干活的.妻曾经跟我说过,老丈人很惊讶于我的表现,多次在背后夸我,大概就是我对很多建 ...

  6. 未来,机器人帮你盖房子

    近年,智能机器人应用日趋广泛和深入.种种迹象表明,"机器人革命"已经来临,人类社会正加速进入一个高度自动化的新时代. 去年9月,碧桂园宣布正式进军机器人领域,重点攻关建筑机器人.服 ...

  7. 通过细胞自动机,AI在「我的世界」学会了盖房子

    子豪 发自 凹非寺 量子位 报道 | 公众号 QbitAI 了解游戏「我的世界(MineCraft)」的读者,一定很熟悉这样的画面. △图源:Science Magazine 但是,如果盖房子的不是人 ...

  8. vijos 1057 盖房子 dp 最大子正方形

    P1057盖房子 未递交 标签:[显示标签] 描述 永恒の灵魂最近得到了面积为n*m的一大块土地(高兴ING^_^),他想在这块土地上建造一所房子,这个房子必须是正方形的. 但是,这块土地并非十全十美 ...

  9. 【百练】护林员盖房子

    护林员盖房子 百练 2019信科研究生上机测试 A 总时间限制: 1000ms 内存限制: 65536kB 描述 在一片保护林中,护林员想要盖一座房子来居住,但他不能砍伐任何树木.  现在请你帮他计算 ...

  10. 算法练习 护林员盖房子

    声明:没有OJ能跑,代码仅供思路参考,如有疑问,欢迎一起讨论 题目来源:百练2019信科研究生上机测试 题目:A:护林员盖房子 总时间限制: 1000ms 内存限制: 65536kB 描述 在一片保护 ...

最新文章

  1. Quixel megascans模型材质贴图合集包
  2. substr()函数——mysql:截取字符串子串
  3. mysql创建文章表_创建表--文章表article
  4. 四万字让你精通SQL数据库操作
  5. tomcat集群的failover机制
  6. 计算机考研单科成绩要求,考研单科分数是多少
  7. python流星雨代码_用python一起来看流星雨
  8. 实现栈的基本操作(c语言)
  9. 小白也能通俗易懂的Mac环境变量配置教程
  10. 用python实现模拟轮盘抽奖游戏
  11. java课程设计体会_javaweb课程设计心得体会.doc
  12. 2015-4-11 美术馆 红楼 景山 香山 西单
  13. AcWing 95. 费解的开关(推理)
  14. 多线程练习(龟兔赛跑)
  15. 使用NLTK对英文文章分句,避免缩略词标点符号干扰
  16. MySQL - 查询数据库里所有表名和字段名
  17. 全触屏智能之战 三星i908E对比iPhone 3G
  18. 是CEE、DCB、DCE还是EEDC?
  19. Java工具类库Hutool,GitHub星标15k+
  20. 波恩大学癫痫脑电和波士顿儿童医院脑电信号数据集下载

热门文章

  1. Linux--进程组 作业 会话 守护(精灵)进程
  2. Exchange Server 2013系列十二:邮箱的基本管理
  3. vs 中代码的字体也颜色设置
  4. 你不能忽视的HTML语言
  5. 版本控制工具——subversion
  6. js高级学习笔记(b站尚硅谷)-6-IIFE
  7. 融云server sdk java_开源项目索引
  8. python自动发帖源码_Python3实现的 自动发帖小工具 -电脑资料
  9. 中比较两个时间的月份差值_测量血压时,一天中什么时间测比较准?控制血压又有哪些好方式?...
  10. 二叉树的高度_完全二叉树的子节点数