1.6 程序员的理想境界
我们希望从自己的程序中获得什么?相对于特定程序的特定功能,一般意义上我们想要什么?我们希望保证正确性,以及可视为正确性的一部分的可靠性。如果程序没有按照设想工作,而且我们还依赖它这种工作方式,那么小则是一个严重干扰,大则是一个危险。我们希望程序设计良好,这样它可以很好地满足实际需要;如果它所做的事情与我们无关,或者以某种我们厌烦的方式完成,则说程序正确是没有意义的。我们同样希望可以负担得起;我可能喜欢用劳斯莱斯汽车或行政专机作为日常交通工具,但是除非我是一名亿万富翁,否则我是负担不起的。
这些是软件(工具、系统)得到非程序员赞赏的外在方面。如果我们希望开发出成功的软件,这些方面必须成为程序员的理想,我们必须将它们永远记在心中,特别是在程序开发的早期阶段。另外,我们还必须关注与代码本身相关的理想:我们的代码必须是可维护的,那些没有编写它的人可以理解它的结构并进行修改。一个成功的程序可以“生存”很长时间(经常是几十年),并经过反复修改。例如,它将会移植到新的硬件上,它将会增加新的功能,它将被修改以使用新的I/O设备(屏幕、视频、音频),它将会用新的自然语言进行交互等。只有失败的程序才不会被修改。为了保证可维护性,相对于它的需求,程序必须很简单,而且它的代码必须直接体现要表达的思想。复杂性是简单性和可维护性的敌人,它可以是问题本身内蕴的(在这种情况下我们不得不处理它),但也可能是由于没有清晰地用代码表达思想而造成的。我们必须通过良好的编码风格来尽量避免它——编码风格很重要!
这听起来不太难,但是确实很难。为什么?编程从根本上是简单的:就是告诉机器它应该做什么。但是,为什么编程中要面对很多挑战?计算机根本上也是简单的;它只能做很少几种操作,例如两个数相加、基于两个数的比较来选择要执行的下一条指令。问题是我们并不希望计算机做简单的事情。我们希望“机器”帮助我们做那些难以完成的事,但是计算机是挑剔的、无情的和不会说话的。更进一步,这个世界要比我们所相信的更复杂,因此我们并未真正理解自己需求的实际含义。我们只是希望一个程序能够“做这样一些事情”,但是并不希望被技术细节所困扰。我们通常假设“基本常识”。不幸的是,人们认为很普通的基本常识,在计算机中通常完全不存在(不过在某些特定的、很好理解的情况下,某些精心设计的程序可以模拟它)。 ...