冒号课堂
第五课 语言小谈(4)
5.4语言误区——语言的宗教情结
爱而不知其恶,憎而遂忘其善 ——《吴兢·贞观政要》
关键词:编程语言,宗教,程序员,架构师
摘要: 关于编程语言认识上的一些误区
!预览
· 如果说编程范式是一种文化,那么编程语言更像是一种宗教——尽管它本不该是
· 语言只有两种:一种怨声载道,一种无人问津
· 对待一门语言的态度应该是:与其抱怨争执,不如扬长避短
· 过分拔高一种语言与抹煞语言之间的差别是两种极端,皆为秕言谬说
· 这些人若有幸拜关公为师,他们最艳羡的一定他的赤兔马和青龙偃月刀,或许还会抹红脸蓄长须什么的,就是不太愿学他的盖世武功
· 理想的架构师应当如文学大师,既有恢弘大气的构思,又有细腻深刻的笔法;应当如统军大帅,既有运筹帷幄的韬略,又有冲锋陷阵的武功
?提问
· 为什么那么多人对某些编程语言都有浓厚的宗教情结?
· 存在至高无上的语言吗?
· “语言不过是工具,其实都差不多”。这种论调正确吗?
· IDE、框架、设计工具等比语言更重要吗?
· 语言是低级的代名词,设计是高级的代名词吗?
· 架构师就不关心语言了吗?
:讲解
“最后该谈谈你们最为关心的语言问题了。”冒号环视一番,众人眼球的瓦数显见增大,“如果说编程范式是一种文化,那么编程语言更像是一种宗教——尽管它本不该是。每种流行的语言都有大批忠实的信徒,随时可能与其他的信徒发生宗教战争。”
逗号深有同感:“周围和网上关于语言的争论从来不绝于耳,志不同道不合者动辄恶语相向。”
提起这些,冒号不免有些忿忿然:“这些信徒或准信徒们认为他们所崇拜的语言鹤立鸡群,远比其他语言高明得多,恨不得成为全天下程序员的通用语言。对其他语言的使用者,或居高临下地同情,或不屑一顾地讥讽。无知与偏见总是相辅相成的,他们中的绝大多数顶多熟悉一两种语言,其他的或浅尝辄止、或道听途说,却敢妄评优劣,岂不可笑之极?”
引号点头称是:“是啊,没有深入的了解,怎会有深入的比较。”
冒号进而尖锐地指出:“从心理学上分析,一个人在某种观点形成后,会通过自我的暗示和倾向性的证据不断地强化这种观点,并对其他观点本能地选择性失明。这背后折射的其实是一种懒人心态——认定自己掌握的语言是最好的,便不必费事再学其他语言了;这更是一种弱者心态——无论是耿耿忠心的铁杆卫士,还是振振有词的辩护律师,一旦丧失自我批判的勇气和精神,声嘶力竭的挞伐只能反证他们的偏狭浅薄与自信缺失。”
冒号刻意借辛辣十足的嘲讽再次传递精神的信号。
叹号道出苦衷:“只是真正掌握好一门语言已殊为不易,同时掌握几种就更难。学完一种语言再看另一种,怎么都觉得别扭。”
“这就是第一堂课所说的‘学会’与‘会学’的差距。”冒号挑明要害,“每种语言都有天然设计上的不同,当你用得很别扭时,恰恰说明没有真正掌握。正如刀法以劈为主,枪法以扎为主,你若反其道而行之,刀扎枪劈,能不别扭吗?如果愣拿双节棍当单节棍使,恐怕没砸到别人倒先砸晕自己了。可见不是兵器问题,而是招法问题。”
下面隐约传来周杰伦《双截棍》的调子。
问号注意到:“似乎不只是初学者,大师们也会对一些语言提出过尖锐的批评。”
冒号引用道:“C++的发明者Bjarne Stroustrup说过这样一句话,语言只有两种:一种怨声载道,一种无人问津(There are only two kinds of languages: the ones people complain about and the ones nobody uses)。”
众笑。
句号有所体会:“一种语言如果用者甚众,自有其可取之处。没有一种语言是完美的,爱之深者尚苛之切,何况其余者乎?”
冒号忽然问:“你们知道对一种语言最大的批判是什么吗?”
众人纷纷摇头。
“那就是发明一种与此语言有类似功用的新语言。”冒号语速放缓,“Stroustrup认为Simula太慢、BCPL又太底层,于是发明了C++;Gosling觉得C++用得不爽,于是发明了Java;微软恼恨Java,于是请Hejlsberg发明了C#;Matsumoto用了两年多的C++仍不顺手,于是发明了Ruby。如此这般,不一而足。”
叹号无奈地说:“那是牛人的批评方法,常人怎能办到?”
“没有能力发明语言,就老老实实地用别人的吧。”冒号酷酷地说,“对待一门语言的态度应该是:与其抱怨争执,不如扬长避短。”
引号顺势道:“按这种说法,编程语言的发展史就是一种批判史咯?”
冒号祭起辩证法:“从另一个角度看,发明一种语言也是对先前语言的一种最高的赞美。C++之于C,Java之于C++,C#之于Java,都是后者对前者的一种承认,哪怕是极不情愿的承认。批判与赞美,继承与发展,谓之扬弃。”
众人心想,语言课又改哲学课了。
冒号续道:“对于编程语言还有一种论调:语言只是一种工具,哪种都差不多。”
逗号接茬:“是啊,经常在论坛上看到一些高手这么说。”
“一群伪高手,是工具就差不多?能拿锤子当刀使吗?”冒号嗤之以鼻,“过分拔高一种语言与抹煞语言之间的差别是两种极端,皆为秕言谬说。图灵奖获得者Alan Perlis曾说过:如果一种语言不能影响你对编程的看法,那么就不值得去了解。试想,一种没有独特魅力的语言如何吸引程序员趋之若骛?了解这些独特之处对于编程往往至关重要,如果沿袭以前语言的做法,会显得不伦不类甚至可能铸成大错。”
问号要求:“能说得具体点吗?”
冒号举例:“有人说,学C++要先学C;还有人说,学会了C,C++就不在话下了。”
叹号一惊:“难道不是吗?”
冒号解释:“其实C++的真正来源是Simula而不是C,向下兼容C只是因为C效率高、普及广。换句话说,C++与C形同而神异。学会了C当然对C++有一定帮助,但若不能理解C++的OOP思想,那么C的背景反而是一种障碍。”
逗号想当然:“C++与Java都是OOP语言,差别该不大了吧?”
冒号再次否定:“不同编程范式的语言差别固是不可以道里计,即使同一范式的语言也是千差万别。一个纯粹的C++程序员用Java编程,会非常不习惯没有指针运算、没有内存控制、没有运算符重载、没有*函数等等。一个纯粹的Java程序员用C++编程,会极度不适应相对贫乏的标准库;会困惑于指针、引用、数组、字符串还有头文件等的用法;会毫不吝惜地在堆(heap)上创建新对象,并且从来不去释放它们。这些概念或用法都是贯穿整个程序始终的,差别能不大吗?”
叹号听罢叹曰:“做一个好的程序员还真不容易。”
“如果容易,我们开这个班做什么?” 冒号笑道,“提一个问题,程序员最不能离开的应用软件是什么?”
逗号顺嘴道:“当然是IDE了。”
引号纠正:“应该是编辑器,有些程序员用vi甚至记事本来写程序。”
冒号插一句:“有人还在命令行下写程序。”
叹号眼瞪得溜圆:“怎么可能?”
冒号眉毛一挑:“当然可能,一些简单的程序完全可以在命令行下完成,然后重定向(redirect)到一个文件中或者直接编译执行。这种情况虽有些极端,对于那些离开IDE就没法编程的人来说更是不可思议,但至少说明编程离开编辑器还是有可能的[1]。”
句号突然明白了:“是编译器!”
“不错,是编译器或解释器。”冒号作了一点修正。
问号有点茫然:“为什么谈这个呢?”
“因为编译器或解释器是语言实现的标志。”冒号提高了声调,“我想借此说明一个简单的道理:对一个程序员而言,编程语言乃立身之本。许多人偏偏本末倒置,常常为在IDE、框架、设计工具等中挖掘到某些新功能而欣喜不已,或者津津乐道于各种语言的优劣高下,却对正在使用的语言中大量的宝藏视而不见,与执金碗而行乞者何异?这些人若有幸拜关公为师,他们最艳羡的一定他的赤兔马和青龙偃月刀,或许还会抹红脸蓄长须什么的,就是不太愿学他的盖世武功。”
引号质疑:“我明白您是想修研强调内功的重要性,但似乎有些唯语言论,设计思想不是更重要吗?”
冒号补充道:“我所谈的语言,自然不是孤立的语法和用法,也包括背后的编程范式和设计思想。当然更高层的架构设计可能会脱离具体的语言,但那不在考虑之列,因为我们谈论的主体是程序员,而不是架构师。”
提到架构师,众人神往之情油然而生。
冒号看透了大家的心思:“架构师并没有多么神秘,他们也是从程序员过来的。也不要以为架构师就不关心语言了,相反需要对语言有更广博、更深刻的认识。理想的架构师应当如文学大师,既有恢弘大气的构思,又有细腻深刻的笔法;应当如统军大帅,既有运筹帷幄的韬略,又有冲锋陷阵的武功。那些在语言与低级之间、设计与高级之间毫不犹豫地划等号的人,多半高不成低不就,既不懂语言,也不懂设计。”
逗号仍有疑惑:“语言真有那么重要吗?IDE的一些集成工具可以辅助生成许多代码,或许到了某一天,拖拖鼠标、画些UML图之类的,程序就大功告成了。”
冒号哈哈一笑:“这不就是元编程吗?元编程也是用语言实现的。且不说你描绘的美景是否可能,即便实现了,程序员的任务也是用更高级的语言做更高级的编程——还是离不开语言。别忘了,技术含金量是与工资含金量成正比的,你永远需要比别人多一门扎实的功夫。程序员这门职业,你选择,你担当。好了,闲话打住,欲知在下如何评价各种编程语言,且听下回分解。”
众人听兴正浓之际,课堂却在说书式的结语中戛然而止了。
,插语
[1] 当然,命令行本身也可看作编辑器,比如Bash提供vi和emacs两种命令行编辑模式。
。总结
- 凡事因了解而喜爱,因无知而憎恶。
- 破除语言的宗教情结,保持自我批判的勇气和精神。
- 过分拔高一种语言与抹煞语言之间的差别是两种极端观点,皆不可取。
- 每种语言都有其特到之处和不足之处,与其抱怨争执,不如扬长避短。
- 编程语言在批判与赞美中逐步发展。
- 编程语言是程序员的立身之本。切不可本末倒置,忽视语言的学习,却热衷于挖掘IDE、框架、设计工具等的新功能。
- 语言不等于低级,设计也不等于高级。
- 架构师同样关心语言,并且需要对语言有更深更广的认识。
“”参考
[1] Bjarne Stroustrup.The Design and Evolution of C++.Reading, MA:Addison-Wesley,1994.19-25
[2] Alan Perlis.EPIGRAMS IN PROGRAMMING.http://www.cs.yale.edu/homes/perlis-alan/quotes.html
课后思考
- 程序员这个职业合适你吗?你在工作中胜任愉快吗?
- 你认为理想的类型系统应该有哪些规则?
- 你喜欢duck typing吗?它有何优点?如何防止它的误用和滥用?
- 你是如何看待动态语言的?与静态语言相比,哪些是你所欣赏的,哪些是你所不满的?
- 你最熟悉哪种编程语言?你认为它是最好的语言吗?
- 对一门不熟悉的编程语言,你是乐于了解和学习它,还是本能地漠视或排斥它?
- 爱可以不需要理由,恨却需要。能说说你恨某种语言的理由吗?你确信它们站得住脚吗?
- 你是更愿意把时间花在编程工具的功能挖掘上,还是花在编程语言的深造学习上?