Java
Java是过去的10年中计算行业里发生过的最好的同时也是最坏的事。
一 方面,Java把你从C++编程的很多枯燥易错的细节中解救出来了。没有数组越界了,没有core
dump了。抛出来的异常能让你精确定位到出错的那一行代码,而且99%的时候都是正确的那一行出错了的代码。对象们在需要的时候能智能地把它们自己打印
出来。等等等等。
另一方面,除了是一种语言,一个虚拟机,一个巨无霸的类库,一个安全模型,一个可移植的字节码格式,Java还是一个宗教。邪教。所以你不能太相信对它太虔诚的人。想要招一个好的Java工程师是一项很有技术挑战的活。
但是总的来说,Java是软件工程史上的一大进步。
从 C++到Java不只是语法上的改变。这是一种需要一段时间去好好体会的一种震撼性的世界观的转变。这有点像突然你被配了一个执行助理。你知道老总们为什
么总是好像有时间去开会,总是知道公司现在运行的情况,总是写出很酷酷的文档吗?
老总们常常忘记其实他们不是一个人在战斗,他们都是两个全职的人,他们和他们的执行助理们。有一个执行助理把你从琐事中解救出来让你有时间去思考那些真的
需要你去解决的问题;
没有的话你将不得不花一半的时间在那些无聊的世俗的事情上。切换到Java编程语言就把你变成了两个程序员—一个处理那些你不需要关心的东西,另一个可以
集中精力在问题本身上。这是一个很震人的改变,一个你应该很快就能习惯能喜欢上的改变。
就像Jamie
Zawinski(Netscape牛人,开发Mozilla浏览器,好像学历是高中毕业?)在他著名的“Java真烂”那篇文章里说的:“先说那些好东
西:Java没有free()函数。我必须一开始就承认,其他的东西都没什么了不起。(没有free)是能让我原谅其他所有东西的特性,不管其他东西有多
烂。讲完这一点后,我的文章里其他一切几乎都完全没有重要性了。”
Jamie的文章写在1997年,按Java年来算的话是很早以前了,跟他写这篇文章时比Java已经有很大的改善;
一些他抱怨的东西甚至已经被fix了。
但是大多数还是没有被fix。Java作为一门语言还是有点烂。但就如Jamie指出的,Java“是今天为止最好的语言。我的意思是说,它是今天市面上那些烂得底儿掉地一堆语言比起来有那么一点能被我接受。”
真的,你应该读读他那篇文章。
Java几乎每一方面都很好,除了它的语言本身,而这是JWZ抱怨的主要对象。但那是一个很大的抱怨。再好的库也救不了一个烂语言。相信我:你可能比我知道多得多的东西,但是我知道好兵救不了烂将。在Geoworks搞了五年汇编语言都会了我这个道理。
跟C++比,Java作为一个语言还过得去。好吧,别扯了,Java要好很多。因为它有(内建)的字符串。哥们,你说一个没有内建的字符串的语言是人用的吗。
但是Java跟C++比少了一些好东西,比如(函数调用时)传引用,栈上的对象,typedef,宏,以及运算符重载。一些时不时地会很称手的东西。
哦, 还有多重继承,我现在老了,反而挺欣赏了的多重继承。如果你认为我这个观点僵硬不灵活的家伙是多态教义很好的反例的话,我倒是可以给你举几个为什么你需要
多态继承的好例子,或者至少像Ruby那样的mixin或者自动的派遣。下次问问我白龙马的事情。今天我要告诉你为什么Java的interface是个 烂货。
几年前Gosling自己都说,如果一切都能重来的话,他不会搞出个interface的概念。
但是那正是Java的问题。当James说出那句话的时候,人们被雷到了。我甚至能感觉到那股雷劲儿,能感觉到Sun公司市场部和法务部的鸟人是多么想把James灭口,然后告诉大家他没那么说过。
Java 的问题就是人们都被那帮人搞的广告效应蒙住了眼。C++,Perl,任何流行语言都有这个问题。这是很严重的,因为如果没有一些说大话吹牛逼的广告,一个
语言是不会流行起来的。所以如果一个语言的设计者说他的语言没有被设计得很完美的话,就是赶紧用{敏感词}射击这胡说八道的家伙并关闭会议的时候了。
语言们需要放点儿卫星才能活,我只希望人们不要被卫星耀瞎了眼。
我 学了面向对象编程,
我自己也对此大吹大擂。当我加入亚马逊时,我不能告诉你我有什么智慧或者经验,但我可以给你背诵出所有关于OOP的魔咒。多重继承是邪恶的,因为大家都这 么说;
运算符重载是邪恶的,诸如此类。我甚至有点模糊地知道为什么是邪恶的,但实际上不知道。后来我明白了,这些都不邪恶,不是烂玩意儿,烂的是开发者,是我。
我现在还是烂,但是希望每年都不烂一点起来。
上礼拜我碰到一个来面试的,他告诉我多继是邪恶的,因为,比如,你可以从头,胳膊,腿,躯干
多重继承出一个人来。他既是对的,又是错的。那样的多继情形当然邪恶,但那都是因为他自己太邪恶了。那样继承出来的“东西”远远就能看见有多蠢,如果他还
把这玩意儿弄进门来那就更邪恶了。
不良开发者,占了这世上开发者的大多数,他们能用你扔给他们随便什么语言写出不良的代码。
说 了这些,还是得说回来,多继不是请客吃饭那么轻松的事儿;
mixin看起来是更好的解决方案,但是还没人完美的解决这个问题。但我还是认为Java比C++好,即使它没有多继。因为我知道不管我的出发点是多么
好,某一天我还是会被一堆不懂怎么写好代码的人包围,让他们用Java比用C++会带来更少的伤害。
此外,Java除了语言本身外还有老多其他的重要有用的东西。且Java语言本身也在进化,虽然像冰川一样慢,所以我们还是能看到希望。Java正是我们应该在亚马逊推荐使用的语言。
你就是得小心点儿,因为各其他任何语言一样,你能很容易找出一堆人,他们很懂一门语言及其编程环境,但对品味,计算或者其他任何重要的东西却一无所知。
当你有怀疑时,还是雇那种会好几门语言的Java程序员,那种厌憎J2EE/EJB之类松松跨跨的所谓框架的,那种使用Emacs的。这都是一些实战经验。
Perl
Perl,怎么说呢?
Perl是个老朋友。老老朋友。我开始写Perl代码的时候,可能是1995年? 而它为我很好的服务了差不多10年的时间。
它就像你骑了十万二十万英里的老自行车,你心里永远有一块地方装着它,虽然现在你已经换了一辆更加现代化的只有五磅重的自行车,而且这一辆也不像老的那辆顶得你{敏感词}疼了。
Perl受欢迎原因有仨:
- 用Perl你很快就能搞定你的问题。而这是最终的衡量标准。
- Perl
有世上最好的市场推广。你可以写一本介绍他们市场推广有多绝的书。Sun公司砸大笔钱给Java推市场,Perl在受欢迎程度来说能跟Java齐头并进,
但Perl纯粹是依靠Larry Wall和他那帮哥们的三寸不烂之舌做市场。哈佛商学院的人应该去研究Perl的市场是怎么做出来的。真的让人瞠目结舌。
- 直到差不多,呃,现在,Perl没有真正的竞争者。
有 比Perl“好”的语言。操,有很多比Perl好的语言,如果你定义“好”为“不是给疯子用的”的话。Lisp,Smalltalk,Python,妈
呀,我可能可以列出二三十种比Perl“好”的语言。从这些语言不像这个夏天在台湾街头爆了肚皮的抹香鲸这个角度来说。鲸鱼肠子到处都是,汽车上,机车
上,行人身上。这就是Perl。让人着迷,真的。
但是Perl有很多很多好的特性,直到最近,都是其他语言没有的。它们弥补了Perl肠子在外的不足。你可以从爆了肚皮的鲸鱼可以做很多有用的东西出来,比如香水。这很有用。Perl也是这样。
当其他的那些语言(尤其是Lisp和Smalltalk)都想假装操作系统并不存在,列表(Lisp的)和对象(Smalltalk的)就是把屎搞出来的唯一存在,Perl却走了截然相反的路子。Larry说:Unix和字符串是搞出屎来的唯一存在。
对很多任务来说,他绝对是正确的。所以Perl绝对是Unix系统管理和字符串处理的史上最强语言,除了一个,刚出来的一个,从哥斯拉(电影哥斯拉看过没)之地出来的一个。我一会儿会讲到那一个。
可 惜,Larry太太太太在意Unix系统管理和字符串处理以致他压根忘了列表和对象,等他明白过来想改正的时候已经晚了。实际上,在Perl早期的…好
吧,对鲸鱼肠子我实在不想用“设计”这个词,就说生命周期中吧,他犯的几个关键错误让把列表和对象加进来变得如此尴尬,以致Perl已经进化成一个真正的 Rube
Goldberg机器,至少当你想在Perl里用列表和对象的时候。(Rube
Goldberg是一漫画家,常画一些很复杂的机器,但只完成简单的工作,比如一个小球滚过很多关卡,最后把门打开。译者注)。
列表和对象也他妈的是很重要的,Larry!(farging应该是作者不想说fucking那么直白,译者注)
Perl 没法表达列表因为Larry一早犯了一个悲剧性的愚蠢的错误,把列表全抹平。于是(1,2,(3,4))魔术般地变成(1,2,3,4)。不是说你会想让
它这样工作,而是Larry刚好那天在搞一个这样会更方便的问题。于是Perl的数据结构从此就变得爆炸了的鲸鱼了。
今天你看Perl的
书,小教程或PPT的时候,不花三分之一的时间在“引用”上是不可能的。这就是Larry可怜的,坏了的,Goldberg(漫画家,想起来没?
译者注)式的对他那抹平列表的疯狂错误的解决方案。但是Perl的市场宣传做得那么难以置信地好以致它让你觉得这是你身上发生过的最好的东西。你可以对任
何东西取它的引用。这很有趣!闻起来也很香(说肠子呢,译者注,呵呵)!
Perl不能支持面向对象编程因为Larry压根不相信这玩意 儿。这可能没什么大不了;
我也不是很确定我是不是信这个OOP。但是那么为啥他又要试着把对象加进Perl呢?
Perl的面向对象是个半成品,且在Perl社区里没多少人重视。它就是不像字符串处理或Unix集成那样充满灵感。
当然了,Perl还
有其他很多怪怪的特性。比如它的“上下文”,这是Larry要有N个变量名字空间的喜剧式决定的一个恐怖片式的产物。这些空间由sigil来区分(就是
Perl里变量名前面的‘$’,‘@’,‘%’字符),看着像是从shell脚本里拷贝来的。在Perl里,所有的运算符,所有的函数,所有的操作其行为
都是六取一的随机的,取决于当前的“上下文”。没有一些规则或助记法能帮你搞定这些特定操作在特定上下文里的特定行为。你得把它们全记在脑子里。
想要个例子?
这儿有一个:在一个值量(scalar,对应于vector,向量)上下文里对一个哈希取值你得到一个字符串,里面是个分数,分子是目前已分配的键,分母是总共有多少个桶。鲸鱼肠子,我告诉你。
但就像我说的—直到最近,没啥能像Perl那样把屎搞定。 |