没有最好的程序员,
也没有最好的编程语言。
最近小编被问到,作为一个程序员,作为一个敲代码的码农,作为一个把敲代码当梦想的人。应该选择哪种编程语言更适合?在这小编,我也不能强行下结论,因为不同的编程语言的应用方向也不一样。像Java语言适用于游戏开发,C语言适用于底层建设。各种语言之间基本不存在什么可比性,虽然听到过PHP才是最好的语言,但这也是,用PHP语言的人的一种自我夸大。
没有最好的编程语言,也没有最好的程序员。那现今网络上适用最多的语言,他们存在怎样的优缺点呢?C
你必须懂C。为什么?因为出于所有现实的理由,这个世界上你过去,现在,将来会用到的每一台计算机都是一台冯·诺曼机器,而C是一种轻量级的,很有表达力的语法,能很好的展现冯·诺曼机器的能力。
冯·诺曼架构就是你每天都用的计算机的架构的标准:一个CPU,内存,硬盘,一条总线。多核计算机并没有带来本质上的变化。冯·诺曼机是一个很方便,很便宜,上世纪五十年代的实现图灵机的技术,图灵机是执行计算的最知名的抽象模型。
世上还有其他的计算的机器。比如,Lisp机器,是上世纪50年代对Lisp计算模型的实现。Lisp模型是基于lambda代数的一种计算语言表示法,后者是与图灵机同构的一种模型。不像图灵机,lambda代数能被人类读和写。但是这二者是同等能力的。它们同样精确的表示了计算机能干什么。
Lisp机现在不是很流行了,除了在跳蚤市场里。从谁更受欢迎来说,冯·诺曼机器赢了。还有一些其他的计算机,比如神经网络计算机,译者也不知道怎么翻的计算机(cellularautomata),但是这些都不够大众化,至少现在是这样的。
所以你必须知道C。
还有一个你必须知道C的原因是,Unix是用C写的。巧的是,Windows也是。基本上所有的其他操作系统都是用C写的。因为这些操作系统都是冯·诺曼机的操作系统,你还能用别的吗?任何跟C很不一样的东西都会跟硬件的实际能力相差太远而导致无法满足性能上的需要,至少对一个操作系统来说是这样—至少在上个世纪是这样,碰巧这些系统都是上个世纪的。
你还应该知道Lisp。你不必用它来干实际工作,虽然它在很多GNU的软件里都会很用得着。尤其是,你应该学会Scheme,Lisp的一种小巧化的,纯洁的方言。GNU的版本叫Guile。
他们在麻省理工和加州伯克利教新学生一到两个学期的Scheme,这些学生都对他们为哈要学这么奇怪的语言抓破脑袋。实话实说,作为第一门学习的语言,这是一个很烂的选择,第二门也是很烂。你应该学会它,最终,但不是作为第一门或第二门语言。
这是很难的,这是很大的一步。学会怎么用Lisp写出像C语言的程序是不够的,那没有意义。C和Lisp一个就像红外线,一个就像紫外线,它们分布在光谱的最两端。它俩一个牛逼的地方刚好是另一个傻逼了的地方。
但是对于你天天要做的编程工作,你应该基于以下条款选择你的语言:库,文档,工具支持,操作系统集成,资源,和一堆其他的东西。这些条款跟计算机如何工作关系很小,但是跟人类如何工作关系甚大。
人们还在用很直白的C语言写东西。很多东西。你应该懂C!
C++
C++是地球上最蠢的语言,即使是从蠢这个字的真正意义上出发。C++很无厘头。它不知道自己是什么东西。它没有自省(introspective,面向对象里的一个概念,译者注)。C也没有,但是C不是“面向对象”的,而面向对象很大程度上是关于要让你的程序知道它自己。对象就像演员。所以面向对象语言应该有运行时的自省机制,知道自己是个什么类的对象。C++不是这样的,真的,你不会那样用它。
关于C:写一个C的编译器是那么的简单,以至于你可以用C写一个关于C的工具,用起来就像是有内省机制。而C++呢,基本上是不可解析的,所以如果你想写一个很牛逼的工具用来——比如,告诉你你的虚函数的原型,或者帮你重构你的代码,你将不得不依赖别人的工具集,因为你自己在除非脑子进屎的情况下是根本不会去写一个C++的解析器的。而市面上所有的C++的解析器都很傻逼。
C++很蠢,你不能用蠢语言创造一个好系统。语言决定世界,蠢语言决定蠢世界。
所有的计算都基于抽象。你用低级的东西创造出高级的东西。但是你不能用分子创造出一个城市。尝试使用太低级别的抽象只会给你带来麻烦。
理智的情况下,你用C写的最大的东东就是一个操作系统。而操作系统其实不是很大的,真的。它们看起来很大,但那是因为它们有很多应用软件,操作系统本身的内核是蛮小的。
你用C++能写的最大的东东是…也是操作系统。好吧,或许稍微再大点儿。让我们说,再大三倍吧。或者10倍吧。但是操作系统内核最多也就,那啥,一百万行代码?所以我说你能用C++写的最大的系统大概也就是一千万行代码吧,再大的话就开始不行了,这玩意儿你没法控制了,就像恐怖片里的…
我说的一千万行是指如果你那时候还能让你的系统编译通过的话。
我们想在这个系统里干点啥好像要一万年。一个亚马逊工程师有一次这样描述我们的代码库:“一座很大的屎山,你见过的最大的山,每次你想修正一个bug,你的工作就是爬到屎山的正中心去。”
这都是C++的错。别跟我争论。就是的。我们用的是世上最蠢的语言。这简直有点老板级的蠢,你说呢?(译者注,meta在计算机术语里通常表示更高一个层次,比如,meta-language,比普通的language高一个层次,意思是关于语言的语言。哲学里应该会经常用到这个词。我不懂哲学,但是我觉得老板们总是比我们高一级,所以meta-dump我就翻译成老板级的蠢喽。:-)
说了以上这些难听的话,话得说回来了。用C++写出漂亮的代码显然是可以的,我的意思是说,这样的代码应该大部分还是C,偶尔很有品味的,很有节制的用一点C++。但是这种代码几乎从来不会被写出来。C++是个很好玩的游乐场,而如果你把它玩儿得门儿清的话你会觉得自己特牛,所以你总是被诱惑把你知道的所有的东西都用上。但是那是很难做好的,因为从一开始这个语言就太狗屎了,最终,你会弄得一塌糊涂,即使你很能干。
Java
Java是过去的10年中计算行业里发生过的最好的同时也是最坏的事。
一方面,Java把你从C++编程的很多枯燥易错的细节中解救出来了。没有数组越界了,没有coredump了。抛出来的异常能让你精确定位到出错的那一行代码,而且99%的时候都是正确的那一行出错了的代码。对象们在需要的时候能智能地把它们自己打印出来。等等等等。
另一方面,除了是一种语言,一个虚拟机,一个巨无霸的类库,一个安全模型,一个可移植的字节码格式,Java还是一个宗教。邪教。所以你不能太相信对它太虔诚的人。想要招一个好的Java工程师是一项很有技术挑战的活。
但是总的来说,Java是软件工程史上的一大进步。
从C++到Java不只是语法上的改变。这是一种需要一段时间去好好体会的一种震撼性的世界观的转变。这有点像突然你被配了一个执行助理。你知道老总们为什么总是好像有时间去开会,总是知道公司现在运行的情况,总是写出很酷酷的文档吗?老总们常常忘记其实他们不是一个人在战斗,他们都是两个全职的人,他们和他们的执行助理们。有一个执行助理把你从琐事中解救出来让你有时间去思考那些真的需要你去解决的问题;没有的话你将不得不花一半的时间在那些无聊的世俗的事情上。切换到Java编程语言就把你变成了两个程序员——一个处理那些你不需要关心的东西,另一个可以集中精力在问题本身上。这是一个很震人的改变,一个你应该很快就能习惯能喜欢上的改变。
就像JamieZawinski(Netscape牛人,开发Mozilla浏览器,好像学历是高中毕业?)在他著名的“Java真烂(javasucks)”那篇文章里说的:“先说那些好东西:Java没有free()函数。我必须一开始就承认,其他的东西都没什么了不起。(没有free)是能让我原谅其他所有东西的特性,不管其他东西有多烂。讲完这一点后,我的文章里其他一切几乎都完全没有重要性了。”
Jamie的文章写在年,按Java年来算的话是很早以前了,跟他写这篇文章时比,Java已经有很大的改善;一些他抱怨的东西甚至已经被fix了。
但是大多数还是没有被fix。Java作为一门语言还是有点烂。但就如Jamie指出的,Java“是今天为止最好的语言。我的意思是说,它是今天市面上那些烂得底儿掉地一堆语言比起来有那么一点能被我接受。”
Java几乎每一方面都很好,除了它的语言本身,而这是JWZ抱怨的主要对象。但那是一个很大的抱怨。再好的库也救不了一个烂语言。相信我:你可能比我知道多得多的东西,但是我知道好兵救不了烂将。在Geoworks搞了五年汇编语言都会了我这个道理。
跟C++比,Java作为一个语言还过得去。好吧,别扯了,Java要好很多。因为它有(内建)的字符串。哥们,你说一个没有内建的字符串的语言是人用的吗。
但是Java跟C++比少了一些好东西,比如(函数调用时)传引用,栈上的对象,typedef,宏,以及运算符重载。一些时不时地会很称手的东西。
哦,还有多重继承,我现在老了,反而挺欣赏了的多重继承。如果你认为我这个观点僵硬不灵活的家伙是多态教义很好的反例的话,我倒是可以给你举几个为什么你需要多态继承的好例子,或者至少像Ruby那样的mixin或者自动的派遣。下次问问我白龙马的事情。今天我要告诉你为什么Java的interface是个烂货。
几年前Gosling自己都说,如果一切都能重来的话,他不会搞出个interface的概念。
Java的问题就是人们都被那帮人搞的广告效应蒙住了眼。C++,Perl,任何流行语言都有这个问题。这是很严重的,因为如果没有一些说大话吹牛逼的广告,一个语言是不会流行起来的。所以如果一个语言的设计者说他的语言没有被设计得很完美的话,就是赶紧用麻醉枪射击这胡说八道的家伙并关闭会议的时候了。
语言们需要放点儿卫星才能活,我只希望人们不要被卫星耀瞎了眼。
不良开发者,占了这世上开发者的大多数,他们能用你扔给他们随便什么语言写出不良的代码。
此外,Java除了语言本身外还有老多其他的重要有用的东西。且Java语言本身也在进化,虽然像冰川一样慢,所以我们还是能看到希望。Java正是我们应该在亚马逊推荐使用的语言。
你就是得小心点儿,因为和其他任何语言一样,你能很容易找出一堆人,他们很懂一门语言及其编程环境,但对品味,计算或者其他任何重要的东西却一无所知。
当你有怀疑时,还是雇那种会好几门语言的Java程序员,那种厌憎J2EE/EJB之类松松跨跨的所谓框架的,那种使用Emacs的。这都是一些实战经验。
总结
总得来说,不要再问什么哪种语言最好了,每一种编程语言都有它存在的意义。你觉得自己喜欢哪一个就学哪一个,这没什么不对,人总要跟着自己的兴趣走。无论是C,C++,又或者是Java,它们都是编程语言中几颗闪亮的星,我们不能因为以后它们不再顺应潮流趋势就忘记了。关于学习的事,适合自己的最好。
程序员e家
programmer_clubs
程序员第一自媒体,与你探讨码农人生路上遇到的各类泛技术话题,定期为你推荐码农人生思考、感悟以及启迪!