在实际编程中,我们总会遇到各种各样的代码运行问题,如何快速发现问题的根源需要一些系统的方法,构造一个最小的能够复现错误的环境至关重要,也就是所谓的 MWE,minimal working example。
为什么 MWE 很重要?因为通过构造MWE,我们能不断缩小问题的范围,定位问题的根源,而不是表面的现象,例如代码在 Linux 上运行错误,我们不能把代码错误归结为操作系统原因,这个范围太庞大,无助于解决问题。另外,通过构造 MWE,在这个过程中,我们可能靠自己就能解决问题,即使解决不了问题,在 stackoverflow 或者 github 上提供 MWE,也更有可能得到别人的回复。
如果是一个很大的项目,有时候很难找到具体出错位置,可以根据报错的信息,在代码中加入 log 打印,这样可以大致锁定出错的位置。
锁定出错的位置以后,需要新建一个 toy 项目,这个项目应该用最少的,最简单的代码来尝试复现问题,代码越简单,越容易找到问题的本质。通常我们还需要引用一些库或者安装一些程序,要保持这些引用或者安装在最小的程度,足够复现问题即可。
一旦确定了表面问题,可以试着把出现问题的代码注释,或者换一种写法,看问题是否还会出现,进一步确定问题根源。另外,有的时候,可能是代码和库的版本配合问题,对于 Python,用的哪个版本的 Python 影响比较大,可以尝试更换版本,观察问题是否仍然存在。通常确定问题根源的过程需要反复尝试,才能最终确定 bug 的根源。
通过不断缩小问题范围,通常能很快定位到问题根源,看似“浪费”了很多时间来复现 bug,综合算起来还是节省了时间,避免大量无头苍蝇式的尝试。