優秀的程序員應該掌握多少門編程語言?

彙編,c,c++,java,都要掌握么?


Learn at least a half dozen programming languages. Include one language that supports class abstractions (like Java or C++), one that supports functional abstraction (like Lisp or ML), one that supports syntactic abstraction (like Lisp), one that supports declarative specifications (like Prolog or C++ templates), one that supports coroutines (like Icon or Scheme), and one that supports parallelism (like Sisal).

譯:
至少學6種程序語言。
其中包括一種支持類抽象的(Java和C++),一種支持函數抽象的(如Lisp或ML),一種支持語義抽象的(Lisp),一種支援聲明規範的(如Prolog或C++模板),還有一種支援協程的(Icon或Scheme),另外一種支持並發的(Sisal)。

——————By Google 研究總監 Peter Norvig。

參考資料
【1】Teach Yourself Programming in Ten Years


學多少語言都既不多也不少,語言什麼的,除了天殺的Haskell讓我學了一周之外,(第二門語言和後面的)難道不是兩天就能學的會的么?


每一門語言有每一門語言的好處,c++的靈活,java的跨平台。盡量都了解一點,等到真正用的時候再去深入。先精通一門語言入門,了解演算法,數據結構,編程思想。畢竟代碼都只是別人指定的規則,編譯器或者解析式能讀懂的規則,基本大同小異。另外我個人還是很推薦去深入了解c++的,雖然有些概念很不好理解,但真正吃透的話會對你對代碼的理解會提升很多的!


他們關心的是「編程語言」這個更廣泛一般的空間,而不是某種或幾種特別的語言。要獲得這種直覺,有意識地選擇學習不同paradigm的代表語言就可以了,imperative, functional, logical, oo ... Overview of the four main programming paradigms 在這個基礎上看別的語言都是似曾相識的感覺,已經觸類旁通了。

做程序員的高級境界是做「程序員」,而不是某種特別語言的「X程序員」。


越多越好

語言其實是件非常重要的事情,它很大程度上決定了個體的思考方式和群體的文化特徵,首先,你是用語言在思考問題,它的表達能力和邏輯結構,直接影響了對問題如何進行抽象,其次,你還需要用語言和他人進行交流,擁有共同的文化背景和審美趣味的人,會用更少的辭彙,更短的時間,進行更有效的溝通,這直接帶來了效率的提高,以及更優雅合理的產出物。

我想簡短地描述我所用過的一些值得學習的語言,並給出對學習這門語言的推薦程度,1-3星,篇幅有限,會非常簡短,更多的介紹請自行查找。

以下按各語言誕生的時間排序:

----- 2014.5.12 更新 PHP,Perl,AWK ------
----- 2014.5.30 更新 Unix Shell ------

Lisp 1958,3星

Lisp是我最喜歡的語言,儘管它的誕生年代已經相當久遠,但它的特性遠遠超越了時代,動態類型,垃圾回收等等當今已經司空見慣的特性略去不談,最重要的是,它是第一門homoiconicity language,簡單說就是代碼的結構和數據結構保持一致,這意味著,它擁有所有抽象可能性中最強大的一種抽象,即用代碼來生成和表現代碼,比如宏,了解這件事情,對學習編程,其實也就是學習如何抽象事物,非常,非常地有幫助,其次,Lisp的列表結構和完全函數式編程,讓理解和學習遞歸這種基本而重要的思考邏輯,變成了非常自然的事情,這是程序員必須要學習,並且要花相當多時間學習的語言。

Smalltalk 1972,3星

第一門真正的面向對象語言,而且在今天,它對面向對象思路的描述,即消息傳遞機制,幾乎已經得到了廣泛的認可,所有後續的面向對象語言,如Java,Ruby,Python,都受到了直接的影響,還有大量的設計模式,比如眾所周知的,用於設計用戶界面的MVC模式,都是從Smalltalk中誕生的。而後面這些面向對象語言,都或多或少地對Smalltalk的設計進行了一定的改動,想要真正理解面向對象,需要認真學習一下Smalltalk。

C 1972,3星

C語言不用多說了,因為它和Unix的綁定關係,使他成為了必須學習的語言,關於語言本身,指針的概念和操作也對於了解計算機系統的實現相當有幫助,而函數指針和宏,也賦予了C一定的抽象能力,儘管大部分情況下,是對智力很嚴峻的考驗。

Scheme 1975, 3星

Lisp的一種最簡化的方言,它是最適合入門Lisp,尤其相較繁雜的Common Lisp來說。

AWK 1977,1星

和C一樣,它也來自於Unix(AWK中的K就是 Unix創造者之一的Brian Kernighan),而且本身就是個很強大的文本處理工具。不過,語言自身相對簡單,構築複雜程序時比較力不從心。它非常適合於和Sed一起,進行各式各樣快捷而強大的文本處理,直到有了Perl。

Unix shell (Bourne shell/C shell) 1977, 3星

Shell一直是跟隨著操作系統誕生而成長的,但直到第七版Unix,Stephen Bourne編寫的Bourne shell(也許你更熟悉 sh 這個命令名),它才真正成為了完善的腳本編程語言,而之後編程奇才 Bill Joy(嗯,他寫了那個我不喜歡的vi)開發的C shell(csh)則更勇於向前邁進。時至今日,Shell的一些語法特徵從編程上來說,稍顯老舊,但是,它依然是最值得學習的語言之一。原因有二,首先,Shell語言是非常好的粘合劑 ,它有很多種方式,讓不同的程序之間,不同的進程之間協同工作,這種從進程角度組織複雜程序的思想(也是Unix哲學的核心,簡潔而單純地將一件事做好)是非常有意義的,其次,出於命令行(CLI)的要求,Shell程序天生就追求更短更簡化的寫法(有時不免有些晦澀),這讓Hacker們感覺非常爽,直接啟發了日後Perl等Hacker專屬語言的誕生。所以,我認為Shell是程序員必須熟識的語言之一。

C++ 1983,2星

C++也是用途非常廣泛,不用再多說的語言,它的泛型是一種相對獨特的抽象,值得學習,而其他方面,如果你熟悉了C,Lisp和Smalltalk,那麼C++對你來說不會有太多需要花大力氣研究的東西。

Common Lisp 1984,2星

Lisp當前最流行的實現,非常龐大而複雜,除了Lisp本身的特性之外,還有面向對象等等在其他語言中引入的特性,但Common Lisp對這些特性的實現,有賴於Lisp本身的強大,而變得非常精巧和簡潔,比如多重繼承。

Emacs Lisp 1985, 2星

Emacs中的Lisp方言,相較Common Lisp,功能和特性省略了太多,在編寫複雜程序時,會相當捉襟見肘,但是,它依然是Lisp,而且可能是我們工作中最常用到的Lisp方言。

Perl 1987,2星

Perl也是我非常喜歡的語言,它誕生於Unix文化,受Shell,Awk等語言影響極深,深深執著於以行為單位對文本的操縱,它的哲學實際上是非常受Hacker文化的影響,強調用讓人驚訝的方式完成代碼。這在高手眼中酷的一塌糊塗,但在新手眼中則猶如天書。隨著無數高手加入社區,Perl也逐漸發展壯大成了能夠獨擋一面的泛用編程語言,但儘管如此,即使到了Perl 6,它也沒有丟掉骨子裡那種崇尚酷炫,欣賞創造力的精神,這也是我喜歡它的原因。時至今日,Perl的Hacker精神和創造力逐漸被Ruby所繼承,而用它寫實用性Unix腳本的人也轉向了Python。但無論如何,如果想知道Hacker是怎樣思考,怎麼做事情的,那麼Perl和Perl社區,實在可以說是非常好的選擇。

Python 1991,2星

非常流行的Python,可能最主要的意義就是Python之道,即無比強調代碼的可讀性,以至於強制隨進來控制代碼塊,「做一件事情只有一種顯而易見方法」的哲學,我覺得Python是非常適合工程學的語言,比Java更好,更規整而又相對來說靈活,同時Python又足夠簡單,因此,可以認為Python是所有語言中最適合首先入門來接觸計算機科學的語言,很多大學也都是這麼做的。

Ruby 1995,3星

Ruby是除了Lisp之外我最喜歡的語言,也是我現在做 KnewOne最主要用到的工作語言,它的主要設計哲學是「一切為了讓編程更快樂」,因此,Ruby繼承了Perl的Hacker精神,同時又相當統一和優雅,它強調發揮程序員的創造力,語義模糊而多樣,對同一個任務,有多種不同的解決之道,這和上面Python的哲學背道而馳,也是我喜歡Ruby的原因。函數式編程,面向對象,混入(Mixin),元編程(用代碼來生成代碼),種種不同的設計思維,在Ruby中得到了很好的融合貫通。不過,正因如此,在Ruby社區中,人們想要互相理解對方的設計思考過程,相比Python來說是要更費力,對程序員要求更高的,所以,Ruby並不適合做為學習編程的入門語言,而更適合在你學習了很多編程語言,熟悉了編程之後,成為最長久(目前來看)的陪著你一起完成日常工作的伴侶,因為每時每刻,Ruby都讓編程充滿愉悅,Code Ruby,Be Happy。

Java 1995,1星

Java可能是世界上最流行的語言,不過我對它持有非常強烈的偏見,我一直認為這是一門由聰明的人設計,用來控制一幫智力平庸的碼農,讓他們不至於捅出什麼簍子的語言,基本上所有的設計特性,都是為了壓抑創造力,讓程序員變成按部就班擰螺絲釘的機器來考慮的。不過,Java擁有可能是所有語言中最強大的虛擬機平台JVM,在其上誕生了無數優秀的軟體,為了JVM,Java還是值得學習一下的,不過這門語言也是實在太簡單了,假設一個人學習Lisp或C需要一個月,學習Python或Ruby或Perl需要一周,那麼學習Java,也許只需要一天就可以,因為就語言本身來說實在沒那麼多可學的。

PHP 1995,0星

六七年前,在還不能自主選擇公司的技術框架的時候,我被迫用過兩三年的PHP做為主要的工作語言。現在,在接觸很多語言之後,想起PHP,最主要的感覺就是拼湊,一種無原則的實用主義,它在九十年代末期為web開發誕生,並非一開始就以泛用型編程語言為目標,在整個發展過程中語言的進化相當混亂,不斷從各種其他語言中拼貼特性。其實,PHP在web開發領域相當強大,有很多不錯的web框架及函數庫,語言自己也內置了不少很好的支持。但做為學習編程用的語言,它會非常,非常有害,我幾乎沒有見過一個PHP程序員有代碼潔癖的,語言自身的混亂,造成了程序員表達上的混亂,久而久之,就形成了「能用就好,實現功能就行」的習慣。這門語言做為糊口的工具還是可以的,但遠遠談不上編程的美,完全不推薦學習。

以下坑待填:

Tcl
Lua
JavaScript
CoffeeScript
Go
Scala
Clojure
Haskell
Erlang
Object-C
Prolog


說說自己的經歷吧,開始編程的時候總認為那些懂很多的語言的人是牛人,所以過分關注語言,但忽視了語言其實是用來解決問題的,評價一個好的程序員不應該單純從語言層面來講,重要的是學習新知識和解決問題的能力。面對不同的問題,學習合適的語言去解決就行了。不要為了學習語言而學習語言。


三門。
因為一生二、二生三、三生萬物。


2015年2月編程語言排行榜,JS排名創歷史紀錄

JavaScript不斷走強。本月它超過了php,現在的位置排名第六。另外,Objective-C的日子似乎已經結束。一年時間,Objective-C份額下降超過5%。現在排到第四的位置,在C++之後。Objective-C之前排在第三位的位置長達超過2.5年。

以上資源來源於DevStore

以上資源來源於DevStore
首先是C語言:這門語言應該不用多少了,很多程序員的入門語言都是這門,但是很少有人能學的精通的,C語言更偏向於底層,是面向過程的語言,我目前正在研究操作系統的內核結構,很多情況下是要有C語言的彙編的功底的。所以C語言強烈建議掌握。
其次是Java:Java應該算是比較優秀的面向對象的開發語言了,所以,如果要想掌握面向對象的思想的話,學習Java是一個非常不錯的選擇,並且Java的資料也是非常之多。而且針對於Java的開源項目也是很多的。
接著是C++:這門就不用了,是C語言的擴展版本,屬於面向對象的範疇,很多操作提供的內核也使用了C++進行開發,有必要掌握一下。
接著是Objective-C:如果要進行IOS的開發的話,這門要掌握了,但這們也是以C語言為基礎的,所以題主可以看到C語言的強大了吧。
接著是幾個腳本語言:PHP、Python、JavaScript、Perl、Ruby等,我認為腳本語言還是要掌握一門的,比如Python、Perl還有Shell Code都是不錯的選擇,畢竟有時候腳本還是非常方便的。


看項目來定,不同的項目有不同的選擇偏重。

你可以用Java,c,c++,或者c#這類的語言來開發遊戲伺服器,但總不能用腳本語言Ruby,js,Lua,PHP來做同樣的事情。

類似的選擇多了,自然就會一大堆語言或者精通一門。


我認為《7周7語言》里介紹的語言恰到好處,從面向對象語言到原型語言,到函數式編程再到邏輯約束語言,幾乎涵蓋了業界使用的所有編程範式。
樓上說的只精通一門是不對的,編程語言的差別遠不只語法那麼簡單。


一直覺得程序員應該不分語言才對。語言就像工具,用刀子用得再順手,也不一定能成為一個優秀的雕刻家;用鉛筆再順手,也不一定能成為一個優秀的畫家。程序員同理。

為了避免定義不同,這裡不妨認為,程序員的本份是寫出好的程序。而用什麼語言,會多少語言,都是為這一個目標服務的。比如,你想寫一個小網頁,首選是php,因為簡單易用,平台廣泛,框架,代碼資源豐富。但當你希望加入許多圖像處理的功能,就應該鑽研php,考慮如何用php調用其他語言寫出的庫,或者乾脆選用python來做整個項目,因為python下有許多優秀的圖像數學庫。在這種意義上,多會幾種語言,確實可以達到鑽研某種語言相同的效果。

但是如果你要解決的是金融交易系統的速度問題,那麼就必須鑽研c,甚至涉獵彙編,才能解決這種硬問題。單純靠換語言是不夠的。

對於程序員,多會幾種語言,會什麼語言,並不重要,重要的是掌握解決問題的正確方法,和邏輯性強的思維,以及科學的思維方式,最好再加點數學。

關於語言,想必有一個技能是比較重要的,即看文檔,教程,能夠迅速掌握一門語言的能力。有了這種能力,現在掌握多少語言,應該就顯得不那麼重要了。

最後,比較贊成一專多精的說法。大家已經討論了好多,不再贅述。


不在乎掌握多少門語言,而在於明白語言的本質


C: 傳統的系統編程,原始的內存管理
Java: 面向對象編程,工業級編程語言,靜態類型的虛擬機語言
Python: 腳本語言,動態類型的虛擬機語言
JS(Node): 基於事件回調的函數式編程
XML/CSS: 聲明式的語言
Golang: 並發編程

不同意一些人所說的『精通一門就夠了』,可以看到上面的幾種語言代表著不同的領域,使用它們有著不同的場景,寫代碼時的思維方式也肯定是不一樣的。

補充:我覺得對於程序員,非常有必要嘗試接觸不同類型的編程語言,學習不同的思維方式。
我覺得優秀的程序員不是面面俱到,精通每一門語言,而是有隨時學習、掌握新技術的能力,這個能力是需要通過掌握大量的基礎知識(通常被稱為計算機科學)來獲得的。


遇神殺神,遇佛殺佛,用什麼就會什麼,需要懂什麼就學。不受[ 幾種語言 ]限制。


學到覺得PLT (Programming Language Theory) 領域裡再無讓人提起興趣的內容為止


一般情況是這樣的,每當一個靠譜的程序員說他會用多少門語言的時候,肯定有很多人說他吹牛。


首先回答題主的問題:

我認為優秀的程序員對於主流的編程語言應該都要會一些,不一定非要說達到熟練運用的水平,但至少能搭建這個語言的開發環境,並且編寫一個簡單的程序,這樣就對這個語言產生了一些初步的了解,知道這門語言適合做什麼,這樣在以後做系統設計調研時就能很容易的進行開發語言的選擇,畢竟在系統架構層面開發語言的選擇還是一項重要指標的。

那麼都有哪些主流的編程語言呢?下面這張圖是2013年的編程語言排行榜:

首先是C語言:這門語言應該不用多少了,很多程序員的入門語言都是這門,但是很少有人能學的精通的,C語言更偏向於底層,是面向過程的語言,我目前正在研究操作系統的內核結構,很多情況下是要有C語言的彙編的功底的。所以C語言強烈建議掌握。

首先是C語言:這門語言應該不用多少了,很多程序員的入門語言都是這門,但是很少有人能學的精通的,C語言更偏向於底層,是面向過程的語言,我目前正在研究操作系統的內核結構,很多情況下是要有C語言的彙編的功底的。所以C語言強烈建議掌握。

其次是Java:Java應該算是比較優秀的面向對象的開發語言了,所以,如果要想掌握面向對象的思想的話,學習Java是一個非常不錯的選擇,並且Java的資料也是非常之多。而且針對於Java的開源項目也是很多的。

接著是C++:這門就不用了,是C語言的擴展版本,屬於面向對象的範疇,很多操作提供的內核也使用了C++進行開發,有必要掌握一下。

接著是Objective-C:如果要進行IOS的開發的話,這門要掌握了,但這們也是以C語言為基礎的,所以題主可以看到C語言的強大了吧。

C#我就不想多說了,接著是幾個腳本語言:PHP、Python、JavaScript、Perl、Ruby等,我認為腳本語言還是要掌握一門的,比如Python、Perl還有Shell Code都是不錯的選擇,畢竟有時候腳本還是非常方便的。

剩下的那些開發語言我就不一一列舉了,題主碰到具體問題時再自行選擇適合的開發語言,比如如果你要做數據分析類的工作,那麼R語言應該是必須要掌握的,注意這裡我提到了具體問題,這也正是下面我要講的。

個人見解:

最近正在研讀《人月神話》這本書,在序中我看到了這樣的一句話:

為什麼中國的程序員總是在不斷學習新的開發工具,鑽研程序代碼,而不能逐步提升自己的視野、思維和經驗?

我想這也正是很多程序員的學習編程時候沒有動力或者成長很慢的弊病之處,首先我們應該認清編程語言只是一個工具,這個工具是為了更好的幫助我們解決問題的。比如我們現在要砍一棵樹,我們僅憑自己的手是很難把這棵樹給砍斷的,所以我們需要找把斧子,而這個斧子也就是一個工具,它可以幫助我們更快的把這顆樹砍倒,但是目前很多程序員處於這樣一個狀況:找到了這把斧子(選定了一門開發語言),然後就開始研究怎樣使用這把斧子,甚至達到欲罷不能階段,最終忘了我們找這把斧子是為了砍樹,甚至有的人都不知道要這把斧子是來幹嘛的!

所以,我們學習一門語言應該是為了解決一個問題的,只有在解決問題的時候我們的技術才能夠成長的更快,而自己隨便這本書悶頭學習這門語言是很難達到效果的,所以我認為無論我們掌握多少門編程語言,如果我們掌握的過程中不是以實際問題為驅動,那麼我們掌握的這些語言對我們的實際生活幫助也是微小甚微的,在《人月神話》在講之前的那段話之前還有一段話,拿出來我們一起共勉:

幾乎所有的人都認為,軟體開發是年輕人的職業。程序員們一邊揮著汗水,辛苦地熬夜寫代碼,一邊又對自己30歲以後的職業發展方向充滿恐惶。實際上,我國最缺的是有10年以上經驗的軟體工程師。金山軟體公司總裁雷軍說過:「在印度,包括在美國,我見到的項目經理都是三四十歲的人,他們『越老越值錢』,有些人甚至擁有超過20年的行業經驗。」


優秀的程序員不應該以會的語言數量來衡量,能不能在較短時間內學會一門新語言才是。


掌握多少門語言並不是判斷一個程序員是否優秀的條件。

有的人學了很多門語言,但是每種語言都是淺嘗輒止,沒有深入去應用,到頭來,真正需要寫程序的時候就不知道要用哪個語言來寫,不知道要怎麼寫。

學藝不精=沒用,所以你需要至少精通一門語言,在精通的基礎上再涉獵其他語言。真正的大神可以精通十多門語言。但是我們中的大部分人都只是普通人,所以完全可以把要求降低,精通1-2門語言即可。

對於語言的選擇,很多人會推薦你去學這個學那個,每種語言都有自己的優勢和弱勢,對於你來說容易上手的語言對別人來說可能並不容易。不論你學了哪種語言,只要這種語言可以為你所用,可以幫你解決工作問題,對你來說就是一種好語言。

另外,每種語言都是有互通之處的,當你精通了一門語言之後,再去掌握其他語言就會容易很多,所以,一開始的時候不要想著多學幾門語言,一口氣吃不成一個胖子,在一開始就應該專心一門。

歡迎關注我的微信公眾號:九章演算法(ninechapter),幫助你了解IT技術前沿,通過面試、拿到offer、找到好工作


一個程序員是否優秀跟他掌握語言的數量沒有任何關係。而是跟他的接受能力、思維能力學習能力有關。


推薦閱讀:

以英語為母語的人寫代碼時是什麼感覺?
學習彙編語言有什麼好處?
為什麼蘋果新語言 Swift 的 RC4 運算效能是 Python 的 220 倍?

TAG:編程語言 | 程序員修養 | 計算機科學 |