部落格:blog.focus-linux.net linuxfocus.blog.chinaunix.net
本文的copyleft歸[email protected]所有,使用GPL釋出,可以自由拷貝,轉載。但轉載請保持文檔的完整性,注明原作者及原連結,嚴禁用于任何商業用途。
======================================================================================================
這段時間一直在想着,身為一名程式員究竟怎樣去提高自己,其中的一條問題:身為程式員,究竟要學會多少種程式設計語言?我在以我自己為例吧,将将自己的思想變化。在剛剛學習程式設計的時候,覺得程式設計語言會得越多越牛B,于是自己也各種語言都想去學習,嘗試一下。再往後,又覺得貪多嚼不爛,不如專精一門語言。尤其是C語言,身為底層語言,不僅應用廣泛,而且由于與作業系統聯系緊密,是以認為C才是王道。沒有C語言做不到的事情。隻要給我足夠的時間和資料,任何的需求,都可以實作。慢慢的,随着時間的推移,經驗的增加,我漸漸又回到了第一階段的認識——也許,這就是所謂的螺旋式的上升吧。
我再次感覺,想要成為一名優秀的程式員,還是精通多種語言更牛B。重要的是精通二字,達到這一程度,相當有難度。那麼天賦不高的我,就定為熟悉多種語言吧——目前,以我而言,隻有C語言能達到熟悉二字。熟悉的境界,最好是達到信手拈來的地步。對于解決某一問題,可以自然的應用最适合的語言。這一方面提高了開發效率,另一方面,當熟悉多種語言以後,思考問題,解決問題,不是從某一種語言的角度去思考,而是直接面對問題本身。那時,語言,才真正的隻是一種工具。這也是各高手經常挂在嘴邊的一句話”語言隻是工具,重要的是思想“。
舉個簡單的例子,對于C程式員來說,當解決問題時,更常見的思考方式是:完成這個問題,我要先怎樣,然後怎樣,一步步的流程想清楚後,這個問題解決了,代碼的流程也清晰了。——是以C語言被稱為面向過程的語言。而C++程式員呢,當解決問題時,會把問題涉及的東西盡量看作為對象,然後思考的是這些對象之間如何互相作用。當對象及其行為定義清楚後,再将這些對象組裝起來,問題也就基本解決了。前段時間,我簡單的學習了一下面向函數的語言Haskell。由于沒有實際做過什麼東西,隻能簡單的談一下我的了解。對于Haskell來說,基本上它将所有的object,都看作函數。是以對于Haskell來說,沒有真正的變量,有的隻是函數。并且,絕大部分的函數都要滿足這樣一個規則,同樣的輸入,要保證輸出也是一緻的。這樣做還是有不少好處的。在編寫代碼時,我們無需關系side effect即任何副作用,也友善測試代碼。每個函數的功能或許很簡單,但是各個函數可以很容易的組合在一起,就像unix下面的小工具,每個功能都很簡單,但是組合起來就形成強大的功能。
那麼如何迅速上手一門新的語言呢?就我看來,首先就要了解該語言的思想,像上面所舉的三個例子,直白點說,就是如何從這門程式設計語言的角度,去看問題思考問題,去看世界。因為語言的一些基本元素還是比較相似的,無非是變量,循環,條件判讀,函數等。但是如何應用這些基本元素,去編寫正統的該語句,卻需要好好的領會其本質思想。不然也是,用C++的文法寫出來的C語言。而當學會了該程式設計語言的思想以後,這時在編寫程式的時候,完全可以抛棄這門語言,用另外一種語言同樣可以實作該思想。比如C語言同樣可以按照面向對象的方式去程式設計。——隻不過有時由于語義的局限性,不像C++那樣的自然。這其實就是多學習程式設計語言的一種好處,學會一門新的語言,實際上可以領會另一種程式設計思想,可以換另外一個角度看問題。
當掌握了基本的文法元素,和領會該程式設計語言的思想以後,基本上已經可以寫出像模像樣的程式了。但是要想寫好,仍然需要更多的努力,需要關注該語言的細節。這時的細節,倒不必非得去讀該語言的标準。我認為重要的是去了解該語言的文法背後的細節,在寫程式的時候,多問幾個為什麼,多想想該語言是如何實作的,為什麼要這樣做。比如C++中,為什麼要有虛拟函數,為什麼要有純虛函數,為什麼組合要好過繼承,等等;以及其背後是如何實作的,像虛拟函數如何實作?構造函數和析構函數又是如何實作,為什麼沒有傳回值等等。當追究這些問題的答案時,盡量不要僅僅去搜尋資料,要知道事情的來龍去脈,要自己動手去做試驗。對了,還有一個重要的事情,就是去想編譯器和連結器是如何支援該語言特性的。當這些問題對你不算問題的時候,我相信你已經是一名該語言的合格的程式員了。
學會一門新的語言,一定要多看,多寫,更重要的是多想!
最後以一句話與大家共勉,”路漫漫其修遠兮,吾将上下而求索“。