《程序员的呐喊》读书笔记(上)

《程序员的呐喊》是Google一位老程序员的经验总结,文中展现了他对各大语言如Java、C/C++、Lisp、Python、Ruby、Perl等的极端观点,比如大力吐槽C++,极力推崇C、Lisp、Ruby。他的观点只是他个人经验所得,也不一定符合实情,仅供参考,有任何想法都可以说出来一起讨论。

  1. 程序员和司机一样,总是自我安慰说等到需要的时候再去学新技能也来得及。但是在内心深处他们都明白,其实当需求出现的时候就已经太晚了。因此现实情况是这样的,旱鸭子会和水保持距离,司机会绕开泥泞的路段,而程序员会躲在舒适区里,搭建围栏把自己保护起来,然后祈祷世界和平。

me:其实喜欢躲在舒适区里是每个人都或多或少存在的性格弱点,谁能克服它谁就能学到新技能,谁就能站的比别人高。对于偶尔努力经常懒惰的我来说,技术也是学的广而不精,对新技术都有兴趣但学不到精深处,希望刚工作的我可以改善这个弱点。

  1. 当时04年亚马逊正饱受其庞大代码库的困扰,我曾经一度认为它的代码库失控是因为语言问题,后来才意识到企业文化是主因。首当其冲的是,亚马逊的主流语言里有两门非常哆嗦的语言C++中和Java,外加一门精练的语言Perl。但是Perl正受到排挤,渐渐退出主流。我觉得这是因为Perl程序员能用更少的人力完成和Java/C++程序员同样的工作量,所以要是比人多的话,他们注定是赢不了的。根据我们的估算,亚马逊的代码量比它的功能数量膨胀得更快。第二个因素是,亚马逊的很多技术问题完全可以用自定义领域语言(DSL的方式来解决),比如大规模的查询、分布式计算、产品配置等,他们写了太多不必要的代码了。我后来跳到Google,发现他们为这些完全一样的问题专门编写了强大的自定义DSL。这证实了我心中的疑虑,亚马逊的工程师在这些问题上和无头苍蝇没什么两样。我敢说这句话误伤的概率极低。最后一点就是,和绝大多数公司一样,亚马逊非常抗拒用新语言来解决问题。他们会避免使用表达能力更强的通用语言,比如Ruby或Erlang。他们也几乎从来不会想到自己去写DSL。

me:庞大代码库是很多公司都有的弊病吧,可又有多少能想到用DSL来解决呢。害怕变动、拒绝新技术的公司注定是失败的。

  1. 为什么C是必修课?
    一个原因是现在的电脑都是冯诺·伊曼结构的,而C以精悍的语法展现了冯·诺伊曼机的能力,其他类型的机器也是存在的,比如Lisp机。还有一个原因就是,Unix是用C写的,不仅如此,包括Windows等在内的几乎所有的操作系统都是用C写成的,因为它们全部属于冯诺伊曼机操作系统。你觉得自己还有其他选择吗?至少在操作系统领域里,任何与C迥异的语言都发挥不出硬件的实际能力,至少这句话放在近一百年里都是对的这些系统都诞生于这段时期内。

  2. 计算机编程语言里没有所谓的“亲近生侮谩“,只有在掌握更优秀的语言前提下,才会懂得怎么批判自己最熟悉的那门语言。因此,要是你不喜欢我批评C++,我建议你去了解一下更优秀的语言是什么样子的,然后你才有资格否定我的话。不过到那时你就不会来否定我了,我忽悠成功了。那时你不会再喜欢C++,可能会有点生我的气,忽悠你讨厌自己之前最爱的语言。所以你还是别管我说什么了。C++很出色,非常优秀。别在意我的话。它是门很棒的语言。

me:作者是有多么讨厌C++啊!“亲近生侮谩“的意思是当你对一个人或事物越亲近越熟悉,你就会越讨厌越忽视TA。而作者认为计算机语言里不会发生这种事情,除非你知道了其它更优秀的语言。我赞同这个观点。

  1. 亚马逊的伟大元老们只用两种语言:C和Lisp。显然,他们都是Emacs的拥趸。

me:的确很多编程界的大佬都爱这两门语言,比如《黑客与画家》的作者。

  1. 杰米·扎温斯基曾经写过一篇非常有名的文章来批判Java有多糟糕,但他还是这样写道:“先说好的地方:Java没有free(),我必须承认这一点,其他锦上添花而已。光这一点就足以让我忽视其他缺点了,不管它们有多糟糕。有鉴于此,本文接下来的内容都可以说无足轻重。”杰米的这篇文章写于1997年,那时的Java还在襁褓之中,如今Java早已今非昔比,他当时抱怨的有些东西现在都已经修复了。但也不是全都改好了。就语言层面,Java仍然算不上优秀。但正如杰米所言,它“依然是今天最好的语言,远远比我们在实际工作中用的那些彻头彻尾的垃圾语言要好得多”。不过Java也缺了一些C++的优点,比如(在栈上)传引用、typedef,宏,还有重载操作符。这些东西并非必不可少,但是需要的时候就很方便。对了还有多重继承,说得我都开始怀念从前了。假如你要用我自己的“固执己见的精灵”来反对多态,那么我还可以举出更多为什么多重继承是必需的例子。有时间我们可以讨论一下“火焰剑”或者“盗贼披风”的问题,你就会明白接口是多糟糕的东西了。几年前,高斯林自己也承认,要是有机会重来的话,绝对不会考虑接口。而这正是Java的问题所在。

me:Java好在垃圾自动回收,坏在臃肿不堪,语言本身设计的不好。

  1. 总之,Ruby对Perl充分实行了拿来主义。Ruby的作者Matz(我没记错的话,他的本名是松本行弘,不过通常都自称“Matz”)甚至可能有点借鉴过头了,连些不好的东西也拿了过来。好在不多,只有一点点而已。基本上Ruby照搬了Perl的字符串处理和Unⅸ集成,语法完全一样,只此一点,Perl的精华就全都有了。这可以说是开了个去芜存菁的好头。接着Matz从Lisp那里吸收了列表处理的精华,从Smalltalk那里拿来了OO,迭代器则是取自CLU,基本上各个语言里的优点都吸收进来了。所有的这些东西被完美地糅合在一起,你压根注意不到斧凿的痕迹。

me:Ruby本质上就是各种语言精华的大杂烩,去芜存菁,作者精通这么多语言的精华非常值得敬佩。现在的框架也是的,都是互相之间借鉴精华,按需索取,无可厚非。

  1. Python本来是有机会一统江湖的,但是它有两个致命的缺陷:一个是空白符,另一个是死脑筋。所谓空白符的问题就是Python的嵌套是通过缩进来完成的。它强迫你用特定的方式来缩进,这样大家的代码看起来就是一样的了。可惜,很多程序员都讨厌这个规定,感觉好像被剥夺了自由一样;他们觉得胡乱排版和和编写那种精简到一行没人看得懂的小程序是自己的权利,而Python却侵犯了这一点。Python之父吉多·范罗苏姆之前也出过几次昏招,虽然不如拉里那么惊世骇俗,但也真的是够小儿科的了。比如,Python原本是没有词法作用域的。可问题是它连动态作用域也没有,虽然说动态作用域也有自身的问题,但至少还勉强可以用。Python最早只有全局和局部(函数)作用域,所以虽然它拥有一个“真正的OO系统,可是—个类却连自己的实例变量都没法访问。你只能给每个实例方法带上一个self参数,然后通过self来访问自己的实例数据。所以你在Python里看到一堆self ,哪怕你忍了空白符,这些self也能把你给逼疯了。

me:用空格缩进的确让人不爽,不过提升了规范性。

  1. Java 其中特点之一就是凸显了“架构”。Java国王授予了架构尊崇的地位,因为架构完全是由名词组成的。我们都知道,名词就是事物,而在Java里,事物的地位远胜一切动作。建筑是由看得见摸得着的事物构成的,譬如高耸入云的庞然大物,又如用棍子敲打时发出低沉悦耳声音的东西。Java国王特别喜欢这种沉闷的声音,每次换新马车的时候,他都特别喜欢从踢轮子中获得快感。不管上述的儿歌有何瑕疵,它就是不想要任何东西。
    me:的确,Java最让人受不了的就是一堆架构,一层层封装致死,调试起来也麻烦。

  2. 福勒告诉我们所谓重构,就是通过迭代,将恶心的代码变成优质代码的艺术和科学,是能妆点代码却不会在操作过程中产生破坏的算法,而且正确性都是能证明的。

me:作者认为福勒写的重构这本书非常不错,值得一读。

  1. 那么这些代码一开始是怎么变烂的呢?首先当然是由于过早优化造成的,为了避免重复计算而保存了太多的中间变量。因为害怕方法调用会造成虚幻的负担,而刻意回避编写短小的函数。我们还弄出一大堆类的继承关系,仅仅是为了想象中可能存在的复用,为了避免分配器对象而弄出一个巨大的参数列表。滥用null,把它当成成具有语义的符号。放任简单的布尔逻辑表达式变成错综复杂、无法阅读的浆糊。不用访问方法来封装数据结构。还有其他很多乱七八糟的问题。正是因为各种各样的小错误别类,加以命名,并归类成严重错误。

me:这是福勒重构这本书告诉我们的。

  1. 那我们的代码是怎么变成那样的呢?因为写得烂。这时重构就能救命。再优秀的设计也会出纰漏,但我们仍然可以补救,反正有自动化的奴仆来帮我们修复这些:小问题。它们不知疲倦,我们只要点个按钮就行了。既然如此,谁能离得开自动化重构工具?还有谁能协调Java那些数以百计的小腿,让它们像毛毛虫一样统一行动呢?让我来告诉你答案:Ruby是蝴蝶。(意指Ruby是完全不同的物种,Java中自动化重构工具所要解决的问题在Ruby中根本不存在。)

me:作者喜欢Ruby,觉得Java需要重构是因为代码写的烂,要是用Ruby写的话根本不需要重构,也就没有自动化重构工具。

  1. 首先,再垃圾的语言和技术也一样有机会赢。甚至赢面可能还会大一点,因为改正起来会更快。Java击败了smalltalk , C++击败了Object-C,Perl击败了Python,VHS击败了Beta,诸如此类。并不是说一项技术(特别是编程语言)比较优秀,它就一定会胜出。营销才是关关键。追求公平竞争只会导致你的语言无人问可津。

me:原来一门语言的流行起关键作用的不是这门语言有多优秀,而是它的营销做的有多好。嗯,我记得Java就是营销搞起来的。

  1. 注意,骂谁也不能骂Python。相反,骂Ruby骂得最凶的人可能就是Matz自己了。他在自己的演讲“为什么Ruby很烂”里,自陈了Ruby的各种问题,当时看得我汗都下来了。不可否认,任何语言都有缺点。相比之下,我更喜欢Ruby众的坦诚,Pyhon那种一味指责别人,回避问题,过分地自我标榜的行为令人感到恶心。

me:作者的意思是Python众狂妄自大,而Ruby相对比较坦诚,这是作者通过经过逛两个社区得出的结论,也不一定准确。

  1. Ruby谈不上有多出色,但它现在手上有杀手级应用。Rails对推动Ruby起到了巨大的作用。在Web框架方面,Python可谓输得一败涂地。号称要和Rails竞争的Python框架至少有五个:Pylons、Django、TurboGears、Zope,还有Subway。其实3个(甚至4个)都嫌多啊。从营销的角度来讲底哪个比较优秀其实根本不重要,重要的是Python社区应该选中其中一个后全力鼓吹;否则每个框架都只只能分到20%,结果谁都没有实力跟上Rails的步伐。
    me:再一次吐槽Python在web框架方面的不足,话说Python有杀手级应用吗?

  2. Java并没有提出什么新鲜的东西,它有的SmallTalk早就有了。

me:这种论点好像在哪里听过。

  1. 相反我却亲眼见识了日本服务生为了满足那些在商务旅行中的醉汉所作出的努力,他们的敬业程度让我这个美国人都感到羞愧。如果要问世界级的服务水平是什么样的,来日本看看就明白了。

me:真的吗?真的吗?继续学日语,好去日本玩……

  1. 最终让Java平台占领了那些它做梦也没想到过的领域,一切都亏了这个所谓的“杀手级应用”Applet。

me:不会吧???没听说过Applet这么厉害,一直觉得它是鸡肋。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • 本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及...
    dle_oxio阅读 11,091评论 6 244
  • 一、异同对比选择1、Python和ruby的相同点: * 都强调语法简单,都具有更一般的表达方式。python是缩...
    沃伦盖茨阅读 4,139评论 2 24
  • http://blog.jobbole.com/18587/ 原文出处: Steve Yegge 译文出处:b...
    Albert陈凯阅读 477评论 0 1
  • To杨: 这是一个安静的下午。突然想给你写些什么。本是想找一张正式一点的纸张。但想想又觉得多余。 亲爱的朋友,在我...
    流年雨墨阅读 300评论 0 4
  • 真的,我很意识清楚自己的情绪状态,有时想公布于公众场合,只是希望这股情绪被知道就可以了。 但是,往往事后又会后悔,...
    草木吟阅读 146评论 0 0