作者Jon Bentley,世界著名计算机科学家,被誉为影响算法发展的十位大师之一。本书讲述了对于程序员有共性知识,通过一些精心设计的有趣而又颇具指导意义的程序,对实用程序设计技巧及基本设计原则进行透彻而睿智的描述,为复杂的编程问题提供清晰而完备的解决思路。
第一部分 编程技术
1、性能监视工具
听诊器是一种简单工具,却给医生的工作带来了革命:它让内科医生能有效地监控病人的身体。性能工具(profiler)对程序起着同样的作用。
使用性能监视工具。让本月成为性能监视工具月。请在随后的几周至少监视一个程序片段的性能,并且鼓励你的伙伴也这样做。记住,当一个程序员屈尊来帮助一个小程序时,并不总是高瞻远瞩的。
开发性能监视工具。如果你还没有方便的性能监视工具,就自造一个吧。大多数系统都提供基本的性能监视操作。20世纪60年代不得不观察控制台灯光来获得信息的程序员,现在可从个人工作站的图形窗口获得同样的信息。一个小程序通常足以把系统的命令特性包装成方便的工具。
2、关联数组
本章讨论Algol传统之外的一种语言特性:关联数组(associative array)。我熟悉的数组都用数值作下标,而关联数组则允许像count[“cat”]这样的引用。这样的数据结构出现在Snobol和Rexx这样的语言中,它允许我们用简单的程序来表达复杂的算法。
Awk可以使用程序事半功倍,我们目前看到的多数程序如果使用传统的语言编写,代码量恐怕会多出一个数量级。规模的减小归功于Awk的几个特性:输入行之上的隐士循环、自动分隔成字段、变量的初始化和转换,以及关联数组。
3、程序员的忏悔
大多数程序员都会花很多时间去测试和调试,不过在他们写程序的时候,却很少注意这些问题。大厦周围的脚手架使得工人能够接触到他们本来无法接触到的地方;软件中的脚手架由临时程序和数据组成,他们可以使程序员访问系统的各个组件。脚手架不会随着程序一起发给客户,然后在测试和调试中却是不可或缺的。
4、自描述数据
一些系统允许程序员将两个未指定类型的数值(从整数到复数矩阵)对象相乘。系统在运行时会先检查存储在操作数中的描述来决定其类型,进而执行合适的操作。标记体系结构(tagged-architecture)的机器为自描述对象提供了硬件支持,一些通信协议也将对数据格式和类型的描述与数据本身一同存储。最重要的文档助手是简洁的编程语言。名字-值对是一种简单而且实用的语言机制。程序文档的最佳位置就在源文件中。数据文件是保存该文件自身来历的好地方,不仅易于操作而且不易丢失。
第二部分 使用部分
5、劈开戈尔迪之结
在古希腊神话中,戈尔迪打了一个结,并许诺把整个亚洲给能解开这个结的人,可以当亚细亚之王。几百年来这个结纹丝不动,直到公元333年亚历山大大帝来了,他没有重蹈覆辙,而是拔出剑来,将结一劈两半,他随即征服了亚洲。从那时起,“劈开戈尔迪之结”意味着为复杂问题找出聪明的解法。
用现代的话说,亚历山大找到了捷径。主人公总是很懒惰,不肯用难的方法解决问题,最终找到了一个简单的方案。去对付问题,而不是对付程序。
6、计算机科学箴言集
如果还没想清楚,就用蛮力算法吧。如果你发现特殊情况太多,那你的肯定是用错方法了。测试智能证明程序有错误,而不能证明程序没有错误。对于那些快速算法,我们总是可以拿一些速度差不懂但是更容易理解的算法来替代它们。别轻信那些看似聪明的法则。
7、粗略估算
每一位程序员都应该对粗略估算并不陌生,当你尝试为数据库系统增加一条命令的时候,你可能要进行下面的估算:需要多少程序员、多少时间来写这段代码?需要增加多少磁盘来存储多出来的数据?当前使用的处理器速度是否能够将系统响应时间维持在合理的范围内?程序员的三大美德:对数值敏感、实验的欲望结良好的数学功底。
8、人员备忘录
添加备忘录,可以及时提醒自己,发现自己的不足之处。
第三部分 人性化I/O
9、小语言
小语言是流行的第四代和第五代编程语言以及应用程序生成环境的重要组成部分,然而它们对计算本身的影响要更广。小语言通常为人类提供了一个优雅的界面,这既方便了人类控制复杂的程序,也便于大系统中的模块进行彼此间的交互。
10、文档设计
文档设计需要创意。如果所有人着装相同,所有车的车型和颜色也一样,那么这个世界是多么的乏味甚至令人生畏。一个所有风格看上去都差不多相同的文档库也是一样。综合考虑文档的许多属性,才能得到最佳的设计效果。好的文档风格就像好的编程风格和好的写作风格一样,是无形的。内容是文档的首要目的,文档风格只是达到这一目的辅助手段。
11、图形化输出
绘制生动的图需要多样的技术。图作者必须对应用程序足够理解才能决定应当概括哪些数据,必须足够领会数据的含义才能避免得出没有数据(或错误)的结论,而且必须选择合适的媒介(可能是墨或激光打印机)来设计并实现图。
12、对调查的研究
人们都知道调查,美国新闻界经常向民众发出民意调查,调查主题从总统的声望到喜欢吃哪种爆米花五花八门。我为民意调查公司安装个人电脑并为他们写自动化程序,帮助他们提高活动效率。
第四部分 算法
13、绝妙的取样
在纸牌游戏中,如果让计算机来发牌,该怎么做呢?如果给一副牌中每张牌指定从1到52的一个整数,就可以从1~52范围内“随机取样”5个整数来得到一手牌,例如 :4 8 31 46 47,随机取样也出现在各种不同应用中,如仿真、程序测试和统计学。
14、编写数值计算程序
行内的人给它起了个好听的名字叫“数值分析”,对于大多数程序员来说,数值计算这个领域很像管道工的活儿:我们经常用,但不去想太多的细节,除非有东西出了问题。但即使对于一个像我这样的外行来说,数值分析也是有用的。
15、选择
分析了Hoare的选择算法的两个方面:它的结果是正确的,并且它的计算很有效率。