張大胖剛入行的時候就聽牛人說:程序員每一年都應該學習一門新的編程語言。程序員
張大胖熱愛新技術,以爲這個建議不錯,多學一門語言,技多又不壓身, 因而除了本身用來吃飯的Java以外,還學了C#, Python, Ruby , JavaScript,Go 等等在當年最流行的語言。正則表達式
不過因爲時間的關係和環境的限制,張大胖並無機會在真實項目中去作實戰,語言的學習沒法深刻,不少語言都是學習了語法,流程控制語句等最基本的東西, 在Google的輔助下,能夠寫一點不考慮代碼質量小程序。編程
學得多了,張大胖開始沾沾自喜: 這麼多編程語言都差很少嘛,都是套路:小程序
數據類型,內置的數據結構,能夠定義函數,類, 有流程控制語句,文件操做,網絡操做, XML文件,正則表達式,線程......等等。網絡
沾沾自喜的同時也有點迷茫: 那我每一年學一門語言有什麼用?不少細節都忘記了!數據結構
有一天,辦公室的大神Bill和同事聊起來領域特定語言(DSL),張大胖說:「這個東西我好像見過啊」編程語言
Bill說:「你固然見過,你不是會Ruby嗎,Ruby有着強大的元編程,很是適合來構建DSL。」函數
元編程? 張大胖感受有點懵逼,Bill說的東西本身彷佛看過,可是並無在乎。學習
他把本身的疑惑給Bill說了一下, Bill說:「其實吧,大部分語言基本的東西就是你總結的那些,可是你去學習新語言的時候,不能只學習共性的東西, 得把重點放到這個語言獨特的東西,這樣每一年學習一門新語言,才能真的有收穫啊。」線程
「獨特的東西?」
「好比剛纔說的DSL,就充分地利用了Ruby 元編程的強大功能,還有Ruby的mix-in, Ruby on Rails的編程哲學(約定重於配置, Don't repeat yourself), 這些纔是讓Ruby及其系統不同凡響的特性和精華,值得你花大精力去學習、體會。 」
「再好比說Go語言,goroutine 和 channel 絕對是你值得深刻研究的、獨特的東西。」
張大胖想了想,確實是這樣,在沒有項目歷練的狀況下,每一年一門語言,很難把這門語言學精通,用熟練,本身學了太多共性的知識, 看起來不少,可是本身的知識積累卻不夠高。
「那我也不知道一個語言獨特的東西是什麼啊?」 張大胖追問。
「不用擔憂,一方面要善用Google,另外一方面要養成‘比較’的好習慣,你如今對Java很熟悉了,當你去學Python的時候,能夠Java作個比較,看看對一樣的問題, Python是怎麼解決的,發掘Python獨特的地方,對語言的認識就會深刻一層,好比你發現Python的變量是沒有類型的,像個指針,能夠指向任何類型的對象, 這和Java就不一樣,反映了靜態語言和動態語言的區別。 」
「再好比JavaScript,利用原型法也能實現對象,繼承等概念,這和Java基於類的方式截然不同,能夠說是另一個編程泛型,值得深刻研究。 」
「總之,在不斷地比較的過程當中, 你就能找到這個語言的獨特之處。」 Bill作了最終的總結陳述。
張大胖感到受益頗多,也更有信心了:「好! 我這就試試去。」