现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

微软工程师谈C++语言的学习

2012-07-12 08:04 工业·编程 ⁄ 共 7556字 ⁄ 字号 暂无评论

高博简介:1983年生于安徽宿州,书香门第。87年开始学习算法语言,并掌握Algo- 60在709/TQ-16大型机上的纸带实现。小学时接触到内存为64K的学习机,查阅手册自编手柄驱动以自娱。中学时参加数次省级、国家级信息学竞赛, 成绩乏善可陈,参与兴致不减也。其间阅读如饥似渴,对算法设计和工程编码打磨不辍,同时发表文字数十万字,后考入上海交大专修计算机。毕业后,在微软中国 Windows Live Mail项目组工作,负责Mail Rendering/Calendar的部分编码和测试工作,在惠普中国负责大中华区的笔记本软件质量保证项目。23岁末,辞职创业,成立上海说说螺软件 技术有限公司.

专长:C/C++、HTML/CSS/Javascript、基础算法、软件工程、软件项目管理、质量控制
兴趣:语言学、天文学、数学、神学、四书五经、写作、翻译、看电影、听轻音乐、玩魔兽世界、简单木工、慢跑 

    现在去书店,尽管还是经常去C/C++柜台附近转悠,但发现自己和大学的时候有一个很相反的地方,那就是彼时钱袋很空,好书却不少;而现在却是买书的银子再也不缺了,好书却只能沙里淘金似的找到一两本,经常转了半天却空手而归。 不过好书总算还是有一书柜,现在已经从学问人沦为生意人,经常夜里枕书而眠,又枉度数载,总算还有些心得,这里还是拿出来谈谈。

一、静下心来  摸清基本概念

    在参与编码实践后,会遇到很多十分唯象的编码习惯。很多朋友在微软,在Intel、在 Autodesk工作了几年,回来我们一谈,却发现他们养成了一些进去之前没有的坏毛病——Effective C++的教导很多都忘记了!我忍不住批评了一下,他们就搬出“项目规范”啦,甚至“PM就是这样写的”啦。实际上呢?谁在项目压力之下都要靠本能编码的, 之所以要不停地看书,就是为了本能出来的东西能够地道一些。这句话来自《程序设计实践》,是Kernighan的箴言。
所以,我的建议是,无论在具体项目中纠缠了多久,还是应该时不时地静心来读读一些讲述基本概 念、基本理论的东西。这也就是我说的不会过时的东西,只要处理器的基本结构没有变,它就不会变。当然我得承认C++是一门不断演化着的语言,不过特别明显 的是它的演化更像是板块漂移而不是火山喷发。C++那个98年的标准明显绝大部分还继续适用,并且是现今所有的编译器设计时必然参考的指南。更进一步地 说,编程的技术——这种和语言无关的东西,比如如何写测试用例、如何调试,是应该总是时时记念在心的。这部分的东西十分难写,因为写不好就让人觉得特别无 味,好像是写地球人都知道的东西,能把这部分写出味道来,是很伟大的。

二、读一些深入的书  充分“吃透”C++

    C++有很多断面(facet),难以一言以蔽之。Bjarne Stroustrup的两本书应该说是C++语言最权威的参考了,但是C++标准的作者却是Andrew Koenig。这至少说明一个问题,亦即C++的创始人也不能说就完全理解了这个语言的所有方面。就像卓别林在模仿卓别林的比赛上不能夺冠一样, Stroustrup在C++方面的理解,很可能不及一些他的某些同事(依我看,Herb Sutter该算一个)。
    即使要了解C++的某一个断面,也需要投入相当的时间和精力。但如果只了解C++的某一个断 面,注定会像摸象的盲人一样,浪费了C++的许多重要的可资利用的特性。或是写出的代码佶屈聱牙,能够通过编译,却会有很多运行时的隐患(内存泄漏是最常 见的问题,但并不是最糟糕的)。或是活像把C++当作一门外语来表达,用case语句和类型判断来做一个虚函数应该做的事等等。
应该对C++的基础部分投入最大的精力,这是怎么强调也不为过的。而基础部分包括的内容却是 难以界定的,char和int的关系算不算呢?你真的会用浮点型来准确表达你的计算了吗?对你来说,“class”的意义是不是和默认为private的 struct差不多?可以说每个C++语言核心元素后面都有一大篇的故事,你能娓娓道来其中多少?我经常会有小学没毕业的感觉,你也一样吗? [Page]
然而现实要求我们这些所谓的大专院校的毕业生们,天之骄子们能够迅速地、干净利落地拿起C+ +的炊具烹出合乎客户胃口的小鲜。我们别无选择,我们应该拿出时间来学习,应该读一些深入的书,应该了解一些数学,应该了解一些那些狗屁培训班的白痴教员 们不懂的东西,以对得起我们的父母从血汗钱里拿出的学费,以对得起我们肩上所担负的拯救中国的软件产业乃至计算机产业的责任,我们没有理由止步,我们没有 资格掉链子。
我得承认C++的书里,有一些十分晦涩难懂,有一些在一个主题里挖得非常深入。但这些书也是 我们成长的最好的营养,也是我们作为一个严肃的工程师和研究者的入门钥匙。它们给了我们对本应重视却粗心略过的问题耐心的却并非浅薄的提醒和解释,它们的 作者在早年就经过了我们今天才走过的荆棘,并为我们一一标上了“禁止通行”和“小心地滑”的告示。也许我们在把它们读过多遍以后,觉得自己已经掌握了很 多,甚至觉得它们开始像母亲的唠叨一样过时了,但实际上呢?我们还是经常闯祸,有时会头破血流,让我们“听妈妈的话”,养成读这些书的好习惯吧,尽管它们 有时还真不是一遍可以读懂的!还有,别以为读了一遍你觉得懂了就是真懂了!
推荐:
大规模C++程序设计,John Lakos
深度探索C++对象模型,Stanley B. Lippman
Exceptional C++,Herb Sutter
More Exceptional C++,Herb Sutter
Exceptional C++ Style,Herb Sutter
Effective STL,Scott Meyers
具体数学,Ronald L. Graham、Donald E. Knuth & Oren Patashnik
C++设计新思维,Andrei Alexandrescu
C++语言的设计和演化,Bjarne Stroustrup
C++程序设计语言,Bjarne Stroustrup
C++语言标准,98版,C++标准委员会
国内绝版的《Dr. Dobb》杂志,散文都写得极好,我有一些

三、要选择好的作者、译者和出版社

    好作者、译者和出版社,这不仅是选择C++的书籍的原则,也是选择技术书籍的原则,也是选 择任何书籍的原则。也许中国真的会在若干时间后出现实力派的技术作家,遗憾的是现在我仍然没法强迫自己去购买中国作者的作品。问题不在于中国人不懂技术, 而在于中国人很难表达出来适合于看懂的东西。谁知道呢?也许太多精力被用在应付柴米油盐了吧!

    取法乎上。Stroustrup的Bell实验室的同事们!这些我们的时代最可爱的人,是离 C++最近的人。他们在实现Cfront的时候,一定吃尽了C++语言的任何瑕疵的苦头。我们会忘记,但他们不会忘记。如果Lippman站在我身后看我 写代码,他一定会急得直跺脚:“别这样写!1980年6月的某天,我和你犯了一样的错误……”正是对于细节的了如指掌和错误的感同身受,使他们落在纸上的 文字能够切肤般地直指症结,而决不会大而化之。其实,我早就指出:中国人想写出像样的东西,没有别的办法,只能从头把一个语言实现出来——可以参考别人的 东西,但必须是从头实现,而不能用一行现成的代码。如果哪天我发了财,我一定去组织一支这样的团队,并以一名普通程序员的身份参与工作……

荣誉作者(若你看到一本C++书籍的作者是他们中的一个,你可以不必为质量担心了):
Bjarne Stroustrup
Herb Sutter
Dennis M. Ritchie
Brian W. Kernighan
Andrew Koenig
Barbara E. Moo
Stanley B. Lippman
Stephen C. Dewhurst
Scott Meyers
Andrei Alexandrescu
Bruce Eckel
Matthew H. Austern
Tom Cargill
John Lakos
Rob Pike
Don Box
Charles Petzold
侯捷
    我提倡英文的细致学习,至今十余年矣。我可以大胆地说,90%合格的技术从业人员的英文功底 是不合格的。不仅如此,大家可能没有料到的是,我还是个汉语教育工作者。大家可以去检查我公开发表过的任何东西(聊天记录也可以),看看有没有什么错别 字,或是错的标点符号,或是英文的句首没有大写。我用了很大的精力来告诫技术功底不错的苗子:你要学会用well-formed的语言来表达你的意思,这 需要自觉投入精力去自我训练和打磨,而决不是自然而然就会的。技术从业人员吃表达方面的亏,实在是太大了。写一手漂亮的字现今已经几乎是奢望了,写一手漂 亮的文章的专业人员也日渐稀少了,那么我们这个时代新的底线是不是应该可以写一手漂亮的文档呢?请用地道的中文,请用地道的英文,请用地道的日文,不要满 足于一知半解,不要满足于领会大意,要确切地摩挲你的外语,知道如果你用中文应该怎样确切地说出来。模仿-重复循环是学习任何语言的不二法门,我在 English板发表了多篇文章来试图清楚地表达以及强调我的意思,希望能对大家有所裨益!文化的功底是重要的,你应该知道中国文化中特有的东西,你应该 知道《论语》,你应该知道自己国家的历史,并且想法让全世界的人都因你的语言工具而透过英语、日语等外语发射出去。所有的这些都需要专业的精神,都需要你 识货,都需要你严肃地对待自己的习惯。不要在聊天里用拼音打别字,选择准确的词来表达准确的意义,该用size_t的地方不要用int,这些小处的费心会 给你带来超乎你想像的巨大回报。

    因此,也就不难理解为什么负责的翻译工作是世界上最难进行的工作,因为这项工作容不得任何走 神的时刻!我由衷地向我们的负责的翻译工作者致敬,同时希望你们不要把这个工作外包给研究生。一个产品的“初成质量”对最终的质量有很大的决定作用,初译 稿很差的话,真的很难改好。当然,我是极力提倡大家能够读原著的,即使这比读母语有不小的阻力,但你的感受会是完全不同的。真的有些东西是没法子译的,比 如《Effective STL》里关联容器的前言里提到了一个说法叫做“if you’ll excuse my likening vectors and strings to Kansas, we are definitely not in Kansas any more.”我们很快可以在《Don’t make me think》里找到类似的说法,这样的对比会使我们意识到这是一个俚语,用来表达“大相径庭”的涵义。我们以后如果再在《大饭店》里看到同样的说法,当然 也就知道它和堪萨斯没有任何关系了。不过,现在的很多好书翻译得实在不敢恭维,真想自己动手再译一遍。好的翻译需要好的外语解码和好的中文编码,这两个模 块同时都不错的人,我必须说,真是凤毛麟角。我这里交上一份自己的答卷,请批评: [Page]
《C++ Gotchas》第1章翻译结果
许可:署名-非商业性使用-禁止演绎 2.5,Creative Commons,其概要内容参见:
http://creativecommons.org/licenses/by-nc-nd/2.5/cn
荣誉译者(当心,他们的水平不代表他们的研究生的水平,请看清以防上当):
侯捷
孟岩
於春景
裘宗燕
潘爱民

    有人会质疑说这个名单太短了,很可惜,一些比较流行的译者,水平在我看来还不如我的徒弟。另:我发现我的学弟php也在开始译书了,但是领域我不太熟,没有看过,不方便发表评论。但希望这个有水平的家伙能够努力打磨自己,更好地为人民服务。
出版社是一个人们容易忽视的问题,但其实是不能不管的。比如我购买历史和文牍的书籍,就只在 商务印书馆、中华书局和三联书店出版的书里买,偶尔会买一两本上海古籍的。我购买日本小说(尤其是村上春树的小说)只会买上海译文出版社的,其它的真是译 得没法看。其它的出版社如外研社、上海外语音像出版社都是高质量的。你绝对在我的书架里是找不到下三烂的出版社出的任何一本书的!那末,技术书籍的好书主 要还是集中在清华大学出版社(当然,这个出版社出的书是严重参差不齐的,而且近三年已经没有出过有关C++的好书了)、机械工业出版社、华中科技大学出版 社、人民邮电出版社(此出版社翻译质量令人担忧,建议只买影印版)、中国电力出版社、电子工业出版社(翻译质量也很不行,只有几本还不错)和高等教育出版 社等。

作者-译者-出版社立方体,是你选择好书的最关键的因素!

四、找对读书方法

    读书的方法,各人有各人的习惯。总体来说,我的读书习惯可以在下面的文章里找到:
GAOBO.ORG随笔:无事乱翻书
http://www.gaobo.org/essays/19.htm
许可:署名-非商业性使用-禁止演绎 2.5,Creative Commons,其概要内容参见:
http://creativecommons.org/licenses/by-nc-nd/2.5/cn
村上春树在《挪威的森林》里有一句谈到主人公的读书习惯:“我是经常看书,但并不是博览群书 那种类型的读书家,而喜欢反复看同一本自己中意的书。”我不知道别人读了此话是何感觉,或有否感觉——我自己是感到了强烈的共鸣的。我没有在书上勾画的习 惯,也没有做读书笔记的习惯——死活做不来,觉得摆起架子书就不亲切,读不进去。但我的记忆力又特别地差,差到几乎可以视同健忘的程度。所以不读许多遍, 是不可能形成深刻的印象的。但是我非常清楚地知道自己在记忆力方面的缺陷,反复地读一本书几十上百遍,甚至数百遍,反而在不多的几本书上形成了极为深刻的 印象。《Effective C++》后来取代了《Thinking in C++》,成为我读的次数最多的C++书籍。同样还有《The C Programming Language》、《ThePractice of Programming》这些书都读了上百遍。为什么要反复地读呢?这种读书的方法能够让你发现一些隐藏起来的妙处,发现一些需要反复玩味才能发现的作者 的思路。表面上看过去Effective Series和Exceptional Series是完全不同的书,但读的次数多了,就会发现它们是完全相容的书——一本书的主题在另一本书里有完全的重复,只是形式、重点不同,或是散在数个 章节里。你也有同感吗?

五、要为值得的书花钱

    我非常不同意“书非借不能读也”这句话。和书的感情就像恋人一样,须是自家的才可用全心全 意。不要和我说买不起这种话,你的钱省下来做什么了?我承认书的价格确实定得比应该的定价要高一些,但是网上书店往往有不小的折扣。而且,我认为关键的问 题还不在花多少钱,而在于你愿意为什么花钱。对于不愿意把钱花在书上的人而言,我不能认为他是真心实意地想读书的。简而言之,如果一本书我都不愿意买,我 难道还愿意花费比钱更宝贵的时间来阅读它吗?这是难以想像的。我可以捧着一本书静静地看一整天,但让我坐在电脑前,看一本电子书一整天是不可能的,我的即 时通讯工具开着,我一个点击就能开启浏览器去看别的东西。纸质书的可贵之处在于它的唯一功能就是给人阅读,除此以外它一无所用。当然,一些更明显的理由就 是纸质书多多少少有出版社的校对力量来保证其正字率,而电子读物的质量就只能听天由命了。

    我知道必然有人会起来反驳我,说借人家的书来读更好。但我不能同意的理由是,你能不能借到是 个问题,而且我也说了,读不是只读一遍就可以的,哪怕再仔细。老是问别人借同一本书,这无论如何不能说是一个decent的行为——又不是十分贵重的东 西,为什么偏偏是书就可以不自己买呢?这里面有一个信息的可复制性的潜意识,但其实站不住脚。“科学是没有国界的,但科学家是有国界的。”那末我也可以 说,“知识是没有主人的,但知识的载体——书籍是有主人的。”除非是一些像永乐大典那样特别珍贵的,别无可求的“孤本”,为研究之需,去图书馆借来读。在 一般的小书上,真的就不要那么吝啬了。书不是非求广的,要掌握C++的话,读上个四、五本好书就很够了。如果去上图借书,排队的麻烦、办卡的费用不提,单 是车钱就够买好多书了!对于真正家境不好的上进同学,我从来都是慷慨赠书的,而且不是送旧书而是送新书,不是送小书而是送大书。我觉得,能尽一己之力而成 人之美的,再没有比送书成本更低的了。

六、书并不比网络差

     现在有些青年朋友一提到读书就皱眉头,好像觉得这种知识获取的方式过于陈旧了,不能和互联网 时代的时尚学习效率相比了。在资本主义的生产方式下,个人的生活方式也不知不觉地被决定了。农业社会其实是很难愚民的,因为生产时间主要地是由天时决定 的,农闲的时候,虽然农民贫富不均,有些是买不起书也读不起书的,但这段时间的赋闲却使得农业社会自发的文化丰富而又耐人寻味。工业的冲击却使得大批原本 有资源、有能力成为自由的读书人作茧自缚,向物质的符号和被赋予了神圣使命的剥削俯首称臣甚至顶礼膜拜,纵身跃入了暗无天日的无知之井中。

     对于草根文化,我并不想多加以批判,这篇文章本身也不能脱俗于彼。但是,想在浩如烟海的由草 根文化构筑的互联网王国里淘到有思想、有意义的真金,要付出的时间代价是不言而喻的。文化的生产有它的自然规律,伟大如但丁的诗人也不能每月写出一部《神 曲》,快速的工业化生产出的文化产品几乎无一例外的是粗制滥造的货色。正是这类正式出版渠道百分之百会被枪毙的货色充斥着我们可爱的、每天在其上消磨六分 之一甚至更多的人生的互联网。完全可以把互联网上的专业内容比作垃圾食品:偶尔应急充饥还算差强人意,若追求色味俱佳甚至有益养生,那就太勉为其难了。 “开卷有益”的谚语并不带附加的前提条件而能流传至今,可见即有偏颇也与实际相去不远,而如果说“联网有益”,恐怕连患有网络依赖症的人也是不会承认的 吧。

    时间的分配和管理是个偌大的题目,当代社会无不称忙,然而事实却是时间浪费严重、做事效率低下。什么时间拿来读书?唐宋 大家欧阳修给出的答案是枕上、马上(现在大抵可以改为车上)、厕上,我觉得如果人生的理想并非是甘于沉沦,而是想在术业上有所成就,或至少像我一样可以从 C++中体味出一些别样的美感,那末请认真地为这个问题寻找你自己的答案。啰嗦了近一个礼拜,说了一个生意人几年来的C++读书经。希望大家能够把握C+ +的主流而不囿于个别的实践,仔细选择适合自己的好书,并投入时间和精力研读和思考。我们有不小差距,但我们没有必要妄自菲薄。当我们有了对于书籍的质量 要求,并能够自觉地和质次的书籍作斗争的时候,真正有份量的中国作家的作品也就呼之欲出了。请从做一个严肃的读书人开始,成为这场史诗般的运动的积极参与 和推动的力量吧!

给我留言

留言无头像?