1.8 调试代码
最好能在计算机前阅读本书,因为这样你就可以一边阅读一边尝试其中的示例。本书中的很多示例可直接在 DrJava 的 Interactions 窗格(见附录 A)中运行,但如果将代码存储到源代码文件中,则更容易对其修改再运行。
每当你使用新功能时,都应该尝试故意犯些错误。例如,在 Hello World 程序中,如果遗漏一个引号,结果将如何呢?如果两个引号都遗漏了,结果将如何呢?如果 println 拼写得不正确,结果又将如何呢?这些尝试不仅有助于牢记学过的知识,还有助于调试程序,因为你将知道各种错误消息意味着什么。现在故意犯错胜过以后无意间犯错。
调试犹如实验科学:一旦对出问题的地方有所感觉,就修改程序并再次运行。如果假设没错,你就能预测修改后的结果,从而离程序正确运行更近一步;如果假设有误,你就必须作出新的假设。
编程和调试必须齐头并进。不能先随便编写大量的代码,再通过反复调试来确保它们能够正确地运行;相反,应先编写少量可正确运行的代码,再逐步修改和调试,最终得到一个提供所需功能的程序。这样的方式可以确保在任何时候都有可运行的程序,从而更容易隔离错误。
Linux 操作系统淋漓尽致地展示了这种原则。这个操作系统现在包含数百万行的代码,但最初只是一个简单的程序,Linus Torvalds 用它来研究 Intel 80386 芯片。正如 Larry Greenfield 在 Linxu User's Guide 中指出的,Linux 是 Linus Torvalds 早期开发的项目之一,最初只是一个决定打印 AAAA 还是 BBBB 的程序,后来才演变为 Linux。
最后,编程可能引发强烈的情绪。面对棘手的 bug 而束手无策时,你可能会感到愤怒、沮丧或窘迫。别忘了,并非只有你这样,大多数乃至所有程序员都有类似的经历;不要犹豫,赶快向朋友求助吧!
