簡歷和自我介紹上經常能夠讀到“精通Java”這樣的話,有人和我說,精通Java的人太多了,精通Java已經不能算亮點、不能給自己加分了。可是事實真是這樣嗎?
對于語言的學習,我有一種觀點,一是縱向,即要選擇一門自己認為合適的語言學到有相當的深度。二在于橫向,即要學習不同類型、不同歷史和不同門派的語言:
既有底層的語言,也有高級語言;
接觸一些動態語言、函數式語言;
了解一些不同語言的編程范型和編程方式,比如基于原型編程、面向切面編程、命令式編程等等;
最好能關注一門年紀尚淺,甚至小眾的語言,了解一門語言的發展。
橫向類比能夠帶來對一門語言的不同認識,但是,有廣度而沒有深度的專家是可笑的,深入地學習一門語言是不可缺少的。就以Java為例,依我看來,至少有這樣幾個遞進的過程:
語法語義。
這是最基礎的部分,都說Java簡單,語法容易學習,但是,真要細說起一些細節來,也真夠我啰嗦了。我見過一些所謂的“精通Java”的人,他們卻不知道strictfp關鍵字,說不清volatile和transient的作用,不知道怎么去定義一個注解(@interface)。你覺得這些要求苛刻嗎?對這些以“精通”要求自己的人。
熟悉語言的應用范圍。
不同的語言有不同的擅長應用領域。就像想用Java去寫操作系統或底層代碼是多么不靠譜一樣,在這個過程中應當熟悉語言的優勢劣勢,這里你自己會提出自己的見解。譬如Java最NB的地方在哪里?
跨平臺?可是很多語言都可以跨平臺;
開源?那開源的語言多了去了;
高性能的虛擬機?包括先進的編譯解釋優化技術;
還是那么多用Java實現的類庫、框架呢?
把那些用Java實現的類庫和框架脫離出Java語言本身來歸類,未必是恰當的。熟悉Java就必須閱讀許多類庫和框架的源碼。
學習語言的實現機制。
就像精通Java的程序員需要了解Java虛擬機一樣,也許不需要對虛擬機規范一清二楚,但是起碼要知道CAFE BABE吧?起碼要了解JIT的機制吧?起碼要明白垃圾回收策略中的CMS吧?起碼要能嘗試自己編譯一把JDK吧?起碼要能去定位那些無響應的Java程序問題吧?在這個過程中,從了解一門語言,將逐漸進化到去了解一門語言所處的平臺。
整理語言發展的歷史。
為什么學習編程語言也要關注它的歷史?因為去了解一門語言的發展歷史(比如這篇關于Java多線程編程的歷史),可以明白在這過程中碰了什么壁、犯過什么錯、有哪些大的變更,學過別人家什么東西……這對于分析現今這門語言與其他語言的碰撞、展望一門語言的未來大有益處。在這個過程中,會不由自主地將其和不同時期的其他語言比較。如果給你一次重新設計這門語言的機會,你一定能夠提出不少改善的意見來。
我從來不相信精通Java是一件容易實現的事情。有一股風潮,說搞底層研究的人看不起搞上層業務的人,寫C的人認為寫Java的人沒水平,做后臺的人覺得做前臺的沒技術含量……我說,何必呢?
技術無貴賤,只是專注的領域不同而已。