最近一年,多读技术书籍。每有经典著作,买之、藏之、读之、研究之,受益颇深。况置身于一日千变的IT行业,不读书,便有落后之感,而终日读书于诚惶诚恐之间。从开发语言平台(C/C++、Java系列)、OO思想、设计模式、UML、软件过程(敏捷开发等),到算法、数据结构、软件体系架构,不同层次、不同层面的书都有涉及,初略统计,购书竟达¥1000以上。
经常被人问及该读何书、从何入门、如何深究,因此给出这个Book Lists。list中的书基本都是我所读过,并以为经典,当作我的一个读书总结,也可作为大家学习之参考。
我的学习历程还在行进,我的读书之路也在继续,因此这个book lists也在【持续更新中.....................】
—— 题记
k_eckel's book lists
【语言和平台】
【C/C++】
[1]《C陷阱与缺陷》,Andrew Koenig,高巍译,人民邮电出版社:如果让我推荐一本关于C深入学习和研究的书,那一定会是《C陷阱与缺陷》。第一看这100多个Page的书,感觉不过如此(少年轻狂:)),第二次看是自己做了一个编译器后,带来就是震撼,再一次看的时候就是恐惧——Andrew Koenig的这本书出版14年来,在全世界内重印了18次,并且从第3次后就一个字都没有改变!如果你想知道编译过程对程序设计的影响,如果你想检验自己对底层的把握力度,强烈建议你读读这本书。
[2]《C++编程思想》(第二版),Bruce Eckel,机械工业出版社:Bruce Eckel的《Thinking in C++》和Stanley B.Lippman的《C++ Primer》是C++从新手到进阶的必备书籍,当然个人认为两本中取一本研读即可。我选择的是《Thinking in C++》,原因是觉得《C++ Primer》实在是太厚了(:)实际上绝对全面,我后来还是在不少地方要参考Lipman的书)。《Thinking In ×××》风格甚至是书名都成为了Bruce的“专利”,后来的《Java编程思想》(第二版,目前已经有了英文的第三版),以及《Thinking In C#》(目前还没有中文版,并且该书是和Larry O'Brien合作。),都是经典中的经典,强烈推荐阅读。
[3]《Effective C++中文版》(2nd Edition),Scott Meyers,候捷译,华中科技大学出版社:对于这本书,我认为任何想把C++学好,想用C++做项目开发的都应该好好研读本书。孟岩在该书的印介中如是说:“曾经在网络讨论组中间看到这样的说法,C++程序员可以分成两类,读过Effective C++的和没读过的。”个人认为,《Effective C++》将面向对象的思想和原则与软件设计、C++开发很好地结合在一起,达到了一种完美统一的境界:你在学习C++技术(以原则条款的方式给出)的同时,OO思想得到了升华和提高。纯粹的OO思想的学习会略显得枯燥和无味,但是以为使用、掌握了一门用于面向对象系统开发语言便以为懂得了OO的开发与设计(OO的精华)则会显得多么的无知和轻浮。如果大家想真正体验OO设计开发、享受C++的强大与精髓,请读《Effective C++》。
[4]《More Effective C++中文版》,Scott Meyers,候捷译,中国电力出版社:《Effective C++》的完美续集。
[5]《C++沉思录》,Andrew Koenig & Barbara Moo,黄晓春译,人民邮电出版社:这本书的英文名字叫:Ruminations on C++:A Dacade of Programming Insight and Experience,十年程序设计的真知灼见。Andrew Koenig夫妇是世界上著名的C++大师级人物,并且他们也堪称C++领域的“第一神仙眷属”,看看他们在AT&T曾经做过的事情,你就没有办法不去承认这样的书名实在是实至名归,用起来也当之无愧。而Barbara Moo则更是C++领域的女中豪杰。读这本书实在是和无意中的机缘巧合读了Andrew的《C Traps and Pitfalls》,感叹崇拜之余,则买了这本《C++ 沉思录》,该书的特点一是适合学习(教学型的讲解方式),而是适合练习(书中给出了很多的实际的例子进行分析和讲授,甚至包括一个简单的string的库),怪不得C++之父Bjarne Stroustrup如是推荐:对于C++是什么样的以及能够作些什么,他们的先见之明在这本书中随处可见。他们另外一本书《Accelerate C++》也是C++学习中的经典。
[6]《C++程序设计语言》(特别版),Bjarne Stroustrup,机械工业出版社:如果您在学习或使用C++语言,但是没有上过Bjarne Stroustrup的网站,建议您登录:http://www.research.att.com/~bs/homepage.html。让我记忆最为深刻的不是Bjarne Stroustrup有型的照片(工作),而是照片下的第4行话:I designed and implemented the C++ programming language.因为这句话世界上就Bjarne Stroustrup有资格如是说。之于Bjarne Stroustrup本人不劳我多言,之于这本书,大家都知道Bjarne Stroustrup的风格就是有些教条化,别人也称之为“学院派”,可能读起来比较不是那么上口,我个人也就是有一本e文的影印版本,实话说也没有真正系统读完过,但是有时候还是在里面查阅了不少知识。不推荐作为入门的书籍,但是建议收藏,至少也是对Bjarne Stroustrup这位给我们带来C++语言的大师的敬畏和敬意。
[7]《深度探索C++面向对象模型》,Stanley B.Lippman,候捷译,华中科技大学出版社:对于Stanley B.Lippman本应该好好介绍他的另外两本更加知名、流传也更加广泛的书《C++ Primer》和《EssentialC++》,这两本书(特别是后者)都是C++入门的好书,当然前者也是C++进阶、研习的最好书籍之一。无奈前者我没有买过,只是在学习和开发中参考、查阅过(电子版本倒是有收藏),而后者则只是初略看过一遍,不好妄加评论。而这本《深度探索C++面向对象模型》我则收藏了,原因有二:一是我对底层实现比较感兴趣,二是冲着Lipmman的大名,而我自己也在实现一个比C++简单很多的一种学习语言的编译器(一些介绍:http://www.mscenter.edu.cn/blog/k_eckel/category/384.html)。在《深度》中,Lippman就自己当年在AT&T实现CFront编译器的实际经验总结、分析了C++的对象组织模型、函数模型,C++中多态的实现机制(virtual table的组织)等。这是一本研究的书籍,如果你对C++的使用已经比较自信,但是对底层实现很感兴趣,这本书则正是你梦寐以求的经典。Stanley B.Lippman的个人主页:http://staff.develop.com/slip 。我也发现一般大师的主页都很简约、简洁,无论是Knuth,还是诸如Bruce Eckel、Bjarne Stroustrup还是这里的Lippman都一样。大家对Lippman的最近的印象应该比较的熟悉,Lippman现在是Microsoft C++/CLI的总架构师,专门负责将传统C++移植到.Net平台上,前一段时间因为需要曾经花了一段时间研习过C++/CLI,个人觉得虽然比起丑陋的Managed C++,C++/CLI要elegant不少,但是给Managed C++善后却不是那么的容易,给Lippman +U,也期望C++/CLI走好!
[8]《C++程序设计教程》,钱能,清华大学出版社:之所以这里列出钱能老师《C++程序设计教程》主要是因为个人认为在国内写C++方面的书中就钱老师的书最有份量,我姑且不敢将钱老师的书和上面提到的大师们的经典比较,但是在国内这样一个浮躁的环境中,钱老师的书也确实给了我不少的希望和期望。大家可能也注意到了,国外大师们的书上都是著名×××著,而国内大部分则是×××编著,不读研不知道编与著的区别,现在才知道编和著真的可以说是差之毫厘、谬以千里。《C++程序设计教程》实在可以作为C到C++学习的一个预科读物,推荐大家想学C++但是基础不是很好的研读之。
【Windows程序设计/VC/MFC】
[1]《WINDOWS程序设计》(上、下),Charles Petzold,清华大学出版社:这本书是Windows编程领域的“圣经”,无法描述其在Windows程序设计领域的影响和功效。而Charles Petzold则是作为仅有的七个人之一(并且是唯一的作家)被《Window Magazine》和Microsoft公司授予Windows Pioneer奖,以表彰他对 Microsoft Windows的成功做出的贡献。之于这本书遗憾有二,一是价格不菲(上下两册一共160RMB,就算打个八折也还是......),二也是最重要的,现在业界实在是比较浮躁,于是我们也跟着要浮躁,很少有人能够真正静下心来去研习诸如windows程序设计的基本知识,去在没有VC生成的一大堆的MFC垃圾代码的情况下就写写windows程序了。企业和公司要求的就是一堆的会拖拉点击的熟练的操作人员,他们需要的是能够立即能够带来商业利益的代码工人,尽管他们也说要求技术功底的深厚。绝大多数的VC程序员都是在完全没有过windows程序设计经验就去被教着使用MFC进行桌面系统的开发。Java、.Net需要我们学习和熟悉的地方太多了,以至于我们无法安静下来好好去把内功练到本该具备的级别就要上战场冲锋陷阵了。实际上我也是这般,虽然我看了这本书的绝大部分的内容,也用记事本写了一些简单的windows程序,从WINMAIN写起,注册窗口、创建、显示、消息循环,然后WinProc的实现,但是我也没有胆量说我对windows程序设计已可以和像使用C++/Java那样熟练。实际上可能是否要在学习使用VC等之前一定要把windows程序设计非常深入的观点也值得商榷,个人看法是:熟悉windows编程,机制、过程,做一些简单的练习,然后在基于MFC开发过程中对出现的问题在去参考这方面的资料,再去解决相关的问题(可能要用到windows程序设计中的本质东西)。我便是这般。因此建议大家能够阅读。
[2]《深入浅出MFC》,候捷著,华中科技大学出版社:这本书也不是一本浮躁人看的书,个人认为也不太适合于初学者看。个人有一个看法,如果把VC/MFC程序设计的学习像学习一门语言(例如C++/Java)那样学习,就在某种程序上理错了方向。像这种和开发应用联系最为紧密的开发平台的学习应该是一个解决问题的学习过程,这个意思就是当你遇到一个实际开发中的问题的时候,你可以去查阅相关的API、search相关的解决方案,然后解决问题就是了。因此这本书不是作为VC /MFC入门的书籍,VC/MFC的入门我觉得直接到书店找一本这方面的书(大部分都是内容差不多,因为基本是大家互相copy的:)),然后去把书中的例子实现一下,积累对VC开发的感性认识,也满足一下自己的虚荣心。然后可以参看这本《深入浅出MFC》去理解为什么你的程序要那样编写,为什么可以那样实现,怎样才可以在MFC的大网中自由发挥。书中讲消息传递、运作机理最为深入浅出,而对于Doc/View结构却并不是最好的讲述(尽管已经很好了,因为我曾在网上看到过一篇专门讲Doc/View的Document,个人认为最为深入浅出)。强烈推荐大家阅读。顺便一提的是,候捷老师是我个人极为推崇的国内的技术专家和作家,无论是他写的这本书,还是他翻译那些大师的作品,都极为精致,实在是精品和经典。候捷老师本人我和他也算是有一面之缘:2004年10月24日,候捷老师到大陆讲学,其中一站就是同城的华中科技大学,华中科技大学微软俱乐部组织了候捷老师与您工话IT人生活动,也邀请了我们这边俱乐部参与(就算没有邀请,我也一定会去的,呵呵),活动完毕和候捷老师有过一个简单的交谈并留影纪念(遗憾的是照片由于某些原因一直没有找到,深以为憾。)。我在http://www.mscenter.edu.cn/blog/k_eckel/archive/2005/04/15/1426.html中曾经记录了这件事情。
【JAVA】
[1]《Effective Java中文版》,Joshua Bloch,潘爱民译,机械工业出版社:Joshua Bloch是Java社区第一号精神领袖(但是已离开Sun供职Google,郁闷ing......),该书也是Java语言领域的《Effective C++》。书中介绍了57条Java语言开发和编程中极具实用价值的经验规则和建议。揭示了该怎样产生高效、清晰和健壮的Java代码。并且本书的译者潘爱民老师也是集著、译于一身的名家,《C++ Primer》、《VC++技术内幕》(第4、6版)、《COM本质论》等也都是由潘老师翻译的,另外《COM原理与应用》则是出自潘老师的技术力作(可能现在大家对COM的了解和关注力度已经大不必从前:))。强烈推荐阅读。
[2]《Practical Java中文版》,Peter Haggar,候捷/刘永丹译,中国电力出版社:《Practical Java》是我学习Java后阅读第一本Java方面的书籍,当时也正在参与一个使用Java开发的项目,也可以说是一边学一边作项目,项目没有做完,书倒是很快就看完了:一是因为学习总是应该比需求快,而是因为这本书写的实在是很经典。《Practical Java》最大的特点就是简洁、贴近实际开发,书中提到的改善代码的68个主题都是在开发中很容易面临的问题,实在是很Practical。这本书的重点还是Java语言本身,之于面向对象的一些思想和开发理念提及的很少,而在Java的另外一本经典书籍[1]中《Effective Java》中则是集合了不少的OO的设计思想和原则。因此这本书可以作为在学习、研究Java语言本身的必备书籍,强类推荐阅读。
[3]《JUnit In Action》,Vincent Massol,鲍志云译,电子工业出版社:这本书是介绍JUnit测试优先开发的参考书,TDD(Test-Driven Development)是敏捷软件开发中的最重要原则和技术之一,而JUnit则正是这个技术的实现。JUnit则是由两位世界级的大师Erich Gamma 和Kent Beck完成的Java的单元测试的框架,Erich Gamma 是《设计模式》巨著的作者GoF中的第一位,而Kent Beck则是XP的创始人。JUnit不单是给我们提供一中非常elegant的单元测试工具,更为重要的是JUnit塑造了一种新的软件文化:Keepthe Bar Green!只要我们能够保证JUint中Bar Green,我们软件就没有问题了。《JUnit In Action》则介绍了JUnit用法,内容包括用mock objects进行隔离测试、用Cactus进行容器内测试、用Ant和Maven进行自动构建、在Eclipse内进行测试、对Java应用程序、Filter、Servlet、EJB、JSP、数据库应用程序、Taglib等进行单元测试等。这本书最大的特点就是示例驱动教学,适合初学者,很容易上手,推荐阅读。
[4]《Struts Kick Start》,James Turner & Kevin Bedell,孙勇译,电子工业出版社:
【.Net】
[1]《.NET框架精髓》,Thuan Thai & Hoang Q.Lam,王敏之,中国电力出版社:这本书是我看的第一本关于.Net方面的书籍,尽管在网络上有人说这本书的翻译不是很达意,但是个人觉得还是很不错的讲解.Net平台的入门书籍。我学东西比较偏好于行而上和行而下结合,也就是在看一种语言实现的时候我都会结合看一本讲解框架和平台概述的书,这本书也正是和《C# Primer》一起看的。我有一位给我帮助很多的师兄告诉我说:在做项目的时候一定要抬头看看架构、设计的书,看架构设计的书籍时候一定要刻意去做做实际的编码。个人觉得这本书作为.Net框架介绍性入门书籍的定位还是比较准确的,并且里面有很多的示例,比如.Net平台上的语言的无关性中作者就通过一个分别由VB.Net /C#/Managed C++编写的示例程序(交通工具),感觉是非常好的体验。书中还对诸如.Net 中的数据访问、XML等内容进行了一个概述,总体说来还是达到了我的预期期望,因此这里推荐大家作为入门级别阅读。
[2]《C# Primer》,Stanley B.Lippman,候捷译,华中科技大学出版社:没有买Lippman的《C++ Primer》,终于在这里给予了补偿。但是遗憾的是总是觉得Lippman的这本书远远没有想象中的经典,或许一个人期望越高,失望就会越大。也可能是看的时候因为有不少的OO、C#本身的基础,而最后和自己的收益期望有所差别,鉴于以上原因,这里不妄加推荐,当然也不敢妄加评论。
[3]《Windows Forms 程序设计》(Windows Froms Programming in C#),Chris Sells,荣耀、蒋贤哲译,人民有点出版社:一直认为MFC确实是一个非常了不起的设计框架,虽然很多人弊病其冗余的垃圾代码、复杂的文档/视图结构以及不如RAD开发平台的快速入门和快速构建。MFC中使用文档视图结构可以很简单就构建一个简单的编辑系统,但是你却很不容易才可以构建一个MIS系统(使用Doc/View结构你得面对一大批得冗余代码和信息,并且很不好实现界面的转换,并且如果不是有个很长一段时间的VC开发很难胜任和上手;使用基于Dialog的结构进行开发则会被Dialog的限制给整个体无完肤(大小自由拉动、菜单、工具栏、状态栏等你都得重头再来或是使用别人的代码)),于是做这种开发我们很容易地想到要转到Delphi、VB或是C++ Builder这样的RAD开发工具。这里的Windows Forms给我们带来了福音,Windows Forms正是补充了MFC中的Dialog的缺点,结合Delphi等的经验而成的开发Windows 桌面应用程序的开发利器。如果你是MFC开发人员,想网.NET开发转变,又要做桌面的开发,这本书就是给你的必读作品。当然你要通过这本书进入.NET的开发也是一个非常好的入门读物(因为Windows Forms开发入门门槛不来就不高)。强烈推荐阅读!
【底层研究与编译器】
[1]《深入研究计算机系统(Computer Systems:A Programmer's Perspective)》,Randal E.Bryant & David O'Hallaron,中国电力出版社:这本书并不适合每个人去读,因为相对来说比较底层。我一直认为,无论你做的那个层面上开发,只要你做的Programming方面的工作,都应该对底层的东西有所了解。去年去参加候捷先生的一个讲座,其中有一位同学的提问我至今还是印象很深刻,大意是:我们现在处的学习氛围是一个很好的阶段,但是同时也是非常尴尬的一个境地。虽然目前众多的语言、平台尽力去屏蔽掉了一切的底层的细节(从C/C++到Java/.Net等),使得我们学习的机会和成本大为降低,这和以前(特别是80年代甚至以前)的学习者比起来(那个时候一般的程序员要遵循的学习路线是:汇编(甚至有机器代码)->C—>C++->Windows 程序设计(SDK),MFC,Java,.Net),因为这些技术是随着他们的学习而出现的,也就使得他们的学习曲线是一个平滑的曲线,而现在绝大多数人的学习曲线是一个陡峭的折线:一下子就到达目前最为前言的技术风口。虽然没有必要去遵循以前的那样一个学习的曲线(成本太大),但是如果对一些底层的东西最好还是能够比较了教。就比如说汇编语言,可能你一辈子都不会使用汇编语言去开发一个系统,但是至少你要能够读懂汇编代码,至少你能够在Debug的时候透过汇编代码找到错误的所在,或者是为了性能优化嵌入一些小的汇编代码片断。这本书则提供了这样一个“桥梁”:他把计算机的系统结构、C语言、汇编、操作系统的相关知识有机地结合在一起了,从一个程序员的角度去审视计算机,告诉你你的程序是怎么被编译、装载和运行。当然这本书并不是适合大多数人,因为时间和定位的不同决定了学习的过程和内容,建议希望对底层比较了解,并且时间比较充沛(例如大三的时候),好好研习本书,定会受益不浅。本书的作者Randal E.Bryant 是卡耐基梅隆大学计算机科学的主任教授和计算机学院院长,而卡耐基梅隆在我眼里一直是怀着敬畏的心情看待的。我曾做过编译器,感觉这本书里面的内容讲的确实是比较到位(不过我没有时间去看完,85rmd的书也就看了一部分,惭愧:)),推荐大三的基础比较好的能够阅读。
【算法与数据结构】
[1]《算法I~IV(C+++实现)——基础、数据结构、排序和搜索》(第三版),Robert Sedgewick,张铭泽译,中国电力出版社:这是我目前看过的将数据结构和算法中的最好的书籍。作者Robert Sedgewick是算法宗师、计算机大师Donald E.Knuth的高徒。Donald E.Knuth是我崇拜的计算机大师之一,不仅仅因为他的学术渊博,还有就是他做事情的风格(他为了写《The Art of Programming》辞掉了在Stanford的教授职位,只担任斯坦福大学计算机程序设计艺术的荣誉退休教授。这里有一个连接http://www.kaiyuan.de/forum/lofiversion/index.php/t15802.html,感兴趣的可以继续:)),Bill Gates就曾经说如果有谁读完了《The The Art of Programming》可以直接给他发简历(确实,我曾经鼓起勇气从第三卷看起,最好还是放弃了,因为......)。Sedgewick的书的最大特色就是深入浅出,他把一个个算法(以及相关的经典问题)通过最易于理解的语言诠释的淋漓尽致,真正是大师出品、大师风范。当然这只是Sedgewick算法系列的上册,还有下册(图算法)。强烈推荐阅读。
[2]《编程珠玑》, Jon Bentley,谢君英译,中国电力出版社:这本书的英文名字叫《Programming Pearls》,编程中积累下来的珍珠,当然宝贵。关于这本书的评论网上到处都可以找到,但是这本书薄薄的纸张竟是涵蕴着无尽的宝藏:从封底计算、经典的查找、排序算法(二分查找、堆排序等)、程序性能估算(Profile)、调试(Assert宏)等都是编程中的Pearls。强烈建议要换工作、或者要找工作的好好研读,因为笔试和面试中经常就是这里面的内容,当然开发者也必备,因为可能就是因为里面一些算法的启示给我们驱走了程序实现中的郁闷。
【OOA/D(设计与思想)】
[1]《设计模式:可复用面向对象软件的基础》,GoF,李英军等译,机械工业出版社:设计模式中的圣经,面向对象书籍中的经典。虽然GoF在前言就一再声明他们写的这本书不是介绍面向对象技术或设计的书,但是我一直认为(Utill Now),就像GoF在其第一章引言中说的:学习设计模式可以帮助学习面向对象,而我的观点更加深入:只有真正理解了设计模式,才知道什么叫面向对象分析与设计【1】。【1】是我在经历了理解设计模式前后做的系统的比较得出的,并非个人的一时冲动的论断,在看了GoF的这本圣经n遍,并实际编写一遍23中设计模式的实现,思考并在实际系统设计和开发中适当运用设计模式后,我只能说慢慢地对面向对象的分析和设计有一些感觉和体会了。GoF在这本书中给常见的设计模式分为创建型、结构型和行为模式共23种,这些也就构成了当前软件界通用的设计模式的代名词。这本书是设计模式中的圣经,但是个人觉得唯一的瑕疵就是(可能看过的都有感觉):行文比较生硬。可能是因为GoF都是Ph.D,并且主要基于Eric的博士论文,读起来对于初学者有些难度(我是鼓起n次勇气读了n次后,才慢慢体会到博士水平还是不同!)。作者也在前言中“坦白”:请记住,这不是一本读完就可以束之高阁的书。这里强烈推荐。BTW:我将个人学习和使用设计模式的经验和理解在本Blog中有一个连载(见设计模式部分),主要想就GoF的23种模式以一种更加易于理解和接受的方式展现出来,并给出了我在学习设计模式时编写的C++代码实现。
[2]《敏捷软件开发:原则、模式与实践》,Robert C.Martin,邓辉译,清华大学出版社:该书曾获得第13届Jolt大奖,Robert C.Martin自己也是软件开发界的大牛。读过这本书的人都有体会:内容和书的名字有些出入。书中虽然花了一些篇幅在讲述敏捷软件开发(Agile Software Development)的原则和实践,但是书中绝大部分的内容在讲述面向对象分析和设计(OOA/D),例如面向对象设计中的原则(单一职责SRP、开放-封闭OCP、Liskov替换LSP、依赖倒置DIP、接口隔离ISP)、设计模式(共23种,但是不是和GoF的23种设计模式全部相同)以及UML等内容。个人觉得该书可以和《设计模式》一书结合起来读,并且是面向对象设计和分析的必读书之一。这里推荐阅读。Robert在书中的一句话或许会记一辈子:Next to My Life,Software is My Passion。
[3]《Design Patterns Explained-A New Perspective on Object-Oriented Design》(影印版),Alan Shalooway & James R.Trott,中国电力出版社:这本书我在买的时候还只有影印版,现在中文版本已有熊节翻译出版了。买这本书的时候我还对设计模式一知半解,只是看着这本书的名字比较OK就买了,实际上买回来后一开始也没有怎么看,但是在看完了GoF的《设计模式》后,我再把这本书认真看了一遍,感觉也是经典。这本书最大的特色就是实例教学,他首先对OO设计进行了简单扼要的讲述(个人认为是最好的OO教授之一,个人受益匪浅),然后选取了GoF23种设计模式中的10种进行了详细的分析:先引入问题,然后Derive相应的设计模式,这种方式最为容易理解。其中我觉得讲的最好的就是Bridge模式,分析到位、实例清晰,实在是给我理解Bridge模式给予了很大的帮助。强烈推荐大家阅读。
[4]《GoF 23种设计模式解析附C++实现源码》,k_eckel,PDF文档:这是我将自己总结的设计模式的解析的一个汇总文档,并提供了C++实现源码。旨在提供一个简单、直观的设计模式的一个解释,适合初学者学习和熟悉者研究,可以到这里获取整个文档。(2005-05-13更新)
【UML与建模】
[1]《UML精粹——标准对象建模语言简明指南》(第2版),Martin Fowler&Kendall Scott, 徐家福,清华大学出版社:Martin Fowler在软件界的威名大家是有目共睹的,Martin Fowler是架构、企业构架、设计模式等方面的大师,他的《分析模式》是商业层面的《设计模式》经典,他的另外一本书《Refactoring》则树立了Martin在XP(极限编程》中宗师级的地位。《UML精粹》也正是吧UML的精粹部分展现了我们面前,我们知道UML是咱们做软件必须要熟练掌握的建模语言(不然怎么和别人交流?!),但是我个人觉得学习UML的是枯燥的,且不说别的,就是UML中的那9类图都够咱们郁闷的(尽管不是每种都很常见和常用)。我也正是通过这本书慢慢地去熟悉、适应、使用UML,本书也是面向对象思想(OO)学习的经典,你可以从这本书中学习到很多的OO的思想和原则。唯一美中不足的就是:个人对翻译的徐家福老先生翻译的笔风不是很称,很多的名次和现在的表达有一些出入,也让人有时候觉得很是费解。anyway,强烈推荐大家阅读。
[2]《使用UML—关于对象和组件软件工程》,Perdita Stevens & Rob Pooley,包晓露译,人民邮电出版社:这本书虽非出自大师级的高手,但是个人觉得这本书是非常好的面向对象思想和UML学习的教材。就像本书最开始就讲到:面向对象的3块基石(封装、继承、多态)中封装的本质就是高内聚(Cohesion),多态的本质就是低耦合(Coupling),这是我看过讲面向对象理论最为简洁、本质的论断,也带给了我莫大的思考。这本书还有一个特点就是适合个人学习,因为该书的组织是按照教学的进度安排,还设计由讨论和问答,非常适合OO思想入门和UML使用入门。推荐阅读。
【软件过程管理】
[1]《人月神话》,Frederick P. Brooks,Jr,UMLChina翻译组 汪颖译,清华大学出版社:排在这个位置的一定是这本《人月神话》,我个人觉得这本书本身就是一个神话,它的经典、它所诠释的软件开发的精神、软件过程的艺术,使得该书畅销了20年经久不衰,让人不得不认同这样的一种神话。Brooks获得1999年的图灵奖,他在1986年发表的论文《没有银弹:软件工程的根本和次要问题》,让“没有银弹”的软件领域的“定理”成立20年,可能还不知道要成立多久。《人月神话》是关于人和团队的书,强烈推荐阅读。
[2]《敏捷迭代开发:管理者指南》,Craig Larman,张晓坤译,中国电力出版社:Craig Larman是面向对象、模式、迭代开发等领域广为人知的世界级专家,他的那本《UML和模式应用》被Martin Fowler推崇为:“人们常常问我,哪本书是引领他们迈入 OO 设计殿堂的最佳著作。自从幸获 Craig 的《UML和模式应用》,它就成为了我的倾力之荐。” Craig Larman在这本书中讲述了四种著名的迭代方法(Scrum、XP、UP、Evo)的关键实践,并就敏捷和迭代开发中的实际问题给出了建议和实践经验。Craig Larman维护了一个中文网站:http://www.craiglarman.cn/。我个人比较推崇敏捷软件开发,虽然很难说得其要领,但是还是觉得在当前得这样一个软件开发环境里敏捷迭代的思想还是值得咱们好好推究和实践的。
【持续更新中.....................】
经常被人问及该读何书、从何入门、如何深究,因此给出这个Book Lists。list中的书基本都是我所读过,并以为经典,当作我的一个读书总结,也可作为大家学习之参考。
我的学习历程还在行进,我的读书之路也在继续,因此这个book lists也在【持续更新中.....................】
—— 题记
k_eckel's book lists
【语言和平台】
【C/C++】
[1]《C陷阱与缺陷》,Andrew Koenig,高巍译,人民邮电出版社:如果让我推荐一本关于C深入学习和研究的书,那一定会是《C陷阱与缺陷》。第一看这100多个Page的书,感觉不过如此(少年轻狂:)),第二次看是自己做了一个编译器后,带来就是震撼,再一次看的时候就是恐惧——Andrew Koenig的这本书出版14年来,在全世界内重印了18次,并且从第3次后就一个字都没有改变!如果你想知道编译过程对程序设计的影响,如果你想检验自己对底层的把握力度,强烈建议你读读这本书。
[2]《C++编程思想》(第二版),Bruce Eckel,机械工业出版社:Bruce Eckel的《Thinking in C++》和Stanley B.Lippman的《C++ Primer》是C++从新手到进阶的必备书籍,当然个人认为两本中取一本研读即可。我选择的是《Thinking in C++》,原因是觉得《C++ Primer》实在是太厚了(:)实际上绝对全面,我后来还是在不少地方要参考Lipman的书)。《Thinking In ×××》风格甚至是书名都成为了Bruce的“专利”,后来的《Java编程思想》(第二版,目前已经有了英文的第三版),以及《Thinking In C#》(目前还没有中文版,并且该书是和Larry O'Brien合作。),都是经典中的经典,强烈推荐阅读。
[3]《Effective C++中文版》(2nd Edition),Scott Meyers,候捷译,华中科技大学出版社:对于这本书,我认为任何想把C++学好,想用C++做项目开发的都应该好好研读本书。孟岩在该书的印介中如是说:“曾经在网络讨论组中间看到这样的说法,C++程序员可以分成两类,读过Effective C++的和没读过的。”个人认为,《Effective C++》将面向对象的思想和原则与软件设计、C++开发很好地结合在一起,达到了一种完美统一的境界:你在学习C++技术(以原则条款的方式给出)的同时,OO思想得到了升华和提高。纯粹的OO思想的学习会略显得枯燥和无味,但是以为使用、掌握了一门用于面向对象系统开发语言便以为懂得了OO的开发与设计(OO的精华)则会显得多么的无知和轻浮。如果大家想真正体验OO设计开发、享受C++的强大与精髓,请读《Effective C++》。
[4]《More Effective C++中文版》,Scott Meyers,候捷译,中国电力出版社:《Effective C++》的完美续集。
[5]《C++沉思录》,Andrew Koenig & Barbara Moo,黄晓春译,人民邮电出版社:这本书的英文名字叫:Ruminations on C++:A Dacade of Programming Insight and Experience,十年程序设计的真知灼见。Andrew Koenig夫妇是世界上著名的C++大师级人物,并且他们也堪称C++领域的“第一神仙眷属”,看看他们在AT&T曾经做过的事情,你就没有办法不去承认这样的书名实在是实至名归,用起来也当之无愧。而Barbara Moo则更是C++领域的女中豪杰。读这本书实在是和无意中的机缘巧合读了Andrew的《C Traps and Pitfalls》,感叹崇拜之余,则买了这本《C++ 沉思录》,该书的特点一是适合学习(教学型的讲解方式),而是适合练习(书中给出了很多的实际的例子进行分析和讲授,甚至包括一个简单的string的库),怪不得C++之父Bjarne Stroustrup如是推荐:对于C++是什么样的以及能够作些什么,他们的先见之明在这本书中随处可见。他们另外一本书《Accelerate C++》也是C++学习中的经典。
[6]《C++程序设计语言》(特别版),Bjarne Stroustrup,机械工业出版社:如果您在学习或使用C++语言,但是没有上过Bjarne Stroustrup的网站,建议您登录:http://www.research.att.com/~bs/homepage.html。让我记忆最为深刻的不是Bjarne Stroustrup有型的照片(工作),而是照片下的第4行话:I designed and implemented the C++ programming language.因为这句话世界上就Bjarne Stroustrup有资格如是说。之于Bjarne Stroustrup本人不劳我多言,之于这本书,大家都知道Bjarne Stroustrup的风格就是有些教条化,别人也称之为“学院派”,可能读起来比较不是那么上口,我个人也就是有一本e文的影印版本,实话说也没有真正系统读完过,但是有时候还是在里面查阅了不少知识。不推荐作为入门的书籍,但是建议收藏,至少也是对Bjarne Stroustrup这位给我们带来C++语言的大师的敬畏和敬意。
[7]《深度探索C++面向对象模型》,Stanley B.Lippman,候捷译,华中科技大学出版社:对于Stanley B.Lippman本应该好好介绍他的另外两本更加知名、流传也更加广泛的书《C++ Primer》和《EssentialC++》,这两本书(特别是后者)都是C++入门的好书,当然前者也是C++进阶、研习的最好书籍之一。无奈前者我没有买过,只是在学习和开发中参考、查阅过(电子版本倒是有收藏),而后者则只是初略看过一遍,不好妄加评论。而这本《深度探索C++面向对象模型》我则收藏了,原因有二:一是我对底层实现比较感兴趣,二是冲着Lipmman的大名,而我自己也在实现一个比C++简单很多的一种学习语言的编译器(一些介绍:http://www.mscenter.edu.cn/blog/k_eckel/category/384.html)。在《深度》中,Lippman就自己当年在AT&T实现CFront编译器的实际经验总结、分析了C++的对象组织模型、函数模型,C++中多态的实现机制(virtual table的组织)等。这是一本研究的书籍,如果你对C++的使用已经比较自信,但是对底层实现很感兴趣,这本书则正是你梦寐以求的经典。Stanley B.Lippman的个人主页:http://staff.develop.com/slip 。我也发现一般大师的主页都很简约、简洁,无论是Knuth,还是诸如Bruce Eckel、Bjarne Stroustrup还是这里的Lippman都一样。大家对Lippman的最近的印象应该比较的熟悉,Lippman现在是Microsoft C++/CLI的总架构师,专门负责将传统C++移植到.Net平台上,前一段时间因为需要曾经花了一段时间研习过C++/CLI,个人觉得虽然比起丑陋的Managed C++,C++/CLI要elegant不少,但是给Managed C++善后却不是那么的容易,给Lippman +U,也期望C++/CLI走好!
[8]《C++程序设计教程》,钱能,清华大学出版社:之所以这里列出钱能老师《C++程序设计教程》主要是因为个人认为在国内写C++方面的书中就钱老师的书最有份量,我姑且不敢将钱老师的书和上面提到的大师们的经典比较,但是在国内这样一个浮躁的环境中,钱老师的书也确实给了我不少的希望和期望。大家可能也注意到了,国外大师们的书上都是著名×××著,而国内大部分则是×××编著,不读研不知道编与著的区别,现在才知道编和著真的可以说是差之毫厘、谬以千里。《C++程序设计教程》实在可以作为C到C++学习的一个预科读物,推荐大家想学C++但是基础不是很好的研读之。
【Windows程序设计/VC/MFC】
[1]《WINDOWS程序设计》(上、下),Charles Petzold,清华大学出版社:这本书是Windows编程领域的“圣经”,无法描述其在Windows程序设计领域的影响和功效。而Charles Petzold则是作为仅有的七个人之一(并且是唯一的作家)被《Window Magazine》和Microsoft公司授予Windows Pioneer奖,以表彰他对 Microsoft Windows的成功做出的贡献。之于这本书遗憾有二,一是价格不菲(上下两册一共160RMB,就算打个八折也还是......),二也是最重要的,现在业界实在是比较浮躁,于是我们也跟着要浮躁,很少有人能够真正静下心来去研习诸如windows程序设计的基本知识,去在没有VC生成的一大堆的MFC垃圾代码的情况下就写写windows程序了。企业和公司要求的就是一堆的会拖拉点击的熟练的操作人员,他们需要的是能够立即能够带来商业利益的代码工人,尽管他们也说要求技术功底的深厚。绝大多数的VC程序员都是在完全没有过windows程序设计经验就去被教着使用MFC进行桌面系统的开发。Java、.Net需要我们学习和熟悉的地方太多了,以至于我们无法安静下来好好去把内功练到本该具备的级别就要上战场冲锋陷阵了。实际上我也是这般,虽然我看了这本书的绝大部分的内容,也用记事本写了一些简单的windows程序,从WINMAIN写起,注册窗口、创建、显示、消息循环,然后WinProc的实现,但是我也没有胆量说我对windows程序设计已可以和像使用C++/Java那样熟练。实际上可能是否要在学习使用VC等之前一定要把windows程序设计非常深入的观点也值得商榷,个人看法是:熟悉windows编程,机制、过程,做一些简单的练习,然后在基于MFC开发过程中对出现的问题在去参考这方面的资料,再去解决相关的问题(可能要用到windows程序设计中的本质东西)。我便是这般。因此建议大家能够阅读。
[2]《深入浅出MFC》,候捷著,华中科技大学出版社:这本书也不是一本浮躁人看的书,个人认为也不太适合于初学者看。个人有一个看法,如果把VC/MFC程序设计的学习像学习一门语言(例如C++/Java)那样学习,就在某种程序上理错了方向。像这种和开发应用联系最为紧密的开发平台的学习应该是一个解决问题的学习过程,这个意思就是当你遇到一个实际开发中的问题的时候,你可以去查阅相关的API、search相关的解决方案,然后解决问题就是了。因此这本书不是作为VC /MFC入门的书籍,VC/MFC的入门我觉得直接到书店找一本这方面的书(大部分都是内容差不多,因为基本是大家互相copy的:)),然后去把书中的例子实现一下,积累对VC开发的感性认识,也满足一下自己的虚荣心。然后可以参看这本《深入浅出MFC》去理解为什么你的程序要那样编写,为什么可以那样实现,怎样才可以在MFC的大网中自由发挥。书中讲消息传递、运作机理最为深入浅出,而对于Doc/View结构却并不是最好的讲述(尽管已经很好了,因为我曾在网上看到过一篇专门讲Doc/View的Document,个人认为最为深入浅出)。强烈推荐大家阅读。顺便一提的是,候捷老师是我个人极为推崇的国内的技术专家和作家,无论是他写的这本书,还是他翻译那些大师的作品,都极为精致,实在是精品和经典。候捷老师本人我和他也算是有一面之缘:2004年10月24日,候捷老师到大陆讲学,其中一站就是同城的华中科技大学,华中科技大学微软俱乐部组织了候捷老师与您工话IT人生活动,也邀请了我们这边俱乐部参与(就算没有邀请,我也一定会去的,呵呵),活动完毕和候捷老师有过一个简单的交谈并留影纪念(遗憾的是照片由于某些原因一直没有找到,深以为憾。)。我在http://www.mscenter.edu.cn/blog/k_eckel/archive/2005/04/15/1426.html中曾经记录了这件事情。
【JAVA】
[1]《Effective Java中文版》,Joshua Bloch,潘爱民译,机械工业出版社:Joshua Bloch是Java社区第一号精神领袖(但是已离开Sun供职Google,郁闷ing......),该书也是Java语言领域的《Effective C++》。书中介绍了57条Java语言开发和编程中极具实用价值的经验规则和建议。揭示了该怎样产生高效、清晰和健壮的Java代码。并且本书的译者潘爱民老师也是集著、译于一身的名家,《C++ Primer》、《VC++技术内幕》(第4、6版)、《COM本质论》等也都是由潘老师翻译的,另外《COM原理与应用》则是出自潘老师的技术力作(可能现在大家对COM的了解和关注力度已经大不必从前:))。强烈推荐阅读。
[2]《Practical Java中文版》,Peter Haggar,候捷/刘永丹译,中国电力出版社:《Practical Java》是我学习Java后阅读第一本Java方面的书籍,当时也正在参与一个使用Java开发的项目,也可以说是一边学一边作项目,项目没有做完,书倒是很快就看完了:一是因为学习总是应该比需求快,而是因为这本书写的实在是很经典。《Practical Java》最大的特点就是简洁、贴近实际开发,书中提到的改善代码的68个主题都是在开发中很容易面临的问题,实在是很Practical。这本书的重点还是Java语言本身,之于面向对象的一些思想和开发理念提及的很少,而在Java的另外一本经典书籍[1]中《Effective Java》中则是集合了不少的OO的设计思想和原则。因此这本书可以作为在学习、研究Java语言本身的必备书籍,强类推荐阅读。
[3]《JUnit In Action》,Vincent Massol,鲍志云译,电子工业出版社:这本书是介绍JUnit测试优先开发的参考书,TDD(Test-Driven Development)是敏捷软件开发中的最重要原则和技术之一,而JUnit则正是这个技术的实现。JUnit则是由两位世界级的大师Erich Gamma 和Kent Beck完成的Java的单元测试的框架,Erich Gamma 是《设计模式》巨著的作者GoF中的第一位,而Kent Beck则是XP的创始人。JUnit不单是给我们提供一中非常elegant的单元测试工具,更为重要的是JUnit塑造了一种新的软件文化:Keepthe Bar Green!只要我们能够保证JUint中Bar Green,我们软件就没有问题了。《JUnit In Action》则介绍了JUnit用法,内容包括用mock objects进行隔离测试、用Cactus进行容器内测试、用Ant和Maven进行自动构建、在Eclipse内进行测试、对Java应用程序、Filter、Servlet、EJB、JSP、数据库应用程序、Taglib等进行单元测试等。这本书最大的特点就是示例驱动教学,适合初学者,很容易上手,推荐阅读。
[4]《Struts Kick Start》,James Turner & Kevin Bedell,孙勇译,电子工业出版社:
【.Net】
[1]《.NET框架精髓》,Thuan Thai & Hoang Q.Lam,王敏之,中国电力出版社:这本书是我看的第一本关于.Net方面的书籍,尽管在网络上有人说这本书的翻译不是很达意,但是个人觉得还是很不错的讲解.Net平台的入门书籍。我学东西比较偏好于行而上和行而下结合,也就是在看一种语言实现的时候我都会结合看一本讲解框架和平台概述的书,这本书也正是和《C# Primer》一起看的。我有一位给我帮助很多的师兄告诉我说:在做项目的时候一定要抬头看看架构、设计的书,看架构设计的书籍时候一定要刻意去做做实际的编码。个人觉得这本书作为.Net框架介绍性入门书籍的定位还是比较准确的,并且里面有很多的示例,比如.Net平台上的语言的无关性中作者就通过一个分别由VB.Net /C#/Managed C++编写的示例程序(交通工具),感觉是非常好的体验。书中还对诸如.Net 中的数据访问、XML等内容进行了一个概述,总体说来还是达到了我的预期期望,因此这里推荐大家作为入门级别阅读。
[2]《C# Primer》,Stanley B.Lippman,候捷译,华中科技大学出版社:没有买Lippman的《C++ Primer》,终于在这里给予了补偿。但是遗憾的是总是觉得Lippman的这本书远远没有想象中的经典,或许一个人期望越高,失望就会越大。也可能是看的时候因为有不少的OO、C#本身的基础,而最后和自己的收益期望有所差别,鉴于以上原因,这里不妄加推荐,当然也不敢妄加评论。
[3]《Windows Forms 程序设计》(Windows Froms Programming in C#),Chris Sells,荣耀、蒋贤哲译,人民有点出版社:一直认为MFC确实是一个非常了不起的设计框架,虽然很多人弊病其冗余的垃圾代码、复杂的文档/视图结构以及不如RAD开发平台的快速入门和快速构建。MFC中使用文档视图结构可以很简单就构建一个简单的编辑系统,但是你却很不容易才可以构建一个MIS系统(使用Doc/View结构你得面对一大批得冗余代码和信息,并且很不好实现界面的转换,并且如果不是有个很长一段时间的VC开发很难胜任和上手;使用基于Dialog的结构进行开发则会被Dialog的限制给整个体无完肤(大小自由拉动、菜单、工具栏、状态栏等你都得重头再来或是使用别人的代码)),于是做这种开发我们很容易地想到要转到Delphi、VB或是C++ Builder这样的RAD开发工具。这里的Windows Forms给我们带来了福音,Windows Forms正是补充了MFC中的Dialog的缺点,结合Delphi等的经验而成的开发Windows 桌面应用程序的开发利器。如果你是MFC开发人员,想网.NET开发转变,又要做桌面的开发,这本书就是给你的必读作品。当然你要通过这本书进入.NET的开发也是一个非常好的入门读物(因为Windows Forms开发入门门槛不来就不高)。强烈推荐阅读!
【底层研究与编译器】
[1]《深入研究计算机系统(Computer Systems:A Programmer's Perspective)》,Randal E.Bryant & David O'Hallaron,中国电力出版社:这本书并不适合每个人去读,因为相对来说比较底层。我一直认为,无论你做的那个层面上开发,只要你做的Programming方面的工作,都应该对底层的东西有所了解。去年去参加候捷先生的一个讲座,其中有一位同学的提问我至今还是印象很深刻,大意是:我们现在处的学习氛围是一个很好的阶段,但是同时也是非常尴尬的一个境地。虽然目前众多的语言、平台尽力去屏蔽掉了一切的底层的细节(从C/C++到Java/.Net等),使得我们学习的机会和成本大为降低,这和以前(特别是80年代甚至以前)的学习者比起来(那个时候一般的程序员要遵循的学习路线是:汇编(甚至有机器代码)->C—>C++->Windows 程序设计(SDK),MFC,Java,.Net),因为这些技术是随着他们的学习而出现的,也就使得他们的学习曲线是一个平滑的曲线,而现在绝大多数人的学习曲线是一个陡峭的折线:一下子就到达目前最为前言的技术风口。虽然没有必要去遵循以前的那样一个学习的曲线(成本太大),但是如果对一些底层的东西最好还是能够比较了教。就比如说汇编语言,可能你一辈子都不会使用汇编语言去开发一个系统,但是至少你要能够读懂汇编代码,至少你能够在Debug的时候透过汇编代码找到错误的所在,或者是为了性能优化嵌入一些小的汇编代码片断。这本书则提供了这样一个“桥梁”:他把计算机的系统结构、C语言、汇编、操作系统的相关知识有机地结合在一起了,从一个程序员的角度去审视计算机,告诉你你的程序是怎么被编译、装载和运行。当然这本书并不是适合大多数人,因为时间和定位的不同决定了学习的过程和内容,建议希望对底层比较了解,并且时间比较充沛(例如大三的时候),好好研习本书,定会受益不浅。本书的作者Randal E.Bryant 是卡耐基梅隆大学计算机科学的主任教授和计算机学院院长,而卡耐基梅隆在我眼里一直是怀着敬畏的心情看待的。我曾做过编译器,感觉这本书里面的内容讲的确实是比较到位(不过我没有时间去看完,85rmd的书也就看了一部分,惭愧:)),推荐大三的基础比较好的能够阅读。
【算法与数据结构】
[1]《算法I~IV(C+++实现)——基础、数据结构、排序和搜索》(第三版),Robert Sedgewick,张铭泽译,中国电力出版社:这是我目前看过的将数据结构和算法中的最好的书籍。作者Robert Sedgewick是算法宗师、计算机大师Donald E.Knuth的高徒。Donald E.Knuth是我崇拜的计算机大师之一,不仅仅因为他的学术渊博,还有就是他做事情的风格(他为了写《The Art of Programming》辞掉了在Stanford的教授职位,只担任斯坦福大学计算机程序设计艺术的荣誉退休教授。这里有一个连接http://www.kaiyuan.de/forum/lofiversion/index.php/t15802.html,感兴趣的可以继续:)),Bill Gates就曾经说如果有谁读完了《The The Art of Programming》可以直接给他发简历(确实,我曾经鼓起勇气从第三卷看起,最好还是放弃了,因为......)。Sedgewick的书的最大特色就是深入浅出,他把一个个算法(以及相关的经典问题)通过最易于理解的语言诠释的淋漓尽致,真正是大师出品、大师风范。当然这只是Sedgewick算法系列的上册,还有下册(图算法)。强烈推荐阅读。
[2]《编程珠玑》, Jon Bentley,谢君英译,中国电力出版社:这本书的英文名字叫《Programming Pearls》,编程中积累下来的珍珠,当然宝贵。关于这本书的评论网上到处都可以找到,但是这本书薄薄的纸张竟是涵蕴着无尽的宝藏:从封底计算、经典的查找、排序算法(二分查找、堆排序等)、程序性能估算(Profile)、调试(Assert宏)等都是编程中的Pearls。强烈建议要换工作、或者要找工作的好好研读,因为笔试和面试中经常就是这里面的内容,当然开发者也必备,因为可能就是因为里面一些算法的启示给我们驱走了程序实现中的郁闷。
【OOA/D(设计与思想)】
[1]《设计模式:可复用面向对象软件的基础》,GoF,李英军等译,机械工业出版社:设计模式中的圣经,面向对象书籍中的经典。虽然GoF在前言就一再声明他们写的这本书不是介绍面向对象技术或设计的书,但是我一直认为(Utill Now),就像GoF在其第一章引言中说的:学习设计模式可以帮助学习面向对象,而我的观点更加深入:只有真正理解了设计模式,才知道什么叫面向对象分析与设计【1】。【1】是我在经历了理解设计模式前后做的系统的比较得出的,并非个人的一时冲动的论断,在看了GoF的这本圣经n遍,并实际编写一遍23中设计模式的实现,思考并在实际系统设计和开发中适当运用设计模式后,我只能说慢慢地对面向对象的分析和设计有一些感觉和体会了。GoF在这本书中给常见的设计模式分为创建型、结构型和行为模式共23种,这些也就构成了当前软件界通用的设计模式的代名词。这本书是设计模式中的圣经,但是个人觉得唯一的瑕疵就是(可能看过的都有感觉):行文比较生硬。可能是因为GoF都是Ph.D,并且主要基于Eric的博士论文,读起来对于初学者有些难度(我是鼓起n次勇气读了n次后,才慢慢体会到博士水平还是不同!)。作者也在前言中“坦白”:请记住,这不是一本读完就可以束之高阁的书。这里强烈推荐。BTW:我将个人学习和使用设计模式的经验和理解在本Blog中有一个连载(见设计模式部分),主要想就GoF的23种模式以一种更加易于理解和接受的方式展现出来,并给出了我在学习设计模式时编写的C++代码实现。
[2]《敏捷软件开发:原则、模式与实践》,Robert C.Martin,邓辉译,清华大学出版社:该书曾获得第13届Jolt大奖,Robert C.Martin自己也是软件开发界的大牛。读过这本书的人都有体会:内容和书的名字有些出入。书中虽然花了一些篇幅在讲述敏捷软件开发(Agile Software Development)的原则和实践,但是书中绝大部分的内容在讲述面向对象分析和设计(OOA/D),例如面向对象设计中的原则(单一职责SRP、开放-封闭OCP、Liskov替换LSP、依赖倒置DIP、接口隔离ISP)、设计模式(共23种,但是不是和GoF的23种设计模式全部相同)以及UML等内容。个人觉得该书可以和《设计模式》一书结合起来读,并且是面向对象设计和分析的必读书之一。这里推荐阅读。Robert在书中的一句话或许会记一辈子:Next to My Life,Software is My Passion。
[3]《Design Patterns Explained-A New Perspective on Object-Oriented Design》(影印版),Alan Shalooway & James R.Trott,中国电力出版社:这本书我在买的时候还只有影印版,现在中文版本已有熊节翻译出版了。买这本书的时候我还对设计模式一知半解,只是看着这本书的名字比较OK就买了,实际上买回来后一开始也没有怎么看,但是在看完了GoF的《设计模式》后,我再把这本书认真看了一遍,感觉也是经典。这本书最大的特色就是实例教学,他首先对OO设计进行了简单扼要的讲述(个人认为是最好的OO教授之一,个人受益匪浅),然后选取了GoF23种设计模式中的10种进行了详细的分析:先引入问题,然后Derive相应的设计模式,这种方式最为容易理解。其中我觉得讲的最好的就是Bridge模式,分析到位、实例清晰,实在是给我理解Bridge模式给予了很大的帮助。强烈推荐大家阅读。
[4]《GoF 23种设计模式解析附C++实现源码》,k_eckel,PDF文档:这是我将自己总结的设计模式的解析的一个汇总文档,并提供了C++实现源码。旨在提供一个简单、直观的设计模式的一个解释,适合初学者学习和熟悉者研究,可以到这里获取整个文档。(2005-05-13更新)
【UML与建模】
[1]《UML精粹——标准对象建模语言简明指南》(第2版),Martin Fowler&Kendall Scott, 徐家福,清华大学出版社:Martin Fowler在软件界的威名大家是有目共睹的,Martin Fowler是架构、企业构架、设计模式等方面的大师,他的《分析模式》是商业层面的《设计模式》经典,他的另外一本书《Refactoring》则树立了Martin在XP(极限编程》中宗师级的地位。《UML精粹》也正是吧UML的精粹部分展现了我们面前,我们知道UML是咱们做软件必须要熟练掌握的建模语言(不然怎么和别人交流?!),但是我个人觉得学习UML的是枯燥的,且不说别的,就是UML中的那9类图都够咱们郁闷的(尽管不是每种都很常见和常用)。我也正是通过这本书慢慢地去熟悉、适应、使用UML,本书也是面向对象思想(OO)学习的经典,你可以从这本书中学习到很多的OO的思想和原则。唯一美中不足的就是:个人对翻译的徐家福老先生翻译的笔风不是很称,很多的名次和现在的表达有一些出入,也让人有时候觉得很是费解。anyway,强烈推荐大家阅读。
[2]《使用UML—关于对象和组件软件工程》,Perdita Stevens & Rob Pooley,包晓露译,人民邮电出版社:这本书虽非出自大师级的高手,但是个人觉得这本书是非常好的面向对象思想和UML学习的教材。就像本书最开始就讲到:面向对象的3块基石(封装、继承、多态)中封装的本质就是高内聚(Cohesion),多态的本质就是低耦合(Coupling),这是我看过讲面向对象理论最为简洁、本质的论断,也带给了我莫大的思考。这本书还有一个特点就是适合个人学习,因为该书的组织是按照教学的进度安排,还设计由讨论和问答,非常适合OO思想入门和UML使用入门。推荐阅读。
【软件过程管理】
[1]《人月神话》,Frederick P. Brooks,Jr,UMLChina翻译组 汪颖译,清华大学出版社:排在这个位置的一定是这本《人月神话》,我个人觉得这本书本身就是一个神话,它的经典、它所诠释的软件开发的精神、软件过程的艺术,使得该书畅销了20年经久不衰,让人不得不认同这样的一种神话。Brooks获得1999年的图灵奖,他在1986年发表的论文《没有银弹:软件工程的根本和次要问题》,让“没有银弹”的软件领域的“定理”成立20年,可能还不知道要成立多久。《人月神话》是关于人和团队的书,强烈推荐阅读。
[2]《敏捷迭代开发:管理者指南》,Craig Larman,张晓坤译,中国电力出版社:Craig Larman是面向对象、模式、迭代开发等领域广为人知的世界级专家,他的那本《UML和模式应用》被Martin Fowler推崇为:“人们常常问我,哪本书是引领他们迈入 OO 设计殿堂的最佳著作。自从幸获 Craig 的《UML和模式应用》,它就成为了我的倾力之荐。” Craig Larman在这本书中讲述了四种著名的迭代方法(Scrum、XP、UP、Evo)的关键实践,并就敏捷和迭代开发中的实际问题给出了建议和实践经验。Craig Larman维护了一个中文网站:http://www.craiglarman.cn/。我个人比较推崇敏捷软件开发,虽然很难说得其要领,但是还是觉得在当前得这样一个软件开发环境里敏捷迭代的思想还是值得咱们好好推究和实践的。
【持续更新中.....................】