品好书

  • Post author:
  • Post category:其他



http://blog.donews.com/xzwenlan/archive/category/璇讳功绗旇/page/6


读者zhanghx6986有周六逛书店的习惯,这次书店之行依然收获颇丰,看看他品读《程序员修炼之道》之后有什么感悟吧。


[ 查看本指南所提及的书籍 ]




本人一向有周六逛书店的习惯,今天也不例外。今天高兴的是在看书的时候有一个漂亮MM坐在我旁边^_^,更兴奋的是今天发现的这本好书《


程序员修炼之道


》,这本书其实我早就听说过,但是碍于时间的关系,一直没有读该书的原版(《


程序员修炼之道(影印版)


》),今天发现了这本书的译本,着实让我高兴了一番!

忍着饥肠辘辘,在书店一口气读完了该书的第一章,读完后,只能用一个字形容我当时的心情,“爽”。对该书的两位作者产生了由衷的敬佩。

第一章中我认为最经典的就是下面这些句子了:

关于破窗户理论:一扇破窗户,只要有那么一段时间不修理,就会渐渐的给建筑的居民带来一种废弃感- -种职权部门不关心这座建筑的感觉。于是又一扇窗户破了。人们开始乱扔垃圾。出现了乱涂乱画。严重的结构损坏开始了。在相对较短的一段时间里,建筑的损毁得超出了业主愿意修理的程度,而废弃感变成了现实。

作者针对该理论引申出了软件中的“破窗户”,一个良好的软件系统,一旦出现了破窗户,如果不及时的修理,那么该软件系统就会迅速的腐烂、恶化。

关于这一点,我还是有一定的感触,我们部门的一个产品在持续到1.X版本的时候,已经到了无法维护的地步了,出了BUG,几乎无法在定位了,这就是“破窗户”效应。好在部门及时开发了该产品的2.X版本,该版本产品的设计和编码都是全新的,但是随着该版本在市场上将近一年半的摸爬滚打,面对客户无穷无尽的需求,该版本也开始出现了“破窗户”,曾几何时,我也产生了这样的想法“这些代码的其余部分也是垃圾,我只有照着做就行了”。多么可怕的想法,“破窗户”效应正发生在我的身上。我觉得是时候开始修复那些“破窗户”了,让我们的代码变得干净漂亮。就像该书里提到的那个“灭火”例子一样,一个干净、整洁的软件系统,你会格外注意不要把它弄脏。

在有就是书里提到的那个“石头汤”的例子,这个例子和我,还有我一个同事的想法不谋而和。当你觉得一个东西非常好,可以在项目里使用的时候,你向大家推荐这个东西,然而大家对待这个东西却是非常的木然,这个东西显然没有引起大家的兴趣,而我那个同事就会抱怨:“这群家伙怎么这样,和他们提出新东西,新想法简直浪费!”。后来,我们两个聊天一致认为,我们的方式本身有问题,我们应该先做出一个小的像样的东西,然后在向大家推荐这个东西,这样能激起大家足够的兴趣。就象该书里说得那样:让他们大吃一惊,然后说:“要是我们增加。。。。可能就会更好”。

我和那个同事,都有把自己掌握的知识分享给其他同事的习惯,经常在部门里组织一些培训。但是交流效果一直不是非常理想,我那个同事就会抱怨“其他同事对这个东西进行发问的时候,总是问不到点子上,接受新东西能力差”。但是,反过来,我们培训的方式本身是不是有问题那,我们有没有了解我们的听众。你想让他们学到什么?他们对你讲的什么感兴趣?他们有多富有经验?他们想要多少细节?你想要让谁拥有这些信息?你如何促使他们听你说话?这些个问号,我们在培训开始前确实没有认真考虑过,就象我前一段给部门做的一个《ACE和多线程技术》培训时候,参加这个培训有一些做JAVA的同事,当我培训的时候,一口一个POSIX标准的时候,我全然不知他们不太知道什么是POSIX标准,到后来终于一个同事问了什么是POSIX标准的时候,我才恍然大悟,原来这些东西他们不太了解,这就是培训方法的问题。培训、交流、演讲确实是一门学问,一个好的交流或培训,即使持续了好长时间,大家依然全神在听,否则很多人要不了一会就开始“神游”了;一个好的将军,在战斗打响前的演说成功与否,可能直接影响着这场战役的胜败!

在有就是E-mail交流问题,我们的一个女同事,由于工作上的职务关系,要经常给整个部门的同事群发邮件,但是几乎很少能得到回复,她因此很是伤心^_^,我为了开导她,给她讲了什么是“大众冷漠”现象,一个强盗在很多人的大街上打劫,但是大家没人去阻止这件事情,就是因为阻止这个强盗的责任平均分摊到了很多人头上,那么每个人都认为这不是我的责任。但是,能及时的回复其他人的邮件,确实是一种礼貌的行为,就象书里说得哪样,即使内容只是“我稍后回复你”。我也曾经因为其他人没有及时回复我的邮件,而大发脾气^_^。

今天,确实是收获颇丰的一天,《


程序员修炼之道


》仅仅第一章就给了我这么多感触,我想我接着读下去,会激出更多的思想上的火花,我拭目以待。。。。



旁征博引的方法是高效的学习手段。对待一个事物的看法不能仅仅站在一个角度去衡量,集思广益才可以更加深刻和全面。这里收集和整理大家的看法,希望可以激发更多的思考和探讨。


[ 查看本指南所提及的书籍 ]




在今天的环境下如何对待风险?作家、风险管理专家Bob Charette提出了一种全新的思路。他建议读者把自己的企业和竞争对手看成一组向下的自动扶梯,你必须奋力跑到扶梯的顶端,你的竞争对手也在他们各自的扶梯上做着同样的事。扶梯运转得越快,你就必须跑得越快,才能让自己保持在原来的位置。如果你停下脚步,哪怕只是一小会,就会落于下风。当然,如果你停得太久,就会掉到扶梯的底端,丧失竞争的资格。

在Chartte设想的扶梯世界里,新的竞争者是从扶梯中间进入的。也就是说,如果你下落,新到的竞争者就会出现在你的前面。

在每部扶梯的顶端有一个控制杆,可以用来控制所有扶梯的速度。如果你第一个到达控制杆那里,就说明你比所有竞争对手更优秀,所以你就可以提高扶梯运转的速度,使自己保持在顶端,而让竞争对手无法跟上你的脚步。

为扶梯加速的“控制杆”就是风险。如果不敢承担风险,竞争对手就会把你的势力范围看作唾手可得的美味佳馐。在这个时代,敢于承担风险的人才会赢得回报,逃避风险的企业只会成为竞争对手瓜分的战利品。

2004年3月18日,Waltzing with Bears喜获JOLT震撼大奖。2004年3月19日,中文版《


与熊共舞:软件项目风险管理


》出版。在新书出版的这一段时间里,这本书收到了读者的广泛关注。在此,我对网上的评论进行收集和整理,以供读者参考。



国内读者对本书的赞誉



http://blogger.cn/wilson

寻找人生

今天终于把《


与熊共舞:软件项目风险管理


》看完了,除了对风险管理有了一个较为清晰的理解之外,给我留下深刻印象的就是那篇附录里面的《信仰的伦理学》。我们没有办法把信仰和思想放在阳光下审判,于是,不可避免的就会有了很多的问题被掩盖了。记得以前我曾经跟别人说绝对不骗她,但是总是会出现不能说的事情。通常采取的方法是强调非重点从而达到隐瞒的目的,这个在跟领导讲话的时候也被用来隐瞒问题。有的时候适当的隐瞒是有益的,但是更多的时候,尤其在处理问题的时候,我们需要坦诚。

http://java.blogger.cn/leeseon/posts/1869.aspx


JAVA之不求甚解


今天去逛书店,正好赶上《


与熊共舞:软件项目风险管理


》在武汉上架,自然二话不说,挑了一本,领了回来!

正如gigix所说,纸张一点都不反光,感觉是一本畅销书的派头。书店直接就进了几十本回来堆在那儿,门口还有大大的宣传牌立着。

不过一样我不喜欢腰封,所有的有腰封的我都不用的,而且书装订的的确很松散,快是有可能脱页,所以挑了好几本,才选中了一本看上去结实一点的。

看来最近几天就要开始与熊节做一次与“熊”共舞了,只是不知道他是不真的那么凶悍?

每到这个时候总会觉得尤其开心,之前的辛苦都变成了愉悦的背景——就像钱钟书曾说的,仿佛从久不穿的上衣袋里掏出了钱。

http://www.csdn.net/Develop/article/26/26749.shtm


bisonZhao





与熊共舞:软件项目风险管理


》这本书,提倡对项目风险进行量化估计,并给出了一种称为“风险图”的不确定性描述图形,来预测项目的可能完成时间。“风险图”比主观想象更直接、更科学地表明了风险的范围,使用这个工具,也更容易进行风险分析和防范。

书中,“进度安排的先天错误”被列为项目核心风险的第一条,需要引起足够重视。为了有效降低这个第一风险,我觉得有多种方法可以使用:尽量争取给项目一个比较好的外部环境,通过与用户的沟通及其他手段,为项目争取较充足的开发时间,不要一拍胸脯就把风险留给自己了;要科学估计项目执行中的风险,对人员变动、需求变更等容易引起项目延期的事情要有足够的警惕。如果时间余地比较小,要配置多一些资源,如果资源不够,可能要及早安排加班,避免犯前松后紧的毛病。软件开发过程中的问题层出不穷,你考虑多一点的风险都不一定够用,如果英雄主义情绪旺盛的话,受伤害的还是自己。项目中的其他一些风险和估计风险的办法在书里还有更多的阐述。

http://www.sinobook.com.cn/book/newsdetail.cfm?iCntno=1895


刘江





人件(第2版)


》作者的最新作品,中文版似乎也快要出来了。书很薄,100来页而已。但是已经受到了业界交口称赞,没办法,姜还是老的辣,虽然我估计DeMarco应该有很多年自己不直接从事项目开发了。Amazon上专业机构、ACM等集团购买排行榜,本书分别排在第2名和第1名。又是一本讲软件项目管理的书。Standish集团的软件项目报告都说成功率有了很大提高,为什么今年又评出这么多项目管理的书呢?

http://www.china-pub.com/computers/bbs/addsubfollow.asp?boardid=1&rootid=2&subid=51655&topicid=28614


GIGIX


这是一本软件项目风险管理的入门小书。在DeMarco眼中,我们这些软件人压根还不到大谈“风险管理技术”的时候,我们需要的是重温“风险”的定义、建立基本的风险管理意识——看看俯拾皆是的“死亡之旅”项目,我们不难接受他略带讥刺的批评。最基本的思想和做法,这是《


与熊共舞:软件项目风险管理


》给我们带来的。

或许我们还能记起《最后期限》那有趣的故事,不过你是否注意到,DeMarco在那本小说里已经暗示了他后续的写作计划。《Slack》讲述了人本主义管理的思想,《


与熊共舞:软件项目风险管理


》则是风险管理。另外值得注意的是,DeMarco这次又把CMM狠狠涮了一把,这都变成他的一贯风格了。

应该提醒你——我潜在的读者——这本书最大的亮点位于它的“附录A”:《信仰的伦理学》。不,不是因为这篇文章能给你带来多大的收获,仅仅因为它的华美。出自刘天北先生的译笔,恢弘的气势令我叹位观止。如果你只愿意在书店里翻看10分钟,然后就把这本书扔开,那么我会请求你只看这篇附录,并对你表示衷心的感谢。

http://www.blogdriver.com/showBlog.do?diaryID=98239


GIGIX


黑色的封面,样子显得很畅销,是属于那种长相好的书。内文还是闻洁工作室一贯的风格,字体给人清新愉悦的感觉。这次的宋体字是正体,长宽一样的。相比之下我更喜欢《


人月神话


》用的变体字,略微宽一点,显得比较活泼。不过那种字体也只适合于散文。微微泛黄色的蒙肯纸,完全不会反光晃眼,而且很轻(7本样书拿在手上也不觉得沉)。应该是有很好的阅读体验,不过腰封不好看。我一向不喜欢打腰封,读温伯格的书之前会先把腰封扯下来。

一个好的出版者能够让读者在第一时间爱上手中的书,并宽容地忽略很多文字上的缺陷;一个糟糕的出版者懂得如何使读者的阅读体验“尽可能地糟糕”(Jacques语),然后吹毛求疵地挑出所有的小bug。

http://www.blogdriver.com/showBlog.do?diaryID=87888


GIGIX





与熊共舞:软件项目风险管理


》拿到了Jolt卓越大奖,有幸翻译这本书,非常开心。现在第一批书已经下印刷线,在dearbook可以买到了。

大家都知道的故事:风险如同凶猛的熊,现代企业的使命就是不断挑战风险,追逐高风险带来的高利润。凭着经验与智慧、勇敢与审慎,我们小心翼翼而又风度翩翩地与这只猛兽携手起舞,肩上的爪痕是我们荣耀的勋章。与熊共舞,这个源自圣经的故事代表了一种现代职业人的态度——勇于面对风险,又敏于控制风险。

http://www.gmw.com.cn/01ds/2004-04/07/content_10869.htm


熊节


风险越大,回报也越大——尤其是在软件行业里。逃避风险的企业将很快被竞争对手远远抛在身后。但是,由于管理者的不审慎,软件企业常常被置于一种尴尬的两难境地:要么承担风险而失败,要么回避风险而落后。实际上,如果不是因为风险管理的失位,大多数软件企业、大多数软件项目本来可以不必像现在这样窘迫。Tom DeMarco有一种特殊的本事,总能将大家都仿佛知道、却又感到模糊不清的道理讲得清楚明白,这当然得利于他在这个行业中浸淫数十年的经历。对于普遍缺乏风险意识的软件人来说,这本《


与熊共舞:软件项目风险管理


》无疑有醍醐灌顶之效。

http://www.dearbook.com.cn/book/viewbook.aspx?pno=TS0020992


liipb


这本书我看完了,此书越往后越精彩.而”项目”这个概念也可以扩展,其实我们完成生活中的一个目标也可以看做一个项目,这样的话,书中的观念也可以渗透到我们生活中,成为我们思想的一部分.是本好书

http://www.dearbook.com.cn/book/viewbook.aspx?pno=TS0020992


cnss


有些好书看了会受益终身,即使以后不从事计算机行业也大有裨益,这本书就是这样的。


其他网友对本书的评价



songma


风险管理(Risk Management)只是整个项目管理过程的一个环节,其实大多数稍微规范的公司项目经理人在写计划时都一定会有这一块的.没有? 这样的计划一定不会通过评审的.

当然,那种为了拉到资金,拉到”项目”而描述美好”钱”境隐瞒风险的计划书和项目经理人不在本文讨论之列.

各个软件公司对于项目风险区域,风险应急措施,风险等级的判断其实应根据自己的行业和自身产品,团队特点以及需求来定的.身位项目经理人一定要熟知这些.而这些东西,一般公司都会有成文或着不成文的记录.各个公司不同,这个环节的实施是很难相同的.

最后,现在的行业,比起1999-2000年的情景已经有很大的不同,那时大家更乐观些,的确是一片大干快上的样子,很多风险管理都没能很好的发挥作用,甚至包括那些在这方面有很好积累和传统的公司.中外都如此.现在其实大家还是比较谨慎,随着利润率的下降,对风险还是高度重视的.

DeMarco的这本书也许是对4年前泡沫时代终结的一个省视,对与那些缺乏风险分析经验和数据的团队,这本书可以说是一个很好的指引.对Risk Management这一环节进行深入分析的书本不多.

撇开那些过头的广告和宣传(各大网上书店),如果公司没有这方面的传统或者项目计划书模版中没有这个标题的话,这本书还是朴实无华而有启发的一本书.我推荐给从事项目管理的同行.(不过不要理会那些夸张的广告:)


酒窝


我看过《重构》,觉得作者写得很好,译者也翻译得不错。我喜欢看gigix翻译的书,也愿意去购买。


citizen


拿到书了,从封面到纸张都不错,鼓励一下


cdxcoding


我也拿到书了,感觉不错。真的。内容也没有起先担心的那样,怕务虚的东西比较多。书里谈到了著名的丹佛国际机场项目的案例,分析的非常精彩,跟我们实际开发非常接近。我很快就读完了三分之一。

这个项目是这样的。科罗拉多州的丹佛市于1988年开始建造一个新的国际机场。新的丹佛国际机场计划于1993年10月31日投入使用。到那天了呢,这个巨大机场的其他各个部分都已经做好了准备,只有行包自动处理系统的软件还没到位,所以机场还不能投入使用!从1993年第一次延期,到1995年机场终于部分开放,项目延误的全部损失超过了50亿美元。

全书并没有仅仅分析这一个项目,实际上,这个项目之大,在我们日常工作中是罕见的。但是作者从这个项目入手(实际上从第三张才开始谈这个案例),就是呼唤我们对项目风险的重新认识。我觉得如果没有这种重新认识,是很难“坦然面对”风险的。前面的songma兄言过了。要知道,明白/知道/了解了风险管理是前提,连这个都做不到,就更谈不上如何应对我们几乎每天都可能面对的风险了。


tjuwayne


《最后期限》翻译得很好,术语准确,文笔流畅,想来是二人成功合作的结果。

Demarco的著作,翻译水平又有保证,值得买!





[ 查看本指南所提及的书籍 ]





主持人:熊节(透明),《程序员》杂志编辑,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程序设计语言(第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论坛同大家讨论是个不错的办法,那里的高手如过江之鲫,你会找到许多热心的朋友与您一起学习,能通过学习编程交些朋友不是更好吗?最后,希望您能成为优秀的程序设计师,为中国软件的发展贡献一份力量!



介绍了UML、面向对象及契约式设计的学习过程



[ 查看本指南所提及的书籍 ]







UML与面向对象编程



如果是想认真学UML,机械工业出版社的三本书《UML参考手册》、《


UML用户指南


》和《


UML和模式应用面向对象分析与设计导论


》就足够了。《


UML和模式应用面向对象分析与设计导论


》这本书,其实应该叫《UML实例分析》比较合适,很适合面向对象和UML的初学者练手用

是Craig Larman的Applying UML and Patterns使我对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,毕竟是完全不同的语言

我对OOSC(Object-Oriented Software Construction, 2nd Edition,清华大学出版社1999年影印版)一直都赞美有加,不是因为它在OO书籍中的Bible地位(说实话,它太厚了,以至于我每次都没有信心把它看完——事实上我也没有看完它),而是它第一章就讲了Software Quality,让我对于程序的本质有了更多的了解。

我认为Bertrand Meyer以及他所代表的Eiffel流派对对象技术理解是最深刻的。十几年来,他们在整个OO技术界一直处于支流,这不能不说是一件令人遗憾的事情。我认为,如果Eiffel及其所倡导的

Design




By

Contract理念一开始就被人重视,那么整个90年代软件工程的发展格局可能都会不一样。另外,从语言本身来说,Eiffel也是非常出色的,我觉得无论将来想不想用这种语言开发项目,认真的学习一次是大有意义的。

OOSC我正在看,里面有不少令人耳目一新的观点,初读起来觉得诧异,细细想来却觉得本该如此。比如把command和query区别对待的观点,所谓访问形式一致性原则(Unified Access Principle),等等,都令人有拨云见日的感觉。

Eiffel的立足点是可扩展性、可复用性和可靠性。我记得前不久我们在一起讨论,这几个目标正是令我们困扰的东西。真的能编写可复用的组件吗?测试难道是保证软件质量的唯一手段吗?是不是面向对象发展到今天,都一直达不到这几个目标,最后只能给所谓的“面向组件”技术当垫脚石呢?读了OOSC,很多疑惑豁然开朗,信心又回来了。



契约式设计









Design by Contract原则与实践





第一次看到

Design by

Contract,是在网上的一篇文章,觉不出有多大的价值;第二次看是在OOSC,觉得的确有价值,对于解决所谓“软件危机”大有帮助。我刚翻译的《


最后期限


》里面就有一句比较经典的话:软件模块很不容易出错,即使出错也会被程序员发现;软件的错误总是在模块与模块之间的交流上。而

Design by

Contract很大地帮助了程序员之间、模块之间的交流。

按照裘教授那本书的理论,程序设计是一个规范逐步精化的过程。你首先必须确定一个规范是可行的,然后确定对这个规范的精化的过程是可行的,这样才能得到合法的程序。而在我们使用的OO语言(例如C++、Java)中,并没有证明一个规范是否合法,换句话说,我们并没有保证client以合法的方式来调用我们的模块、使用我们的返回值。我们只把这些要求写在文档里,天知道client会不会按照文档来做?恶魔前几天问我“如何证明面向对象的科学性”,我想他的迷惑也有这个原因。

差不多是这个意思。我看到的每本软件工程的书,都试图解答这个问题,有的说是因为软件太容易抽象了,有的说是人们对软件重要性的重视不够,各种观点都有。但是我认为,那些都是次要的,最重要的原因是,自顶向下的软件设计方法真正蕴藏的是一种集权的思想。

按面向对象的行话来说,在结构化程序中有那么一个god object,掌控一切,从你这个模块的生死大权,到你的生存行为模式,你的内部组织形式,这个god object无不了如指掌,它统揽一切,随时可以以至高无上的身份干涉各个模块的行为。也正因为如此,它承担了沉重的职责。



学习Windows编程是很复杂的事,大多数程序员使用C++进行Windows编程,可是如何把两者结合起来学习?本文试着给你一个答案



[ 查看本指南所提及的书籍 ]





一般计算机本科学生应该学过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大奖,建议大家有空去读一读,本人正在学习中,感觉不错。



要精通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程序设计工程师了!



(感谢孟岩老师为大家提供这篇学习指南,本文发表于《程序员》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核心编程


》的主要意义在于深化你对系统的理解,那么这本书中教授的知识是实实在在吃饭的家伙。因此,对于高手和有志最终成为高手的程序员来说,这本书是一本难得的经典。



关于ACE的详细信息,可以查阅《程序员》2003年12期的ACE专题。本文得到《C++网络编程》两卷的译者马维达、於春景先生的大力支持,在此表示感谢!


[ 查看本指南所提及的书籍 ]






ACE是什么?



ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放源码的面向对象(OO)框架(Framework),在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++ Wrapper Facade(包装外观)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。

ACE的目标用户是高性能和实时通信服务和应用的开发者。它简化了使用进程间通信、事件多路分离、显式动态链接和并发的OO网络应用和服务的开发。此外,通过服务在运行时与应用的动态链接,ACE还使系统的配置和重配置得以自动化。



使用ACE的好处




●增强可移植性:

在ACE组件的帮助下,很容易在一种OS平台上编写并发网络应用,然后快速地将它们移植到各种其他的OS平台上。而且,因为ACE是开放源码的自由软件,你无需担心被锁定在特定的操作系统平台或编译器上。


●更好的软件质量:

ACE的设计使用了许多可提高软件质量的关键模式,这些质量因素包括通信软件灵活性、可扩展性、可复用性和模块性。


●更高的效率和可预测性:

ACE经仔细设计,支持广泛的应用服务质量(QoS)需求,包括延迟敏感应用的低响应等待时间、高带宽应用的高性能,以及实时应用的可预测性。


●更容易转换到标准的高级中间件:

TAO使用了ACE提供的可复用组件和模式。它是CORBA的开发源码、遵循标准的实现,并为高性能和实时系统作了优化。为此,ACE和TAO被设计为能良好地协同工作,以提供全面的中间件解决方案。



好书介绍



★★★★★《


C++网络编程 卷1:运用ACE和模式消除复杂性




Douglas C. Schmidt, Stephen D. Huston 著, 於春景 译


华中科技大学出版社  出版时间:2004年1月


《C++网络编程》以一则概论开篇,介绍了撰写分布式并发应用程序时涉及的议题和工具。然后,针对开发灵活、高效的并发式网络应用程序的需要,本书提供了重要的设计空间、模式和原则。本书作者从专家角度向你展示,在运用C++和模式有效地开发面向对象网络应用时,应当如何提高你的设计技能。

有了这本书,C++开发者就有了一套最完整的、可以自如运用的工具包,从而能够方便、高效地开发成功的、多平台、并发式网络应用程序。



於春景先生个人主页及本书勘误




本书影印版

★★★★★《


C++网络编程,卷2 基于ACE和框架的系统化复用




Douglas C.Schmidt, Stephen D.Huston 著, 马维达 译


电子工业出版社  出版时间:2003年12月


本书内容涵盖ACE中的各主要框架的基础概念、模式及使用规则。本书将向你描述这些框架的设计,以及它们可怎样帮助你克服较低级的本地操作系统API与较高级的分布式计算中间的各种局限,高效地开发出高质量、可移植的C++网络化应用。本书是继受到了高度赞誉的POSA2(Pattern-Oriented Software Architecture:Patterns for Concurrent and Networked Objects) 之后,Douglas C.Schmidt撰写的又一著作,通过学习本书,你将能更了解和掌握适用于网络化应用开发的各种设计模式。



马维达先生个人主页及本书勘误




本书影印版



孟岩推荐



这套书共两卷,篇幅都不大,主要内容是介绍ACE。在C++领域,由于这套书被Bjarne Stroustrup编入C++ In Depth系列,因此具有崇高的地位。而在网络编程领域,也有人称赞此书为Stevens之后最重要的网络编程著作。作者Douglas Schmidt是C++、网络程序设计和模式领域中国际公认的权威专家,潜心研究C++网络编程已经十多年。他发起的ACE开源项目是目前当之无愧的最优秀和最成功的C++网络编程环境,不仅具有非常出色的可移植性,而且性能卓越。美国国防部的ARPA已经支持这个项目好几年了,其最终目的是在ACE的基础上建立可用于现代战争的分布式实时嵌入式系统。毫无疑问,ACE无论在理论上还是在实践中,都是最值得程序员关注的网络编程典范项目,而这一套两卷对ACE的介绍性书籍,也毫无疑问是最值得网络程序员品读分析的经典。学习这两本书,你可以将经典的基于C API的网络编程知识与现代面向对象、模式和框架等最新技术思想结合起来,从而使你对网络编程的认识上升到一个新的高度。

附孟岩:


《网络编程之四书五经》

关于ACE的更多中文信息可访问


马维达先生的ACE站点





点击此浏览ACE的主页


,在这里可免费获得最新版本的ACE以及其他相关资源。



本书为我们作了一个对产生式编程的精彩介绍,它注定会成为一部经典之作。作者精心讲述了领域特定语言和产生式编程之间通常为人所忽视的联系,并把这种联系作为未来开发的一个推动因素。广大的开发人员完全可以把书中丰富而且实用的方法当做可以立即应用的首要步骤。


[ 查看本指南所提及的书籍 ]






本书简介






产生式编程——方法、工具与应用


》是对这种正在浮现的规程的完整指导和参考。它提供了对以下这些关键技术和主题的深入探讨:

●领域工程 ●特征建模 ●泛型编程 ●面向方面的编程

●使用C++的模板元程序设计 ●产生器 ●微软的意图编程

使用本书你将会学习到如何组合这些技术,以及(也是更加重要的)如何在实践中运用它们。书中包括来自三个不同领域的完整的案例研究:程序设计领域(容器数据结构)、业务领域(银行业务)以及科学计算(矩阵计算)。



什么是产生式编程?



产生式编程(Generative Programming,GP)为应用程序开发人员提出了十分美妙的承诺。它使“从‘一种一个’的软件系统向自动制作软件的各不相同的变体发展”这种思路变得十分真实可信。简单地说,GP以“确定软件开发中自动化的好处”为中心。本书包括了将帮助你设计和实现一个系统族的“正确”组件,以及自动组合组件的方法和工具。这里提出的方法可以应用到所有的商用开发中——从类和过程的层次上的“微观编程”(programming in the small),到“宏观编程”(programming in the large),就是说开发大型系统的家族。



面向对象的泛滥



过去十年里, 面向对象方面的著作由于覆盖了很多明显不相关的思路, 可以说是已经到了汗牛充栋的地步, 这些思路包括从面向主题的程序设计到组件, 林林总总。 它们有一个共同点, 就是总有一些有关它们的东西肯定不是面向对象的, 虽然它们都在面向对象的光环里面花费了很多时间。 但是在过去的一年或者两年里, 这些零散的片段中有许多都发现了共同的基础, 并且围绕一个共同的主题联合起来:元对象协议(metaobject protocol)。 自省(reflection)。 意图(intentionality)。 一种见解深刻的对组件的解释。 跨结构的特征剪裁, 以及对简单模块性的经典模型的突破。 对我来说, 1999年度最精彩的场面之一是在德国的Erfurt举办的第一次国际产生式与基于组件的软件工程讨论会(GCSE’99), 会议上, 众多研究人员把许多这种想法联系起来, 交流对于它们的重要意义的感想。 但是, 这只是这些思路汇集起来的一个论坛:我们在论坛上看到了与许多会议讨论小组和某些新的文献中相同的东西。



我们要超越面向对象



在形成历史的某些事件中评估历史总是很困难的, 但是比起在事件发生后, 远离第一手资料来解释它, 可能不用负更多的责任, 也并不危险。 在这种思路之下, 看看周围, 可以认识到, 现在, 我们可能正处于计算机科学的一个关键的转折点, 特别是程序设计和设计技术领域。 业界已经挣扎着努力超出面向对象范型的局限。 模式是一个值得重视的尝试, 虽然它们非常有利于把注意力集中到程序设计中经验的价值和人的因素上, 但是, 计算机科学如果忽视亚力山大(《


建筑的永恒之道


》的作者)的观点或者系统思考, 就不可能取得什么进步。 软件很少能在Kuhnian的意义上取得一个真正的范型转变。 可能我们是一个保守团体, 而且我们对小说的迷恋使我们甚至不能进行最简单的学习:许多本国的组件运动的原则受到面向对象设计的早期原则的影响, 这些是经验建议应该在几年的应用后丢掉的东西。



新编程概念的萌生



但是现在有了一些改变的萌芽的印记。 可能业界不会很容易地进行革命, 但是, 它可以容忍向一个在现有状态之上构建的新技术迈进。 一直以来, 有一种强烈的。 连续不断的运动, 想要发现超出对象和概念与特征的范畴之外的编程和设计表达方式。 这就是意图编程的基本含义, 例如, 很大程度上, 也是类似领域工程的基本含义。 这种思想的脉络在整个业界。 在很多论坛上都很有市场。 我们在通俗(非亚力山大)模式运动中看到了它, 我们在面向方面的程序设计中看到了它, 我们在泛型编程和一些例如多范型设计中也看到了它。 由于一些会议例如OOPSLA的关注点越来越不集中于那些被称为对象的东西的基础, 而是越来越集中于概念性扩展, 所以我们开始对各个部分思考得越来越少, 而对系统和特征思考得越来越多。 并且由于OOPSLA影响力减弱了, 所以一些类似GCSE的会议正在越来越多, 越来越普遍。 今天, 就是一个基于广度的沿此方向的运动, 并且本书发现自己正好处于这个转变的中心。 我相信, 读者既不会低估这个转变的意义, 也不会低估本书在沟通和影响这个转变中的地位。 我们正处于演变的开端, 本书是这个新流派的早期标准化工作。



本书详细介绍



这本书可能反映了计算机科学成熟的一个程度, 就是说, 第一次, 尝试利用其自身的能力, 证明一种整合观点, 而不是通过与先驱区别开来颂扬一种技术。 所以, 这本书覆盖了很多领域, 并且应用了很多原则:组件。 对象。 方面。   自省。 意图程序设计和泛型程序设计(用于以技术为焦点的地方)和领域工程(用于系统的考虑)。 对于那些第一次遇到它们的人来说, 本书是一个很好的对于正在涌现和建立的技术的精彩介绍。 有人会误以为本书是一本已有实践的纲要, 当然是在领域工程的范围内, 但是, 在更远的范围内, 对于超出对象以外的那些东西, 本书也是适用的。

但是这本书远远不止是技术的一个集合。 这本书围绕统一原则提出了强力的主题, 这些原则将把零散的东西捆绑在一起, 还提出了非常值得注意的领域工程和元程序设计。 作者用领域工程的概观好好地招待读者, 并引导读者鉴赏它的必要性。 领域工程可能超出了任何一种单独的思路, 提供了一个通用的思路或者主题, 读者可以使用这些来“解释”产生式编程。 但是, 更重要的是, 作者把其他程序设计的学派作为基础材料, 来描绘以一种广泛的。 恰到好处的视角, 称为产生式编程。 结果肯定超过了各个部分的总和:大多数这些部分都曾经存在了很久, 但是关于怎样把它们整合起来的想法刚刚涌现出来, 并得到了广泛的揭示。



微软研究院总构架师推荐



“本书为我们作了一个对产生式编程的精彩介绍,它注定会成为一部经典之作。作者精心讲述了领域特定语言和产生式编程之间通常为人所忽视的联系,并把这种联系作为未来开发的一个推动因素。广大的开发人员完全可以把书中丰富而且实用的方法当做可以立即应用的首要步骤……而且,无论是使用现存系统,还是为正在出现的新产生式技术而做准备,它们都是价值不凡的。”

——CharlesSimonvi,微软研究院总构架师、意图编程的发明者

原书Amazon信息:http://www.amazon.com/exec/obidos/tg/detail/-/0201309777/qid=1074413520/sr=1-1/ref=sr_1_1/104-4857035-4348769?v=glance&s=books