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

2024-02-29 20:48

本文主要是介绍《程序员的呐喊》读书笔记(上),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《程序员的呐喊》是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

这篇关于《程序员的呐喊》读书笔记(上)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/760022

相关文章

《C++标准库》读书笔记/第一天(C++新特性(1))

C++11新特性(1) 以auto完成类型自动推导 auto i=42; //以auto声明的变量,其类型会根据其初值被自动推倒出来,因此一定需要一个初始化操作; static auto a=0.19;//可以用额外限定符修饰 vector<string> v;  auto pos=v.begin();//如果类型很长或类型表达式复杂 auto很有用; auto l=[] (int

LabVIEW程序员是怎样成长为大佬

成为一名LabVIEW编程领域的“大佬”需要时间、实践、学习和解决复杂问题的经验。尽管LabVIEW作为一种图形化编程语言在初期可能相对容易上手,但要真正成为精通者,需要在多个层面上深入理解。以下是LabVIEW程序员如何逐步成长为“大佬”的路径: 1. 打好基础 LabVIEW的大佬们通常在初期会打下非常坚实的基础,理解LabVIEW编程的核心概念,包括: 数据流编程模型:Lab

读书笔记(一):双脑记

谁又知道年轻人那反复无常的大脑有着怎样的运行机制?尽管他们的大脑已被荷尔蒙折腾地七荤八素;却偶尔还会有灵感跻身夹缝之间; 层级化:每时每刻,人类都在进行抽象化,也就是说,从客观事实中发展出更具普遍意义的理论和知识。利用这种方法,我们得以不断地开发出新的更为简洁的描述层级,方便我们那容量有限的大脑加以处理。分层的概念几乎可以应用于任何复杂系统,甚至包括我们的社交世界,也即是人们的个人生

程序员必备心理学——心流

心理学之心流 前言一、“心流”是什么?二、心流的好处二、如何进入心流心流状态的四个阶段第一个阶段:挣扎第二个阶段:放松第三个阶段:心流第四个阶段:巩固 进入心流的技巧 总结题外话 前言 你是否常常感觉自己明明学习了一整天,但是就是感觉没有太多的收获。这个时候除了你的学习方向等问题之外,也可能是你的学习方法太低效了。作者本人就经常有这种情况,好在偶然间在b站刷到一个大佬的这个心

程序员都在使用的画图工具

大家好,我是袁庭新。 程序员都在使用的画图工具,你一定没用过这款画图工具吧!我教程中的架构图都是用它来画的。 比如我编写的RDB工作原理图就是用draw.io绘制的,如下图所示: 再例如Redis集群故障恢复原理图我也是通过draw.io工具绘制的,如下图所示: 是不是觉得draw.io绘制的图形特别简洁、美观。它的官网是: https://www.drawio.com dra

2024.09.07【读书笔记】| SMRTLink工具对PB组装疑难解答

在使用SMRT Link的pb_assembly_hifi命令进行组装分析时,可以参考以下步骤和信息: 使用pbcromwell show-workflow-details pb_assembly_hifi命令查看该工作流的详细信息。这将帮助你了解所需的输入参数和可选输入参数。 根据工作流的要求,你需要准备相应的输入文件。例如,对于单样本基因组组装,需要CCS(连续测序)的fastq文件路径作

GitHub:代码是程序员沟通最直接的手段

如果不是 Andreessen horowitz 的投资,估计 GitHub 很难被福布斯、CNN、纽约时报等传统媒体注意到。普通大众之前不了解这个工具,是因为它距离记者的世界太远了——GitHub 是一个程序员所使用的托管项目的服务。 但在一些程序员眼里,它不仅是托管项目的地方,还是“开源”项目的大本营,而且是提高程序员“技术水平”和“技术品味”的地方,更是一个程序员社交的地方。

黑马程序员---银行业务调度系统

模拟实现银行业务调度系统逻辑 需求分析: 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。 异步随机生成各种类型的客户,生成各类型用户的概率比例为:         VIP客户 :普通客户 :快速客户 =  1:6:3。 客户办理业务所

黑马程序员---空中网面试题

空中网4k/5k月薪挑选大四实习生的线程题     两年前,我们一个大四的学员去应聘空中网的实习生职位,空中网只给他出了三道线程题,拿回家做两天后再去给经理讲解,如果前两题做好了给4k月薪,第三道题也做出来的话就给5k的月薪。这样的实习薪水和招聘要求,不需要有工作经验的限制,纯粹是技术功底的比拼和考核,而不像许多其他公司非要招两年工作经验的人,逼得那些刚毕业和未毕业的大学生不得不去撒谎,不得不去做

黑马程序员---线程并发库

软件包 java.util.concurrent 在并发编程中很常用的实用工具类。 请参见:            描述 接口摘要BlockingDeque<E>支持两个附加操作的 Queue,这两个操作是:获取元素时等待双端队列变为非空;存储元素时等待双端队列中的空间变得可用。BlockingQueue<E>支持两个附加操作的 Queue,这两个操作是:获取元素时等待队列变为非空,以及