寻找错误的根源
在我的学生时期总会时不时地出现这样的情况:在考场上因为能够很早地将试题做完,所以就留下了充足的时间可以对答题的每一步骤进行反复验算、检查。可即便有如此周密的审核环节,也还是无法百分百地避免出错。而这些“漏网之鱼”还总是因为粗心大意而犯下的低级错误,根本上来说就是非智力因素。
如今,过去学习加考试的日子已一去不复返,可在个人的研究与工作中也还是会遇到类似“犯低级错误”的情况,而一个典型的例子就是调试代码、找bug。与在考场上检查试卷类似,若只是盯着屏幕一行一行地细心看过去,或者将整个代码打印出来,以更为冷静和专注的方式去查错,都很难稳妥地找到所有错误的根源并加以解决。其实,产生这一现象的直接原因倒很简单:当一个人检查自己做过的题目、写下的代码时,很容易受到他之前的错误思路和习惯的诱导,以至于被同样的石头绊倒多次而自己却毫不知情。这也像是我们在赛场上既做球员又做裁判员,给出的评判总是难以让场外的观众信服。
为了克服这个问题,我们需要首先保持高度的专注,一丝不苟,谨慎细致——这是解决任何棘手问题的基本条件和大前提。然后,关键之处在于必须从自己原有的思维体系中跳出来(jump out of the system),以客观和批判的态度来面对已有的工作。具体说来,我们不光要“虚拟”地读代码、查推导过程,甚至连重新在纸上证明和演算都还不够。我们要设计出便于和理论公式直接对比的模型,并在代码中所有的可疑之处插入“探针”,用于提取相关参数与数据。当需要运行的算例较多时,还需要精心设计导出数据的格式与组织结构,并编写专门的自动化测试代码。总之,我们要想方设法地通过数据将问题充分地暴露出来,以至于令产生问题的根源自然浮现。最后,我们也需要永远持有“所有问题都能解决”的百倍信心与乐观精神。要知道,一个问题若迟迟得不到解决,那并不是我们的智商不够,而是我们仍未下足功夫,没有进行所有可能的尝试。