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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

8
1
相关文章推荐
  •  《程序员的呐喊》读书笔记(下)
  •  《程序员的呐喊》读书笔记(一)
  •  【读书笔记】Zygote 和 System 进程的启动过程
  •  读书笔记:machine-level representation of program<computer system a programmer perspective第二章>
  •  读书笔记: optimizing program performance<computer system a programmer perspective>
  •  读书笔记《Building embedded linux system》Chapter 8 根文件系统的建立
  •  读书笔记《Building embedded linux system》Chapter 5 内核思考
  •  The Linux Command Line 读书笔记(二)之文件系统The file system操作的命令
  •  【原创】ARM System Developer's Guide 读书笔记-前言

参考知识库

img

Python知识库

img

操作系统知识库

img

Java SE知识库

img

Java EE知识库

img

Java 知识库

img

算法与数据结构知识库

img

大型网站架构知识库

猜你在找

Python自动化开发基础 JavaScript开发基础 Day10
Python自动化开发基础 socket网络编程 day5
Java分布式架构:EJB+消息中间件+CORBA高级
apiDoc自动化文档同步工具
汇编C语言C++基础原理系列经典教程
C++语言基础
Cocos2d-x 3.x高级视频教程:ObjC、Swift、C++、Java交互
《C语言/C++学习指南》语法篇(从入门到精通)
跟老菜鸟学C++
使用python操作Oracle

《程序员的呐喊》读书笔记(上)相关推荐

  1. 重构-改善既有代码的设计读书笔记

    1.基本重构 1.1 提炼函数(Extract Function) 将意图和实现分开,如果需要花时间浏览一段代码才能弄清它到底在干什么,那么就应该将其提炼到一个函数中,并根据它所做的事为其命名. 1. ...

  2. 重构-改善既有代码的设计 读书笔记

    这本书真的很赞,有种醍醐灌顶的感觉,一如既往,我还是大致分析一下这本书的思想,而不是单纯的文字摘录. 首先,无论是类还是方法本身,都可以视作对象.重构则是研究怎么降低耦合度的一种技术,同时我还是很支持 ...

  3. 『重构--改善既有代码的设计』读书笔记----序

    作为C++的程序员,我从大学就开始不间断的看书,看到如今上班,也始终坚持每天多多少少阅读技术文章,书看的很多,但很难有一本书,能让我去反复的翻阅.但唯独『重构--改善既有代码的设计』这本书让我重复看了 ...

  4. 重构 改善既有代码的设计:代码的坏

    以下内容来自<<重构 改善既有代码的设计>> 一.什么是重构 所谓重构(Refactoring)是这样一个过程:在不改变代码外在行为的前提下,对代码做出修改以改进程序的内部结构 ...

  5. 重构—改善既有代码的设计

    概述 1.1 参考资料 <重构-改善既有代码的设计>读后总结 <重构改善既有代码的设计> 22种代码的坏味道,一句话概括 1.2 何谓重构 首先要说明的是:视上下文不同,重构的 ...

  6. PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性

    思维导图 索引: Ø Move Method(搬移函数) Ø Move Field (搬移值域) Ø Extract Class (提炼类) Ø Inline Class (将类内联化,就是把当前的类 ...

  7. PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

    介绍 承接上文的PHP 杂谈<重构-改善既有代码的设计>之 重新组织你的函数继续重构方面的内容. 这章主要针对数据的重构. 1.争论的声音--直接访问Field还是通过函数(Accesso ...

  8. 《重构-改善既有代码的设计》-第1例:租赁影片(2)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 上接  重构-改善既有代码的设计-第1例:租赁影片(1) 2  运用多态取代与价格相关的条件逻辑 2 ...

  9. 《重构-改善既有代码的设计》-第1例:租赁影片(1)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 买了<重构 - 改善既有代码的设计 >一书,一直没有好好看,大致过了下也觉得只是有点点印 ...

  10. 实践提高《重构改善既有代码的设计第2版》PDF中文+PDF英文+对比分析

    重构是编程的基础,是在不改变外部行为的前提下,有条不紊地改善代码.编程爱好者都知道,Martin Fowler 的<重构:改善既有代码的设计>已经成为全球有经验的程序员手中的利器,既可用来 ...

最新文章

  1. python读写文件函数_Python读写文件
  2. boost::container模块实现插入和放置的测试程序
  3. 31 锁,信号量,事件,队列
  4. printf 地址_C程序显示主机名和IP地址
  5. Android RTC 自下往上浅析
  6. Spring AOP 的日志管理实现
  7. mongodb索引生成HTML页面,mongodb高阶:索引创建、聚合查询、复制集、分片、创建备份和部署...
  8. python-excel写入代码1
  9. NOIP2015题解
  10. android 基础布局
  11. 〖3D激光点云〗深度学习点云知识!
  12. 下一代Play Station暂名Orbis但不支持PS3
  13. [Ynoi2016]炸脖龙I/Nephren Ruq Insania
  14. Oracle | 初级-第二章 Oracle安装配置
  15. 微信小程序实现生成海报并且保存本地
  16. 华为云迁移工具推荐最佳实践:Xen虚拟化迁移到华为云
  17. javascript中的prototype原型、_proto_属性、原型链
  18. 《羊年展望》中国改革蹄疾经济求稳 新思维应对新常态
  19. Nodejs+Express项目使用JWT
  20. 互联网电视变身哄娃神器:YOYO搜片真方便

热门文章

  1. JAVA 中的数组格式
  2. 好奇怪呀后面加什么标点_三年级语文提示语的标点练习(含答案)
  3. [最新版]火柴人联盟v1.14.1去签名验证去广告Android内购破解(附smali篇幅有点长啊)
  4. 你从未见过的EditText属性详解
  5. Twitter 高级搜索技巧
  6. r54500u核显相当于什么显卡
  7. Allegro如何设置创建Pin Pair的快捷键操作指导
  8. 程序员版的“鱿鱼游戏”趣图来了!
  9. c#所有部门及其下所部门生成树形图(递归算法获取或键值对方式获取)
  10. reg51.h 说明