[书评] Debugging: 9 Indispensable Rules – 调试九法

  • 崭新磁盘为何用过一次就不好使?
  • 为何屏幕上的所有文本突然不见?
  • 为何 QA 总能搞出乱码问题但开发就是测不出来?

调试(Debug)可能是计算机工程中最被忽视的领域——算法,语言和架构的书籍一抓一大把,但有关调试的书籍几乎没有——你可以在 Code Complete,The Practice of Programming,Writing Solid Code 这些上古程序设计实践书籍中找到一些调试有关的内容。但讲调试的书籍,我只知道 调试九法(英文书名 Debugging: 9 Indispensable Rules 以下简称 D9)这一本。

仔细想想,这并不合理——调试应该是软件工程中最耗时的过程,为啥没人写这方面的书呢?我觉得:

  1. 调试是一线开发技能,但书籍作者往往可能已经远离一线开发,早就忘了咋调试
  2. 调试属于脏活累活,既没有算法那么科学向,也没有架构高大上

D9 应该是唯一一本讲调试的书——它通过各种案例(五花八门,既有软件又有硬件,还有吸尘器热水器)讲述九个调试基本规则:

  1. 理解系统
  2. 制造失败
  3. 不要想,而要看
  4. 分而治之
  5. 一次只改一个地方
  6. 保持审计跟踪
  7. 检查插头
  8. 获得全新观点
  9. 如果不修复 bug,它将依然存在

以上九条规则看起来平平无奇,但经过八年实践(我在工作之前就已经读过 D9),我可以确定:所有我见过的大神都在践行这九条规则,同时,所有我见过的菜鸡都在违背这些规则。

如果查找一个bug花费了大量时间,那么原因可能是忽略了某个最基本的、最重要的规则,一旦应用了那条规则,很快就会找到问题。
擅于快速调试的人已经深刻理解并应用了这些规则,而那些很难理解或使用这些规则的人则很难找到bug。


继续阅读[书评] Debugging: 9 Indispensable Rules – 调试九法

我们能从一本 45 年历史的计算机书中学到什么

人月神话 —— 1999 年图灵奖获得者 Fred Brooks 作于 1975 年,到现在已经快半个世纪。

计算机行业的发展速度不必赘言,

这本上个世纪的书还有用吗?

有用。


第一次见到 人月神话,是在 2007 年,大连奥林匹克电子广场地下二层鹿鸣书店。

鹿鸣书店专门卖计算机/电子科技书籍,所以我当时一度以为 人月神话 摆错了地方,因为它的书名非常像武侠言情小说,比如古龙的新月传奇,或是张国荣的星月童话。

第二次见到 人月神话,是在 2010 年,当时刚刚考完研,打算把计算机经典书籍过一遍,在所有的推荐书单我都发现了这本书。

看来这本书不是武侠言情小说。


第一次阅读,过程十分痛苦:一部分,源自于这本书故作聪明但并不达意的翻译(比如把 Second System Effect 翻译成 画蛇添足 ),另一部分,源自于这本书面向项目经理和有经验的工程师,我一个在校学生,能读出个屁来。

第一遍读完我只记住了书中那句略显逗逼的话:

无论多少个母亲,孕育一个生命都需要十个月。

之后每次别人催我做什么,我都会用这句话顶回去。

所以这本书并不是给在校学生看的,甚至不是给刚入行的看的,要读懂它没个几年经验是不行的。

要是你还在读大学,有人推荐你看人月神话,那个人一定是个大忽悠,或是知乎买书刷返利。

继续阅读我们能从一本 45 年历史的计算机书中学到什么

程序员必读书单 1.0 — 六年后的回顾

年更系列(继续保持一年一次的更新频率 o_O)

六年之前,我写了 程序员必读书单 这篇文章,两万五千多字介绍了近 100 本书,覆盖基础理论,编程语言,程序设计等十余个领域。然后从中精选出 30 本书用于入门和提升。

当时写这篇文章的初衷是想写一个不会过时的书单。书单写于 2015,现在 2021,是否还适用呢?

必读书单

先放下 2015 年的书单:

入门书籍

程序设计:

  1. 基础理论 : 编码:隐匿在计算机软硬件背后的语言
  2. 编程语言 :
    • C : C 和指针
    • C++ : C++ 程序设计原理与实践
    • Java : Java 核心技术(第9版)
    • C# : 精通 C#(第6版)
    • JavaScript : JavaScript DOM编程艺术(第2版)
    • Python : Python 基础教程(第二版)
  3. 编程语言理论 : 编程语言实现模式
  4. 程序设计 : 程序设计方法
  5. 算法与数据结构 : 算法(第4版)
  6. 程序调试 : 调试九法——软硬件错误的排查之道

软件开发:

  1. 编程实践 : 程序设计实践
  2. 面向对象程序设计 : Head First设计模式
  3. 重构 : 重构
  4. 软件测试 : How to Break Software
  5. 项目管理 : 极客与团队
  6. 专业开发 : 程序员修炼之道:从小工到专家
  7. 大师之言 : 奇思妙想:15 位计算机天才及其重大发现
  8. 界面设计 : 写给大家看的设计书
  9. 交互设计 : 通用设计法则
继续阅读程序员必读书单 1.0 — 六年后的回顾

程序员必读书单 1.0

本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及延伸阅读。旨在成为最好最全面的程序员必读书单。

前言

Reading makes a full man; conference a ready man; and writing an exact man.

Francis Bacon

优秀的程序员应该具备两方面能力:

  • 良好的 程序设计 能力:
    • 掌握常用的数据结构和算法(例如链表,栈,堆,队列,排序和散列);
    • 理解计算机科学的核心概念(例如计算机系统结构、操作系统、编译原理和计算机网络);
    • 熟悉至少两门以上编程语言(例如 C++,Java,C#,和 Python);
  • 专业的 软件开发 素养:
    • 具备良好的编程实践,能够编写可测试(Testable),可扩展(Extensible),可维护(Maintainable)的代码;
    • 把握客户需求,按时交付客户所需要的软件产品;
    • 理解现代软件开发过程中的核心概念(例如面向对象程序设计,测试驱动开发,持续集成,和持续交付等等)。

和其它能力一样, 程序设计 能力和 软件开发 素养源自项目经验和书本知识。项目经验因人而异(来自不同领域的程序员,项目差异会很大);但书本知识是相通的——尤其是经典图书,它们都能够拓宽程序员的视野,提高程序员的成长速度。

在过去几年的学习和工作中,我阅读了大量的程序设计/软件开发书籍。随着阅读量的增长,我意识到:

  • 经典书籍需要不断被重读——每一次重读都会有新的体会;
  • 书籍并非读的越多越好——大多数书籍只是经典书籍中的概念延伸(有时甚至是照搬);

意识到这两点之后,我开始思考一个很 功利 的问题:如何从尽可能少的书中,获取尽可能多的关键知识?换句话说:

  • 优秀的程序员应该掌握哪些关键概念?
  • 哪些书籍来可以帮助程序员掌握这些关键概念?

这即是这篇文章的出发点——我试图通过 程序员必读书单 这篇文章来回答上面两个问题。

标准

进入必读书单之前,我先介绍下书单里的书籍选择标准和领域选择标准。

继续阅读程序员必读书单 1.0