第一種工程師
- 給一段複雜的程式,比如有7個區域性變數,5層迴圈和if巢狀,他能赤手空拳上陣,迅速領會程式意圖、找到bug,不用藉助任何工具甚至紙筆。
- 給一個複雜的問題,能在一個函式之內一氣呵成,立馬給出正確實現,這個函式可能有七個變數,5層迴圈和if巢狀。沒有廢話,刪無可刪,但是單一函式複雜度高,一般人要費老鼻子勁方能看懂。
第二種工程師
- 給一段複雜的程式,比如有7個區域性變數,5層迴圈和if巢狀,他無法馬上看出程式的意圖,但是他通常會藉助紙筆寫寫畫畫,最終搞定。
- 給一個複雜的問題,要磨嘰磨嘰好半天,一般用幾個函式組合起來實現,這些函式職責單一明確,身段苗條,通常一兩個變數,迴圈和if不超過2層巢狀。單一函式複雜度低,一般人都能輕輕鬆鬆看懂。
第一種軟體工程師是天生的聰明人,他們處理複雜事物的能力與生俱來,可以流利的心算三位數加三位數帶進位的加法。根據認知負載理論,這類人的working memory容量超越常人,他們可以將多種因素同時納入大腦進行思考而不會出現大腦過載。他們寫出來的複雜程式,一般的看法是沒有掌握分而治之的正確程式設計風格,其實際是他們腦筋太好使,普通人為了克服認知過載而發明的程式設計方法對他們而言純粹就是多此一舉。當遇到更為複雜的問題時,他們自然會分而治之。缺點是不經刻意訓練,他們按照自己的認知能力寫出來的程式普通人維護起來有困難。
第二種工程師是天資正常的普通人,working memeory的容量大概就是可以心算兩位數加兩位數帶進位的加法。但是他們掌握瞭解決認知負載的方法。閱讀複雜程式碼的時候,他們藉助紙筆,把對其中的小片段的分析結論先寫下來,避免大腦快取太多東西,然後就這些數量變少的中間結果再進行分析,始終保持放入大腦的東西不要太多。寫程式碼的時候,他們無法一下子把所有的細節想清楚,因此需要分步搞定,要麼先把關鍵步驟逐次實現好再去整合整個方案,要麼先寫好一個大而化之的框架,然後分頭實現細節。寫完之後往往還會發現有一點顧此失彼,因此還要調整清理一番。特點是不管那種方法,大腦在任何一個階段都不會過載。按照這種方法寫出來的程式碼,也不會讓它的讀者大腦過載。
對於團隊來說,我們希望工程師具有第一種工程師的天份,同時寫出來的程式碼要像第二種工程師那樣方便理解。尤其需要關注的是第三種工程師,他們缺乏第一種工程師的天資,同時還沒有掌握第二種工程師的技能,經常自己被自己寫出來的程式碼搞糊塗。