程序员的呐喊

程序员的呐喊

Posted by Lucas on May 2, 2016

《程序员的呐喊》这本书是Hyperink的编辑们挑选了steve-yegge的博客的一些帖子,根据自己的想法组织了大部分章节段落。注意,steve-yegge的博客需要翻墙。

第一章 编程语言里的宗教

巴别塔

亚马孙的代码库规模庞大失控,原因:

  1. 亚马孙的主流语言里包括了两门非常啰嗦的语言,C++和java(精炼的perl正在退出主流)
  2. 亚马孙几乎不使用自定义领域语言DSL来解决一些问题
  3. 抗拒新语言,如表达能力强的Ruby或Erlang

上面所提到的都是语言问题,但是其实企业文化才是主因,大多数人都是抱着非礼勿视,非礼误听的态度的。

C

C语言是必修课,因为:

  1. 计算机体系结构的标准是冯.诺依曼体系结构,当今世界上大多数电脑是冯.诺依曼结构的,而C以精悍的语法展现了冯诺依曼机的能力。(还有lisp机、神经网络计算机、细胞自动机)
  2. Unix和Windows等在内的几乎所有操作系统都是C写成的,它们全部属于冯诺依曼机操作系统。任何与C语言迥异的语言都发挥不出硬件的实际能力。C语言最擅长的就是映射计算机是如何工作的。

C++

C++非常冷漠,可以说是世界上最糟糕的语言。C++非常愚钝,用愚钝的语言是写不出聪明的系统出来的。语言能塑造世界观,愚蠢的语言只能塑造愚蠢的世界。

  1. 缺乏自省能力,无法了解自身。
  2. 采用过于低阶的抽象。代码量庞大。
  3. 漂亮的C++代码大多是C外加一些C++特性,可是各种特性很难用,也会用的不优雅,没有节制。

编程语言教授克雷格.钱伯斯彻底否定C++,甚至连STL的发明人也公开宣称自己讨厌OOP。计算机编程语言里没有所谓的“亲近生侮谩”,只有在掌握更优秀的语言的前提下,才会懂得怎么去批判自己最熟悉的那门语言。

Lisp

Lisp是一种基于lambda演算的编程语言,lambda演算是另外一种进行计算的模型,人们能够理解和编写lambda演算。Lisp是一门擅长映射计算机是如何进行进行的,与C互为两个极端。学习Lisp在遇到很多GNU的应用程序时会比较顺手。Lisp入门门槛比较高,schema是Lisp的短小纯正的方言,只需掌握《The Little Schemer》和《The Seasoned Schemer》即可。至于其他Lisp语言已经变成像C++和java那样复杂的编程环境。

亚马孙的元老,谢尔.卡范,格雷格.林登,埃里克.本森都是用Lisp和C,也都是Emacs的拥趸,拒绝C++、perl和java。(改变世界的工程师,詹姆斯.高林斯,高纳德,保罗.格林厄姆,杰米.扎温斯基、埃里克.本森,真正的工程师只用Emacs,看保罗.诺德斯特龙是怎么工作的,对那些只用过.NET系IDE的人来说绝对是大开眼界)谢尔用C写成Mailman,然后用Emacs-Lisp封装起来。(当时Emacs-Lisp的高手比较少,即使是“双披萨团队”的客服应用Mailman没人关心只能退休)

埃里克.雷蒙说过,学习Lisp的经历能够让人受益终身。

java

Java可以说是过去10年来,计算机行业出现的最好也是最坏的事物。

优点:

  1. 从C++里无数平凡却又容易出错的细节中解放。像是突然之间有了一个行政助理,自己可以有时间去思考真正需要解决的问题上而不是把宝贵的时间浪费在无聊的琐事上。
  2. Java拥有全面的编程环境外,还是一种信仰,而太喜欢java的人都不值得信任,要找到优秀的java程序员很不容易。(很容易碰到那种对语言环境很熟悉,但是对品味以及计算本身等真正重要的东西却一无所知的人)
  3. 我的周围肯定会出现不会写代码的家伙,相比C++,java能够让他们的危害性小一点。
  4. java所拥有的并不只是语言核心本身。哪怕它演化速度很慢,只要它还在进步,就还有希望。

缺点:

  1. 作为语言本身不怎么样,作者认为再好的类库也拯救不了一门垃圾语言。(这可是在Geoworks汇编地狱摸爬滚打得来的经验) 杰米.扎温斯基批判过java,但是他认为,java没有free(),光是这一点,其他优点相较之下只是锦上添花,而java的任何缺点都足以让人忽视了。 扎温斯基抱怨的大部分地方现在已经改了。java在每个层面上都表现得很好,除了语言层面,并不算是优秀(扎温斯基的不满主要集中在语言本身这里),但是正如扎温斯基所说,“它依然是今天最好用的语言,远远比我们在实际工作中用的那些彻头彻尾的垃圾语言要好得多”。
  2. Java缺了一些C++的优点,比如(在栈上)传引用、typedef、宏,还有重载操作符和多重继承。
  3. 高林斯承认,要是有机会重来的话,绝对不会考虑接口,接口是很糟糕的东西。(详见作者博客,“固执己见的精灵”、“火焰箭”和“盗贼披风”)

补充:

  1. 不管什么语言,不合格的程序猿写出来的都是烂代码。可惜在整个业界里大多数都是这样的人。
  2. 若是吃不准要找什么样的程序猿,不妨考虑一下这些条件: 会玩好几门语言,讨厌J2EE和EJB那类臃肿的框架,还有Emacs编程。这些都是不错的指标。

Perl

Perl的流行有三个原因:

  1. Perl代码写起来很快
  2. 营销世界一流
  3. 在Unix集成和字符串处理方面是王者
  4. 有很多怪异的设计,很疯狂,既是优点又是缺点

其他语言(主要是Lisp和smalltalk)全都假装不存在操作系统这个东西,而Lisp(列表)和smalltalk(对象)才是解决一切问题的银弹,Perl的理念与此相反,过于关注Unix和字符串,错过了实现列表和对象的时机,Perl在列表和对象方面很难正确实现(perl没办法处理好列表是因为perl自动压扁列表,而perl没有对象是因为Perl之父拉里从没相信过它,OO和perl貌合神离,从未被社区接受。时至今日,如果不花大量时间去研究参考书的话,是没有办法理解perl为主题的书籍、教程或者ppt的),逐渐演变成一台典型的哥德堡装置。

Ruby

差不多每15年左右,就会出现更优秀的语言。C++取代了C,至少对大规模应用程序开发来说是这样的,那些人追求性能却又渴望数据类型。现在C++逐渐被java所取代,而毫无疑问Java会在7年之后被更好的语言取代,我说的是它彻底干掉C++之后的7年,显然它还没有做到这一点,这主要归功于微软拖慢了java彻底占领桌面的进程。不过在服务器端,C++已经基本出局了。

Ruby之父松本行弘对Perl充分实行了拿来主义(包括一点不好的东西,好在不多),照搬了Perl的字符串处理和Unix集成,语法完全一样,接着从Lisp吸收了列表处理的精华,从smalltalk拿来了OO,迭代器取自CLU,基本上各个语言的有点都有了。完美糅合,完全看不出斧凿的痕迹。

Perl到Ruby的飞跃和C++到java是一样的,而且没有附带任何缺点,因为Ruby是Perl优点的超集,而Java去掉了一些人们想要的东西却没有提供真正的替代方案。Ruby非常漂亮,充满乐趣,兼具实用性。(作者推荐_why先生的Ruby指南豆瓣介绍

Python

Smalltalk程序员苦苦等待取代C++的机会,结果Java一出,就彻底毁掉他们的所有希望。今天的Ruby之于Python,扮演的正是这样的角色。

Python用起来很顺手,本来有机会一统江湖的,但是它有两个致命缺陷,一个是空白符,另外一个是死脑筋。

  1. 空白符问题就是Python的嵌套是通过缩进来完成的,它强迫你用特定的方式来缩进,侵犯了程序猿胡乱排版的自由,2333.(其实python之父吉多.范罗苏姆之前也是如同Ruby之父拉里,昏招一堆。比如python之前居然没有词法作用域,甚至连动态作用域也没有。python最早只有全局和局部(函数)作用域,所以虽然它拥有一个“真正的”OO系统,可是却连自己的实例变量都没法访问。你只能给每个实例方法带上一个self参数,然后通过self来访问自己的实例参数)
  2. 死脑筋体现在python社区不喜欢听人们抱怨和建议,不思进取。Python社区的氛围没有那么好。