一般人都有自己的一个主要的工作语言,这是自己主要专长的方向,也是谋生的饭碗,不会轻易丢掉。但是在工作之余学习第二种语言(这是一种泛指,也可能许有多种)在程序员群体中也是非常常见的情况。我现在也面临这种选择,相信很多人跟我一样。
是随大流选择一门流行的,比如很多脚本语言?还是选一门我当前语言的加强版,比如从java到scala?还是选一门完全陌生的,比如函数式编程语言lisp?
我在这里想听到有经验者对这种选择的考虑,而不是说应该选择什么语言,那样对其他人没有任何意义,相信这个社区也不欢迎这种讨论。所以我问题的标题是如何选择,而不是选择什么。
我从儿童时期,1989年在AppleII电脑上敲下第一行LOGO语言指令,后与编程结下不解之源,二十几年来不曾中断,至今因为各种因缘际会,学会了很多大家常常听见的语言,也学了一些冷门的. 我应该可以算是一个"有经验者". 我对各个学习阶段的程序员,对于语言的选择,有各种不同的推荐.
关于: 重要的是思想,语言不重要. 这句话只能对 "中级" 程序员有用,初学程序员最好当这句话不存在,因为对于刚入门的人,语言很重要. 对于"高级"(指已经在某个编程技术领域碰到天花板的)语言也很重要.对于后者,很多时候你的任督二脉能不能打通,其实语言占不小的影响.
对于前面一种情况相信很多人都已经做了回答. 不过对于后面这种情况,我想有深切体会的人并不多.我以下回答针对"高级"(上文定义)者,初学者不要盲从:
选第二语言(楼主的定义),要选跟你主语言不同体系的,比如对大部分人,主语言都是C/C++系(包括Java,C#,ActionScript....等一大堆主流语言),那么第二语言最好选择另外一系,比如 Scheme 等. 最好选择编程哲学不同或相反(比如Python的哲学是追求每件事应该有并且只有一种解法,但很多语言比如javascript等的哲学是每件事应该有很多种解法)的一系. 如果遵循以上两点,基本上这个第二语言不太可能跟你的主语言在应用领域上有太大重合. 也就是区别要大一些更好.
原因: 对于"高级"的程序员,语言应该只是你表达自己思想的工具,你能自由用主语言表达你的编程思想,你可以用ASP写出面向对象甚至MVC的网站程序, 但是另外一个方面,当你 "无所不能" 以后,就会发现自己好像停滞了, 这个时候你需要一个反差很大,最好是编程思想完全不同的技术,来让你突然觉得自己原来什么都不会,原来自己一直以为天经地义的事情,在另外一门技术里是完全扯淡的,而自己压根想都没想过的事情,在另外一门编程语言里却司空见惯. 这种冲击可以让你获得很多灵感,可以让你突然 "跳出来"~ 因为你其实学之前已经可以融会贯通各种语言,所以学习一个新语言,这个知识角度对你的帮助并不大,但是学习过程中哲学高度上对你的影响会非常大.
很多程序员以为全世界所有程序都是 代码+数据库 (我面试程序员时通常会问你有没有写过跟数据库没有关系的代码,超过一半的人惊讶地回答说什么程序都是围着数据库增删改查的) 其实原因是他们做的可能是外包项目,或者互联网网站, ERP之类的东西,自己所学所用制约了他们的视野,以为所有程序都是这样的,如果这个时候他做个浏览器,做个图片查看器,做个播放器, 他还会觉得所有程序都是绕着数据库吗?
编程语言也一样,如果你一直用着面向对象语言,就很多人误以为语言都应该面向对象. 你一直用着关系数据库,就很容易以为所有数据库都是关系型的. 只有当你接触一个反差很大的,颠覆你之前的认知的, 才能让你站在一个更高的高度上去体会以前所学习的那些知识.
就我本人言,我这二十几年来工作中,学习中,用了十几种语言, 对于跟语言打很多年交道的我,也曾一天两天学一门新语言并且用得还不错,但是真正对我自己编程思想产生质的飞跃的语言,只有那些反差很大的很非主流的语言,比如从汇编突然学C++, 比如从Python突然跳到Common Lisp.
最后举一个例子, 一个java程序员,他也可能学了C++或者其他面向对象类的程序设计语言,直到学到很高级很牛了,他应该可以把面向对象中常见的设计模式融会贯通,做到手里无剑,心中有剑,遇到要写什么代码,根本不需要去思考什么模式,反正自然而然就代码里用了某个或某些模式的某种变形.这个时候对很多人来说这已经是 "最高境界" 了,但是到这个层次的人并不少,只要你有足够时间,很多人都能磨到这一步. 此时问你个问题: 设计模式是什么? 或者为什么世界上要有设计模式这种东西? 他是一个值得表扬的东西还是值得批评的东西? 你也许可以回答,也许觉得这种问题没什么意义.
现在如果我说:"设计模式是面向对象语言的自身缺陷的表现,是因为语言本身有缺陷,才需要设计模式,设计模式是让语言的使用者浪费自己宝贵的时间来为语言设计者设计中欠缺的地方进行修补, 但因为完美的语言不曾存在过,所以设计模式总是需要的.不过面向对象的语言越强大,对设计模式需要的越少" 很多人会对这个产生激烈的争议,就算不产生争议,你最终勉强接受了我的观点,也很会觉得这个太激烈了,至少会觉得这个观点不是你自己会悟出来的. 但是相同的这个观点,在Scheme程序员眼里却是很正常的. 所以如果你是C# 程序员,也许Scheme是一个合适你的第2语言.至少会在更高的层次上去想刚才我说的问题,而发现确实C#的每个版本升级都让语言更强大,同时让某个或者某些设计模式不再需要(比如静态类让单例模式存在的原始基础消失了,扩展方法让装饰模式存在的基础消失了...虽然你依然可以用这些模式,但那已经是为了模式而模式了,而且完全没有必要了)这就佐证了面向对象语言越强大,模式越不需要. 但对于一个只学C#,Java,C++,Javascript的人是很难悟出这一点的.
说多了,其实最终表达的意思是: 对于一个经验丰富的程序员,选择一门跟主流或你所熟悉的技术偏差极大的语言. 我推荐Lisp系的语言.