陈硕的Blog

吾尝终日而思矣,不如须臾之所学也。吾尝跂而望矣,不如登高之博见也。……君子生非异也,善假于物也。

原创 CC2e:《代码大全(第2版)》集萃收藏

新一篇: 去掉 deplate(Viki) 生成的 html 文件行尾多余的空格。 | 旧一篇: zlib 在 Visual Studio 2005 下编译失败的解决办法

《代码大全(第 2 版)》是一本写得很有意思的书,既有生动的比喻,偶尔也有夸张的表达,另外作者还时不时开开玩笑,读起来一点也不枯燥。以下是从中摘录的一些有趣的话。这个版本略有删节,等书出版之后,我会扩充这里的内容。

  • 首先为人编写程序,其次才是为机器。
  • 傻子都会写让计算机理解的代码;而优秀程序员写的是人能看懂的代码。(Martin Fowler)
  • 好习惯很重要,因为程序员做的大部分事情都是无意识完成的。
  • goto的标号应完全大写并对齐行首,还应包含编程者的名字、家庭电话号码和信用卡号。(Abdul Nizar)
  • 编码时要把维护你程序的人想象成知道你住址的有严重暴力倾向的精神病人。(佚名)
  • 有两种设计软件的方式:一种方法是让设计非常简单,看上去明显没有缺陷;另一种方法是让设计非常复杂,看上去没有明显的缺陷。(C. A. R Hoare)
  • 忽略编译器所提示的程序错误太过草率,关掉编译器的警告功能则无异于掩耳盗铃。关掉编译器的警告功能仅仅意味着你看不到错误,并不表示这些错误就此消失,正如同小孩闭上眼睛并不能让面前的父母从此消失一样。
  • 想通过更多测试来改善软件的质量,就跟妄想通过更频繁的称体重来减肥一样。(编按:作者并不是说测试无用,而是说不能仅仅依靠测试。)
  • 心理取向对调试有什么影响?首先,它证明了养成良好的编程习惯的重要性。规范的格式、恰当的注释、良好的变量和子程序命名方式,以及其他编程风格要素都有助于构建编程的良好基础。在这样的基础之上,可能发生的错误将因为与众不同而变得格外引人注目。
  • 交互式调试器极好地代表了那些程序员们并不需要的调试器——它鼓励程序员采用随机试验查找错误的方法,而不是对程序进行系统的分析。同时,这样的工具也给了那些几乎没有资格从事细致的程序设计的人滥竽充数的机会。(Harlan Mills)
  • 聪明不像是个人性格的一个方面,也确实不是。碰巧的是,高智商与优秀程序员之间并无太密切的联系。
  • 懒惰这种品性能促使你努力减少整体花销;使你编写节省劳力的程序,别人也会觉得这些程序有用;使你编些说明,免得人们老是问你。(Larry Wall)
  • 你可能某天从上午8点工作到下午2点,就感到累得不行了。但你还是坚持下来,又从下午2点拼命干到5点。之后的一周时间,你却在修改这三小时里写出来的东西。
  • 有效编程中最重要的工作是思考,而人思考时通常不会看上去很忙。如果和我共事的程序员总是忙个不停,我会认为他并非优秀的程序员,因为他没用最有价值的工具——自己的脑袋。
  • “我们需要有五年以上C语言编程经验的程序员”就是愚蠢的说法。如果程序员过了前一两年还没有学好C语言,那么再加三年也没什么意义。
  • 调试代码的难度是首次编写这些代码的两倍。因此,如果你在编写代码的时候就已经发挥了全部聪明才智,那么按照常理,你将无法凭借自己的智慧去调试这些代码。(Brian Kernighan)
  • “这个循环好像有问题。可能是一个off-by-one错误。让我先来写一个-1试试。哦,这样不行。那么我就写个+1试试。啊哈,看来程序正常工作了。我可以宣布问题搞定了。”——随机地修改代码,直到你的代码看起来能工作,这就是所谓的“voodoo programming(巫毒编程)”。
  • 每个团队里都也许有这样一个程序员,他总会遇到无穷的问题:不听话的机器,奇怪的编译器错误,月圆时才会出现的编程语言的隐藏缺陷,失效的数据,忘记做的重要改动,一个不能正常保存程序的疯狂的编辑器——你怎么描述这种行为好呢。这就是“迷信式编程(programming by superstition)”。

最后谈一点,数学对编程很重要吗?纵观《代码大全》,作者谈了影响软件质量的方方面面,却*没有*说过程序员的数学功底是一个重要的影响因素。对程序员而言,掌握数学知识也不是必备技能。就我看来,数学不是决定性因素,甚至算不上重要因素。我没有听说过哪个软件项目因为开发人员数学功底不好而失败,或者因为在数学方面的不足使得质量低下、bug 丛生。

首先,数学是一门很大的学科,有非常多的分支。如果认为它很重要,必需列出到底其中哪些知识会影响软件开发,这样才有指导意义。我个人感觉,项目开发直接用到的数学知识很少。而且如果真的要用到,涉及的代码比例也不会很大,那么整个项目组里有一两个人(不一定是程序员)精通就行了(借助封装+抽象,让它是个黑盒子)。

与其强调抽象的“数学知识”,不如强调具体的“领域知识”。有些领域知识会涉及一些数学,比如我熟悉的有数值计算、电路分析、图像处理、信号处理等。不过这些数学知识都是针对这个领域的,而且经过领域知识的封装。有些领域几乎不涉及数学(前提是你不要把所有与思考相关的都归入“数学”),比如数字电路设计、体育比赛记分、以及很多常见的软件项目(考勤、系统工具、网站)。这些领域也都有各自的领域知识,不掌握这些知识肯定没法写软件,不过跟数学好像没什么关系。

总而言之,相比起程序员的其他职业素养(求知欲、诚实、交流能力、懒惰、良好的习惯等等),“数学知识”实在排不上号。

ps. 我是这本书的 4 名译者之一,我不可能向各位提供电子版。

发表于 @ 2006年02月13日 19:50:00|评论(loading...)|编辑

新一篇: 去掉 deplate(Viki) 生成的 html 文件行尾多余的空格。 | 旧一篇: zlib 在 Visual Studio 2005 下编译失败的解决办法

评论

#Icewind Dale 发表于2006-02-15 10:01:00  IP: 193.69.116.*
TrackBack来自《[收藏]《代码大全(第2版)》集萃》

<a href="http://blog.csdn.net/Solstice/archive/2006/02/13/598164.aspx" target="_blank">《代码大全(第2版)》集萃</a>
#419 发表于2006-02-15 10:21:00  IP: 193.69.116.*
TrackBack来自《search/C语言》

<a href="http://www.technorati.com/search/C语言" target="_blank">http://www.technorati.com/search/C语言</a>


<a href="http://spaces.msn.com/hsfymsh/Blog/cns!7BD0CECB967ABC7F!611.entry" target="_blank">http://spaces.msn.com/hsfymsh/Blog/cns!7BD0CECB967ABC7F!611.entry[/</a> ...
#lovesnow 发表于2006-02-15 09:08:00  IP: 218.73.218.*
me too
lovesnow19841214@sina.com
#moccayl 发表于2006-02-15 09:09:00  IP: 202.101.47.*
我也想要一本。谢谢LZ!
mocca_yl@hotmail.com
#何聪 发表于2006-02-14 20:58:00  IP: 222.47.119.*
谁有这本书
可否发给我
电子邮箱地址:he_zhipei@163.com
thank you!!!!!!
#zhouyong 发表于2006-02-15 01:28:00  IP: 221.213.17.*
如果有可能也请发一本我谢谢拉!
zhouyong2052@sina.com.cn
#david li 发表于2006-02-15 10:02:00  IP: 211.144.200.*
Thanks,

lidaijun1982@gmail.com
#sooshi 发表于2006-02-15 10:06:00  IP: 221.221.239.*
可以给我发一份么?谢谢了
我的e-mail是: s.shi_0819@163.com
#Sugar 发表于2006-02-15 08:33:00  IP: 61.140.35.*
《代码大全》是本好书。
我看过第一版。觉得很好,可惜来不及细看。
大哥:
要是有的话能否发我一本。(xiezhuoxian@hotmail.com)
#小四 发表于2006-02-15 10:10:00  IP: 211.167.43.*
先摘的很好。。。。
#aha 发表于2006-02-15 12:24:00  IP: 219.136.79.*
支持
wmail.cn@gmail.com
#mxking 发表于2006-02-15 08:57:00  IP: 220.191.6.*
我也想要一本。谢谢!fromMxking@126.com
#publicMo 发表于2006-02-15 10:25:00  IP: 202.103.49.*
我也是,麻烦楼主发一本
dingtaodyx@163.com
#lingwu 发表于2006-02-15 10:31:00  IP: 219.142.100.*
要是也能给我一份就好了。。。。。。。
wanglb@ebol.com.cn
#chy 发表于2006-02-15 12:46:00  IP: 221.8.9.*
也给我一本,谢谢
chenghongyulove@163.com
#ipip 发表于2006-02-15 14:25:00  IP: 218.104.20.*
一直没找到哪里有卖的
#xy 发表于2006-02-15 14:32:00  IP: 210.51.173.*
xygotoxy@gmail.com
thank you!
#mikewolfli 发表于2006-02-15 14:37:00  IP: 222.69.235.*
我会去买一本的,,但china-pub上还没到货^_^
#卧底 发表于2006-02-15 14:49:00  IP: 58.33.234.*
“我们需要有五年以上C语言编程经验的程序员”就是愚蠢的说法。如果程序员过了前一两年还没有学好C语言,那么再加三年也没什么意义。


拜托楼主,“C语言编程经验”和“学好C语言”能一样吗?
学1门语言容易,能用好是另一回事,怎么就随便能说人家“愚蠢”?
#baobao 发表于2006-02-15 13:48:00  IP: 211.155.226.*
麻烦搂主了
miaoluzeng@sohu.com
#snowfox 发表于2006-02-15 14:57:00  IP: 218.1.90.*
偶也想一本,foxflyhigher@126.com
#麻烦了 发表于2006-02-15 16:50:00  IP: 222.183.172.*
我也想要一本...最后2本都告诉我...好吧...谢谢
fifa-go2000@yeah.net
#麻烦了 发表于2006-02-15 16:50:00  IP: 222.183.172.*
我也想要一本...最后2本都告诉我...好吧...谢谢
fifa-go2000@yeah.net
#麻烦了 发表于2006-02-15 16:50:00  IP: 222.183.172.*
我也想要一本...最后2本都告诉我...好吧...谢谢
fifa-go2000@yeah.net
#Solstice 发表于2006-02-15 20:15:00  IP: 220.166.150.*
大概再等20来天吧。
#Solstice 发表于2006-02-15 16:59:00  IP: 218.88.180.*
to 卧底:

这话是 Steve McConnell 说的,你不妨找他理论。http://www.stevemcconnell.com/
#fylinglin 发表于2006-02-15 17:51:00  IP: 222.66.7.*
我也想要~~~~fylinglin@163.com
#Leooo 发表于2006-02-16 08:52:00  IP: 221.226.122.*
Liber Wang 发表于2006-02-16 1:24 AM IP: 207.236.90.*
有没有搞错啊?尊重别人的翻译成果好不好.
想免费的话,有英文电子版可以下载.

这话搞笑,写得人就没成果了,为什么人家不介意免费呢
#Jack 发表于2006-02-15 19:18:00  IP: 222.34.142.*
我也要一份,谢谢!
z_jingqiang@yahoo.com.cn
#Liber Wang  发表于2006-02-16 09:49:00  IP: 69.192.84.*
不好意思,我没说清楚.
英文电子版网络上已经到处流传了.至于是不是作者免费开放的.我不知道. 也许和Bruce Eckel一样,普惠天下,也未尝不可。人家是大腕,也许不在乎。
至于中文版,我个人认为中国的出版社不会开放全部的电子版。至少在赚钱之前不会。中国的出版社还没有那个层次。那么大家问译者要电子版会给你吗?
#张德顺 发表于2006-02-15 19:58:00  IP: 218.85.162.*
请问Solstice:这本书什么时候能买到?
#Luson 发表于2006-02-16 09:52:00  IP: 210.21.230.*
写得好

如果大虾有的话

麻烦发送一份


lxd@chd.edu.cn
#shoutor 发表于2006-02-16 09:55:00  IP: 219.238.185.*
还是很有见地的
#Solstice 发表于2006-02-16 11:48:00  IP: 218.88.183.*
to Liber Wang

国外的出版社也没有到你说的那个“层次”,开放电子版也是极少的 :)
我不能慷他人之慨,把不属于自己的东西拿来送人。
#XianBin 发表于2006-02-16 12:55:00  IP: 61.148.82.*
我几个月前就搜索过了,目前英文版的电子版好像还没有。
#lovehdd 发表于2006-02-16 19:05:00  IP: 218.66.81.*
我也要一样,中、英文版都行

csdn573@163.com
#sai 发表于2006-02-16 19:48:00  IP: 59.37.87.*
sai129@gmail.com
谢谢大哥!
#xlpjava 发表于2006-02-14 22:09:00  IP: 219.134.218.*
如果有可能也请发一本我谢谢拉!
lpp333444@yahoo.com.cn
#Liber Wang  发表于2006-02-16 01:24:00  IP: 207.236.90.*
有没有搞错啊?尊重别人的翻译成果好不好.
想免费的话,有英文电子版可以下载.
#Liber Wang 发表于2006-02-16 01:37:00  IP: 207.236.90.*
to 卧底:

单单从这句话来说,是过于武断.
您可以看看书(第一版),从整个文章的角度来看,就可以理解这句话了. 我到觉得没什么错.

Liber Wang
#小老虎 发表于2006-02-16 22:37:00  IP: 222.244.45.*
什么时候出版了,告诉我,我去买!E-mail:shaohu0401@yahoo.com
#yeka 发表于2006-02-17 13:30:00  IP: 221.232.91.*
to Liber Wang


出版社是企业,企业如果不能通过产品获得利润,拿什么来继续维持运转呢? 企业不是慈善机构,而且即使是慈善机构,要帮助人,方式也并不简单,都需要经过深入思考的。

所以,简单说一句“中国出版社还没有那个层次”,不是一种深入思考且负责任的态度。

#Solstice 发表于2006-02-17 00:00:00  IP: 220.166.137.*
to 小老虎:

你可以去 www.china-pub.com 定购,书到货他们会给你发邮件的。
#Real_Sc 发表于2006-02-17 14:33:00  IP: 221.204.197.*
数学很重要,在程序的效率上,一个极具数学思想的人,总会做的比一般人好。

#euclid 发表于2006-02-17 15:00:00  IP: 222.40.163.*
我越学越觉得数学素质的重要了。
#Solstice 发表于2006-02-17 15:53:00  IP: 220.166.141.*
“程序的效率”有多重要?它对软件整体质量的影响有多大?

《代码大全》第20章指出,软件质量的外在特性有:正确性、可用性、效率、可靠性、完整性、适应性、精确性、健壮性等;内在特性有:可维护性、灵活性、可移植性、可重用性、可读性、可测试性、可理解性等。性能只是软件整体质量的一个方面,通常不是最重要的。(你能不能告诉我哪些项目因为性能达不到目标而失败?)

即便性能确实很重要,除了一般的代码优化手段,还有具体哪些数学知识对提高程序性能有帮助?如果不把这个说清楚,光强调“数学很重要”,那不等于跟没说一样?

另外对于这些性能关键的代码,应该进行封装和抽象,免得扩散到整个项目中。 通常这些代码占的比例不会很大,项目组中不是每个人都必需有能力编写并维护这种代码(毕竟术业有专攻,一个普通程序员不可能样样精通)。

一个“极具数学思想”的人,干点什么不好嘛,还来抢程序员的饭碗,何必呢?
#starspace 发表于2006-02-18 11:21:00  IP: 58.66.140.*
我也要一份,谢谢版主!
star-0796@163.com
#tigerdog 发表于2006-02-18 17:00:00  IP: 59.42.121.*
什么时候可以买到啊。
#离人 发表于2006-02-20 15:51:00  IP: 203.212.5.*
楼上的,数学!=高等数学

写程序时用到数学的地方还是很多的。分析算法的效率更是如此
#XianBin 发表于2006-02-20 11:02:00  IP: 61.148.82.*
请问有几个人在开发的时候用到《高等数学》的东西?
#Solstice 发表于2006-02-20 21:32:00  IP: 210.31.76.*
to 离人:

“用到数学的地方很多”?说说看,please。哪些场合,用到哪些数学知识。

“分析算法效率”要用一点数学,不过这种活动在软件开发中占的比例极小;再说一般程序员能自行分析的算法,大都是那种相当简单的算法,分析它也用不了什么数学知识——无非数数有几层循环,每层循环执行多少次,然后乘起来——如果你把数数(counting)也算作“数学知识”,那我无话可说。更复杂的算法有专门做理论工作的人来分析,程序员只要记住结论就行,我想程序员一般不会自己发明新算法吧?
#XianBin 发表于2006-02-22 10:21:00  IP: 61.148.82.*
to 离人:

数学分很多中,比如《高等数学》、《离散数学》等等,像我们中学的是基础数学,这是最基本的。

大学之后的数学主要是《高等数学》,计算机专业还会学《离散数学》,我不是计算机专业出身,没有系统学过《离散数学》,但是我认为《离散数学》对程序设计有很大启发作用,但是《高等数学》就不同了。总的来说我并不否定数学的重要性。

具体而言,我更喜欢把程序设计看成是一门艺术,而非“算数”,如果硬要说数学的重要性,那么可以用在尖端领域,比如航空航天方面,测绘方面等等。而复杂的算法,我们一般人没有那么高的天分去发明这些,一般只能是参照那些天才提供的,比如向“二分查询法”这样快速的查询方法,我觉得只要有书籍参考,能够实现就可以了,并不非得需要很好的数学功底去研究它的整个实现机理,另外现在的语言已经为我们去掉了很多复杂的东西,比如C#里面的Hashtable就可以省去很多复杂的循环查询而仅仅根据关键字就能查到我们需要的东西,以后就更方便了,微软正在給C# 3.0加入一种叫LINQ的技术,只要像SQL语言一样我们就可以从字符串里面找到我们需要的内容。

总的来说,术业有专攻,我认为做一般应用开发对于数学的要求不会太强烈的。
#Visitor 发表于2006-03-06 18:03:00  IP: 59.66.117.*
TO Solstice :

数学对编程重不重要,请去问问Knuth有数学头脑的人是不是在抢程序员饭碗。无论如何他比你有发言权。

另外与网友讨论措辞请尽量谦虚和尊重他人。你翻译了代码大全的一部分,谁知道你的工作是方便了广大看中文版的程序员,还是糟蹋了原著。没有什么值得你这样骄傲的。
#Solstice 发表于2006-03-07 10:50:00  IP: 207.46.89.*
to Visitor:

既然他比我有发言权,你何不自己去问?

我哪点不尊重他人?

另:你一方面要求我尊重他人,一方面你又对我说“谁知道你的工作是方便了广大看中文版的程序员,还是糟蹋了原著”,这看上去真是很有趣。

to all:

最后我总结一下自己的观点:

1. 如果你数学很好,OK,你可以设法把数学应用到工作的任何方面,包括编程。
2. 如果你数学不是很好,那也不妨事,你照样可以成为优秀的程序员。软件开发跟数学没多大关系。
3. 能否成为优秀的程序员和数学是否优秀没有必然联系。
4. 作为一名程序员,没必要跟数学较劲。术业有专攻,听到有人说“数学很重要”就一头扎进自己本不擅长的领域,实在没必要。

另:Knuth 是个天才,身上有无数的光环,很多人喜欢拿他说事儿(Einstein 也有同样的遭遇),“传说中的Knuth形象"都快遮住他本来的面目了。

我在自己的blog说出我的观点,同时我并不打算说服任何人接受我的观点。觉得同意就点点头,觉得不同意就嗤之一笑。发帖赞同或驳斥我都欢迎。

《代码大全》我只翻译了很小的一部分(1/8)。我不认为作为译者就高人一等,很多比我有本事的人都不愿意或没时间做翻译工作;同时我也不认为作为译者就比别人矮一截,说话就得低三下四。

“如果说译者在提出自己的看法之前先要给读者鞠三个躬请求谅解,才算是尊重读者。我只能觉得可笑,自己没那个习惯,也不想去学。”——裘宗燕
#chinesezzz 发表于2006-03-08 08:45:00  IP: 218.56.61.*
从年初就说要出版,都等到现在了,还没有见到书的影子。
#jar-喳 发表于2006-03-16 17:36:00  IP: 221.219.10.*
我就是觉得吧,这书能不能快点。光在这BB了,干点实际的事情。
#Solstice 发表于2006-03-17 16:09:00  IP: 207.46.89.*
本月应该就能上市了。
#chineselibo 发表于2006-03-28 09:49:00  IP: 192.168.16.*
我也想要一份:chineselibo@gmail.com
谢谢
#Zilog_T 发表于2007-10-06 16:21:47  IP: 221.238.245.*
这两句:顶:~

有效编程中最重要的工作是思考,而人思考时通常不会看上去很忙。如果和我共事的程序员总是忙个不停,我会认为他并非优秀的程序员,因为他没用最有价值的工具——自己的脑袋。

“我们需要有五年以上C语言编程经验的程序员”就是愚蠢的说法。如果程序员过了前一两年还没有学好C语言,那么再加三年也没什么意义。
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 陈硕