這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Learn at least one new language every year.
— Andy Hunt and Dave Thomas
自己一直是“每年學習一門新語言”的忠實擁躉,曾先後認真地學習了Haskell、Common Lisp、Python、Go等語言,對Prolog、Scala、Erlang、Lua、PHP也有一定瞭解。但幾年下來,只有Python一門語言算 是真正被留在我的大腦裡,用在了工作中。其他那幾門語言留下來的只是一些思想了。這似乎符合了Andy Hunt和Dave Thomas在《程式員修鍊之道》中對於這一實踐目的的闡述:“學會用多種方式解決問題,擴充我們的視野,避免思路僵化和停滯不前”^_^。
即便是殘存的思想,其實也並不深刻。要真正會運用新思維並非那麼簡單。一門程式設計語言從入門到精通,至少要經曆學文法、做實踐、用idioms(寫出地道的代碼)三個階段。這讓我深刻的感悟到:不以使用為目的的語言學習,都是在浪費生命!
有精力多學習些語言自然很好,我迫切期待能擁有一個像“七龍珠”中孫悟空那樣的“精神時光屋”呢。但現實中,人的精力是有限的,而我們要面對的電腦科學領域中的知識、技能以及問題卻似乎是無限的。因此在“每年至少學習一門新語言”這一實踐上,建議不要過於教條。 從程式設計語言自身來看,範型(Paradigm)是影響語言思維差異的主要因素,而程式設計語言的範型有限,主流的也就那麼幾種:命令式(過程式)、函數式、邏 輯式、物件導向等。每種範型的背後都有幾種、十幾種甚至幾十種語言,我們其實沒有必要都去學。從拓展視野的角度去說,從每種主流範式中找到一兩門典型的語 言去學習就可以了。比如命令式的,我們可以選擇C;函數式我們選擇Haskell;邏輯式的選擇Prolog;物件導向的選擇Java等。
即便是從每個範型中挑出一門,你要付出的精力依舊不少,我們還要考慮其實用性:要以使用為目的。如果能將其用在工作中,天天與你相伴,被他人接受,自然最 好;退而求其次,你能找到一兩個開源項目,並參與其中也是可以的,至少可以讓你保持手熱;如果這兩點都無法做到,僅僅是憑藉個人的熱情與堅持,那是不會持 久的,若干時間後,你就會對其生疏,可能連基本的"Hello World"文法都記不得了。不過這個年頭,思想也不能不要。在有剩餘精力的前提下,挑選些牛人們極力“鼓吹”的語言,吸收一下其思想精華,說不定哪天就 能用得上,讓自己和大家都感覺你很NB,抬高一下自己的身價^_^。記住:程式設計語言也是要拼爹的,系出名門的語言(諸如Go、Dart等)自然得到更多的青睞、使用和推廣,出位的幾率也就高出許多,尤其是在目前新程式設計語言百花齊放的階段。因此在選擇有思想的新語言時,最好在這些名門之後中做優選。
這個時代喜歡“專家”,因此我們在一兩門語言上務必要做到“精專”,這是會給你帶來黃油和麵包的語言。要專到什麼程度呢?我有一個同事,什麼問題都用C解決。他甚至為此寫了個不小的基礎架構,所有業務問題的Code放在架構中被回調即可,即便是這個問題用Python實現只需幾行代碼。
電腦科學的研究核心是什嗎?我想肯定不是程式設計語言,就好比社會科學研究的核心不是人類語言一樣。我比較欣賞這樣的觀點:作為程式員而言,最重要的是去創造,而不是研究。我們應更多的利用已經掌握的語言解決現實中的問題。做 程式設計語言研究的人可能要瞭解各種語言的特點與實現方式,但對於大多數的程式員來說,其實我們只需要關注問題域:做底層平台開發的,關注機器模型、通訊原理 以及OS原理和實現細節;做演算法的,很榮幸,那才是正統的程式設計的核心;前端攻城師則更多關注使用者的體驗。而在這些解決實際問題的過程中,我們更多採用 的是“制式”的程式設計語言。即做平台開發的,一般用C,C++等系統程式設計語言,更多的考慮的是效能;做前端開發的,PHP/JavaScript不可或缺。 我們要考慮的是如何利用這些制式的程式設計語言去解決問題,而在這些制式語言上,我們要做到精通。
從新興語言中借鑒新思想,然後在舊語言中實現新語言的特性,其實更多是在舊語言中實現了某 種文法糖,你愛吃,不代表其他人也理解也愛吃,還容易被人誤認為是“炫技”。如果你是技術負責人,且經過評估,新語言十分適合這個問題域,那莫不入直接引 入這門語言,讓大家都能使用到這門語言的新思想、新特性。
辯證的說,任何一種程式設計語言都有其利與弊,比如Haskell,純函數式語言,變數不能改變,無狀態,對平行處理具有天然的適應性,但在處理基本IO時卻要編寫難於理解的monad;而在命令式語言中,這種IO處理簡直簡單的不得了。
關於函數式語言,個人感覺未來若干年內仍難以大行其道,建議還是跟上命令式語言的演化主線吧。
跨越問題域學習語言,通常收穫不大。一個做平台服務端,用慣了C的資深程式員,讓他去學PHP寫前端代碼,估計是無法迸發出任何火花的。
以上是自己這些年關於程式設計語言學習的一些體會,比較零散,但希望能有協助。
2013, bigwhite. 著作權.