windows类书的学习心得

原文地址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html

内容如下:

创建人: paul 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千,很多陌生的出版社,很多陌生的作者,很多陌生的译者,书名也是越来越夸张,什么××天精通××,精通××编程, ××宝典等等,书的印刷质量真的很好,纸张的质量也是今非昔比啊,但书的内容好象却是越来越让人失望,也许是我老了,我的思想我的观念已脱离现实社会,也许是外面的世界变化得太快,我编程数月,出去一走,路已不是原来的路……回家看着书架上的旧书发呆,听着李克勤的旧欢如梦,才发现自已原来太喜欢怀旧. 笔者从事软件开发多年,其中有两年多的时间一直是与Windows底层打交道,涉及到驱动程序,嵌入式OS,Windows应用程序(如GUI,图形图像技术,多线程,组件技术等等)等方面的开发,写了很多很的源代码……也许我的阅读面过于狭小,书架里基本上都是Jeffrey Richter,Charles Petzold,侯捷老师以及潘爱民老师的书,这些书一直陪伴着我,并给我的编程工作带来了很大的帮助,希望我的推荐对你也有帮助。 Windows编程类 Windows 程序设计(第5版)(上、下册) 原书名: Programming Windows (Fifth Edition) 原出版社:Microsoft Press 作者:(美)Charles Petzold 译者:北京博彦科技发展有限责任公司出版社:北京大学出版社出版日期:2001-03 页码:1376 定价:160:00RMB 此书被认为是Windows编程最好的导论性读本。在1994年5月,此书的作者Charles Petzold被《Window Magazine》和Microsoft公司授予”Windows Pioneer”奖,以表彰他对Microsoft Windows的成功作出的贡献,可见该书的权威性,以至于“如果对Windows开发有什么问题的话,请翻阅PetZold的著作吧”几乎成了一句至理名言。 本书覆盖了WINDOWS编程的方方面面,将windows编程的每一个元素(如输入,输出及对话框,图形,多媒体,线程,文档与视图,Internet等等)讲解得很清晰、简明,采用的大多是具有代表性的示例,代码风格好并且很有实用价值。笔者认为这本书是学习WINDOWS编程的经典入门好书,每一次的细心阅读都会对WINDOWS编程有更深刻的理解, 不过笔者认为书中讲的内容都较为基础,更深层的东西可以去看《 Windows核心编程 》。笔者建议有条件的读者,最好阅读英文原版。 Windows核心编程 原书名: Programming Applications for Microsoft Windows Fourth Edition 原出版社:Microsoft Press 作者:(美)Jeffrey Richter 译者:王建华等 出版社:机械工业出版社出版日期:2000-05 页码:689 定价:86:00RMB Jeffrey Richter 是 Windows System 程序设计的头头,他的每一本书都对 Windows 核心有很精彩的剖析,笔者从《Windows 95 程式设计指南》,《 WINDOWS 高级编程指南(第三版) 》,《 Windows核心编程 》到《 Microsoft .NET框架程序设计(修订版) 》一直阅读他写的书,可以说本本经典,阿蒙是他的崇拜者,死心踏地地追随Jeffrey Richter。 本书是讲解Windows 操作系统内部机制的专著,作者从基本概念入手,全面系统地介绍了Windows的各种基本构件,如进程、线程、DLL和内存管理等,并列举了大量应用程序,精辟地分析了构件的使用方法,为掌握Windows 编程技巧提供了一条有效的捷径。笔者写过两年的windows驱动程序, 本书的内存管理章节给我提供了很大的帮助,可见本书对内存管理讲得非常地透彻。另外本书对进程和线程的讲解也十分地经典,先说明其来龙去脉,然后描述其中的工作机制,并详细说明windows提供了哪些API函数来进行多进程与多线程的程序设计,如果能结合侯捷老师的《 Win32多线程程序设计 》一起研究的话,那你对进程与线程的理解将更有深度。 Win32多线程程序设计 作者:侯俊杰(侯捷) 出版社:华中科技大学出版社出版日期:2002-01 页码:480 定价:59 .80RMB 使用线程,你可以产生高效率的服务器,建立Internet服务器扩充软件,获得多CPU系统的好处,建立精巧的COM/OLE对象,并改善程序的反应度。 本书的第一篇“上路吧,线程”,为你建立必要的基础,包括线程的启动和结束、核心对象、激发和未激发状态的意义、同步机制及其用途。第二篇“多线程程序设计的工具与策略”,介绍C runtime函数库和MFC对线程的支持、如何在USER和GDI的限制之下施行多线程、如何产生一个DLL、如何对多线程程序调试。第三篇“真实世界中的多线程应用程序”,谈论如何组织一个程序,使它有效支持多线程。本篇示范两个真实世界中的应用软件,第一个是个freethreaded OLE automation server,第二个是 ISAPI程序,是个IIS(Internet Information Server)扩充软件,示范如何和JET数据库交谈。 本书从理论到实际应用讲得很全面及易懂,范例程序也很丰富并且具体生动,而且书里不时地在一些需要注意的地方给出一些总结性的建议,这不仅让读者倍感亲切,而且也加深了对所学内容的理解。 MFC编程类 MFC Windows程序设计(第2版) 原书名: Programming Windows with MFC Second Edition 原出版社:Microsoft Press 作者:(美)Jeff Prosise 译者:北京博彦科技发展有限公司 出版社:清华大学出版社出版日期:2001-09 页码:1166 定价:128:00RMB 本书不仅扩展了已被认为是权威的关于Microsoft 用于windows API的功能强大的C++类库的阐述,还新增了有关COM,OLE和ActiveX等内容。本书的作者,Jeff Prosise,用其无与伦比的技巧向读者讲述了MFC程序设计中的基本概念和主要技术-再次阐释了在32位windows平台上进行快速的面向对象开发的完美方法。 笔者认为本书讲解细致而且全面,比较适合初学者, 深入浅出MFC(第二版) 作者:侯俊杰(侯捷) 出版社:华中科技大学出版社出版日期:2001-01 页码:736 定价:80:00RMB 有关这本书及其作者,不用我多说,大家已非常清楚,网上也是众说纷坛。 本书分为四大篇。第一篇讲SDK编程,简单明了的概括了SDK程序设计的主要原理,提供进入MFC核心技术以及应用技术之前的所有技术基础,特别是Windows的消息机制,讲得很清楚。第二篇介绍Visual C++整合环境开发工具,对整个软体开发环境有全盘以及概观性的介绍,可以让初学者迅速了解手上掌握的工具,以及它们的主要功能。第三篇介绍application framework的观念,以及MFC骨干程序,所谓骨干程序,是指Visual C++的工具AppWizard所产生出来的程序码。根据我的了解,太多人使用 MFC 是编写程序只是知其然而不知其所以然,本篇详细解释 MFC 程式之来龙去脉,为初入 MFC 领域的读者奠定扎实的基础。第四篇以微软公司附于Visual C++光碟片上的一个范例程序Scribble为主轴,一步一步加上新的功能。并在其间深入介绍Runtime Type Information(RTTI)、Dynamic Creation、Persistence(Serialization)、Message Mapping、Command Routing等核心技术。这些技术正是其他书籍最缺乏的部分。 “初学者只需掌握它的精髓,而不需深究它的全部内容,否则很有可能你会看不懂,等你在不断学习过程中,返过来重复学习,你将会发现此书的奥秘所在”。 COM编程类 COM原理与应用 作者:潘爱民出版社:清华大学出版社出版日期:2001-03 页码:472 定价:39:00RMB 本书不仅介绍了COM的基本原理及其扩展知识,还讲述了MTS及COM+的一些知识。全书分为三部分,第一部分为COM基础,作者在写这部分内容时,参阅了“ COM技术内幕:微软组件对象模型 ”一书,但对内容结构进行了重新调整,并增加了一些关于WINDOWS程序设计和MFC方面的知识;第二部分为COM扩展,第三部分为COM应用与发展,介绍了组件化程序设计思想以及多层软件结构模型。读者在学习了COM的基本原理之后,结合MTS和COM+所倡导的一些概念,就可以从更高的层次来理解和使用COM及COM+了。 对于COM初学者来说这是一本经典的书, 它由浅到深的论述使你对COM的概念及框架有较深的理解。 COM本质论 原书名:Essential COM 作者:(美)Box,D. 译者:潘爱民出版社:中国电力出版社 出版日期:2001-08 页码:358 定价:49:00RMB 本书由具有鬼才之称的Don Box撰写,在计算机界,“没有人能把COM阐释得比Don Box更清楚”; 本书无疑是COM领域中最负有盛名的一本书。在亚马逊的排行榜上曾盘踞数月之久,很多专家给其以极高的评价。读完这本书之后,COM对于您会“变得再明白不过了”(这是“Inside OLE”的作者Kraig Brockschmidt和本书的作者DonBox在顿悟了COM和OLE之后的境界)。期望您会有这样的感受。 本书揭示了COM(组件对象模型)的本质,旨在帮助开发人员真正理解COM的为什么,而不仅限于怎么使用。书中还提供了一个完整的分布式COM应用,演示了各种编程技术。此外,本书还涉及到许多COM高级特性,例如线程模型(或者套间模型)、名字对象、连接点等,因此,要想从本书获得最大受益,您也需要有COM的知识作基础,建议读者先阅读《 COM原理与应用 》之后再阅读本书。 “ 这不是一本供新手学习的书,也不是一本教您如何开发COM组件的书,而是一本在一定的基础上继续提高对COM的理解的书。如果用它来学习COM,您可能会失望,因为许多内容需要有一定的经验基础才能看得明白;但是如果用它来加深自己对COM的理解,那么这本书再合适不过了。” 差书点评《MFC开发人员参考手册 》 本书是一本详细介绍MFC类库的工具书,它对MFC类库4.2版本中所有的类及其成员都做了比较详细的说明.笔者认为MSDN就是最好的工具,没有必要花这个冤枉钱. 学习心得 看了不少的书,也写了不少的代码,简单总结一下我的学习方法,笔者是按以下的顺序来学习的:C/C++ ――> SDK ――> MFC ――>COM/DCOM/ATL/COM+,当然这个顺序的前提是你已经具备了一定的数学,数据结构及算法,操作系统等基础知识,学好C++是很关键的,尤其要理解清楚OOP思想,养成以面向对象方法去思考问题解决问题的习惯;学习SDK的目的主要是理解Windows OS的内部机制比如内存管理,多任务及多线程等,特别要透彻地理解Windows的消息机制;有了前面的知识,学起MFC就容易了,有些网友经常与我聊,说他看了一年多的书,也写一些程序,但对MFC还是一头雾水,我想主要的原因还是学习不够系统性,很多知识及经验是循序渐进的,千万不要幻想一步登天,要有持之以恒的学习及实践精神。 Win32系统编程之四书五经 创建人:DearBook技术编辑 DearBook_Tech (感谢孟岩老师为大家提供这篇学习指南,本文发表于《程序员》11月上半月期)通常在某一个具体细分的技术领域,会自然而然地出现3-5本顶级著作,它们彼此互相配合,形成一个完整的体系。我乐于将这种现称为“四书五经现象”。本期就从Win32系统编程开始。 几年前,台湾著名技术作家侯捷先生曾经写过一篇影响很大的书评文章,叫做《MFC四大天王》。文章的意思是说在MFC的浩瀚书海中,只要认真研读和学习其中四本,就可以“五岳归来不看山”。侯先生虽以MFC为例,但是这个道理却同样适合于MFC之外的很多具体技术领域,这不能不说是一个有趣的统计现象。通常在某一个具体细分的技术领域,会自然而然地出现3-5本顶级著作,它们彼此互相配合,形成一个完整的体系。对于学习者来说,只需要认真研读这几本书,就足以升堂入室。我乐于将这种现称为“四书五经现象”。对于读者来说,如果能够找到该领域中的“四书五经”,则无论在时间上还是金钱上都是最经济的选择。好书几本,胜过烂书几捆,这个体会想必大家都有。为此,《程序员》杂志开辟了这样一个新的书评专栏,帮助读者遴选各个技术领域里的“四书五经”。本期就从Win32系统编程开始。所谓的Win32开发,就是在C语言的层面上,直接使用Win32 API开发Windows应用程序或者系统程序。虽说现在直接用Win32 API开发应用程序的人已经不多了,深入理解Windows系统程序设计原理,仍然是成为Windows开发高手的必经之路。所谓的Win32,其实是一个API规范,与UNIX系统编程接口标准POSIX是同一个性质的概念。从设计上讲,Win32绝对算不上是简洁优雅,因此学习Win32系统编程,相对来说是比较困难的。Win32来源于Win16,而Win16最初设计于1980年代中早期。设计Win16的时候,Microsoft还是一家小公司,应该说能力还有限。同时,Win16的主要目标是DOS之上GUI系统,设计上偏重GUI部分,在系统编程领域考虑不多。等到设计Win32时,微软能力增强了,有心要把Win32打造成第一流的操作系统API规范,但是已经背上了Win16的历史包袱。所以相对而言,Win32的设计实在赶不上POSIX那么简介优雅。微软在随后又先后进入了COM时代和.NET时代,每一次进步都需要继续背负以前的历史包袱,使得微软的技术体系越来越复杂。微软技术的复杂性,是微软与Java竞争中的最大弱势。而对我们程序员个人来说,无论你现在是在学习和使用最新的.NET技术,还是继续坚持COM开发模型,要克服微软技术的复杂性,必须上溯到Win32。那么Win32领域的“四书五经”是那些?我们一一道来: 1. Charles Petzold, 《 Windows 程序设计(第5版)(上、下册) 》 北京大学出版社这本是尽人皆知的Win32 API编程经典,也称为“Petzold Book”,学习Win32 API编程的人几乎都从这本书入手。这本书的优点是落墨细致,对基本概念和基本技巧的解释非常详尽,不厌其烦。同时,这本书篇幅虽然不小,但是包容的东西并不多,基本上把重点放在GUI编程上和常规编程任务上,所以能够把很多问题讲得非常透彻。通常第一次阅读这本书,都会觉得作者行文有一些罗嗦。但是日后在开发中,却会发现,这些当时觉得罗嗦的论述,都是实际工作中值得反复查阅咀嚼的宝贵资料。这就是所谓的Petzold风格,既可做tutorial,又可做reference。几年前,人民邮电出版社出版过一本Charles Calvert的《 21天学通WINDOWS 95编程(上、下册) 》,那本书的定位与“Petzold Book”相似,而且写得也非常出色,在控件编程方面的阐述甚至超过了“Petzold Book”。可惜这本书完全被“Petzold Book”的光芒所覆盖。不仅国内没有再版过,而且原出版者也彻底打消了与“Petzold Book”对抗的念头。现在仍然用Win32 API直接开发GUI的人,恐怕是少之又少,所以这本书的意义不及当年。更公允的说,Petzold Book现在最大的意义是作为Win32的入门教材。不经过它的洗礼,很难升堂入室。 2. Jeffrey Richter, 《 Windows核心编程 》第四版 机械工业出版社这本书的前三版名为Advanced Windows,第四版改名为Programming Applications for Microsoft Windows。作者在前言里还特别讲了改名的原因。但是在我看来,这本书还是叫做Advanced Windows更贴切。因为这本书虽然同样是讲Win32 API,却几乎和Petzold Book没有任何重复。初级的内容完全略过不提,GUI部分也是一带而过,全书顷力与系统编程,一上来就讲Win32核心对象,从进程到线程,从DLL到SEH,从钩子到内存管理,可以说是不避艰险,迎难而上,将最复杂最微妙的细节完整展现出来,同时配备又大量精心准备的例子,代码质量非常高超。因此,这本书从问世之日起,就成为Win32系统编程方面的圣经,作者Jeff Richter也成了Win32编程方面的绝对权威。想要学习Win32核心编程,不读这本书是无法想象的。遗憾的是,这本书的中文版翻译配不上原书的高水平,可以说是大错不多,小错不少。如果有读者要认真研读此书,可以去寻找北京大学出版社出版的影印版。这本书是Richter的代表作,也奠定了Richter世界顶级技术作家的地位。我本人非常喜欢读Richter的书,因为他的文字是写给专业人士看的,决不假装弱智,同时有相当体贴细致,非常符合我的习惯和胃口。所以通常在某个领域有了Richter的书,我就不会去看别人的书了。对于某些读者来说,Marshall Brain的Win32: System Service 3/e(中文名《深入学习:Win32系统服务开发与实例》,电子工业出版社“深入学习”系列)和Johnson Hart的Win32 System Programming 2/e(中文名《 Win32系统编程—Windows 2000应用程序开发指南(第二版) 》,中国电力出版社)都是不错的选择。两本书的论述都不如Richter深入,但是例子精当,讲解恰到好处。Brain的书覆盖面很广,例子非常有启发性,而Hart的书最适合从UNIX转到Win32的朋友。我发现自己在有空闲的时候喜欢啃Richter的书,但是在实践中需要快速学习解决方案时,反而Brain和Hart的书对我更有帮助。所以这两本书虽然不象Richter那么必须,但是也是非常实用的补充。 Petzold Book和Richter的这本书,构成一个连冠一致的系列,一般Win32学习者精读并且基本掌握这两本书的主要思想和技术,就可以称得上是Win32系统开发的专家了。如果说这两本书的弱点,主要存在两个方面。其一是两本书写作时将Win9X的开发作为一个基本出发点,因此对于Win2000平台的新特性介绍不足。特别是对于Windows 2000服务端高性能软件的开发,基本上没有涉及,很多Win32特有的机制也没有覆盖到。因此,如果想在Win32方面再上一层楼,可以考虑Jeffrey Richter的另一本书。 3. Jeffrey Richter, Programming Server-side Application for Microsoft Windows(影印版)北京大学出版社知道I/O Completion Port吗?知道如何在多CPU服务器上把机器的能力发挥到极至吗?知道如何利用Windows的logging service吗?知道如何利用WMI开发服务端程序吗?即使你是一个Win32开发高手,也许对上述问题也会感到困难。随着一般应用程序的开发逐渐转移到Java、.NET或者至少Delphi这样的RAD平台上,Win32能够完全发挥威力的最后一个角落,大概就是服务端高性能程序设计了。而如果你想在这个领域有所建树,Jeffrey Richter的这本书就不可不读。这本书几乎是这个领域里唯一的一本书,而Jeffrey Richter的实力又保证了这本书的水平达到了相当的高度。读这本书给人以震撼的快感,你会感叹,Jeffrey Richter对于Windows系统的理解竟能够达到如此深度!这本书跟上面提到的Petzold Book和《 Windows核心编程 》几乎又是零重叠,所涉及的内容都是高级技术,特别是自Windows 2000以来出现的服务器软件开发新技术。与前两本配合起来,形成了一条从基础到专家的完整链条。在当今业界,仍然使用纯Win32开发程序的开发者,又不少是在金字塔顶端的“高手”级人物。如果说Petzold Book在今天的主要意义在于教育,《 Windows核心编程 》的主要意义在于深化你对系统的理解,那么这本书中教授的知识是实实在在吃饭的家伙。因此,对于高手和有志最终成为高手的程序员来说,这本书是一本难得的经典。 Windows编程从入门到精通 创建人:某自动化公司研发部经理 shooterlily 一般计算机本科学生应该学过Pascal或C语言,如果你没接触过C++,推荐两本书,清华出版社钱能的《 C++程序设计教程 》,机械工业出版社Jesse Liberty的《 C++ 自学通 》,两本书都是先复习C语言语法再介绍C++面向对象的基本概念,国内一些大学本科采用前者作为教材,后者对C++各主要概念都有涉及,任选一本看看,总之入门最好不要选择比较难的书,如《 C++编程思想(英文版·第2版) 》,有可能会打击你的学习兴趣。有了C++的基础,可以开始接触VC,入门的一本书是《 VISUAL C++6从入门到精通 》,该书简单介绍了VC对话框应用中基本控件的使用,书名夸大其辞,入门还行,精通是远远不够,但作为没接触过VC环境的程序员来说简单易懂。 前面推荐的是几本入门书,自己的印象已经有些模糊,也许很多人会不同意我的观点,但下面列出的书目反对的人应该会少很多,因为它们基本上都是经典之作。 第二本可以看经典的清华出版社的《 Visual C++技术内幕(第四版) 》,这本书质量不错,但有点被过度的推崇了,可能和作者的英年早逝有些许关系,这本书放在这个位置阅读可能会有一部分看不懂,没关系,跳过去,以后水平提高后再回头翻一翻。 第三本推荐看华中科技出版社侯捷的《 深入浅出MFC(第二版) 》,侯捷是台湾著名的技术专家,在国内有很高的声誉,这本书可以带你理解MFC程序的生与死,以及AppWizard生成的那些该死的宏到底是什么意思。这时你应该对使用VC编程有比较明确的概念了,也许你需要对C++再做适当的充电,比如异常、模板等概念的了解,如果有人问你拷贝构造函数是什么意思,你能回答出来吗?Bruce Eckel的《 C++编程思想(英文版·第2版) 》也许在这个时候要容易看懂一些,这本书名气很大,值得一看,但个人认为也是有些言过其实,可能是翻译的原因。 如果需要解决MFC编程的一些疑惑,推荐一本书,《 MFC经典问答 》,看过之后你会后悔怎么没早点听说这本书,一些实际编程时常见的困难问题都得到了解释,这本书还可以作为日常编程的参考书。 如果感觉调试程序有些不够在行的话,建议你一定要去阅读John Robbins的《应用程序调试技术》,这本书对于调试技术讲的极好,特别有一章介绍了VC调试器的使用,如果你不知道VC调试器的Set Next Statement有何妙用的话,你应该好好读读那一章。我丝毫不吝惜对这本书的赞美之词,因为它的确很棒,我也读了两遍(当然不能连续读,又不是背书准备考试)。编写WINDOWS程序如果不会用API还是很困难的,这里推荐大家阅读Charles Petzold的《 Windows 程序设计(第5版)(上、下册) 》,北大出版社出版,这是WINDOWS编程的圣经,应该是优秀程序员必读的书,而作者也是WINDOWS编程领域的大师,看书就应该看大师的书。 你对于C++的理解和专家对于C++的理解有什么差别吗?看看Scott Meyers的《 Effective C++中文版 》和《 More Effective C++中文版 》,你会明白什么叫做差距。另外还有一本Stanley Lippman的《 C++ Primer 中文版(第三版) 》,是和Stroustrup的《The C++ Programming Language》齐名的巨著,但1000多页的大砖头可以砸死人。 当你看了上面的书感觉不错的话,那么你应该更进一步,看一看机械工业出版社出版,Jeffrey Richter的《 Windows核心编程 》,这本书也被奉为至尊,无需多言,作者也是一位大师,现在在.NET下已经修成正果,出版了最负盛名的.NET书籍《 Microsoft.NET框架程序设计(英文版) 》,成为一代宗师。唯一遗憾《 Windows核心编程 》中文版翻译的不好,甚至有将肯定语气翻译为否定语气的情况,一本书有二十个译者,翻译质量也可想而知,所以最好对照英文的电子版看。巧合的是《 Microsoft.NET框架程序设计(英文版) 》中文版的翻译也广受批评,好在清华出版社还算负责,承诺近期将推出其修订版,不过至今未果。书看到此处,你应该已经是WINDOWS编程的小高手了,技术方面已经没有什么太大的问题了,你已经有很多的实际编程经验,这时候需要补充一些设计方面的知识。编程需要培养三方面的知识,技术、算法、设计,程序员一般很注重技术,而往往对算法和设计不太在意。在做较大型的项目时,设计是尤其重要的,因为常用的算法一般可以下载到源代码或库文件直接使用,而设计却是抄袭不来的。提到设计不能不提近年来很热的一本书,Gof的《设计模式--可复用面向对象软件的基础》,的确是非常非常好的一本书,不过也许你会看得云里雾里的,没关系,先掌握一些概念,因为现在模式已经成为一门专业语言,和别人交流时直接说采用某某模式要比说一大堆话简单的多,看完后需要再补充别的一些参考书,再做些习题,设计不通过动手很难真正领悟和掌握的。 另一本与《 设计模式--可复用面向对象软件的基础 》并称“软工双雄”的书叫《重构——改善既有代码的设计(中文版)》,个人认为只要阅读前4章学习学习思想即可,当然这洗脑的作用还是值得的。还有一本网上评价很高的书,《 敏捷软件开发:原则、模式与实践 》,这本书获得SDMagazine第13届Jolt大奖,建议大家有空去读一读,本人正在学习中,感觉不错。 三本 OOP 绝佳小书 创建人:Dearbook技术编辑 DearBook_Tech 本文由侯捷先生写于2000年6月,但这篇文章的内容依然没有过时,可见这几本书都是经典之作以下是侯先生对大家的建议,希望大家能从中得到有益学习的启示:由於出版人的水平和視野的侷限,以及讀者的浮動,雖然許多經典已經出版,現在大夥兒(出版人和讀者)卻一勁兒注視新書,很大程度可說是捨近求遠。在C++/OOP 世界中,EC,MEC,TCSL,Primer,TCPL,ObjectModel,Design Patterns 幾乎可以說是必讀的,但很快地這些經典(中譯)將消失於大陸讀者眼中,而且永遠消失了(因為不能再有人去做它,除非有英文新版),非常可惜,非常可惜。能在DearBook中長久保存一些經典推?>文,有助於後學。 --------------------------------------------------------------------------------------- 拿破仑虽然是个矮个子,一生叱吒却俨然历史巨人。今天我要介绍的三本书,虽然轻薄短小有如拿破仑的身材,在 C++/OOP 领域里,其份量与影响却也有着拿破仑般的辉煌灿烂。 说它们轻薄短小,是的,让数字说话:三本书合起来才256+318+208=782 页,只比 C++ 语言知名教本 《 C++ Primer 中文版(第三版) 》一半篇幅再多一些而已,比起 C++ 语言权威着作《 C++程序设计语言(特别版) 》也才达到三分之二的页数份量。逛书店时一个不留神,只怕你便遗漏了这些小书的存在。但如果你真遗漏了它们的存在,实在是你的莫大损失。 就我个人的编程经验,以及我的教学经验(对象为业界工程师或大学生),只要是 C++/OOP 设计思维与语言运用本身的问题,非关 problem domain,百分之九十以上皆可在这三本书籍中找到直接或间接的答案。这三本书是: ●《 Effective C++中文版 》: 50 Specific Ways to Improve Your Programs and Designs ●《 More Effective C++中文版 》 : 35 New Ways to Improve Your Programs and Designs ●《 Exceptional C++中文版 》 : 47 Engineering Puzzles, Programming Problems, and Solutions (《 More Exceptional C++ 中文版 》也已出版)(注:前两本书亦有 CD 产品(HTML 格式),以两书合一的方式出售,交叉索引甚为方便) 书名副标清楚告诉我们,这些书籍的特色就是以一个个的条款来说明一些值得奉行或是必须避免的动作。以条款的方式进行,一方面因为它们都不是 C++ 语言教本,而是更高层次的书籍,是给有语言基础(最好还有实际工作经验)的人看的书,所以可以集中火力在特定主题上,另一方面实乃因为条款型式可以强化主题,加深印象,提升查阅检索的方便性与价值。 书中某些条款在 C++ 语言书籍里或多或少也都有提到 ─ 虽然解释的深度可能不足。我举个例子,《 Effective C++中文版 》 的条款13说「Initialization list 中的 members 初始化排列次序应该和其在 class 内的宣告次序相同」,《 C++ Primer 中文版(第三版) 》 的 p721~p722 对此有相同意义的描述。再举个例子,《 Effective C++中文版 》 的条款14说「总是让 base class 拥有 virtual destructor」,这在《 C++ Primer 中文版(第三版) 》的 p933 亦有相同意义的描述。诸如此类,不胜枚举。但你是不是感觉,那些金科玉律被淹没在语言百科型书籍的细节丛林之中! 每一条准则都简短、明确、容易记忆,可以确实提升你的软体效能。每一条准则都是经验丰富的 C++ 程式员的心血结晶,告诉你哪些是几乎总是需要奉行的动作,哪些是几乎肯定要避免的事情。某些条款甚至到达 patterns 的水准(注)。 注:所谓 patterns,在指程式设计过程中,开发人员常需面对并解决的某些问题,被有系统地整理出解法,谓之 patterns(或译为「样式」)。《 设计模式--可复用面向对象软件的基础 》是此域中的经典书籍,系统化地将可应用於众多领域之 23 个基本 patterns 加以分类整理。书中所提的 patterns 名称,几乎成为物件导向设计领域的标准辞汇。 以上三本小书的功用不仅在提纲契领地点出重点,也在於对每个主题有深刻的讨论。在这些书籍中,你会发现一些忠告,告诉你应该做些什麽,为什麽如此;也告诉你不应该做些什麽,又为什麽如此。基本而言当然 whys 比 whats 更重要,这便是这些书籍最有价值的地方。至於从速食的角度来看,检阅一系列准则,也比强记一或二本庞杂的教科书更轻松方便得多。 以上三本小书的功用不仅在提纲契领地点出重点,也在於对每个主题有深刻的讨论。在这些书籍中,你会发现一些忠告,告诉你应该做些什麽,为什麽如此;也告诉你不应该做些什麽,又为什麽如此。基本而言当然 whys 比 whats 更重要,这便是这些书籍最有价值的地方。至於从速食的角度来看,检阅一系列准则,也比强记一或二本庞杂的教科书更轻松方便得多。 1.Effective C++ 2/e 《 Effective C++中文版 》 Scott Meyers 的这本书籍,成名已久,同时也是此类书籍的滥觞。这本书在 1992 年便有了第一版,我手上的第一版是 1996/12 的第 12 刷。刷次原不能代表什麽,不过我在第二版的封底看到,出版公司宣称第一版销售超过十万本(不含各种译本)。销售量能否代表什麽呢?销售量低或许不一定能代表什麽,销售量高则相当程度地表示受到读者的肯定。以此书诉求之技术层面而言,这个销售量是惊人的。(当然要是比起大陆某 C 语言书籍销售270 万本,以及某 Visual Basic 书籍销售破千万本,那是小巫见大巫了) 只要是在 C++ 领域里打滚的程式员,马上便可以从 Meyers 整理出来的 50 个条款看出此书的价值。如果你拿 C++ 来讨生活,稍稍阅读几个条款的深度後,不掏腰包者几稀。有些条款涉及的语意层面较低,用以对容易出错或混淆的数种程式写法提出警告。另有一些条款涉及的层次比较高,如第六章中对於各种继承型式的讨论、以及 classes 之间除了继承以外的其他关系的讨论。至於条款E45「知道 C++ 编译器默默为我们完成和呼叫哪些函式」,以及条款M24「了解 virtual functions、multiple inheritance、virtual base classes、RTTI 所需的成本」,下涉物件模型与编译器层面,相当深入。套用我在「C++ 的沉迷与爱恋」一文中的用辞,此书在高热和骤冷之间,在高阶和低阶之间 炼、循环、震荡。 2.More Effective C++ 《 More Effective C++中文版 》继 《 Effective C++中文版 》 之後,Scott Meyers 於 1996 推出这本「续集」。条款变得比较少,页数倒是多了一些,原因是这次选材比「第一集」更高阶,尤其是第五章。Meyers 将此章命名为技术(Techniques),并明白告诉你,其中都是一些 patterns,例如 virtual ctors、smart pointers、reference counting、proxy classes,double dispatching┅等等。这一章的每个条款篇幅都在 15~30 页之谱,实在让人有「山穷水尽疑无路,柳暗花明又一村」之叹。 虽然出版年代稍嫌久远,本书并没有第二版,原因是当其出版之时(1996),C++ Standard 已经几乎定案,本书即依当时的标准草案而写。其间与现今之 C++ 标准规格几乎相同。可能变化的几个弹性之处,Meyers 也都有所说明与提示。读者可以连结作者提供的网址,看看上下两集的勘误与讨论(数量之多,令人惊恐。幸好多是技术讨论或文字斟酌,并没有什麽重大误失)。 3.Exceptional C++ 《 Exceptional C++中文版 》,《 More Exceptional C++ 中文版 》相较於前两本威名远播的老大哥,这本小书不但资历浅,作者也似乎不是那麽有名。真的不那麽有名吗?未必,这要看你熟悉哪个领域,在哪个领域活动而定。本书内容源自极受欢迎的 C++ 网际网路节目 Guru of the Week,作者Herb Sutter 正是这个网路节目的创办者,同时也是C++ Report 的专栏作家,以及网际网路讨论群 comp.lang.c++.moderated 的创始主持人。 本书的一个最大特色是,以实例进行的方式,告诉你如何以标准 C++ 进行软体工程。书中所列的实例,有些是棘手的 C++/OOP 疑难杂症,有些展示稳健强固且具扩充性的程式码。只需数分钟时间,你便可以拿书中一些 C++ 设计问题和实作问题来挑战自己并且获得乐趣(是的,每个问题都有一个难度评分)。 每一个实例,都可以测验你的观念正确与否。书中许多主题与《 Effective C++中文版 》 和 《 More Effective C++中文版 》 的条款相互辉映,一个实例之中可能隐含了 Meyers 两本书的数个条款的运用。顺带一提,这本书有老大哥 Scott Meyers 写序推荐。 ●结语 理论与实务的结合,是每一位资讯从业人员希望达到的目标。过多的照本宣科,过少的实务经验(真正有价值的实务经验),却是目前资讯相关书籍的普遍写照。 《 Effective C++中文版 》,《 More Effective C++中文版 》 , 和《 Exceptional C++中文版 》(以及《 More Exceptional C++ 中文版 》),这三本书不仅在实务面上提出极为宝贵的准则,并以丰富而扎实的理论基础,深入解释每一条准则背後的来龙去脉。可以相当程度地提升你的 C++ 程式技术与 OO 设计思维。 着名的语言专家 Benjamin Whorf 曾说:『语言可以塑造人类思考的方式,并决定人类思考的内容』。使用 C++ 语言,绝不仅只於使用 C++ 编译器(很多人确是如此 ─ 虽然他们不自觉);重要的是运用隐含於语意之中的物件导向(Object Oriented)观念与泛型(Genericity)观念,在软体设计阶段便创造出一个有弹性、易修改、适用未来时态的架构。 对於物件导向领域的生手,这三本书可以给你一个震憾教育,让你知道过去的写作是多麽地不严谨、观念是多麽地不成熟。或许这套书会促使很多自以为是的读者谦卑地认知自我的不足,并谦卑地终於知道什麽是井蛙、河鱼和燕雀。 至於物件导向个中老手,是的,这三本书为你整理出多年打滚所获的宝贵心得,佐以深度的学理探讨,必然让你有相见恨晚之叹。 《程序员》推荐三味书斋——OO篇 创建人: 《程序员》 主持人:熊节(透明):《程序员》杂志社技术编辑,C-View成员。嘉 宾:孟岩(梦魇):联想公司掌上设备事业部应用开发处任职,C-View成员。与侯捷先生合译了《C++ Standard Library》一书。王昕(痴人),C-View成员,《The C++ Standard Template Library》译者。 透明:对于面向对象,UML应该是第一要素。自然语言有着极大的不精确性,维特根斯坦认为这种不精确性是一切哲学问题的根源。如果要用自然语言来描述一个软件系统,这种不精确性也会给软件工程师之间的交流带来巨大的麻烦。UML的价值就在于:它比较精确,并且比较形象直观,对于促进开发者之间的交流是很有好处的。 梦魇:我目前还没有系统地学习过UML。在目前的OO领域,UML确实具有标准语言的地位,虽然这并不意味着它就没有缺点和错误,但是有一种标准语言,总比大家自说自话,老死不相往来要强得多。不过在我看来,它最重要的意义也就在于它是公认的标准,大家以它为共同语言进行交流。这并不等同于说UML就是OO,或者不懂UML便不懂OO。 UML是不是OO的核心或者第一要素,我持怀疑态度。我也很怀疑,那些只会画UML图,并自命为“架构师”的人,究竟能否真正设计出精致的系统。 痴人:其实我对于UML现在已经没有什么感觉了,说到底,UML只是一种工具,所谓的OO还是只能存在于开发人员自己的脑袋中。只是为了沟通上的需要,有UML这么一个标准的工具会方便很多。从其他方面来说,只要大家都愿意并且可以很好的交流,直接用代码来沟通也不是一个很坏的主意。 透明:其实我从来都没有认真学过UML,只看过一本《UML参考手册》,是汪颖翻译的电子版。在做项目、写文章、译书的时候,对UML有什么不懂的,就到那本参考手册里面去查查,慢慢也就熟悉了。不过这种学习方式的缺点就是:自己不太用的feature就总也掌握不好。比如用例,我到现在都不太明白。如果是想认真学UML,机械工业出版社的三本书《UML参考手册》、《UML用户指南》和《UML和模式应用》就足够了。《UML和模式应用》这本书,其实应该叫《UML实例分析》比较合适,很适合面向对象和UML的初学者练手用。 前一阵网上吵架,有人捧UML也有人骂UML,其实UML就是一种语言而已,它对于软件开发者的意义基本上就等于黑板和粉笔对于教师的意义。无论用UML做出了好的系统还是坏的系统,难道跟UML有关系吗?我向面向对象的初学者建议学UML,仅仅因为它是最流行的建模语言,不掌握它就无法和别人沟通。 梦魇:我对于UML的书没有太多了解,虽然也买了几本,但是看上去总觉得索然无味。我曾经怀疑我天生不喜欢用图形来表达设计思想,因为相比代码而言,那些图形似乎总显得不够具体生动,形象模糊。我总是担心一个设计方案蒙着面纱的时候像是绝色的美女,除掉面纱却是千疮百孔。有些早期的介绍性书籍甚至给我造成很大的误导。比如我在相当长的时间里,一直以为用例跟用例图是一回事,因此非常怀疑那些简单的图形究竟能在需求分析中发挥什么了不起的作用?直到不久之前才知道,真正的用例是要写的。说起来,是Craig Larman的Applying UML and Patterns使我对UML第一次有了亲切感,也在一定程度上认可了UML的价值。不过我现在还没有开始运用它,所以不想、也没这个能力就这个问题多说什么。 痴人:国内出的几本UML的书籍我也买了,但基本都没有看完。我的UML知识是用了一周从Rational的CD tutorial中学到的(可在Rational Suite的CD2中找到),另外就是我问Rational要到的Inside UML的CD-ROM。通过那些图文并茂的tutorial,我觉得学习的效果还是不错的。对于OO,我曾经从china-pub上面拍卖到一本小书,叫Object Technology:A Manager's Guide,觉得里面的叙述算是比较清楚的。薄薄的一本书(含index两百多页),内容涵盖了对象技术的基本思想、对象技术的重要概念、面向对象数据库、对象技术在企业中的实施等等方面。作为帮助初学者的入门手册、开发者的速查手册都不错。如果有机会,希望国内的出版社可以考虑引进该书。 透明:我非常同意孟岩的说法。这让我想起维特根斯坦在《逻辑哲学论》里举的一个例子:我们可以在几何图象中描绘出不符合空间规律的情景,但无法在空间图象中描绘不符合空间规律的情景。或者换句话说:UML能画的,OO语言未必能实现,实现了也未必就很好。因为UML和C++、Java,毕竟是完全不同的语言。 并且,我一直认为自己是个程序员,所以我更关心“程序员的面向对象”,或者叫面向对象程序设计。当你要用C++或者Java来实现面向对象的时候,那跟用UML画图还是大不一样的。我记得以前看过机械工业出版社的一本《 软件工程-Java语言实现(英文版,第4版) 》,觉得是很好的教科书。而且Java天生就适合用来做面向对象的教学语言,它的语义是smalltalk那一派的,描述从smalltalk发展来的“传统面向对象”得心应手。 痴人:在我看来,OO只是一种程序开发中的抽象方式,不过它恰好是现阶段我们所能接受并认为是最好的一种抽象方式罢了。为了开发中的需要,才会有从基本的OO中整理出来的Refactorings、Patterns等。但我们应该认识到:这都不是本质,只有程序的抽象程度、弹性、可维护性等特性才是我们应该关注的。为此,我对OOSC(Object-Oriented Software Construction, 2nd Edition,清华大学出版社1999年影印版)一直都赞美有加,不是因为它在OO书籍中的Bible地位(说实话,它太厚了,以至于我每次都没有信心把它看完——事实上我也没有看完它),而是它第一章就讲了Software Quality,让我对于程序的本质有了更多的了解。对于Design Pattern,我觉得它们不能代表OO的本质,只是OO中的一个分支,用于改善程序中的OO状态而已,没有必要把它们等同于OO。 另外,也有人喜欢把OO分为OOA/OOD/OOP,对于Analysis,由于以前所做项目的因素,我不是很熟悉,不好乱说。但OOD并不能等同于某些所谓的“架构师”用Rose、Together、Visio等工具画出来的UML图形。有时候,一些在图形中看起来很好的设计,在转化为代码时往往会碰到麻烦,所以我一般都喜欢用代码辅助图形来进行我的设计。 至于OOP,我觉得它应该是和OOD结合的非常紧密的一个步骤,没有很多好说的(毕竟程序和设计绝对是一个硬币的两面,我们无法把它们很好地区分开来)。 梦魇:提到OOSC的地位,我举双手赞成王昕的观点。我认为Bertrand Meyer以及他所代表的Eiffel流派对对象技术理解是最深刻的。十几年来,他们在整个OO技术界一直处于支流,这不能不说是一件令人遗憾的事情。我认为,如果Eiffel及其所倡导的Design By Contract理念一开始就被人重视,那么整个90年代软件工程的发展格局可能都会不一样。另外,从语言本身来说,Eiffel也是非常出色的,我觉得无论将来想不想用这种语言开发项目,认真的学习一次是大有意义的。 OOSC我正在看,里面有不少令人耳目一新的观点,初读起来觉得诧异,细细想来却觉得本该如此。比如把command和query区别对待的观点,所谓访问形式一致性原则(Unified Access Principle),等等,都令人有拨云见日的感觉。 Eiffel的立足点是可扩展性、可复用性和可靠性。我记得前不久我们在一起讨论,这几个目标正是令我们困扰的东西。真的能编写可复用的组件吗?测试难道是保证软件质量的唯一手段吗?是不是面向对象发展到今天,都一直达不到这几个目标,最后只能给所谓的“面向组件”技术当垫脚石呢?读了OOSC,很多疑惑豁然开朗,信心又回来了。 痴人:刚才说过,对于OOSC,我最prefer的还是第一章“Software quality”。我们一直讲“软件质量”,但是对于“软件质量究竟是什么”这个问题,甚至很少正式解决过。在这一章里面,对影响软件质量的外部因素(例如正确性、坚固性、可扩展性、兼容性、效率等等)和内部因素(模块化、代码可读性等等)提出了明确的定义。我觉得,这一章说出了软件质量的本质。这些东西,是“如何提高软件质量”的先决条件。 透明:不知道你们有没有看到裘宗燕教授翻译的一本叫做《从规范出发的程序设计》?王昕恐怕应该好好读一读这本书。中信出版社的。痴人:这是怎样的一本书? 透明:第一次看到Design by Contract,是在网上的一篇文章,觉不出有多大的价值;第二次看是在OOSC,觉得的确有价值,对于解决所谓“软件危机”大有帮助。我刚翻译的《最后期限》里面就有一句比较经典的话:软件模块很不容易出错,即使出错也会被程序员发现;软件的错误总是在模块与模块之间的交流上。而Design by Contract很大地帮助了程序员之间、模块之间的交流。 然后就看到裘教授那本《从规范出发的程序设计》。看完以后,只有一个想法:为什么Design by Contract会一直没有受到重视?我甚至觉得Design by Contract应该是天经地义的,我们使用的OO语言才是一种非常冒险的做法。按照裘教授那本书的理论,程序设计是一个规范逐步精化的过程。你首先必须确定一个规范是可行的,然后确定对这个规范的精化的过程是可行的,这样才能得到合法的程序。而在我们使用的OO语言(例如C++、Java)中,并没有证明一个规范是否合法,换句话说,我们并没有保证client以合法的方式来调用我们的模块、使用我们的返回值。我们只把这些要求写在文档里,天知道client会不会按照文档来做?恶魔前几天问我“如何证明面向对象的科学性”,我想他的迷惑也有这个原因。 痴人:那么,裘教授这本书给出了规范合法性和精化过程合法性的形式化证明吗?如果是这样,那么这本书就定义了一种严格的、不依赖于任何特定语言的程序开发方法,对于软件开发的理论倒是很有价值的。 透明:正是这样。不过,这本书里面几乎全是逻辑代数,读起来非常吃力。裘教授译书的态度、治学的态度都极其认真,这本书的质量是非常高的。 梦魇:我想从更一般的意义上来谈谈我对于Contract在软件系统中重要性的认识。首先问一个问题,我们为什么要使用对象技术?大家都会回答说,因为系统规模大到一定程度,随着需求变化的振荡性影响越来越大,结构化的方法已经不能适应需求。我想问一句,为什么结构化的方法就行不通了呢?我们用结构化的方法做了很多事情,现今大部分机器和工业产品是用自顶向下的分析思想构造的。象三峡大坝那样的工程,难道它的复杂程度不高、规模不大吗?为什么结构化方法运用于软件,就不行了呢? 痴人:你是想说“依赖倒置原则”吧?结构化系统中,底层模块依赖于上层模块。Robert Martin在Designing Object-Oriented C++ Applications中提到过。 梦魇:差不多是这个意思。我看到的每本软件工程的书,都试图解答这个问题,有的说是因为软件太容易抽象了,有的说是人们对软件重要性的重视不够,各种观点都有。但是我认为,那些都是次要的,最重要的原因是,自顶向下的软件设计方法真正蕴藏的是一种集权的思想。按面向对象的行话来说,在结构化程序中有那么一个god object,掌控一切,从你这个模块的生死大权,到你的生存行为模式,你的内部组织形式,这个god object无不了如指掌,它统揽一切,随时可以以至高无上的身份干涉各个模块的行为。也正因为如此,它承担了沉重的职责。 软件作为一种工业产品,其质量的要求迫使这个god object必须完美地管理它的臣民,更重要的是,它必须对底层模块的变化作出正确的反应,也就是说,这个god object必须是一个真正“好”的统治者,一个真正的公仆,要对底层模块作出反应,也要对它的客户负责。它不能高高在上,作威作福,而必须事必躬亲,兢兢业业。我们看到了,在规模相对较小的系统里,这个工作是可以达成的,而且可以达成的很好——只要我们有良好的、甚至是天才的设计,即便我们粗暴地限制了下层模块的自由,一样可以让他们运作地井井有条。透明:哈耶克在《通往奴役之路》里面可是批判了这种集权的。不过,人类社会是个非线性系统,集权导致失控的可能性比较大。而图灵机是线性系统,其中会出现混沌效应吗? 梦魇:虽然我对于非线性系统一无所知,但是我怀疑,软件系统实际上也存在着所谓的混沌效应,毕竟软件是由人开发的。也就是说,可能在这个模块里有一只蝴蝶扇了一下翅膀,而在另一个模块里就会引起一场风暴。 因此,当软件系统的规模大到一定程度,这个god object就不堪重负了。在这种情况下,就像社会学家们所说的,不管某个设计者自己是否有能力来统揽一切,为别的模块计划和指导一切,单单认为自己有这个能力和权力,这种自负就已经是足够危险和荒谬的了。 痴人:没错,结构化程序的问题就在这里。正是因为这个原因,软件业中才会有所谓“软件蓝领”的说法。也正是因为这个原因,结构化方法才屡屡遭到失败。尤其是在需求变化比较快的时候。 梦魇:所以,软件工程界提出来decentralize的思想,取消这个虽然忠于职守,但已经无法支撑的god object,让各个模块变成各自独立的、有有限自主权和自由的对象。把树状的、自上而下、阶级森严的结构形式捣毁,改制为图化的、模块化的、平等的、友好的、协作的联盟或联邦式对象结构形式。让整个软件系统的对象之间彼此互相合作,完成工作。谁都无法否认,这一进步在思想上是非常伟大的。可是存在一个问题,谁来保证各个模块以合法的、合理的秩序进行协作?没有了god object,谁来做这件事?自由不是绝对的,自由的个体需要契约来维系协作的有效性。即使你能够通过有效的职责分配把一个系统的复杂程度从不受控的非线性转化为稳定的线性系统,个别不守规矩的对象仍然可以导致整个系统的失败。 透明:对了,你们是否还记得以前我转贴过几篇文章,叫“OO,OO以后,及其极限”?在那篇文章里,作者从维特根斯坦的哲学推测:“面向对象(OO)之后是面向事实(FO)”。所谓“面向事实”,我还无法想象到。但维特根斯坦说过:“……事实,就是诸事态的存在。事态是对象的结合。”Design by Contract为我们提供了一种可行的结合对象的方式,应该说是在OO之上的一大进步。 梦魇:你说得对。未来人们怎么解决这个问题,我不知道。但是今天,最理智的答案就是Design By Contract。因此,跟你一样,我现在认为,DbC不是面向对象的可选属性,而是必备属性。是契约把这个自由协作对象群体区别于无政府主义的混乱对象群体。不管你用C++、Java还是别的任何面向对象语言进行开发,契约都是存在的。只不过Eiffel把它显现出来,并且把它放在系统构造的核心位置上。这同样具有伟大的意义。 《程序员》推荐C++ 图书三人谈 创建人: 《程序员》 主持人:熊节(透明),《程序员》杂志编辑,C-View成员嘉 宾:孟岩(梦魇),联想公司掌上设备事业部应用开发处任职,C-View成员。与侯捷先生合译了《C++ Standard Library》一书金尹(恶魔),上海天宇公司CTO,在《程序员》连载有“自由与繁荣的国度”系列文章 透明:“学C++用哪本书入门”,这是被问得最多的一个问题。但是哪一本书是最好的入门书?似乎很难找到答案。《C++ Primer》太厚,《Effective C++》对读者要求比较高,《Essential C++》又常常被批评为“太浅”。其实说穿了:no silver bullet。想从一本书学会C++,那是不可能的。有朋友问我如何学C++,我会建议他先去找本数据结构书,把里面的习题全部用C++做一遍,然后再去看《Effective C++》。myan经常说“要在学习初期养成好习惯”,我对此颇不以为然。个人认为,《Essential C++》适合作教材,《C++ Primer》适合作参考书,《Effective C++》适合作课外读物。 恶魔:很后悔当初买了《C++ Primer》。因为从我个人角度来看,它的功能效用基本是和《The C++ Programming Language》重合。当然对于入门来说,它还是很不错的。但是《C++ Primer》太厚,一来导致看书极其不方便,二来系统学习需要花比较长的时间。对于目前这个越来越快餐化的时代来说,的确有很多不适合的地方,不过可以作为初学者的参考书。现在我以一块K3 CPU的代价把它借给了别人,希望我那位同事能够从中得到一些益处。如果已经具备了C基础,我建议看国内的书,例如钱能的《 C++大学教程(第二版) 》。(如果没有C的基础还是看谭浩强的C语言)。这本书对C讲得还算比较清晰,有很多习题值得一做,特别是最后的struct和union两个部分。其中的一些算法比较拖沓和繁琐(比如树和链表的遍历算法),读者可以尝试修改这些例子,作为最后对C语言的一些总结测试。 梦魇:这个问题让我想起四五年前的情形。今天对于C++有一点认识的人,多半是从那几年就开始学C++了。那时根本没有品牌观念。从书店里找一本C++书,如果看着还算明白,就买下来。我记得那时候宛延?>、张国锋、麦中凡教授的书都受到很高的赞誉。我个人最早的一本C++书是Greg Perry的一本书,今天想起来,其实是一本打着C++旗号的C语言教程。对我作用最大的一本书是国防科技出版社出版的一本书,书名记不得了,作者叫斯蒂芬·布莱哈。透明:还记得以前曾批评过一本C++书,是北航出的,整本书就没有出现过class关键字。那本书,说穿了其实只是介绍了C语言和iostream库的用法,根本不能算C++。而当时我常常推荐的一本书是电子科技大学张松梅老师的C++教程。那本书,直到今天来看也没有太大的问题,唯一的缺憾就是由于年代久远,许多东西已经过时了。而对于一本技术书籍来说,“过时”是最不可接受的。总体来说,那时使用C++的人真是在“盲人摸象”。不过这也有好处,就是对C++的很多细节能搞清楚,以后看到经典好书时比较容易理解;当然坏处就是概念不清,甚至都不知道C++和Visual C++、Borland C++到底有什么不一样。 梦魇:整个90年代,其实大部分人对于C++的认识都似是而非。一开始是等同于Borland C++,后来是等同于Visual C++和MFC。所以一般来说,打着BC和VC旗号的书卖得很好,人们觉得这就是C++。而我比较幸运,布莱哈的那本书虽然从现在的眼光来看谈不上高超,但基本路子是对的。可能是因为原书是给UNIX程序员的培训教材,所以没有让我一开始就形成“C++ == VC++”的认识。其实一直到1996年,我们那里搞计算机的都是唯Borland C++马首是瞻的,到了VC 4.0出来,一下子格局全变了。1997年VC5推出之后,书店里MFC书铺天盖地,学MFC的人,头抬得都比别人高一些。不过现在看来,那时候大部分的MFC书都是三流货色。我曾经有一段时间认为,那一批程序员中间有不少被误导了。根本原因就是相对的封闭。 透明:我觉得一本书的价值有两方面:第一,教给你实用的技术;第二,促使你去思考。对于一本介绍VC(或者说MFC)使用方法的书,我根本不希望它能促使我有什么思考,所以我就一定要求它在技术上精益求精完美无瑕。我刚开始用VC的时候,买的第一本书就是潘爱民老师翻译的《VC技术内幕》(第四版),没有受到那些“三流货色”的误导,应该说是很幸运的。 梦魇:1999年机械工业出版社开始出版“计算机科学丛书”,其中的《Thinking in C++》第一版受到了广泛的欢迎。其实我一直不认为这本书很出色,虽然拿过一次大奖。然而我们都得承认,这本书在C++书籍领域里第一次建立了品牌观念,很多初学者开始知道,不是随便买哪一本都一样的。再往后就是2000年的《 深入浅出MFC(第二版) 》第二版,以及侯先生在《程序员》上发表的那一篇《C++/OOP大系》,加上整个大环境的变化,品牌观念深入人心,C++书籍市场终于开始逐渐与世界同步。回想往事,我的感觉是,那个需要战战兢兢选择入门书的时代已经过去,今天的C++初学者,大可以放心地买口碑好、自己读起来思路顺畅的书,入门不再是太大的问题。还有一些程序员已经学了几年C++,但看到今天出版的一些新书,感觉比较陌生,这也不是什么问题。侯先生经常说“凡走过必留下足迹”,所谓“走弯路”,未必不是一件好事。至于具体的推荐表,就不好一概而论了。总之在我的印象里,《Essential C++》、《C++ Primer》、钱能教授的C++教程,都不错。甚至有人一上来就看Bjarne Stroustrup的《The C++ Programming Language》,只要他喜欢,也没什么不可以。 透明:我同意你的观点。不管怎么说,编程是门实践性非常强的学问。要想对C++对象模型有深入的了解,最好的办法就是写一串程序去看结果;要想学会OOP,也只能从项目中学。对于初学者,最好的学习方法就是不停地写程序,写真正有用的程序,写到有问题的时候就去查书,于是自然就会知道哪本书好哪本书不好。不过我们的教育制度能不能让大学里的学生们有这样的学习机会,我表示怀疑。以我的经验,学C++有两个门槛:入门和使用。完全看不懂C++,这是一个门槛,但是只要有一本合适的入门书,很快就能跨过。要想真正用上C++,却不是件很容易的事情。尤其对于学生来说,接触到的东西多是“玩具”,很难有实战的机会。所以经常看见有人问“C++到底能做什么”,这是C++学习中一个比较麻烦的问题。我们都是做了相当长时间的C++程序之后才看到一些真正经典的书,也正是因为走了相当长的弯路之后才知道这些书的经典之所在。所谓弯路,我想也是一种必须的积累。就算一开始就看《Essential C++》和《C++ Primer》,没有两三年的时间恐怕还是难有所得。 恶魔:有两句十分有道理的话,一是我大学的C语言老师说的“写程序不如说是抄程序”,另一句是一网友说的“好的设计来自借鉴,天才的设计来自剽窃”。对于我这个理性批判主义者来说,这两句话的确不太适合。但是无论从哪个角度来讲,对于初学者来说,剽窃大师的作品是通向成功的最快捷径。我个人认为,对于C++的初学者来说,首先要确定自己专业领域内主要使用的特性的方向。因为C++的特性如此众多,初学者想贪多基本是不可能成功的。C++的编程范式基本可以分为ADT+PP、GP和OO三个方向。对于ADT+PP范式来说,初学者的主要问题不是学习C++,而是学习C的使用。对于这样的初学者,国内的几本书还是写得比较清楚,符合中国人的习惯,比如谭浩强的《C语言教程》、钱能的《C++语言大学教程》。这两本书我首推第一本,因为这一本我潜心研究了一年,这本书当中很多程序是可以剽窃的,而且可以对这些程序进行加工和提升。比如结构这一章中,它所给出的用struct来实现链表、二叉树的算法是相当蹩脚的。学习ADT+PP的初学者将这本书揣摩透以后可以尝试修改这两个程序。另外这本书的第二版稍微涉及了一些关于“类”的内容。学习ADT+PP的初学者,可以不被OO中的一些专有特性扰乱自己的思路,对于类层次扁平、无继承、无多态的程序编写是有很大好处的。 透明:你好象比较推崇国内教授写的书。现在社会上有种不好的风气:一捧就捧上天,一贬就贬下地。就好象对待谭教授的书,前几年是奉为经典,这几年又有很多人使劲批评。学C++更是有点“崇洋媚外”,总是觉得初学就应该看《Essential C++》。我看这种观点也是片面的。 恶魔:当然《Essential C++》也值得看看。但是我个人觉得这本书没有谭浩强的《C语言教程》来得好。主要原因是:第一,C++的所有特性都点到了,但是不深,看了以后会三心二意没有方向;第二,可以抄袭借鉴的例子太少。《C语言教程》中有很多有趣的问题,比如猴子吃桃、汉诺塔等等,这些例子对于刚刚涉及C/C++语言编程的人来说是学习编程很好的例子。《Essential C++》只能是前两本书看透以后,作为学习C++特性的一个过渡性的书籍。让读者真正领略到什么是C++的编程、和C编程的不同点在哪里。 透明:我发现一个很有趣的现象:初学者往往喜欢问“哪本书比较好”,这让我很是不解。这有点像一个刚学打篮球的人问“王治郅和科比谁比较厉害”。当然科比更厉害一些。但如果你是想学打篮球,这两个人都非常非常有资格教你,你跟谁学都能学得很强——关键不是在于你选哪个老师,而是在于你自己用多少功夫去学。 透明:回到原来话题。学会了C++的语法,能看懂C++代码之后,必须有些书来指导进阶(或者叫指点迷津)。我觉得《设计模式》很好,能够让读者看到一些精妙的用法。不过正如我经常说的,模式带来的麻烦和好处一样多,甚至麻烦还要更多。而且,C++本身的问题使得在C++中使用GoF模式愈加麻烦。 梦魇:《Design Patterns》这本书绝对是不可以没有的,而且中英文版都不可少。最初我看中文版,说实话看不懂,但是也不觉得人家翻译得不好,所以就想,大概是原文就很难懂,加上自己水平有限。于是总是想着再找几本patterns的书来看。后来找到几本书,口碑还不错,不过水平高下,一比就出来了,还是那本《Design Patterns》最经典,最耐看。英文版出来之后,两个版本对照看,明白多了。现在觉得,其实就设计模式来讲,把这本看明白了就很不错了,不用再花费很多心思找其他的书。我现在的包里始终夹着这本书,随身携带,有备无患。至于说设计模式的副作用,和可能带来的弊端,我的体会也挺多。不过是这样,我们想一想,究竟什么情况下设计模式可以用得很好呢?一种是有经验丰富的人引导,比如要是Robert Martin带队,你在某个地方用错了设计模式,他就会指出来,说这里不对,将来会产生什么样的弊端。对于他来说,丰富的实践经验足以支持他进行“预测型”设计。但是大部分人没这个能力,因此我们只好走第二条路和第三条路,就是“试探型”设计和“重构型”设计。遇到一个问题,你觉得用某种模式挺合适的,就大胆地用了,成功是积累经验,发现不好,出了问题了,只好改回来,那也是积累教训。这叫做“试探型”。至于重构,应该算是最有组织、成功率最高的工程化方法。先把问题“quick and dirty”地解决了,所有的暗礁都暴露出来,然后再根据实际情况采用合适的模式优化设计。现在XP和UP都高度重视refactory,UP在Elaboration和Construction阶段都鼓励抽出专门的iterations进行重构。所以说如果组织快速的软件开发,当然比较倾向于这条路——打成功率嘛。 透明:讲到重构,我顺便说说《Refactoring》这本书的影响。从工程本身的角度来说,你所谓的“重构型设计”是没有什么问题的。但中国的开发者(也包括我在内)往往比较冲动,比较容易相信银弹的存在。曾经有那么一段时间,我在Java中尝试过了重构的方法之后,又拿到C++中去尝试。结果发现,在Java中速度非常快的重构过程,到C++中就被减慢了。究其原因,就是因为C++和Java的约束条件不同。拿着Java中成功的案例直接套C++,不失败才怪。所以,我必须说:《Refactoring》这本书很有价值。但对于C++程序员来说,它的价值是让你思考,思考这种方法的可行性。如果一个C++程序员没有打算迁移到Java,那么我必须告诉他:《Refactoring》这本书不是让你照着它用的,甚至不是让你去相信它的。对于C++程序员,《Refactoring》全书可以放心相信的只有第13章,其他的部分,都必须非常谨慎地对待。 梦魇:我还要就“试探型”的方法多说两句,我觉得对于个人发展来讲,“试探”也是必不可少的,撞墙不可怕,高水平的人不都是撞出来的吗?你失败了一次,就知道这个模式有什么潜在的问题,下次再用,就会多看几步,像下棋似的。撞的多了,路数就出来了。我不知道你们是否有这个感觉:用错了模式,吃了亏,再回过头去翻翻《Design Patterns》,看到人家早就指出来这个问题,不过就是那么几句话,原来看上去干巴巴的,现在觉得句句都讲到心坎上,GoF的形象马上就高大起来,还带着光环,感觉是既兴奋又懊悔。 透明:现在回头来看,我更欣赏myan推荐给我的《Designing Object-Oriented C++ Applications Using Booch Method》。这本书能够帮助C++程序员理清思路培养习惯,可惜国内没有引进。相比后来商业味浓厚的UML系列书籍,我觉得这本书对于面向对象的阐释精辟独到,至今未有能出其右者。 梦魇:刚才我们两人都说到Robert Martin,他可是我的榜样。那本1995年的《Designing Object Oriented C++ Application》,我觉得是每一个C++软件工程师都应该反复研读的书。可惜不仅国内没有引进,在国外的名气也不大。如果你觉得面向对象的那些道理你好像都明白,可就是一遇到实际问题就使不上劲,那这本书就是你的最佳导师。提到理清思路,还有一本书不得不提,就是Andrew Koenig的《Ruminations On C++》。每个人都应该问自己,我学了这么多年的C++,究竟什么是C++最基本的设计理念?遇到问题我第一个直觉是什么?第一个试探型的解决方案应该具有那些特点?如果你不能给出明确的答案,就应该认真地去读这本书,读完了你就有了“主心骨”。 透明:插一句话,谈谈“推荐书”的问题。入门书基本上是放之四海而皆准的,所以推荐的意义也不大。而入门后的发展方向,每个人不同,这个时候就需要“高人”的指点。举个例子:我学C++的时候,myan还不认识我,所以也没有给我推荐书,我还是学过来了,所以即使你当时向我推荐了《Essential C++》或者《C++ Primer》,我也不会太感谢你;但在我认真研究OO的时候,你推荐Robert Martin那本书给我,对我帮助就特别大,而且我从别的地方也很难找到类似的推荐,所以我就很感谢你。一个程序员,必须有framework的意识,要学会用framework,还要主动去分析framework(在这方面,《Design Patterns》能有一定的帮助)。但是,真正高质量、成气候的framework的书恐怕也就只有针对MFC的。从这个角度来说,MFC纵有千般不是,C++程序员都非常有必要先去用它、熟悉它、研究它,甚至借助《深入浅出MFC》这样的书来剖析它。不然,很难有framework的意识和感觉。当然,另一个framework也很好,那就是STL。不管用不用MFC、STL,对这两个东西的掌握和理解都是极有帮助的。最近我又在看《深入浅出MFC》,虽然已经不用MFC编程了,但帮助是一定有的。 梦魇:MFC和STL方面,我还是比较推崇侯先生的两本书《深入浅出MFC》和《STL源码解析》。《深入浅出MFC》这本书,名气自然是大得不得了,不过也有不少人批评。其实书也没有十全十美的,批评当然是少不了的,不过有的时候我看到有人评论这本书,把它跟Inside VC相比,真的是牛头不对马嘴。你刚才其实说得很对,程序员应该有一点framework意识。而这本《深入浅出MFC》与其说是在讲MFC编程,不如说通篇是在拿MFC为例分析Application Framework的架构和脉络。所以无论你对于MFC本身是什么态度,这本书对每一个C++程序员都有很大的益处。 透明:是的。《VC技术内幕》会告诉你“DYNAMIC_CREATE这个宏怎么用”,《深入浅出MFC》则告诉你“DYNAMIC_CREATE这个宏是怎么实现的”。所以,如果你只需要在VC下写一些小应用程序,《深入浅出MFC》的价值并不太大;但是,如果你需要设计一个稍微大一点的东西(不一定是framework),MFC的设计思想就会有所帮助。 梦魇:另外,我觉得对于MFC也应该有一个公允的评价。过去是吹捧得天上有地下无,书店里铺天盖地都是MFC的书,搞得大家只知有MFC,不知有C++,甚至直到现在还有人问:“我是学MFC呢,还是学C++?VC++是不是比C++更高级的语言?”MFC成了一尊神像,阻碍了人们的视线。所以得把它从神坛上拉下来。这就是过去一两年有很多人,包括我在内批评MFC的一个目的。可是现在大家视野开阔了,.NET也出来了,MFC不再是神像了,少数人就开始以贬损MFC为乐了。我觉得这种态度是不对的。什么叫好的框架?我觉得在十几年的时间能够象MFC这样保持稳定并且不断进步的框架就是好的框架。可能我们在一些具体的设计问题上有不同看法,觉得“这个地方这么设计不是更漂亮吗?”很多时候是的,但是这不重要,重要的是MFC成熟稳定、有十几年的成功经验,这是最了不起的东西。另外一点,MFC中间包括着学习Win32 API编程的最佳资料。这是除了其framework方面之外的另一个亮点。我现在使用Win32 API开发,但是经常参考MFC的源代码,收获很大。 透明:STL方面,我对于剖析它的源代码兴趣并不大,毕竟里面源代码多是算法问题。所以,《STL源码剖析》我也只是随便翻翻就束之高阁了。我觉得这本书用来做计算机系的数据结构和算法教材不错,不知道有没有老师乐意这样做。对于STL,我的态度一向都是“应用至上”。不过,我一直认为SGI STL本身就是一本精彩的书,一本数据结构和算法的经典参考书,同时也是泛型技术的参考书。想知道一个算法是如何实现的,看看STL源代码就行;想知道如何使用type traits,STL源代码里面也有例子。看别人写的书,总觉得隔着一层纱,有点挠不到痒处的感觉。SGI STL的代码写得非常漂亮,一个C++程序员如果不看看这本书,实在是可惜。 梦魇:至于STL,除了《STL源码解析》之外,我举贤不避亲,强烈推荐侯先生与我合译的那本《The C++ Standard Library》。这本书质量之高是无需怀疑的。我现在手边常备此书,随时查阅,对我帮助很大。 透明:C++和Java相比,最大的优势就是它没有一个专门的公司来管它,最大的弱点也是它没有一个专门的公司来管它。Java程序员在学会简单的语法之后,立刻进入SUN提供的framework,一边用这个现成的framework做实际开发,一边在开发过程中继续学习Java一些幽深的特性。而这个时候,C++程序员恐怕还在问“VC和BCB哪个好”呢。这无疑是浪费时间。 梦魇:刚才你说Java和C++的优劣,这个话题已经成了我们这个年代永不消失的声波了。我也不想再谈这个。不过有一点我得说清楚:现在我们很多用C++的人吃了不少苦头,探过脖子去看看Java,觉得它真是太可爱了,这种印象是不准确的。另外,Java也不简单,而且会越来越庞大复杂。在很多场合,Java还不具有竞争力。至于将来如何,我看有些Java爱好者也过分乐观了,似乎计算机科学界几十年解决不了的问题都可以借着Java的东风解决掉,恐怕没那么容易。 透明:那当然。我再次强调:No Silver Bullet。读书很重要,但古人说“行万里路,读万卷书”,还是把“行路”放在“读书”前面。尤其对于技术书籍,如果它不能帮我解决问题、不能给我带来非常实际的利益,那么我是不会去读它的。恶魔说得对,我们这个社会很快餐,我们这个行业尤其很快餐,我们也只能努力适应它。 从编程门外汉成为C++程序员 这篇向导简述了学习C++的全过程,对想成为C++程序员的朋友有所帮助,特别是为非科班的朋友展示了一条学习路线,限于本人水平限制,如果有什么不恰当的地方欢迎指正。 [ 查看本指南所提及的书籍 ] 这篇向导是为希望成为C++程序员的朋友写的,简述了学习C++的全过程。希望对编程的门外汉有所帮助:) 入门:入门就是要初步对编程的思想有个了解,并且能编程解决一些小问题。入门一定要选好书,难度如果太低了会造成对读者的误导,以为编程就是这么回事;也不能太高深,免的打击读者的信心。既然编程的入门要求是编一些小程序解决小问题,那么就没必要直接学习C++,我觉得循环、判断、跳转、指针才是最基本的编程思想,学通了这些对以后学习C++很有帮助。我建议应该先把C扎实地学好,不光要掌握C的语法,因为学习编程的最终目的是解决实际问题,所以还要适当掌握把实际问题与编程联系在一起的能力,我推荐《 C程序设计语言(第2版) 》,这本书是C语言之父写的,不仅详尽介绍了C的语法,还提供了很多实际的小问题作为实例,可以说看了这本书之后能为以后的编程学习打下一个扎实的基础! 提高:学了《 C程序设计语言(第2版) 》后可以开始学习C++,一开始没必要钻很深的大部头书,《 Essential C++中文版 》非常适合初学,一个礼拜就可以看完,看了它可以快速对C++的全貌有个了解,虽然不会马上熟练掌握C++。我们不能满足于解决“百钱买百鸡”,真正实现程序还有很多非功能上的问题,比如怎样做才能使用更少的内存?怎样做才能更快?在熟悉一门语言后,一定要认真学习的就是数据结构!数据结构保证了我们的程序能以高效的方式运行。《 数据结构算法与应用C++语言描述 》是本好书,它提供了很多实际的例子,比如火车站调度、走迷宫,相比于“百钱买百鸡”这种问题又提高了一个层次。接下来专心提高C++的水平,可以选择《 C++编程思想 》,然后再看《 Effective C++中文版 》和《 More Effective C++中文版 》,这两本书介绍了高效使用C++的宝贵经验,语言很幽默。至此,你已经可以自称是C++程序员了,恭喜!下面介绍几本书,有兴趣的朋友可以选读。如果想高效地使用C++开发软件,STL一定要学!《 C++标准程序库—自修教程与参考手册 》可以帮你学会STL的使用,而且开发时可以拿它做手册,有了前面数据结构的基础,学习STL的使用不会遇到什么困难。如果你还想知道STL的设计思想及原理,不妨看看《 泛型编程与STL 》。有些朋友可能会问,C++的面向对象机制是怎么实现的?《 深度探索C++对象模型 》给了你答案,它剖析了C++底层的实现。最后,如果想有一本C++大百科全书,那非《 C++程序设计语言(特别版) 》莫属!这本书是C++之父Bjarne Stroustrup的大作,算是书中权威。 再提高:到现在为止,你已经熟练掌握C++语言了,现在需要提高的就是设计思想,面向对象(OO)的最大特点是把我们的注意力从系统的执行体系结构转移到概念体系结构,因此利用OO开发大型系统会更轻松。但是经常可以看到人们拿着C++用面向过程的思想解决问题,缺乏的就是面向对象的设计思想,也难怪,在这里之前看的书都没有教你怎样用面向对象的方法开发系统,顶多介绍了面向对象是什么,看了这么多书难免会先入为主,《C语言程序设计》(或者你看的第一本编程书)中的思路潜在的影响着我们。这条鸿沟就由《 设计模式--可复用面向对象软件的基础 》来补救吧!所谓模式就是前人总结出来的、经过千锤百炼的一种系统结构,设计模式展示了23个经典的模式,通过学习、理解,你可以看到什么是真正的面向对象。 看了《 设计模式--可复用面向对象软件的基础 》后,有时间不妨看看《 重构——改善既有代码的设计(中文版) 》,学了面向对象的设计思想后看它,可以站在一定高度重新审视一下自己的C++编程水平。 结束语:在学习编程的过程中一定要注意多实践!学习时到CSDN论坛同大家讨论是个不错的办法,那里的高手如过江之鲫,你会找到许多热心的朋友与您一起学习,能通过学习编程交些朋友不是更好吗?最后,希望您能成为优秀的程序设计师,为中国软件的发展贡献一份力量! TCP/IP网络编程之四书五经 创建人:DearBook技术编辑 DearBook_Tech [本文发表于《程序员》杂志2003年第12期,作者孟岩]基于TCP/IP的编程格外重要。从应用上来说,现在直接利用C层次Socket API进行TCP/IP编程的人确实越来越少了,各种现成的框架(如ACE、Java、.NET FCL)和控件(如IP*Works)大大简化了TCP/IP编程的难度。高层的框架和控件总结了TCP/IP的主要使用模式,并且进行了抽象和封装,这固然非常好,但是想要真正掌握TCP/IP网络编程的真谛,恐怕需要认真学习下面几本著作。 [ 查看本指南所提及的书籍 ] [本文发表于《程序员》杂志2003年第12期,作者孟岩] 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++网络编程 卷1:运用ACE和模式消除复杂性 》《 C++网络编程,卷2 基于ACE和框架的系统化复用 》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的网络编程知识与现代面向对象、模式和框架等最新技术思想结合起来,从而使你对网络编程的认识上升到一个新的高度。 2003年十本最爱图书 创建人:Dearbook技术编辑 DearBook_Tech 2003年是高端计算机图书出版丰收的一年,好书层出不穷,国外优秀著作的影印版图书大量引入,优秀图书翻译的速度也在加快。为了给IT出版业过去的一年做一个回顾,CSDN和第二书店(www.dearbook.com)共同举办了2003年度好书评选活动,广大读者、网友通过网站投票的方式从100本推荐好书中选出了最受欢迎的十本书,最终结果如下: [ 查看本指南所提及的书籍 ] 用最少的钱买最好的书:本次评选前10名的图书,第二书店7折优惠,把最终的实惠让给爱书的读者。 第一名:《 More Effective C++中文版 》 2697票作者:Scott Meyers 译者:侯捷 中国电力出版社电影的续集总让人失望,《 Effective C++中文版 》的续集却依然给你惊喜,这本书荣登2003最佳图书榜首不是偶然,它秉承了《 Effective C++中文版 》的风格,列出35个改善C++程序技术与设计思维的方法。Meyers没有说教语法细节,也不求大凑全,而是以多年经验为基础,向大家解释了如何更有效率地撰写软件:使效率更高、更稳健强固、更一致化、更具移植性、更富重用性,简单地说就是撰写更好的C++软件。读者看过后会由衷地感叹“原来C++程序是可以这样写的!”书中每一句话都体现着C++程序的编程思想,你会发现越品越有味道。自从《 Effective C++中文版 》出版后,许多人一直期待着这本书。由侯捷亲自翻译保证了译本的质量,但也有一部分读者对侯先生的翻译风格表示不适应。这本书能排在这个位置说明目前国内对C++的学习热情还是非常高的!但是,由于本书原版写于1996年,所以没有涉及C++中最新的技术,如泛型 、STL这些目前很流行的东西。 第二名:《 人月神话(影印版) 》 2664票影印版是未翻译的英文书,该书中文版为《 人月神话 》作者:Frederick P. Brooks Jr. 中国电力出版社即使《 人月神话 》中文版已于2002年上市,影印版还是受到了如此热烈的欢迎,可见大家对《 人月神话 》的认可。自从1975年首版到今,《 人月神话 》不断地被重印,这本身就构成了软件领域的神话。在这本经典著作中,Brooks深刻地阐述了复杂项目管理中存在的问题,让你思考四个变量(成本、时间、质量、范围)之间的一些故事,以及“人月”、“概念完整性”等重要的项目管理概念。相比于1975年版,这本20周年纪念版更收录了包括《没有银弹》在内的几篇经典论文,并对首版二十年来软件项目管理的发展做了一个回顾。特别是著名的论文《没有银弹》,引领你对软件开发的发展做一个深入的思考。虽然我们的计算机性能不知比1975年时提高多少倍,制造了多少高效的开发工具,但我们依然能从《 人月神话 》中得到有益的启示。在风格上,每章前面的图片和诗给人耳目一新的感觉。 第三名:《 Borland传奇 》2177票作者:李维 电子工业出版社一本非技术书能在评选中获得如此高的位置足以说明它的精彩。在这本书中李维向大家介绍了Borland杰出的技术大师、跌宕起伏的企业发展,让读者看着大呼过瘾!本书部分内容曾在《程序员》杂志上连载,其间读者反响强烈,即使不使用Borland开发工具的朋友也为Borland精彩的故事所吸引。很多中国程序员是伴随着Borland成长起来的,他们学习编程时的起步就是Turbo C、Turbo Pascal,这些朋友对Borland格外有感情,却对Borland的发展了解不多,这本书正好填补了这个空隙。以史为镜,可以知兴亡,在本书中,作者观察分析了Borland的演变以及软件发展的趋势等重要问题,这些故事本身不仅非常有意思,而且能和读者的实际学习、工作联系起来,更能引发对深层次问题的思考,Borland这样的企业究竟应该侧重技术还是市场?自己怎样在软件技术的发展潮流中找到方向?由于李维是本土作家,全书语言流畅,在文字上更贴近我们。书中用到的图表很有表现力,对作者意思的表达起了很好的帮助作用。 第四名:《 Java编程思想(英文版·第3版) 》2120票该书第二版的中文版为:《 Java编程思想(第2版) 》作者:Bruce Eckel 机械工业出版社这本书的影响力盖过了Java之父James Gosling参与编著的《 Java编程语言(第三版) 》,受到全球程序员的广泛认同,它的前两版曾多次荣获Software Development , JavaWorld等机构颁发的大奖,《 Java编程思想(第2版) 》在去年本刊举办的年度评选活动中获得冠军。这本书全面介绍了从Java的基础语法到最高级特性,并针对Java 1.4版做了更新。在内容上有广度,也有一定深度,不仅适合入门,也可供深入学习用,同时作者还着重阐释了面向对象设计的理念。 Eckel开放了这本书的电子版,很值得我们尊敬,树立了一个慈祥的教育家的形象,不过如果要系统学习的话最好买一本纸版,否则太累眼。本书在国内上市不久就受到了如此热烈的欢迎,再次证实了其前作的成功,看的出大家对这本书期待已久,如果出版中文版市场一定会很好。 第五名:《 Effective Java中文版 》2061票作者:Joshua Bloch 译者:潘爱民 机械工业出版社这本薄薄的小书不仅获得了2002年度Jolt大奖,还受到Java之父的推荐。它继承了《 Effective C++中文版 》的名字和风格,Bloch为我们带来了57条极具实用价值的Java经验规则,书中每条规则都以简短、独立的小文章形式出现,这些小文章包含了详细而精确的建议,以及对语言中许多细微之处的深入分析,并通过例子代码加以进一步说明。这本书实践性很强,作者把开发中的经验和模式进行讲解,并举实例进行说明。同《 Effective C++中文版 》一样,这本书也不适合初学者。中文版由潘爱民翻译,保证了译本的质量。 第六名:《 Java夜未眠 》1779票作者:蔡学镛 电子工业出版社可以说这本书是TOP10中读起来最轻松的书了,它是一本程序员写给程序员的散文集。作者蔡学镛作为享誉国内外的Java高手,在本书中除了技术相关的文章之外,他也没有僭越自己的专业,随笔中所提及的都是软件产业里的甘苦点滴。无论您是程序员与否,本书都可以带给现代社会的年轻人一个借镜或指引。作者以诙谐、戏谑的笔触,写出时下程序员共同的心声,这本书很快就可以看完,而且文章都已发表在网络上,之所以受到如此欢迎,源于它包含了作者对工作、对人生的更改思考,更贴近了程序员的生活,值得一提的是作者将所有的版税捐助了希望工程。 第七名:《 人件(第2版) 》1684票作者:Tom DeMarco,Timothy Lister 译者:UMLChina翻译组清华大学出版社同《人月神话》一样,《人件》已成为软件团队管理的经典之作,它们共同被誉为软件图书中“两朵最鲜艳的奇葩”。人们认为,《人月神话》关注“软件开发”本身,《人件》则关注软件开发中的“人”,因此,在成千上万的书架上,《人件》永远和《人月神话》并列在一起。这本书专门讨论了软件开发和维护团队的管理问题,并向人们的传统认识提出了挑战。作者在书中推崇人本管理思想,正确指出知识型企业的核心是人,而不是技术,呼吁给予软件工作者充分的自由和信任。它的宣传语是“为程序员伸张权利”、“别把开发人员当成牲口”,如果给企业管理层看效果会更好,可读者中很多是被作为“人件”的程序员,于是在网络上引发了大家对目前工作环境的讨论(抱怨?)。但是,东西方文化的差异和我国的客观条件是否能容许《人件》中的观点?这很值得怀疑。 第八名:《 泛型编程与STL 》1644票作者:Matthew H. Austern 译者:侯捷 中国电力出版社这本书揭露了 STL 的奥秘,引导你进入泛型程序设计的思维模式,以你自己的可携式组件和可交互作用的泛用型组件来扩充 STL。阅读这本书比较艰深,你必须对 STL 的运用、泛型程序设计的基本精神、C++ template 技术都有相当基础了,才得一窥堂奥。随着STL的广泛运用,泛型这种编程技术逐渐被人们关注。如果你想深入探究STL原理,或者要自己用泛型编写一个高效的程序库,这本书一定会对你有所帮助。 第九名:《 重构——改善既有代码的设计(中文版) 》1530票作者:Martin Fowler 译者:侯捷 熊节 中国电力出版社这是一本软件工程领域的经典著作,与另一巨著《 设计模式--可复用面向对象软件的基础 》并称“软工双雄”。什么是重构?我们在写程序的时候,经常需要反复推敲修改代码,其实这就是重构。这实际上就是软件的持续改进之路,我们不可能总是第一次就能做好,但是我们总是有机会完善。本书除了讨论重构的各种技巧之外,还提供了超过70个可行重构的详细目录,给出了重构的工作原理,并以step by step的形式给出了应用每一种重构的指南。这些示例都是用Java语言写成的,但其中的思想却可以运用到任何面对象的编程语言中。 第十名:《 C# Primer中文版 》 1507票作者:Stanley B.Lippman 译者:侯捷 陈硕 华中科技大学出版社这本书是为有一定编程基础又想成为C#程序员的朋友写的入门读物,它内容详实、实例丰富,全面介绍了C#这门新的面向对象编程语言,对已经对面向对象程序设计有所了解的读者,作者为他们提供在 C# 中使用面向对象的编程方法的必备知识。它假设读者有其它语言的基础,明白循环之类最基本的概念。值得一提的是,本书的初译陈硕是一位在读本科大三的学生,你可能会对译本的质量怀疑,但这种怀疑是多余的。这本书登上TOP10表明.NET技术已经在国内开始被广泛学习,如果你想成为一名C#程序员而又不想花费太多的时间和精力,就请试试看 Lippman 的这本《C# Primer》吧。 附11至16名: 11.《 加密与解密(第二版) 》(段钢) 1435票 12.《 编程高手箴言 》(梁肇新) 1407票 13.《 C++设计新思维——泛型编程与设计模式之应用 》(侯捷、於春景译) 1372票 14.《 Inside VCL(深入核心——VCL架构剖析) 》(李维) 1329票 15.《 .NET大局观 》(侯捷、荣耀译) 1258票 16.《[ISBN]7-5083-[/ISBN]》1211票总结:从评选结果我们可以看出,讲述具体技术的书籍的比例开始下降,软件工程类和技术人文类图书开始受到欢迎,这两类书在TOP10占有5个名额,说明大家的视野已经开始放开,特别是技术人文这种迎合程序员的非技术书一出现就受到大家的喜爱。值得一提的是,TOP10中有四本书是侯捷翻译或参与翻译的,另外还有两本他参与翻译的《 C++设计新思维——泛型编程与设计模式之应用 》和《 .NET大局观 》也位居前16位,就目前看这种与别人合译的模式很成功,也许这就是已经形成的品牌效应吧。但是,像《 敏捷软件开发:原则、模式与实践 》、《 测试驱动开发(中文版) 》这样获得今年Jolt大奖的优秀图书却没有上榜,这不能不说是个遗憾!所以我们在关注经典图书的同时也应该适当关注一下目前国际上最新的进展。在新的一年中,我们期待着更多本土作家、译家为我来带来丰盛的大餐! 《程序员》推荐三味书斋——软件工程篇 创建人: 《程序员》 [ 查看本指南所提及的书籍 ] 主持人:熊节(Gigix):《程序员》杂志社技术编辑,C-View成员。嘉 宾:刘艺(Newdream):大学教师,撰写和编译图书多部。 汪颖(Adams):UMLChina成员,《人月神话》译者。 Newdream:随着计算机技术的发展,由一两个人关起门来打天下的软件英雄时代一去不复返了。现在的商业软件大部分都是很多人协同工作的结果,应用软件也已经由桌面应用发展到分布式网络应用,软件开发的难度和规模日益扩大。不管我们愿不愿意,软件工程正在从课堂上、书本上走下来,强迫我们去学习它,应用它。工程是将理论知识应用于实践的科学,而软件工程则借鉴了传统工程的原则和方法,以求高效地组织和开发高质量软件。国内软件工程的研究虽然并不比国外晚,但在软件工程的实用方面仍然滞后于美国等发达国家,特别是软件工程的应用人才奇缺。最近几年,随着大量国外软件工程经典图书的引进,国内的计算机研究和开发人员了解和学习了很多最新的软件工程理论和技术,从而推动了软件工程的广泛应用。现在越来越多的IT企业意识到软件工程对保证产品质量、降低开发风险、提高管理效率的重要作用,而精通软件工程的开发人员也成为大公司高薪争聘对象。软件工程图书正在成为计算机图书的一大热点。 Gigix:是的。两位在软件工程方面都有比较深的认识,并且也都博览群书。下面我们就来谈谈软件工程的书籍吧。 Newdream:对于软件工程的初学者来说,清华大学出版社的中国计算机软件专业技术水平考试指定用书《软件工程》(分为初、中、高级)是一本不错的入门读物。该书的作者郑人杰教授是我国知名的软件工程专家。这本书通俗易读,内容系统权威,可以帮助读者较全面地了解软件工程方面的知识。但由于这本书侧重应试,因此实用性较差。 Adams:新近业界推崇的CMM 2级从需求管理、配置管理、SQA、软件计划以及软件跟踪等KPA的角度,为规范化的软件管理提供了理论依据——然而,它依然带有学术派的色彩,使若干从业者有意犹未尽的感觉。《 软件工程--实践者的研究方法 》则涵盖了上述领域,全面深入浅出地介绍了软件工程学科的各个方面。其中,所涉及的实践已在很大程度上超越了目前的软工水平——不用再哀叹路在何方,路就在脚下。另外,《超越混沌——有效管理软件开发项目》这本软件工程的散文集里总结了许多经验教训,有空翻一翻,经常会心有戚戚焉的感觉。可惜,目前还没有影印版。 Gigix: Newdream的评价比较“中庸”,呵呵。在我看来,软件工程教材,能够起到的惟一作用(如果的确有作用的话),就是指导软件开发者的工作。如果不能指导实际工作,那些听起来很美的词汇、术语就没有任何意义。因此,我总是认为那本《 软件工程--实践者的研究方法 》算是目前为止最好的一本教材。对于名词的解释,那本《 软件工程--实践者的研究方法 》肯定不如某些国产教材来得好;但是这种一定程度的晦涩和复杂,对于正经学习软件工程是必要的。任何一个道理,如果说得过于抽象过于概括,那肯定会变成同义反复(也就是废话)。国产教材往往就犯这个毛病。好象我不应该用“国产教材”这样一个比较隐晦的称呼?没错,说郑人杰教授那套《软件工程》教材,记得以前在学校的时候,大概有一年的时间在学郑教授那套“钦定”教材。学完的感觉就是:他解释的每个词都很好,说的每句话都正确。整本书放之四海而皆准——科技工作者的直觉告诉我,放之四海而皆准的东西,多半都不可操作。这也算是我挑选软件工程书的一个办法吧:不光要有办法,还要有办法的约束条件,以及办法不适用的场合。也就是说,书中提供的知识必须是可证伪的。如果一本书不能说明自己提供的办法在什么条件下失效,那读者学到这些办法之后还得自己去摸索它的约束条件,这本书又有什么作用呢?前一阵Smiling上有人讥笑“刚从学校出来的小朋友”,大抵就是这种情况。 Adams:其实,软件工程归根到底是实践性的学科,它主要针对的是软件开发中社会学——人的问题。因而,很难找到一篇放之四海而皆准的圣经,每一位前人的著作都是来自于自己的项目、实践,已经为大家提供了非常好的参考。在同一位“大牛”李亮的交流中提到,“即使是相同性质的项目,不同的团队(人员)也需要对原先积累的过程、方法进行调整。”换言之,“迷时师渡,悟了自渡”,各种书籍、文献、前人的经验,在“工作在如此易于驾驭的介质上。程序员,就像诗人一样,几乎仅仅工作在单纯的思考中。程序员凭空地运用自己的想象,来建造自己的‘城堡’”的学科中,只能充当自己的老师,需要的还是自己的顿悟。另一个角度而言,尽信书,不如无书。如果完全迷信书中的观点,也是不可行的。 Gigix:刚才Adams引用的是《人月神话》中的句子吧?这本书恐怕是最近一段时间最热门的一个话题了。记得前次有人在一个小论坛上问“这本书究竟怎么样”,我的回答是:“如果没有读过‘人月’,如果不知道‘no silver bullet’,恐怕很难被认为是一个合格的软件工程师。”Adams没有多谈《人月神话》,大概是作为译者的避嫌吧。我知道的确有人不同意我的观点。有个朋友认为《人月神话》只是说出了一些指导性的原则、一些大而化之的概念,认为不应该过分地推崇它。但是,我认为,国内的情况,并不是普及过分,而是普及严重不足。这一点从许多的实例中就可以看出来。所以,尽管可能被人骂为“盲从”,但我还是得说:作为一名软件工程师,《人月神话》就是必读书目。 Newdream: Gigix谈到普及《人月神话》的重要性,殊不知现在许多做软件的人(他们也有软件工程师、系统分析师等各种时髦的称谓),根本就没有软件工程的概念。经常见到一些言必谈各种专业术语和词汇,甚至怀揣系统分析员证书的人,却连基本的软件开发文档都读不懂。记得有一次讲面向对象的方法,我举的是COM+的例子,居然还有软件工程师问哪里有对象,我说什么是COM,不就是组件对象模型(The Component Object Model)吗,COM就是对象呀。像这种笑话很多,我们许多搞软件开发的人还停留在崇尚编码英雄的“小农经济”时代,而软件工程化则是软件工业化生产时代的必由之路,没有软件工程思想的指导,我们无法想象如何去应对复杂多变的需求,如何组织和实施软件开发,如何进行人员管理和团队协作。实际上正是近几年来软件工程在理论和实践上的迅速发展,才使软件行业的生产率得以提高,而这种提高并不是建立在新增多少软件英雄或编程高手的基础上。所以普及和推广软件工程是一个十分严肃的话题。而这项工作需要面对不同层次和水准的对象。你不可能指望每个开发人员都去读《设计模式——可复用面向对象软件的基础》或《人月神话》,甚至连《软件工程:实践者的研究方法》这样的教科书对于某些人也勉为其难。相反林锐的一篇《软件工程思想》的随笔却成为众多程序员追捧的软件工程入门读物,在网上广为传播。这篇文章的魅力在于它来自作者的经验和体会,同时也向我们展示了一个梦想成为编程高手的程序员最终成长为一名软件工程信徒的曲折心路历程。最有趣的是文中“让我们高举程序主义、软件工程思想的伟大旗帜,紧密团结在以Microsoft为核心的软件公司周围,沿着比尔·盖茨的生财之道,不分白天黑夜地编程,把建设有中国特色的软件产业的伟大事业全面推向21世纪”的“经典名句”已经成为不少程序员津津乐道的口头语。无可否认,近两年大量引进的外国软件工程经典图书确实为我们打开了眼界,据说单是机械工业出版社和中信出版社就引进了70多种软件工程外版图书。由于出版界的努力,我们可以有幸阅读到世界大师级的一流作品,但是我们还缺少来自开发第一线的、真正具有实践体会的自己同行的作品。后者才是最贴近实际需要,为广大程序员所接受的书籍。所以普及软件工程的基础知识和思想方法要比普及《人月神话》这样的一两本经典名著更有重要意义。 Gigix:记得刚毕业的时候,我也特别喜欢看一些软件工程书,例如CMM、PSP、TSP之类的。但是过不多久就发现:看不懂。真的是看不懂。书里每个字都认识,每句话都明白,每一章节都觉得很有道理,就是凑到一起不知道对自己有什么用。后来反思一下,就是因为自己的实践经验太少。别人分析的问题,说到的约束条件,自己一点感性认识都没有,所以看到别人拿出的解决方案也就只能感叹“真有道理”了。Adams说“不要迷信”,可像这样经验尚浅,突然看到这么经典的东西,想不迷信也难呀。后来就转去看一些比较贴近实际的东西,例如Martin Fowler最推崇的敏捷方法之类,感觉很好。像敏捷建模(agile modeling)、重构、XP之类的技术,体现的是软件工程思想,又离低级实践很近,比较容易为程序员所接受。例如XP,它不怎么讲一套一套的大道理,只告诉你怎么设计、怎么编码、怎么测试,就比较容易看懂。直到现在我也还是看不懂某些软件工程书(包括大学里的教材),像CMM之类的更是敬而远之。不过我也翻译了两本软件工程方面的书:一本《最后期限》和一本《系统重构》(台湾版),感觉吃得很透。我想,自己的现象大概有一定的代表性:程序员不是不愿意接受软工思想,只是被那些一本正经的软工书给吓倒了。当然,这里面有程序员经验不足的原因(中国的程序员平均从业时间只有4年,美国是14年)。当然还有学校教育的问题。仅以我的经验来说,学校的老师从来都没认为软件工程是什么“实践性很强”的课。其实要培养软件工程的素养,真的也不那么难:两个人一起做做pair programming,每个模块编码之前先设计测试用例,有空的时候做做refactoring……从这些训练中得到好处了,自然也就有软件工程的素养了。 Adams:软工书籍的不易于理解还有一个风格和导向以及求学认知的问题。国内的部分图书、教材与其说是诲人不倦,不如说是形而上学、拖沓冗长。记得一位前辈谈起,“中国的数学教材,两三页纸横跨上下两三百年。”姑且不论这种观点是否有失偏颇,相信许多莘莘学子也会有这样的困惑“教科书太过抽象,不知道在说什么”。记得,在学习汇编语言的时候,当时颇流行一本“经典”教材。若干年后,偶然翻到一本外文原版的书籍,才知道原是减头去尾,断章取义,把前人浅显易懂的文字“抽象”“升华”——无言以对。 CMM等学术经典在于它能够提供一个框架,虽然太过简练。而许多软件工程的书籍,如《人月神话》、《软件工程:实践者的研究方法》恰恰填补了理论与实践之间的空白,至少能为读者切实实践提供真正的指导。《设计模式》、面向对象等数据则从软件开发的角度提供了过程(工程)的载体。正所谓,工欲善其事,必先利其器,另外还需要思想的指导。软件工程就是起这样的作用,不过正如马列主义思想的诞生一样,都需要不断地实践、实践、再实践。这的确是一个长期漫长的过程,没有其它捷径。 Newdream:我非常同意汪颖关于风格和导向的见解。的确这是不容忽视的问题。国内的专业书籍和教材八股风格居多,引经据典,却很少有自己的研究成果和实践经验。软件工程方面亦然。当然,这也和学术风气不好有关。好在现在是市场经济的时代,读者对于作者和图书有最大的选择权和投票权。特别是大量优秀外版图书的引进,将对国内的学人和作者产生巨大的冲击。关于软件工程以实践为本的导向,这是一个十分重要的观点,对大家如何去学习和掌握软件工程的理论和方法有着积极的指导意义。一般,我会建议入门者先学习一两本基础教材,建立软件工程的概念和框架体系。计算机专业的学生可以直接阅读《软件工程:实践者的研究方法》,不过这本书也不是万能的,国外网站上有不少读者批评这本书只适合作教材、拿学位,对实际开发指导不够。如果作了程序员,还可以边工作边读一些实践性很强的开发指导书,比如《 编写有效用例(英文版) 》、《Applying UML And Patterns (Second Eition)》、《Systems Analysis and Design Methods(Fifth Edition)》等。值得一提的是《Systems Analysis and Design Methods(Fifth Edition)》采用案例教学法,非常易学易用,高教出版社有影印版,价格便宜,原汁原味。这些书将伴随你在实践中解决问题,不断提高你的水平。有了程序员的经验,再读《统一软件开发过程》、《设计模式》、《人月神话》等名著才能真正掌握设计开发的要旨,领会软件过程的精髓,进一步铺就通往系统分析员和项目主管的金光大道。总之,程序员要提高自身的开发水平,决不可能通过阅读几本软件工程经典名著就可以一蹴而就。学习——实践——再学习——再实践才是唯一的成功之路。所以在不同的发展阶段,要选好适合自己的软件工程图书,决不能好高骛远或人云亦云、盲从盲信。 程序员》推荐定位自己 有的放矢——一位技术作家眼中的Java图书选购技巧 作者以Java图书做范例,总结自已多年购书的经验,并全面剖析了当前Java图书市场的现状,读来很有深意。希望在阅读本文后,读者能真正购买到适合自己且“不太差”的图书。选购电脑书的原则是什么?可能的答案有:好懂、全面、深入、实用等,本人以为,最重要的是选购一本自己能看懂的书,然后才能考虑其它方面。进过书店的读者都知道,电脑书的选购非常令人头疼,你肯定是因为不懂书中的内容才会购买,但是电脑技术的实践性很强且越来越复杂。就编程技术来说,多数情况下需要上机编写程序才能知道自己是否学会了。不过书店不会提供机器让你编程序,甚至连小硬板凳都不提供,你只能站着或者蹲着看书,即便腰酸背疼腿抽筋地看到书店下班,也不一定能知道哪本书自己能看懂。那么,有没有一些简单的方法利于判断呢?本文将以Java图书为例,告诉读者一些技巧。关于电脑书的现状,本人认为基本的事实是好书不多、坏书不少,凡是看过几本的读者应该或多或少有所体会,问题有多严重不便在此描述,就用下面的图示作为支持本人观点的一个证据吧:这是新闻组上的一篇文章,这位叫落花吹雪的网友是计算机专业的毕业生,显然不笨,可是居然“看书越看越糊涂”,以至于连“对象”一类最基本的OO(面向对象)术语都不明白。分析造成如此局面的原因同样不是本文的目的,那是需要很多长篇大论才能彻底曝光的,本文只想告诉读者,如果我们不得不在垃圾箱中找食物充饥,那怎样才能找到比较卫生的?下面,本文将模拟读者进入书店选书的过程,看看读者在该过程的各个阶段,应该注意哪些事项。中心思想是怎样根据能看懂的内容,对书的质量和是否选购做出决定。当然,通常情况下,书中的技术内容在书店中很难看懂(因为不能在机器上测试),但是有些非技术内容可以看懂,例如书名、作者名等等。 选书的顺序:外文原版/翻译版/本国作者版看到这个标题,不会有人骂我是汉奸吧?这是本人选书的No.1原则,很多专家也都建议尽力阅读外文原著(如果外文过关的话),例如侯捷先生。走进任何一家书店,可以把书店里的电脑书分成外文原版/翻译版/本国作者版3类。首选外文原版的原因很多,作者以为最重要的原因是外文书原装、原汁、原味的,谁让电脑技术基本上都是洋人发明的呢。可是当这些原装货被翻译过来或者由国内作者再阐述一遍时,味道可能就变了,或者说有“中国特色”了,不幸的是很多情况下是变差了而不是变好了,下面就举落花吹雪网友不明白的“对象”一词为例。本人刚开始接触面向对象技术时,也象落花吹雪一样,看书越看越糊涂,很久都不知道什么是对象。“对象”是面向对象技术的最基本概念,一般也是需要解释的第一个概念,本人至今还记得看的第一本书(还是译著)是这样讲解的(大意):按照面向对象理论,世界是由对象组成的。例如人是对象,电脑是对象,猪是对象,泥巴也是对象…… 我是头一次听说世界是由对象组成的,而我学的马克思主义哲学告诉我,世界是由物质组成的,除了物质什么都没有,我对他老人家的观点一直坚信不疑。那么“对象”又是什么东西?记得自己后来又翻了别的书,结果发现也是满篇“对象”,难道世界真变成对象了?这种说法动摇了我坚如磐石的世界观,可又没有因此建立新的世界观,所以感到极大的困惑,以后的内容自然就无法看懂了。终于有一天,看到了一本英文资料,才知道“对象”是Object的译文。Object的含义是“物体”,这是中学生都认识的简单词汇,如果你阅读的是英文书而不是二手的译著,即便第一次学习面向对象技术,也不会不明白什么是Object,所以我就把上面的中文又翻译回了英文: Everything in the world is an object. A man is an object. A PC is an object.A pig is an object…… 这段英文很简单,没有被歪曲的中文意思为:世界上的一切都是物体。人是物体,电脑是物体,猪是物体…… 看,“一切都是物体”的含义和我的世界观基本一致了。从此,本人才慢慢学会了面向对象技术。顺便说一句,《Think in Java》有一章的标题就是Everything is an object. 原装的英文通常很容易理解,但是当它变成译文或者中国作者再用自己的话讲解时,常常变得莫名其妙,特别是专业术语,可能与英文原意差距极大,差距之大甚至可以写笑话了,例如可以用中文“对象”证明一个人的太太是他养的猪和他养的猪就是他太太,推理如下:因为按照面向对象理论,万事万物都是对象。所以,猪是对象—他养的猪是对象—他养的猪是他的对象。又因为他的对象就是他的太太,他的太太就是他的对象。所以,他养的猪是他的太太,他的太太就是他养的猪。但是,你无法用英文证明Pig和Wife是同一个Object。这里本人对读者有个请求,如果你知道“对象”的原创者是谁,请千万不要把上面笑话中的“他”改成“你”,然后寄给原创者。对英文术语的拙劣翻译是翻译版和国内作者版图书的通病(其它毛病在后面讲述),除了“对象”,闻名遐尔的还有“套接字”(Socket插座)、“句柄”(Handle把手/手柄)等等一堆垃圾名词,这是本人首选原版书的一个重要原因。但是,书店里的原版书太少,从国外买又太贵,补救方法是通过网络寻找一些免费学习资料。例如Sun网站上就有大量的教程,《Think in Java》也有免费的电子版,目前该书的英文版也在书店里出现了。书店里,有深度的Java书,大部分为国外作者所著(其它电脑技术图书可能也是这样),而国内作者的书主要集中在Java入门知识和JSP领域。 封面/封底/内容摘要/前言等 这些内容是很容易看懂的,读者应该注意下面这些信息:作者的资历国外作者的著作(英文书或者译著)通常都有作者简介,如非名家,多半也是专家,例如《Think in Java》的作者Bruce Eckel,Sun公司的著作等,否则就不好意思暴露身份了。然而,国内作者的著作多半没有。所以,本人的建议是,选择那些有资历作者的著作,当然,十有八九又得选国外作者的书了。作者的联系地址同样,国外作者的著作(英文书或者译著)一般都有联系地址。有地址意味着作者对自己的著作比较有信心,质量有相当的保证,否则不是招骂吗?以前,国内图书没有作者的联系地址,现在少数图书也列上了作者地址,也许这是国内作者质量改善的信号。所以,本人的建议是,选择那些有作者地址的图书。印刷次数和册数多数电脑书会印上自己的印刷次数和册数。电脑书第一次印刷量一般为5000册,如果重印了,说明图书的质量较高,例如《Think in Java》的中文版《 JAVA编程思想 》就印刷了数次。但是指定教材不能这样判断,质量再差读者也是不得不买。另外应该注意的是,如果图书涉及的技术较深,质量再高可能也不会重印。图书的厚度就Java而言,本人以为页数少于200的Java书可能讲不了什么东西。目前,书店里有Sun公司的一些比较薄的书,作者翻过一本有关EJB的,发现主要内容是讲体系、结构、层次等等,不是教你编码的,好象属于研究方面的。前言和内容摘要一本书的前言和内容摘要主要有下面这些信息: n本书的层次/主要内容/读者对象关于这一点见下一节的说明。 n本书的特色几乎所有的书都自称“通俗易懂”、“循序渐进”或者有XX“特色”、“优点”等,反正就是说自己是本好书。想想也可以理解,有哪个作者会说自己的书很差?本人的观点是,大部分书的这些自吹自擂都不可信,只是广告词而已,除非它能说明自己是如何做到“通俗易懂”、“循序渐进”的。本人也写了几本Java书,甚至自称“Bestbook”,为了说明自己不是空口无凭,花了不少篇幅来列举证据,包括印上读者来信,也包括本人的联系地址和网站。侯捷先生的书上也有不少读者来信。然而,印上读者来信的电脑书很少,包括国外作者的书。 确定图书的类型 常见的Java书可分为下面几种类型: n 有关语法和API的 n 集成开发环境的 n 工程方面的这是本人自己的分类,和读者的理解可能不完全相同,下面就解释一下。《Think in Java》就属于第一类,适合于入门者,无论是基础知识的入门还是高级知识的入门。例如如果你不知道Servlet和EJB,尽管这些知识比较高级,仍然要选择第一类的图书。集成开发环境通常描述菜单、按钮之类的作用,很少涉及具体的语法和API,例如Jbuilder方面的书。如果你不会EJB,通过集成环境也帮不了你多少。选择集成环境的图书要在自己有语法和API基础之后。工程方面图书的特点是综合性较强、内容较深,判断的标准之一是例子的代码是否很长。这类书容易和第一类图书混淆,实际上,很多书自身就是混淆的,或者说得好听点:兼具两类书的特点。本人翻过一本Wrox的书《 Wrox程序员参考系列:Java服务器高级编程 》,感觉就是这样。它讲了EJB、Servlet等,但是如果想学会,可能有相当难度。目前Wrox的书(特点是封面上有很多人头像)在国内不少,本人更愿意把它们归入工程类,即当你先学会了EJB、Servlet等内容后,再看这些书会比较容易,同时也有很大的收获。书店里还有一些以例子为主的书,例如怎样做一个功能完整的网站等,这类书也应该属于工程类,它们对语法和API的讲解通常很简略。有一些手册之类的书,例如列出所有API含义的那种书,像字典一样,显然,你肯定不会把这些书当课本用。还有一些书猛一看有点像“夸夸其谈”之作,特点是代码很少,例如前面提到的Sun公司的一些薄书。本人感觉这些书的层次更高,必须有很高的水平才会觉得有用,例如《J2EE核心模式》,坦率地说,本人还没到这种层次。 确定图书的技术层次 从前言、内容摘要甚至书名上可以了解到图书的层次或者起点,如“入门”或者“初级”、“中级”、“高级”等等。这些描述多半是诚实的,但是太笼统并且不一定完全正确,例如“初级”、“高级”究竟具体到什么程度?《Think in Java》在Introduction一章专门有Prerequisites(预备知识)一节,很详细地描述了《Think in Java》需要读者具备的技术基础,部分原文如下: This book assumes that you have some programming familiarity: you understand that a program is a collection of statements, the idea of a subroutine/function/macro, control statements such as“if” and looping constructs such as “while,” etc. 本人所写的Java书也比较详细地描述了读者需要具备的预备知识。手里有一本John Zukowski所著《Mastering Java 2》的中文版《 Java 2从入门到精通(J2SE 1.4版) 》,书作者也是位专家,该书出版较早,目前书店里很难找到了。其前言和内容摘要称其适合各级开发人员,所以本人曾经想把它当入门书,但是发现很难看懂,原因是作者设定的入门门槛,比本人实际的门槛高,可那是本人把书买回来以后才发现的。本人以为,在书店里确定图书的技术门槛是否和自己的门槛高度一致非常困难,前言和内容摘要的说法不可靠。 阅读正文 前面说过,因为不能测试,在书店里通常无法看懂想学习的技术内容,但是仍然有方法帮助你在一定程度上判断该书的质量: n 阅读已知的内容如果了解书中的部分内容,先看看书中是怎样讲解的。 n 如果买书是为了解决某些问题那就看看所选的书是否提供了答案,当然你不一定能够看懂。 n 作者的文笔作者的文笔当然影响图书的质量,本人以为文笔的底限是简洁通顺。就本人认为,国内作者和译者的文笔通常很一般,老外的句子就活泼一些。本文前面谈过英文术语的翻译问题,这是译著和国内作者版共同的问题。然而,译著的一个特有问题是语句不通顺的情况很多,侯捷先生的文章列举了不少例子。如果是国内作者版,那语句不通的问题就比较少。判断文笔的简单方法之一是数数句子是否太长,例如一句话超过30个字可能读起来就比较费劲了。某些书的前言和内容摘要的文笔相当好,不能以此判断全书,你还是需要阅读正文。我的建议是,如果发现文笔不错,书的质量可能比较好,这起码说明作者的写作比较认真。如果文笔一般,就不好说了,因为可能作者的文笔就是如此。文笔差的书最好不买,不管文笔差的原因是什么,不好懂是肯定的。但是如果买译著,可能就得忍着点了。 选书时的其它注意事项 n 不要被书名迷惑现在的电脑书名非常诱人,例如“傻瓜书”、“轻松入门”、“快速精通”、“X日通”等等,这些很可能只是广告词而已。 n 不要只看前言和内容摘要如果把书名比喻成广告标题,那么前言和内容摘要就是广告内容了。到书店随便翻翻,没有一本书的前言和内容摘要写得不引人入胜的,难道都可以买? n 不要迷信出版社某些出版社的名气可能比其他出版社大,但是图书的质量主要取决于作者而不是出版社。 n 不要为装璜漂亮的书所吸引猩猩也能穿上名牌服装,可它仍然是头畜生。 n 书店里同类书非常多,可以对照比较。 介绍几本Java书 前面的内容是模拟读者在书店里的选书过程,告诉读者怎样根据能看懂的内容,对书的质量和是否选购做出决定。坦率地说,这些讲述不一定保证你能够买到可看懂的图书,只是希望减少买错书的机会。现在,我想根据自己所见,介绍几本书给读者,同样,本人的介绍仅供参考,这些书同样不一定适合你。开书单之前,先谈一下本人在电脑学习中的一个观点:入门难而深入不难,“万事开头难”嘛。当你入门后,再研究任何深入的知识都比较容易,所以下面主要介绍入门图书。在Java方面,最难入门的就是面向对象技术,这是入门知识,如果没有学会,Java的其它知识根本就无法理解。遗憾的是,把面向对象知识讲解得很详细并且又好懂的书并不多,例如叫落花吹雪的那位网友,他的问题可能就是没有找到一本介绍OO技术的好书。还有个正面的例子,曾经有个读者给我来信,告诉我一个“曲线救国”的事:他想学C#未果,转而看我写的Java书,明白了OO后,C#也懂了。出于对中文书的“偏见”,本人主要通过阅读英文资料学习,尽量对译著和国内作者版图书敬而远之,因此这类书看得较少,即便看了也不仔细,就不好详细说这些书如何如何了(其实前面已经说了很多了)。 《Think in Java》《Think in Java》的中文版名为《 JAVA编程思想 》,中文版为第一版,书店里的英文版为第二版。很多人推荐该书作为Java的入门书,这也是本人的观点。作为入门书,该书有点难,但比很多其它译著和国内作者版的图书都好懂,特别是面向对象技术讲解得很全面,甚至有点过头了。 网站教程 Sun网站上的教程(http://java.sun.com)是英文的,内容很多,涉及很多基础和深入的的主题,也比较好懂。本人以为,作为入门教程,特别是想学习全面的面向对象技术,不是很合适,面向对象技术还是《Think in Java》讲解得全。这些教程更适合对高级主题的学习。老外都是活雷锋,喜欢把自己的作品让别人免费分享,所以网上的资料不少,本人对它们的总体评价是比较好懂,这是否是网络教程的特点呢?至于中文教程,读者应该能猜到,本人连书店里现成的书都不愿翻,还会花钱在网上找? 本人著作毛遂自荐,本人目前共出版了下面3本书: n 《 Java程序设计百事通 》:这是入门书,没有《Think in Java》讲得多,但是同样的内容也许更好懂,对面向对象技术的讲解也很详细,并且不要求读者具备OO的任何基础,入门门槛更低。以作者所见,对OO技术讲解得很详细的著作就是《Think in Java》、本书和下面介绍的本人另外一本书。 n 《 Java 2高级程序设计百事通 》:该书的技术基础严格基于前一本,如果你学会了前一本,不会看不懂此书。 n 《 成功通过Sun认证Java2程序员考试 》:本书针对SCJP认证而写,对OO技术的讲解比第一本书还要多(考试的需要)。本书的竞争对手是两本英文的认证书,不过它们都是复习性质的,不适合没有学过Java的读者阅读。而此书则既可作入门书,又可作复习书。想了解详细情况,可参考本人网站http://bestbooks.top263.net。 书店Java图书为了写作本段内容,本人特地前往书店,腰酸背疼腿抽筋地在书店里呆了很久,总算了解到一些最新信息,不过,也是大概的印象而已。 Java的入门书比较多,有国内作者也有国外作者的。特别留意了一下有关OO技术的章节,发现除了上面提到的几本,讲解得比较详细的几乎没有。国内作者的书仍然集中在入门书和JSP方面。还看到几本用于学校的教材,当然也是入门的。Java成为大学课程应该是Java影响力增长的表现,这是很可喜的现象。较深入的书主要是国外的,最多的是Wrox出版社的书,一水的印有作者大头像的红色封面,很容易识别。其它国外出版社的高级书就比较少。除了Wrox的书,Sun公司写的书也很多,记得有网友推荐过《Java 2核心技术》(两大册)可作基础书阅读,这次在书店里看到,方才想起来,但是没有仔细看过。还有比《Java 2核心技术》薄一些的书,前面提到过一本,这次在书店又草草翻了几本,感觉层次很高,很可能比Wrox的书还深。 说了很多,只想告诉大家选书的技巧,以上虽为个人观点,实际上也是自己多年经验教训的总结。还是那句话,买电脑书如同瞎子摸象。总之,本文不能保证你能买到好书,但也许能保证你买到一本不太差的书。 浅谈如何学习加密与解密技术--段钢 很多人都想学习解密,这东西刚入门时会让人沉迷进去,可以饭不吃、觉不睡。出现这种现像,也许是解密满足了人们的猎奇心里吧。但掌握这方面技术,对自身的提高确实有好处。可以通过跟踪软件,提高自己的调试技能,并且能了解他人程序思路,使自己写出更好的程序。研究解密技术有助于掌握一些系统底层知识,系统底层知识绝对是构造起大型软件的坚实基础。许多程序发展,都经历了这一锻炼过程的。 而大多数人可能认为解密是一门高深的学问。造成这种原因是以前这方面的技术资料缺乏,从而将“解密”这一技能“神”化了。初学者一般不知从何下手,由于没方向,花费了大量时间和精力,走了不少弯路。这里就给对这方面感兴趣的读者指明一个方向。 讨论前,先了解一下计算机中的程序。高级语言编写的程序,会编译成机器语言在CPU中执行,如Visual C++等。由于机器语言与汇编语言是一一对应的,因此就可将机器语言转化成汇编语言,这个过程称之为反汇编。而汇编语言可能读性是比较好的,这样就可分析程序流程,解析其功能了,这个过程就是解密(俗称破解)。也就是说,解密的基础是建立在汇编语言级别上的,因此想涉足这一领域的朋友,汇编语言一定得学好。汇编语言是大学计算机的必修课,这方面的书籍品种很多,虽然大多书本是以DOS汇编为讲解平台,但对理解汇编指令功能是没影响的。等汇编学好了,建议再掌握Win32编程。Win32程序设计就是API方式的Windows编程,学习Windows API将使您更深入地了解Windows工作方式。此类书籍有Charles Petzold著的《Windows程序设计》(以VC来讲解)。另一本是罗云彬著的《Windows环境下32位汇编语言程序设计》,它以MASM汇编为讲解平台。有了上面这些基础,你就可以参考《 加密与解密(第二版) 》这本书入门了。 学习解密其实很累的,需花费大量的时间,而且经常会碰壁,三五天毫无进展是极为平常的事情。这时你可能有点想退却,其实你不要着急,只要你认真学习,成功就在眼前。没有人是生来就什么都会的,如果你有问题,就大胆的去问你周围的人。学解密的秘诀就是勤奋+执着!记住并能做到这两点,你会变得很优秀的。 等你解密入门后,建议再看看Matt Pietrek、Jeffrey Ritcher等大师的专著,这些书是每个程序员都应该阅读的:《Windows 95 System Programming Secrets》(中文译名《Windows 95 系統程式设计大奧秘》),《windows高级编程指南》,《Windows2000编程技术内幕》,《Win32系统编程—Windows 2000应用程序开发指南》等。这样,你就对系统底层有一定的了解了。到了这个水平后,就可朝软件加密这块发展了,例如编写自己的加壳软件等。这时,可以阅读本站推出的《 软件加密技术内幕 》这本新书了,这本书可以让你了解PE的格式,教你如何编写PE分析工作,如何编写加壳工具等。 软件的加密与解密是一个迷人的研究领域,它几乎可以与任意一种计算机技术紧密结合——密码学、程序设计语言、操作系统、数据结构。而由于这样或者那样的原因,对于这一领域的关注程度一直还处于低温状态。而这两本书相信会为更多对知识怀有渴望的朋友多开辟一条走向这个领域的道路,并且进而推动这个领域的不断发展。 介绍了一些操作系统学习的经典书籍,包括理论上的、具体操作系统的。 Abraham Silberschatz的两本书: 1. 实用操作系统概念(影印版) 2. 操作系统概念(第六版 影印版) 这个作者绝对是顶尖级的,来自贝尔实验室,是目前世界上操作系统方面的领军人物。这两本书第二本和第一本很多地方相似,区别在于第二本理论偏重一些,第一本实例讨论的更多一些。这两本书别看很厚,但是写的非常流畅,属于比较易读的一类。 3. 现代操作系统(英文版·第2版) Andrew S. Tanenbuam(坦尼伯姆, AST)是第4本书的升级版,里面添加了一些新的操作系统方面的讨论,原理部分比第四本稍有增强。个人认为,是除了前面两本之外的最好的书。 4. 操作系统: 设计及实现(第二版)(英文影印版) 这个比较有名了,主要是分析minix源代码的书,顺带着讲了下原理,应该说是偏于实践的,可能当年的linus的教材就是这本,影响较大,可以帮助你了解一个文件系统或系统调用之类是如何实现的。当然,和目前的操作系统来讲,稍简单了一些。想做linux kernel hacker的同学此书可以一读。 5. 操作系统:现代观点(第二版 实验更新版)(英文版) Operating Systems: A design-Oriented Approach 这两本一般,但是还是比国内抄袭的教材强很多,可以作为补充阅读的书籍。 6. LINUX内核源代码情景分析(上册) LINUX内核源代码情景分析(下册) Understanding Linux Kernel Linux internal 这三本是最nb的linux内核分析书籍,后两本讲2.2内核,第一本讲2.4。 7. 4.4BSD操作系统设计与实现(英文影印版) 不说少了,原来berkeley那帮写bsd的其中几个人写的,经典就是它了。 8. UNIX操作系统设计(英文版) :古老的unix设计方面的书籍,应该说这本书在unix世界里面的影响是十分巨大的,很多后来的unix分枝,思想都是缘于此书。里面主要讲解unix各个部分实现时所用的算法,其中一些目前还在使用中。想了解一下unix实现但又没什么时间扣 minix或linux内核的朋友可以看看,在这本书上花费几十个小时,绝对超值:) 9.Linux内核完全注释 这一本书我觉得也很棒。它以Linux 0.11内核源码为基础进行详细的分析,解释细致到位。虽然不是“经典”,但仍推荐!凭借简洁明了的源码分析,你可以管窥Linux操作系统的奥秘。可惜现在还没有印刷版。相关网址:http://www.oldlinux.org “这本书(《敏捷软件开发:原则、模式与实践》)不但肯定是2002年度最好的设计类技术图书,而且在今后的几年中,很难出现比它更好的作品。” Robert C. Martin的经典著作Agile Software Development中文版(《 敏捷软件开发:原则、模式与实践 》)面世,这是计算机技术出版领域的一件大喜事。即使在今天技术图书市场非常繁荣的局面下,这本书的问世也仍然是值得广大开发者格外留意和关注的事件。这不仅是因为它刚刚荣获(2003年6月评选的)2002年度Jolt震撼大奖,更因为这本书本身的价值和独特魅力。 Robert Cecil Martin是软件开发领域里响当当的名字。1970年代,他还是个年轻小伙子的时候就是一位有名的UNIX黑客。经过长期的开发实践后,他成了软件开发领域中的知名专家。在Rational公司期间,Martin丰富的实践经验与Booch深厚的理论功底形成了完美的组合,把面向对象设计的理论与实践推向了高峰。1994年,Grady Booch的经典著作《Object-Oriented Analysis and Design with Applications》(中译本:《 面向对象分析与设计(原书第2版) 》)问世,与此几乎同时,Martin的第一本著作Designing Object-Oriented C++ Application Using the Booch Method也由Prentice Hall出品。这两本书彼此相互辉映,当时引起了很大的反响。这本书不单为Martin确立了软件设计领域顶尖专家的地位,而且奠定了他独一无二的写作风格。 阅读这本书(《 敏捷软件开发:原则、模式与实践 》)的过程,是一个充满了发现、领悟和兴奋的过程。我只读了其中几个章节,就已经知道这本书大大超过了事前的预期,是当代软件开发领域最杰出的著作之一。这个时候,Software Development Magazine每年一度的Jolt评奖工作正式开始,我冲到投票网站,毫不犹豫地给这本ASD投了一票。事后我愉快地得知,此书果然如我所愿地夺得了去年技术图书类最高奖项--Jolt震撼大奖。在阅读全书大约三分之一之后,我对于该书的主要特点和内容架构已经有了把握,于是跑到Amazon网站上,给该书写下了一篇评论,题目是:本年度的最佳设计类图书,在书评中我简单介绍了书的特点,并且做出结论:这本书不但肯定是2002年度最好的设计类技术图书,而且在今后的几年中,很难出现比它更好的作品。 当然,这并不是说我"慧眼独具",业内经验丰富、感官敏锐的高手大有人在。我听说在台湾,三位资深工程师联名上书某出版公司要求引进此书,并且自告奋勇去翻译。这些资深工程师收入丰厚,根本不是为了那点微薄的翻译酬劳而折腰,完全是希望能够把这本极有价值的好书介绍给更多的业内人士,造福大众。一本书能够引起这么大的热诚,可见它本身的魅力了。 那么究竟这本书好在哪里呢? 首先,该书延续了Bob大叔著作的一贯特色,以实例为本,不尚空谈,因此格外真实,摄人心魄。Martin从多年的写作中提炼出一种独特的风格,就是"引领式传授"。与别的作者不同,面对问题,Martin不是把最后那个完美的答案一下子放在你面前,让你拜倒在他脚下,被他的睿智折服。他很清楚,当读者在大师面前拜倒时,内心充满了挫折感,同时会丧失自信。而自信是一个设计者由成功走向成功的最关键因素。因此,Martin还原了一个真实的设计过程--带领着读者一起设计。读者在书中能够看到,他也会犯错误,也要面临痛苦的选择,也会做一些愚蠢的决定,也会被一些"激动人心"的想法诱惑,但是,最后他能够跨越重重荆棘,看透重重迷雾,得到优秀的设计。他跟我们一样,是一个有血有肉的设计者,而不是什么天赋异禀的天才。正因为如此,他能达到的,我们也能达到。这样的风格,使我们从阅读中能够逐渐体会到软件设计最精髓的东西:张力与平衡。如何选择,如何思考,如何面对困境,这些才是最宝贵的财富。这些财富,就在我们自己的大脑里,而Martin的书,就是打开这个财富宝库的钥匙。此外,读者在阅读这本书的时候会发现,Martin在教授具体技术的时候,始终以实例教学为主。比如附录中教授UML,就是通过两个实例来教授UML基础知识。诸位不妨从这两个附录开始阅读此书,体会一下作者的风格,看一看在UML学习方面,究竟是传统的罗列式教材给你的印象更深,还是以实例为依托的Martin式风格更有效率。 其次,详略得当。Martin很清楚哪些东西应该讲的细致一些,哪那些东西可以讲的抽象一些。这一点也是大师风范。软件设计这个领域,有很多东西是应该讲清楚,却很少有人能讲清楚的,比如设计中的权衡,实例的综合运用。还有很多东西,是没有必要长篇大论的,却被很多人拿来喋喋不休,比如说一些基本的设计原则或模式,一些开发过程思想,一些技术理念等等。这些东西讲得简明扼要能够给人以智慧的启迪,讲得冗长拖沓,定下几十上百条规则方法,则必然脱离实际,堵塞和束缚读者的思想。可惜很多作者不明白这个道理,或者是虽然明白但是假装不明白,把很多简明睿智的概念变成了又臭又长的裹脚布。Martin的书则决无此弊。这也应当归功与他多年的实践经验。从这本书中我们可以看到,他对于思想和原则一般是言简意赅,意到为止。而对于有助于提高读者实际设计能力的实例,则不惜笔墨,详加阐述,可谓煞费苦心。 最后一点,也是相当重要的一点,是本书选材匠心读到,精彩绝伦,特别是还有大量独创性和创新性的技术,来自Martin多年来的研发实践,十分珍贵。这比之当下流行的抄袭之风,已经不可同日而语。比如本书的Acyclic Visitor,Extension Object,Monostate,Taskmaster等模式,并不属于经典的23模式,很多都是来自Martin自己的创造,配合实例解析,有助于大幅度提高读者的设计实践能力。 总之,这本书是近年来难得的佳作,希望大家都来好好阅读和体会这本书,它将为你的设计能力带来一个质的提升,同时,也有助我们对"怎样算是一本好的技术图书"有更进一步的认识。(本文节选自《敏捷软件开发:原则、模式与实践》的序言,作者孟岩) -------------------------------------------------------------------------------- 教本与手册的曼妙组合《C++ 标准程式库》孟岩译序 -------------------------------------------------------------------------------- IT技术书籍市场,历来是春秋战国。一般来说,同一个技术领域 总会有那麽数本、十数本、甚至数十本定位相似的书籍相互激烈竞争。其中会有一些大师之作脱颖而出,面南背北,黄袍加身。通常还会有後来者不断挑战,企图以独到特色蠃得自己的一片天地。比如说在演算法与资料结构领域,D. E. Knuth的那套《The Art of Computer Programming》一至三卷,当然是日出东方惟我独尊。但是他老人家的学生Robert Sedgewick凭着一套更贴近实用的《Algorithms in C》系列,也打出自己一片天下,成为很多推荐列表上的首选。就C++ 运用经验类书籍来说,Scott Meyers的《Effective C++》称王称霸已经多年,不过其好友Herb Sutter也能用一本《Exceptional C++》获得几乎并驾齐驱的地位。嗨,这不是很正常的事吗?技术类书籍毕竟不是诗词歌赋。苏轼一首「明月几时有,把酒问青天」,可以达到「咏中秋者,自东坡西江月後,馀词尽废」的程度,但怎麽可能想像一本技术着作达到「我欲乘风归去,又恐琼楼御宇,高处不胜寒」的境界!谁能够写出一本技术书,让同一领域後来者望而却步乾脆死心,那才是大大的奇迹! 然而,您手上这本《The C++ Standard Library》,作为C++ 标准程式库教学和叁考类书籍的定音之作,已经将这个奇迹维持了三年之久。按照IT出版界时钟,三年的时间几乎就是半个世纪,足以锤炼又一传世经典! 1998年C++ Standard通过之後,整个C++ 社群面临的最紧迫任务,就是学习和理解这份标准给我们带来的新观念和新技术。而其中对於C++ 标准程式库的学习需求,最为迫切。C++ 第二号人物Andrew Koenig曾经就C++ 的特点指出:『语言设计就是程式库设计,程式库设计就是语言设计』(注1)。C++ Standard对程式库所做的巨大扩充和明确规范,实际上即相当於对C++ 语言的能力做了全面提升与扩展,意味着你可以站在无数超一流专家的肩上,於轻敲键盘间,将最出色的思想、设计与技术纳入囊中,让经过千锤百炼的精美代码成为自己软体大厦的坚实基础。可以说,对於大多数程式师来说,标准C++ 较诸「ARM时代」之最大进步,不是语言本身,而恰恰是标准程式库。因此,我们可以想像当时人们对C++ 标准程式库教学类书籍的企盼,是何等热切! 注1:"Language design is library design, library design is language design",叁见Andrew Koenig, Barbara Moo合着《Ruminations on C++》第25, 26章。 一方面是已经标准化了的成熟技术,另一方面是万众期待的眼神,我们完全有理由认为,历史上理应爆发一场鱼龙混杂的图书大战。它的典型过程应该是这样:先是一批快刀手以迅雷不及掩耳盗铃(注2)之势推出一堆敛财废纸,然後在漫长的唾骂与期待中,大师之作渐渐脱颖而出。大浪淘沙,最後产生数本经典被人传颂。後虽偶有新作面世,波光点点已是波澜不兴。 注2:此处非笔误,而是大陆流行的一句 "新俚语",意思十分明显,就是 "迅雷不及掩耳" 地 "掩耳盗铃"。 然而,这一幕终究没有在「C++ 标准程式库教学与叁考书籍」领域内出现。时至今日,中外技术书籍市场上这一领域内的书籍为数寥寥,与堆积如山的C++ 语言教学类书籍形成鲜明对比。究其原因,大概有二,一是这个领域 的东西毕竟份量太重,快刀手虽然善斩乱麻,对於C++ 标准程式库这样严整而精致的目标,一时也难以下手。更重要的原因则恐怕是1999年8月《The C++ Standard Library》问世,直如横刀立马,震慑天下。自推出之日起至今,本书在所有关於C++ 标准程式库的评论与推荐列表上,始终高居榜首,在Amazon的销量排行榜上名列所有C++ 相关书籍之最前列。作者仅凭一书而为天下知,成为号召力可与Stan Lippman, Hurb Sutter等「经典」C++ 作家比肩的人物。此书之後,虽然仍有不少着作,或深入探讨标准程式库的某些组件,或极力扩展标准库倡导的思想与技术,但是与《The C++ Standard Library》持同一路线的书籍,再没有出现过。所谓泰山北斗已现,後来者已然无心恋战。 於是有了这样的评论:『如果你只需要一本讲述C++ 标准程式库和STL的书籍,我推荐Nicolai Josuttis的《The C++ Standard Library》。它是你能得到的唯一一本全面讲述C++ 标准程式库的书,也是你能想像的最好的一本书。』这种奇异情形在当今技术书坛,虽然不是绝无仅有,也是极为罕见。 究竟这本书好到什麽程度,可以获得这麽高的评价? 我正是带着这分疑问,接受侯捷先生的邀请,着手翻译这本经典之作。随着翻译过程的推进,我也逐渐解开了心中的疑惑。在我看来,这本书的特点有四:内容详实,组织严密,态度诚恳,深入浅出。 首先,作为一本程式库叁考手册,内容详实全面是一项基本要求。但是,本书在这方面所达到的高度可以说树立了一个典范。本书作者一开始就提出一个极高的目标,要帮助读者解决「使用C++ 标准程式库过程中所遇到的所有问题」。众所周知,C++ 标准程式库是大家伙,每一部分又有很精深的思想和技术,既不能有所遗漏,又不能漫无边际地深入下去,何取何舍,何去何从,难度之大可想而知!作者在大局上涵盖了C++ 标准程式库的全部内容,在此基础上又对所有组件都进行细致的、立体式的讲解。所谓立体式讲解,就是对於一个具体组件,作者首先从概念上讲解其道理,然後通过漂亮的范例说明其用法,申明其要点,最後再以图表或详解方式给出叁考描述。有如钱塘江潮,层层叠叠,反反复复,不厌其烦。读完此书,我想您会和我一样感受冲击,并且完全认可作者付出的巨大心血。 C++ 标准程式库本身就是一个巨大的有机整体,加上这本书的立体讲解方式,前後组织和对应的工作如果不做好,很容易会使整部书显得散乱。令人钦佩的是,这本书在组织方面极其严密,几无漏洞。相关内容的照应、交叉索引、前後对应,无一不处理得妥善曼妙。整体上看,整本书就像一张大网,各部分内容之间组织严谨,契合密切,却又头绪清晰,脉络分明,着实难能可贵。我在阅读和翻译过程中,常常诧异於其内容组织的精密程度,简直像德国精密机械一样分毫不差 。後来才想到,本书作者Nicolai Josuttis就是德国人,精密是德意志民族的性格烙印,名不虚传! 说起德意志民族,他们的另一个典型性格就是诚实坦率。这一点在这本书同样有精彩的展现。身为 C++ 标准程式库次委员会成员,作者对於 C++ 标准程式库的理解至深,不但清楚知道其优点何在,更对其缺陷、不足、不完备和不一致的地方了如指掌。可贵的是,在这些地方,作者全不避讳,开诚布公,直言不讳,事实是什麽样就是什麽样,绝不文过饰非,绝不含混过关。作为读者,我们不仅得以学到好东西,而且学到如何绕开陷阱和障碍。一个最典型的例子就是对於valarray的介绍,作者先是清清楚楚地告诉读者,由於负责该组件设计的人中途退场,这个组件没有经过细致的设计,最好不要使用。然後作者一如既往,详细介绍valarray的使用,完全没有因?前面的话而稍微有所懈怠。并且在必要的地方将valarray的设计缺陷原原本本地指出来,让读者口服心服。读到这些地方,将心比心,我不禁感叹作者的坦诚与无私,专精与严谨。 本书最具特色之处,就是其内容选取上独具匠心,可谓深入浅出。本书的目的除了作为手册使用,更是一本供学习者阅读学习的 "tutorial"(自学教本)。也就是说,除了当手册查阅,你也可以捧着它一篇一篇地阅读学习,获得系统化的坚实知识。一本书兼作 "tutorial" 和 "reference",就好像一本字典兼作「作文指南」,没有极高的组织能力和精当的内容选择,简直难以想像会搞成什麽样子。了不起的是本书不仅做到了,而且让你感觉,学习时它是一本最好的 "tutorial",查阅时它是一本最好的 "reference",我要说,这是个奇迹!单从学习角度来说,本书极为实用,通过大量鲜明的例子和切中要害的讲解让你迅速入门,而且绝不仅仅浅尝辄止,而是不失时机地深入进去,把组件的实作技术和扩展方法都展现给读者。单以STL而论,我经常以侯捷先生提出的「STL学习三境界」来描述一本书的定位层次,这本书就像一座金字塔,扎根於实用,尖锋直达「明理」和「扩展」层次。从中你可以学到「reference语意」的STL容器、smart pointer(灵巧指标)的数种实现、扩充的组合型仿函式(composing function object)、STL和IOStream的扩展方法、订制型的配置器(allocator)设计思路等等高级技术,也能学到大量的实践经验,比如vector的使用技巧,STL容器的选择,basic_string<> 作为容器的注意事项等等。可以这麽说,这本书足以将你从入门带到高手层次,可谓深入浅出,精彩至极! 我很高兴自己第一次进行技术书籍翻译,就能够碰到这样一本好书,这 要深深感谢侯捷先生给我一辈子都庆幸的机会。翻译过程出乎意料地艰辛,前後持续将近10个月。我逐字逐句地阅读原文,消化理解,译成自以为合适的中文,然後交给侯先生。侯先生接手後再逐字逐句地阅读原文,对照我的粗糙译文,进行修订和润色,反复品味形成最终译稿。作为译者,侯先生和我所追求的是,原书技术的忠实呈现加上完全中文化、中国式的表达。我们为此花费了巨大的心力,对我来说,付出的心血远远超过一般翻译一本书的范畴。虽然最终结果需要广大读者评论,但今天面对这厚厚的书稿,我问心无愧地享受这份满足感。我最大的希望是,每一位读者在学习和查阅这本中文版的时候,完全忘掉译者曾经的存在,感觉不到语言的隔阂,自由地获取知识和技术。对於一个初涉技术翻译的人来说,这个目标未免太贪心了,可是这始终会是我心 的愿望。一个译者应该是为了被忽略而努力的。 最後,感谢侯先生一直以来对我的欣赏和帮助,感谢您给我的机会,我十分荣幸!感谢华中科技大学出版社的周筠老师,您始终友好地关注着我,鼓励着我。感谢CSDN的蒋涛先生,您的热情鼓励始终是我的动力。感谢我的父母,弟弟,你们是我最爱的人,是我最坚强的支柱!感谢曾经帮助过我,曾经关心过我的每一个人,无论你现在怎样,我为曾经拥有过的,仍然拥有着的每一片快乐和成果,衷心地感谢你! 祝各位读书快乐! 孟岩 2002年5月於北京 《程序员》推荐我的.NET书架 创建人: 《程序员》 .NET推出以来,随之而来的相关图书铺天盖地,但真正有深度的、可以反复参考的、值得收藏的却不多见,笔者在这里介绍三本图书,它们的风格、目标和内容大相径庭,但却从不同的角度充实、提高开发者的技能。 《Applied Microsoft .NET Framework Programming 程序设计》 [美] Jeffrey Richter著 商丽媛译北京:清华大学出版社,2002 这本书的名气就不用笔者累赘了。这是一本有关.NET框架的公共语言运行库的书,它不是针对某种特定编程语言的编程技术书籍,也不专门针对Windows窗体,XML Web服务,Web窗体等特定领域,但书中提出的各项技术都适用于这些应用程序类型。书中通过大量的代码示例准确、深入地说明了CLR和FCL部分类的工作原理和功能(这也是Jeffrey Richter的一贯风格,正是这点使他的书倍受读者喜爱和推崇),可惜的是这些代码主要以C#的形式出现,使用VB.NET和托管C++的读者恐怕要有点头疼了。在Jeffrey Richter的眼里,最适合他用来讲述的语言却是IL,幸亏他只在少数地方使用。要更好地阅读此书,面向对象编程的知识是必需的,因为所有的.NET框架特性都是面向对象的。如果你还不太熟悉这些,找一本讲解面向对象编程的书看看会很收益。比较遗憾的是,这本经典图书的中文版翻译质量不高,建议读者对照英文版来阅读。 《 C#高级编程 》 Simon Robinson k.Scott Allen等著 杨浩 杨铁男等译北京:清华大学出版社,2002 这本书秉承Wrox公司一贯的“Programmer to Programmer”的理念,它的定位是讲述最新的.NET编程技术,站在程序员的角度,指导程序员学习实用开发技术。书的内容共分为六个部分,几乎覆盖了.NET全部的技术主题。第一、二部分分别介绍了c#语言的背景知识和.NET环境中的编程规则。第三部分介绍如何使用ADO.NET访问数据库,文件和注册表操作,以及目录和Active Directory交互等。第四部分介绍如何编写在网站上运行的组件,如何编写网页。第五部分介绍.NET对处理COM和COM+的支持,并讨论如何编写与这些技术交互的C#代码。第六部分介绍一些高级论题,包括使用GDI+绘图、Windows服务、远程服务和安全性。如果你想了解某个编程技术,比如:ADO.NET数据访问或者在COM中使用.NET组件,这本书对你很有价值。但中文翻译版同样出现奇怪的现象:Professional C# (Beta 2 Edition)的中文版书名是《 C#高级编程 》,而其后的《Professional c# 2nd Edition》却被标以《 C#高级编程(第二版) 》(特版精品)。 《 .NET系统架构与开发 》曾登高编著北京:电子工业出版社,2003 这本书是一本在.NET平台上开发应用程序的指南。书的宗旨不是讲解基本的编程知识,而且它围绕着.NET系统架构对各种编程方案、编程技巧进行了详细地论述和比较。这本书的主要目的是对项目开发中可能遇到的典型问题给出各种可行的解决方案,并对各方案的适用情形、优势和劣势进行了详细的讨论,帮助开发者有效地进行应用程序开发。全书共分三章,第一章讲述了.NET的一些重要概念和术语;第二章深入分析了数据层、逻辑层和表现层的具体实现技术;第三章对应用程序开发周期中的部署、团队开发、性能、调试和安全问题进行了专题研究。如果你正在.NET平台上开发项目,相信这本书可以给你许多有益的建议和帮助。遗憾的是,这本书的结构显得略微松散,有些地方的翻译质量同样不尽人意。现在,让我们来看一小段代码。 namespace test { public class test { static void Main(string[] args) { baseClass class1=new myClass(); Console.WriteLine("Get1方法:"+class1.Get1()); Console.WriteLIne("Get2方法:"+class1.Get2()); Console.ReadLine(); } } public class baseClass { public virtual string Get1() {return "基类虚拟方法Get1";} public string Get2() {return "基类非虚拟方法Get2";} } public class myClass:baseClass { public override string Get1() {return "继承类方法Get1";} public new string Get2() {return "继承类方法Get2";} } } 运行结果如下: Get1方法:继承类Get1方法 Get2方法:基类非虚拟Get2方法 这正是我们希望的结果,你也许很想知道CLR为何如此聪明,翻开你手中的经典图书。《 C#高级编程 》(附录A面向对象编程的原则)会这样告诉你:“如果方法不是virtual,编译器就是用声明的引用类型。这时,不管class1引用的是什么,都应调用baseClass的Get2方法。如果方法是virtual,编译器就会生成代码,在运行时检查class1引用实际指向哪个实例,然后确定这个实例属于哪个类,并调用适当的Get1的重写方法。每次执行语句时,需要确定应调用那个重载方法。” 好的,解释得非常清楚了。可还是有些人不会满足,他们想知道更多:编译器是如何处理这个问题的?说明这样的问题正是《 APPLIED MICROSOFT .NET FRAMEWORK PROGRAMMING(影印版) 》的特色之一。你可以从中找到如下的阐述:“通过查看元数据,CLR可以判断出一个非静态方法是虚方法还是非虚拟方法。然而,CLR在调用方法时。没有用到该信息。CLR提供了两条IL指令用于调用一个方法:call和callvirt。call IL指令根据引用的类型调用方法,callvirt IL指令根据所指向的对象的类型调用方法。在编译源代码时,编译器知道是否应该调用一个虚方法,并发出合适的call或callvirt IL指令。”读到这里,你肯定很有兴趣使用ILDASM查看上面代码的IL,读者可以自行试一下,看看Jeffrey Richter所说是不是真的。另外,《 APPLIED MICROSOFT .NET FRAMEWORK PROGRAMMING(影印版) 》对它涉及的主题都给出了最全面的阐述,这个问题其他方面,比如被封闭类型的虚方法调用,虚方法版本控制,这些问题在书中同样给出了解释。《 APPLIED MICROSOFT .NET FRAMEWORK PROGRAMMING(影印版) 》和《 C#高级编程 》两书中对许多问题的讲述都具有上面所讲的特点,比如:程序集、引用类型和值类型、装箱、拆箱、字符串等等。碰到这些问题时,建议读者先阅读《 C#高级编程 》一书中的相关内容,然后再到《 APPLIED MICROSOFT .NET FRAMEWORK PROGRAMMING(影印版) 》中寻找剖析,这样也许可以加快理解的速度。另外,这样的比较并不是说明两本书的高低,两本书的目标和侧重点本来就不相同。许多读者大概都有过学车的经历。踩油门,挂档,把握方向盘,好像不是很难,在空场地练一会就OK了,但如果你这样就大摇大摆地上路,结果可就难说了。《 C#高级编程 》是我阅读的第一本.NET图书,我从中学会了许多的编程技术。《 APPLIED MICROSOFT .NET FRAMEWORK PROGRAMMING(影印版) 》是我阅读的第二本.NET图书,通过它我了解了CLR和FCL部分类的工作原理和功能,它有助于我编写高质量的代码。之后我还翻看了一些其他的.NET图书,但感觉内容都平淡无奇,千篇一律,没有闪光点和太大的价值。前段时间由于工作的关系,我接触了《 .NET系统架构与开发 》一书,它就像当时我学开车时指导我的老师傅,他用丰富的经验洞察着路上的情形并提示着我应该做什么,让我收益匪浅。《 .NET系统架构与开发 》介绍了.NET框架中应用程序构造、部署、调试、性能、安全等诸多方面的实践经验,文章均由微软从事10年以上编程经验的资深程序员撰写,如果你正在.NET上开发应用程序,相信它可以给你许多有益的建议和指导。你写过这样的代码吗? void DoQuery(string Id) { SqlConnection sql=new SqlConnection(@"data source=localhost;" + "user id=sa;password=password;"); sql.Open(); sqlstring= "SELECT hasshipped" + " FROM shipping WHERE id='" + Id + "'"; SqlCommand cmd = new SqlCommand(sqlstring,sql); ??? 这段代码有问题吗?我们不妨来看看《 .NET系统架构与开发 》书中的分析。这段代码存在严重的安全缺陷。原因有三:第一,到SQL Server的连接使用系统管理员账号(sa);第二,系统管理员sa账号的密码使用“password”的聪明做法!第三,真正值得担忧的问题是SQL语句sqlstring构成方式,如果用户输入ID--1001,你将得到这样的语句:SELECT hasshipped FROM shipping WHERE id = '1001',这是没有任何问题的。不妙的是攻击者不会这么善良,他们会输入"'1001' DROP table shipping--",这时你得到的就是下面的语句: SELECT hasshipped FROM shipping WHERE id = '1001' DROP table shipping -- '; 等你发现shipping表莫名其妙地被删除时,许多东西就难以挽救了。不幸的是,类似这样的代码在许多的图书中是司空见惯的。 《程序员》推荐好书推荐 创建人: 《程序员》 书名: C++程序设计陷阱 原书名:Avoiding common Problems in coding and design 原出版社:Addison-Wesley 出版社:中国青年出版社 译者:陈君 作者:stephen c.dewhurst 出版日期:2003-5-1 定价:¥36.80 该书对于深入学习C++语言,有着较为实用的指导意义。基于两个原因,作者提出了此书的着眼点:一是惯性的重要性,二是其他人可能会维护我们编写的代码。作者将常见问题分成了9大类,即:基本问题、语法、预处理器、转换、初始化、内存和资源管理、多态、类设计以及层次结构设计。书中列举出可能出现的99个陷阱问题,并对每一个错误和它所导致的错误结果进行仔细讲解,再结合实例给出相应的解决办法。本书作者Stephen C.Dewhurst曾经是贝尔实验室中第一批C++使用者,具有将近20年的C++应用经验,他曾经用C++解决了诸多领域中的问题,如编译器设计、证券安全交易、电子商务以及嵌入式通讯等领域。同时他还是Programming in C++的作者、C/C++ User Journal杂志的编辑、C++ Report杂志的专栏作家。并且,他自己还开发了两个C++编译器,并撰写了大量的C++编程文章。具有多年的理论和实践经验。通过该书,读者可以学会更深入的高级编程以及设计中常用到的C++特性,更重要的是能学会警觉、冷静和规避。此书适合于有一定编程经验、需要在实践中大力提升自己的读者阅读。 书名:4.4BSD操作系统设计与实现 原书名:The Design and Implementation of the 4.4BSD Operating System 原出版社:Addison Wesley 作者:Marshall Kirk McKusick,Keith Bostic, Michael J. Karels,John S.Quarterman 中文版  出版社:中国电力出版社   出版日期:2003-5 英文版  出版社:人民邮电出版社   出版日期:2002-9-1 该书是介绍BSD中较为知名和权威的经典著作。几位作者也都是BSD开发过程中的重要组织者和主要开发人员,所以书中对BSD的理解和介绍较为深入全面。此外,书中提供的参考文献、附带习题,适合于读者学习和巩固。书中对4.4BSD操作系统的设计和实现进行了全面描述,在讨论设计理论的同时,注重实现的细节。全书内容共分为五个部分14章。主要内容包括:BSD的历史、进程管理和内存管理、I/O系统、进程间通信、网络通信以及网络协议、系统操作知识等。书中内容将使UNIX内核研发人员、UNIX应用研发人员、UNIX系统管理员以及UNIX的爱好者们受益。但更好阅读此书的前提是读者必须掌握操作系统的基础知识。 书名:人件(第2版) 原书名:Peopleware:Productive Projects and Teams, 2nd Ed 原出版社:Addison Wesley 作者:Tom DeMarco,Timothy Lister 译者:UMLChina翻译组 丛书名:软件管理与软件工程译丛 出版社:清华大学出版社 出版日期:2003-6-1 定价:¥29.80 从2003年初开始,网上就有数篇文章引起了开发人员的热烈讨论,文章的标题非常煽动和情绪化:“别把开发人员当成牲口”、“开发人员是人吗?”、“人的问题:关于《人件》”、“办公室空间,下一场革命”,开发人员和管理者之间的矛盾似乎一下子被推至了前沿。这些文章的主题直奔一本书,一本讲述软件团队管理的经典之作——《人件》。《人件》第1版于1987年出版,作者推崇人本管理思想,明确指出知识型企业的核心是人,而不是技术,呼吁企业管理者给予软件工作人员以充分的自由和信任。该书推出后,立即在西方引起了轰动,被誉为“几十年来对美国软件业影响最大的理念”。1999年,《人件》第2版出版,增补了8章新内容,对大中型组织中的团队如何运作进行了深入探讨。第2版的内容共分为6个部分34章,6个部分分别是:管理人力资源、办公环境、适当人选、生产力不断增长的团队、应该很开心地在这里工作。此书值得软件公司管理者仔细研究和深思。 书名:加密与解密(第二版) 作者:段钢出版社:电子工业出版社 出版日期:2003-6-1 页码:519 定价:¥49.00 该书是看雪学院站长看雪(段钢)的力作。稿件的最初来源是看雪学院(http://www.pediy.com)的《论坛精华》,因此《加密与解密》也算是一部集思广益的集体智慧结晶。该书第一版上市后,一时间全国热销,引起了不少讨论,此书为第二版新作。此书在第一版的基础上,补充了许多新技术。全面讲述了Windows平台下的最新软件加密与解密技术及相关解决方案,采用循序渐进的方式,从基本的跟踪调试到深层的拆解脱壳,从浅显的注册码分析到商用软件保护,几乎囊括了Windows下的软件保护的绝大多数内容。全书共分三部分。第一部分介绍加密解密相关的基础知识。第二部分讲述各种最新的软件加密解密技术及方法,如静态分析技术、动态分析技术、序列号、警告窗口、时间限制、加密算法MD5、SHA、RSA、ElGamal等。第三部分主要介绍PE文件的知识,如增加文件功能、加壳与脱壳、补丁技术等。该书是国内许多一流高手的精心之作,通过大量实例解析了软件加密与解密的最深层,是一本不可多得的密类图书。 书名: 泛型编程与STL 原书名:Generic Programming and the STL: Using and Extending the C++ Standard Template Library 原出版社:Addison-Wesley Pub Co 作者:Matthew H. Austern 译者:侯捷 出版社:中国电力出版社 出版日期:2003-4-1 定价:¥72.00 此书为中国电力出版社推出的“深入C++系列”图书之一。由知名的 C++ 专家 Matthew H. Austern 执笔、台湾著名技术作家侯捷先生翻译。全书以C++为载体,内容共分为三篇16章。第一篇为泛型编程导入,讲述了泛型思维的演进和STL的组织概念。第二篇STL Concepts参考手册,梳理了STL所涵盖的全部concepts的完整规格,第三篇为算法与类的参考手册,内容包括了全部components的完整规格。原书作者这样评价:虽然书中所谈都是C++写成的算法,但它不是一本算法导入型教科书,也不是一本C++课本。而是因为STL对templates的使用方式不同于其他的C++程序,所以此书讨论了一些templates高级技术。因此很好阅读此书的前提是读者必须知道如何撰写基本的C++,同时也要知道O(N)表示法的意义。 “如果要详细了解算法和数据结构,两本标准参考书是The Art of Computer Programming(即《 计算机程序设计艺术精装共三卷(第3版·影印版) 》)以及Introduction to Algorithm(即《 算法导论(第二版影印版) 》,国内高等教育出版社推出其影印版);如果要入门C++,那最好的两本书是The C++ Programming Language(即《 C++程序设计语言(特别版 影印版) 》,其特别版的中文版由机械工业出版社出版,英文影印版由高等教育出版社推出)和《C++ Primer》(第三版的中文版由中国电力出版社推出)”。 书名:快速软件开发 原书名:Rapid Development 原出版社:Microsoft Press 作者:Steve McConnell 影印版 书名:快速软件开发 出版社:机械工业出版社 出版日期:2003-3-1 定价:¥58.00 中文版 书名:快速软件开发——有效控制与完成进度计划 译者:席相霖 等 出版社:电子工业出版社 出版日期:2002-1-1 定价:¥58.00 页码:470 此书曾获得美国Jolt大奖,被誉为软件开发最好的实践指南。是一本真正的实践经验集。作者McConnell为微软高级顾问,他早年从程序开发一步步做起,积累了大量的实践经验,作者在书中列举出了几十种可以直接应用于软件项目,以提高开发速度的最佳实践方法、开发策略和实用技巧,而且还辅以大量的具体范例、真实数字和典型错误,使全书充满了来自实践的真知灼见和有效指导。该书最早出版于1995年,2002年随着软件工程和项目管理在国内的热潮,此书被电子工业出版社引入国内。今年3月份,机械工业出版社又推出其影印版。全书内容共分为三个部分43个章节,即:有效开发、快速开发和最佳实践三大部分。如何提高软件开发的速度?怎样保证项目按进度完成?如何结合项目实际情况,制订满足项目进度、成本、质量与其他目标要求的最佳方案?阅读此书,定会给你带来新的收获。全书条理清楚,脉络分明,范例得当,内容涵盖了软件工程的方方面面,是传统软件工程的经典!尤其建议软件企业管理人员仔细阅读。 《程序员》推荐软件工程好书榜 创建人: 《程序员》 开场白纳波科夫说过,对于原书,书评其实不提供什么特别有用的信息;如果它能有所反映,那映出的也只是书评者个人的智力和品行。普通书评如此,“好书榜”也可作如是观:这是对本行业、本领域的一次速写和群像。从这个角度读好书榜,收获总会大于单纯的书目信息。本期的专家组为“软件工程”这片模糊的地域绘制了一幅绝妙的地图。所谓绝妙,首先体现在“一致”上:专家们的选目非常集中,有几部名著近乎全票当选;我们甚至能发现大多数入选者都来自同一个出版社(Addison-Wesley)。这部分地更新了我们对软件工程的理解:在这个领域,共识不仅存在,而且非常明确。但专家们又在另一方面表现出惊人的“分歧”:同一部论著,时而属于“总体方法论”,时而属于“项目管理”,总会被不同的专家归入不同的分类中。这里与其指责分类的含混,不如说“软件工程”这个题目本身就抵制各种画地为牢的分类,它的各片领地、各个子民都息息相通。也就是在这些“一致”与“分歧”之间,闪耀着软件工程的宝藏。这是我们作为主持人,作为给群像按快门的幸运者,在第一时间攫取的收获。 总体方法论和过程 第1名:解析极限编程——拥抱变化(影印版) 原书名:Extreme Programming Explained:Embrace Change 作者:Kent Beck 出版社:中国电力出版社 原出版社:Addison-Wesley 页书:194 定价:26 出版日期:2003-9-1 专家评语:曲俊生: XP(极限编程)由于其高度可操作性,尤其是对于业界众多实践的总结,在敏捷软件开发方法中一马当先,获得了广泛的研究与关注。本书是了解XP的必读宝典,其中对于XP的原则、核心价值、最佳实践都有深入的描述,更加难能可贵的是,作者并没有效法其他鼓动者,将XP推到“万金油”的高度,而是非常清楚地列举了它不适用的地方。同时,作者也指出,不要太深入地追究您在项目中采用的是否是完全的XP实践,而应该根据项目的实际进行剪裁。本书适合对于敏捷软件开发感兴趣,同时又想找到一个可操作性较强方法的开发人员。 王咏刚:单凭书名里“拥抱变化”这四个字,Kent Beck这本专门给大伙儿解释极限编程是什么东东的红宝书就没白写。要说也是,那些没事儿就鼓捣世界级的软件工程理论、动辄就要写1000页以上大部头的老先生们做梦也想不到,他们的眼中钉肉中刺,他们想方设法要“管理”、“控制”的对象——软件开发里的“变化”——在Beck看来就像是杨过身边的大雕,虽然长得丑点儿,却能陪你练剑,让你成为真正的大侠。听Beck的没错,赶快放下架子,和“变化”打成一片吧,要不然你永远也甭想练成独孤九剑。 第2名:敏捷软件开发(影印版) 原书名:Agile Software Development 作者:Alistair Cockburn 出版社:人民邮电出版社 原出版社:Addison-Wesley 页数:324 定价:35 出版日期:2003-8-1 专家评语:曲俊生:很早以前就读到英文的电子版,在很大程度上,本书是对于RUP等方法论的颠覆,尤其是在国内“软件蓝领”宣传大行其道的时候,本书构成了一副有效的清醒剂。本书是Cockburn从20多年的IBM工作中总结出来的实践结晶。书中充满了睿智的比喻与描述,例如,将软件开发形容成一场游戏。书中对于水晶方法的介绍固然可贵,但是更加精彩的是对于人、沟通等主题的深入描述,可以说,这是既《人件》之后对“人”在软件开发中重要作用描述的又一本经典著作。该书也不是了解SE(软件工程)的入门书籍,适合于对传统软件开发过程有深入理解,但是对于敏捷软件开发了解不深的PM(项目经理)详细阅读。 第3名:测试驱动开发(影印版) 原书名:Test-Driven Development 作者:Kent Beck 出版社:中国电力出版社 原出版社:Addison-Wesley 页数:226 定价:32 出版日期:2003-8-1 专家评语:徐锋:分析、设计、编码、测试,已经成为了软件开发领域亘古不变的真理。Kent Beck,这一全力追求敏捷,希望将编程发挥到极限的黑客级大师,提出了颠覆性的理论——测试先行。在本书中,作者结合编程实例,说道理、讲方法,并结合自动化测试框架来提高效能。让笔者看完之外,就有跃跃欲试之感,叛逆的精神融入了每一个细胞。 分析和设计 第1名:编写有效用例原书名:Writing Effective Use Cases 作者:Alistair Cockburn 出版社:机械工业出版社 原出版社:Addison-Wesley 页数:304 定价:25 出版日期:2002-7-1 专家评语:张恂:用例是10多年来最重要的需求分析技术,更是现代软件过程和项目管理的主驱动轴。随着对用例理解的深入,我不禁倒吸一口气:对于大多数项目,如果不细化到用例这个层次,我们过去写的所谓“需求”其实都算不上真正的需求。此书是继Ivar Jacobson的OOSE之后,用例两大流派的“教主”之一Alistair Cockburn的代表之作,而且我一直认为它是迄今为止最好的用例教材。 10多年前Cockburn曾经听过Jacobson的课,没想到后来他在用例技术的实用化方面做出了贡献,大有青出于蓝而胜于蓝之势。大概与作者喜欢作诗(以及他对道德经的爱好)有关,我很喜欢他的写作风格:依着人们的直觉娓娓道来,在平淡无奇的文字背后却折射出极其丰富的项目经验和扎实的专业技巧,读完之后你会惊讶地发现一切竟然如此简单和美妙,这不就是软件开发的真谛么?徐锋:用例分析技术是一个伟大的创举,它将开发团队带到了客户的视角上,这是一个良好的驱动点。掌握用例分析技术,将对你的职业生涯带来很大的益处。《编写有效用例》是你的起点,本书能够帮助你真正有效地利用该技术,更好地掌握这一看似十分简单、却又十分复杂的需求分析方法。薄薄的一本书,却记载着方方面面问题的答案,从这里腾飞吧。 第2名:重构——改善既有代码的设计(影印版) 原书名:Refactoring: Improving the Design of Existing Code 作者:Martin Fowler 译者:侯捷 熊节出版社:中国电力出版社 原出版社:Addison-Wesley 页数:431 定价:68 出版日期:2003-8-1 专家评语:王咏刚:没有什么比《重构》这本书更能理解程序员的苦衷并处处为程序员着想了。那些软件工程权威们总板着脸说“你不能这样,你不能那样”,好像所有程序员都是该他们管教的小孩子;而《重构》却告诉我们说,没人能一步到位地把所有问题都想清楚,设计差不多了就开始写代码吧,等写烦了写腻了的时候再抽空儿零敲碎打修修补补——这可不是三天打鱼两天晒网,用形而上学的话讲,这叫重构。 第3名:分析模式——可复用对象模型(影印版) 原书名:Analysis Patterns:Reusable Object Models 作者:Martin Fowler 出版社:中国电力出版社 原出版社:Addison-Wesley 页数:357 定价:48 出版日期:2003-6-20 专家评语:宓吉琦:应该是一本比较难懂的书,晦涩程度可能还超过设计模式,但也是任何一个想做架构师的人所必读的。软件是为其他产业服务的, 只有能把其他产业的需求顺利转化为软件功能, 同时具有软件设计艺术的人才是好的架构师。本书中,作者就把他从事的许多行业的宝贵建模经验无条件地提供给大家,这些建模的经验的积累往往需要花费几年或者十几年的时间。 项目和配置管理 第1名:人月神话(影印版) 原书名:The Mythical Man-Month 作者:Frederick Phillips Brooks, Jr. 出版社:中国电力出版社 原出版社:Addison-Wesley 页数:322 定价:25 出版日期:2003-3-1 专家评语:青润:一种感慨,一种沉默……在该书中看到的神品的推荐,让人唏嘘不已。不过,这本书的确是软件工程领域内的一本极品,国内见过似乎理论道行很深的书,但是却没有见到过有这样理论与实践深度并存的书籍出现过!没有项目经历,没有工程经验,劝你千万不要阅读此书,否则,是对神品的亵渎!而且,你也绝对不可能看明白的! “开发人员交付的是用户满意度,而不仅仅是有形的产品”——没有经验的人能看明白么?国内的软件以工程项目居多,国内的教育以理论为主,理论与实践的脱节,学生学到的几乎是空白,这也就是为什么其他专业转过来从事计算机行业的人往往在软件公司里面的表现往往比计算机专业毕业要好的一个很重要因素。王咏刚:网上有不少板砖拍在这本书上,因为有人嫌这书太老套,几十年前的破事儿了还敢擦脂抹粉地端出来蒙人骗钱。我偏要说这书挺好看,关键是你不能拿它当项目管理入门的教材看,你得把他当成一本跟你谈心聊天讲故事的散文集来看。你瞧前些年,那么多女孩子捧着本余秋雨如醉如痴似颦似笑风情万种,难道就不许我们程序员揣着《人月神话》假装深沉故作风雅,既陶冶了知识青年的道德情操又学习了项目管理的思想方法吗? 第2名:快速软件开发(影印版)原书名:Rapid Development 作者:Steve McConnell 出版社:机械工业出版社 原出版社:Microsoft Press 页数:676 定价:58 出版日期:2003-3-1 专家评语:张恂: 众人看完此书皆掩卷长叹,相见恨晚啊!在外面参加了那么多国际项目管理课程,对改进“软件”项目管理到底有多大真实效果呢?软件项目经理当然要懂软件项目自身的规律!夸张一点,学了这么多通用的PM知识,可能还不及这样一本实话实说的书管用。软件项目经理可能是软件行业中承担压力最大,也是最有苦难言,最需要关心的一个群体。书里有这么多美国同行的经验教训、陷阱和误区,如果你对此还一无所知,难免会一而再、再而三地掉进去;书里还有这么多优秀的实践方法,你为什么不试着用用看呢?所以我的建议是,如果Steve McConnell这位朴实的优秀程序员、著有多本名著的技术作家兼国际软件工程权威说话了,大家一定要仔细听听。这年头的“必读经典”大有泛滥之势,实在让人招架不住,可是这次我甘冒风险大胆地说:对于改变国内软件项目管理的窘况,此乃必读之选。 第3名:领导软件开发团队原书名:Leading a Software Development Team:A Developer's Guide to Successfully Leading People and Projects 作者:Richard Whitehead 译者:吴志明出版社:电子工业出版社 原出版社:Addison-Wesley 页数:304 定价:36 出版日期:2002-5-1 专家评语:徐锋:一本亲切的好书,让我爱不释手。如果你第一次担任项目经理,这本书可以让你迅速进入角色;如果你已有丰富的项目管理经验,你也能够从中吸取养份,解决埋藏在你心中很久的疑问。其采用的实例为驱动的写作方法,可以成为案头常备的宝典。 程序员》推荐C#好书推荐(国内篇) 创建人: 《程序员》《 C#技术内幕(影印版) 》(英文影印版,1CD)原书名:Inside C# 原出版社:Microsoft Press 作者:(美)Tom Archer 页码:428 定价:¥78.00 丛书名:微软最权威的Inside系列 出版社:北京大学出版社 出版日期:2001-7-1 这是一本非常不错的C#图书。amazon网站上评为四星半。国内读者能读到其英文版,也算是非常好的运气了。就其英文电子版,竟也在各大网站上风靡。该书主要讲述了C# 语言的内在体系结构,是一本极具技术深度的编程书,而且对面向对象的概念理解也有很大帮助!有人说它应该是第三或第四本C#的学习书,无论说法如何,总之它绝对不适合于初学者。书中深入地介绍了最新的面向对象编程语言及其设计参数和结构,目的使读者理解其内部的运作方式及原理。同时,书中还揭示了C#语言的功能。该书由微软专家编写,非常富于技术性和权威性,是相关程序开发人员很好的参考书。 《 C#精髓 》英文原书名:C# Essentials 原出版社:O'Reilly & Associates,Inc. 作者:(美)Albahari,B. 译者:刘基诚 页码:226 定价:¥29.00 出版社:中国电力出版社 出版日期: 2001-8-1 虽然该书已经推荐过一次,但在本期的C#专题中,却还是不得不提到它。书中言简意赅地讲述了中高级程序员应用C# 和.NET框架SDK所需要了解的知识。全书内容共包括五个部分:简介、C#语言参考、.NET框架编程、BCL综述、核心.NET工具。此外,书后还附带了六个附录:C#关键字、正则表达式、格式限定符、数据列集、使用配件和名字空间与配件。该书的英文版在amazon网站名列4星级。对于概念的论述较为全面精确,实例也很丰富,读者能够从中体会到C# 的各种特性和优点,但相对而言,对于没有面向对象编程经验的初学者,可能会有相当的难度。不过,这本中文版图书,译者翻译得很好,而且相关部分还作了详细的译注。这一点确实难能可贵。 《c#编程语言》作者:麦中凡 陆永宁 出版社:北京航空航天大学出版社 页码:684 定价:¥66.00 丛书名:新一代专业软件开发人才培训系列教材 出版日期: 2001-8-1 这是一本相当不错的C#培训教材,作者麦中凡教授是国内知名的程序设计权威。此书是他参考《Presenting C#》、《C# Programming With the Public Beta》和《A Programmer's Introduction to C#》等诸多资料和图书,且得到微软支持后推出的一本力作。该书也被教育部计算机课程教学指导委员会和微软中网公司指定为“新一代软件人才培训”教材。全书共分三篇。A篇讲C#编程语言出现的背景,以很大的篇幅介绍了.NET的基本思想和.NET框架。B篇为C#语言规范,基本为0.28版的全译本,详细讲述了C#语言特征的各个细节。C篇是C#编程的相关技术,如构件设计、分布式构件、组装运作、数据库、XML连接、继承历史资源等。总之,该书内容全面,语言严谨,是国内C#图书和教材的优秀之作。非常适合读者入门或系统学习C#,也非常适用于那些想从C/C++、VB、Java转向.NET编程环境的软件开发者。 《 新一代C#与ASP.NET权威指南 》 (1CD) 作者:郑淑芬 许嘉仁 张书源原出版社:(台湾)基峰资讯股份有限公司出版社:中国青年出版社页码:320 定价:¥32.00 出版时间:2001-8 该书的作者郑淑芬、许嘉仁、张书源是微软PDC、DevDays大型研讨会的资深讲师,目前均任职于台湾恒逸教育训练中心,具有很高的权威性,而且实战和授课经验相当丰富。全书共分11章。第1章从 CGI到 ASP.NET;第2章C#基本语法介绍;第3章HTML Control与 Server Control;第4章新一代控制项;第5章验证控制项;第6章ADO.NET;第7章数据绑定;第8章用户自定义控制项与组件;第9章Web应用程序等等。书中讲解通俗、浅显,从点到面,详细讲解了ASP.NET程序撰写的方法,且附有详细的实施步骤和总结,部分章节还有大量实用的C#范例和练习,非常适合于入门或全面学习之用。 《 Visual C#.NET开发实践 》 作者:郑小平 温谦丛书名:.NET平台研究与开发丛书 出版社:人民邮电出版社 页码:420 定价:¥48.00 出版日期: 2001/8/1 此书为作者所推出的C#系列图书中的第二本。其他两本分别为2001年7月份推出的《 .NET平台研究与开发丛书——C#语言程序设计 》和即将于2002年1月份推出的《 .NET精髓—Web服务原理与开发 》。均为人民邮电出版社出版。这三本书各有侧重地介绍了与.NET战略相关的最重要内容,既有理论,又有实践。其中第一本《 .NET平台研究与开发丛书——C#语言程序设计 》,讲解了C#语言本身的特性。可分为入门、语法和提高3个部分;第二本《 Visual C#.NET开发实践 》则结合Visual Studio.NET 这个最新的开发利器,介绍实际开发所需要的知识;《 .NET精髓—Web服务原理与开发 》,则深入到.NET战略的核心,介绍了Web服务的理论与实际开发。从目前推出的情况看,《 Visual C#.NET开发实践 》一书较为实用,很受好评。虽然中间也有一些不尽人意的地方,但瑕不掩瑜,而且从根本上来说,此书确是一本相当不错的参考用书。 《 精通C#与ASP.net程序设计 》(1CD) 译作者:孙三才 出版社:中国青年出版社 定价:¥45 页数:404 出版日期:2001-6-1 这同样是中国青年出版的讲解C# 与ASP.NET程序设计的又一本好书。ASP.NET有两种开发语言,即VB.NET和C#,虽然C#是针对网络而设计的新技术,但它和ASP.NET又是不可分割。此书主要就是针对这两种新技术,分析讲述其联系、运用以及实现等。而且,书中还用了一定的篇幅讲解C#的语法、ASP.NET运行模型以及ADO.NET数据库的存取模型等等,非常适合入门或进阶之用。全书共分为两篇、十章和一个附录。两篇分别为理论基础篇和实务应用篇。特别是实用应用篇部分,通过逐行进行程序分析,以深入浅出的形式,带领读者迅速进入C#和ASP.NE的设计领域。具有相当的实用性和指导性。 程序员》推荐C#好书推荐(海外篇) 创建人: 《程序员》 为什么要学习C#和.NET? .NET能带来许多新的机会和挑战,这也是促使我们通过阅读好书而尽快掌握.NET相关技术的源动力。也许,软件技术发展史上的很多经典时刻,我们都没能亲身经历或融入。比如DOS、Windows 3.0、Visual Basic、Windows 95等软件的首次发布。但现在,却适逢这样一个机会,我们能亲身体验互联网时代的一个具有重大历史意义的时刻:Visual Studio.NET的正式发布。微软的消息表明,在2002年2月13日于旧金山举行的VSLive开发者大会上,Visual Studio.NET将正式发布。届时会由Bill Gates做主题演讲,C#、ADO.NET、VB.NET、ASP.NET等小组的核心开发者亲自做秀,这意味着开发.NET构架上各种应用软件的时代已经到来。在过去的一年里,随着微软不断地将更多的产品和服务打上“.NET”标记,.NET战略体系的整体轮廓变得愈来愈清晰。而另一方面,尽管微软自己紧锣密鼓地兜售“.NET”概念,而身在微软阵营的数百万全球开发者却只能翘首以待、袖手旁观,因为.NET应用开发工具和支持平台没有正式到位。而这次VS.NET的正式推出,对于推进.NET应用的真正普及具有划时代的意义,同时这也迫使习惯了微软工具的开发者面临又一次个人知识体系的全面升级。这是我们所要面对的真正挑战,把学习、掌握.NET开发技术提到日程上,已经是许多开发者短期内无法回避的事实。所以,学习、掌握C#和.NET,势在必行。 学习C#和.NET,应该购买何种图书?我的回答是读英文原版书,拿第一手资料,与国际同步。为什么一上来就将国内的.NET和C#图书摆在下面?这主要归结于可选图书的范围、内容的含金量和时间速度等几方面的原因。首先,国内的出版社大多只与国外几家为数有限的出版社有固定合作关系,因此在图书版权进口业务的操作上,不能做到随心所欲、任意选择精品。如果我们依赖中文图书,局限在国内出版社炮制的“二手书单”里,可选范围将极大地缩小。甚至很可能与某些国外.NET领域的精品图书无缘以见,例如在国外凭借出版.NET图书而异军突起的APRESS出版社,在国内就没有合作伙伴。其次,国内图书的翻译质量参差不齐,导致原版图书的含金量大打折扣,虽然有像台湾的候捷先生和大陆的潘爱民先生那样真正倾注心血的职业作者,但毕竟为数不多。最后,也是最关键的一点,就是速度,国外书籍的中译本面市,往往比其英文原著的发行滞后半拍,而这半拍的概念弄不好就是半年多的时间,我经常看到国内刚推出的新书竟是国外一年以前的作品。在当今这样一个日新月异的时代,国内技术图书出版业整体滞后于国外一个周期的现状,是令人无法忍受的。所以建议大家最好还是阅读原汁原味的英文原版图书。制约国内读者购买原版书的因素有两个:价格和渠道。价格其实是“观念”问题,20至50美元一本的书价确实不菲,但考虑到读书时间也是一笔投资,况且从一本好书中获益且迅速转化到项目实施生产力所产生的影响,也远非20至50美元可以相提并论。再反之,浪费在一本劣书上的时间,以及由此对自已求知欲望和兴趣所带来的打击,也非几十美元可以衡量。比较之下,购买原版书还是较好的选择。当然,如果公司能替你买单,那就更应购买原版书了。至于渠道,其实很简单,通过Amazon.com在线购书很方便,它所提供的最慢的邮寄方式也只需16个工作日。受益于Amazon的亏本经营,读者可以用7折的优惠购买到大部分的计算机图书。而且我国海关除了会延误一些时间外,不收取任何费用。总之,在Amazon上购书,最终不超过一个月就可以到手。至于网上支付,只要去中国银行办一张MasterCard或Visa国际借计卡,就可以完成美元的在线付费。 C#好书推荐根据前面介绍的选书办法,针对不同背景或基础的开发者,推荐以下图书,以做参考: 一、新手入门:《Beginning C#》(Wrox出版社) 名副其实,此书是面向新手的,包括没有编程经验的新手。其重点在于全面介绍了C#的语言特性,并且深入地讲解了面向对象的编程概念。对于VB和ASP的程序员,想要掌握C#语言的基本语法特性并不难,如C#基本数据类型、控制流语句、表达式以及其它语法特性都不是问题,但如果没有C++或Java等真正面向对象编程语言的基础,在接触到C#程序的整体结构和设计思想时就会感到一头雾水、寸步难行。市场上许多C#书籍都假设读者已经具有一定的C++或Java等面向对象语言的基础,因此只是就C#针对面向对象编程思想的具体实现一带而过。对于只有VB或ASP经验的开发者,选择了这样的图书作为C#入门会感到很吃力,同时学习的信心也会受到一定的打击。而《Beginning C#》正好充分地考虑到VB和ASP程序员的具体背景和困难,针对面向对象编程思想的基础给予了较深入和详细的讲解,读此书将使你逐渐熟悉诸如类、继承、方法、属性、重载、构造器、接口实现等概念。而且该书的销量不俗,排名在1173,基于读者反馈的星级评定为四星半,也很出色。而且读者评语也是褒奖有佳,估计购买该书后大呼上当的可能性不会很高。 二、登堂入室,全方位拥抱C# 《C# and the .NET Platform》(Apress出版社) 就本人所见,目前关于“C#和.NET”主题的大全性质的书籍,只有《Professional C#》(Wrox出版社)和《C# and the .NET Platform》这两本,二者的知识覆盖面和内容深度都完全类似,显然是在竞争同一批中高级目标的读者群市场。由于Wrox试图先入为主,抢占作为业界第一本C#和.NET综合大全类书籍的地位,使得《Professional C#》不免在质量上跌了眼镜,最终造成其对手Apress的《C# and the .NET Platform》一书一路畅销。目前后者的销量名列前茅,位居1173,读者反馈好评如潮,星级评定为四星半,而且其作者Andrew Troelsen除此书外还撰写了《Visual Basic .NET and the .NET Platform》一书,同样获得巨大的成功,因此我们完全有理由信任他。对于有C++或Java基础的读者,特别推荐《C# and the .NET Platform》。但关于C#的学习,有一点需要格外注意,就是不能把C#孤立地当成一门新的程序语言,否则无法真正领会其内在的意义。必须把C#语言放到.NET框架(.NET Framework)的大背景中才能理解其实际意义。C#被设计成充分利用.NET Framework所提供的支持来发挥其自身强大功能的语言,因此C#与.NET Framework是紧密结合、密不可分的。《C# and the .NET Platform》正是将C#语言与.NET Framework作为一个整体来讲解其中的所有重要的知识点,内容涵盖面非常全面:.NET平台简介、公共语言运行时、公共类型定义、公共语言规范、C#语言基础、控制流、OO概念、异常处理、垃圾收集、.NET集合、定制委派和事件、版本控制、多线程、Windows Forms、注册表操作、GDI+绘图、输入输出、COM+与.NET互操作、ADO.NET、ASP.NET、Web Service基础等等。这几乎就是.NET开发所涉及的全部主要内容。总之,目前关于C#的图书,大大小小足有一二十种,但仅从内容简介上就可以看出,不论其知识覆盖面还是深度,都或多或少给人一种轻量级“课外读物”的感觉,很难引起太大兴趣。不过,也有值得一提者,如Jesse Liberty著的《Programming C#》一书,也算不错。 三、不同领域,深入挖掘当读者对.NET Framework和C# 有了全面了解之后,下一步就可以结合自己所从事的具体领域,学习专门的.NET应用开发技巧,这主要包括:针对Web应用开发的ASP.NET;针对基于.NET的胖客户端应用开发的Windows Form,以及支持Web互操作的Web Service应用。针对这几方面,我们简单地作以如下推荐: ASP.NET应用全面介绍:《Professional ASP.NET》(Wrox出版社) Web Services开发的全面介绍:《Professional ASP.NET Web Services》(Wrox出版社) 适合VB/MFC/Delphi程序员全面了解基于.NET的Windows应用程序开发方法:《Professional Windows Forms》(Wrox出版社) 此外,如果你经常涉及到数据存取,可以参考《Professional ADO.NET》来全面了解.NET提供的数据访问方面的支持,相信对熟悉ADO的读者也会很有帮助。 作 者 心 得 如何在Amazon.com上挑选好书? 用几十美元去购买一本原版图书,确实是一笔为数不小的投资。因此选购时自然得非常谨慎,精挑细选,争取弹无虚发。就我个人而言,基本上是采取随大流的策略来挑选图书。Amazon.com所出售的任何一本图书,在其详细的介绍页面都会提供销量排名(Amazon.com Sales Rank),即该书当时在所有图书销量中的排名位置,类似流行歌曲的销量排行榜。具体针对计算机图书而言,一般排名在4000以内的书属于畅销书,表明购买的读者众多,如果排名在2000以内则属于极其畅销,已被读者广泛接受。作为参考,著名畅销小说《哈里波特》的销量排名是20。而一本书的排名如果是6位数字,则表明该书或刚上市,或是不受欢迎,总之无人问津。当然,有人说“畅销书不一定就是好书”,没错!但是畅销书为好书的几率大、还是无人问津者为好书的几率大?这一点我们应该会有共识。其次可以参考读者的评语反馈,以及作者的名气和出版社的口碑。在Amazon.com上,几乎所有达到一定销量的图书,都会有购书者所发表的在线评语,其内容褒贬不一,虽然不排除“书托”的存在,但基本比较客观。大部分的评语都是有感而发,并不全是恭维之词,粗制滥造的书也会被骂得狗血喷头。我曾经在2001年7月购买了当时刚上市的《Professional C#》(Wrox出版社)一书,阅读后发现其中小的笔误不计其数,不少章节内容的表述也明显地仓促粗糙,隔段时间再去Amazon,才发现已经是骂声一片。至此,我也就基本相信Amazon上读者反馈的客观性了。 作者背景石宝强,是Wrox出版社在中国大陆的第一位签约作者,曾领导团队为中国惠普公司开发基于Web的商务系统,同时也曾为其它知名PC厂商开发过Portal及E-Commerce网站。现致力于.NET和C# 领域的独立开发、咨询以及此方面英文原创文章的写作、海外商机的寻找和探索。个人信箱为shibq@263.com。 《程序员》推荐三味书斋——Delphi篇 创建人: 《程序员》 主持人:xingzhou(行舟),《程序员》杂志社技术编辑嘉 宾:grhunter(韩磊):中文开发在线(www.CoDelphi.com)创始人 Hubdog(陈省):《Delphi深度探索》作者 Pascal和Object Pascal xingzhou:李维的《Borland传奇》系列文章,看似语言平静,但是其蕴含的Borland情结让许多程序员为之击节。Borland在C++开发工具市场的溃败让人为之伤感,但是Borland的反击策略却让人意外,因为他们的武器居然是曾经被自己所抛弃的Pascal,早期的Turbo Pascal虽然红极一时,但是Borland还是用自己的Turbo C把Turbo Pascal送到了博物馆里。 grhunter:不过,也有业界知名人士认为,采用Pascal正是Delphi成功的一个原因。因为虽然Pascal语言有ANSI标准,但放眼世界大概只剩Borland一家编译器厂商还支持Pascal,既是唯一,Borland也就拥有绝对的领导优势。正因为这套语言的先进技术与主导地位,使Delphi几乎等于一套全新的语言,可以纵情发挥,而它也的确用极其优雅简洁的风格展现出不同于其它开发工具的格局。 Hubdog:Delphi的真正精髓正是Object Pascal。Borland在标准的面向过程的Pascal语言的基础上融入了现代的面向对象的软件开发思想,让这门“最优雅”的编程语言焕发出新的生命。 xingzhou:使用Pascal作为元语言的一个好处是没有兼容包袱,因为ANSI标准实际上等同于Borland自己的标准。这一点好处从C++ Builder的缺陷上可反证,为了兼容各种C++元素——包括Borland以前的OWL、MFC、ANSI标准等等,使得它的编译速度奇慢无比,这个缺陷也成为了C++ Builder最大的垢病。 grhunter:是啊,MS VC++占有C++语言开发平台市场的绝对优势,C++ Builder等产品要兼容它也是无奈之举。 Hubdog:虽然标准Pascal同Object Pascal在很多方面是相通的,但是面向对象和面向过程是两种差别很大的开发思想。如果最开始学的是标准Pascal,当面向过程的思想在你脑海中根深蒂固后,你会觉得面向对象的思想很难理解,至少我曾经经历过这样一个痛苦的过程。因此我觉得如果一个从来没有学过标准Pascal的人,对于Object Pascal中OOP思想的理解,反而要更加自然。因此,我的建议是跳过标准Pascal,直接学习Object Pascal。 xingzhou:关于面向过程和面向对象,我觉得不能简单地区分谁好谁坏,或者谁先进谁落后。我的理解是面向对象是开发的一种方法论,而面向过程才是软件开发的目的,有了OOP的概念后,让我们在软件开发中多了一种新的、很好的选择。如果非要作个高低、上下比较,反而让人很糊涂。不过谈到学习Pascal语言,要在市面上找到合适的书恐怕很难了。现在Pascal的书籍难得一见,更别提找到一本专门讲Object Pascal的书了。 Hubdog:其实,学习Object Pascal最权威和最全面的资料应该是随Delphi软件分发的在线帮助中的Object Pascal Reference。可惜,由于Borland公司没有微软那样雄厚的财力和人力,迄今为止Object Pascal的帮助还都是纯英文的。但是如果买了正版Delphi软件,将获得Borland的Object Pascal的中文翻译手册。 xingzhou:正所谓远在天边、近在眼前啊! grhunter:阅读这类“语言指南”至少有两个好处:一者虽然内容平铺直叙,但一路看下来,对语言一定会有完整的认识;二来可以对语言本身及编译器特性之间的差异有清楚的了解。新手经常分不清楚什么是语言本身的问题,什么是编译器实现的问题,什么是支撑平台特有的问题。 Hubdog:这本手册不是很厚,但是重要的主题一个都不少,从语言最基本的要素讲起,数据类型、变量、常数、函数过程、类、标准IO、动态连接库和包、内存管理、内嵌汇编语言、对象接口等全都提到了,甚至还包含了一张Object Pascal的语法图,唯一的缺点是不像《C++ Primer》那样配有大量详细的例子讲解。 xingzhou:善用软件自带的文档的确是个好主意,简单地按下“F1”,就可以在强大的联机帮助系统中迅速得到答案。虽然Delphi的帮助系统与庞大的MSDN还难以相比,但也已经足够应付实际情况了。 Hubdog:事实上,其他讲解Object Pascal语法细节的书在国内外基本就没有,即使有一些书稍微涉及,也都是蜻蜓点水而已。不过网上倒是有人翻译了Macro Cantu写的《Essential Pascal》,虽然内容不是很多,但是有不少精妙的讲解,值得一看。 xingzhou:我在网上搜了一下,《Essential Pascal》中文版的下载地点还真不少,如:http://www.21url.net/delphi/Essential_Pascal.chm。 Hubdog:Ray Liscbner的《 DELPHI技术手册 》一书中也有一部分关于语言本身的内容,讲得不错,而且电力出版社翻译得也不错,不过奇怪的是这样一本在2001年全球销量第一的Delphi经典书在国内卖得并不好,让我很是奇怪。我猜可能是这本书的例子太少了,因此很多人觉得可操作性不强吧。 系统学习篇 xingzhou:我本人很少使用Delphi,只是由于常用C++ Builder,而C++ Builder的书很少,所以基本上都是参考Delphi的图书,毕竟它们有着非常类似的地方。我虽然买了一些Delphi书,但是仔细想想,却感到,与C++等其他书相比,很难有几本让大家认为是“经典”的Delphi书。 grhunter:正如不可将C++与Microsoft Visual C++混为一谈,我们也不能简单地认为Delphi就是Pascal。针对C++而言,可以举出C++ Primer等大部头范例,但是如果将讨论范围仅限于VC++,堪称经典的作品似乎就不多了。其实,在Delphi开发界,也有一些著作/作者是大家耳熟能详的,甚至是其书必买、非其书必不买的。 xingzhou:但是对于初学者而言,选择适当的书的确是一件令人头疼的问题,耗资甚巨但收获不多的情况比比皆是,许多人都在问这个问题:“如何选到一本好的Delphi读物呢?” grhunter:这个问题的答案见仁见智。大致说来,我不怎么买国内作者的作品,甚至于不大买国内翻译的著作。 Hubdog:我也有同感,因为国内有些出版社实在是不爱惜自己的名声。如很多打着Delphi入门的招牌的书,上来就讲如何开发数据库程序、如何使用TButton等控件,这导致了很多Delphi初学者有一种误解,认为Delphi和VB、PB等开发工具差不多,无非就是一种可以用来快速开发数据库应用程序的语言,认为Delphi的程序开发就是拖放几个控件,设置一些属性,就OK了,而这是完全错误的认识。 xingzhou:我也注意到许多翻译的书质量不高,一些评价很高的书的中文版广受批评的情况屡见不鲜。 grhunter:不过,国外的Delphi类书籍也并非本本优秀,可以说其中多数也是垃圾。建议读者在选购书籍之前,先到这几个地方看看:1、Dr. Bob的网站(www.drbob42.com),其中有一些书评,评价中肯。2、Delphi Informant Magazine杂志在线版(www.DelphiZine.com)或纸质印刷版,该杂志的书评均出自高手,比较可信。3、Amazon在线书店(www.Amazon.com),如果一本Delphi书籍在上面获得比较高的评价(包括编辑评价和读者评价),那么,这本书绝对值得购买。 xingzhou:根据权威调查结果,使用Delph的程序员在中国超过一半。在CSDN网站,Delphi也是人气最旺的论坛之一。但是,我注意到经常有人提很简单的问题,而且提这些问题的人中,有些其实很有经验了。我想这是他们的知识结构有漏洞的原因,或者说,学习不系统所招致。 grhunter:系统学习Delphi,建议看Charlie Calvart的Delphi x Unleashed(中文译名《Delphi x编程技术内幕》)系列,但是似乎到第四版就没有继续了。该系列书胜在文笔轻松,但并不因轻松而失之流俗,常能“于无声处听惊雷”、在读者最不以为意之处着意题点,令人顿感程序设计的美妙与深奥。 xingzhou:我手头有一本Delphi的大块头:《Delphi 5编程开发指南》。我觉得很不错,比较全面,我最爱看的是它的那些专题。现在,Amazon已经在卖6.0版了。 Hubdog:《Delphi5程序员开发指南》的作者都有丰富的开发经验,其中像Chalies Calvert和Xavier等人还曾经在Borland公司任职,因此写的这几本书都非常有实战性,很到位。而且因为这几本书所覆盖的知识点很全面,非常适合放在案头,以备平时查阅。 grhunter:这一系列书最大的特点就是注重技术的具体应用,针对读者在开发中容易遇到的问题、作较深入的讲解,所以实用性相当强。 Hubdog:Macro Cantu的《Delphi从入门到精通》(Mastering Delphi x)系列书也很不错,国内引进了For Delphi4、5、6。最近我看了《Delphi6从入门到精通》英文版,感觉全书的水平比以前的版本拔高了不少,特别是对Delphi6的新技术跟踪非常紧,改写了大量的内容,增加了对XML和COM+、Action增强、CLX和数据库方面的内容等,看起来非常过瘾, grhunter:这本书的大卖点是Mastering Delphi x的作者Marco Cantu对Object Pascal理解甚为透彻,且能紧跟技术发展、针对Delphi的每一新版本增补相应的章节。 Hubdog:的确,这本书中关于Object Pascal的讲解应该说是这几本书中最好的,特别是它对接口和包的讲解提供了一个非常精彩的例子,展现了如何利用接口和包实现类似于Borland的Open Tools Api的插件技术,而且从Delphi的未来技术发展趋势来看,接口技术模仿多重继承的方式将会在很大程度上替代以前的单根深度继承的VCL框架,这部分的内容值得仔细琢磨。一个好消息是这本书中文版已经由电子工业出版社引进国内,不过还有一个坏消息是在China-pub上看到书评认为翻译的好像一般,不是让人很满意,所以我想英文好的人还是看英文版的比较好。 grhunter:这几本书的共同特点是分主题进行讨论,附有丰富有趣的例子,而且都是大百科全书类的书,动辄上千页。所以看这几本书如果不配合实战练习就失去意义了,所以拿到书后我觉得一定要仔细看原书所配的源程序,运行书中的例程,对照书中相应章节的说明,这样可以很快的上手。 Hubdog:此外这三本书的程度又稍微有些区别,相对来说,Xavier等人写的《Delphi程序员开发指南》比较基础,基本上是基于VCL的开发,而且各个版本之间内容变化的比较少,我大概看了一下,最新的D6的版本同D5的版本相比,只是增加了Interbase Express和Decision Cube的内容。而Chalies的《Delphi4技术内幕》相对稍微深一些,很多例子都不是基于VCL的,而是直接调用Windows API来实现的,刚读的时候可能会有些困难,但是这无疑会帮助读者更好的理解VCL的精彩实现。此外,Chalies对于DirectX比较精通,因此他的书是唯一一本包含使用Delphi开发DirectX程序内容的书,另外《技术内幕》这本书的DCOM和CORBA部分也很精彩,是最早论述分布式三层开发的书,即便现在来看,也不算过时。 grhunter:系统学习Delphi的书另外还有Todd Miller等的Using Delphi x(中文译名《Delphi x开发使用手册》)系列,作者本人就是Delphi开发组成员,对Object Pascal和Delphi都有深刻的认识,讲解起来也驾轻就熟,有助于对Delphi开发的全面认识。 参考手册篇 grhunter:推荐两本,Clay Shannon的Developer's Guide to Delphi Trouble-shooting(中文译名《Delphi开发人员排错指南》)和Ray Lischner的Delphi in a Nutshell(中文译名《 DELPHI技术手册 》)。Developer's Guide to Delphi Trouble-shooting将程序编写和编译过程中可能遇到的种种警告、错误信息列出,加以详细解释。既有错误可能原因的描述,又给出解决问题的方法,是作者集多年开发经验的一部心血之作。Delphi in a Nutshell对VCL体系、RTTI、多线程等内容的讲解,简洁明了、直指人心,下下都挠到痒处。 Hubdog:对于VCL函数库,我想没有哪一本书要比《 DELPHI技术手册 》更详细和全面了,作者Ray Liscbner用了整整将近400页的篇幅详细全面介绍了VCL的函数、过程、变量、关键字等,并且将很多晦涩难于理解的东西讲的非常清晰透彻。唯一缺憾就是,书中并没有附上函数过程的索引,查起来不是那么方便。说到Ray Liscbner,此人可是我的偶像,写过多本畅销的Delphi书,包括《Secret of Delphi2》和《Hidden Path of Delphi》其中Hidden Path of Delphi是迄今为止国外出版的唯一一本讨论Open Tools Api的书,讲解了很多Borland从来没有公开的秘密,可惜这两本书没有被引进到中国。Ray Liscbner最近正在为Oreilly写坚果系列的另一本书《C++ in a nutshell》,他还经常在Borland的Open Tools Api和Kylix新闻组中出没,非常热心,还回答过我好几个问题。 grhunter:这本书确是Delphi开发者手边必备的读物。 主题研究篇 xingzhou:在Windows平台上编程,合理使用它提供的API进行编程是一个永恒的话题,这一点对于Delphi来说也不例外,前面推荐的《Delphi程序员开发指南》就包含了不少如何利用API进行编程的内容。 Hubdog:国外的Wordware出版社出版了一系列Delphi使用Windows API编程的书《The Tomes of Delphi》系列,其中最好的两本是《Windows Core API开发》和《Windows Graphical API开发》。这一系列书的特点就是每个API都配合有一个详细的例子来说明,并且对API的每个参数都有详尽的说明,每本书平均讲解了将近300个例子,在编程中遇到API不会调用,只要翻看这本书,一定能找到答案。其中图像API那本书我尤其喜欢,因为该书的例子展现了很多图形特效。在读完书中精彩例子后,再看看这些精美的特效,也是一种额外的享受。遗憾的是这些书也没有引进到中国。 grhunter:这种类型的书在国内倒是也出了一些,但大多都是将网上Delphi爱好者翻译的技巧东拼西凑而成的大杂烩,非常零碎,而且并不能保证一定可以运行。我不推荐大家购买这类书。 Hubdog:不过陈宽达写的《 Delphi深度历险 》一书算是一个例外,内容比较丰富和深入,语言也继承了台湾作家一贯的风趣幽默的特点,读起来轻松愉快。 xingzhou:这本书名副其实地做到了深度的历险,但我觉得其内容过于偏向自娱一类,而对于系统级、功能应用级的API涉及较少。 Hubdog:我也觉得该书不够系统,这可能是由于作者写作此书时还在上学,因此兴趣比较分散的原因吧? grhunter:“深度历险”大概因为是作者第一部书的缘故,笔下拘束,缺乏大家风范。 xingzhou:在Windows下,掌握COM编程也是重要的一环。 grhunter:Eric Harmon的Delphi COM Programming(中文译名《 Delphi COM深入编程 》),就Delphi中的COM编程技术作了大致的介绍,例子有趣,使人不致因COM技术的晦涩深奥而顿生退意。 Hubdog:这本书的特点是堆砌了大量的源代码,但是我感觉缺乏理论性和系统性的描述,让人只是知其然而不知道其所以然。所以很多Delphi开发COM时,还要去借鉴Don Box的《COM本质论》和经典的《Inside OLE2》这类C语言的书。 xingzhou:Hubdog的大作《Delphi深度探索》似乎是国内唯一专门讨论用Delphi进行COM开发的书。 grhunter:呵呵,不客气了,Hubdog的“深度探索”体例太过零碎。 Hubdog:是的,我对于COM的介绍比较侧重于应用。这主要因为我写此书时,还在学校念书,兴趣广泛,因此这本书的内容也就比较零碎,理论性不强,导致很多人看了之后,都觉得太深,看不懂什么意思,我事后想起来也懊悔当初没有多写些总结概括性的内容,可惜木已成舟,于事无补了。 xingzhou:谈到Delphi开发,数据库程序开发无疑是Delphi最重要的一个应用领域,这也是Delphi成功的基础之一,它不但彻底打败了Power Builder,在与VB的较量中也占据了上风。 Hubdog:数据库开发方面进阶的好书,我最早看到的是李维写的《Delphi3实战》一书,国内的版本名为《 DELPHI 3 从入门到精通 》,是宇航出版社出的。严格的说,这本书并不是一本纯粹的讲数据库开发的书,全书中只有一半是同数据库开发相关的,但是难得的是这本书对我们最常用的数据库组件的使用效率和使用场合做了深入的分析,其中对TTable、TQuery和TStoredProc组件使用的比较,TDataBase的属性设定,Lookup和Locate等查找方法的效率比较,同时结合作者丰富的实际案例的经验,一针见血地指出了很多数据库系统效率低下的根本原因,读后让人对如何编写高效的数据库程序有一种豁然开朗的感觉。值得一提的是,这本书还是最早介绍三层开发的书,过去了这么多年,在《Delphi4技术内幕》等书早已被我以半价卖掉的今天,它依然在我的书架上占有一席之地。 xingzhou:我使用ADO编程也是从李维的书开始学习的,记得是《 Delphi 5.X ADO/MTS/COM+高级程序设计篇 》。 grhunter:李维的分布式多层系统系列(包括《Delphi 5.x分布式多层应用系统篇》、《 Delphi 5.x 分布式多层应用电子商务篇 》、《 Delphi 5.X ADO/MTS/COM+高级程序设计篇 》和《 Delphi 6/Kylix 2 SOAP/Web Service程序设计篇 》等),是Delphi多层应用程序设计不可多得的专门读物,笔法引人入胜、在中文类Delphi读物中堪称佼佼者。 Hubdog:李维无疑是分布式数据库开发书籍中的精品,这些书涵盖了用Delphi5开发分布式多层应用程序涉及的必要技术,从讨论如何使用Delphi建立分布式多层应用系统开始,一直深入剖析到如何开发高效率的多层应用系统,让你对于Delphi的MIDAS和分布式对象技术了如指掌。凡是刚开始使用MIDAS进行开发的人都会遇到系统效率极其低下和DCOM配置的恼人问题,李维在这几本书中愿意将他开发的宝贵经验出版,与大家共享,是值得我们庆幸的。 grhunter:但读者应该认识到,该系列图书介绍的多层分布应用,大体上是基于Borland自己的平台,且例子太过简单,直接用于实战后患无穷。不过,假使读者抱着“了解多层分布式应用”的心态去阅读,则会得益匪浅,关键在于不可尽信书中所言。 xingzhou:李维的书属于尝鲜一类,基本上都是介绍Borland的新产品、新技术,作品就好比Borland的科普读物,用来入门再好不过,但是有了一定的工作经验后,就需要自己摸索了。正所谓“师傅领进门,修行在自身”。 Hubdog:另外,这些书介绍的是Delphi自带的MIDAS三层开发架构,而在大型系统中,像BEA的Tuxedo和Weblogic和IBM的Cics,MQ和WebSphere等中间件一统江山,即便在中小规模的系统中,MIDAS也远不是主流产品,实际成功的案例很少,而与之相比微软自己的COM+和Asta等第三方的中间件产品在稳定性和简便性上无疑是要占据上风的。 Hubdog:至于说大陆相关的书籍,虽然出了很多,但是苛刻的说,没有什么好书,大部分都是简单将Delphi在线帮助中关于数据库开发部分的文档翻译过来而已。虽然有些实例开发方面的书,但是在深度上都无法同李维的书相比。 grhunter:再推荐几本其他的书。Keith Wood的Delphi Developer's Guide to XML,是目前唯一一本全面介绍XML技术在Delphi中应用的书籍,该书组织结构(从XML规范、DOM规范到各厂商对DOM/SAX的API实现到真实世界中的具体应用)得当,具有相当强的通用性与指导性。作者长期为Delphi Informant Magazine撰稿,文笔质朴直白,往往一语中的,废话较少。Alex Fedorov等人的Advanced Delphi Developer's Guide to ADO和Kudzu等人的Delphi Developer's Guide to Communication Programming,是所属专门领域中的典范之作。 Hubdog:李维写的《 Delphi 6/Kylix 2 SOAP/Web Service程序设计篇 》对于当前热门的很多技术如Soap、Web Service和UDDI等做了详尽的介绍,对它们的优缺点也做了中肯的评价,对未来的技术发展做了很好的前瞻。但是,目前Web Service还处于一个快速发展的阶段,很多规范还不完善,应用程序也还没有大规模的使用这类技术,因此我觉得这本书比较适合作为技术储备,实际的意义还不是很大。另外这本书对于Soap的基础XML没有太多涉及,也算是美中不足吧。 总结篇 grhunter:川菜以博采诸家所长而终独树一帜,Delphi开发者的阅读面同样也不宜太过狭窄。我想,除Delphi书籍之外,以下三类书籍,也应该有所涉猎:一是Windows系统原理和API参考,一是软件工程,一是建模和OO(面向对象)原理。更高明的读者,还可以从哲学和其它一切书籍中体悟到程序的真谛。 Hubdog:总的来说,Delphi的书籍到目前为止都还是比较偏重于应用。 grhunter:Delphi能在微软开发工具狂轰滥炸之下屹立不倒,其原因有二,一曰界面亲切,二曰重在应用。合二为一,就是所谓RAD(Rapid Application Development,快速应用开发)。自然,Delphi相关书籍也处处凸显出“注重实用”的特点。 xingzhou:上面介绍的经典书全是海外版,与C++等语言的状况如同一辙,其原因值得深究。 grhunter:这说明国内缺少大家,缺乏经验丰富、学识深攫的高手。 Hubdog:许多经典的外版书引进后,读者反映不好,说明国内的翻译水平也亟待提高。 grhunter:是啊,如Don Taylor与另外两位作者合作的Delphi Programming Explorer一书的最后部分中,甚至采用侦探小说的形式来描述Delphi数据库应用开发技术,而且其情节之曲折、文笔之用心,丝毫不亚于大部分“真正的”侦探小说。Marco Cantu、Steve Teixeira(及其写作小组)、Charlie Calvart等人的著作,可以一再修订出版,而每一版本的推出,都受到Delphi开发者的踊跃追捧,这与作者彰显的文字风格也不无关系。遗憾的是至今几乎尚未见到过一部真正能够完全展现原著风貌的中文译本。一本区区几百页的书,译者多达数人以至十数人,其译作质量可想而知。连基本的术语、语法逻辑都要弄错,更谈不上什么文字的风格了。 xingzhou:情况相比前几年已改善不少,希望出版社能真正重视这方面的问题,让经典书籍真正成为精品。 《程序员》推荐我的嵌入式书架 创建人: 《程序员》 传统的8位单片机由于不带嵌入式操作系统的开发,已属先天不足,在很多场合都无法满足日益提升的应用需求。而另一方面,以ARM为代表的高效能32位处理器配合各类性能优异的嵌入式操作系统则正在蒸蒸日上,不断扩大其应用领域。笔者由于工作和学习所需,很长一段时间内都在嵌入式系统开发领域作探索,因此也收集了不少此类图书,这里向大家推荐几本优秀之作,借此分享此间的喜悦和收获。 书名:《 C/C++嵌入式系统编程 》原书名:Programming Embedded Systems in C and C++ 作者:Michael Barr 译者:于志宏 出版社:中国电力出版社出版时间:2001年3月 页码:196 定价: ¥29.0 编程语言繁荣发展的今天,在嵌入式系统领域,汇编与C/C++依旧担负着几乎所有重任,本书正是讲述C/C++在嵌入式系统上的应用与特点。该书从基础概念入手,以常见的Hello World程序为起点,通过编译、连接、调试步骤等基础话题,逐步讲述C/C++在嵌入式领域的使用,向初次涉及相关工作的读者提供了一个平坦的入门过程。在后续章节中,围绕应用话题,就存储器、外围设备驱动、嵌入式操作系统等问题分别讨论,介绍了相关的应用方法。最后一章专门讨论了针对嵌入式系统的C/C++程序时空特性优化。如本书译者所说,该书是不错的入门读物,介绍了一个初学者应该知道的知识,同时在轻松的阅读过程中读者还能补习到一些知识上的漏洞。 书名:《 Linux与嵌入式系统 》作者:李善平 等 出版社:清华大学出版社出版时间:2003年1月 页码:348 定价: ¥33.0 在服务器及桌面应用日趋深入的今天,Linux低廉的成本、良好的性能、开放的源代码等特点也为其嵌入式系统领域的应用打下了坚实的基础。此书结合Linux系统原理与嵌入式系统的特点,介绍了Linux在嵌入式系统的应用及其开发环境的建立。在第三章的Linux介绍中,作者详细分析了Linux内核,为后续的开发技术打下了必要的基础准备。基于作者丰富的Linux研究经验,书中开发技术部分更多地介绍了快速启动、定制开机画面、ramdisk等在嵌入式领域有现实应用需求的内容。后续各章节同样突出实用这一主线,就嵌入式Linux的文件系统、存储管理、图形用户界面、网络互连做了详细介绍。此书很大篇幅上在围绕uClinux这一专为低成本无MMU处理器所定制的嵌入式操作系统展开。其中详细的开发工具的配置、uCSimm开发板的使用等内容在当前uClinux应用日渐广泛的今天,具有较高的参考价值。对于希望进行嵌入式Linux开发的读者,本书值得重点推荐。 书名:《嵌入式系统-Intel StrongARM结构与开发》作者:陈章龙 涂时亮 出版社:北京航空航天大学出版社出版时间:2002年10月 页码:348 定价: ¥38.0 基于优异的性能表现,Intel StrongARM处理器在PDA市场上牢牢地占据了半壁江山,而此书正好介绍了Intel StrongARM的各个技术特征。除了常见的ARM体系结构、ARM指令系统外,该书更侧重于StrongARM1110微处理器,书中详细介绍了它的各功能模块。同时,此书也对Intel Assabet开发板、Intel 集成性能函数库IPP、ARM开发套件ADS等有所涉及,并就上述内容给读者一个整体性的了解。嵌入式Linux开发以及WindowsCE系统开发则是本书又一亮点。较应用开发不同,这里作者更多的笔墨偏向于操作系统方面的内容,如嵌入式Linux体系结构、WinCE OEM Adaptation Layer开发、设备驱动程序开发。如果读者能以此为参考,并配合专门的书籍进一步阅读扩展,定能收到良好的效果。 书名:《uC/OS-II——源码公开的实时嵌入式操作系统》原书名:μC/OS-Ⅱ:the Real Time Kernel 作者:Jean J.Labrosse 翻译:邵贝贝 出版社:中国电力出版社出版时间:2001年8月 页码:466 定价: ¥69.0 一个略带冲动的想法下,Jean J.Labrosse完成了uC/OS这一开放源代码的实时操作系统内核。若干年后的今天,相信不少嵌入式系统工程师都参与过uC/OS的移植或其上应用的开发。而此书则正是Jean本人所著的讲述uC/OS原理与实现的专著的第二版。全书首先讨论了将会贯穿后续各章节的实时系统的概念,随后就uC/OS-II中各模块如任务管理、内存管理、时间管理、任务间的通讯与同步等分别作了详细介绍。这里作者不仅仅告诉读者uC/OS-II“如何做”,他还通过具体实现传授“为何这样做”的缘由。或许正是这种深挖到底的原因,使一部分操作系统的原理和基础知识在阅读中变得格外重要。幸运的是书中良好的代码风格与详细的图文讲解有效地帮助了读者的理解。目前各类源码分析的书籍相当丰富,如果读者感觉分析Linux内核或Apache源码之类书籍所涉及的软件系统对现阶段学习过于复杂,希望获得一个渐进的阅读过程,那么uC/OS-II数千行的代码规模则是一个不错的切入点,加上极其详细的注释与讲解,不论是对正在寻求提高自身源码阅读能力,还是希望了解嵌入式操作系统这一领域的读者,均非常适用。 书名:《 ARM SoC体系结构 》原书名:ARM System-On-Chip Architecture, Second Edition 作者:Steve Furber 翻译:田泽等 出版社:北京航空航天大学出版社出版时间:2002年10月 页码:367 定价: ¥55.0 本书着眼于ARM架构的完整剖析,这一点从书中开篇第一章所涉及的基础知识的范围中便能看出。全书从ARM体系结构、ARM汇编语言、Thumb指令集、体系结构对于高级语言的支持、体系结构对于系统开发与操作系统支持等多方面详细介绍了ARM技术的方方面面,用“专业详实”一词可以贴切地形容此书。以ARM汇编为例,作者通过功能说明、汇编格式、指令二进制编码、使用举例、注意事项等方面详细叙述,使得该书不仅能作为一本很好的学习教材,更使其成为很好的工具类参考书籍。在后续章节中,作者又通过多个实例介绍了ARM核在SoC中的应用。从所列举的具体实例上看,无论是所介绍的蓝牙基带控制器还是广泛应用于PDA产品的Intel StrongARM处理器,均具有良好的应用背景,这也正展示了ARM技术的实用性与远大的发展前景。 书名:《嵌入式系统构件》(第二版) 原书名:Embedded Systems Building Blocks, Second Edition 作者:Jean J.Labrosse 译者:袁勤勇 等 出版社:机械工业出版社出版时间:2002年2月 页码:472 定价:¥59.0 本书是Jean J.Labrosse先生的另一力作,它的闪光之处在于全书内容朴实却又极其基础实用,几乎每一个嵌入式系统的项目都或多或少的会对此有所涉及。如书名所提示的,全书主要介绍了构建嵌入式系统所需要的各模块,如键盘、显示器接口、定时器和I/O接口等,向开发人员提供了一个应用这些基本模块的方向性指导。同时结合Labrosse先生所设计的uC/OS-II,辅以充足的实现示例代码与免费的开发环境,保证了所涉及的内容易于理解且具备良好的实践条件。与Labrosse先生的《uC/OS-II——源码公开的实时嵌入式操作系统》一样,翔实完备是该书的一大特点,每章从所涉及的设备模块的原理展开,由表及里地介绍了它们的工作方式与应用方法,使得读者在阅读中能切实地感觉到自己知识和能力的充实与提高。 蜻蜓点水——点评VB.NET系列书籍 创建人: 《程序员》 前言 .NET作为微软对抗J2EE的主要武器,在许多方面已对J2EE的领先地位进行了强有力的挑战。近年来,学习.NET的人越来越多,相应地造就了.NET书籍的繁荣,面对让人眼花缭乱的.NET书籍,我以一名程序员的眼光,写下我对所看过书的评价。对一本书的好与坏,各人必定看法不一,文中观点,都是建立在我个人的经验与感受之上,期望读者指出我的偏颇之处。 这里先介绍一下我的技术背景与学习.NET的缘由,有助于读者理解文中我的观点。 我开始是一名熟练的VB程序员,后来又用过C++、Delphi、Java等开发语言。同时也对面向对象分析与设计的理论进行了学习。由于我需要将一个用C++开发的基于win32平台的产品移植到.NET平台之上,于是,我开始系统地研究.NET。在半年的时间里,我看了国内出版的几十本.NET书籍。我没有去学C#,而是选中了许多人并不看好的VB.NET,并用它高效地完成了任务。由于需要开发一个Windows Form产品,我在阅读时是不分C#与VB的。所以,这篇文章我也介绍了部分C#的书籍。 目前,国内出版的.NET书籍绝大部分是引进国外的,主要由清华大学出版社出版,清华出版的.NET书籍又大致分为微软.NET程序员系列与wrox公司的.NET系列。前者的特点是黑色封面,每个封面上有一种工具图片;后者是红色封皮,部分书籍上印着不少人像。为方便起见,我以“黑皮书”和“红皮书”来分别称呼。 黑皮书号称是由微软审定的权威。该系列书其长处是可操作性非常强。比如其中的《 ADO.NET程序设计 》,有图有步骤,不厌其烦地将C#与VB.NET代码和步骤重复书写,有时甚至到了罗嗦的地步,有滥充篇幅之嫌。另外,我看的几本都有一个毛病:重点不突出。学了一堆具体操作,让读者光知其然,不知其所以然,对相关理论的阐述不能做到深入浅出。因而,我买了一两本之后就不再买了,我对这系列书的评价是:适合初学者依葫芦画瓤地学习,对有经验的程序员,拿来看几天,就会把它丢到一边。红皮书系列是由Wrox公司出版的,Wrox公司的口号是“程序员写给程序员的书(Programmer To Programmer)”。该系列的书实用性强,是我所阅读的主要书籍,也是本文主要评论的书籍。 二、快速把握.NET平台 作为一名想开发.NET平台软件的程序员,第一步是掌握一门.NET平台的开发语言。就我而言,看的第一本书是《 VB.NET高级编程 》。这本书的一到三章是对.NET和VS.NET的介绍,老生常谈,可以很快翻过。从第4章到第9章,则集中介绍了VB.NET的语法。作为一名VB6程序员,这一部分一定要仔仔细细地看过,从VB6到VB.NET,是一个质的飞跃,最大的变化是面向对象在VB.NET中得到了完全的支持。这本书很厚,但后面的章节乏善可陈,用不着全部看完。我快速地挑选几章与我工作有关的进行了阅读,就对.NET有了一个总体印象。 《 VB.NET高级编程 》这本书不适合对VB一点不懂的人学习,另外,虽会VB6,但没掌握面向对象基本理论的人也不适合,因为这本书对面向对象的基本理论没作详细介绍。 三、深入把握特定领域在掌握了一门编程语言,对.NET framework有了基本了解,并熟悉了VS.NET开发环境后,下一步就是根据自己的需要,选择一个合适的领域深入下去。 1.数据库黑皮书:《 ADO.NET程序设计 》,前面已介绍,不重复了,该书详细但缺乏保存价值,建议借阅而不要购买。红皮书:《 VB.NET高级编程 》,有关ADO.NET开发的仅一章,太粗略。 2.语言与面向对象技术我推荐的是红皮书系列的《 Visual Basic .NET类设计手册 》,黑皮书的《 Visual Basic.NET和Visual C#.NET面向对象程序设计 》。 我在大学讲授OO课程时,认为这两本书是.NET下目前我所能找到较好的两本面向对象编程书籍。如果是从VB6转到.NET(不管你用的是VB.NET还是C#),强烈建议仔细阅读其中一本。 3.系统架构与组件开发 《 Visual Basic.NET面向对象可重用组件开发 》当时在书店看到这本书,没想就买下来了,我想看看老外的大牛程序员是怎样开发可重用组件的。然而,没想到却让我后悔。 这本书太注重于用代码实现某个功能,全书的大部分内容都被例子代码所占据了。我不是说代码不重要,但当一个程序员开始关注软件重用性和软件架构的合理性后,他是不会将主要注意力放在如何实现某个具体功能的代码之上的。 《 VB.NET设计模式高级编程—构建强适应性的应用程序 》设计模式是面向对象理论的重要组成部分,当我看见《 VB.NET设计模式高级编程—构建强适应性的应用程序 》这本书时,真有点喜出望外,终于看到讲.NET设计模式的书籍了。 但仔细看了前三章,我就失望了。 第二章介绍了将抽象类工厂设计模式应用于数据存取层的设计,没有什么新鲜的,不过倒是有一点实用性。第三章介绍了使用Decorator和Strategy设计模式来设计中间层,但由于作者表述不清,让读者很难把握全貌,看着很累。第四章介绍了如何应用著名的MVC模式来设计表示层,这一章我已经没有耐心看下去了,全书就这样“虎头蛇尾”地被我扔到了一边。 其实,写作系统架构设计方面的书籍是很难的,因为这些理论都足够抽象,而且一个体现相关理论应用软件系统一般都是比较复杂的,如何深入浅出地向读者讲清楚,非常不容易。客观地说,这两本书的作者做得都不错了。 相比之下,Java系列的就有好书,例如我看过的《J2EE核心模式》(Sun公司核心技术从书,机械工业出版社),就不错,能引人深思。 然而,最应该仔细精读的是四人帮(Gang of Four)《设计模式——可复用面向对象软件的基础》这一经典巨著,还有电力出版社最近引进的影印版《Design Patterns Explained》( 设计模式解析(影印版) )以及《 重构——改善既有代码的设计(影印版) 》,都是极为优秀的重量级著作。相比之下,.NET的这两本类似书籍就差多了,可以看成是OOAD理论在.NET下的实例,但想通过这两本书来学习OOAD,无异于盲人摸象。 《 Visual Basic.NET解决方案工具箱—30个.NET实用组件 》这是一本好书,不论是初学者还是有经验的程序员,都可以从中学到许多东西,建议C#程序员也要看看这本书。 这本书提供了30个实用的.NET组件,有许多可以直接应用到项目中。这本书将所有组件分为:应用程序组件、GUI与图形组件、网络与文件系统、安全性、模式和算法五个大类。每个例子短小精悍,却很实用,而且很能说明问题。我特别欣赏每个例子的结构安排:先是背景介绍,告诉读者在现实开发中会遇见哪些问题;接着是可以使用的技术(.NET所提供的功能);然后设计出一个总体的技术解决方案;接着解释具体的代码实现;例子的运行结果描述;最后指出当前技术方案的局限性。简直模拟了一个微型的软件项目开发过程。例子也选择得很有特色,如制作Splash屏幕,正则表达式验证,都非常实用。 这些组件虽规模不大,但却涉及了许多.NET中最重要的技术,如反射,XML,多线程等,并不简单。看了此书,会引起程序员开发自己组件的强烈愿望。 4.可视化界面组件开发一般,程序员对各种各样的控件很感兴趣,VB与Delphi的成功,很大原因就是因为他们拥有丰富多彩的控件库。 刚接触.NET,我发现其中提供的控件并不多,但是看看.NET的体系结构。我高兴地发现,在.NET中,一切都是对象!我现在终于可以用VB.NET自由地从.NET类库中派生出自己的组件,给它加上任何我所需要的功能。面向对象的开发方式,加上增强了的GDI+,我可以肯定,用不了多久,.NET下的用户界面组件会让人眼花缭乱,叹为观止的。现在,你到InterNET上搜一搜,就有这种感觉了。比之传统win32平台上的ActiveX控件,开发.NET组件要有趣得多,也要方便得多。尤其是对于Windows Form程序,开发自己的可视化界面组件,可以给软件添色不少。 《GDI+程序设计》一本好书,开头几章对GDI+作了非常详尽的介绍,从基本绘图对象(Pen、Brush、Font...)讲起,还介绍了许多基础知识,后半部分是从头开始“画”出来的自定义控件作为实例进行说明。 《 Windows GUI高级编程—C#编程篇 》这本书的特点是深入剖析了Windows Form的运作机制,对于创建自己的数据绑定组件的介绍尤其有特色,是一本有一定深度的书。 5 .NET framework .NET framework是.NET的核心支撑平台,所有.NET应用程序都需要framework提供运行时支持。因此.NET framework所提供的系统服务,就成了我们开发程序中的必备利器。这里,我介绍红皮书系列的五本书,分别涉及.NET framework几项重要的系统功能。 《 ASP.NET XML高级编程—C#编程篇 》 XML的重要性无庸我多说,对XML的全面支持是.NET设计者非常正确的一个决策。在此书中,作者介绍了XML技术中的核心部分:SAX、DOM、XSL、XPath等,大体上作者各用一章的篇幅来介绍相关理论在.NET中的实现(即各种类的设计),并举例说明这些类的使用方法,非常实用。同时作者针对.NET的特定领域,如MSXML组件、ADO.NET和ASP.NET,介绍了XML在这些地方的应用,最后是案例研究,并有一章专门针对C#,讲述如何在C#中利用XML格式的注释来自动生成帮助文档。 这本书的内容非常丰富,是一本不错的书。不过需要指出的是,看这本书之前最好先看一本XML的入门读物,至少弄明白DOM,XSL等术语是什么含义。 《 Visual Basic .NET串行化参考手册 》所谓串行化,就是把内存中的一个对象数据转化为字节流,然后将其存放到存储器中,在需要时再从存储器中将字节流读出,然后通过反串行化(又称并行化)在内存中重建原来的对象。 这个技术非常有用,我想过,至少它可以用来实现像Word那样的出错恢复功能;可以实现断点续传;可以将一个对象通过网络传送到另一台计算机上,然后在那台计算机中重建一个克隆的对象…… 这本书全书围绕着浅串行化(串行化的结果是人可以识别的文档,如按SOAP编码的XML文档)和深串行化(将对象串行化为二进制流)两种方式进行介绍,实际开发中可能遇到的各种问题都有涉及。举的例子都很易懂,很容易就可以在实际项目中使用,讲得也清楚明白。不足之处是罗嗦了一点。算是一本物有所值的书。 《 Visual Basic .NET反射参考手册 》反射(Reflection),通俗地说,就是根据名字来创建对象的方法。只需给定一个类名字(String类型的变量),.NET就可以利用反射机制在内存中创建这个类型的对象。这是一种极强大的功能,它使创建即插即用的软件组件成为了现实。当我看到.NET的反射机制时,非常兴奋,这是我一直想要的东西。我原先就想用C++在Win32平台上实现这个功能,但发现难度很大,没能形成一套可行方案,因而不能在项目中应用。如今.NET把它嵌入到了系统框架核心中,我不得不佩服微软.NET设计者对程序员在开发中遇到困难的深入把握。现在,我已经在项目中采用了这一技术。适当应用反射机制,可以构造出可动态升级的软件系统,并增强系统的灵活性,而仅仅需要付出一点运行上的效率损失。 反射手册这本书很薄,但基本上讲清了如何利用代码通过名字来动态地创建对象,调用对象的属性与方法,例子也比较简短实用。200页的书,要卖32元,有点贵,但我也没后悔,它确实帮了我。 《 Visual Basic.NET线程参考手册 》 VB6一直不能直接支持多线程开发,是它的一大缺陷。而.NET从一开始就建立在多线程的基础之上,VB.NET现在终于可以像Java一样,轻松地开发多线程程序了。VB程序员从没这么扬眉吐气过。 但这本专讲多线程的书,则是我看过最无味的一本了,翻译得也不好,介绍应用程序域与线程、进程关系那一页,几乎让人不知所云。这本书我看到线程池一章就再也看不下去了,半途而废。我在网上搜索的几篇零散的多线程文章都比这本书讲得清楚。这本书,我深感失望! 《 VB.NET字符串和正则表达式参考手册 》字串操作在所有的程序中都是频繁出现的。这本书前半部分专注于String类和StringBuilder类的介绍,甚至涉及到VB字串操作代码生成的MSIL源码,这部分对想深钻.NET框架内部的程序员可能有点好处。该书第二部分则专注正则表达式,清晰明白,资料收集得比较全面,基本满足实际开发需要。从Wrox网站下载其所附的源代码之后,发现其中有一个正则表达式的工具RegExTester,也很实用。 6. 报表在MIS系统中,没有报表支持是不可想象的。我是在VB 5开始认识Crystal Report(水晶报表)的。不知什么原因,VB 6换成了Data Report(这个产品实在不怎么样)。但当时对Crystal Report的印象并不好,要做出由程序来控制的自定义报表非常麻烦,我们在实际开发时,都宁愿将数据导到Word或Excel中,调用OFFICE强大的图表功能来实现报表预览,打印等功能。 到了VS.NET,Crystal Report再次出现,并集成进了开发环境中。我对它引发兴趣源自2002年微软VS.NET中文版发布会上的新功能展示。在我正式开发.NET平台下的软件时,认真研究了一下Crystal Report,我发现水晶报表在.NET的支持之下,已非吴下阿蒙。为什么这样说?举个例子,我看到水晶报表现在可以支持XML格式的数据,这就意味着我可以在内存中动态地生成一个ADO.NET数据集,然后再传给水晶报表引擎,数据不一定需要来自数据库,这带来了极大的灵活性。不要小看这一点,在多层分布式系统环境下,经常需要对数据进行各种处理后再传给报表,报表组件支持数据源的多样性是非常关键的。 出于对报表的关心,我买了红皮书系列的《 Crystal Reports for Visual Studio .NET高级编程 》。然而,这本书实在不应起名为《 Crystal Reports for Visual Studio .NET高级编程 》,改为《操作手册》可能更确切。作为一名程序员,对软件的操作一般都可以凭经验无师自通。我们关心的是在程序中如何全面方便地控制水晶报表。很遗憾,这本书中并没有给出足够的代码告诉读者如何做,反而讲了一堆操作。事实上,讲操作他也没讲好,反不如我看过的铁道出版社所出的那本《 .net Crystal Report实战演练 》,铁道出的这本书图文并茂,更关键的是其例子通俗易懂,通读一遍,再在电脑中将光盘中的示例运行一次,即明了水晶报表能做出什么样子的东西。 对于非常重要的报表组件发布,两本书都不能让我满意。怎样在没有安装VS.NET的电脑上运行带有水晶报表的软件?从Win98到Windows Serv-er2003,在不同版本的Windows下运行程序会有什么不同? 我在开发中遇到的这些实际问题,在书中都没有详细介绍,我是通过互联网获取相关资料的。 7 . 安装与部署程序写完了,就需要打包部署,红皮书《 Visual Basic .NET部署手册 》就派上了用场。此书写得一般,对VS.NET提供的安装项目解释得较清楚,并且基本上介绍了安装与部署过程中涉及的组件发布、配置、授权等方面,但对于报表部署则没有涉及。 四、总结在半年之内,出于研究与开发目的,我蜻蜓点水地看了几十本.NET书籍,对.NET系列书籍的总体感觉是精品书籍太少,值得让人反复阅读、品味再三的更是一本也没有,相比Java系列,真是差了不少。这是什么原因?难道真的是Windows领域没有大师?绝不是这样,像创造出Delphi、VJ、C#这等重量级产品与语言的Anders Hejlsberg,谁能不承认他是大师?我想可能是大师们都太忙,没时间写书,这是读者的一大遗憾。另外,我想可能还有另外一个原因,那就是.NET出现时间还不长,.NET开发者的技术需要积累,经验需要累积,之后才会有经典著作的出现。 作为一名中国的程序员,我更盼望能看到出自国人之手的经典著作,不知我们还要等多久? 《程序员》推荐我的EJB书架 创建人: 《程序员》 《 Enterprise JAVABEANS(第二版) 》原出版社:O'Reilly 作者:(美)Richard Monson-Haefel 译者:朱小明 周琳出版社:中国电力出版社出版时间:2001-03 这是一本讲述Enterprise JavaBeans(EJB)技术的权威指南,也是EJB类图书中的经典之作。这本书是笔者当年接触、学习EJB的第一本书,先后阅读了8遍,每次都有不同的收获。此书为第二版,真希望国内出版社能尽快引进最新的第三版。该书直接、言简意赅地介绍了EJB的基础技术、Java类和接口、组件模型及EJB的运行时性能。虽然本书着眼于基础知识,但绝非是一本入门级的技术图书。它系统介绍了EJB技术的来龙去脉,并简略介绍了EJB技术的工作方式及EJB的构成。第八章还着重介绍了EJB技术的核心部分——事务处理。本书内容以EJB1.1为主,同时也和EJB1.0的版本做了一些比较。对于初学EJB并且想掌握EJB精髓的朋友们来讲,该书是个不错的选择。 《EJB编程指南》原书名:Professional EJB 作者:(美)Rahim Adatia Faiz Arni Kyle Gabbart 译者:喻文山 邱仲潘出版社:电子工业出版社出版时间:2002-01 Java2平台企业版(J2EE)是全球普遍采用的企业应用程序开发平台,J2EE体系结构中的EJB提供了分布式计算环境中需要的所有服务。EJB体系结构是生成企业应用程序的主要分布式组件模型。J2EE和EJB号称是最成熟、最健全的企业开发模型,EJB使业务逻辑实现与系统级服务分开,从而使开发人员可以集中考虑编程问题。该书首先介绍了EJB体系结构开发的基础,然后介绍更高级的问题,如设计策略与模式、资源事务和安全管理、测试与性能以及系统部署、运行时服务等。书中内容全面,重点突出,具有很好的学习和参考价值。尤其是书中涉及到的EJB2.0和EJB1.1规范的不同,颇具参考价值。 《J2EE编程指南(1.3版)》原书名:Professional Java Server Programming J2EE 1.3 Edition 作者:(美)Subrahmanyam Allamaraju Cedric Buest John Davies 译者:马树奇出版社:电子工业出版社出版时间:2002-03 Enterprise JavaBeans体系结构是个分布式组件模型,可以开发安全的、可伸缩的、事物性的多用户组件。本书详细介绍了有关EJB核心部分的事务模型以及安全管理。该书的一大特色是介绍了EJB的设计模式:业务委托模式,会话门面模式,数值对象模式,累积实体模式。对于每种模式,又详细介绍了该模式的意图,动机,适用性,参与者,结构,协作,如何实现等内容。这样的组织结构对于理解EJB的运行机理非常有帮助。书末最后介绍了J2EE、COM、CORBA、无线与WEB服务的内容。该书对J2EE整体框架的介绍非常完整,servlet和JSP部分内容尤其精彩。但EJB部分却稍有些晦涩难懂。 《 Java与模式 》作者:阎宏出版社:电子工业出版社丛名书:软件工程研究院出版时间:2002-10 这是少有的由中国人所写的一本精彩图书,也是一本讲解设计原则以及最为常见的设计模式的实用教材,目的是为工作繁忙的Java系统设计师提供一个快速而准确的辅导。本书共分55章,每个章节讲解一个编程模式,说明此模式的用意、结构,以及这一模式适合于什么样的情况等。每一个章节都附有多个例子和练习题,研习这些例子、完成这些练习题可以帮助读者更好地理解所讲的内容。掌握设计模式是深入学习J2EE体系结构的关键所在。该书作者凭着深厚的自然科学和中国传统哲学功底,以及多年来对设计模式理论的研究,将道家思想和设计模式融会贯通,准确、清晰地从另一个角度向读者展现了模式理论的精髓所在。 《EJB 2.0企业级应用程序开发》原书名:Special Edition Using Enterprise JavaBeans 2.0 作者:(美)Chuck Cavaness Brian Keeton 译者:智慧东方工作室出版社:机械工业出版社出版时间:2002-03 本书内容包括:构建EJB类及其接口的机制,EJB设计和性能的策略,构建Web层,EJB的高级概念等。附录包括有EJB 2.0的摘要及其新特征。整体而言,该书内容上有一定的深度,它与一般EJB入门书籍和手册不同,重点阐述了EJB的构架思想和设计模式,比较适合有EJB基础的人深入研读。 《J2EE 构建企业系统——专家级解决方案》原书名:Building Java Enterprise Systems with J2EE 作者:Paul J.Perrone,et al. 译者:张志伟 谭郁松 张明杰 出版社:清华大学出版社出版时间:2001-06 这是一本较早的介绍J2EE的图书。书中提供了构造可扩缩的、安全的、具有Web功能的企业分布式系统的详尽且具有实际意义的指导。但阅读此书的读者最好应具有一定的面向对象软件开发和Java方面的开发经验。该书将J2EE的运行原理剖析得非常透彻,缺点是欠缺对设计模式及编程思想的介绍,而且API的应用部分介绍过多。不过,对部分读者却有好处,因为几乎J2EE所涵盖的每个方面都作了详细的介绍,而且还有实例分析。记得当时笔者在做一个MIS系统时,因为要用到LDAP部分的内容,最后参考了该书的介绍才解决难题,一时受益匪浅。 “如果你要学习Java语言编程,此书不一定是个好选择;但如果你已经有了一定的Java语言编程技术基础,对设计模式及编程思想有一定的掌握,想建构以Java为核心的企业信息系统,那你就不会后悔购买此书”。 《 用J2EE和UML开发Java企业级应用程序 》原书名:Developing Enterprise Java Applications with J2EE and UML 作者:Khawar Zaman Ahmed,Cary E.Umrysh 译者:康博出版社:清华大学出版社出版时间:2002-07 该书通过一个完整的实例,系统介绍了用J2EE开发企业级软件工程时,将UML建模技术应用到软件开发过程各个阶段的方法。书中内容从最基础的知识着手,非常适合于初学UML和J2EE的读者。此外,后面几章还深入介绍了用UML为J2EE主要技术建模的内容,有相当的参考价值。笔者认为该书思路比较清晰。部分内容高屋建瓴,能够从一个比较高的角度向读者展示J2EE的核心架构。有相当的学习和参考价值,如果译者在翻译上能再下些功夫,效果就更好了。 差书点评 1. 《EJB应用开发详解》全书详细介绍了J2EE框架的重要组成部分——EJB及其相关技术,共分3大部分20章。但书中内容全部取材于SUN的J2EE指南资料,未做根本改动,甚至没有体现出图书应有的重点、特色和技术论述,完全是翻译、拼凑的一本资料集。 2. 《J2EE平台上的EJB组件开发》该书重点讨论J2EE平台的主干EJB的体系结构,描绘如何使用EJB组件体系结构开发与部署企业应用,并以示例阐述在企业应用开发中如何应用EJB体系结构及其特性。但全书内容基本取材于帮助文件,而且中文版翻译质量较差。 一点忠告现在计算机业内人士动辄就著书立说,但这里笔者却想奉劝那些欲出书赚money的朋友:潜心做点学问。如果您成了某方面的专家,那时您的图书自然会成为经典之作。何必急于这一时呢? “临渊羡渔,不如退而结网”。是做技术图书的旗手,还是做差书劣品的成名人物?请自斟酌。 -------------------------------------------------------------------------------- C++之父 B. Stroustrup 近期言论译者 孟岩侯捷注:本文系 CSDN(中国程序员网站)上的贴文。可读性高,译笔流畅。承译者孟岩先生应允,转载於此以飨台湾读者,非常感谢。 未得孟岩先生之同意,任何人请勿将此文再做转载。 以下蓝色为提问,黑色为回答。红色为译注,紫色为侯捷个人认为宜再斟酌之处。浅蓝色是侯捷个人阅读时的神秘标记。 本繁体文系直接转码,并未将大陆惯用术语转换为台湾惯用术语。 [译者按] Bjarne Stroustrup博士,1950年出生于丹麦,先後毕业于丹麦阿鲁斯大学和英国剑挢大学,AT&T大规模程序设计研究部门负责人,AT&T 贝尔实验室和ACM成员。1979年,B. S开始开发一种语言,当时称为"C with Class",後来演化为C++。1998年,ANSI/ISO C++标准建立,同年,B. S推出其经典着作The C++ Programming Language的第三版。C++的标准化标志 B. S博士倾20年心血的伟大构想终於实现。但是,计算技术的发展一日千里,就在几年前人们还猜想C++最终将一统天下,然而随 Internet的爆炸性增长,类似Java C#等新的 现代感十足的语言咄咄逼人,各种Script语言更是如雨後春笋纷纷涌现。在这种情况下,人们不禁有些惶恐不安。C++是不是已经过时了呢?其前景如何?标准C++有怎样的意义?应该如何学习?我们不妨看看B. S对这些问题的思考。以下文字是译者从Stroustrup1998年之後发表的若干文章 谈话笔记中精选出来的,由於出处不一,内容多有重复,为保持完整,亦一并译出。 以下内容选自B. S在自己主页上发表的FAQ 1. 请谈谈C++书。没有,也不可能有一本书对於所有人来说都是最好的。不过对於那些真正的程序员来说,如果他喜欢从"经典风格"的书中间学习一些新的概念和技术,我推荐我的The C++ Programming Language, 1998年的第三版和特别版。那本书讲的是纯而又纯的C++,完全独立於平台和库(当然得讲到标准库)。该书面向那些有一定经验的程序员,帮助他们掌握C++,但不适合毫无经验的初学者入门,也不适合那些临时程序员品尝C++快餐。所以这本书的重点在於概念和技术,而且在完整性和精确性上下了不少功夫。如果你想知道为什麽C++会变成今天的模样,我的另一本书 The Design and Evolution of C++ 能给你满意的答案。理解设计的原则和限制能帮助你写出更好的程序。www.accu.org是最好的书评网站之一,很多有经验的程序员在此仗义执言,不妨去看看。 2. 学习C++要花多长时间?这要看你说的"学习"是什麽意思了。如果你是一个Pascal程序员,你应该能很快地使你的C++水平达到与Pascal相近的程度;而如果你是一个C程序员,一天之内你就能学会使用C++进行更出色的C风格编程。另一方面,如果你想完全掌握C++的主要机制,例如数据抽象,面向对象编程,通用编程,面向对象设计等等,而此前又对这些东西不很熟悉的话,花上个一两年是不足为奇的。那麽是不是说这就是学习C++所需要的时间呢?也许再翻一番,我想打算成为更出色的设计师和程序员最起码也要这麽长的时间。如果学习一种新的语言不能使我们的工作和思想方式发生深刻的变革,那又何苦来哉?跟成为一个钢琴家或者熟练掌握一门外语相比,学习一种新的 不同的语言和编程风格还算是简单的。 3. 了解C是学习C++的先决条件吗?否 C++中与C相近的子集其实比C语言本身要好学,类型方面的错误会少一些,也不像C那样绕圈子,还有更好的支持库。所以应该从这个子集开始学习C++。 4. 要想成为真正的OO程序员,我是不是得先学习Smalltalk?否。如果你想学Smalltaok,尽管去学。这种语言很有趣,而且学习新东西总是一个好主意。但是Smalltalk不是C++,而且把Smalltalk的编程风格用在C++里不会有什麽好结果。如果你想成为一个出色的C++程序员,而且也没有几个月的时间百无聊赖,请你集中力量学好C++以及其背後的思想。 5. 我如何开始学习C++?这取决于你的基础和学习动机。如果你是个初学者,我想你最好找个有经验的程序员来帮助你,要不然你在学习和实践中不可避免的犯下的种种错误会大大地打击你的积极性。另外,即使你的编译器配备了充足的文档资料,一本C++书籍也永远是必不可少的,毕竟文档资料不是学习编程思想的好教材。 选择书籍时,务必注意该书是不是从一开始就讲授标准C++,并且矢志不渝地使用标准库机制。例如,从输入中读取一个字符串应该是这样的: string s; // Standard C++ style cin >> s; 而不是这样的: char s[MAX]; /* Standard C style */ scanf("%s",s); 去看看那些扎实的C++程序员们推荐的书吧。记住,没有哪本书对所有人来说都是最好的。另外,要写地道的C++程序,而避免用C++的语法写传统风格的程序,新瓶装旧酒没多大意义。(遗憾的是,目前在市面上的中文C++教材中,符合B. S的这个标准的可以说一本都没有,大家只好到网上找一些英文的资料来学习了。--译者) 6. 怎样改进我的C++程序?不好说。这取决于你是怎麽使用该语言的。大多数人低估了抽象类和模板的价值,反过来却肆无忌惮地使用造型机制(cast)和宏。这方面可以看看我的文章和书。抽象类和和模板的作用当然是提供一种方便的手段建构单根的类层次或者重用函数,但更重要的是,它们作为接口提供了简洁的 逻辑性的服务表示机制。 7. 语言的选择是不是很重要?是,但也别指望奇迹。很多人似乎相信某一种语言能够解决他们在系统开发中遇到的几乎所有问题,他们不断地去寻找完美的编程语言,然後一次次的失败,一次次的沮丧。另外一些人则将编程语言贬为无关紧要的细节,把大把大把的银子放在开发流程和设计方法上,他们永远都在用COBOL C和一些专有语言。一种优秀的语言,例如C++,能帮助设计者和程序员做很多事情,而其能力和缺陷又能够被清楚地了解和对待。 8. ANSI/ISO标准委员会是不是糟蹋了C++?当然不是 他们(我们)的工作很出色。你可以在一些细节上找些歪理来挑刺,但我个人对於这种语言以及新的标准库可是欣欣然。ISO C++较之C++的以前版本更出色更有条理。相对於标准化过程刚刚开始之初,你今天可以写出更优雅 更易于维护的C++程序。新的标准库也是一份真正的大礼。由於标准库提供了strings, lists, vectors, maps以及作用于其上的基本算法,使用C++的方式已经发生了巨大的变化。 9. 你现在有没有想删除一些C++特性?没有,真的。问这些问题的人大概是希望我回答下面特性中的一个:多继承 异常 模板和RTTI。但是没有它们,C++就是不完整的。在过去的N年中,我已经反复考虑过它们的设计,并且与标准委员会一起改进了其细节,但是没有一个能被去掉又不引起大地震。 从语言设计的角度讲,我最不喜欢的部份是与C兼容的那个子集,但又不能把它去掉,因为那样对於在现实世界里工作的程序员们来说伤害太大了。C++与C兼容,这是一项关键的设计决策,绝对不是一个叫卖的噱头。兼容性的实现和维护是十分困难的,但确实使程序员们至今受益良多。 但是现在,C++已经有了新的特性,程序员们可以从麻烦多多的C风格中解脱出来。例如,使用标准库里的容器类,象vector, list, map, string等等,可以避免与底层的指针操作技巧混战不休。 10. 如果不必和C兼容,你所创造的语言是不是就会是Java? 不是,差得远。如果人们非要拿C++和Java来作比较,我建议他们去阅读The Design and Evolution of C++,看看C++为什麽是今天这个样子,用我在设计C++时遵从的原则来检验这两种语言。这些原则与SUN的Java开发小组所持的理念显然是不同的。除了表面语法的相似性之外,C++与Java是截然不同的语言。在很多方面,Java更像Smalltalk(译者按:我学习Java时用的是Sun的培训教材,里面清楚地写道:Java在设计上采用了与C++相似的语法,与Smalltalk相似的语义。所以可以说Java与C++是貌合神离,与Smalltalk才是心有灵犀)。Java语言相对简单,这部分是一种错觉,部份是因为这种语言还不完整。随 时间的推移,Java在体积和复杂程度上都会大大增长。在体积上它会增长两到三倍,而且会出现一些实现相关的扩展或者库。这是一条每个成功的商业语言都必须走过的发展之路。随便分析一种你认为在很大范围内取得了成功的语言,我知道肯定是无有例外者,而且实际上这非常有道理。 上边这段话是在Java 1.1推出之前写的。我确信Java需要类似模板的机制,并且需要增强对於固有类型的支持。简单地说,就是为了基本的完整性也应该做这些工作。另外还需要做很多小的改动,大部份是扩展。1998年秋,我从James Gosling(Java语言的创始人--译者)那里得到一份建议书,说是要在Java中增加固有类型 操作符重载以及数学计算支持。还有一篇论文,是数学分析领域的世界级大师,伯克利大学的W. Kahan教授所写的How Java's Floating-Point Hurts Everyone Everywhere("且看Java的浮点运算如何危害了普天下的芸芸众生"--译者),揭露了Java的一些秘密。 我发现在电视和出版物中关於Java的鼓吹是不准确的,而且气势汹汹,让人讨厌。大肆叫嚣凡是非Java的代码都是垃圾,这是对程序员的侮辱;建议把所有的保留代码都用Java重写,这是丧心病狂,既不现实也不负责任。Sun和他的追随者似乎觉得为了对付微软罪恶的"帝国时代",就必须如此自吹自擂。但是侮辱和欺诈只会把那些喜欢使用不同编程语言的程序员逼到微软阵营里去。 Java并非平台无关,它本身就是平台。跟Windows一样,它也是一个专有的商业平台。也就是说,你可以为Windows/Intel编写代码,也可以为Java/JVM编写代码,在任何一种情况下,你都是在为一个属於某个公司的平台写代码,这些代码都是与该公司的商业利益扯在一起的。当然你可以使用任何一种语言,结合操作系统的机制来编写可供JVM执行的程序,但是JVM之类的东西是强烈地偏向于Java语言的。它一点也不像是通用的 公平的 语言中立的VM/OS。 私下里,我会坚持使用可移植的C++作大部份工作,用不同的语言作余下的工作。("Java is not platform-independent, it is the platform",B. S的这句评语对於C++用户有 很大的影响,译者在国外的几个新闻组里看到,有些C++高手甚至把这句话作为自己的签名档,以表明对Java的态度和誓死捍卫C++的决心。实际上有很多程序员不光是把自己喜爱的语言当成一种工具,更当成一种信仰。--译者) 11. 您怎麽看待C#语言?就C#语言本身我没什麽好说的。想让我相信这个世界还需要另外一个专有的语言可不是一件容易的事,而且这个语言还是专门针对某一个专有操作系统的,这就更让我难以接受。直截了当地说,我不是一个专有语言的痴迷者,而是一个开放的正式标准的拥护者。 12. 在做大项目时,您是不是真的推荐Ada,而不是C++?当然不是。我不知道这是谁传出来的谣言,肯定是一个Ada信徒,要麽是过份狂热,要麽是不怀好意。 13. 你愿不愿意将C++与别的语言比较?抱歉,我不愿意。你可以在The Design and Evolution of C++的介绍性文字里找到原因。 有不少书评家邀请我把C++与其它的语言相比,我已经决定不做此类事情。在此我想重申一个我很久以来一直强调的观点:语言之间的比较没什麽意义,更不公平。主流语言之间的合理比较要耗费很大的精力,多数人不会愿意付出这麽大的代价。另外还需要在广泛的应用领域有充份经验,保持一种不偏不倚 客观独立的立场,有 公正无私的信念。我没时间,而且作为C++的创造者,在公正无私这一点上我永远不会获得完全的信任。 人们试图把各种语言拿来比较长短,有些现像我已经一次又一次地注意到,坦率地说我感到担 。作者们尽力表现的公正无私,但是最终都是无可救药地偏向于某一种特定的应用程序,某一种特定的编程风格,或者某一种特定的程序员文化。更糟的是,当某一种语言明显地比另一种语言更出名时,一些不易察觉的偷梁换柱就开始了:比较有名的语言中的缺陷被有意淡化,而且被拐弯抹角地加以掩饰;而同样的缺陷在不那麽出名的语言里就被描述为致命硬伤。类似的,有关比较出名的语言的技术资料经常更新,而不太出名的语言的技术资料往往是几年以前的,试问这种比较有何公正性和意义可言?所以我对於C++之外的语言的评论严格限制在一般性的特别特定的范畴里。 换言之,我认为C++是大多数人开发大部份应用程序时的最佳选择。 14. 别人可是经常拿他们的语言与C++比来比去,这让你感到不自在了吗?当这些比较不完整或者出於商业目的时,我确实感觉不爽。那些散布最广的比较性评论大多是由某种语言,比方说Z语言的拥护者发表的,其目的是为了证明Z比其它的语言好。由於C++被广泛地使用,所以C++通常成了黑名单上的头一个名字。通常,这类文章被夹在Z语言的供货商提供的产品之中,成了其市场竞争的一个手段。令人震惊的是,相当多的此类评论引用那些在开发Z语言的公司中工作的雇员的文章,而这些经不起考验文章无非是想证明Z是最好的。特别是在这些比较中确实有一些零零散散的事实,(所以更具欺骗性--译者),毕竟没有一种语言在任何情况下都是最好的。C++当然不完美,不过请注意,特意选择出来的事实虽然好像正确,但有时是完全的误导。 以後再看到语言比较方面的文章时,请留心是谁写的,他的表述是不是以事实为依据,以公正为准绳,特别是评判的标准是不是对於所引述的每一种语言来说都公平合理。这可不容易做到。 15. 在做小项目时,C优于C++吗?我认为非也。除了由於缺乏好的C++编译器而导致的问题之外,我从没有看到哪个项目用C会比用C++更合适。(不过现在C++编译器导致的问题还是不可忽略的,当你看到同样功能的C++程序可执行代码体积比C大一倍而且速度慢得多时,会对此有所感触的。--译者) 以下内容来自Visual C++ Developer's Journal主编 Elden Nelson 2000年3月对B. S的专访 16. 如果您现在有机会从头设计C++语言,您会做些什麽不同的事情?当然,你永远都不可能重新设计一种语言,那没有意义,而且任何一种语言都是它那个时代的产物。如果让我今天再设计一种语言,我仍然会综合考虑逻辑的优美 效率 通用性 实现的复杂程度和人们的喜好。要知道人们的习惯对於他们的喜好有 巨大的影响。 现在,我会寻找一种简单得多的语法,我会把类型系统的冲突问题限制在很少的几种情况里,而且你能很容易的发现这些问题。这样就能够很容易的禁止不安全的操作。(B. S的原则是:对於糟糕的代码,就算是不能完全禁止,至少也要让它大白于天下,而不是藏在阴暗的角落里暗箭伤人。C++实际上已经提供了这样的机制,例如如果你使用象reinterpret_cast(pointer)这样的很明显是非常糟糕的表达式进行造型,别人会很容易地找到问题所在。只不过C++仍然允许你使用传统的 C风格的造型机制,而又有不少人一直使用这种老式的风格,所以才引来麻烦多多。B. S的意思是说,要是现在能够禁止老式的风格该有多好 作为语言设计者的他,恐怕是没有这个机会了,但是作为语言使用者的我们,却还有很大的希望去改进自己的代码。何去何从,应该是我们深思的时候了。--译者) 我还会把核心语言的体积尽可能搞得小一些,包括类和模板的关键的抽象特性,而把很多其它的语言特性放在库里来解决。当然我也会保证核心语言足够的强大,使得那些库本身也足以用这个核心语言来产生。我可不希望标准库的创建需要用到什麽不属於该语言本身的神秘机制。另外我会让这个核心语言的定义更加精确。(有不少新的语言在建库时就使用了一些"不属於该语言本身的神秘机制",比如VB和JAVA。从理论上讲,这是近乎无赖的行径,所以B. S不以为然。不过从实用出发倒也无伤大雅。--译者) 最重要的是,我会在该语言被广泛使用之前尽可能维持一个很长的酝酿期,这样我可以以其他人的反馈为基础进行改进。这可能是最困难的,因为一旦有什麽东西是明显出色和有前途的,大家就会蜂拥而至的来使用它,此後作任何不兼容的修正都会是非常困难的。 我相信这些思想与我当初设计C++时的理念是非常类似的,同样也是这些思想指引 一二十年来C++的不断演化。当然,我认为现在还没有什麽东西能让我觉得像是"完美的语言"。 17. 您预期C++做哪些增强,会不会删掉一些东西?很不幸,虽然有一些东西很应该扔掉,但恐怕很难真的删掉任何东西。第一个应该抛弃的东西就是C风格的造型机制和类型截断转换。就算不禁止,编译器的作者们至少也应该对这种行为给与强烈的警告。我希望能用类似vector的东西彻底取代数组,但这显然是不可能的。不过如果程序员们能主动使用vector来代替数组,就会立刻受益匪浅。关键是你不必再使用C++中最复杂难缠的技巧了,现在有优秀得多的替代方案。 至於主要的特性,我没想去掉任何东西。特别是那些把C++与C区别开来的主要特性恐怕没法风平浪静的被抛掉。通常问这些问题的人是希望我挑出诸如多继承 异常 模板等机制来接受批判。所以在这我想大声讲清楚,我认为多继承机制对於静态类型语言实现继承性来说是必需的,异常机制是在大系统中对付错误的正确方法,模板机制是进行类型安全的 精致的和高效的程序设计的灵丹妙药。我们可以在小的细节上对於这些机制挑挑刺,但在大的方面,这些基本的概念都必须坚持。现在我们仍在学习标准C++,也正在标准所提供的特性基础上发展出更新的 更有趣的编程技术。特别是人们刚刚开始使用STL和异常机制,还有很多高效强大的技术鲜为人知,所以大可不必急匆匆的跑去增加什麽新的机制。 我认为当前的重点是提供很多新的 比以前更加精致的 更有用的库,这方面潜力巨大。例如,如果有一个能被广泛使用的 更精致的支持并发程序设计的库,那将是一大福音--C风格的线程库(例如Pthread--译者)实在不够好。我们也就可以与各种其他的系统,例如SQL以及不同的组件模型更好地契合起来。数值计算领域的人们在这方面好像已经走在了前面,类似像Blitz++ POOMA MTL之类的高效而精致的库的开发已经取得了非凡的成就。(译者在Internet上造访了Blitz++和POOMA的主页,前者是一个高性能数学库,据称其性能与Fortran 77不相上下,同时又支持大量的C++特性。我想凡是对於数值计算领域有所了解的人都知道这有多麽伟大的意义。POOMA则是一个专门研究C++并行数学算法的项目,它的前景更加不可限量。译者非常认同B. S的这个观念。--译者) 有了足够的经验之後,我们就能更好的决定应该对标准做些什麽调整。 18. 显然,这几年世界变了,正在走向一个以Web为中心 分布式计算为主流的时代。那麽您觉得C++还能维持其地位吗?程序员们可不可能把若干种专用语言(比如Perl Javascript)综合运用以彻底取代某一种通用语言?(C++就是这样的通用语言--译者)为了配合新的计算模式,C++及其标准库应该做怎样的调整?从来没有哪一种语言能适合所有的工作,我恐怕以後也不会有。实际系统通常是用多种语言和工具构造起来的。C++只是想成为若干语言和工具中的一个,当某些专用语言在其领域里特别突出时,它们可以与C++互为补充。也就是说,我觉得如果大多数现在的专用语言能借助特定领域的C++库共同工作的话,它们会表现得更出色。脚本语言通常导致难以维护的代码,而且也没有给程序的结构 可扩展性和可维护性的优化留下什麽余地。 我不敢肯定未来的代码是否真的会是以Web为中心的。就算是直接处理Web的系统也主要是由处理本地资源,如IP连接之类的程序模块构成的。 地理上的分布性以及服务器软件对於并发机制的高度依赖对於系统的建造者来说的确是个挑战。有些针对上述问题的库已经出现,也许我们将会看到它们最终得以标准化。当然,一些原操作和保证规则应该被加到核心语言中以提供对这些库的更佳支持。 总的来说,对於Web和网络,我们非常需要一个真正的系统/网络级的安全模型。指望JavaScript之类的脚本语言实现这个模型无异于白日做梦。 注意,我也没说C++提供了这个问题的解决方式。C++的重心是高效的访问系统资源,而不是反欺诈。 19. 您看C++未来的走向如何?在接下来的10年里它会衰落吗?或者是基本保持现在的形式?或者发展变化呈不同的形式? C++有 最美好的未来。用它你能写出伟大的代码。除了故意进行恶意欺诈,C++仍将是开发高性能 高复杂度系统的最好语言。据我所知,没有那种语言能在通用性 效率和精致三方面的统一上可与C++相题并论。 我没看到C++有衰落的徵兆。在我能预见的未来里,它的用途还会不断增长。当然,在未来的十年里我们会看到一些变化,但不会像你想得那麽显着。跟每一种语言一样,C++也会发展变化。"语言专家们"要求改进的喧嚣声震耳欲聋,但是系统开发者们的基本请求是保持稳定。 C++会改进,但是这些改进将主要是为了反映从实践中得来的经验教训,而不会是为了追风尚赶时髦。为了更高效地使用一些新的编程技术,比如通用编程技术,可能会增加一些小的特性。会有大量的库涌现,我预期会出现一种崭新的 更出色的库支持机制。我希望新的扩展主要集中在支持抽象方面的一般特性,而不是为支持某些特殊任务的特定机制。 例如,"属性"这个概念是很有用的,但我不认为在一种通用编程语言中有它的容身之地。用标准C++的一组类可以很容易地支持这一概念。如果我们感觉那族类对於"属性"这一概念的支持不尽如人意,也不会立刻跑去在语言里增加属性机制,而是仔细考虑如何改进类和模板以帮助库设计人员尽可能接近"属性"这个概念。也许通过改进函数对象的机制能够给这个问题一个满意的答复。 为了使C++在接下来的十几年中保持灵活可变,很基本的一点就是不要让标准C++赶什麽学术或者商业的时髦。人们要求增加的特性中很大一部份通过使用现有的标准C++开发新库的方式都可以实现。还有,事实上人们渴望得到的很多特性已经被包括在标准C++中,并且被最新的编译器支持。 对许多程序员来说,提高代码质量的最佳途径不是追求什麽语言扩展,而是好好地 慢慢地品味最新的C++技术书籍(可惜我们到目前为止连这种机会都没有--译者)。 20. 您怎麽看待脚本语言的兴旺态势?特别是Python,似乎提供了一种学习OO技术的更简单的途径有些语言很不错。比如Python,我很喜欢。但是我认为你从不同的语言中学到的OO技术是不完全相同的。当然,每一个专业的程序员都需要通晓几门语言,并且了解各种语言在编程和设计技术上的不同。 在我看来,用脚本语言建造的系统与用C++那样的通用语言建造的系统大不相同。从两类语言中学到的技术区别明显。在OO技术里也不存在什麽通用部份对於各种系统的高效建造来说都是至关重要的。 21. 有没有计划往标准C++里增加一些新的特性以支持分布式计算?没有,我也不认为有这个必要。用更好的库就差不多能解决问题了。最多,为了支持这类的库,我们可能会增加一些低级的原操作和规则 22. 未来C++有没有可能定一个可移植的二进制接口?如果你说的"可移植"是指跨硬件和块操作系统的可移植,我想回答是不会。我们当然可以设计一个解释器或者虚拟机(如同Java的做法--译者),但这样一来,由於无法以最优的方式访问系统资源,C++的能力就会受到削弱,。我真正希望在不远的将来能够看见的东西是platform ABIs(ABI, Application Binary Interface) 。例如,有人正在努力为Intel新的IA64体系定义C++ ABI,我想这些努力会得到用户们的巨大支持。能够把不同编译器产生的代码编译在一起将会是一项十分有意义的事情。 23. 在不少流行领域,C++正在渐渐失去光芒,因为它要求人们花很大的精力去对付一些很基本的工作,比如管理内存(因为没有垃圾收集机制),管理模块之间的依赖性(因为没有包机制),管理组件的版本。C++缺乏一些现代语言已经视为标准的特性。比如传言中最酷的Java语言就特别重视这些问题。那麽在解决这些问题是否会导致C++的发展背离其根本宗旨呢?C++应该怎样发展以保证我们在这种语言上的投资能有合理的回报,而不是被迫去重新使用另一种语言?我倒还没有注意到C++比以前用的少了。相反,我看到的指标表明C+的使用还在稳定地增长 。只不过这种基数很大的稳定增长以及在标准性 移植性和库方面的不断提高并没有造成什麽具有欺骗性的新闻效应而已。我认为你所说的"失去光芒"只不过是市场推销和新闻意义上的现象。 如果你需要垃圾收集机制的话,你可以在C++应用程序中插入一个垃圾收集器。有不少自由的和商业的垃圾收集器已经在重要的实践中被证明是很出色的。 如果你不想使用垃圾收集机制,也没关系。你可以使用标准容器类,它们大大减少了对於显式分配和回收内存的需要。这样,使用现代的库和现代的编程风格,你能够避免大部份的内存管理问题。 同样的技术还能够用来避免一般资源的管理问题。并不是只有内存才会泄漏,线程句柄 文件 互斥锁 网络连接等都是重要的资源,为了建立可靠的系统,这些资源必须被正确的管理。如果你觉得有了垃圾收集机制就可以解决所有的资源管理问题,那麽你最好赶快从美梦中醒来。 C++提供了很多机制来管理一般性的资源。关键的手段--"Resource Acquisition is Initialization"(这是著名的RAII惯用法,阅读原文时会经常遇到,其意义是说将所有的资源分配申请放在对象初始化过程中进行,而将资源释放动作放在对象销毁过程中——译者)可以使用函数对象来管理生存期问题。语言中关於对象的局部构造和异常机制对这项技术提供了支持。 某些语言的狂热支持者总是用讽刺漫画的笔法描述C++,然而C++实际上要好得多。特别是我觉得很多其他的特性已经泛滥不堪了,在C++中,通常这些特性能够很容易的被模拟出来。相反的,新的语言在推广的过程中总是不断地增加新的特性,这就是为什麽从一种语言诞生到被广泛使用,其体积通常会增加个两三倍。 目前,最为个人和组织,对於C++的最好投资就是去更好地理解标准C++和现代的C++设计编程技术。大多数人使用C++的方式实际上停留80年代中期的水平,甚至比那更陈旧。 至於模块依赖性问题,我的观点是,在编程语言的工作和系统的工作之间应该有一个明显的界线,依赖关系应该尽可能地与编程语言分开,而由系统来支持。 我不认为组建版本的问题应该由编程语言来解决,这是一个系统范畴里的问题,在语言里应该通过提供相应的库来解决。C++有这样的机制。 解决这样的问题不会使C++偏离轨道。但是给C++增加很多特殊的特性就会使C++偏离轨道,而且在保持可移植性和平台独立性方面也会是一个倒退。 24. 标准C++推出有段时间了,Java也大踏步地往前走而且取得了显着的进步,您现在怎麽比较Java与C++?您觉得Java想要变成像C++一样"好"的语言还需要做些什麽?您举的C++从Java身上学到了什麽经验吗?有没有什麽Java的特性您认为是可以被C++吸纳的?我不比较语言。做好这项工作是十分困难的,而且很少具有专业水准。 我认为C++的进步会是主要以它的用户在使用中遇到的问题以及其自身逻辑为基础。当然,其他语言中的某些思想也会被考虑,但不能被简单的移花接木过来。你必须审视那些机制在技术上和思想上的背景,并且找到在C++中支持这些技术的最佳方案。 有时最好的选择是综合使用几种语言。毕竟没有任何一种语言是放之四海而皆优的。C++现在是,将来也继续会是在广泛应用领域中最好的语言之一。但是,我们不能被拉下水,不能把所有可能的特性都加到C++里面来向大众献媚。我认为Java和C++现在和将来都会是十分不同的语言,语法相似,但背後的对象模型明显不同。 对於我来说,一个很重要的区别是C++有一个ISO标准,而Java则是一个专有语言。 25. 在Java刚刚出现的那几年,有很多欺骗性的言论说它将会是终极语言,会取代C++。您觉得在过去两三年里Java对C++的追随者们有什麽影响?到现在关於Java的不实之辞也还随处可见。暂且不提Java在过去5年间的创纪录的发展,狂热的大众似乎认为Java将最终取代的不仅仅是C++,而且还有所有其他的编程语言。但在另一方面,C++的使用仍在继续增长。我不认为Java对於C++的影响已经使得人们转而把本来打算用来创造更好的C++工具库的资源调过去开发Java工具库。Java对於学习编程的人来说没有太多的新东西,所以对於C++的定义也没什麽影响。在那个领域,Java还得努力追赶。例如,我认为为Sun迟早会往Java里加入类似模板的机制。 人们应该认识到C++和Java的目标是何等的不同。 以C++的设计理念来衡量Java,或是以Java的设计理念来衡量C++,得出的结论都不会很好。 在访谈即将结束时,或许我该再次表明态度:C++仍然是我喜爱的语言,在写代码时你会发现没有那种语言能像它那样在如此广泛的应用领域和平台上同时达成如此的高效与精致。 myan 译 美国大学计算机教育漫谈 美国纽约市立大学 钟京馗前言前几天收到《CSDN开发高手》杂志社编辑的约稿邮件,主题是关于中外计算机教育对比。笔者因学习和工作的关系对美国大学计算机教育体系有较深刻的了解和认识。同时与国内计算机系的教授也有一定的联系,比较了解国内大学计算机教育的现状。国内计算机系的学生就经常拿自己调侃,调侃之一:“计算机专业最没前途了,因为计算机专业大体分三类,硬件、软件和网络。硬件方面不如电子系,软件方面不如数学系,网络方面不如通信系…”。以往对这类的调侃,多是付之一笑。但谈及目前国内大学的计算机教育,尤其是国内大学扩招以后的状况,令人感慨万分。因为这类调侃竟然在很多学生心里得到了一定的认可。调侃之二:“国外计算机科学系是Computer Science, 国内计算机科学系是Counter Striker(反恐精英)”。这说明,国内计算机专业的学生大多都沉溺于网络游戏而放松了对本专业的学习。这些听后令人心酸的调侃,反映了国内大学计算机教育的现状,以及国内大学计算机教育的滞后性和缺乏创造性。 作为一名计算机专业的学生,中美两国的计算机教育在本科和研究生阶段究竟有何不同?哪种方式更适合中国学生?如何提高国内众多大学计算机系学生的专业水平?课程该如何设置?师资该如何配备?教授的能力该如何评估?这些问题实在是到了该探讨如何改革的时候了。 笔者研究生阶段的学习是在美国完成的。毕业于纽约市立大学 (City University of New York) 计算机科学系。回顾留美期间的读书,选择课程、挑选教授、课堂演讲、以及团队合作等种种难忘的经历。现将这些经历整理成文,以笔者个人的视角来观察分析美国大学计算机教育的特点。 大学本科大学本科阶段的教育是一切高等教育的基础。基础不坚实,何以建高楼?本科阶段学习的重要性是不言而喻的。任何计算机方面的学习都离不开硬件和软件两部分。美国大学在这方面为计算机本科学生都提供了什么样的设备呢?硬件篇 笔者从1996年下半年开始接触BBS。那是当时全国都大名鼎鼎的重庆海阔天空BBS站。第一封电子邮件,第一次下载软件,第一次实时聊天,都是在BBS网上完成的。之后,电信局终于开通了拨号上网。那是一个连拨号设置都非常复杂的时代,操作系统是Windows 95。昂贵的网费以及慢得如同老牛爬坡的速度,至今回忆起来仍沥沥在目。 在那个年代,最快的网络是T1,是世界上最快的网络。到底有多快,就只能从杂志书籍上了解一些。知道这个最霸道的T1网络位于北美,是互联网的骨干网。1997年,来到了美国。最初的震撼就是见识了美国大学的计算机房,全天开放供学生使用,居然还有空位子。任何一间计算机房都配备了至少一到两台黑白激光打印机。估计那是工作最为繁忙的计算机设备,每天不知道要消耗多少A4标准打印纸。打印机是免费提供给学生使用的。因打印数量庞大,为方便学生使用,于是整箱的打印纸就堆放在打印机下面的机柜里,学生可以随时自行添加。最大的震撼是,全校的任何一台计算机都与互联网相联,速度很快。记得在国内的时候,如果要在网上显示一幅图片,等上几分钟是很正常的事情。可当时的情况几乎是即点即现。这可是在1997年啊!惊喜之下,询问机房管理员,答曰:”本校的局域网隶属于北美大学骨干网,自身就是这个信息高速公路的一部分”。终于见识了T1网络的威力了。下载速度最快的时候可以达到5兆每秒,平时基本上是100-400K的下载速度。如果是大学的教职工或者全日制学生,学校将会分配每人一个以@大学名称.edu结尾的电子邮箱。其实这不仅培养了学生对母校的认同感和自豪感,同时也是展现一个学校在网络技术实力方面的一种手段。不难想象,要维护一个复杂而庞大,运行稳定可靠的电子邮件系统不是件容易的事情。即使学生毕业离校多年,学校也不会注销学生的账号。学生仍然可以经常使用这个账号登录到母校的主机,查询自己感兴趣的信息。对于居住在校内的学生,大学还为每个宿舍提供了10/100兆免费的宽带接入,只要填张申请表即可办理。对于不住校的学生,学校另外提供电话号码,键入这个号码就可以登录互联网了。有些类似国内目前的16300方式,只不过需要提供正确的用户名和密码。以上服务是每个已经正式注册的学生都可以享用的。计算机以及电子工程专业的学生还有额外的一些服务,诸如: 5兆个人主页空间。支持CGI,PERL(之后考虑到网络安全,停止了对CGI的支持);Oracle数据库的使用权限。可以使用学校主机上的Oracle, 便于课程的学习,例如,数据库程序设计以及数据库管理。基本上每台计算机都安装了一些开发工具。例如,微软的Visual Studio系列,如,VB,VC,另外还有TC,JAVA等等。如果是商业或者是有版权的开发工具,大部分安装的是免费版,个人版,学习版,或者是共享版。在公共计算机房的计算机上,几乎看不到国内大学计算机房里面令人眼花缭乱的专业版,企业版。从这个角度来说,国内大学生所使用的开发工具要比美国大学提供的好。总的来讲,大多数的美国大学在计算机方面的配置是差不多的。但是,如果是名校,不论是公立的还是私立的,计算机的配置要比普通大学好得多。例如,纽约市立大学(CUNY)就是其中之一。得益于纽约市政府的大力支持。学校在教学质量,规模,硬件配备等方面在全美几个巨无霸型的公立大学中占据重要位置。其它两个巨无霸型的公立大学是纽约州大和加州州大。看来教育不下大本钱还是不行的。由于政府的支持,这些大学普遍收取较低的学费 (本州学生最低,外州学生其次,外国留学生最昂贵),因此吸引了大量本国学生及外国留学生报考,竞争非常激烈。批准入学后,更不同于国内大学的严进宽出,而是要认真对待所有的课程,否则无法保证顺利毕业。 软件篇前面谈了美国大学的基本硬件配备情况。接下来,谈谈软件方面。下面分别从课程设置,教学方式及教材的选用、成绩评估、和毕业要求等几方面加以阐述。课程设置目前国内高校的教学内容都是由国家教学大纲来制定,应该说还是带有很强的计划经济的色彩。笔者认为大学或学院要创办出自己的特色,就应当由学校制定自己的教学大纲,由教授制定授课的内容。教学大纲定死了,就不容易创办出自己的特色来。在课程设置上,必须紧密结合市场的经济需求,克服脱离实际的现象,同时还要避免因迎合市场而盲目追求最新的理论。从另一方面来说,国内的大学希望紧跟国际计算机科学发展的最新理念和技术,并将最新的信息传授给学生。但就目前来看,国内大学还是有力不从心之感。因为任何新的理论技术,要想掌握得比较好,没有一定的技术储备是很难办到的。一方面教授的素质和能力要跟上,另一方面,学生要有强烈的学习欲望和钻研精神才行。两者缺一不可。这里以纽约市立大学(CUNY)计算机科学系本科与Bridgeport大学计算机科学系本科学生2004年度课程设置为例。(课程名称笔者就不翻译了,相信国内大学生应该是相当熟悉的)。纽约市立大学(CUNY)计算机科学系本科课程设置,见表一表一 美国纽约市立大学(CUNY)计算机科学系本科课程设置表课程代码 课程名称 学分时 CSCI 012 Understanding and Using Personal Computers 3 CSCI 018 Computers with Business Applications 3 CSCI 080 Problem Solving with Computers 3 CSCI 081 HTML and WWW Programming 3 CSCI 082 Multimedia Fundamentals and Applications 3 CSCI 084 Models of Computation 3 CSCI 085 Database Application Programming 3 CSCI 086 Science Computing Tools and Instrumentation 3 CSCI 090 Topics in Computing 1-3 CSCI 111 Algorithmic Problem Solving I 3 CSCI 211 Algorithmic Problem Solving II 4 CSCI 220 Discrete Structures 3 CSCI 240 Computer Organization and Assembly Language 3 CSCI 280 Self-Study Programming 1 CSCI 307 Compilers 3 CSCI 310 WWW Programming 1 CSCI 313 Data Structures 4 CSCI 316 Principles of Programming Languages 3 CSCI 315 Artificial Intelligence 3 CSCI 320 Theory of Computation 3 CSCI 323 Design and Analysis of Algorithms 3 CSCI 331 Database Systems 3 CSCI 332 Object-Oriented Databases 3 CSCI 335 Information Organization & Retrieval 3 CSCI 340 Operating Systems Principles 3 CSCI 341 Computer Organization 3 CSCI 342 Operating System Programming 3 CSCI 343 Computer Architecture 3 CSCI 344 Distributed Systems 3 CSCI 345 Logic Design Lab 3 CSCI 348 Data Communications 3 CSCI 361 Numerical Methods 3 CSCI 368 Computer Graphics 3 CSCI 370 Software Engineering 3 CSCI 381 Special Topics in Computer Science 1-4 CSCI 391 Honors Problems in Computer Science 1-3 CSCI 393 Honors Thesis 3 CSCI 395 Research Projects 1-3 CSCI 398 Internship 1-3 CSCI 399 Honors Readings in Computer Science 3 总计40门课程,不包含毕业论文。(注:附录一列出了上述课程内容的简要说明)。美国大学的课程可以从其课程的编码就能了解到这门课的适用范围。所有课程都以某个系或某个专业为单位由浅入深地从100-999编号。100-499为本科生课程,500-699为高年级本科生选修课和低年级研究生课程。编号为700-799隶属于研究生的学习范围。800及其以后的课程则属于博士生及其以上学生的学习范围。而某些大学规定计算机专业的研究生,在攻读700以上的研究生课程前,必须先完成特定的一些500-699之间的课程。下面看看Bridgeport大学计算机科学系本科课程设置,见表二表二 美国Bridgeport大学计算机科学系本科课程设置以及学校建议各门课程学习计划表课程代码 课程名称 学分时 第1学期(FIRST SEMESTER) Eng C101 Composition & Rhetoric 3 Math 110 Calculus I 4 CS 101/101a Introduction to Computing I / Lab. 4 Hum C201 Humanities 3 Phys 111 Principles of Physics I 4 第2学期(SECOND SEMESTER) Math 112 Calculus II 4 Phys 112 Principles of Physics II 4 CS 102/102a Intro. to Computing II / Lab. (Data Structures & Algorithms) 4 IntSt C101 Computer Ethics 3 Hum Humanities Core 3 第3学期(THIRD SEMESTER) CS 227 Discrete Structures 3 Math 215 Calculus III 4 CS 201 Advanced Data & File Structures 3 SoSc C201 Social Sciences 3 第4学期(FOURTH SEMESTER) Math 214 or 314 or 340 Linear Algebra or Numerical Methods or Queuing Theory 3 CS 203 Second Programming Language 3 SoSc Social Sciences Core 3 Engl 204 Technical Writing for CS 1 FA C101 Fine Arts 3 CpE 210 Digital System Design I 3 第5学期(FIFTH SEMESTER) CS 300 Economics & Management of Computer Projects 3 Math 323 Probability and Statistics 3 CS 301 Programming Languages 3 CS 329 Fundamentals of Algorithms 3 CpE 286 Microprocessor System Design 3 CS 300 Economics & Management of Computer Projects 3 第6学期(SIXTH SEMESTER) CpE 408 Operating Systems 3 Humanities Elective I 3 CS Elective I 3 CS 311 Computer Architecture 3 Tech Elective 1 第7学期(SEVENTH SEMESTER) CS 450 Database Design 3 CpE 489 Software Engineering 3 CpE 471 Data and Computer Communications 3 CS Elective II 3 Technical Elective II 3 CS 449a Senior Design Project 1 第8学期(EIGHTH SEMESTER) Caps C390 Capstone Seminar 3 Free Elective 3 CS Elective III 3 Humanities Elective II 4 CS 449b Senior Design Project 3 总计学分时 130 总计42门课,含毕业论文(Capstone)。现在让我们对比研究这两所大学课程设置的特点:纽约市立大学(CUNY)计算机科学系本科课程的设置很专业。全部都是与计算机直接相联系的科目。例如,数学和大量程序设计的课程,基本上不包含其它学科的课程。Bridgeport大学却与之相反。含盖了数学、物理、化学、工程、电子工程、计算机科学、计算机工程、社会科学、人文科学、英语、艺术等各个专业的课程。课程内容为Elective表示该门课程为选修课,Free Elective表示该门课程不受任何限制,可任意选择。两所大学除数学类的课程以及核心的计算机课程相同外,例如,数据结构,算法等,其它的课程设置可以说是差别很大。这充分体现了美国大学教育体制的一个特点,即自主性,多样性和灵活性。同样的专业,却因为不同的教育传统和思路,则在课程设置上各有特点。CUNY是在美国享有很高声誉的公立大学。在课程设置上尽其所能地满足纽约的需求,纽约对计算机人才的要求是非常专业的。所以如此的课程设置也就不足为奇了。 Bridgeport大学是所私立大学。在师资和生源上都远不及CNUY。虽然Bridgeport离纽约市很近,但却隶属于美国新英格兰地区的康奈提克州。该校比较注重本科生的综合能力,所以在课程上设置了一些看似与计算机毫不相关的课程。美国的高中毕业生在选择大学的时候,就可以在网上查询到不同大学的课程设置。因而可以非常容易地挑选到最适合自己的大学。如果对计算机的课程感兴趣,而对其它的,褚如:人文,社会和艺术类的课程没有兴趣,那么CUNY就是很好的选择。如果兴趣比较广泛,不仅仅是局限于计算机类,那么Bridgeport大学就是很好的选择。教学方式及教材的选用美国大学在新学期开始前,各系都会在其主页上刊登出详尽的列表。例如:本学期开始及结束的日期,本学期开设的课程,授课教授的信息,授课教授的接待时间,授课教室,期中期末考试的日期及考试地点等等,都可以轻松查阅。一旦注册某门课程的学生比较多,将同时会有几个教授讲授同一门课。学生可以选择上哪一个教授的课。如果该教授招收的学生已经满员,则只能选择到其他教授门下。不同的教授,授课风格也迥然不同,有严厉死板型的,也好好先生型的。总之,如果以前没有听过该教授的课,可以询问其他学生对该教授的评价就可以了。但并不是说,某个教授招收的学生少,就说明该教授的水平差。美国私立大学学费之昂贵,想必大家也有所耳闻。以Bridgeport大学为例,本科学生的学费是475美元(研究生550美元)每一学分时。每门课程通常是3或4个学分时,算下来,一门课程折合人民币12000—16000元的学费。而前面提到的公立大学,例如:市立纽约大学和私立大学相比,学费明显偏低。市立纽约大学本科学生的学费是360美元(研究生425美元)每一学分时。而且在美国大学没有补考的概念。如果某门课程,教授判定Failed -- 不及格,不仅成绩单上该门课程的成绩栏里会有一个难看的F,而且唯一的补救方法就是下学期重读这门课。当然,学费也要再缴一遍。即便重读过关,那个难看的F成绩同样会保留在学生成绩单上,那是永远也抹不到的记录。正是这种学分的管理制度,也起到了督促学生努力学习,完成学业的作用。尽管学费昂贵,美国大学在学费管理上也有很人性化的一面。允许学生在一定的期限内注销(withdraw)所注册的课程。一般在该门课程开课的一个月之内。在此期限内,还有更详细的划分。比如,在开课一个星期之内注销课程,学校会退还此课程的全部学费给学生本人,而且在成绩单上不作任何记录。如果在两个星期后,最后期限之前做出注销决定,则退还此课程学费的50%给学生本人,或将这笔款转入学生名下,学生只能将这笔款用于支付学费。这个体制在美国大学中很普通,只是不同学校的具体政策不尽相同罢了。一般来说,当学生确定了选修的课程及缴付所有的费用后,就会立即在大学的注册办公室(Register Office) 得到一张Timetable。上面明确列出了本学期课程的详细信息。例如:授课时间,授课教室等等。每门课程的第一节,教授会发给每个学生一份课程提纲 (Syllabus/Guideline),上面列出了该门课程所要求的教材及其它参考书目,必须完成的课后作业,多少次测验(Quiz)及课堂演讲(Presentation),有没有团队(Group)作业,期中和期末考试的安排,出勤率的考核,以及上述这些考核项目各占总成绩的比例,通过这门课程的最低标准等信息。通常,出勤率占总成绩的5%-10%,期中考试占总成绩的20%—25%,期末考试占30%-35%,其余部分就由平时作业(独立作业和团队作业),测验以及课堂演讲组成。美国大学的评分标准跟国内不一样。不采用100分制,而是采用A、B、C、D、F的等级制度。F就是前面提到过的Failed -- 不及格,A+,大致相当于国内的97-100分,A,93-96分。A-,90-92分。B、C、D的评分标准与此相似。有些教授不指定教材,而是采用自己的讲义。有些教授虽然指定了教材,却很少使用。笔者在读《计算机分布计算与并行计算》课程时,Syllabus上注明:教材一本,辅助教材三本。正在思考如何去读这些书的时候,教授轻轻说了句,“我相信你们的能力。教材嘛,自己看就可以了,我将着重讲解书上的重点和难点,以及最新的发展趋势”。碰到这类教授,是一大幸事,因为可以学到很多这方面的知识。但要获得理想的成绩确实不易。某些计算机课程,例如,《数据结构》、《高级数据结构》、《算法》、《高级算法》及《软件工程》等涉及到程序设计方面的课程,采用哪种计算机语言进行讲解,并没有明确的规定。基本上是由授课教授指定。目前上述核心课程采用的计算机语言最广泛的是Java其次是C++,也有一些大学采用C#。这里简单说说教材的问题。因计算机语言频繁升级的缘故,美国大学计算机的教材更新速度很快,可能每年都会有新的版本出版。最典型的例子就是Java。教材的选定由授课教授决定,故此不同的教授即使教同一门课,教材也很难有统一的标准。但很多教授对以下两部教材的选择却是相当的认可。笔者也认同不论是初学者还是高手,仔细阅读这两部书,应该会有些斩获。这两部书都是由Deitel & Associates公司出版,分别是: 1. Java How to program 2. C++ How to program 在教学方面,大部分教授都不建议学生使用可视化的开发工具。认为在学习基础理论的时候,不应过分借助于这些可视化的开发工具。不过,学生如果坚持使用,教授也不反对。但是当教授拿着源程序提问时,学生要清晰理解源代码的设计思路,实现方式以及程序流程。否则即便源代码没有任何问题,成绩却会令人很失望。关于团队作业(通常3人一组),一般在商定后,每个人各自负责相应的部分,并规定好完成各自部分的最后期限。在团队作业的进行中,每个成员都会尽力完成自己的任务,都不希望因为自己的工作而影响团队的最终成绩。但毕竟水平有差异,有时候不一定能顺利完成。在这个时候,所有的成员就会聚集在一起讨论解决的方案。此类的团队作业,一般都要求在课堂上做演讲。每个人负责讲述自己所完成的那一部分。在演讲期间,教授及其他学生可以随时打断话题,提出他们的问题或观点。只要是与演讲内容有关联的问题,都可以发问。所以,课堂演讲实际上是较难的学习内容。需要作出充分的准备。结构清晰,言简意明,口语流畅,制作精美(一般采用MS的PowerPoint制作,也有学生采用Flash制作)的演讲通常是可以获得高分的。在国内大学,类似这样的作业是比较少见的。其实国内大学在这方面应当大力加强,因为这不但可以锻炼学生的表达与组织能力,同时也是培养学生分工协作,增强团队精神的有效方法。 成绩评估对于课后作业,教授通常规定了明确的最后期限 (Deadline/Due day),一旦超过这个期限,那么该次作业的成绩无效。一般同时以两种形式上交作业: 1. 标准的A4打印件 2.电子邮件 教授会很快给予评定。并占用一定的时间来讲评作业。如果发现学生存在普通的问题,教授会再次讲解。作业的成绩不会当众公布。例如,分发试卷的时候,是由教授点名。被点名的学生走上讲台,由教授亲自分发试卷,标有分数的那一面试卷是朝下的。当然,教授也会向学生讲评考试结果。比如,分数的分布情况、最高分和最低分等等。还有常见的方法是,将学生的分数打印或者在网上发布出来。但是不列出学生的姓名,取而代之的是学生的ID。学生每门功课的最终成绩,是依据一学期的总体表现,由授课教授评定。一旦学生认为教授评定的分数过低,可以同教授商谈。但在没有误判的情况下话,是很难更改分数的。如果商谈后对教授的最终评定结果仍不满意,可以继续向系主任投诉。不过,大部分是维持原判,因为系主任也没有更改学生最终成绩的权力。 毕业要求前面我们从表一及表二得知,要获得纽约市立大学计算机科学系学士学位,就必须得完成120个学分时,而要获得Bridgeport大学计算机科学系学士学位,则必须完成130个学分时。本科学生获得学位的要求不是很高,每科成绩不低于D即可。但如果希望本科毕业后继续进入研究生院学习,那么平均成绩不得低于C是最低要求。如果希望申请著名大学的研究生院,则平均成绩不应低于B+。当然,除了学习成绩外,学生的其它素质也是录取与否的因素,例如,是否具备独立思考,善于发现问题的能力?是否具有该学科的专业研究能力?等诸如此类的个人因素在录取中也占一定的比重。其它众所周知,美国计算机的硬件软件水平执全球之牛耳。计算机最重要的三大部分,微处理器、操作系统和数据库几乎被美国产品所垄断。美国大学生在计算机的应用水平上也普遍高一些。国内大学生绝大部分熟悉的OS就是微软的系列产品。而美国大学生是普遍使用两种操作系统,Windows + Unix/Linux。以笔者为例,以前只熟悉Windows,会用Novell。但在美国留学期间,意识到必须学习UNIX的操作,原因是: 1.学校服务器是SUN OS 5.0,可以利用服务器强大的计算能力; 2.服务器上安装了C、C++、Java、Perl、Python等编译环境; 3.服务器运行非常稳定,可以被当作一个稳定的网络硬盘使用; 4.因为是计算机专业的学生,开放了个人网页,可以实战HTML编程; 5.除Oracle外,还可以学习MySQL、PostgreSQL等数据库; 6. UNIX的安全性是不用质疑的。源代码存放在上面,非常安全; 7.避免有时把源代码或作业忘记在家里,通常可以复制一个备份存放在服务器上; 8.服务器上可以快速的传输文件。 美国大学的主机基本上都是UNIX系统。要使用学校的资源就必须学会使用UNIX。在这种情况下,笔者先从Windows 最基本的telnet 登录开始学习,由于telnet是以明文的方式和服务器通讯,安全方面有很大的隐患,所以很快就放弃了telnet,改用ssh登录学校的UNIX主机。接着,学习如何使用PINE(UNIX上的邮件收发程序)、VI(文本编辑器)、如何管理文件及设置权限、如何编写脚本、如何运行脚本程序、如何在UNIX下实时交谈, 以及如何安装自己的应用程序。随着使用UNIX的日益频繁,笔者对UNIX的理解也越来越深,也越来越喜欢UNIX了。总之,正是由于学习UNIX的这个经历,令笔者在以后接触Linux的时候,很快就上手了,并且能够顺利系统的学习并掌握了DNS、WWW、SENDMAIL、POP3/IMAP、IPCHAINS、ROUTE、IPCHAINS、DHCP等服务器的安装和配置。 研究生目前国内大学计算机系的传统教学模式确实存在不少弊端。所幸的是已有越来越多的有识之士开始意识到这些问题,并积极探索改革的方向和出路。特别是针对计算机教育,国家已着手大力扶持,除强化计算机系的教学质量外,还批准开办了多所不同层次的示范性软件学院,一些高校也开始了改革教学的实际行动。在学位制度方面,国内高校基本上没有严格的淘汰制。特别是对于研究生,能考进去基本上就可以获得学位。而美国大学对学位的评定则是层层筛选,而且学位越高,淘汰的比例越大。这种对人才质量严格把关的机制,尤其值得我们仿效。研究生的适应能力以及创新能力在很大程度上取决于坚实的理论基础和专业基础知识,这是高质量研究生教育的重要特征之一。在当今科学技术突飞猛进,专业知识日新月异的时代,只有扎实掌握专业的理论基础和系统的专业知识,才有可能从事这个专业所进行的科研、教学和其他专业技术工作,才能打好进行创造性研究的基础。因此课程的学习就显得尤为重要。如果没有合理的、科学的课程设置,没有切实可行的教学计划,课程教学就没有可靠的科学依据。如果课程教学不是立足于本学科的前沿,不立足于提高研究生的学术水平和科研能力,那么课程的教学质量就得不到保证。由于课程学习是实现研究生的培养目标、保证研究生质量的重要环节。课程设置将直接影响到研究生知识面的宽度和研究能力的高低,因此,研究生课程的设置是否合理、科学是非常重要的。国内大学的研究生教育,专业课设置过于专业,例如,过去的物理化学专业是一个博士点,博士生上的课程全是物理化学。四大力学全是物理化学的内容;有机化学,学生修的全是有机化学,学术面过窄。而国外已经打破了二级学科的限制,甚至打破了一级学科。例如,国外化学系的博士生,有些课程是属于生物学,有生物仪器分析、生物物理学等课程。这样培养出来的学生适应能力和研究能力就相对较强。可以在学科的发展中间迅速调整自己的学科方向,跟上学科发展的潮流。我们过去培养的学生就非常专业,跳出自己的专业就一筹莫展。所以我们必须改变在很窄的专业学科范围内培养研究生的这种局面,要打破二级学科的限制,甚至要在一级学科上做些交叉。美国大学的研究生院、研究生教授协会和科系对研究生课程的设置极为重视。一般而言,本科生与研究生的根本区别在于研究生的“后劲”比本科生足。而后劲来源于宽厚、坚实的理论基础。基于这种认识,国外大学科系在硕士研究生新生入校后,要进行摸底考试。若考试成绩不理想,则建议新生补课,并且只能在课程编号为600-699的范围内确定相关的补课科目。倘若核心课程的成绩达不到“B”,则失去获得研究生学位的资格。目前在美国大学的研究生培养方案中,理工科研究生的数学和有关基础理论学科的总学时仍呈上升趋势。一些著名的学府,研究生新生在第一学年不学习本专业课程,而是学习数学、物理、化学或统计学等课程。在此基础之上,从事本专业课程的学习。这里再顺便谈谈美国大学的博士生制度。美国大学博士生的培养尤其重视课程学习。其课程设置的范围较广,一般要求修16-20门课程,30-40个学分(文科要求修满45个学分以上的课程,理工科侧重实验,一般要求修满30个学分以上的课程)。基础课程的学习时间为1-2年。课程设置通常分为5个专业领域,其中一个领域还要跨一级学科。要求写大量的书评和课程论文。学习期间有多次考试,最后还要通过所修课程的全面性考核。各大学对博士生考试成绩的要求不尽相同。有的大学要求在B级以上;有的大学规定要有2门课程的成绩为A级,否则取消获得博士学位资格。例如,柏克莱加州大学工学院,要求博士生主修领域的课程成绩必须达到3.5,辅修领域的课程成绩也必须达到3.0。 现在看看美国大学计算机系研究生的课程设置及毕业要求。仍以纽约市立大学(CUNY) 为例:被录取的研究生新生必须完成以下三门课程(不算学分)之后,才能真正开始攻读研究生的课程: 1.数据结构(603. Data Structures) ; 2.汇编语言与计算机结构(642. Assembly Language and Computer Organization); 3.信息技术概览(615. Survey of Information Technology); 在完成上述三门课的前提下,必须完成30个学分时,编号不低于700的课程,这些课程包括: 1.算法1 (700. Algorithms I); 2.分布计算(715 Distributed Computing); 3.可计算性与复杂性(722 Computability and Complexity),主要讲述计算模型,如图灵机,随机存取机器,时序电路等等; 4.计算机体系结构与网络(744. Computer Architecture and Networks); 5.软件类,必须完成以下课程中的一门:软件设计 (701. Software Design );编译器结构(707. Compiler Construction);计算机图形(718. Computer Graphics) 6.硬件类,必须完成以下课程中的一门:开关理论 (745. Switching Theory):这部分主要同电子电路有关;计算机系统(746. Computer Systems):主要是指并行计算机结构、RISC及CISC处理器,并行计算的程序设计等;计算机网络(748. Computer Networks) 7. 应用数学及算法类;算法2 (762 Algorithms II );系统模拟(764. Topics in Systems Simulation);计算机系统概率模型(766. Probabilistic Models in Computer Systems) 8.在获得21个学分时后,每个学生还必须满足或完成以下几个毕业条件(Capstone Requirement)中的一种;软件开发项目实习(731 Software Development Practicum);研究项目实习(732 Research Practicum);硕士论文(733 Master's Thesis) (注:附录二列出了上述课程内容的简要介绍)。前面提到美国大学研究生教育的一个明显特点就是多学科交叉。这里就以笔者研究生的课程为例,对此作进一步的阐述并以此结束本文。课程是关于手写数字字符的识别问题。这门课程应该属于电子工程、人工智能、智能识别、信号处理、自动化处理等学科的交叉学科。首先,这门课程没有教材。全部阅读材料由教授Dr.Ihsin Phillips提供。这些阅读材料大部分是发表在IEEE刊物上的论文。这些论文都是讲述如何进行手写数字字符的识别。每篇论文采用的识别算法都不一样,而且作者来自不同的国家。教学和考核的方法是,学生分成若干小组,每个小组负责自己的材料。小组成员将在课堂上讲述自己对数字识别算法的理解以及自己的观点。然后依据演讲的情况来评定成绩。但期末考试则不同,阅读资料在期末演讲前一个月分发下来,并且要求每个学生必须独立完成所有的工作,例如:阅读、理解、算法分析、算法扩展,幻灯片的制作、演讲内容的准备,以及对可能被提及的相关问题的准备等等。下面列出教授提供的部分学习资料。这些是来自不同国家不同大学的研究成果。有国内的清华大学,还有来自美国纽约州立大学布法罗分校、英国Essex大学,韩国以及巴西的一些大学。 1. 一种新的分割手写的非规范数字字符串的方法 (A New Method for Segmenting Unconstrained Handwritten Numeral String) 作者:Bin Zhao, Hui Su and Shaowei Xia Department of Automation Tsinghua University, Beijing, 100084, P.R. China 2.分割与识别完全非规范手写数字字符的系统(A System for Segmentation and Recognition of Totally Unconstrained Handwritten Numeral Strings)作者:Z. Shi: S. N. Srihari, Y-C. Shin and V. Ramanaprasad Center of Excellence for Document Analysis and Recognition State University of New York at Buffalo: Buffalo, NY 14260, U.S.A. 3.分割与识别手写数字字符的新的范例(New Paradigm for Segmentation and Recognition of Handwritten Numeral String)作者:Sungsoo Yoon, Gyeonghwan Kim, Yeongwoo Choi, Yillbyung Lee Dept. of Computer Science, Yonsei University, Seoul, Korea Dept of Electronic Engineering, Sogang University, Seoul, Korea Dept of Computer Science, Sookmyung Women’s University, Seoul Korea 4. 面向对象的表单描述语言与表单手写字符的处理方法(An object-oriented form description language and approach to handwritten form processing)作者:C. Cracknell, A.C.Downton, and L. Du Department of Electronic Systems Engineering University of Essex, Wivenhoe Park, Colchester CO4 3SQ, U.K. 5.分离手写数字字符图像的识别( Disconnected Handwritten Numeral Image Recognition) 作者:Luan Ling Lee and Natanael Rodrigues Gomes Decom-Feec-Unicamp Universidade Estadual de Campinas 此外还有其它一些相关的学习材料,但笔者印象最深的就是这五篇论文。从阅读资料的来源就可以看出教授Dr.Ihsin Phillips渊博的知识。通过这门课程的学习,可以扩展学生的思维,同时学生也更加深刻体会到交叉学科对本专业知识起到的一种补充和促进作用。总结笔者以自身的经历从个人的视角来观察分析美国大学计算机教育在本科和研究生阶段的一些特点。如何尽快提高我国大学计算机的教育水平,以及如何提高大学计算机系学生的专业水平,需要你、我,大家的共同努力。本文作者:钟京馗 美国纽约市立大学计算机科学系助教 要精通VC,恐怕不是一年二年的事,VC的学习应该是一个循序渐近的过程,它包含了C、C++、SDK、MFC等各种语言和OO思想的学习,因此,只有多看、多想、多练,才是学习VC的最好方法! [ 查看本指南所提及的书籍 ] 要学好VC,个人以为没有捷径,必须一步一步,从最基本的C++语言基础开始;如果有C的基础,也许会开始很迷糊,但更深入后就会对C++有更好的认识,如果没有C的基础,或许会开始明白,但最终比较难理解!因此,建议有一定的语言基础,会对学习VC产生较大帮助。这里建议清华大学谭浩强教授的《C语言程序设计》。 有了C语言基础,建议一定要学习C++语言,推荐国内版教材钱能的 C++程序设计教程 或者是国外引进的 C++大学教程(第二版) ,这两本书都可以为入门C++打下良好的基础! 如果要想深入学习C++,不妨看一下 C++程序设计语言(特别版) 和 C++ Primer 中文版(第三版) ,这是C++提高的最好的书籍! 有了C++基础后,就要开始学习windows sdk编程,最好的当然推荐北京大学出版的 Windows 程序设计(第5版)(上、下册) ,这对于深入学习VC将打下一个良好的基础。 有了windows程序设计的基础,就要开始学习VC的知识了,学习VC最好的教材当然是 Visual C++技术内幕(第四版) ,这本书是经典书,实例丰富,例子详细,是很好的学习材料。 为了更好地理解VC的编程实现思想,候捷的这本 深入浅出MFC(第二版) 不容错过!它将带你领略MFC的奥秘。当然,由华中理工大学出版社出版的 MFC深入浅出--从MFC设计到MFC 编程 也是一本非常不错的书籍,可以说是国内教材的典范,但是该书可能市面上已经绝版了!如果有机会在书店看到的话,一定要毫不犹豫地买下来,因为该书料足价低!非常值得收藏!如果以上书籍你都已经读过并且掌握的话,我相信你一定是一位资深的VC或windows程序设计工程师了! C++大师Stan Lippman:我对中国程序员的忠告 作者: 天极网 C++语言的创立者,斯坦.利普曼(Stan Lippman) 9月17日参加了在北京召开的 微软技术大会Tech.Ed2004并做了"The C++ Binding, Integrating a Static and dynamic "的主题演讲。利普曼和天极网记者畅谈了对“中国程序员的30岁现象”的看法,对C++、NET、面向对象等新技术发表了自己的看法。 天极网:做为C++大师,你认为一个优秀的程序员应该具备什么素质? Lippman:不仅是C++,对所有的语言而言,我认为一个好的程序员应该具备独立性,而且要不惧困难,你必须心甘情愿的面对失败。所谓的独立性就是因为有时你要能独处,你必须相信你能处理你明白的事情。我认为一个好的程序员要具备创造性,而管理人员要确保程序员有独立的空间,成为他们自己。 天极网:中国的程序员被一些人认为是吃青春饭的,程序员好像转向管理职位才有职业发展空间,你怎么看? Lippman:我所认识的一些Unix创立者被提升为部门主管,但他们拒绝了提升,回到了程序员的职位上,因为他们认为这是自己能做得最好的地方。总之,最后辞掉了部门主管的职位,回去做研究去了。 在美国,我们认为一个好的程序员并不意味着他能成为一个好的管理人员。如果仅仅是为了金钱的原因而强迫程序员们去从事管理工作,这与公司的最佳利益是相违背的。因此我们发明了一个所谓的"多层升迁路径",随着技术经验的增长, 微软分别为程序员设置了程序员、高级程序员以及MPS等等不同级别的技术职位。 微软能认识到你的能力,如果你愿意成为管理人员,当然是可以的,但你不必做你不开心的事情,只用尽量保持你编程的创造性。 在上世纪八十年代,美国的公司都被一个相同的问题所困扰,起因就是迫使年龄大的编程人员不再从事编程工作。我猜想在中国,随着程序员年龄的增长,这种问题也会发生! 天极网:你如何看待C++语言的未来和C++与C##的关系? Lippman:如果你想做web service,asp等等,c++将不会很适用,因为这个语言不灵活,它太繁复了,它不是为了网络服务(Web service)而设计的。 C##就是为了网络需求而设计的,.net的理念就是并不是一种语言能解决所有的问题。它不像Java,迫使你只能用一种语言。如果你在开发的时候发现另一个工具更好,那么你就可以选择另一个工具。 人们总喜欢让事物对立起来。如果有了 微软的产品,你就一定要有SUN或Linux,因为人们喜欢看他们争斗,即使实际上并不会引发任何争斗。c++就像一把没有把手的刮胡刀,它不可能对所有的事物都适用,就像Visual Basic也不可能对所有人都适用一样。有很多人都使用c++,也有很多人使用Visual Basic,我们还需要其他的语言。c++很难,我们必须拥有难的语言,但同时,简单的工作也需要简单的语言来解决。实际上,没有哪种语言能流行10年。对于c++的未来来说,我想它还是会表现的很好。 记得1991年Java出现的时候,人们预言c++将会消失,可这并没有发生,而是SmallTalk消失了。当Linux出现的时候,人们又说 微软有麻烦了,可实际上是Sun有了麻烦。C##并不会威胁到C++,在 微软我们在一栋大楼里工作。我相信C++现在表现得很好,在 微软起着重要的作用。我们为整个社区做出了很多贡献。 天极网:你怎么看待面向对象技术的发展前景? Lippman:从开始来看,每一种汇编语言的产生都是为了在计算机环境中解决特定问题的。你使用这个语言解决问题,而解决方案将使你面对更复杂的问题,而这个语言可能就解决不了了,这时我们就需要另一种语言了。 面向对象的编程就是解决数据抽象这类问题而产生的,而面向对象同样面临网络环境下的一些新问题,这就是为什么我们需要一个更具弹性的平台。.NET是一个动态,独立性的语言平台,这也是为什么我希望在.NET上使用C++。我认为.NET很有潜力、是软件进步的方向。 天极网:在.NET环境下,你认为程序设计有何变化? Lippman:我想每一个人都同意这一点,那就是软件是脆弱的。其实我们在软件上不算成功。开发软件所需要的时间太长了,并不是说我们的编程人员不合格,是因为这个工作不符合人类的自然本性,因为你必须像计算机那样进行线性的思索。 我们目前常用的方法就是将问题分割成更小的部分,然后保证它们连贯。.NET很有潜力,它是一个动态的模型,配套有很多的组件与很好的软件,能自适应的辨识状况、改变或生成代码。程序员是不会改变的,改变的只是工具,我们的职责就是要给程序员配备适用的工具。但目前我们做的还不够。C++、C sharp这些语言都只能算过渡性的语言。我们的程序员现在只能用它们,但并不代表将来应该用它们。 天极网:为了避免30岁时被炒掉,你对程序员有什么建议吗? Lippman:我想如果你不喜欢编程,那么编程的生活将是十分恐怖的!而且如果你仅仅是出于对金钱的考虑而选择程序员这一职业,而并不是真心喜爱这个工作,那么我奉劝你还是早点抽身的好。 但是,如果你喜欢创造,那么你可以考虑做一名程序员。今天的世界离不开电脑,几乎没有什么事情不是由电脑来运作的。而且你可以想想编程是一件多么奇妙的事情啊。我认为,电脑技术是人类历史上最具创造力的技术,你必须能感受到它的奇妙。很多人也认为电脑技术很奇妙,试图弄清楚究竟是怎么一回事,可是非常困难,因为他们的思维不具备逻辑性。 如果你不喜欢编程,那么不必强迫自己做一名程序员。当然我们需要好的管理人员,但是我觉得一名好的程序员比一名管理人员更有价值,因为我们有太多的优秀管理人才,但优秀的程序员却并不多。(完) 学习C++要注意的!(转贴) 1.把C++当成一门新的语言学习(和C没啥关系!真的。); 2.看《Thinking In C++》,不要看《C++变成死相》; 3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看; 4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境,而我们要学的是一门语言; 5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单,或者可以引伸出很多知识点; 6.会用Visual C++,并不说明你会C++; 7.学class并不难,template、STL、generic programming也不过如此——难的是长期坚持实践和不遗余力的博览群书; 8.如果不是天才的话,想学编程就不要想玩游戏——你以为你做到了,其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住:学C++是为了编游戏的; 9.看Visual C++的书,是学不了C++语言的; 10.浮躁的人容易说:XX语言不行了,应该学YY;——是你自己不行了吧!? 11.浮躁的人容易问:我到底该学什么;——别问,学就对了; 12.浮躁的人容易问:XX有钱途吗;——建议你去抢银行; 13.浮躁的人容易说:我要中文版!我英文不行!——不行?学呀! 14.浮躁的人容易问:XX和YY哪个好;——告诉你吧,都好——只要你学就行; 15.浮躁的人分两种:a)只观望而不学的人;b)只学而不坚持的人; 16.把时髦的技术挂在嘴边,还不如把过时的技术记在心里; 17.C++不仅仅是支持面向对象的程序设计语言; 18.学习编程最好的方法之一就是阅读源代码; 19.在任何时刻都不要认为自己手中的书已经足够了; 20.请阅读《The Standard C++ Bible》(中文版:标准C++宝典),掌握C++标准; 21.看得懂的书,请仔细看;看不懂的书,请硬着头皮看; 22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍; 23.请看《Effective C++》和《More Effective C++》以及《Exceptional C++》; 24.不要停留在集成开发环境的摇篮上,要学会控制集成开发环境,还要学会用命令行方式处理程序; 25.和别人一起讨论有意义的C++知识点,而不是争吵XX行不行或者YY与ZZ哪个好; 26.请看《程序设计实践》,并严格的按照其要求去做; 27.不要因为C和C++中有一些语法和关键字看上去相同,就认为它们的意义和作用完全一样; 28.C++绝不是所谓的C的“扩充”——如果C++一开始就起名叫Z语言,你一定不会把C和Z语言联系得那么紧密; 29.请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已; 30.读完了《Inside The C++ Object Model》以后再来认定自己是不是已经学会了C++; 31.学习编程的秘诀是:编程,编程,再编程; 32.请留意下列书籍:《C++面向对象高效编程(C++ Effective Object-Oriented Software Construction)》《面向对象软件构造(Object-Oriented Software Construction)》《设计模式(Design Patterns)》《The Art of Computer Programming》; 33.记住:面向对象技术不只是C++专有的; 34.请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码; 35.把在书中看到的有意义的例子扩充; 36.请重视C++中的异常处理技术,并将其切实的运用到自己的程序中; 37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去; 38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路; 39.C++语言和C++的集成开发环境要同时学习和掌握; 40.既然决定了学C++,就请坚持学下去,因为学习程序设计语言的目的是掌握程序设计技术,而程序设计技术是跨语言的; 41.就让C++语言的各种平台和开发环境去激烈的竞争吧,我们要以学习C++语言本身为主; 42.当你写C++程序写到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个设计的完整性,然后分析自己的错误并重新设计和编写(参见43); 43.别心急,设计C++的class确实不容易;自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的; 44.决不要因为程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的,而不是一次记住的; 45.每学到一个C++难点的时候,尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了; 46.记录下在和别人交流时发现的自己忽视或不理解的知识点; 47.请不断的对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XX; 48.保存好你写过的所有的程序——那是你最好的积累之一; 49.请不要做浮躁的人; 50.请热爱C++! 高手有两种. 一种是黑客型.他并不一定是黑客,但他的知识结构和学习方法与黑客相似.他可以不吃不睡地呆在机器上,他可能没什么系统的理论基础,也不需要.他有的是无边无岸的热情和迷恋.当专家说这个问题无法解决时,他的激情就来了.他开始不吃不睡,直到问题解决(其实还是解决不了的时候多).问他是怎么解决的,他自己也说不清楚.总之是解决了.他有的是KNOWHOW,对于KNOWWHY他没有兴趣.他喜欢C/C++甚至是ASM.他擅长对系统细节的研究.他能把一个很好的软件解密,但让他自己做一个这样的软件,他连想都不敢想.把他送到月球上待一年,回来后,他发现他根本不懂计算机了.因为他的方法他的知识都已经过时.于是他又开始不吃不睡,可是他感觉到有些力不从心,因为激情已经耗尽.80年代有个王晓君,此类高手的代表. 另一种是知识型. 他有雄厚的基础理论知识,并乐于继续积累.对那些时髦的东西,他并不表现出太大的兴趣,瞄上一眼就丢在一边.他没搞过数据库,可需要的时候,他迅速成为高手.因为他本来就对数据库有深刻的理解,当然是理论上而非实践上.要做驱动,他很快超过做了很多年的人.因为他准确理解计算机原理,电子技术也没有白学.有种说法认为程序员是吃青春饭的,对这种高手不适用. 什么样的人是低手,而且可能永远是低手??? 在上学的十几年时间里,他逐渐养成了为考试而学习的良好习惯.对于那些公式和符号的真实含义变得麻木不仁.他学过付里叶变换,可他不知道那是干什么用的.如果能够,他也决不会选小波分析.他学过电子技术,考完试后他觉得如释重负,毕竟考得不错,以后在也不用理这可恶的东东.他最愿意学的可能是VB.随便一组合就是一道程序,使他觉得成为高手原来这么容易. 工作后(具体的技术工作),他可能发现,成为真正高手的充要条件是深厚而宽广的理论基础.唯此才能对问题有深刻理解,才能设计出合理高效的解决方案.他想重学一遍高数,可还要泡妞.资源严重不足.于是他合理调配,走上层路线,越来越依赖VB,他可以成为专家,集成的专家.然后搞管理.然后在年轻人面前表现的莫测高深,同时对具体问题尽量回避.做高层的管理.做高手的管理当然是更高的高手. 学C++不得不看的一篇文章【简 介】  做为一名大四的学生,我面试过不少的单位,有成功的也有失败的,但是对我来说所有的失败在某种意义上都是一种成功,特别是我下面写的这些…… 做为一名大四的学生,我面试过不少的单位,有成功的也有失败的,但是对我来说所有的失败在某种意义上都是一种成功,特别是我下面写的这些,写这篇文章的时候,我已经签了南京的一家软件公司,但是想起今年2月21日我面试苏州台湾的IT公司的经历联想到我们现在   学习编程的一些情况我真的深有感触,这次面试使我深深的体会到了失败但也收获了很多。我要说的将分成三部分:   1.是我面试的具体经过   2.是由面试想到的   3.现今我应该做的。   当然这些话很大程度上是我个人的意见,不可能完全得到大家的赞同,所以在某些观点上如果哪位朋友觉得跟我的有很大出入,请不要介意,也不要对我攻击,就当我没有说过,欢迎和我联系共同探讨这些问题!我的EMAIL:wutao8@263.net   1.面试经过   大约在年前我接到了台湾瑞晟(Realtek)苏州公司的面试通知,通知我2月21日到苏州工业园区面试,接到面试后的几天我把一些专业课温习了一遍,特别是C++和数据结构,由于大学几年里,我一直专研这些方面,加上通过了高级程序员的考试,对于一些常用的算法我差不多也达到了烂熟于胸的地步,当时的感觉是如果问了我这些方面的问题我应该是没有问题的!   21日那天我被安排在4:30面试,由一位技术人员单独给我面试,在问了一些简单的问题之后他给我出了一道编程题目,题目是这样的:   (由于具体面试的题目比较烦琐,我将其核心思想提取出来分解成了两个独立的简单的问题,有可能问题分解的不当,请大家见谅,实际面试了一个的问题但比其复杂很多,而且涉及一些高等数学变换)   1) 写一个函数计算当参数为n(n很大)时的值 1-2+3-4+5-6+7......+n   哼,我的心里冷笑一声!没想到这么简单,我有点紧张的心情顿时放松起来!   于是很快我给出我的解法:   long fn(long n)   {   long temp=0;   int i,flag=1;   if(n<=0)   {   printf("error: n must > 0);   exit(1);   }   for(i=1;i<=n;i++)   {   temp=temp+flag*i;   flag=(-1)*flag;   }   return temp;   }   搞定!当我用期待的目光看着面试官的时候,他微笑着跟我说,执行结果肯定是没有问题!但当n很大的时候我这个程序执行效率很低,在嵌入式系统的开发中,程序的运行效率很重要,能让CPU少执行一条指令都是好的,他让我看看这个程序还有什么可以修改的地方,把程序优化一下!听了这些话,我的心情当时变的有点沉重,没想到他的要求很严格,之后我对程序进行了严格的分析,给出了改进了的方案!   long fn(long n)   {   long temp=0;   int j=1,i=1,flag=1;   if(n<=0)   {   printf("error: n must > 0);   exit(1);   }   while(j<=n)   {   temp=temp+i;   i=-i;   i>0?i++:i--;   j++;   }   return temp; } 虽然我不敢保证我这个算法是最优的,但是比起上一个程序,我将所有涉及到乘法指令的语句改为执行加法指令,既达到要题目的要求而且运算时间上缩短了很多!而代价仅仅是增加了一个整型变量!但是我现在的信心已经受了一点打击,我将信将疑的看者面试官,他还是微笑着跟我说:“不错,这个程序确实在效率上有的很大的提高!”我心里一阵暗喜!但他接着说这个程序仍然不能达到他的要求,要我给出更优的方案!天啊!还有优化!我当时真的有点崩溃了,想了一会后,我请求他给出他的方案!然后他很爽快的给出了他的程序!   long fn(long n)   {   if(n<=0)   {   printf("error: n must > 0);   exit(1);   }   if(0==n%2)   return (n/2)*(-1);   else   return (n/2)*(-1)+n;   }   搞笑,当时我目瞪口呆,没想到他是这个意思,这么简单的代码我真的不会写吗,但是我为什么没有往那方面上想呢!他说的没有错,在n很大很大的时候这三个程序运行时间的差别简直是天壤之别!当我刚想开口说点什么的时候,他却先开口了:“不要认为CPU运算速度快就把所有的问题都推给它去做,程序员应该将代码优化再优化,我们自己能做的决不要让CPU做,因为CPU是为用户服务的,不是为我们 程序员服务的!”多么精辟的语言,我已经不想再说什么了!接着是第二个问题: 2). 他要求我用一种技巧性的编程方法来用一个函数实现两个函数的功能n为如:fn1(n)=n/2!+n/3!+n/4!+n/5!+n/6! fn2(n)=n/5!+n/6!+n/7!+n/8!+n/9! 现在用一个函数fn(int n,int flag)实现,当flag为0时,实现fn1功能,如果flag为1时实现fn2功能!他的要求还是效率,效率,效率!说实在话,如果我心情好的话我应该能给出一种比较好的算法,但我那时真的没有什么心思再想了,我在纸上胡乱画了一些诸如6!=6*5!的公式后直截了当的跟他说要他给出他的答案!面试官也没有说什么,给出了他的思路: 定义一个二维数组 float t[2][5]存入{{2!,3!,4!,5!,6!},{5!,6!,7!,8!,9!}}然后给出一个循环:   for(i=0;i<6;i++)   {   temp=temp+n/t[flag];   }   最后得到计算值!呵呵,典型的空间换时间的算法!   这些总共花了50分钟的时间,还有十分钟我就跟他很随意的聊聊天,聊了一些编程以及生活的问题,那时的我已经很放松了,因为我知道这次面试结果只有一个:失败。5:30的时候面试官要我等通知,于是我离开了他们公司。这就是面试的整个经过! 2.由面试想到的 真的是很失败啊!我记得那天下好大的雨,气温也很低,我边走边想,从5:30一直走到7:30,全身都湿透了,又冷又饿,但是我只是一直走,脑子里面充满了疑惑,我也想让雨把自己淋醒!看到这里有些朋友可能觉得那些面试题目不算什么如果让自己做的话肯定能全部答对,我肯定相信你,因为我从未怀疑过中国程序员的能力,我认为中国有世界上最好的程序员,我也从未认为自己是高手,所以我做不出来不代表中国程序员比台湾或者别的地方的程序员差,所以我就从我的角度,我的所见所想来谈一些感想: 不错全世界都有优秀的程序员,中国也不例外,但是我疑惑的是:到底中国和台湾或者国外的优秀的程序员的比例到底是多少?台湾我不知道,中国100个程序员里有几个是优秀的呢?我根本算不上,从上面的表现就足以说明一切了!是1个?5个?10个?50个?这个数字我不敢乱猜,恐遭网友一顿痛骂,那么我们国内有多少人学习计算机呢?拿我们学校来说,计算机97级4个班,98级5个班,99级10个班,2000级17个班,人多了,老师怎么办?我们学校的做法是让研究生上课,然后呢?补考一抓一大把,大把大把的补考费落入了学校的口袋,还说现在的学生素质低!真是好笑,我都不知道学校这么做是为了什么,为国内培养大量的程序员吗?学生们能真正学到计算机知识吗?好了,我敢讲,在我们学校学习编程学生和优秀程序员(注意我指的是优秀,只会编几个糟烂程序的人算不上)的比例应该是100:0.1 在这种比例下虽然我们中国学习编程的人铺天盖地,但是想想有多少个人能真正为中国软件业发展作出贡献,有多少人能真正写出优秀的程序名扬海外! 我从学习编程以来,不管是自学还是老师指导,从来都是解决问题就好,编出程序来就行,我的疑惑是:我们有真正的强调过程序的效率,程序的质量吗?我们有仔细分析过我们写的东西,看看有没有可以改进的地方,看看有没有简单的方法来达到同样的目的呢?我问心自问,我发现,我从来没有对我写出来的程序进行过优化,最多就是进行详细的测试,然后Debug,但是这就足够了吗?这些天我偶尔发现我曾经写过的一个游戏,那是一年前我刚加入vcroad.net做为其中一员时候,感觉应该拿点东西出来,然后花了一个星期的时间写出来的!程序不算复杂,但是用到了不少数据结构的东西,也用到了一些精彩的算法,加上windows的界面和游戏的可玩性,写完后受到了不少好评,我当时真的很佩服自己!但是现在看呢:没有一句注释,好多丑陋的函数名比如:void chushihua(),好多没有必要的变量,可以用简单语句完成工作的我使用华丽的算法,大量使用全局变量.....,说不好听的话,六百多行的程序除了能运行之外就是一陀屎!如果一年前我能听到一些反面意见的话,大概我能早一点觉悟,但是自从原代码在网站发布以来听到的都是赞美之词,没有一个人向我提出程序改进的意见,这又说明了一个什么问题呢?很值得思考啊! 还有一个疑惑是:我们说的和做的真的一样吗?我在学校的时候曾经受学院指派承办过一个计算机大赛,请了一个老师出决赛的题目,主要是一些算法题目,这个老师可能是我上大学以来唯一敬佩的老师了,从程序调试到打分,对于每个程序都仔细分析其时间效率和空间效率,然后综合打分,四十个人的卷子,老师从下午三点一直调试到晚上十点,在有些写的精彩的语句后还加上批注。我真是高兴很遇到这样的老师并且和他做深入的交流,但在事后,却发生了一件不愉快的事,在比赛中获得第二名的学生找到我,说他程序全部调试成功应该给他满分,并且应该得第一,我说不过他,最后调出了他的原程序和第一名的原程序对比,不错,两个程序都运行的很好,这时,那个同学开口了:“我的程序写的十分简捷明了,仅仅数行就完成了题目要求,而他的却写了一大堆,为什么给他的分多过给我的分。”我当时很是气愤,如果不是老师负责的话,那么现在第一名和第二名的位置真的要互调了,拜托,不是程序的行数越少程序的质量就越高,我记得我跟他大谈这方面的道理,最后说服他了!哈哈,但是我,只能说说而已,我不知道还有多少人一样,说起来头头是道,但心里却压根就从未重视过它! 3.我打算做的! 其实那天我想到的远不止上面那么多,但是我不想再说了,因为我猜想看这篇文章的网友大概都有一肚子的感想,一肚子的抱怨,借用这篇文章发泄可不是我想达到的目的,在上面我把自己骂的一文不值也不是妄自菲薄,但是在某些方面我真的做错了,或者说是偏离了正确方向,现在是矫正方向和重整旗鼓的时候了,就象我前面说过的,我相信中国有世界上最好的程序员,我也相信我的水平不会一直保持现状,我现在就收拾起牢骚真正的实干起来! 真的很巧,就写到这里的时候我在网上偶尔发现了这篇手册,我不知道这预示着什么,但是我想如果我照下面这个基本原则一直踏实做下去,我一定会实现我的理想---一名优秀的软件设计师! (下面这些文字不是我的原创,是我偶尔在网上发现的,我真的很幸运能看到这些,这篇文章也随着下面的文字而结束,我真心的希望您能从这篇文章中得到启发,这篇文章欢迎大家随意转载,您可以不写作者是谁,但是请您写上vcroad.net原创,谢谢您的支持) 作者:金蝶中间件公司CTO袁红岗 不知不觉做软件已经做了十年,有成功的喜悦,也有失败的痛苦,但总不敢称自己是高手,因为和我心目中真正的高手们比起来,还差的太远。世界上并没有成为高手的捷径,但一些基本原则是可以遵循的。 1. 扎实的基础。数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握他们,很难写出高水平的程序。据我的观察,学计算机专业的人比学其他专业的人更能写出高质量的软件。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP,即使你再精通OOP,遇到一些基本算法的时候可能也会束手无策。 2. 丰富的想象力。不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想象力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等。另外,多看科幻电影也是一个很好的途径。 3. 最简单的是最好的。这也许是所有科学都遵循的一条准则,如此复杂的质能互换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式:E=mc2。简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。 4. 不钻牛角尖。当你遇到障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当我遇到难题的时候会去玩游戏,而且是那种极暴力的打斗类游戏,当负责游戏的那部分大脑细胞极度亢奋的时候,负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。 5. 对答案的渴求。人类自然科学的发展史就是一个渴求得到答案的过程,即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念,一定要找到问题的答案,你才会付出精力去探索,即使最后没有得到答案,在过程中你也会学到很多东西。 6. 多与别人交流。三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。多上上网,看看别人对同一问题的看法,会给你很大的启发。 7. 良好的编程风格。注意养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致。大家都知道如何排除代码中错误,却往往忽视了对注释的排错。注释是程序的一个重要组成部分,它可以使你的代码更容易理解,而如果代码已经清楚地表达了你的思想,就不必再加注释了,如果注释和代码不一致,那就更加糟糕。 8. 韧性和毅力。这也许是"高手"和一般程序员最大的区别。A good programming is 99 weat and 1 offee。高手们并不是天才,他们是在无数个日日夜夜中磨练出来的。成功能给我们带来无比的喜悦,但过程却是无比的枯燥乏味。你不妨做个测试,找个10000以内的素数表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这一条。 这些是我这几年程序员生涯的一点体会,希望能够给大家有所帮助。 中国第一程序员--求伯君 程序员的生活,是比较寂寞、封闭和枯燥的。大浪淘沙,在这个软件工业飞速发展的时代里,出现了许多高手,但是,他们中的绝大多数人并不为人所知。像吴晓军、鲍岳桥、周志农、刘旭、朱崇君、求伯君、王江民、王志东、梁肇新等等为大众所熟悉的高手,这么多来来也就这么一二十来位。他们个人奋斗的酸甜苦辣同中国软件地的发展起落同步。国内接触过计算机的人都使用过或仍然使用着他们用智慧和心血凝结而成的程序。也许他们中的有些人会随着时间的流逝而失去昔日的光彩,有些会在新一轮的角逐中再次成为赢家,但他们身上的那种凝聚了浓厚个人色彩的软件人精神,将伴随着中国软件业的发展大放异彩。这可能是中国软件的一笔特殊财富。或许我们透过他们曾走过的足迹,能够看到中国软件业的昨天、今天与明天…… “如果从开始就想着怎样赚钱,我也不会有今天。事业和金钱无关。当你全身心投入开发的时候,不给你钱你也要干。开发时,根本没有心思考虑报酬。只有先成就了业,才有资格谈报酬。”                     ——求伯君 求伯君,1964年11月26日出生 于浙江新昌县。 1984年,毕业于中国人民解放军国防科技大学,后分配到河北省徐水县石油部物探局的一个仪器厂; 1986年,从仪器厂辞职,加盟北京四通公司, 1987年, 调入深圳四通公司; 1988年,加入香港金山公司在深圳从事软件开发; 1989年转到珠海,开发成功国内第一套文字处理软件WPS; 1994年,在珠海独立成立珠海金山电脑公司,自任董事长兼总经理。 1995年,1996年卖掉别墅,率金山人员走出最困难的时期; 1997年,WPS97诞生,成为中国对抗word的第一个中文软软。 1999年,WPS2000面世,欲借此腾飞,走向国际化。滚滚长江东逝水,浪花淘尽英雄。在CCDOS严援朝、五笔字型王永民、2.13吴晓军、CCED朱崇君相继从前台渐渐隐去的日子里,求伯君却似一棵长青树,不断地为我们演绎出为人传诵的故事与传奇──1994年盘古组件失败,1995年中国第一个游戏软件《中关村启示录》诞生,1996年为继续开发WPS 97卖掉别墅,1997年重铸WPS辉煌。 求伯君十年不倒,原因在于他一直在走着一条和一般程序员不同的路。大多数优秀程序员大都选择了自己创业或者合伙创业的道路,而求伯君则一出道就碾转于四通、金山、方正这样的大公司,在这些公司的经历使求伯君具备了大公司的眼界和胸怀。这是求伯君高于同时代程序员的本质原因。 11年前,促使求伯君走出河北徐水县城的是深圳大学来他们单位实习的一位女学生。和这位女学生谈上恋爱的求伯君,在1986年10月去了一趟深圳。求伯君把此次深圳之行称为此生逢上的第二次不可错过的机遇。“我突然发现深圳的世界真漂亮,什么都新鲜。 在深圳,我第一次听到‘时间就是金钱,效率就是生命’,我喜欢这种快节奏。”百废待兴、热火朝天的深圳对22岁的求伯君来说,是那么的有号召力。这种号召力促使求伯君决定立从原单位辞职。“单位不让辞职,我也管不上许多了。为了尽快出去,户口、档案全抛在了脑后,不要这些了又怎么样!管他三七二十一,先出去再说。” 去深圳沿途,求伯君在河北涿县和北京的逗留延迟了他去深圳的步伐。在涿县帮助同乡解决计算机打印问题的过程中,求伯君萌生了把原来只有自己能用的24点阵打印驱动程序,改进成了一个通用的、支持多种打印机的西山文字打印驱动程序。在同乡的机房里,求伯君用9个晚上,沿着原来的思路,全部重写了原来的打印驱动程序。 9天后,怀揣8张西山打印驱动程序软盘的求伯君赶到了北京,打算从那里赶往深圳。求伯君在临行之前,在同学的怂恿下,先去四通把自己的打印驱动程序给他们看了看。四通当时正好在推OKI8320打印机,正缺少一个好的驱动程序。这样西山打印驱动程序就以2000元、分10个月付清的价格卖给了四通,而“四通500百元一套,卖了好几百套。”感觉到求伯君是个人才,四通开始挽留求伯君,“来我们这里干吧,明年成立深圳四通,一定调你过去。”就这样求伯君留在了四通,他是四通招收的第一个在北京没有住房的外地员工,四通为他在颐宾楼租了一个床位。 在四通,求伯君结识了他成长过程中对他影响最大的人--香港金山老板张旋龙。当时张旋龙正在和四通合作推SUPER机,一批机器的BIOS有问题,启动不起来,求伯君花了一个晚上就把它改好了。“这个问题香港都解决不了。从此,张旋龙开始挖我。” 深圳四通成立,北京四通不同意放求伯君,而求伯君建议在PC上做和MS2401类似的文字处理软件的计划又被否决了。于是,求伯君就给当时的四通总裁万润南写了一封辞职信,万润南很快批示:“ 公司初创,人才难得,建议沈国钧与王玉钤协商调深圳。” 求伯君终于来到了向往已久的深圳了,刚到深圳时,四通让他负责公司的一个经营部。与他对口做生意的,恰巧是张旋龙的弟弟张小龙。即使同好朋友做生意,求伯君也赚不了钱。若干年后,求伯君和张小龙闲聊中提到那段商人生涯,张小龙透露那些生意他赚了多少多少。求伯君大笑,“难怪我赚不到钱,钱都被你赚去了。” 让求伯君经商,犹如缘木求鱼,而给他一个环境,让他潜心开发软件,则是如鱼得水。正在这时 ,香港金山公司答应提供条件让他专心致志地开发WPS。“不用优薪高职,这已足够了。” 求伯君决定大干了。他目标很明确,做一张汉卡装字库,写一个字处理系统,能够取代WordStar,这个目标就是后来的WPS。为了实现这个目标,从1988年5月到1989年9月,求伯君把自己关在张旋龙为他在深圳包的一个房间里,只要是醒着,就不停地写。什么时候困了,就睡一会儿,饿了就吃方便面。在这样的一年零四个月中,求伯君生了三次病,第一次肝炎,第二次肝炎复发,第三次又复发,每次住院一个月到两个月。第二次肝炎复发正是软件开发最紧要的关头,求伯君把电脑搬到病房里继续写。 开发之苦不是病魔缠身,不是身心憔悴,而是孤独。“有了难题,不知道问谁,解决了难题,也没人分享喜悦。”求伯君在这孤独中,写下了十几万行的WPS,在写完最后一行程序的时候,求伯君没有任何感觉,“任何一个产品,做成功以后,不会有什么感想,所谓感想都是后来总结出来的。” 作为作者的求伯君麻木了,而还在上大学的雷军一看到WPS就感到震惊,“我不相信中国还会有这么好的软件,当时觉得这个软件一定是在香港做的。”WPS没有做广告,也没有去评什么奖,仅仅凭着口碑,就火了起来。求伯君对原因的解释很朴素--“市场上奇缺这种东西。后来的王码480、 巨人6402都是WPS的模仿之作。”雷军的解释是,“WPS定位很准,就是字处理,不是排版。那时候 ,搞一个排版太复杂了,用户根本接受不了。 WPS开始挣钱了,每年3万多套,每套批发价2200多元。“但这是公司赚钱,对我来说,没赚什么钱,我只是一个打工的。开发之初,既没和公司谈提成,也没和公司谈股份,什么都没有。是老板好,给了我一点奖金。” “如果从开始就想着怎样赚钱,我也不会有今天。事业和金钱无关。当你全身心投入开发的时候,不给你钱你也要干。开发时,根本没有心思考虑报酬。只有先成就了事业,才有资格谈报酬。” 路高唱凯歌的WPS,在1993年,遇到了Word的挑战。求伯君主动迎接挑战,做了一个类似于Office套件的产品,叫作盘古组件,里面有WPS、电子表和字典。 求伯君今天把盘古组件失利的原因归纳为四点:一、盘古力量分散,没有发挥WPS当时在字处理领域的领先优势;二、没有沿用WPS这个很有号召力的名称;三、盘古自身不够完善,没有做到“所见即所得”,完全是DOS版的照搬;四、刚刚独立的珠海金山公司没有销售经验。“我们本来只是一个开发部,盘古出来,销售、宣传、策划,什么都要自己做,一时应付不过来。” 盘古是香港金山被方正合并后,求伯君脱离方正,自己独立自主做的第一个软件。很不幸,它赔掉了张旋龙给求伯君的“奖金”。 是否还要做下去?“不做又做什么去呢?WPS里面有我的感情。感情用事,当然不理智,但很多决策,在理智状态下,就做不出来了。很理智的人不会创造什么奇迹。” 盘古失败的时候,有人劝求伯君利用已有的名气,搞系统集成,做一些项目。“你名气大,拉项目相对容易。”但求伯君坚持WPS不能放弃。 1995年,微软挖廖恒毅之前,先向求伯君抛出了绣球。求伯君拒绝的原因是:“第一、微软的态度比较傲气,给我的感觉是,要仰起头才能看到他们,他们语重心长地对我说,‘好好干,到我们这里有前途。’使我难以接受;第二、好多朋友劝我,你这杆大旗可不能倒。” 支撑求伯君做下去的原因是,他坚信“Word能够做到的事情, 我也能做到。”让求伯君没想到的是, WPS97的开发时间会拖这么长,“Windows有很多新东西,我们还没有熟悉过来, 微软又升级了。很多技术资料, 也很难找到。微软掌握着Windows,而我们什么都要靠自己从头做起,? 这导致了WPS97难产。如果WPS97能在1995年推出,直接和Word6.0竞争,Word6.0肯定没戏。”时间拖久了,资金和信心都会成问题。“做到1996年下半年,是最困难的时候,资金开始紧张,信心也不足了,前途感觉到比较渺茫。 当时,我们猛宣传游戏软件,试探另外的市场,但我们估计到了游戏赚不了什么钱。现在,我仍然觉得做游戏不赚钱。国外游戏赚钱,因为它的主要市场在国外,在国内没有什么投入, 所以可以赚钱。我们还试探了别的市场,也没有成功,只是没有说而已。”1996年,苦闷的求伯君没有像1989年在深圳旅馆里那样孤独,他找到了一个发泄情感的地方--BBS,他一天给站友写300多封信。“互相之间打很重要,我为手下打气,也为自己打气。” “我们一直没有大的收入,游戏是杯水车薪。那时候,用WPS这个项目去吸引资金,谁都不会有信心。”此时此刻,求伯君对WPS的一往情深起了关键作用, 正是在这种感情的驱使下,求伯君觉得自己再住别墅是一种浪费,200万元把别墅卖了, 使WPS97开发维持了下去。正是这种感情驱使求伯君带领开发组四年如一日,每天工作12个小时,每年工作365天,从来都没有停过。“Word可以由200多人做,我们只有不到10个人,没有办法,只有比别人多付好几倍的劳动和汗水。” 有一个笑话说,王永民一次正在宾馆吃饭,突然有人走上来问他,是不是王码?王永民说:“我就是王永民”,那人连声道歉,“对不起,我认错人了。” 1994年以前,在中国IT行业最出名的不是联想、方正、长城的总裁,更不是IBM、HP、Compaq的CEO, 而是写在程序封面上的程序员的大名--求伯君、吴晓军、鲍岳桥、王志东、王江民等等。成千上万的用户每天启动使用这些“署名文章”的时候,对这些程序员也充满了仰慕之情。 那是一个英雄的时代,一个程序员凭着自己武林密笈一样的源程序,就可以创办公司, 成就自己的事业与声名。直到今天,有些程序员还保留着每天开发结束, 便把硬盘从机器上卸下来带回家去的习惯。在他们看来,源程序是自己的一切。 但此时程序员带回家去的源程序已经显得不是那么重要了, 单个程序员单枪匹马闯天下的英雄时代一去不复返了。中国不可能再产生第二个求伯君,因为已经不存在产生程序英雄的客观条件了。 今天的软件如此地庞大,需要大批程序员通力合作方可完成。如果要在Word上署名,几百个名字,一个整屏也写不完。用今天的眼光看,个人横溢的才华之人组织精良的软件工厂,就像骑瘦马挺长抢向风车发起冲锋的堂·吉柯德一样悲壮。 在个人能力所及的“小软件”上,个人的传奇也直面着穷途末路。因为Internet时代, 再小的软件也必须经过全球的竞争, 才能赢得中国的用户。现在的中国用户已经不是当年给什么用什么的时候了,他们对每一个要装进硬盘的软件都持怀疑否定的目光。 另外, 在这个讲究包装、 企划的时代里,同样功能的软件,一个走红市场,一个门前冷落的例子实在是太多了。精于循环语句的程序员哪懂“卖点”与“炒作”。 在英雄注定成为过去的时代里,新一代程序员注定不能渴望传奇。但即使没了声名的诱惑,真正酷爱程序的人还是会对编程一往情深,不必担心会没有人再愿意做程序员。天汇的作者陈江宁1996年伤心地离开北京的时候,可能没想过再回北京,但今年10月,他终于耐不住湖北孝感的寂寞又回到了北京,尽管陈江宁知道名声大噪的机会可能不会再有了,但他还是又回来了…… WPS97推出仅两个多月,就销出了一万三千套,这样好的势头连求伯君也始料未及。“WPS97确实有很多民族特色的地方。另外,WPS97小巧简单,Word那么庞大,对非计算机专业人员来说太难了。我不反对你用Word,但也请你试一下WPS97。” WPS97为市场所接受,另外一个重要原因是WPS有着2000万的用户基础,WPS原来的每一个功能键都是它的财富,F8是模拟显示,你就用不着费事用鼠标。2000万的用户基础,不仅仅是一个用户习惯的优势,也是一种感情优势,很多用户来信说,‘我就是靠WPS起来的,对它也有一种感情;我学电脑就是从WPS开始的,我的毕业论文就是用WPS打的;我的老婆就是我在培训WPS的过程中认识的。’等。” 现在,求伯君的目标像他当年写WPS1.0时一样明确--市场份额超过Word,求伯君知道实现这个目标会很艰苦:“我们和微软的竞争是在局部的中国市场竞争,它在中国市场不赚钱也无所谓,而对我们来说,一定要赚钱,不赚钱就活不下去。” 在中国,程序比求伯君写得好的,应该说有的是,但我们还是愿意把求伯君看作是中国第一程序员。因为:   第一,作为一个程序员谁也没有求伯君影响大。在中国知道求伯君名字的人,可能比知道盖茨名字的人还多。以致于中央电视台《东方时空》要在盖茨来中国的当天把求伯君请去,“面对面”地谈民族软件以及WPS97如何抗击Word。在很多人眼里,求伯君是民族软件的一种象征。   第二,WPS是中国迄今用户量最大的软件之一。只要你用电脑超过3年以上,你几乎没有可能没用过WPS。   求伯君自己认为:程序之间,没有什么好比的,殊途同归,各种功能最后大家都能实现。成者为王。“程序有两种风格,一种写得规范,大家都看得懂;一种不规范,短小精悍,几条指令就能完成一个应用,讲究速度。”求伯君认为自己属于后一种。   在求伯君看来,优秀的程序员至少要具有以下品性:第一,要能吃苦。熬夜,加班,吃方便面是一种苦。另一种苦是,在中国做程序员工资不会很高,“没法高,高了养不起。”第二,要有天赋。“在中国,有天赋的程序员很多。”第三,是信念。“失败时要能坚持。象我就写了很多失败的软件。”   对照这几条求伯君是怎样修炼成中国第一程序员的?   求伯君高考数学成绩满分,所以班主任给他报了国防科技大学的系统工程与数学系,1980年,只招系统工程专业,系统工程要大量地使用电脑,求伯君从此和电脑结下了不解之缘。求伯君把这个高考志愿称为他之所以有今天的第一个不可错过的机遇。   求伯君一接触计算机就表现出了在这方面的天赋。1983年,求伯君为国防科技大学图书馆做了一个借还书管理系统。这个系统由一台Honeywell-DPS6小型机和几十个终端组成。从设计到开发,求伯君一个人利用2、3个月的业余时间就完成了。一家全国性的报纸刊登了“一个学生求伯君研制成功国防科大图书馆管理系统”的新闻。但求伯君没有记住那是一份什么报纸,“当时没有去在意这种事情。”   图书馆程序是求伯君写的第一个能用的程序,这个程序让求伯君挣了40多块钱。   1986年,求伯君开始研究当时的汉字系统CCDOS,把它的缺点找出来,用Debug做一些小改动。那时候,CCDOS拼音输入法输入一个字母,显示一行待选汉字,连续输入拼音时,必须等上一行完了,才显示下一行,速度极慢。求伯君对CCDOS的第一个改动是:连续输入拼音时,第一个拼音字母对应的待选汉字即使没有显示完,如果这时接收到了下一拼音字母,上一屏待选字行将不再显示。   这是求伯君第一次深入地接触PC,对CCDOS的分析,为他以后写WPS的低层SPDOS奠定了基础。   自身是程序员的求伯君认为程序员最难管,他的经验之谈是:销售人员,给点高工资,多给些奖金,一切都比较好办。对程序员不仅仅是钱的问题。第一,你要尊重人家,知识分子都有一种“臭脾气”。第二,要给程序员一个能够发挥的环境。不能卡得太死。开发程序,属于创造,你不能强迫人家一定要在多少天内完成。写程序和写文章一样,思路打开了,一天都不用,没有灵感一个月都不一定能写出来。“我们在摸索一些经验,不能照搬国外的,因为国外可以利用先进的软件工程方法,一个产品投入几百人,而我们不行,投不起,经常是一个人做几个人的活,有的东西没有办法,只有精简。”   求伯君有资格谈程序员管理,因为珠海金山的程序员队伍比较稳定,做WPS97的核心人员,四年下来,没有动过。 盗版是对程序员的抢劫。求伯君认为,对中国软件发展影响最大的就是盗版。“我们国家对信息产业制订了很多优惠政策,但这些对软件企业无关痛痒。只要盗版问题解决了,其他所有的问题都不成问题了。WPS卖1套正版有10套盗版。假设10套里面,少盗一套,1比10变成2比9,对盗版来说,少了一套,对我来说,则是收入增长了一倍。我如果有了一倍的增长,根本不需要免什么税。” 过去的一些年月里,在很多人的 印象中,电脑是由WPS加五笔字型来驱动的。而WPS的创始人求伯君却一再地抒写着他的未曾终结的传奇。      有人评论说,在中国信息产业,1999是金山年,因为金山公司一直高举民族产业的旗帜,它也是对软件产业投入最大的公司之一。 比起微软,金山实在太小;比起盖茨,求伯君实在太穷。盖茨的别墅值3000万美元,求伯君的别墅充其量也就值30万美元。为了同微软抗争,求伯君卖掉了别墅,几乎是砸锅卖铁,不知关心他的人们为他捏了多少汗。他最终换来了WPS的诞生,换来了龙行世纪”轰轰烈烈的场面。      提起WPS,无人不知:国内最畅销的中文字处理软件。WPS曾经风靡大江南北,创造了全中国数以十万计的WPS小组的工作机会;一大批作家也因此而扔掉了伴随多年的纸和笔,玩起了现代的洋玩意儿。曾几何时,WPS就是中文字处理软件的代名词。      然而,1994年,世纪软件业的巨无霸微软公司携技术、品牌和资金的优势,杀入中国市场,推出了中文版的Word,WPS的灾难便从此降临了。这个时候,连WPS的发明者求 伯君也几乎要被人们遗忘了。      1新世纪,是龙还是维纳斯?答案是:“龙行世纪”   求伯君的WPS2000带给中国人的不仅仅是一套好用的办公系统,更重要的是,它打破了微软的垄断。与微软不同的是,求伯君关注的是个人用户的实用与便易。 1999年3月22日,北京新世纪饭店世纪厅。求伯君领导的金山公司隆重召开WPS2000龙行世纪新闻发布会,宣告长期由国外办公软件一统天下的被动局面终于结束,智能集成办公软件WPS2000已于4月3日上市。现在,以龙行世纪为主题的一系列热卖活动将在全国各地陆续开展。WPS2000给我们带来了什么?    现在,金山宣布,即将投入千万巨资,发布以WPS2000为龙头的一系列产品,宣言民族软件业将崛起于世纪末,下个世纪将是中国人的世纪。求伯君成功地打出了第一张牌:龙行世纪对维纳斯,与微软在新年开始的第一场市场 活动遭遇战上就来了一次大比拼。他的口号是:马力强劲,易用为王。WPS2000集成了五大功能:文字处理、电子表 格、多媒体演示制作、图文混排和图像处理。许多功能上超越了WORD,比OFFICE2000简单易用。盖茨这次来是给中国人送女神来了,其中的霸气表露无疑。金山要龙行世纪,很容易唤起民众的支持和好感。    3月10日比尔·盖茨第六次来到中国。宣布了针对中国的维纳斯计划,尽管比尔·盖茨只在深圳呆了6小时,中国的信息产业的几大巨头却都赶来会见盖茨,他们是联想、海尔、四通、步步高等公司高级领导人。与维纳斯计划同步进行的,是微软开始在中国进行大规模的OFFICE2000和WORD2000最后测试工作。同样像是巧合,此时WPS2000最后的测试也快完成了,求伯君不久宣布了金山公司的“龙行世纪”计划,从3月22日起,WPS2000将和微软的WORD2000一决高下。  过去的几年,由于痛失战机,WORD不知不觉成为办公软件的时尚,逐步蚕食着WPS的市场。中文办公软件市场风云顿转,当时在国内共有100多家办公软件厂商,像四通排版、天汇、CCED、希望、晓军、中国龙、华文WORD等软件都曾风云一时,可惜全被微软一一剿灭,这些公司大部分都烟消云散,不少人才转身投奔微软。WPS何去何从,成为 了一个需要慎重考虑的问题。不少好心人劝求伯君,别干了。 是啊,微软在全世界都没有对手!年轻的求伯君陷入思考阶段。 终于,强烈的使命感涌上心头:中国人一定要有自己的办公软 件,没有做怎么就知道一定会输呢?  2背靠商业社区,留下技术“火种”;强强联合,强化管理。      如果不在珠海,早在1995年或1996年的时候, WPS就有可能像其他许多国产软件一样销声匿迹。       事实上,同以2000命名的Office和WPS 并没有直接对峙在一起。WPS2000项目的正式启动是在 1998年2月14日。这次开发,求伯君把WPS开发的大 本营设在商业气息浓重的珠海。他为自己所作的总结是:把 开发重心放在珠海是我所做的最为明智的选择之一。从某种 意义上说,珠海是信息技术的孤岛,然而正是这种孤岛效 应屏蔽了外来的利诱与干扰,在最困难的时候留下了一批技术 的火种。萨特曾经说过,生命是存在与虚无的摩擦点。因此国产软件品牌要想长期保持生命力,必须是由一种耐磨的材料”所组成,也就是说,国产软件必须要耐得住寂寞。恐怕这才是WPS最大的秘密。      而且,WPS的开发已经从早期求伯君等一两个人的孤军 奋战,转向现在由设计、编码、测试等环节组成的完整的研发体系,开发队伍也形成了一定的梯度。    1998年8月,联想公司向金山公司注资900万美元,两大民族品牌的联手,给WPS带来了新的机遇。求伯君和联想公司联合,好处不仅仅是资本,还有联想成功的管理模式,联想对市场的运作方式:搭班子、定战略、带队伍。同时,求伯君已经看到了Internet发展对文字处理软件的冲击。在从DOS转到Windows平台以后,WPS未来很有可能会转向Internet平台。在内部用WPS模拟Web环境正是沿此方向进行的尝试。求伯君表示,金山将有可能在 三个月内把建立内部Web所用到的技术应用在WPS2000的升级版中。不管怎么说,求伯君的金山WPS2000将为中国软件市场带来新的冲击和新的气息。   3卧薪尝胆:收拾旧山河,朝天阙!   在那沉寂的日子里,他用自己的行动做了一个明确的答复: 接着干!如果不干,那才没有明天。   1984年,求伯君从国防科技大学毕业后,被分配到河北省徐水县石油部物探局仪器厂。求伯君学的是信息系统工程专业,分配到工厂里应该说还是专业对口的,因为他可以操纵一台计算机。1986年他的生活被改变了。一个深圳大学的女学生到该厂实习,当那个女孩子实习结束回到深圳去后, 求伯君竟自己掏钱买火车票去了一趟深圳,去看那女孩子。一段没有结局的爱情故事,却成了中国软件业一个传奇的开始。求伯君被深圳给迷住了。其实,不光是对22岁的求伯君,那个时候的深圳对每个热血青年的诱惑力都是巨大的。他要去深圳。1986年底,求伯君辞掉公职,把户口卡往兜里一揣, 走了。       在求伯君去深圳之前,他到了一趟北京。愣头愣脑地扎进了当时正如日中天的四通公司。他交给四通的是几张软盘,那是他临行前花了9天时间编制的一套打印机驱动程序。四通觉得,这是个人才。而他的那套程序卖了2000元,分10个 月付清。当时的求伯君也许没有想到,仅仅是五六之后, 的工资奖金要以万元为单位来计算,而他开发的软件的销售收 入的计算单位竟是亿元。   金山公司老板张旋龙是他在四通工作时认识的,他给求伯君在深圳的一家宾馆里租了一间房子,摆上一台386电脑,让他编制开发他的文字处理程序。求伯君认为这是极优厚的待遇能让他干他想于的事。当香港金山公司与北京大学合 作把装有WPS1.0的汉卡推向市场的时候,售出1000 套。这是一个巨大的数字,要知道当时很有名气的联想汉卡总销量达到3000套时,联想人为此还大大地庆祝了一番呢。   WPS静悄悄地上市了。书店里的计算机类书架上摆满了诸如《WPS使用教程》《WPS使用指南》一类的书,专业非专业报刊上是整版的WPS使用技巧,而社会上各种电脑培训班的主要课程除了五笔字型就是WPS操作,在很多人的印象中,电脑就是WPS加五笔字型来驱动的。   任何时代都将成为历史,但英雄必将成为传奇。1993年,鉴于求伯君为公司做出的贡献,香港金山公司的老板张旋龙在珠海为他买了一套价值200万元的别墅,作为奖励。1994年,香港金山公司被北大方正公司合并,也就是在这一年,求伯君在珠海成立了珠海金山软件公司。   这一年,令中国软件业措手不及的一件事情发生了。美国微软的WINDOWS系统在中国悄然登陆。微软OFFIC E中的WORD文字处理软件几乎如同当年WPS的出现一样,迅速占领了中国文字处理软件市场。   让我们设想一下,假如没有WPS,中文世界会怎么样?全国各地数以万计各种形式的WPS培训班,书摊上数百种W PS教程,经过近10年的市场培育,WPS已经深入到了社会的各个角落,深入到基层、边塞和海外华人社区。这些是W PS足以傲视群雄的资本,也为求伯君和WPS再度辉煌提供 了可能。    求伯君首先卖掉公司奖励给他的豪华别墅,筹资400多 万元,开始了每周7天、每天10多个小时、历时3年多的艰苦开发,终于在前年10月推出了WPS97,而且一上市就登上了软件排行榜的榜首。 假如后来没有WPS97,中国市场就成了比尔·盖茨的造币厂了。今天求伯君面对的是世界最强大的对手,其勇气自然博得人们的喝彩。在WPS97上市后的一个月内,他在全 国10多个大城市举办技术讲座,场场爆满。向比尔·盖茨挑战向微软说不。WPS97抗击WORD求伯君卖屋做软件等一系列极具情感冲击力的标题将求伯君推到了一个电脑民族英雄的地位。他被电脑刊物评为1997 年十大新闻之一、1997年十大真汉子。求伯君敢卖别墅,以自己的一生赌一把,赌出了个:三年不鸣, 一鸣惊人。  4他是中国第一程序员,却走着一条和一般程序员不同的路。他始终热爱着他的WPS。     在求伯君看来,优秀的程序员要具有以下品性:第一,要能吃苦。熬夜,加班;第二,要有天赋。第三,是信念:失败时要坚持。像我就写了很多失败的软件。第四,要爱这一 行。不给钱都愿意写。第五,是团结。现在程序都大了, 以光盘为单位。没有合作精神,一个人做不出什么事情。我们 当时单枪匹马可以成英雄,现在已经不行了。第六,要逢上 机遇。我是赶上了电脑刚进入中国,一切都是空白的机会。            求伯君十年不倒的原因在于他一直在走着一条和一般程序员不同的路,大多数优秀程序员大都选择了自己创业或者合伙 创业的道路,而求伯君则一出道就碾转于四通、金山、方正这 样的大公司,在这些公司的经历使求伯君具有了大公司的眼界 和胸怀。这是求伯君高于同时代程序员的本质原因。   1988年5月到1989年9月,求伯君把自己关在张旋龙为他在深圳包的一个房间里,只要是醒着,就不停地写, 什么时候困了,就什么时候睡,饿了就吃方便面。他目标很明确,做一张汉卡装字库,写一个字处理系统,能够取代WordStar,这个目标就是后来的WPS。为了实现这个目标,在这样的一年零四个月中,求伯君生了三次病,第一次肝炎, 第二次肝炎复发,第三次又复发,每次住院一个月到二个月。 第二次肝炎复发正是软件开发的最紧要的关头,求伯君把电脑搬到病房里继续写。开发之苦不是病魔缠身,不是身心憔悴,而是孤独。有了难题,不知道问谁,解决了难题,也没人分享喜悦。求伯君就在这孤独之中,写下了十几万行WPS程序。     刚刚独立的珠海金山公司没有销售经验,销售、宣传、策 划,全部自己搞,应付不过来。最后是香港金山被方正合并。否还做下去?求伯君决定继续做。他坚持WPS不能放弃。      WPS97推出两个多月时,已销出1.3万套,WPS97为市场接受。其中的重要原因是,WPS有着2000万用户基础,WPS原来的每一个功能键都是它的财富,这不仅仅 是一个用户习惯的优势,也是一种感情优势,很多用户来信说我就是靠WPS起来的,对它有感情;我学电脑就是从WPS开始的,我的毕业论文就是用WPS打的;我的老婆就是我 在培训WPS的过程中认识的。等等。      在中国,程序比求伯君写得好的有的是,但我们还是愿意把求伯君看作是中国第一程序员。中央电视台《东方时空》在盖茨来中国的当天把求伯君请去,面对面地谈民族软件以 及WPS97如何抗战Word。在很多人眼里求伯君是民族软件的一个象征。自身是程序员的求伯君认为程序员最难管,他的经验之员,四年来坚持下来,没有动过。      作为WPS的原始开发者,求伯君通过自己的劳动为振兴民族软件业尽了自己一分力量。今天,面对瞬息万变、竞争十分激烈的市场,国外大软件厂商纷纷进军中国,国内软件业面临极为严峻的考验。求伯君没有什么与众不同。当北京的一位记者前不久问他,他要做到什么时候才会“收手”,他的回答是到公司真正再也做不下去了,鞠躬尽瘁,死而后已。从求伯君的话里,还是能听出其中挥之不去的悲壮意味。   工作简历与科研成果:   1984年毕业后的求伯君分配到河北徐水石油勘探部工作;   1985年带着他的第一个软件产品到中关村的电子一条街,选择了北京四通公司。在这里他萌发了用电脑代替打字机进行文字处理的想法,但提议未得到公司的重视。   1988年求伯君遇到了香港金山公司总裁张旋龙,他愿意为求伯君提供开发条件;   1989年研制成功集中文文字编辑、排版、打印功能于一体的中文字处理软件WPWordProcess 玻椋睿纾樱 stem),并先后推出了金山汉卡I型、II型、II+型和III型以及WPS20及SPT图文排版系统。   1993年10月以新一代产品W PSNT为核心软件的金山Ⅵ型汉卡研制成功推向市场,该软件于1994年10月通过鉴定, 1995年4月,盘古办公系统通过鉴定,并荣获全国95年度推荐优秀软件产品及珠海市一九九五年度科技进步一等。盖茨来北京这天,求伯君被中央电视台《东方时空》请进了演播室,在《面对面》栏目中畅谈为什么要做WPS97以及如何同Word抗争。求伯君俨然成了可以和盖茨抗衡的人物。求伯君从珠海到北京下了飞机,没吃饭直奔中央电视台,5分钟的节目,采访花了5个小时。   WPS97粉墨登场,在友谊宾馆开新闻发布会的时候, 求伯君蓄起了胡子。当时他正在寻求大部委的支持,免不了要和相信“嘴上没毛,办事不牢”的官员们打交道。这次上电视,求伯君穿了一身在上海定做的特别合身的中山装,显得很中国味。   贵州电视剧制作中心也正在筹划拍摄求伯君传奇的电视剧。求伯君要求他们的剧本刻划出他自强、智慧、坚定的性格。   按照雷军的观点,写求伯君的文章虽然很多,但令人满意的还没有。雷军这样说,可能是因为雷军觉得自己的文章就写得不错,但雷军又说,他也无法写好求伯君,因为他太熟悉求伯君了。雷军的理论是,要写好一个人,既不能不熟悉他,也不能太熟悉他。不熟悉,写不深;太熟悉,熟视无睹,感觉没什么好写。   我的采访从晚上八点开始,晚上和求伯君、雷军同住在燕山酒店,因为第二天要早起看7∶20的《东方时空》,另外,早餐时他还要接受《中国日报》记者的采访,因此,聊到凌晨3点,我们就倒头睡了 。   在我们眼中,求伯君身上程序员的色彩要远远大于经理人的理念。   求伯君独自掌管金山公司已经有些时日了。张旋龙从1987年开始教求伯君怎样进入“所谓的上层社会”也已经十年了,关于礼节、习惯,甚至什么场合穿什么衣服,求伯君早已心领神会。比如,他知道在各地演讲时,要穿中山装;知道来北京要住燕山大酒店,也克服了演讲时,脸红得讲不出话来的怯场,现在是就怕人少,讲起来没劲。骨子里面求伯君仍是一个程序员,直到今天他还没有停止过写程序。当他遇到能用程序实现的某个应用时,他不会像大多数用户那样四处去找现成的软件,而是自己写一个。“四处去找,多么麻烦!还不如写一个。”   求伯君思考问题的方式是汇编的,他在机器上不加思索写汇编的神速,让他的手下佩服不已。求伯君认为用汇编写的程序很好看。   求伯君自己喜欢玩游戏,所以,尽管《中关村启示录》、《中国民航》、《剑侠情缘》都没有挣到什么钱,但求伯君还是要坚持做游戏软件,并将在今年年底推出《抗日》。这不是生意人做企业的方式,而是程序员做企业的方式。   能把汇编用得出神入化的求伯君不会用Word,他觉得文字处理需要完成的功能WPS里面都能实现,“假设哪个功能实现不了,我会提议,加上这个功能。”   求伯君像爱护他的双胞胎儿女那样爱着WPS,你要是当着面说WPS坏话,求伯君肯定会很生气地质问你,“WPS哪里不好?”,你说出的理由绝对没有求伯君反驳你的理由充分。   求伯君第一次知道有人盗他的版时,和所有的程序员一样,很高兴有人在用自己的东西。   求伯君乐观地估计,WPS有2000万个用户。求伯君自豪的是,WPS养活一批书商,一批搞培训办班的人,一批打字小姐,并且推动了电脑的普及。 求伯君认为,很多和他同时代的程序员没有适时地转到Windows上,并不是他们抱残守缺,而是在Windows上开发程序不是一个人能做得了的事。“投入要比DOS上大很多。具备这种转向实力的,并不是很多。”  求伯君爱看武侠书、历史书和社会纪实作品,唯独对外国文学不感兴趣。“国外名著,包括电影、音乐,都没有共同感,无法引起共鸣。我是个传统的民族主义者,喜欢中国的民族音乐,比如古筝和古琴。 潘爱民个人经历 中学——程序之初    中学时候还谈不上软件开发,只是凭兴趣编制一些小程序,偶尔也编几个稍大一点的程序。有两件事情特别值得一提:(1)当时我们只用BAISC,它有一种很特别的程序叫“一行程序”,也就是说,在一行内完成一个程序。因为BASIC语句一行只能容纳254个字符,而且一行内不许使用跳转与判断语句,所以一行程序不能完成很复杂的功能,但是有些有一定规律但又不很规则的图案打印或者计算任务可以由一行程序来完成。这是一种很好的游戏活动,非常适合于中学生的智力开发和锻炼。不知道现在是否还有类似这种形式的活动。(2)中学期间我编过几个规模稍大一些的软件,BASIC代码行达到几千行(当时的16位机器内存加起来只有64K,用户程序可用内存不超过30K)。有意思的是,我在程序中还调用了我自己写的一段汇编,这段汇编直接操作图形显示缓冲区,实现图形的快速移动。AppleII机器使用6502处理器,当时也没有学过任何微机和操作系统知识,我记得那时一直不明白寄存器的概念,但是居然也能写出可以运行的汇编代码来,现在想来有点不可思议。不过从这件事情上,我也想到,我们经常听到有关青少年计算机奇迹的事情都是有可能的。他们可以自己编写代码制造病毒,可以攻击网络系统。青少年的想象力很丰富,潜力很大。   中学期间,虽然没有象样的成绩,而且还直接影响了我的功课,但是在计算机方面所做的许多工作使我非常充实。不过,因为计算机的神秘性对我已经不再存在,所以我上大学还是选择了我当时非常钟情的数学——免试进入南开大学数学系。 大学——兴趣  我在大学期间,花在计算机方面的精力要比数学方面多得多,在二年级时候,我有幸进入了南开计算机系模式识别实验室从事软件方面的工作。当时有一台286机器可供我使用,良好的工作条件使我有机会打下扎实的基础。   (1)学习汇编语言。汇编语言在当时很盛行,我写了不少的汇编程序,连界面(下拉菜单)都用汇编来写,对于10h中断和21h中断中常用的功能非常熟,不需要查参考书就可以写出功能调用来。当时我在对一块图像卡编程时需要访问扩展内存(地址0xa00000),所以我研究了286保护模式的编程技术,主要阅读15h中断的汇编代码,最终解决了保护模式的切换和编程问题。保护模式与实模式的切换在今天已经意义不大,但当时来讲,由于DOS是实模式下运行的操作系统,保护模式往往是可望而不可及的。   (2)PASCAL语言。PASCAL语言作为一种结构化编程语言,加上Turbo Pascal友好的集成开发环境,当时确实风靡一时。对于我来说,汇编语言再加上Turbo Pascal开发环境,确实是无往而不利。PASCAL语言具有很好的可读性,加上Turbo Pascal实现了单元(unit)管理功能,是学生最为喜欢的编程语言。我使用的Turbo Pascal最高版本为5.0。据说到6.0已经成了面向对象的Pascal语言了。   大学时代我主要靠自学的手段学习计算机软件知识,而且几乎没有与别人交流的机会。但是南开很好的学习上机条件使我在DOS操作系统、汇编语言、PASCAL语言以及80286保护模式编程这些方面得到了很大的提高,我很怀念那段时光,那是我学习生涯中最美好的一个阶段。当我临近毕业的时候,Turbo C 2.0逐渐传播开来,我开始从Turbo Pascal转向Turbo C。 研究生——狂学  虽然我在大学期间已经很了解清华了,但真正让我认识清华还是在自动化系读研究生这一段疯狂的学习和工作之中。大学期间扎实的基础足以让我应付任何一个编程难题,而且我又很快转到Turbo C上来,有了这些工具,作为清华的学生,干点课余之事就很正常了。  我当时在一家数据工程公司兼职,该公司云集了清华计算机系一群高手,我跟他们在一起,真是受益匪浅。这些高手们每个人都有独挡一面之才华,对于汇编和C语言都非常精通。由于DOS操作系统的简单性和开放性,在DOS平台上我们几乎可以完成任何一件事情,再底层的难题我们都有办法解决,我想那个时代的每一个高手都会有这样的经历和体会。这几年我和这些朋友们失去了联系,不知道他们现在怎么样,我想他们都会很不错。  群体的作用对我帮助很大,而且我在软件方面的知识面也逐渐开阔起来。在商业公司这样的环境中,我接触到了许多其他的编程技术,如FoxBase、汉字处理、简单的网络编程等,有些技术在当时非常新,比如多媒体编程,包括声卡、视频卡、触摸屏等编程技术。  很快Borland C++ 3.1流行开来,这是DOS平台上最优秀的开发工具。Borland C++的集成开发环境加上相关的一些辅助工具,如Turbo Debugger等,是一个功能很强大的软件开发工具。从C语言到C++语言是一个很自然的迁移过程,尽管当时很多人在使用BC,但他们往往不涉及到面向对象编程,而我则很快领会了面向对象的思想,建立了一套自己的界面工具类库。我这一套界面工具类库很小,参照Turbo Vision的思想,模仿Windows 3.1的风格(当然功能上差远了),大约只有2000多行代码,而且支持汉字的显示。尽管规模很小,但也包括消息机制,下拉菜单、窗口、对话框、按钮、编辑框等界面元素,在随后的毕业论文工作中我用到了这套工具,然后弃之不用了,因为我又转向Windows编程了,倒是我几个同学用这套工具做了些程序。   研究生期间是我对计算机开发技术最有热情的一段时间,而且学习的效果也很好。清华大学的风气比较注重实用,在技术的选择上比较超前,群体气氛又好,这是我学习最见成效的一段时间。当然,我并没有因为这些事情而耽误我的论文工作,这两者是相辅相成的。我想清华现在的学生会做得更好、学得更好吧。 职业生涯——致远   从清华毕业我来到了一墙之隔的北大,在北大计算机研究所,我开始了计算机软件开发的职业生涯。尽管我以前一直没有把计算机当作自己的本职专业,但事实上我一直偏向于软件开发。最终我还是选择了职业软件开发工作。我在北大计算机研究所的软件开发经历可以分为两个阶段:   (一)1994年到1997年   这一段时间我精力集中在应用开发上。职业开发人员与学生一个很大的区别是,你对技术、平台和工具的选择必须符合应用开发的需要,不能像学生那样随心所欲。我在这三年的开发过程中,基本上仅局限于Windows平台、Visual C++以及MFC。幸好我的工作面比较宽,涉及到系统的多个方面,所以我对Visual C++以及MFC的使用比较全面,三年工作下来之后,我对于Windows应用开发已经非常明白了。    由于我们使用VC和MFC比较早,当时基本上没有资料,我一直鼓励其他人去读一读VC自带的一本“开发者指南”,这本书包含在VC的联机帮助中,据说是Inside Visual C++的前身,从内容上看是有可能的。当时我没有看过其他的书,平时碰到问题往往通过MFC的源码、VC的例子程序以及联机帮助来解决。现在学习VC和MFC要方便多了,书店里这方面的书琳琅满目,而且身边往往高手如云。尽管我从MFC的源码中学到了很多东西,但这是在没有办法的情况下而为之,我不太赞成研究源码,除非是为了学习的目的。   (二)1997年到1999年   由于健康的原因,我被迫从开发人员的岗位上撤了下来,从97年下半年开始,我不再从事直接的开发工作,改做技术支持工作,是对开发人员的技术支持,不是最终用户的技术支持。这是我程序生涯中最暗淡的日子,但我还是努力让自己吸取营养,来填充自己对知识的渴望和需求。 这段时间,我考虑的焦点问题是如何把软件做得更好,具体来说,就是组件化程序设计,进一步具体化,我研究COM,并设法把COM技术应用到其他的开发组中,为其他人提供这方面的技术支持。我的工作做得不是很成功,COM的应用不是那么直截了当的,这在当时的条件下是很难克服的。   我有必要再次强调群体的好处,北大计算机研究所内部高手如云,大家都是同事关系,所以交流起来比较方便,在这样的环境下,技术上的长进可以快得多。我又一次得益于环境的优势。 从学校环境来讲,我从南开到清华再到北大,尽管三个学校的校园都很优美,南开有新开湖和马蹄湖,清华有水木和荷塘,北大有未名湖和博雅塔。但是在我的职业程序生涯中,未名湖给了我很多启迪,当我从事开发工作或者写作时,我经常在夜晚到未名湖畔散步,从她幽静而深沉的气息中汲取灵感。 结束语    我是一名普通的程序员,在软件开发队伍中算一名老兵了,以上所介绍的经历是我十几年的路,走的路很长,但是没有值得一提的成绩。也许我的介绍中有一些偏颇之处,请大家不必挑刺,因为这只是我的一点感受,真实的感受,它所反映的仅仅是一个侧面。 《Visual C++ .NET技术内幕(第6版)》定价:¥108.00 《Effective Java中文版》定价:¥39.00 《C++ Primer (3RD)中文版》定价:¥128.00 《COM本质论》定价:¥49.00 《深入解析ATL》定价:¥69.00 《Visual C++ 技术内幕(第四版)》定价:¥96.00 《COM原理与应用》定价:¥39.00 《深入理解Microsoft Windows2000分布式服务》定价:¥31.00 《深入理解COM+》定价:¥25.00 [潘爱民译作][潘爱民著作][/size

Forger 推荐学习windows 编程所有书籍都在这儿: windows 编程 windows MFC入门到精通 windows 高级编程 windows 网络编程 Programming Windows Programming Windows with MFC Programming Applications for Windows Network Programming for Microsoft Windows Programming Windows by Charles Petzold. The book to get on Win32 API. If you want to write programs using just the API (which is what this tutorial covers), you need this book. 如果你想只用windows API编程,这本书是入门经典,你需要这本书。 Programming Windows with MFC by Jeff Prosise. If you want to venture into MFC (AFTER becoming fully accustomed to using the Win32 API), this is the book for you. If you don't like MFC but intend on getting a job doing windows developement, get this anyway, it's better to know than not. 如果你想用MFC这本书是你想要 Programming Applications for Windows by Jeffrey Richter. Not for newbies, if you want to be up on managing processes and threads, dlls, windows memory management, exception handling, and hooking into the system, then this is the book for you. 如果你想了解操作系统内幕,这本书是经典,书中包含了进程,线程,动态库,windows内存管理,异常处理。。。 Visual C++ Windows Shell Programming by Dino Esposito. For anyone interested in the visual and user-friendly aspects of windows, this book covers writing extentions to the windows shell, working efficiently with files and drag and drop, customizing the taskbar and windows explorer, and numerous other tricks. Well worthwhile for anyone writing GUI apps in windows. Network Programming for Microsoft Windows Up to date information on network programming, including NetBIOS, mailslots and pipes, and of course the ever important windows sockets, complete with winsock2 and raw sockets. Also contains specific information on the various windows platforms including 2000 and CE.
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页