
232
|
第
20
章
么你很可能不知道从哪里开始。不管什么时候面对一个一眼看不穿的问题,你
第一个想法
都会是:“这个问题的来源我要怎么
排除
呢?”毕竟你排除得越多,需要看的地方就越少。
排除法可以有多种形式,以下是一些常见的例子。
•
有步骤地注释掉或禁用一些代码块。
•
编写能够被单元测试覆盖到的代码。单元测试本身提供了一个排除问题来源的框架。
•
分析网络流量,确定问题是产生在客户端还是服务器端。
•
找出系统中与发现问题的部分有相似之处的部分,并对其进行测试。
•
使用先前正常输入的数据,之后一次修改一点点,直到问题显现。
•
使用版本控制系统,来回切换版本直到问题消失,你就可以定位出特定的代码变更(更
多信息请查看
git bisect
命令)。
•
“模拟”某些功能,以便排除复杂的子系统。
不过,排除法并非是万能的。很多时候,问题是由两个甚至更多组件之间的复杂交互造成
的。只要排除(或模拟)其中任何一个组件,问题就可能会消失,但是并不能定位到其中
的某个组件。不过即便是在这种情形下,排除也有助于缩减问题来源的范围,尽管它还没
有直接给你指明问题所在的位置。
如果能做到细致而有条理,排除法是其中最成功的。如果只是漫无目的地排除一些组件,
而不考虑它们是如何影响整体的,就很容易错过一些东西。你可以自己试试:当考虑要不
要排除某个组件时,梳理一下如果移除这个组件会对系统产生怎样的影响。这样就会知道
应该期望什么样的结果,以及移除这个组件能否告诉你有用的信息。
20.2
利用
REPL
和控制台
不管是
Node
还是浏览器,都给你提供了一个 ...