來自CU的文章,我覺得很有價值,大家都可以看看的:)
原文:http://bbs.chinaunix.net/viewthread.php?tid=880434&extra=page%3D21
不管是在現實中還是網上,總遇到一些人再問一些奇怪的問題。很多問題讓大牛
們哭笑不得,總是推薦這些人看一些經典的書籍。結果過了一段時間,其他人的
知識已經滄海桑田,不少人成了大牛,大牛們已經成了大大牛。這些人還在重復
著類似的問題。本人不是大牛,但是覺得大牛們在技術上幫助別人的同時還應該
更多的傳播思維方法。如果大牛們沒有時間,那么小弟只好拋磚引玉,談一些不
成熟的見解,同時希望大牛們多提意見,我再把你們的經驗總結起來一齊奉獻給
大家。
1)分層思考
在我的同學中有一個人算是經典案例,他學習起來很用功,但似乎不管長時間也
沒有氣色。并且常問一些讓人哭笑不得的問題。我花可長時間也無法讓他明白學
校開的課程到底和實際的開發有什么聯系。有一天我突然發現,我用如何處理以
太網偵來舉例子來說明如何是用C語言的struct的使用他居然就輕易的弄懂了。之
后我總結出來的結論是:他在學習的時候總是嘗試一次弄清楚涉及的每一個細節,
結果就陷入了無窮個疑問中,每次都把自己弄的暈頭轉向。
這里引出了一個對于學習者最終要也是最基本的思考方法:分層。可以說99%論
壇上的哭笑不得的問題是因為沒有分層思考造成的。遇到這樣的人只能先教他們
學會如何的進行分層思考,再向他們推薦學習資料。
練習分層思考其實非常簡單,你考慮拓撲時,就不要考慮數據流程,考慮數據流
程時就不要考慮存儲,考慮網絡間的協議時,就不要考慮一臺機器上的數據是如
何處理的。只要忽略具體的細節,每次只弄懂和問題相關的最小的部分。等你全
部弄懂之后,再考慮層次之間的聯系。經常假設“它就是那個樣子”,跳過一些問
題也是好的方法,當你發現跳過一些問題會加速自己的理解時,這些跳過的問題
往往就是處于不同層次下的,甚至當你發現一些問題是屬于其他層次的時候,問
題本身不復存在了。
分層思考在讀書的時候是很容易掌握的,因為大牛們的書本來就會用科學的方法
向你表述他的思想。難在讀代碼,或者在hacking幾乎沒有教材的技術的時候,需
要靈活掌握。
2)從整體到局部,從局部到整體
當學會了分層思考后,掌握2)就變得十分簡單了。在每個層次上,很多的問題是
相互獨立的,將他們歸納出來,如果有必要了解,逐個擊破。很多人會抱怨某某
東西很難,其實加上分層再劃分之后,逐個解決起來就容易多了。分層是為了獲
得綜覽,劃分局部是實際解決問題的必要的步驟。
整體到局部的另一個好處是,實際上你獲得了某個技術的最小單位。這些最小單
位通常也會被其他的技術所采納。舉個例子,你了解LDAP時熟悉的FQDN、OID、
realm、BNF等等,在了解電子郵件,HTTP,Keberos的時候也會有用。事實上劃分
是再自然不過的方法,只是對于初學者,也許需要特別強調一下。
此外,有些局部的技術可能是不需要了解的,比如說UPnP,可能你只有在解決實
際環境的問題的時候才需要考慮,雖然它哪里都可以見到,但是你絕大部分情況
可以忽略它,無論是在考慮拓撲時,還是在分析代碼時。
3)創造和發現問題
創造和發現問題并不一定在你完全掌握了某個技術之后。而是在1)、2)的前提
下,能夠在學習的過程中提出建設性的問題。這些問題絕大多數會在學習的過程
中自然的獲得答案,少數會在論壇的討論中得到結論。如果還有剩下的,那么可
能你發現了技術本身存在的缺陷,恭喜你。
事實上創造和發現問題的人很少出現“迷惘”,或者找不到“實踐的途徑和方法”的
情況。如果出現了這種情況,很可能1)、2)的條件都沒有具備。如果1)、2)
都具備了的話,才有下面的方法訓練:
多問“如果”。典型的就是在1)時,先問自己,如果是自己會怎樣設計?把這個問
題從開始保留到結束。
多問“為什么”。配合“如果”,多問別人為什么這么設計,并且把讓這個問題貫穿
到整個的學習過程。
多問“哪些”,哪些東西是可以替換的?通常配合2),這樣可以發現實現同一目
的不同方法,很容易發現當前協議的不足之處以及更好的解決辦法。
總結
事實上通篇的內容可以歸納為:不斷的問下面5個問題:What(1)、Which(2、
3)、What if(3)和Why(3)。僅僅是自己的一點不成熟的經驗,而且也寫的比
較匆忙,漏洞很多。希望大家指正,也希望真正牛人們多多介紹自己的經驗,我
會抽出時間來幫助你們整理,然后奉獻給大家。