《程序员修炼之道:从小工到专家》第三章:基本工具(2)

四、调试

自从14世纪以来,bug(虫子、臭虫)就被用来描述“恐怖的东西”,有趣的是,第一只计算机bug真的是一只虫子,在被要求解释机器为何未按期望运转时,有位技术人员报告说“有一只虫子在系统里”。

遗憾的是,事到如今,在我们的系统里仍然有“bug”,虽然不是会飞的那种。

没有人能写出完美的软件,所以调试肯定要占用大量的时间。接下来让我们看一看调试所涉及的一些问题以及一些用于找出难以捉摸的虫子的一般策略。

调试的心理学

要接受事实:调试就是解决问题,要据此发起进攻。

在技术竞技场上,你应该专注于修正问题,而不是发出指责。

bug是你的过错还是别人的过错,并不是真的很有关系。它仍然是你的问题。

调试的思维方式

最容易欺骗的人是一个人自己。

不要恐慌,尽管时间很紧,要后退一步,实际思考什么可能造成你认为表征了bug的那些症状,一个脑细胞也不要浪费在以“但那绝不可能发生”起头的思路上。

在调试时要小心“近视”,要总是设法找到出问题的根源,而不是问题的特定表现。

从何处开始

在开始查看bug之前,要确保你是在能够成功编译的代码上工作——没有警告。

在设法解决任何问题时,要搜集所有的相关数据。不要把时间浪费在对巧合的调试上,要在观察中做到准确。

你也许需要和报告bug的用户面谈,以搜集比最初给你的数据更多的数据。

人工合成的测试不能足够地演练应用。你必须即强硬的测试边界条件,又测试现实中最终用户的使用模式。你需要系统的进行这样的测试。

测试策略

开始修正bug的最佳途径是让其可再现(比如隔离出bug环境)。

使你的数据可视化

跟踪

把小诊断消息打印到屏幕或文本中

橡皮鸭

找到问题的原因的一种非常简单、却又特别有用的技术是向别人解释它。

消除过程

在大多数项目中,你调试的代码可能是你和你团队的其他成员编写的应用代码、第三方产品、以及平台环境的混合物,bug有可能存在于OS、编译器、或是第三方产品中,大多数的可能是在开发的应用代码中。

要记住,如果你看到马蹄印,要想到马,而不是斑马,OS可能没有问题,数据库也很可能情况良好。

造成惊讶的要素

某样东西出错时,你感到惊讶的程度与你对正在运行的代码的信任及信心成正比。

不要假定,要证明。

调试检查列表

  • 正在报告的问题是底层bug的直接结果,还只是症状?
  • bug真的在编译器里?在OS里?或者是在你的代码中?
  • 如果你向同事详细解释这个问题,你会说什么?
  • 如果可疑代码通过了单元测试,测试是否足够完整?如果你用该数据进行单元测试,会发生什么?
  • 造成这个bug的条件是否存在于系统中其他任何地方?

五、文本操纵

注重实效的程序员用与木匠加工工料相同的方式操纵文本。

学习一种文本操纵语言

文本操纵语言的用处:

  • 数据库schema维护
  • Java属性访问
  • 测试数据生成
  • 写书
  • C与Object Pascal的接口
  • 生成Web文档

六、代码生成器

当木匠面临一再重复制作同一样东西的任务时,他们给自己制造夹具或模板。

与木匠在夹具上投入时间相同,程序员可以构建代码生成器。

编写能编写代码 的代码。

被动代码生成器

  • 创建新的源文件:模板、源码控制、版权说明、注释块
  • 在编程语言之间进行一次性转换
  • 生成查找表及其他在运行时计算很昂贵的资源

主动代码生成器

设计让两种不同的环境一起工作应该考虑主动代码生成器,比如不同编程语言用于同一个应用时。

代码生成不一定要很复杂

代码生成器不一定要生成代码

HTML、XML、纯文本——任何文本都可以。

阅读原文:程序员修炼之道:从小工到专家

学院君

学院君 has written 548 articles

资深PHP工程师,Laravel学院院长