學習的三部曲:WHAT、HOW、WHY
下面是我今天寫的一個Blog,轉貼給大夥兒,希望論壇裡的牛人多提批評意見。
最近幾天有些網友在郵件裡面問我關於學習的問題。有很多人覺得工作了幾年,也學會了不少的類庫、框架、甚至語言,但是感覺自己的能力沒有太大的提高。因此今天來說一下我個人對這方面的體會。 我把學習歸類為三個步驟:What、How、Why。經過我對周圍同事和朋友的觀察,大部分感覺自己技術沒有提高的人,都僅僅停留在What階段。下面我把這三個步驟解釋一下。
★第一步:*WHAT* 所謂的"*WHAT*",就是搞清楚某個東東是什麼?有什麼用?有什麼語法?有什麼功能特性?...... 對於學習語言(比如C++、Java),大部分人都能夠掌握基本的語法和標準庫,然後用它寫一些小程式(諸如二分查詢、氣泡排序、簡單檔案操作等)。 對於學習類庫(比如JDBC類庫),大部分Java程式設計師都能明白JDBC主要包含哪些類,也能夠用JDBC進行簡單的資料庫查詢和增刪改操作。 由於這個步驟是最基本的,假如你連這都做不到(可能你的理解力不夠好),也別在IT界混了。 但是光會What是不夠的。僅僅停留在這個步驟,導致了很多程式設計師*只知其然,不知其所以然*。這就是目前大部分開發人員的現狀。
★第二步:*HOW* 所謂的"*HOW*",就是搞清楚某個東西是如何運作的?實現機制如何?等一系列相關問題。 舉例如下: 假如你在學習C++語言,你是否搞明白函式傳引數的實現機制?虛擬函式是如何實現?丟擲異常時的棧回退是怎麼回事?...... 假如你在學習Java語言,你是否搞清楚GC如何實現?反射是如何實現?...... 假如你在學習JDBC庫,你是否清楚JDBC Driver的4種類型?不同遊標型別的實現機制?事務的機制?...... 在這個階段,你必須多想想類似這些問題。然後通過各種途徑(參見"關於自學能力<http://program-think.blogspot.com/2009/01/2.html
★第三步:*WHY* 一般來說,只有你把HOW的問題想清楚,才開始考慮步驟WHY。 所謂的"*WHY*",就是搞清楚某個東西為什麼設計成這樣?為什麼不是另外的樣子?這樣的設計有什麼講究? 說實在的,善於問"*為什麼* "有一定的天賦成分?好像某個科學大牛曾經說過"提出問題有時候比解決問題更難"。一般來說,只有當你深刻理解了某個東西,才能夠針對這個東東的設計問出一些問題。所以,我前面強調過,要先把HOW的問題搞清楚,再來考慮WHY的問題。 舉例如下: 對於C++語言:為什麼C++沒有類似Java的finally關鍵字?為什麼C++當初沒有考慮GC?...... 對於Java語言:為什麼Java沒有類似C++的類解構函式?為什麼Java要同時提供String和StringBuffer兩個似乎冗餘的類?...... 如果你能夠自己問出諸如上述的"為什麼"問題,並且能夠通過各種途徑找到解答,那你基本上已經吃透這個技術了,並且你已經*有可能* 自己去設計一個類似的玩意兒了。到這時,你已經踏上了通向技術高手的康莊大道。
由於本部落格偏重IT方面,所以今天舉的這些例子多半都是IT相關的,但是這個三部曲在IT以外的行業/領域其實也能適用,就看讀者自己的領悟了。