程序員真的只需要精通一門編程語言嗎?

經常看到有人持有這個態度,不知道該如何看待。
另外,在大學裡應該多學習幾門語言,還是學精一門語言要好?
(准大二,目前掌握Java語法,暑期報班學習C++中。)


建議題主去掉「只需」的「只」,就沒問題了。
現實中不會停留在「一門」上,而是陸續、不斷的變換著「精通一門」
放心,因為信息量太大、更新太快,你很難同時精通多種的,當你敢說精通其中一門的時候,就未必敢說精通其它了
——總之,當你對何謂「精通」有了概念之後,就不會有這些問題了。

題外,這類問題都是入門路上者常見的問題,而圍觀者往往也是入門路上者

這些江湖漢子除了極少數高手之外,所學的均只一派武功,陸柏說武學貴精不貴多,眾人自表贊同,這些人於這個「精」字是否能夠做到,固然難說得很,至於「多」,那是決計多不了的

給 @kubisoft 點個贊,看了下頭幾個回答,快速瀏覽了一眾回答,絕大部分就是這樣的情況了。
——所引用的金庸先生這一段話,真的不能同意更多。
對於「還不知道自己不知道什麼」的階段,也就是說還無法對何謂「精通」進行評論的階段,別著急來回答、評論。
——對於那些高手們說的「貴精不貴多」觀點點頭稱讚就行了,等你了解自己距離「精通」還差哪些時,心裡自然有數了。

再題外:做人不能光否定不貢獻啊?分享一點經驗吧,不妨對號入座

  1. 混淆了語言和語言工具:比如 C/C++ 和 MFC、Borland C++
  2. 混淆了語言和語言操作的對象
    比如 javascript 和 html/css/DOM,比如 perl/jsp/asp/http://asp.net/php 和 html/css/javascript;
    再比如用無論什麼「語言」(其實是工具)操作讀寫註冊表的 Windows API、.NET Framework;
    再比如用快速開發工具如VF/VB/VC/VCL/http://ASP.NET/MVC等等操作各種控制項;
  3. 混淆了語言和解決問題的過程中所需要的知識:比如操作系統環境變數、Shell和Shell腳本(Sh/Bash/Windows Host Script)、註冊表、窗口句柄、進程和線程、HTML/XML、PL-SQL/T-SQL、Samba/FTP/SMTP/POP3/IRC,甚至RFC1459、RFCxxxxxx 等
  4. 忽視了提高實現能力過程中自覺不自覺提高的分析/設計能力
    比如,如何用好面向對象的特性?或者不用?
    再比如,如何實現較好的可維護性、可擴展性、可伸縮性,如何做到「優雅的設計」?
    ——總之,就是大家喜歡說的,所謂的編程思想。
    ——當然,很多人是無意中提高的,也有有意提高的。
  5. 成長過程中,真正提高的是解決問題的能力——這才是重點
    分為三部分:A. 實現能力:說白了就是照圖紙裝修的實施能力;B. 通用能力:分析問題,然後(綜合各種信息、學習、甚至諮詢專家等)找出解決方案的能力——設計圖紙;C. 業務能力:熟悉特定業務領域
    ——尚未入門的朋友,自然而然最關心的是 A. 技術實現能力。
    更好的,還有創新解決問題、解決複雜問題、解決新問題的能力——暫時不強求了。
    記住:除了科研人員,IT Guy乾的都是同一件事——用信息技術的手段解決各種問題——發揮信息技術的特點,解決那些傳統手段沒辦法實現、效率低下、體驗不好的問題。
    有沒有不解決問題的IT Guy和程序?——有的,交給老師的作業,老師也只是隨便點幾下看看,評個分就完事了。

想想這些,你會發現,只有尚未真正入門者,才會關心和糾纏這類話題。
隨著你已經知道「何謂精通,或者精通了「一門語言」,伴隨著的是以上的知識和能力的提高。

也許,隨著你的成長,你會像我當初一樣:把簡歷中各種技術門類下的「熟悉」「精通」統統去掉,項目經驗、工作經歷中的大段大段描述統統去掉,只留下一句話

享受並擅長分析、解決問題,尤其新問題和複雜問題

——簡直是樂此不疲啊,呵呵


能夠精通一門程序語言的程序員,是不會在乎涉獵一下其他語言的那麼一點點精力的。

再者各種高級語言都會有自己的設計思想。Ruby 的對象模型源自 Smalltalk,Python 的列表解析式來自 Haskell,C++ 的成員函數語義仍然基於 C 的函數和結構體指針,PHP 的關聯數組來自 Perl。絕大多數編程語言都多多少少吸納了其他語言的一些優秀設計思想。所以作為一個程序員,如果只看井下一片天,也很難「精通」某一門語言。

另外我個人認為,學編程語言還要靠培訓班的話,後面的路會比較難走。建議嘗試自主學習。


先把樓主的問題標題修改一下:「程序員真的需要精通一門語言嗎?」 ,回答是:真的。把問題中的「只」去了吧。

至於需要精通多少門語言,這是個順序問題。
首先需要去精通一門語言, 編程才算入門了。 然後再談其他的。
至於怎麼算精通一門語言,可以參考這兩個帖子:怎麼樣才算是精通 Python?和 怎樣才算是精通 Ruby? 或者其他類似貼子,lz可以搜一下。
也許在你精通一門語言的過程中,精通了其中幾門也說不定。


程序員一定不能只精通一門語言
否則你怎麼幫助漂亮的女同學


每種語言的特性,使得應用的範圍不盡相同,所以根據需求需要涉獵不同的語言,但由於人的精力有限,從思維層面精通一門語言,更有利於深度的挖掘,但精通何其難也,大學期間能熟悉已經很不錯了,而所謂一通百通主要是,你已經掌握一門精髓了,在學習別的語言的時候已經免掉了許多了東西的學習了。


你有這樣的問題, 一定是對精通的理解不對。


「昆蟲才講究技能專一」
—— 開源運動的旗幟《大教堂與集市》


如果你精通了一門語言,html 不算,那麼熟悉其他的語言也是自然而然的事情,不用刻意學,就可以開始用了。


曾經我以為 Pascal 就是編程,雖然我知道有 C 語言,但是老師說 Pascal 和 C 轉換過去很快,所以就覺得——把學 Pascal 學好就好了。

然後有一天,我想開發有按鈕有界面的軟體,於是發現了 VB 這種語言,當時就覺得:我了個去,原來寫軟體就是這樣啊,把控制項拉過來,再用 Basic 語言寫好邏輯就好了,所以就覺得——要寫軟體把 VB 學好就好了。

然後有一天,我想開發單片機來控制硬體,於是發現了只能用 C 語言和彙編語言,C 語言看起來簡單一些,就去學 C 語言了,然後那些硬體真的可以被我的 C 代碼控制,所以就覺得——要學硬體把 C 語言學好就好了。

然後有一天,有人和我說你電腦這麼厲害,會不會開發網站啊?於是我去看了一下資料,發現原來網頁就用 HTML 寫出來的,當時就覺得——要做網站把 HTML 學好就好了。

接下來我發現,
要把頁面寫得漂亮還需要 CSS 呢!
一些邏輯或者控制的功能還需要 Javascript 呢!
CSS 上面還有 Less 這種東西呢!
Javascript 還有 jQuery 呢!
JS 和 jQuery 上面還有 CoffeeScript 這麼高大上的語言呢!
要有數據的展現還需要學 PHP 呢!
要用到資料庫還需要學 SQL 語言呢!
尼瑪還有 Node.js 也可以做後台呢!
寫爬蟲還有 Python 這樣的語言呢!

而現在,我再也不敢說「要幹啥把啥語言學好就好了」,因為懂得越多,就越發現自己懂的越少。
用個老土的說法來說:IT 界日新月異。你所熟悉的語言,說不定明天就被其它語言打敗,或者被該語言自己打敗了(比如 HTML5)。當你不思進取,以為只要精通一門語言就想以為足夠而不繼續不斷學習的話,你也會被淘汰。


你可以只精通一門,但是不能對其餘的語言一無所知。曾幾何時我也以為懂Java就夠了……結果我最近被迫在看Davlik虛擬機的彙編語言……

以及,不管你學什麼語言,早晚要被迫學C++……


曾經我以為精通C就夠了,直到需要寫GUI換成了Java;
我發現Java還能寫網站挺不錯,直到發現部署windows太麻煩學會了C#;
我以為C#就夠了,結果發現網頁太丑學會了HTML5/CSS3;
後來發現這樣還不夠炫,又看了看JavaScript/jQuery;
然後我就覺得C#煩了,轉行寫了一段PHP;
但PHP好多東西沒實現,於是學會了Python;
但Python終歸還得寫代碼,有時候想偷懶就學會了很多*nix bash util;
但bash util有時候不夠複雜,所以跟人家學了點Perl;
可惜Perl語法太亂了而且跑起來慢,需要完成快速開發、快速計算的時候還是得用C++;
其實C++也不夠快,有時候還是要上CUDA;
但GPU的容量有限,想多個一起用還是得學點MPI;
偶爾想寫web的時候又發現MPI太複雜了,回去學了點node;
學了node發現函數式編程挺好玩,最近在準備學haskell...

當然這些東西都可以用C花幾十甚至幾百倍的時間從頭做出來——如果題主喜歡:
a. 精通某門語言所有的細節,能和人侃侃而談;
b. 用一種自己最熟悉的語言(不管多麻煩)從頭實現很多功能/特性;
c. 一輩子做一類工作,這類工作只需要一種編程語言;
以上任何一點的話,那大可放心只精通一門語言。把閑的沒事學語言這種俗事兒留給我們這些俗人吧!

ps 其實這樣的結果是每門語言都不精通,大多數都得看著文檔寫代碼——不過對不同的任務有不同的適用語言罷了。但對於大部分人來說,相信這樣仍然比一直指望用一個語言完成一切快得多。


可能是我太偏激了
1,我最不喜歡有人說自己精通某門編程語言。你敢說你精通中文么?主流的編程語言雖然沒有中文那麼博大精深,但也算的上是博大精深了。我看過部分剛工作或者工作過2-3年同學的簡歷,寫著精通c語言阿,java阿之類的,我只想送他一句「離我遠點」。
2,然後就是非常不喜歡看到想做程序員的同學報班學習什麼c語言,php,網站建設。理由就不說了。

我同意精通一門語言就可以一通百通,但問題是有人真的能精通一門語言么?我相信知乎上的大多數人都不能。
另外要想精通一門語言,必須要有深厚的積累,這個積累的過程中必然會接觸其他的語言和知識,最後融匯貫通,醍醐灌頂,終於可以說精通了。
往往真的精通某門語言的大師又不會說自己精通了。

以上提到的「語言」一詞,可以用「學問」,「科目」,「領域」等詞語代替。
精通編程是這個道理,精通其他的學問也是這個道理。


如果你真能做到「精通」,那麼「精通」一種語言就夠了,其它的語言對你來說應該壓力不大。
但是要注意「精通」的標準不想你想像的那麼低,以漢語為例,全國十幾億人,真正能說得上「精通」漢語的估計不超過十幾個……


此說法不嚴謹,我認為:
優秀的程序員需要精通至少一門編程語言。

習武也是如此,先把本派武功練好,再去涉獵別家。如果你對自己要求不是優秀而是混飯吃,那麼能找到工作就行,精通不強求。


本人是PHPer,輔學python.
一門語言肯定是不行的,如果你想深入了解一門語言,最好的辦法是再學習另外一門語言,


應該說精通一門業務。
語言只是實現的一種工具,就好比一把鉗子,今天這把明天換那把,鉗子怎麼握,正握反握,多大力,這些東西都是細枝末節。只有業務才是你真正混飯吃的本錢。
如果你真要學一門,建議學好英語。國內技術水平慘不忍睹~~~,解決問題全靠stackoverflow。
如果真要學好一門計算機語言,我覺得vba不錯。可以瞬間把代碼拼出來,也可以寫幾個小代碼忽悠美眉。


編程語言只是皮相和工具,對黑客而言用什麼語言這是由問題本身和自身情況決定的,除非接觸面本來就很狹隘(比如只做「企業級開發」大概就J2EE了),否則黑客一定會接觸到大量各種各樣的語言。


就我作為前端的案例:
接觸過的語言已經有 python, PHP, Javascript, HTML/CSS, SQL 什麼的一堆了;
延伸開來還會有 Coffeescript, HAML/Jade, LESS/SASS……
python那塊懂了些皮毛沒深挖,ipython、元編程神馬的似乎很好很強大……
LISP、ROR和R語言不太敢碰怕心有餘而力不足,SHELL一直知道很有用但一直沒這動力……
就更別說各種跟語言其實不是特別相關的東西(Mongodb, nginx/apache/mysql配置, GNU那一堆東西,git)
此外,關聯領域又一堆亂七八糟的東西,UED方面的(用研,交互、UI、信息架構等),可視化相關的,數據分析相關的,然後還有大數據的那堆東西……
關聯領域如果有相關框架或庫的話又一堆亂七八糟的東西,比如Highcharts, Leafletjs, d3js, Raphael... 想用好都夠我喝一壺的。

報班學C++?圖樣圖森破呀……


只會一門編程語言不是專業的程序員。堅決反對「編程語言一通百通」的觀點。不同的編程語言差別是很大的,動態和靜態、強類型和弱類型、編譯和解釋、面向對象、面向過程、面向切面、函數式編程、基於並發的編程。那些聲稱一通百通的人肯定沒有接觸過兩門截然不同的語言,或者就是在干一些用Java寫C代碼的事。一個只會C語言的人我不相信他會一通百通的搞定LISP。
作為一名準備靠寫代碼吃飯的人不應該把自己綁在一門編程語言上。萬一哪一天這門語言倒了,你也就失業了。編程語言只是一種工具,所以我們應該用最合適的工具去解決最合適的問題。不同的語言有不同的應用範圍,就像不要用菜刀去做手工一樣。
我認為有可能的話程序員應該精通2-3門,掌握一定數量的語言,並以一定的速度持續學習。在需要使用其他語言的場合應該能夠迅速回想起之前的學習並且寫出良好的代碼。大學裡我覺得面向對象、面向過程、腳本語言各學一門,並熟練掌握。然後爭取能夠每年學會一門新語言(不是精通)就可以了。


程序員需要精通六門語言。參見: http://www.catb.org/esr/faqs/hacker-howto.html

  • Python, C, Perl, LISP, Java, HTML (後來補註為符合XHTML規範的HTML)

當然,除了以上六種語言,還有一種語言必須掌握,如果不掌握,以上掌握得再多都沒用,那就是:

  • English

個人覺得學習一門編程語言,你可能會認為「我現在的語言就無法精通了, 我可能沒有精力去學習別的語言,這門語言我都們有搞懂......」等等很糾結的問題。但是我覺得學習一門語言可以加深自己對編程的理解和對寫代碼的認識。
比如說,之前學習PHP,自己禁錮在PHP的氛圍中,當用Python寫web的時候,才發現url匹配可以這麼方便,學習ruby後發現無論你想實現什麼功能,ruby都會提供相應的包,而且使用非常簡單。當你發現自己禁錮在腳本語言的環境中,用著別人的框架的時候(可以自己寫框架),覺得太過膚淺,然後了解C++,接觸內存管理,發現定義了一個變數,解釋器幫你做了那麼多事, 那麼多值得了解的事。等等...
非常慶幸自己學習了一些別的語言,可能我精通的沒有多少,但是感覺自己的視野變了很多。
這篇文章寫的很好,可以了解一下:Teach Yourself Programming in Ten Years


推薦閱讀:

現在編程語言研究的前沿和熱門問題有什麼?
現在哪種編程語言需求量大?
各個階段的python學習路線?
函數式編程如何工程化?
遊戲編程,變數命名用拼音可以嗎?

TAG:互聯網 | 程序員 | 編程語言 |