The Practice of Programming 程序设计实践 前言翻译

你可曾……

花费了大量时间编写错误的算法?

使用了过于复杂的数据结构?

测试程序却忽略了明显的错误?

需要让程序使用更少的内存,但运行快三倍?

纠结地在工作站和PC间移植程序?

试图对他人的程序做适当的修改?

因无法理解程序而重写?

这有趣吧?

以上种种,程序员频频遇见。但处理这些问题却比想象中的难,因为程序设计中的实践部分——测试、调试、可移植性、性能、设计方案、风格——常非计算机科学或程序设计课程的关注点。大部分程序员都是在实践中笼统地学习这些知识,少数是从未学习。

在程序设计的世界里,有着大量错综复杂的接口,有着不断改变着的工具、语言和系统,有着种种事情的重重压力,人们会忽略基本的原理——简洁性、清晰性、通用性,而这些都是优秀软件的基础。人们也会低估机械化生产软件的工具和表示法,而这些可让计算机自动编程。

本书的叙述方法基于一些基本的、相互关联的原理,这些原理可用于所有层次的计算。简洁性,让程序简短且易于管理;清晰性,保证易于人和机器的理解;通用性,意味着程序能工作于各种情景,同时适用于新情景;自动化,让机器为我而动,让人从琐碎的工作中得以解放。通过考察用多种语言进行程序设计的活动——从算法和数据结构到程序的设计、调试、测试和性能优化,我们便能阐明独立于语言、操作系统或编程范式的通用工程概念。

本书源自多年的经验,包括编写维护大量软件、教授程序设计课程,以及同形形色色的程序员共事。我们想分享实践过程中的教训,传递经验中的真知灼见,并建议不同层次的程序员如何变得更加专精高效。

本书是为多种读者而写的。如果你是个学生,修习过一两门程序设计课,想要成为更好的程序员,那么本书将阐述一些校园里未有足够时间讲授的主题。如果你的工作只是编写程序支持其他业务,而非编程本身,那么书中内容将让你编得更高效。如果你是个专业的程序员,却没有在校园里充分领略这些主题,抑或你只想来次温习,再或者你是个软件经理,想指导员工朝向正确方向,那么本书材料将大有裨益。

我们希望书中的建议会助你写出更好的程序。唯一需要的背景知识是,你要有过编程经验,最好是使用过C、C++或者Java。经验越丰富,编程越容易;没有什么能让你在21天内从新手变专家。比起只使用Windows和MaCintosh的程序员,UNIX和LINUX程序员会对书中的一些例子更加熟悉,但所有程序员都将发现一些材料,让编程变得更容易。

本书内容分为九章,每章关注程序设计实践的一大问题。

第一章讨论程序设计风格。良好的风格对优秀的程序设计至关重要,因此我们将其放在第一章。精心组织的程序好过胡乱的编写。风格良好的程序会有更少的错误,会更易于调试和修改,因此首先讨论风格是很重要的。本章介绍了良好程序设计的一个重要主题――语言惯用法的正确使用。

第二章的主题是算法和数据结构。这是计算机科学课程和程序设计课程的核心。因多数读者都已熟悉这部分内容,我们只打算对最常见的算法和数据结构做简单的回顾。更加复杂的算法和数据结构通常演变自这些基本模块,所以大家应该掌握最基本的。

第三章描述小型程序的设计和实现,进而阐述真实情况下的算法和数据结构问题。程序由五种语言实现;通过比较,可展示不同语言如何处理同一数据结构,不同语言的表达能力和性能有着怎样的区别。

用户与程序间和程序各部分间的接口是程序设计的重要基础,软件的成功很大程度上取决于接口的优良设计和实现。第四章展示了一个小型库的演化,用于分析某种广泛使用的数据格式。例子虽小,却阐明了接口设计的多个要点:抽象、信息隐藏、资源管理,以及错误处理。

大家总试图一次性成功地编写程序,但是难保没有错误,因此要调试。第五章为系统高效的调试提供了策略和手段。论题包括常见错误特征,以及重要的“数字命理学”,即从调试输出的模式常常可推断出问题所在。

测试的目的是为程序的正常工作、升级后的正常运行提供合理的保证。第六章强调通过手工和机器进行系统的测试。边界条件测试检查潜在的薄弱点。合理利用机械化和和测试台让繁重的测试变得相对简单。不同于典型的用户测试,压力测试提供了新的测试方法,可侦测出新一类的错误。

计算机运行很快速,编译器性能很优良,很多程序在完成那天起便能运行得足够快。但有些或是太慢,或是占用太多内存,抑或两者兼有。第七章呈现了一种有序的方法,用于处理程序有效利用资源的问题,也就是说,在高效的同时,程序正确如前。

第八章涵盖可移植性。成功的程序,即便在运行环境改变了,被移植到了新系统、新硬件、新的领域,也能够运行长久。可移植性的目标是用尽可能小的修改来适应新的环境,进而减少程序的维护费用。

计算语言丰富,不仅有用于大多数程序设计的通用语言,还有许多用于特定领域的专用语言。第九章提供的几个例子,是关于计算表示法重要性的,展示了我们应如何使用之简化程序、指导实现,甚至帮助我们编写可编程的程序。

讨论程序设计,必须展示大量代码。书中的大部分例子都是特地准备的,也有些是改写自其它源程序。我们已竭力去写好书中代码,且已用机器可读文本直接在六个系统测试通过。更多的信息可在the praCtiCe of programming的网站上获取:

http://tpop.aw1.Com

书中的大部分程序使用C,也有些例子使用C++和Java,另外还有些脚本语言的简短讨论。在最底层,C和C++几乎等同,C程序亦适用于C++程序。C++和Java直接源自C,不仅继承了其大量的语法,还继承了其高效性和表达能力,同时增加了丰富的类型系统和库。在书中,我们通常使用以上三种语言,间杂其他。语言的选择依赖具体的问题:操作系统使用高效、限制少的语言编写最佳,如C和C++;快速原型通常使用命令解释器或脚本语言最简便,如Awk和Perl;对于用户界面,VB和TCl/Tk是强有力的竞争者,另外还有Java。

在选择示例的语言时,有个重要的教学考量。正如没有一种语言能够同等漂亮地解决所有问题,也没有一种最好的语言适用所有主题。高级语言预设了些设计决策。如果使用低级语言,我们就得考虑问题的其他解决方案;知道的细节越多,就能讨论得越充分。经验表明,即便是使用高级语言的工具,知道它们如何与底层问题相联系也是非常有价值的;没有这种深刻的领悟,程序很容易陷入性能低下和行为诡异的境地。因此,我们的例子通常使用C,尽管实践中也许有其他选择。

实际上,本书的大部分内容都独立于特定程序设计语言。数据结构的选择受手头使用的语言影响;一些语言也许没有这些选择,而其他语言却有各种各样的选择。但是,解决问题路上所做的选择却是相同的。如何测试和调试的细节,不同的语言各不相同,但其中的策略和手段却是相近的。使程序高效的大部分技巧能应用于不同的语言。

无论使用何种语言,你的任务是利用手头上的工具把自己发挥到极致。优秀的程序员能克服语言的贫瘠、能克服操作系统的呆板;即便是优越的程序设计环境也拯救不了糟糕的程序员。我们希望,无论你当前的经验和技术如何,这本书都能帮你更好地编程,得到更多的乐趣。

我们向阅读本书手稿并提出宝贵意见的朋友和同事们表示深深的谢意。(人名从略)

你可能感兴趣的:(The Practice of Programming 程序设计实践 前言翻译)