网络编程之四书五经
TCP/IP协议是当前广域网和局域网通用的网络协议,因此,基于TCP/IP的编程就格外重要。从应用上来说,现在直接利用C层次Socket API进行TCP/IP编程的人确实越来越少了,各种现成的框架(如ACE、Java、.NET FCL)和控件(如IP*Works)大大简化了TCP/IP编程的难度。但是,如果想要在这个领域达到融会贯通的地步,不打下坚实的基础是不可想象的。正如Richard Stevens在TCP/IP Illustrated中所说,在网络编程领域,开发者所遇到的实际问题中,大约有90%都与开发者对于TCP/IP的理解相关。高层的框架和控件总结了TCP/IP的主要使用模式,并且进行了抽象和封装,这固然非常好,但是想要真正掌握TCP/IP网络编程的真谛,恐怕需要认真学习下面几本著作。
1.Richard Stevens,TCP/IP Illustrated, Vol.1 / Vol.2 / Vol.3
《 TCP/IP详解(第一卷)协议 》《 TCP/IP详解 卷2:实现 》《 TCP/IP详解 卷3:TCP事务协议、HTTP、NNTP和UNIX域协议 》
《 TCP/IP详解卷1:协议(英文版) 》《 TCP/IP详解卷2:实现(英文版) 》《 TCP/IP详解卷3:TCP事务协议、HTTP、NNTP和UNIX域协议(英文版) 》
这是一本众望所归的书。自从1994年出版以来,TCP/IP Illustrated就一直是TCP/IP领域具有传奇色彩的圣经级著作。这一套著作共分为三卷,第一卷通过实际动手实验的方式深入探讨TCP/IP协议,第二卷逐行解释了4.4BSD系统TCP/IP协议栈的15,000行实现代码,第三卷探讨了T/TCP和HTTP等高级协议。整套书最大的特点就是贴近实战,完全符合程序员的胃口,不空谈,不说教,用实验和代码来说明问题。写作这样的书,对于作者要求非常之高,即使在今天看来,敢于这么写作的作者也是凤毛麟角。Richard Stevens以他的写作风格和作品,在TCP/IP编程领域竖立起一座丰碑,令其他作者高山仰止,心向往之。在下文将要提到的Effective TCP/IP Programming一书中,甚至把“读Stevens的书”专门列为一个条款。这套著作的地位,可见一斑。
学习这套书,与其说需要读,不如说需要做。Stevens最强调程序员的两项能力,一是读代码,二是动手实验。他在自己所有的书里都敦促读者将范例输入电脑,亲自编译、运行和调试。这当然需要花费大量的时间和精力,但是如果有读者能够扎扎实实地这么做,那么他所付出的每一分钟都将会有双倍的回报。
2.Richard Stevens, UNIX Network Programming, 2/e, Vol.1 / Vol.2
《 UNIX网络编程卷2:进程间通信(第2版) 》《 UNIX网络编程(第2版)第1卷:套接口API和X/Open传输接口API 》
又是Richard Stevens,又是经典名著。这本书的第一版问世于1990年,是Stevens的开山之作,一举奠定了Stevens在网络编程领域的重要地位。如果说TCP/IP Illustrated解答了“什么是TCP/IP”和“TCP/IP是怎么实现的”两个问题,那么这本书则是在回答“怎样运用TCP/IP开发网络应用程序”的问题。显而易见,这本书的内容更加贴近普通程序员,因此,大多数人是先学习UNP,然后再深入学习TCP/IP Illustrated。
这也是一本让人伤感的书,Richard Stevens从1997年开始撰写此书第二版,制定了一个宏大的计划,卷1阐述Socket API和TLI API,卷2阐述除Socket之外的其他IPC机制,卷3阐述网络编程应用。应该说,卷1和卷2都是为了给卷3打基础。然而天妒英才,就在世人翘首企盼第三卷的时候,1999年9月1日,Richard Stevens英年早逝。留下这套未完成的巨著,让人感慨不已。不过最近从Prentice Hall传来好消息,出版社已经找到合适的作者,重新修订这套经典巨著,其中第一卷即将问世,并且已经在Amazon上热卖。相信会有当世高人沿着Stevens的足迹给我们续写第三卷的,让我们拭目以待。
可选图书:Douglas E. Comer, Internetworking with TCP/IP, Vol.1 / Vol.2 / Vol.3
《 用TCP/IP进行网际互联第一卷:原理、协议与结构(第四版) 》《 用TCP/IP进行网际互联-第二卷:设计、实现与内核(第三版) 》《 用TCP/IP进行网际互联 第三卷:客户-服务器编程与应用(Linux/POSIX套接字版) 》
这套书也是三卷,前两卷内容与TCP/IP Illustrated相似,最后一卷则偏重应用程序的开发。总体上来看,这三卷书的内容与上述Stevens的两套著作相当。Comer教授的这套书定位是教材,因此写出来中规中矩,寓精彩于平和之中。读者如果喜欢阅读教材风格的书,这套应该是很好的选择。
3.Jon C. Snader, Effective TCP/IP Programming
(中文版《 高级TCP/IP编程 》,中国电力出版社)
自彻读Effective C++之后,我总结出一条经验。无论在哪个领域中,一旦掌握基础知识,则应该迅速去寻找该领域中一本名为“Effective XXX”的著作并阅读之,一定可取得事半功倍的效果。Effective C++如此,Effective STL如此,Effective Java如此,这本Effective TCP/IP同样如此,也是一剂功效强大的催化剂。
本书作者是经验丰富的TCP/IP程序员,他在这本书中总结了44个难得的TCP/IP开发经验,并且将每条经验背后的道理都详细地讲解。毫无疑问,这种“专家经验”型著作对于提高读者水平,能够起到最高效、最直接的作用。
初学TCP/IP的朋友可能觉得,自己应该先把基本知识熟练掌握,再看这本书,效果会更好。我认为不必如此,您可以在基本观念建立起来之后直接品读此书。这本书篇幅不大,起点不高,却对很多关键问题进行了全面而细致地介绍,在具体问题的阐述上颇有Richard Stevens之风,也是纯而又纯的程序员风格——拿代码说话。
系统学习和重点难点的突破相结合,历来是快速掌握一门技术的良方。由Scott Meyers开创的“Effective”之风,已有愈演愈烈之势,这是程序员们的巨大福音。我强烈建议大家,不要放过任何一本以“Effective”为名的技术书籍。
4. Douglas Schmidt, Steven Huston,C++ Network Programming, Vol.1 / Vol.2 (中文版将分别由华中科技大学出版社和电子工业出版社出版)
《 C++网络编程,卷2 基于ACE和框架的系统化复用 》
今天的网络编程环境是建立在C的基础之上。如果你满足于C层次的TCP/IP编程,那么Stevens的书可以说达到了一个最高境界,你大可以登东山而小鲁。但是如果再上一个层次,考虑如何运用C++强大的抽象机制是网络编程变得更加富于艺术性,更加高效可靠,那么恐怕必须要高度重视这套书。
这套书共两卷,篇幅都不大,主要内容是介绍ACE。在C++领域,由于这套书被Bjarne Stroustrup编入C++ In Depth系列,因此具有崇高的地位。而在网络编程领域,也有人称赞此书为Stevens之后最重要的网络编程著作。作者Douglas Schmidt是C++、网络程序设计和模式领域中国际公认的权威专家,潜心研究C++网络编程已经十多年。他发起的ACE开源项目是目前当之无愧的最优秀和最成功的C++网络编程环境,不仅具有非常出色的可移植性,而且性能卓越。美国国防部的ARPA已经支持这个项目好几年了,其最终目的是在ACE的基础上建立可用于现代战争的分布式实时嵌入式系统。毫无疑问,ACE无论在理论上还是在实践中,都是最值得程序员关注的网络编程典范项目,而这一套两卷对ACE的介绍性书籍,也毫无疑问是最值得网络程序员品读分析的经典。学习这两本书,你可以将经典的基于C API的网络编程知识与现代面向对象、模式和框架等最新技术思想结合起来,从而使你对网络编程的认识上升到一个新的高度。
Linux底层开发之四书五经(刘江)
操作系统
《Linux 内核设计与实现(第2 版)》
《深入理解Linux 内核(第二版)》
《Linux内核分析与编程》
Linux方面的好书最多。其中《Linux 内核设计与实现(第2 版)》(Robert Love著,机械工业出版社出版译
著)属短小精悍之作,用作《操作系统概念》的配套正好。
《深入理解L i n u x 内核(第二版)》(Daniel Bovet著,中国电力出版社出版译著)分析全面透彻,不过国外已经出版的最新版尚未引进。
此外,倪继利的《Linux内核分析与编程》(电子工业出版社)是国人的经验总结,赵炯的《Linux 内核完全注释》分析的是0.11 版内核,适合初学者,都可以列入候选。
驱动程序开发
《Linux 设备驱动程序》(第三版)
驱动程序的开发和操作系统内核其实息息相关。所以本书的内容与前面的大类难免会有一些重叠。作为黑客世界的经典,本书实在不需要我多加推荐了。值得一提的是译者(魏永明、耿岳、钟书毅)都是国内Linux 界有数的顶尖人物。
系统编程
《UNIX 环境高级编程》(英文影印版)(第2 版)
R. Stevens也许是有史以来最伟大的技术图书作家,虽然他辞世日久,但是人们对他的景仰反而因为其著作的少有褪色而与日俱增。如果本文的范围扩大到网络编程,他的另外两部“圣经级”著作《TCP/IP 详解》和《UNIX 网络编程》也绝对应该入选。本书的地位相当于甚至还超过了Richter 著作在Windows世界的地位
嵌入式系统之四书五经(刘江)
嵌入式系统是从单片机、微控制器等工业控制技术发展而来的,一种流行的定义认为,除PC为代表的通用计算机之外,几乎所有信息处理系统,包括网络设备、信息家电、工业控制、医疗设备、测试仪器、通信设备、汽车电子等等都属于嵌入式系统。显然,我们早已经被嵌入式系统所包围。
嵌入式系统技术主要有硬件和软件两个层面。硬件包括处理器、存储、接口、总线和其他电路设计,软件则包括操作系统、编程语言与开发工具、驱动程序、接口程序、联网程序、用户界面等等内容。
本文将只选择讲述主流技术的图书推荐。
嵌入式系统开发大全
人民邮电出版社(即将出版)
学习内容繁复庞杂的嵌入式系统,掌握宏观图景(big picture)是非常重要的。从一本好的总论型图书入手很可能会使你以后的旅途更加顺利。可以归入本类的图书大多是各种教材,而且往往局限于理论,与工程现场有隔阂。正因为如此,当曾经供职于风河公司(以开发VxWorks而占据嵌入式市场大半份额的龙头企业)的嵌入系统专家T a m m yNoergaard 撰写的本书原版出版之后,迅速得到了广泛的欢迎,成为畅销之作。
本书的特点一是全面,不仅涵盖了前面我们提到的几乎所有方面:嵌入式标准、处理器、内存、I/O、总线、设备驱动程序、操作系统、中间件,而且还讨论了分析到实现、测试等完整的嵌入式系统设计流程,后者是大部分相关图书都很少讲述的。其次,由于作者实践经验和经历都很丰富(除风河外,还曾效力于索尼和Esmertec,负责过消费电子、操作系统等等项目的开发和管理),加上曾经执教于加州大学伯克利分校和斯坦福大学,书中很好地做到了理论和实践的结合。当然,不要希望从书中学到各种技术细节,那是后面介绍的几本书地任务。
时间触发嵌入式系统设计模式
中国电力出版社
这也是一本综合性图书,不过它的价值不在引导读者入门,而是实践经验的总结。是的,这是嵌入式系统领域中模仿《设计模式》风格的一本书。所以,Kent Beck 为其作序也就不足为奇了。书中以模式形式总结了来自各种文献资料中振荡器、硬件复位、存储器、驱动、各种软件应用(端口、延迟和看门狗等)、各种接口、外围模块乃至监控组件(PFM、PWM、ADC、DAC等等)等等诸多问题的解决方案(许多还给出了电路和C语言源代码),可以很快地应用到实际工作中去。书中对时间调度的讲解非常细致。看得出来,本书的作者肯定花了不少功夫才得以完成此作。对实际开发人员来说,本书是一本非常方便、能够事半功倍的优秀参考书。
值得一提的是,作者是英国一所大学的讲师,本书是其嵌入式系统三部曲之二,第一本是《C语言嵌入式系统开发》一书,讲述8051 C语言编程,也值得推荐,比同一类型的《C/C++嵌入式系统编程》(中国电力出版社)更贴近实际。另外还有一本讲操作系统的,目前尚未出版。
Bruce Douglass 所著由机械工业出版社出版的《嵌入式与实时系统开发:使用UML·对象技术·框架与模式》与本书类似,也采用了模式方法,但是该书更注重软件工程,而且侧重于讲面向对象方法在嵌入系统中的应用,总体感觉有与现实脱节之嫌。
嵌入式硬件设计
中国电力出版社
专讲硬件的图书少之又少,似乎也只有本书可以推荐。书中基本上覆盖了前面讲到的硬件知识领域,处理器讲述了PIC、Atmel AVR 和Motorola 68000 系列,涉及了CAN总线,最后有一个电动机控制的实例。需要指出,本书主要面对的是初学者以及硬件和电气知识比较缺乏的软件工程师。如果你是有一定经验的硬件工程师,或者本身出自电气类学科,可能会觉得太浅。许多读者还抱怨书中用一整章讲述Forth这样罕用的语言。本书原版已有第二版,不过国内尚未引进。
ARM SoC 体系结构
北京航空航天大学出版社
虽然绝对的使用量可能还比不上8051和PIC这样8位的低档竞争者,但ARM无疑已经成为目前最炙手可热的嵌入式系统处理器。本书作者Steve Furber是ARM的最初设计者之一,权威性显然毋庸置疑。书中讲述了ARM的体系结构、指令集、汇编语言、存储器和处理器核、CPU核以及对编程语言和操作系统的支持等等,应该是从事ARM开发者的必读之作。Furber 本人是英国皇家学院和工程院的双料院士,也是英国计算机学会和IEEE的会士。他年青时曾经是国际数学奥林匹克比赛英国代表队成员。
另外一本值得推荐的ARM图书应该是北京航空航天大学出版社翻译出版Andrew Sloss 等所著的《ARM 嵌入式系统开发:软件设计与优化》。此书属于中高级著作,侧重于软件层面,重点是如何编写高效程序,与上面的一本书配合阅读绝佳。
嵌入式系统软件教程
机械工业出版社
专门讲述嵌入式软件的图书,大多以“XX处理器XX操作系统嵌入式编程/系统开发”之类的名字出现,内容以翻抄处理器或者操作系统的文档为主,另外再加一些实例。
本书超越了这种模式,作为一本导论性的教材,它以作者在加州大学伯克利分校教课的讲义基础上,全面讲述了初学者必须掌握的嵌入式软件相关知识:中断、软件架构、实时操作系统、开发环境、调试等等,深浅适度,理论编排非常清晰,而且字里行间不时透露出作者的实践经验和技巧。书中对各种工程问题也有很到位的分析和解决。书中对几种软件架构的比较分析,对于理解实时操作系统的设计原则很有帮助。
嵌入式Linux 系统设计与开发
人民邮电出版社(尚未出版)
由于VxWorks方面没有发现值得推荐的图书,我们直接跳到Linux。嵌入式Linux方面的书中,Karim Yaghmour的《构建嵌入式Linux系统》(中国电力出版社)一直处于主导地位,而且也广受好评。但是该书主要讲述的是“构建”开发环境,对程序设计本身涉及较少,而且更重要的是,该书缺乏实际项目所必需的驱动程序、实时Linux、uCLinux和图形界面等关键内容。本书去年刚刚出版,正好填补了上述空白,因此尽管售价是竞争对手的两倍都不止,仍然很快得到市场的欢迎,大有后来居上的势头。作者均为一线应用工程师(印度飞利浦),所以对读者的需求心知肚明。BSP架构,串口、I2C和USB设备驱动程序,减少系统启动时间、优化内存、找到内存泄漏等等内容非常贴近实际。而对uCLinux架构和编程模型的透彻叙述, 则得到了uCLinux内核维护者David McCullough的称赞。
嵌入式实时操作系统
μ C/OS-II(第2 版)
北京航空航天大学出版社
我2000 年决定将这本书的第一版引入国内时,国内知道μC/OS-II这个操作系统的人似乎还非常少。实际上,这个操作系统是Labrosse 自己一个人用C 编写的,他没有将内核发布为产品,因为这样的产品已经够多了。他选择了撰写文章,但是没有被杂志接受。最后,他得到了一个机会,出版了一本专门的书。令Minix名扬天下的在书中附带全部源代码的做法,同样也使这个名字怪怪的操作系统终于呈燎原之势。并在译者不遗余力的宣传推广下,成为国内嵌入式系统界追捧的对象。时至今日,该书仍是本领域最畅销的图书之一,而且被许多学校指定为教材。而Labrosse也开设了一家专门从事该系统和其他附加产品的销售和支持。应该说,μC/OS-II 的代码编写得非常干净,符合规范,核心算法也设计得很妙,移植性、可剪裁性都非常优秀,的确值得学习。而且Labrosse的书将内核知识讲得很透,胜过其他各种形式的文档。这些都是它成功的要素。不过,必须了解的是,这个操作系统虽然开发源代码,但并非开源软件。事实上,商业应用是必须付费的。
C++程序设计之四书五经
C++是一门广泛用于工业软件研发的大型语言。它自身的复杂性和解决现实问题的能力,使其极具学术研究价值和工业价值。和C语言一样,C++已经在许多重要的领域大获成功。
然而,一个不可否认的现实是,在低阶程序设计领域,C++挤压着C同时也在承受着C的强烈反弹,而在高阶程序设计领域,Java和C#正在不断蚕食着C++的地盘。也许C++与C合为一体永远都是一个梦想,也许Java和C#的狂潮终将迫使C++回归本位 — 回到它有着根本性优势的开发领域:低级系统程序设计、高级大规模高性能应用设计、嵌入式程序设计以及数值科学计算等。果真如此,我认为这未尝不是一件好事。
C++吸引如此之多的智力投入,以至于这个领域的优秀作品,包括重量级的软件产品、程序库以及书籍等,数不胜数。文题“C++程序设计之四书五经”一个不太严格的含义是:C++程序设计之四书 ⅹ 五经。是的,在本文(及其下篇)中,我将分门别类推荐20多本C++好书,你可以根据自己的需要选读。
TCPL和D&E
TCPL和D&E分别是《The C++ Programming Language》和《The Design and Evolution of C++》的简称,均出自Bjarne Stroustrup之手。我将它们单列出来,首先是因为Bjarne是C++语言的创建者,然后是因为比“首先”那个原因更重要的原因:这两本书是C++领域毋庸置疑的杰作。说它们是C++语言圣经,并不为过。
Bjarne Stroustrup, The C++ Programming Language (Special 3rd Edition)
《C++程序设计语言(特别版)》,机械工业出版社
《C++程序设计语言(特别版)(英文影印版)》,高等教育出版社
迄今为止,TCPL是除了C++标准文献之外最权威的C++参考手册。和大多数人的看法不大一样,我认为Bjarne的文字语言并不逊色于他所创建的程序语言,至少我喜欢这种学院气息浓厚的作品。本书对C++语言的描述轮廓鲜明、直截了当。它从C++语言创建者的角度来观察C++,这是任何别的作者和书籍做不到的 — 没有任何人比Bjarne自己更清楚该怎么来使用C++。
这是一本严肃的著作,以中、高级C++开发人员为目标读者。如果你是一名有经验的C++程序员,需要了解更加本质的C++知识,本书正是为你而写。它不是那种让你看了会不断窃喜的小书,需要用心体会,反复咀嚼。在阅读过程中,请特别留心Bjarne先生强调了什么,又对什么一语带过。我个人比较喜欢这本书的第四部分“使用C++做设计”,这样的内容在类似的程序设计语言书籍中很难看到 — 我甚至认为Bjarne应该将这部分独立出来单独写一本书。
Bjarne Stroustrup, The Design and Evolution of C++
《C++语言的设计和演化》,机械工业出版社
《C++语言的设计和演化(英文版)》,机械工业出版社
D&E是一本关于C++语言设计原理、设计决策和设计哲学的专著。它清晰地回答了C++为什么会成为今天这个样子而没有变成另外一种语言。作为C++语言的创建者,Bjarne淋漓尽致地展示了他独到而深刻的见解。除了广受赞誉的语言特性外,Bjarne没有回避那些引起争议的甚至被拒绝的C++特性,他一一给出了逻辑严密、令人信服的解释。内容涵盖C++的史前时代、带类的C、C++的设计规则、标准化、库、内存管理、多重继承、模板等,对包括异常机制、运行时类型信息和名字空间在内的重要的新特性都分别进行了深入探讨。每一名C++程序员都应该可以从Bjarne的阐释中加深对手中这门语言的认识。
需要再次提醒的是,这两本书知识浓缩,信息量极大,请不要错过Bjarne每一句看似漫不经意的话。
入门教程
学习任何一门语言都需要一个从入门到精通、从新手到高手循序渐进的过程。不过,对于一个所谓的新手而言,究竟是一个完完全全的新手,还是一个熟悉某种别的语言的“新手”,甚至是在某种语言程序设计领域已经颇有建树的高手,很难一概而论?不同的C++新手需要不同的入门书籍。
Andrew Koenig, Barbara E. Moo, Accelerated C++: Practical Programming by Example
《Accelerated C++中文版》,中国电力出版社
和市面上大多数C++教程不同,本书不是从“C++中的C”开始讲解,而是始于地道的C++特性。从一开始就使用标准库来写程序,随着讲述的逐渐深入,又一一解释这些标准库组件所依赖的基础概念。另外,和其他C++教材不同的是,这本书以实例拉动语言和标准库的讲解,对后两者的讲解是为了给实例程序提供支持,而不是像绝大多数C++教材那样,例子只是用作演示语言特性和标准库用法的辅助工具。
作者在C++领域的编程实践、教育培训以及技术写作方面都是世界一流水准。我喜欢这种大量使用标准库和C++语言原生特性的清新的写作风格。在这本教材面前,几乎迄今为止的所有C++教材都黯然失色或显得过时。尽管这本教材也许对于国内的高校教育来说有些前卫,不过我仍然极力向我的同行们推荐。顺带一提,在Bjarne和我最近的一封通信里,他这样评价本书:对于有经验的程序员学习C++而言,这本书可能是世界上最好的一本。
Stanley B.Lippman, Josee Lajoie, C++ Primer (3rd Edition)
《C++ Primer (3RD)中文版》,中国电力出版社
这本书的名字多少有点让人误解。尽管作者声称这本书是为C++新手而写,但无论是它的厚度还是讲解的深度都暴露了似乎并非如此。也许说它是一本“从入门到精通”的C++教程会更合适一些。我个人认为它并不适合完全不懂C++的初学者 — 在阅读这本书之前,你至少应该先有那么一点C或C++的背景知识,或者至少要具有一些其他语言的编程经验。
尽管这本书省略了一些高级C++特性的讨论,但仍然可以称得上是迄今为止最全面的C++学习教程。事实上,如果一名C++初学者能够扎扎实实地读完本书并对照《C++ Primer Answer Book》完成全部习题的话,他的水平肯定可以进入职业C++程序员的行列。我个人认为,即使你已经拥有了TCPL,这本书依然有拥有的价值,因为在许多方面它比TCPL来得更详细、更易懂。
Stanley B. Lippman, Essential C++
《Essential C++中文版》,华中科技大学出版社
《Essential C++(影印版)》,中国电力出版社
可以不太严格地认为这本书是《C++ Primer》的精简版。本书一一讲述了C++中最具代表性的主题,包括过程式编程、泛型编程、基于对象编程、面向对象编程、模板编程以及异常处理等。Stanley将门槛调低到“具有其他语言程序设计经验”的C++新手所能接受的最基本的层次,使他们能够迅速开始使用C++编程而又免于阅读《C++ Primer》那样的大部头。它以实例引导学习,力图使读者在最短的时间内把握C++的精粹。
也许换一个人来概述C++编程范型(paradigm)的方方面面需要好几百页才能说清楚,但这本小书不可思议地做到了这一点。我个人非常喜欢这种满是技术、简明扼要并且“有话好好说”的书。这本书同样具有一个明显的风格:所有程序例子全部采用标准库组件,让人耳目一新。
以上三本书都不是为了完完全全的编程新手而写。完全的C++编程新手可以阅读Francis Glassborow的新书(尚未出版):《A Beginners Introduction to Computer Programming : You Can Do It!》。这也是Bjarne的推荐。Francis Glassborow是ACCU主席,多年来他对几乎每一本C++经典名著评头论足,他自己的这一本自然会引起C++社群的极大兴趣。
高效、健壮编程
两年前我在负责一个省级电力调度系统项目时编写了一个网关程序,它从SCADA系统获取电力实时信息。通讯接口采用了不常用的数据库直连方式(这个网关程序一端连接SQL Server 6.5,另一端连接Oralce 8.1.6)。由于实时测点近万,每次将全部取样更新或插入一遍显然是低效的。我在网关程序里建了一个内存库,获取到的数据首先在其中进行比较,然后决定是否更新物理数据库(同时还做了别的更复杂的事情……),从而在效率和资源占用两方面达到了预期效果。
这个程序一直运行得很好,但在离开现场之后的某一天,系统管理员打来电话,说大概因为网络故障等原因,有时这个网关程序会崩溃掉 — 它自己崩掉也就罢了,问题是它还会把Windows 2000 Advanced Server搞成“蓝屏”!坦白地说,我还从来没看过哪个非蓄意的程序有这个“能耐”。由于当时正忙于另外一个大项目,无法去现场调试,最后只有凭经验对内存库代码小心翼翼地封装以异常处理代码(同时也做了一些别的修改……)。这样,虽然没有彻底解决问题,但程序终究不再死得那么难看了。
在这儿讲这么一段花絮有什么意思呢(当初为那个可怕的bug朝思暮想时我可不认为这是一个“花絮”)?我想说的是,对于任何软件而言,离开强健,效率也就无从谈起。而对于C++程序员来说,也许编写一个高效的程序并不难,但要编写一个需要7 ⅹ 24小时持续运行的服务端软件就不是那么容易了,需要考虑许多因素,有时这些因素甚至远远超出C++语言和开发工具的本身。作为一名开发实际项目软件的程序员,并非非得自己碰钉子才能积累经验,只要我们足够虚心,别人的经验往往都是我们很好的借鉴。鉴于此,我推荐以下几本书供你选读,它们可以让你从强健和效率两方面受益(当然了,它们涵盖的内容远不限于异常处理J)。
Scott Meyers, Effective C++: 50 Specific Ways to Improve Your Programs and Design (2nd Edition)
Scott Meyers, More Effective C++: 35 New Ways to Improve Your Programs and Designs
《Effective C++中文版》,华中科技大学出版社
《More Effective C++中文版》,中国电力出版社
《Effective C++(影印版)》,中国电力出版社
如果说《Effective C++》主要讨论C++中一些相对基础的概念和技巧的话,那么《More Effective C++》则着重探讨了包括异常处理在内的一系列高级技术。与前者相比,后者具有两大主要区别:其一,它包含很多时新的标准C++的内容;第二,它讨论的主题倾向于“战略化”而非“战术化”,并且讨论得更深入、更彻底。尤其是对虚析构函数、智能指针、引用计数以及代理类(proxy classe)等技术和模式论述的深入程度,让人很难想象是出现于这样的一本小书之中。
游刃有余的技术,高超的写作技巧,Scott无疑是世界上最优秀的C++技术作家之一。在简洁、清晰、易读等方面,这两本书都卓尔不群。总之,Scott提供的这85个可以改善编程技术和设计思维的方法,都是中、高级C++程序员必备的技能。我强烈推荐这两本书(实际上还有一本,稍后就会看到)。
Herb Sutter, Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions
Herb Sutter, More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions
《Exceptional C++中文版》,中国电力出版社
《More Exceptional C++中文版》,华中科技大学出版社
你自认为是一名C++语言专家吗?读一读ISO C++标准委员会秘书长的这两本书再回答。在这两本书中,Herb采用了“问答”的方式指导你学习C++语言特性。对于每一个专题,Herb首先合理地设想出你的疑问和困惑,接着又猜测出你十有八九是错误的解答,然后给你以指点并提出最佳解决方案,最后还归纳出解决类似问题的普适性原则。
这两本书是典型的深究C++语言细节的著作,很薄,但内容密集,远远超过Scott的那两本书,读起来很费脑筋 — 我个人认为它们要比Scott的书难懂得多。若要研习这薄薄的两本书所包含的知识,至少需要花费数月的时间!(在Scott的荐序中,他坦陈不止一次陷入GotW问题的陷阱,你应该知道这意味着什么)对于语言细节的深究有什么好处呢?尽管在大多数情况下,我们不必关心C++代码幕后的动作,然而当我们不得不关心时,这两本书可以为我们提供很好的线索,因为它们揭示了C++语言中微妙而又至关重要的东西。
Stephen C. Dewhurst, C++ Gotchas: Avoiding Common Problems in Coding and Design
《C++程序设计陷阱》,中国青年出版社
Stephen的理论素养和实践经验注定这是一本值得一读的好书。Stephen曾经是贝尔实验室中第一批C++使用者。他已经使用C++成功解决了包括编译器、证券交易、电子商务以及嵌入式系统等领域中的问题。本书汇集了作者来自开发一线的99条编程真知灼见,洞悉它们,你可以避免几乎所有常见的C++设计和编程问题。
我甚至认为,对于C++编程菜鸟而言,阅读这本书会比阅读Scott和Herb的书更能轻松而立竿见影地获得更大的提高。我个人很喜欢这本书的写作风格 — Stephen的许多观点看似极端却无可辩驳。当然了,这种自信(以及冷幽默)来自于作者深厚的技术素养,而非自大的偏执。
除了上面推荐的书籍外,Dov Bulka和 David Mayhew合著的《Efficient C++: Performance Programming Techniques》(《提高C++性能的编程技术》,清华大学出版社)也值得一看。这本超薄小书聚焦于高性能C++应用程序开发。两位作者都是IBM软件专家,都工作于对性能要求极高的系统构建领域,本书是他们的经验之谈。也有人不喜欢这本书,因为它花了不少的篇幅讲述和C++无关的东西,我却恰恰因为这一点而对这本书产生好感,正是这些东西让我开阔了眼界。
模板和泛型编程
模板和基于模板的泛型编程无疑是当今发展最活跃的C++程序设计技术。模板的第一个革命性的应用是STL,它将模板技术在泛型容器和算法领域的运用展现得淋漓尽致,而Boost、Loki等现代程序库则将模板技术的潜能不断发挥到极致。在模板和泛型编程领域,我推荐以下两本重量级著作:
David Vandevoorde, Nicolai M. Josuttis, C++ Templates: The Complete Guide
《C++ Templates全览(繁体版)》,台湾碁峰资讯股份有限公司
《C++ Templates全览(简体版)》,人民邮电出版社
有一种老套的赞美一本书的手法,大致是“没有看过这本书,你就怎么怎么地”,这里面往往夸张的成分居多。不过,倘若说“没有看过《C++ Templates: The Complete Guide》,你就不可能精通C++模板编程”,那么这个论断对于世界上绝大多数C++程序员来说是成立的。
这本书填补了C++模板书籍领域由来已久的空白。此前,上有《Modern C++ Design》这样的专注于模板高级编程技术和泛型模式的著作,下有《The C++ Standard Library》这样的针对特定模板框架和组件的使用指南。然而,假如对模板机制缺乏深入的理解,你就很难“上下”自如。鉴于此,我向每一位渴望透彻理解C++模板技术的朋友推荐这本书。
这本书在内地、台湾各有一个译本,但出自不同的译者之手。当你看到这篇文章时,两个译本应该都已经上市,对于读者来说当然也就多了一种选择。侯捷先生个人网站上开放了繁体译本大部分章节,不妨先睹为快。
Andrei Alexandrescu, Modern C++ Design: Generic Programming and Design Patterns Applied
《C++设计新思维:泛型编程与设计模式之应用》,华中科技大学出版社
《C++设计新思维(影印版)》,中国电力出版社
你自认为是C++模板编程高手吗?请看过这本书再回答J 这是一本出自天才之手令人敬畏的杰作。泛型模式,无限延伸你的视野,足以挑战任何一名C++程序员的思维极限。
这本书共分为两大部分,第一部分讨论了 Loki程序库采用的基础技术以及一些高级语言特性,包括基于策略的类设计、模板局部特化、编译期断言、Typelist以及小型对象分配技术等。第二部分则着重介绍了Loki中的重要组件和泛型模式技术,包括泛化仿函数(Generalization Functor)、单件(Singleton)、智能指针、对象工厂(Object Factory)、抽象工厂(Abstract Factory)、访问者(Visitor)以及多方法(Multimethods)等。每一种技术都让人大开眼界,叹为观止。
在C++的学习方面,过犹不及往往成了不求甚解的借口。然而,面向对象并非C++的全部,模板和泛型编程亦占半壁江山。对于“严肃”的C++程序员而言,及时跟进这项早经例证的成功技术,不失为明智之举。
结语
这些著作是如此大名鼎鼎,也许根本不缺我一个推荐。然而,纵然C++程序员队伍的发展壮大速度不像其他更时髦的语言那样迅速,新人进总是多于旧人出。除了热忱地欢迎新人,我个人认为到了对C++书籍进行“盘点”的时候了,并且希望这样的“盘点”有益于感兴趣的读者。请保持耐心和宽厚。在下篇中,我将继续介绍标准库、网络编程以及其他方面的C++好书。有好书相伴,这个冬天不会冷。