程序员如何选择自己的第二语言

一般人都有自己的一个主要的工作语言,这是自己主要专长的方向,也是谋生的饭碗,不会轻易丢掉。但是在工作之余学习第二种语言(这是一种泛指,也可能许有多种)在程序员群体中也是非常常见的情况。我现在也面临这种选择,相信很多人跟我一样。

是随大流选择一门流行的,比如很多脚本语言?还是选一门我当前语言的加强版,比如从java到scala?还是选一门完全陌生的,比如函数式编程语言lisp?

我在这里想听到有经验者对这种选择的考虑,而不是说应该选择什么语言,那样对其他人没有任何意义,相信这个社区也不欢迎这种讨论。所以我问题的标题是如何选择,而不是选择什么。

阅读 21k
评论
    24 个回答

    我从儿童时期,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系的语言.

      凑个热闹。先说下我自己的情况。和 @小萌 一样,我做Web最早也是写ASP大概做了一两年,后来开始做Java Web大概有六七年,再后来转Android一年多,现在做Objective-C几个月了,除了前面几年是读书时兼职后面都是在一些互联网大公司,勉强算得上楼主说的“有经验者”吧。

      我觉得两点很重要,一是兴趣,一是工作相关。

      首先是兴趣,性格不同兴趣就不同,比如有的人喜欢看得见的东西(比如JS/CSS/HTML);有的人喜欢黑黑的屏幕绿绿的字(比如Shell);有的人喜欢语法简洁(比如Ruby/Groovy);有的喜欢条条大路通罗马(比如Perl);有的喜欢一条路走到头(比如Python);有的喜欢钻研底层(比如MASM);有的喜欢简单语法(比如C);有的人喜欢绕来绕去(比如Lisp);有的人喜欢变态(比如BrainFuck -_-)。第一语言是养家糊口的语言,那第二语言怎么也要挑个自己喜欢的吧,呵呵。

      第二是这门语言最好与工作相关。大家搞IT的工作压力都不小,每天上班完了其实没有剩余太多时间来学习,如果能在工作中学习,学习的东西又对工作有用,就事半功倍了。我在做JavaWeb的那些年里顺带学习了前端的JS/CSS/HTML的内容,不说非常牛逼,但自我感觉还是理解透彻了,对工作也非常有帮助,在公司做了几个重前端项目(纯JS代码四五万行规模,和Java代码接近1:1)。另外为了维护服务器还学习了Shell,也对工作帮助很大。

      同期我也尝试学过Lisp/Python/Groovy……,Lisp因为和工作生活完全脱节不用很快就忘了,Python写过一个HTTP转发的小工具自己用但现在也只记得语法,Groovy在公司用Grails做过两个小项目现在还有隐约的印象……反正东西不用就忘得快,所以能与工作相关是最好的。

        • 168

        我在lisp-cn上问过类似的问题,朋友们的回答都挺好的。
        这里给些片段:
        Jianshi Huang:
        You're young. Here's my advice:
        - Learn patterns, not languages
        - Learn designs, not implementations
        - Learn the idiomatic ways of doing things the language is created for

        node for webdev, go for concurrency, C for memory management, bash
        for process control, ML for compiler and lisp for metaprogramming
        also C++ for shooting your foot, and Java for "design patterns"

        - Learn trade-offs and pitfalls in the design of languages
        - Do real projects and make real applications, not hello worlds
        - Do everything in one language you like most, and re-implement parts
        in other languages you think are better for the job

        Then you'll be a good programmer. It's tough!
        -----------------------
        FreeBlues :

        作为一个同样喜欢编程的过来人,说说自己的看法:
        1、深入学习3种不同类型的语言:1) 底层语言:汇编,2) 编译型语言:C,3)脚本语言:PYTHON
        学到什么程度?就是给你一个问题可以不依赖资料信手写出大部分代码来,这就要求你对用到的程序语言非常熟悉,为什么选择上述3种语言,因为汇编和C是基础,也是日后工作的必备技能,PYTHON超级好用好学,适合解决手边遇到的小问题。汇编的教材推荐王爽的《汇编语言》,C的教材推荐《一站式学习C编程》,PYTHON的教材推荐《DIVE INTO PYTHON》和《PYTHON科学计算》;
        2、其实计算机编程一多半的功力不在语言上体现,而是你解决问题的思路,也就是如何去运用程序语言解决问题的能力,这方面的能力也不仅仅是看看数据结构和算法能培养起来的(当然学数据结构和算法是必经之路),唯一的建议就是多看其他高手写的代码,如果有分析思路就更好了;
        3、至于LISP暂时无法评价,因为我也在学习中。

        --------------------
        这个是帖子地址:https://groups.google.com/forum/?from...

        还有挺多的,虽然最后有些歪楼

          • 249

          我说说我自己的看法,这种情况却是常见,目前很少有一个程序员只会一门语言。

          就拿我来说,这个主要还是趋势所定,最早我是一名asp程序员,现在大家都应该知道了

          这几乎是已经彻底淘汰的一本语言了,如果我现在还用它,我真的不知道自己在做什么。

          所以我在asp,截断我就自行学习php,到目前位置只能算是一个中级水平,不过完全可以

          满足我现在的工作需要。那么是不是满足就可以了,这个还得看个人如果能把php搞的超精通

          那么年薪几十万的也有。但是作为一个程序员,我觉得需要掌握一门比较高级或流行语言

          比如 C c++ python ruby 等等,我目前想选择一门比较流行的语言是python。

          我觉得这个可能是未来的趋势就算搞不精通,但是一定要懂,希望我的回答给你点帮助。

            学习语言:
            1.根据工作需要,php市场需求量最大,选一个可以持续谋生的语言.
            2.根据自己的发展需要,专精深入,还是技术管理....不同的决策,选择方向不同.

            • 如以后要做构架师,需要学习更多底层开发的语言.
            • 如以后从事技术管理类的,要知识面广一些.

              选择一门编程语言就像结婚一样,虽然心里会有种种判断准则,最终的选择却并不一定是按这些准则严格挑选来的,缘份和市场的作用也很奇妙。

              12年前,我刚开始谋生的时候,选择的是HTML/CSS(当然,它们不是编程语言,充其量是标记语言),然后受不了Dreamweaver自动生成的JS,学习了javascript。因为那时候我上大一,做一份工作:建设学校的英文官网,这个时候用不到ASP/PHP,也没有那个环境。

              过了半年,需要展示动态内容,我选择了ASP(因为学校当时只能提供ASP的运行环境),用的VBScript,这时候我仍然没有自己的电脑。

              看到了吧,这个阶段,我欣赏和喜欢什么语言并不重要,重要的是学校能提供什么运行环境(包括办公室的开发用电脑),市场决定了我的选择。

              过了几年,我在blogchina.com,需要重写,这时候,选择终于不受软件环境的限制了,可以自由选择了,我选择了PHP,原因是:
              当时只有我一个技术人员,如果选java会比较辛苦,如果选.net,windows/sql server授权费会比较高。PHP入手简单,搭配的开发运行环境都有免费开源的,这是我当时选择它的理由。

              于是PHP成了我的第一语言,除了手机开发,我几乎可以用PHP解决所有遇到的编程需求(Web应用、Linux Shell、Windows桌面GUI)。

              这些年来,我所在的项目团队都是充满全能型选手的,虽然我用PHP可以搞定很多问题,但在有的场合下,它不是最合适的,于是,我顺便粗浅地使用了一些语言(产品):

              1. linux bash shell来做linux系统管理(比PHP简洁,如for file in ls ./
              2. 用java写Hadoop Map Reduce程序,比PHP高效和自然(PHP要通过streaming api转一下输入,自然会损失一点点性能),java写敏捷软件开发培训的案例
              3. 写puppet module的时候要用到一点点ruby,没办法,puppet就是ruby写的
              4. 参与公司一个存储项目时看了一点点Erlang
              5. 早期帮人装movable type的时候看了一点点perl
              6. 因项目需要hack一个bit torrent客户端时搞了几天几夜python

              现在,除了php/javascrip/shell这几个使用时间达到几年的,其它的全都忘了。我开始学习使用objective-c做iOS开发,除了是听从公司的安排外,这也符合我一年前的新语言选择,原因也简单:它实在太火了,我自己家里就买了大大小小5个苹果设备。自然让我萌生了要在自己的苹果设备上写点啥的念头。

              等我学会objective-c了,我还想回去再好好学习java和C,java在开源世界和阿里巴巴太重要,C是用来给PHP写扩展的。

              好了,再来总结一下我选择新语言(技术)的原则吧:

              1. 一定是现实的业务驱动的,我不会为了学而学
              2. 顺应市场趋势,ASP这样被历史车轮碾碎的语言,就跟它说声珍重吧
              3. 学习以我的计算机基础能理解的语言,汇编我就不碰了,毕竟我大学的计算机课程只有《计算机应用基础》和《C程序设计》

              (to be continued,新装的电脑,触摸板没禁用,打字时光标四处跳,出现莫名其妙的字句请指出,见谅)

                • 4
                • 新人请关照

                与自己第一门语言起到互补的语言,同时基础第一门语言的基础,这样上手不会太难,还起到互补。

                  如果已经做程序员工作很久了,那么你多半不止掌握一种语言。如果所谓“第二”语言特指的是“工作之余”,那我觉得应该是两种方向:
                  1. 开阔视野,那要选择与自己所用的语言在思想上差异较大的,比如oo对于函数式,gc对手工内存分配……
                  2. 个人兴趣,那要看有没有兴趣相投的人了,找不到朋友经常交流,那兴趣很快就会淡下去
                  学第二语言,牵扯的不止是精力,还有体力和耐心。这些也都是要考虑的。

                    选编程语言就像是选聊天茶室,你除了在乎茶室的茶品(语言的好坏),还会在乎是和哪些人聊,聊哪些话题(语言的社区、工具、库等)。Clojure开发/用户社区气氛良好,基本都是资深开发者、顶级Hacker以及有追求的程序员,有格调、有层次。

                    http://qiujj.com/static/clojure-handb...

                      依据有三:工作领域、个人爱好、语言流行程度。

                        • 1.1k

                        这个问题不同人有不同的答案, 首先要看程序员对自己的定位. 博士们研究算法也要写一些程序, 但是他们的定位就和工程师不同.

                        产品工程师对自己的定位, 在于快速的搭建产品, 有的产品比如iOS受到语言的限制, 那么只能接受(学会了觉得objc很美). 有些产品比如web, 不受语言限制, PHP, ruby, python, node, 各有特色, 尽量都看一遍, 再做选择, 就业市场上这些职位都有招聘.

                        如果你只是为了一份工作而学习编程, 那么你的世界是灰色的. 尽量选择你喜欢的. 你对自己擅长的语言是有感情的.

                        除此之外, 我认为有一些基本哲学的东西, 往往在学习一门语言的时候获得, 确放之四海皆准, 比如pythonic. 它是我在学习python的时候接触到的, 但它的能指导一个人或者一个团队的编程风格, 甚至编码以外的做事方法. 另外比如说UNIX哲学, DIY和DRY原则.
                        这就像功夫, 各种语言就是招式, 你还需要内功心法才行.

                        还有的就是设计模式, 我不推荐读书, 我更加喜欢朴素的设计模式观念. 任何事都有一种大家可以认同的, 足够简单的解决方法, 无需模式化命名.

                        最后关于第二语言, 我的第二语言最终变成了第一语言, 然后我现在的第二语言会比较没用: clojure, 但是我不熟悉Java所以我正在玩clojure-py, 一个非常不完整的东西.

                          • 119

                          本人做过C#一年,后转PHP,做了2年多了。
                          自己的目标是架构师。
                          所以现在我的目标就是把C/C++这个(就当做一个吧)底层的语言、知识弄精通了,再加上现在的WEB基础,努力成为一个WEB架构师。。。

                            • 2.6k

                            一门脚本语言,熟练掌握其正则表达式库、HTML/XML/JSON解析库、HTTP库、网络协议相关库,干脏活用

                            Python, Ruby, Perl都可以,但是PHP就免了吧…未来的ASP

                              我在学校学的是C/C++但是基本上没有这两个语言写过什么像样的项目。
                              后来开始使用C#+ASP.NET。但是结果发现我只能做一些维护,然后自己在工作之余自己编写一些网站程序。
                              现在我使用PHP,但是工作中却要求使用ASP做开发,结果我现在又开始学习ASP。

                              所以我的兴趣任然是C/C++ 主要用PHP,工作用ASP 同时写一些CSS+HTML+JAVASCRIPT
                              感觉一点都不精,问题不知道该从哪个入手。。C#+ASP.NET到是开发过几个WEB系统,可惜都没有拿出来给别人用过。。
                              如果加深学习的话,C#+ASP.NET最容易进阶。
                              现实与理想冲突,不知如何取舍!!???

                                • 2
                                • 新人请关照

                                学们主流的静态语言,学们流行的动态编译语言就差不多了~

                                  • 1
                                  • 新人请关照

                                  刚微博上看来的。楼主如果是为了单纯的兴趣的话,可以选一本如《七周七语言》这书这样的先泛泛看一下,然后再选其一而学。其实第二语言这个有点伪命题,因为
                                  1.按兴趣选的话,完全就是个人兴趣的,这个别人也帮不了;
                                  2.按实用需求选的话,就看开发环境日常需求,已经对自己今后发展的判断。

                                  PS:我自己也是学C/C++入门的,不说小时候的logo basic之类,目前在学Python,选择是因为兴趣和弥补动态语言知识的欠缺,以及对以后工作需求的猜测。共勉。
                                  附上文章一枚,里面的道理虽然不是直接与选语言相关,但是……看看说不定有惊喜,里面以习武之道阐述我们平时学习之路,不管是语言或者什么,里面的阶段说蛮不错。推荐。
                                  http://www.zhangxinxu.com/wordpress/?...

                                    建议这么选择。
                                    如果第一语言是动态语言,第二语言就选择静态语言。
                                    如果第一语言是静态语言,第二语言就选择动态语言。
                                    体验不同语言的编程习惯,编程思维,编程结果,编程过程。

                                      • 1
                                      • 新人请关照

                                      语言不重要,思想才是最重要的。

                                        • 144

                                        我这么多年经历的语言有:C C++ JAVA ,都是静态的,还有C#和asp都只写过一点点代码的就可以忽略不计了,不过你可以发现这些都是静态语言,甚至可以说都是C系语言。

                                        去年专门学过Python,但是没有做项目,然后过了就忘了,跟shell一样,你体会到其中的写脚本的思想就可以;

                                        今年专工Java的深入,然后发现了Scala,对它的函数式编程范式很感兴趣,所以现在正在学。说道Scala,想纠正一点就是Scala不是Java的加强版,看Scala的介绍,发现它收到很多C#、.net平台的影响,也修正了很多Java中不好用的地方,但是它最大的不同是对函数式编程的支持。

                                        自己的教训:学了以后还是要做出点东西的,哪怕写个小小的模块。例如我用python帮审计行业的朋友处理过excel;目前准备Scala能不能利用其Play框架写个网站后台。

                                          web开发相关,一门能做后台的语言,加上前端的必会的Js Jq html css,对于新人来说够了。

                                            • 3.2k

                                            java的资料非常多,python的资料很少。
                                            c++ c#这些还是无法逃离微软的编辑器?每次看到c++书籍,全都是在介绍vc++编辑器,服了。。。。。
                                            但是java c c++ 这些行业的大牛实在是太多了,似乎最终选择只有python?或者android swift?
                                            同样纠结,只会一门真的不太好,找工作都受歧视

                                              • 4.6k

                                              我个人喜欢的语言是C、C++,也想研究研究Python,但是因为工作原因,使用的是一个老家伙---Delphi。不过就我目前的技术水平还没有深刻体会到语言的差别,感觉都挺好的,都值得学习、值得钻研的。

                                              路漫漫其修远兮,对于技术的追求也是没有止境的,希望我尽快熟练掌握Delphi的开发,然后能够有更多的时间和精力去钻研我感兴趣的C、C++。

                                              语言本身是值得研究的,但是独立于语言之外的其他知识同样重要,比如算法、操作系统、网络原理、设计模式、数据结构、数据库原理……

                                                根据工作需要

                                                  • -7
                                                  • 新人请关照

                                                  看看啊啊啊

                                                    撰写回答

                                                    登录后参与交流、获取后续更新提醒

                                                    相似问题
                                                    推荐文章