上個學期看了本《程序員的思維修煉》,相信很多人都聽說過這本書,看完之后的感覺是有點豁然開朗的感覺,就像以前看的《黑客與畫家》,《暗時間》一樣,都對自己的生活,學習和工作有了新的認識,尤其是《程序員思維修煉》里面講到的敏捷開發這部分,更是激起我對敏捷軟件開發的興趣,雖然現在真的是不咋樣,但是已經在慢慢實踐里面的道理。好了,無論對這本書講再多好話都沒用,因為好書自會有人去看的,我這里主要是想要將里面的有關於技能學習的5個階段,即德雷福斯模型的東西寫出來(雖然我百度過這個詞,但是可惜並沒有找到超過這本書的更加詳細的描述,尤其是在中國網頁),因為最近突然覺得自己已經是邁入新的階段,就是從新手到高級新手的轉變了,好吧,我承認,后來在做有關於Linux下的Node.js時,我又沮喪的知道,自己其實還是新手。
階段1:新手
新手是每個開始學習任何技能的人一開始的階段,包括未入門的外行人,這一階段的人,經驗很少或者根本就沒有,而所謂的經驗,指的是,通過實踐這項技術促進了思維的改變。明白到這點是很重要的,因為很多人以為,經驗就是指資歷(單純時間而言),其實並不是這樣,就好像一個軟件開發人員號稱他有十年的經驗,其實每天都在重復做一件事,並沒有任何改進,而且自己本身對於自己的職業也沒有進一步的認識,這樣的經驗就算是100年,也就相當於別人的1年,別說什么煤油翁的故事。很抱歉,像軟件開發這領域,技術的更新是很快的,甚至在我寫這篇文章的時候,在外國某個實驗室里可能就已經有新的語言或者其他東西出來了,只是我們沒有用到而已(尤其是中國這邊,技術的更新與外面脫節很多)。當然,很多人對於“促進思維的改變”很好奇,什么是“促進思維的改變”?所謂思維的改變,就好像你從面向過程的編程向面向對象編程這方面轉變,那么,你的思維一定會發生轉變,因為你的思維相比以前,已經向更高的抽象這方面發展,要是進一步學習動態語言,就更是如此。思維的轉變一定會發生的,因為這是你在實踐中所體會到的,所領悟到的,甚至是別人從沒有發現過的新的用法。
說了那么多有關於經驗的介紹,那么,什么是新手呢?如何定義一個新手,其實很簡單,就是新手面對問題的態度。這是非常簡單的判斷方法,因為 經驗的差距,使得新手在面對問題,尤其是突發問題的表現,明顯是與在新手上面更高的層次是有區別的。那么,新手在面對問題的時候,會怎么做呢?就是舉手無措!新手害怕面對問題,因為他們不認為自己能夠解決問題,認為自己的能力不足,所以不敢主動去解決問題,更多是向更高層次的人求助(好吧,我之前就是這樣,在一個陌生的領域遇到一個問題,結果自己就慌了,因為自己根本就不知道怎么辦,就算找到問題的症結所在,但還是不知道要怎么辦)。不僅是這樣,新手更喜歡指令性的命令,什么是指令性的命令呢?想想當我們開始煮菜的時候,跟着菜譜學做菜的時候,我們是不是嚴格按照菜譜上一條一條執行的呢?像是該加多少面粉啊,該在什么時候加多少水啊,或者該用多少溫度加溫多久啊。。。但是一旦最后煮出來的菜並不是菜譜上的那個樣子和味道,我們就會慌了,怎么回事,我明明跟着菜譜上的指令嚴格來做的啊?如果是新手以上的級別,是可以找出問題的,甚至在一開始就已經發現問題,像是專家,就已經在一開始不知不覺中將問題解決了(是的,不知不覺,因為他們很少會犯低級錯誤,甚至已經是他們潛意識中就在避免的)。但是新手不行啊,他們需要明確的解決問題的指令,像是看看煤氣有沒有開這個腦殘的提示他們也會去做的,因為這時他們已經失去了思考,完全交給了所謂的權威。
新手還非常在乎成功,他們非常渴求能夠馬上將當前的目標完成。這個症結之所以存在,也是因為他們缺乏經驗,因為 他們害怕面對問題,而快速成功意味着不用遇到太多甚至是沒有問題。他們從沒有想過這個方法到底對還是錯,只是想要知道這個方法能否成功而已,而我們知道,在軟件開發這方面,方法能夠奏效並不代表這個方法就是適合的。
所以,新手就是無法根據當前發生問題的根點思考出問題的症結所在,並進而想出解決問題的方法出來。他們之所以會表現出這樣的行為,就是因為他們的經驗太少或者無法根據當前的情境將問題轉化為自己以前解決過的問題類型,因為他們缺乏抽象的能力,將問題抽象成一個模型,然后,在遇到類似的問題時能夠馬上反應過來。這個能力實在是太過了,因為真的很難,但是新手以上的級別就能做到,因為他們已經通過自己大量實踐將這個能力掌握了,在每次解決問題的時候都會將這個問題的症結和解決方法記錄進自己的“數據庫”里,然后根據情境進行匹配。所以,要想擺脫新手這個級別,關鍵還是多實踐,多思考,多總結,這樣就能通過積累而發生質的變化。
階段2 高級新手
高級新手就是比新手更上的一個層次,這個層次已經具有一定的經驗,並且自我解決問題的能力已經得到大幅提升,具有初步的情境匹配的能力,但是,高級新手之所以還有“新手”這兩個字,就是因為他們對於情境的處理能力還是不足的。高級新手已經能夠單獨解決任務了,他們已經不需要像新手那樣戰戰兢兢,在遇到問題的時候,能夠根據自己過去的經驗尋找解決問題的方法,這時的他們就會表現出一個很明顯區別於新手的特點:他們不像新手那樣,會將文檔從頭看到尾,他們是會選擇快速的查找相關的方法,因為他們知道,解決這個問題只需要這個方法就行,但是從來不會去追根刨底,為什么是這個方法。但是,解決問題的基礎依然是當前的問題與自己過去解決過的實在太相似了,如果是表面毫不相關的問題,他們依然還會陷入迷茫中,這是因為他們提取情境的能力仍舊存在問題,因此只能記住具體的問題類型而沒有發現到問題之間的相同點,進而用相同的方法解決。而且,他們還看不到情境的延伸,一個情境是會延伸的,如果它與實際的問題連在一塊,那么你就會發現,一個情境的背后是無數小情境,解決大的情境是很難的,但是解決一個小情境還是很簡單的,這就是一般解決大情境的方法,但是高級新手是不會看到的,就像我們經常遇到的,我們無法將一個龐大的問題肢解,我們需要更高層次的人來為我們肢解,然后告訴我們先解決哪一個。
階段3 勝任者
要達到勝任者,還是需要很大的努力,因為勝任者在團隊中擔當的任務非常大,甚至可以說是團隊的核心。勝任者的具體表現是什么呢?勝任者不僅能夠解決問題,還能發現新的問題,他們能夠從目前的問題的解決中發現新的問題並且將它切實的解決掉。這種能力是因為他們過去強大的經驗所致,他們知道,這樣的問題用這樣的方法,會有什么副作用,而我們又要怎樣來解決這個副作用。他們在遇到問題的時候能夠將問題層層肢解並且針對每個部分提出相應的解決計划,之所以說他們是團隊的核心,就是因為一個團隊的方案啊,計划啊,基本上都是由他們提出的(很多人會問,更上面的人呢?這是后面要講的,因為你要知道,一個團隊大部分情況下,是不需要勝任者以上的級別的)。這時的勝任者就是一個中轉點,因為他們能夠與更上面的人溝通,又能統帥下面的新手們,所以,這種人一般都是領導者級別的。但是,勝任者在情境上的處理並不是很成熟,他們只是因為處理過的經驗的積累以及嚴謹的思考使得他們能夠解決任何復雜的問題,但是還是不能關注一些情境的細節,甚至是選擇忽略,如果說忽略這個細節也能解決問題而且還不會發生什么不好的副作用,他們是會忽略的。
階段4 精通者
精通者的一個明顯的問題就是他們對於所處的技術領域具有全局思維,他們圍繞着自己的技術領域,積極尋找更大的概念框架,更喜歡從他人身上學習,就算只是聽別人講自己的失敗經驗,也能夠從中受益,因為他們已經能夠充分理解情境了。他們明白當前的情境是怎樣的,情境的細節他們也能把握,甚至在解決問題的時候就已經將這個細節包含進去。他們能夠運用計算機的所謂的格言經驗(所謂的格言經驗,就是我們在學習的時候經常會在一些大師的作品中看到的,一些類似於聊家常的經驗,如:“測試一切可能出錯的東西”,但是對於新手,他根本就不知道要測試什么),因為他們知道,這樣的格言適合什么情境,就是因為他們對情境的理解非常充分。他們也能充分運用任何當前技術的任何復雜的方式,比如說,新手的殺手,設計模式,一旦用不好就會出現問題,就算用了,也會存在有沒有必要的問題,但是精通者就能運用自如,因為他非常清楚自己的問題所處的情境到底是怎樣的。精通者還有一個更重要的特點,這個特點也是精通者能夠成為專家的關鍵,就是他們能夠通過有效的反饋和思考來不斷調整自己或者不斷進步。反饋和思考是非常重要的,這是掌握任何技能所必須的能力。
階段5 專家
專家就真的是各個行業的魔法師或者規則的制定者。他們永遠都在尋找更好的解決方法,就算是一個小問題,他們也在努力研究怎樣更加優美的解決。當然,這樣自然是不用說的,因為他們已經是這個行業的最高者,自然必須擁有這個能力。但是,判斷一個人是否是專家,還得靠他是怎樣解決問題的。專家解決問題更多是根據他們的直覺。他們會覺得,這里會存在問題,而且這樣做就能解決,但是你問他為什么會想到,他可能就想不到答案,因為這就好像是一看到這個問題就知道問題的答案一樣,就好像你一說出來的就是家鄉的方言一樣,如果問你,為什么會說方言,你能答得出來嗎。這就是一個完全內化的階段,他們將所有情境和解決這個情境的方法完全內化了,並不是看到情境就想到方法,而是情境本來就和方法連在一塊,就像我們解數學題一樣,問題本身就是答案。所以,成為專家的關鍵,就是鍛煉自己的直覺,將情境和解決情境的辦法連在一塊。這可是一個非常漫長的過程,當然,如果你真的非常有天賦,那就另當別論,所以,我們還是要老老實實從新手開始積累實踐經驗吧。
這個模型最主要的作用就是讓我們看清楚自己當前的位置,讓我們明白自己的不足,向着下一個更高級的階段努力進發。