Explanatory Notes On <K's 50 PV>
详解<K's 50 PV > Revision 1.0
[中篇]
by Kingofark
[注]:<K's 50 PV>是《Kingofark's 50 Points of View About Learning C++ And Programming(kingofark关于学习C++和编程的50个观点)》的简称;<K's 35 MPV>是《Kingofark's 35 More Points of View About Learning C++ And Programming(kingofark关于学习C++和编程的另外35个观点)》的简称。
条款17. C++不仅仅是支持面向对象的程序设计语言;
[解说]:
向大家强力推荐C++的设计者Bjarne Stroustrup的一篇文章《Why C++ is not just an Object-Oriented Programming Language》(为什么C++不仅仅是一门面向对象程序设计语言)。这篇文章在他的个人网页上能够找到。
[kingofark的收获]:
其实很多基本但重要的观点都是出自领域内大师们的所文所言,我只是在不遗余力的复述这些观点罢了。
条款18. 学习编程最好的方法之一就是阅读源代码;
[解说]:
这是世界公认的,著名的权威专家,已逝的Richard Stevens博士平生一贯坚持的观点。我们从他所著的经典书籍中可以看到这一点。一本《TCP/IP Illustrated Volume II》(TCP/IP详解 卷二),就原汁原味的包含了BSDLite4.4中的1,5000行代码,很现实的将此书的读者带入了一个真正的编程世界。当然这本书中的程序都是C代码,学习C++者并非一定要看,这里只是举个例子来说明问题。
学习的条件提供给你了,现在就看你自己的了。
[kingofark的收获]:
选择题:要在天空中翱翔,最好的办法是:
A.自己做一个翅膀,从悬崖上一跳;
B.自己做一架滑翔机,找一块平坦的荒地借着风起飞;
C.驾驶一架性能良好的飞机,在修建好的跑道上起飞;
D.乘坐飞机到高空,然后背上降落伞(或许还带一个滑板),跳出飞机。
我选择D。
[关于本条款的解说]:
详解<K’s 50 PV>预览版推出时,我得到了一些来自高手大侠的宝贵意见和建议,在此我要特别感谢孟岩先生(myan),他指出了我原来解说中的不当之处并给出了很好的建议。
有鉴于此,我愿将改进的过程呈现给大家:
我原来的解说是:
“这是世界公认的,著名的权威专家,已逝的Richard Stevens博士平生一贯坚持的观点。我们从他所著的经典书籍中可以看到这一点。一本《TCP/IP Illustrated Volume II》(TCP/IP详解 卷二),就原汁原味的包含了BSDLite4.4中的1,5000行代码,很现实的将此书的读者带入了一个真正的编程世界。
Linux蓬勃发展起来了;OpenSource运动越来越壮大;《莱昂氏UNIX源代码分析》、《Linux内核源代码分析》、《Linux IP栈源代码分析》以及《Apache服务器源代码分析》相继出版了。
学习的条件提供给你了,现在就看你自己的了。”
孟岩先生(myan)对这个解说给出了如下看法:
“关于条款18,你举的几个源代码例子实在有误导之嫌:全是OS/TCP/IP源码,全是C源码,而且就我所读过的Linux源码来讲,为了追求速度,使用了大量黑客技巧。初学者在还没有形成正确观念之前,如果迷恋上这些技巧,就会迷失大方向,失去真正C++风格。”
然后,他又作了如下的建议:
“关于C++源代码,从编程风格上,GP方面的我比较推崇STL和Boost库。但是毕竟是库代码,对于大部分人还是有误导性。
ACE/TAO据说是非常好的源码范本,可惜我的网络编程知识很欠缺,无法根据自己的体验给出建议。对于普通应用,还真难找到风格和组织俱佳的源码范本。比如像wzWindows, Mozilla,一上来就把template,多继承等特性给禁止掉,不足以为道。微软的ATL和WTL围绕COM展开,需要很多的基础知识,C++的运用方面还是比较出色,就是代码里还是夹杂了大量的宏。总之,C++ 98风格的优秀源码,现在还很难找到。如果实在要读,我还是推荐STL/Boost。尤其是Boost里面有一些层次较高的库,比较接近用户代码,可以很好的借鉴。”
的确,要找“风格和组织俱佳”的源代码拿来学习并不是太容易,所以我以为,“如果实在要读”,则完全可以到国内外(尤其是国外)相关C++的网站上去找。极品稀少,我们暂时也只好转而求其次,但是,像我在条款8中推荐的那种比较优秀的C/C++资源网站还是很多的,比如www.programmersheaven.com,比如www.codeproject.com。我觉得我们求的这个“次”也并非不够我们学的。
这里我再次感谢孟岩先生(myan)以及其他帮助过我的人!
条款19. 在任何时刻都不要认为自己手中的书已经足够了;
[解说]:
(1) 计算机技术正以飞快的速度发展和翻新。新技术取代旧技术时发出的兴奋呻吟声此起彼伏,被我们听到。哦,其实那并非呻吟声,而只是有人在用另一种语言说“活到老,学到老”这句话的声音。
(2) C到标准C,C++到标准C++。很多固有的东西也在长肉补血,发展进化。我们要认识到这种改变,跟随发展的脚步。毕竟“发展才是硬道理”。
有很多东西把这一切的一切跟你紧密的联系起来。其中之一是书籍。
[kingofark的收获]:
把“噢,我的上帝!”改为“噎,我的书!”
条款20. 请阅读《The Standard C++ Bible》(中文版:标准C++宝典),掌握C++标准;
[解说]:
这里强调的,还是要紧跟C++发展方向,把C++学准,学精。
关于《The Standard C++ Bible》(中文版:标准C++宝典)的讨论,我放在我的系列拙文《kingofark的“五评计划”》中进行。
[kingofark的收获]:
标准就是标准,不服不行,不学不行,不用不行,不改进不发展不行。
条款21. 看得懂的书,请仔细看;看不懂的书,请硬着头皮看;
[解说]:
小孩子刚生下来,是不会说哪门语言的,当然更是听不懂的,只能“硬着头皮”听爷爷奶奶爸爸妈妈哥哥姐姐叔叔阿姨伯伯婶婶说话,听得久了,就会了。
学习本身就是一个从不会到会,从不熟悉到熟悉,从不懂到懂的过程。看不懂就不看,等于什么都不看。
除此之外,这一点也没什么理由好说的了。如果非要说的话,一来连鲁迅先生笔下的阿Q都懂得“凡事总须研究才能明白”的道理;二来嘛,总是看些自己轻车熟路的东西,你不觉的太没有挑战性了吗?
[kingofark的收获]:
其实阿Q也不是没有优点的啦!
[参考]:
<K's 50 PV>条款3;<K's 35 MPV>条款26。
条款22. 别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;
[解说]:
说实话,写到这个条款的时候,我都不想再写下去了——因为道理太简单,大凡正常的、读过书的人都知晓。连一些情节简单的电视连续剧都有人要一本正经的看了又看仔细回味(kingofark就不止一遍的看日本连续剧《GTO》和《続・星の金貨》),作为智慧集合的书就更是如此。
[kingofark的收获]:
爱吃回锅肉的人也许更容易体会这个道理。
[参考]:
<K’s 50 PV>的后记。
条款23.请看《Effective C++》和《More Effective C++》以及《Exceptional C++》;
[解说]:
这里建议大家看看侯捷先生的一篇文章《拳拳到肉 掷地铿锵的三本 OOP 绝佳小书》。文章可以在侯捷先生的网站上面找到。大家在这里就先窥其一角吧:
“拿破仑虽然是个矮个子,一生叱吒却俨然历史的巨人。今天我要介绍的三本书,虽然轻薄短小有如拿破仑的身材,在 C++/OOP 领域里,其份量与影响却也有着拿破仑般的辉煌灿烂。
说它们轻薄短小,是的,让数字说话:三本书合起来才256+318+208=782 页,只比 C++ 语言知名教本 C++ Primer 3/e一半篇幅再多一些而已,比起 C++ 语言权威着作 The C++ Programming Language 3/e 也才达到三分之二的页数份量。逛书店时一个不留神,只怕你便遗漏了这些小书的存在。但如果你真遗漏了它们的存在,实在是你的莫大损失。
就我个人的编程经验,以及我的教学经验(对象为业界工程师或大学生),只要是 C++/OOP 设计思维与语言运用本身的问题,非关 problem domain,百分之九十以上皆可在这三本书籍中找到直接或间接的答案。”
“以上三本小书的功用不仅在提纲契领地点出重点,也在於对每个主题有深刻的讨论。在这些书籍中,你会发现一些忠告,告诉你应该做些什麽,为什麽如此;也告诉你不应该做些什麽,又为什麽如此。基本而言当然 whys 比 whats 更重要,这便是这些书籍最有价值的地方。至於从速食的角度来看,检阅一系列准则,也比强记一或二本庞杂的教科书更轻松方便得多。”
[kingofark的收获]:
领会了这三本书的内涵,你一开始就可以用比圣斗士星矢更高的嗓门儿厉声嘶道:“爆发吧,我的小宇宙!!!!!!”——而且百分之百可以爆发——大可不必像星矢那样每次先被打个稀烂才后发制人。
[参考]:
侯捷先生的书评。
条款24.不要停留在集成开发环境的摇篮上,要学会控制集成开发环境,还要学会用命令行方式处理程序;
[解说]:
有些不爱钻研的初学者(比如kingofark)甚至连一个集成开发环境十分之一的功能都没有用到。这是一种非常不好的学习状况,应该改变。其实再复杂的集成开发环境也不过就是个工具软件。连软件本身都用不好,那还怎么去做软件?拜托!
高级语言还没有发展到可以完全摆脱命令行操作的阶段。在真正的底层,命令行还是不可或缺的。如果你不这么认为,那就说明你的思想够先进——如果你是站在未来人的角度思考的,我承认我争不过你(因为你不可理喻)。
[kingofark的收获]:
只摸一下饭碗,是填不饱肚子的;只与情人接吻,情人也是生不了孩子的;光会撒尿不会拉屎,人也是不畅通的。这些道理你都懂,怎么一学编程都晕了?
条款25. 和别人一起讨论有意义的C++知识点,而不是争吵XX行不行或者YY与ZZ哪个好;
[解说]:
特别把这句话从“浮躁”的种种表现里挑出来,是因为想向大家强烈推荐侯捷先生的文章《漫谈程序员与编程》。该文刊登在《程序员》杂志2001年第5,6期上;在侯捷先生的网站上也能找到。
文中专门以小标题“口舌之战有何益”讨论了这方面的问题,希望大家好好消化。
[kingofark的收获]:
好羡慕哑巴。
[参考]:
<K's 50 PV>条款10-15,49;<K's 35 MPV>条款23。
条款26. 请看《程序设计实践》,并严格的按照其要求去做;
[解说]:
机械工业出版社的《程序设计实践》,愿书名为《The Practice of Programming》,由B.Kernighan和Rob Pike这一对技术书籍黄金搭档合著。该书轻薄短小,却包含了两位著者浸淫程序设计领域多年经验的积累和总结,从极具现实性和艺术性的角度讲述了程序设计时需要注意的多方面问题,强调程序设计并不仅仅是编码的观点。
精心选择的素材、体贴的叙述方式(还包括上佳的翻译),都使你能够在不经意的字里行间得到丰厚的收获——真的,基本上是天上掉馅饼,你唯一的付出就是张嘴吐出一句“哦,原来是这样的啊!”
看看两位著者是如何在本书的前言中说到大家心坎儿上的吧:
“你是否曾:
浪费了许多时间去对一个错误算法做编码?
使用了一个过于复杂的数据结构?
测试一个程序而忽略了其中最简单的问题?
花了一整天功夫查找一个错误,实际上却应该是在5分钟里就找到它?
需要让一个程序运行速度快3倍而且使用更少的存储?
费劲的把一个工作站上的程序移到PC上,或者相反?
试图对其他人写的某个程序作最简单的修改?
重写一个程序,原因是你根本无法理解它?
这些事都很有趣吗?”
请大家好好体会两位程序设计领域的中流砥柱在风格、算法与数据结构、设计与实现、界面、排错、测试、性能、可移植性和记法这些方面的谆谆教导。
[kingofark的收获]:
读完这本书后,才发现自己以前曾是个傻子;这本书连傻子都能看懂;这本书能使傻子恢复成优秀的程序员。
条款27. 不要因为C和C++中有一些语法和关键字看上去相同,就认为它们的意义和作用完全一样;
[解说]:
C++里面的很多“C的东西”其实都已经不完全是所谓“C的东西”了。
C++中的const、struct等等的含义与C中的相比,小有不同矣!
关于这一点,还是希望大家多看看书。复用(reuse)我在条款20里的一句话说就是“把C++学准,学精。”
[kingofark的收获]:
求精求准,把握分寸,这是大凡天下事的道理,根本用不着kingofark在这里放气。
[参考]:
<K's 50 PV>条款20。