知識體係
專家與雜家
專家與雜家之爭由來已久。
挺專家者說:隻有專一,才能學透學精;那些泛泛之輩,隻能學到些皮毛,終究不能有所成就。
挺雜家者說:隻有廣泛,才能目光開闊;某些人天天鑽牛角尖,最後學成榆木疙瘩。
招聘的時候也是。
有人號稱精通七八種語言,參與過76個項目(在一個真實簡曆中看到的,不過不是來我們這應聘的;按當時的速度估計,他現在應該寫參與150~200多個項目左右了),相信大家一定看了直搖頭。
但如果又有人十年如一日,隻是在一個文檔轉換器上鑽研,恐怕也夠嗆能有什麼成就。這是當年被稱為“在微軟工作十年的笨蛋”的故事,說有一個人在MS工作了10年,除了Office所有文檔之間的類型轉換之外,什麼也不會。
那麼,到底哪個好呢?其實哪個都不好,或者說很多人把雜與專當作互斥的知識體係了。
如何成為一個好程序員
在10年多以前,我的師傅,一個非常厲害的程序員,有一天和我們討論問題的時候(可能是在討論最近的一些招聘心得)突然說:“我發現,厲害的程序員都喜歡說話。”
我腦海中迅速過了一下部門的20個程序員,果然不差。但是,背後的原理是什麼呢?
溝通,學習。
如果一個程序員要經常和新手溝通,他就得嚐試把代碼寫得很幹淨明了,新手能看懂。
如果一個程序員要經常和高手溝通,他又要把代碼寫得很精妙,不能一看就拖遝冗長,讓高手看不下去。
最開始隻是技術溝通,但最終會出現業務上的溝通,進而是知識上的溝通,所知道的範圍就越來越廣,逐漸變成雜家。
“變成雜家會不會水平下降?”
如果擔心這個,那就自己分析一個問題:我們團隊假設有10個人,10件事情,如果大家有隻有1個月度過初期的壁壘,那麼誰最適合哪項工作?
分析的結果,往往不是一個蘿卜一個坑,而是某人或某兩三個人壟斷了所有最佳選擇。也就是,總有那麼幾個人,幹什麼都最拿手;還總有幾個人,幹什麼都不太行(而不是隻能幹一件事情!)
這時候,這些高手們就變成了“既是雜家,又是專家”,怪哉。
原因就是程序員總會用自己學到的最高水平,解決所有事情;而見到的事情越多,可以學到,乃至隻是偶然獲得更佳靈感的機會也越多。
所以,程序員不能偏安一隅,要多去從事不同的事情,理解不同環境中處理事情的方法;並把它們中的精華,互相借鑒。
典型的必須跨越的鴻溝,包括這樣幾個:
1.前端與後端
很多人居然隻從事其中一個,而對另外一個置之不理。
由於這兩個內容交互非常多,隻有了解對方的工作方式,才能做好自己的工作。
本人在這一點上感受頗深,在火星人的開發過程中,我其實自己一個人前後都跑,從設計CSS風格到數據庫的應用緩存,有什麼幹什麼。
這些內容常常相互依存,功能並不會很幹淨地在前後台拆開,經常其中一個做好了,另外一個就省事多了。尤其是我們采用了MVC的框架的情況下,後端產生的Helper越多,前端工作越輕鬆。
2.開發與測試
一個人很難直接從事這兩個職業,但是可以做這樣幾個事情:多關注出現的缺陷,目的是在開發過程就提前避免;多為測試人員編寫自動測試代碼,目的是學習產品的整體功能;多看測試人員的測試用例,目的是學習用戶的業務邏輯……
如何防止失去專業性
人很容易失去專業性。
英國有一位物理學家,曾經在25個諾貝爾獎項上做過研究,但每個都淺嚐則止,被當作反麵典型。
那麼,編程過程,怎麼防止這種現象呢?跟牛頓學習就知道了。
牛頓發明/發現過很多東西,物理三定律(總結前人),光譜,反射望遠鏡,微積分,萬有引力……他怎麼沒沒落成雜家呢?
因為他所研究的東西,都是互相支撐的。
光譜發現後,牛頓預言折射望遠鏡一定有色差(不同光線的焦點距離不同),所以他研究發明了反射望遠鏡;由於他喜愛天文,所以開始關注多普勒三定律,並從中推出了類似天體這樣的兩個質點,之間引力是2GMm/r^2這樣的關係(這個不是他第一個推出來的),還首次給出了反向公式的證明;不過這還不能算是“萬有”,因為蘋果距離地麵太近,地球不是一個質點,至少不應該這樣計算蘋果受到的引力;這個問題直到20年後他發明微積分,才得以解決:按照球體的積分公式,整個地球吸引力等同於地心的質點……