很多程序員在學習一門新的編程語言時往往會走兩種路子:
- 1.粗粗看看語法,就擼起袖子開干,邊查Google邊學習
- 2.花很多時間完整地把整個語言學習一遍,做到胸有成竹,然后再開始做實際工作
第一種學得太少,第二種學得太多,都不合適,其實學習一個編程語言達到能夠入流的程度並不需要太高深的東西,平時需要用到的大都是基礎知識,集中一周業余時間學習一下完全能達到掌握的目的。
其實寫程序不怕完全不會,最怕一知半解的去攢解決方案。因為你完全不會,就自然會去認真查書學習,如果學習能力好的話,寫出來的代碼質量不會差。而一知半解,自己動手土法煉鋼,那搞出來的基本上都是廢銅爛鐵。
因此,即使時間再緊張,使用新編程語言進行開發之前,下面的這些內容也是必須首先完整了解一遍的。掌握這些內容之后進入實際開發,即使有問題,也基本不會傷及項目大體。而開發者本人則可以安步當車,慢慢在實踐中提高自己。
1. 了解該語言的
- 基本數據類型
- 基本語法和流程控制,判斷/分支/循環等
- 主要數學運算符
- print函數的使用
達到能夠編寫數學習題的程度.
2. 掌握
- 數組和其他集合類的使用
- 有基礎的話可以理解一下泛型,如果理解不了也問題不大,后面可以補;
3. 簡單字符串處理
- 所謂簡單,就是Regex和Parser以下的內容,什么查找替換,截斷去字串之類的。不過這個階段有一個難點,就是字符編碼問題。如果理解不了,可以先跳過,否則的話最好在這時候把這個問題搞定,免留后患;
4. 基本面向對象或者函數式編程的特征
無非是什么
- 繼承、
- 多態、
- Lambda函數之類的,
如果有經驗的話很快就明白了;
5. 異常、錯誤處理、斷言、日志和調試支持,對單元測試的支持
你不一定要用TDD,但是在這個時候應該掌握在這個語言里做TDD的基本技能;
6. 程序代碼和可執行代碼的
- 組織機制
- 運行時模塊加載
- 符號查找機制
這是初學時的一個難點,因為大部分書都不太注意介紹這個極為重要的內容;
7. 基本輸入輸出和文件處理,輸入輸出流類的組織
這通常是比較繁瑣的一部分,可以提綱挈領學一下,搞清楚概念,用到的時候查就是了。到這個階段可以寫大部分控制台應用了;
8. 該語言如何進行callback方法調用,如何支持事件驅動編程模型。
在現代編程環境下,這個問題是涉及開發思想的一個核心問題,幾乎每種語言在這里都會用足功夫,
- .NET的delegate,
- Java的anonymous inner class,
- Java7的closure,
C++ OX的 tr1::function/bind,
五花八門。如果能徹底理解這個問題,不但程序就不至於寫得太走樣,而且對該語言的設計思路也能有比較好的認識;
9. 序列化和反序列化
掌握一下缺省的機制就可以了;
10. 動態編程,反射和元數據編程,數據和程序之間的相互轉化機制,運行時編譯和執行的機制,
有抱負的開發者在這塊可以多下些功夫,能夠使你對語言的認識高出一個層面;
11. 如果有必要
可了解一下線程、並發和異步調用機制,主要是為了讀懂別人的代碼,如果自己要寫這類代碼,必須專門花時間嚴肅認真系統地學習,嚴禁半桶水上陣;
12. 如果有必要
可在這時研究regex和XML處理問題,如無必要可跳過;
13. 如果有必要
可研究一下該語言對於泛型的支持,不必花太多時間,只要能使用現成的泛型集合和泛型函數就可以了,可在以后閑暇時抽時間系統學習。
需要注意的是,泛型技術跟多線程技術一樣,用不好就成為萬惡之源,必須系統學習,謹慎使用,否則不如不學不用;
14. 如果還有時間
最好咨詢一下有經驗的人,看看這個語言較常用的特色features是什么,如果之前沒學過,應當補一下。比如
- Ruby的block interator,
- Java的dynamic proxy,
- C# 3的LINQ和extension method。
沒時間的話,我認為也可以邊做邊學,沒有大問題。
15. 在工作的閑暇時間,可以着重考察兩個問題,
- 第一,這個語言有哪些慣用法和模式,
- 第二,這個語言的編譯/解釋執行機制。
至此語言的基本部分就可以說掌握了,之后是做數據庫、網絡還是做圖形,可以根據具體需求去搞,找相應的成熟框架或庫,邊做邊學,加深理解。
掌握了以上的內容,就給練武術打好了基本功,雖然不見得有多優秀,但是肯定是根正苗紅,將來不必繞大彎子。就算是臨時使用的語言,把上面這個提綱精簡一下,只看重體字的部分,大致能在幾天到一周內搞定,不算是太耗時,而且寫出來的代碼不會太不靠譜。
以上提綱未設及內存模型。對於C/C++,這個問題很重要,要放在顯著位置來考慮,但對於其他語言,這個問題被透明化了,除非你要做hardcore項目,否則不必太關注。