有时候,算法结果出现的种种怪异问题可能并不是由于我们理论理解上的不完善或是算法实现上的重大错误导致的,而只是出于某个低级错误。当然,这并不意味着通过调试程序并找出这个低级错误所需要的时间成本是低的。一般来说,改正这个错误所花费的功夫可能与弥补一个大错误差不多。因此,这就要求我们在理论推导与算法编码时尽量慢一些,在运行算例前尽量多检查一遍——而且,这样的检查工作是在具体实现的过程中逐步地(incrementally)与迭代地(iteratively)展开的。当每一个小功能完成后,也一定要有配套的单元测试。 只有如此,才能使我们的算法在较大的概率上具有可靠性。

在调试纠错的过程中,当从理论上与代码的实现流程中均看不出什么明显的破绽时,倒不如停下这些围绕核心的工作,转而去检查测试代码的外围设施,如程序的控制参数是否与我们期待的设定完全一致,算法的输入数据是否完整与准确,调试探针与算法的最终输出结果有什么异常情况。这些蛛丝马迹都在一定概率上有助于我们较快地定位出错误的源头。退一步说,即便这些外围工作最终没有发挥作用,在程序调试处于没有思路、束手无策的阶段,我们反正闲着也是闲着,把这些看似不起眼的工作做到位只会有益无害。