關於工作和讀研的思考
所謂“有實際開發工作經驗”是指你目前已經具備下列能力:1)你已經認為C++和組合語言都是很簡單的語言,並能夠自如地運用;2)你能夠在30分鐘之內想到正確的五子棋AI演算法設計思路和方向;3)你完全理解STL為什麼這麼重要;4)你能夠獨立地解決所有的編譯與連結問題,哪怕你從來沒有遇到的問題,你也不需要詢問任何人;5)英文網站是你的首要資訊來源;6)能夠讀懂英語寫成的國際標準,比如NTFS磁碟格式標準;7)你經常站在集合論的角度思考演算法問題;8)能夠理解一個簡單的驅動程式,能夠理解一個簡單3D互動程式;9)你能夠認識到線性代數和概率論在實際程式設計工作中的極端重要性;10)你完全理解COM的設計思想,尤其能夠理解COM為什麼要設計成這樣;11)當我說到虛擬函式的重要作用時,你不會急著去找書來翻;12)你能夠說出C++為什麼比其他語言優秀的理由,記住這種理由應該來自於你的開發體會,而不是因為其他人都這麼說。此外還有很多判斷標準,但如果你同時具備5條以上,可以認為你已經具備相應的開發經驗了。在這種狀態下讀研,你將取得讀研效益的最大值。
讀研最重要的是要明白你自己要幹什麼,不能等導師來告訴你你應該幹什麼。研究生的優勢在於理論功底深厚,思維具有穿透力。當然程式設計能力首先要過關,不要讀完研究生還不知道MFC程式的WinMain函式在哪裡。所以,研究生期間,你一定要做有理論深度的演算法設計,比如大規模資料的搜尋演算法,效能是首要考慮因素,不要奢望SQL函式能夠幫你解決問題,所有的問題你都必須自己解決,你必須解決內外存交換的效能瓶頸。再比如極品飛車的3D場景生成,圖形變換,碰撞檢測,物性模擬,紋理對映,燈光模型等等,這些都是可以保證你能拿到2萬以上月薪的技術。如果你認為這些東西太難,不可能做得出來的話,那麼你就不適合讀研。真的,要是你認為讀研之後還是要去搞一般的程式設計,如資訊管理系統之類的軟體,那麼你讀研的價值就完全不會得到體現,因為這些工作根本就不需要讀研。 (##我花一個月就可以#)
軟體學院宣稱培養軟體開發人才,恕我直言,我從來沒有看見那個高手是培訓成功的。成為軟體開發高手的路只有一條:自學!軟體開發中需要大量的程式設計實踐和獨立思考,只有在此過程中,你才能夠逐步成長起來。軟體學院宣稱培養軟體專案經理,這更是搞笑,在某種意義上這是欺騙行為。學院裡面能夠培養出軟體開發經理更是十足的謊言,軟體專案經理必須,或者說更強調從戰爭中學會戰爭。沒有實踐經驗的專案經理就是繡花枕頭一個。
實話實說,軟體學院就是一個蒙錢的機構,公關工作做得很好,善於打廣告,而且都是打著高薪的幌子,就如同外面的什麼北大青鳥培訓班一樣。兩個字:蒙錢!四個字:還是蒙錢!
總之一句話,如果你只想成為軟體開發高手(比如認為會編驅動程式或防毒軟體就是高手的那種),建議工作,不要考研;(##正在學習作業系統核心,把準備考研的時間摞兩個月過來,你就能寫個簡單的驅動程式,有兩個月的實踐經驗的話就差不多OK了#)……完全沒有工作經驗的,也不建議考研,你進來了只有瞎混一通。如果你有上述工作經驗且想成為高階軟體工程師(能夠獨立理解並設計出快速傅立葉變換演算法的那種軟體工程師)的話,那麼強烈建議考研。考研讓你有3年放鬆思考的機會,也有3 年讓你的思想和技術積累沉澱的機會,非常難得的機會!不考研的話,這種機會就是一種奢侈,可望而不可及的那麼一種奢侈。
所以,不管你是哪一種情況,都不建議考軟體學院。除非你是女生,把能夠成為一個研究生當著一生最大滿足的那種女生。
一、關於讀書的機會成本問題。讀研的機會成本的確是很高。任何人都可以簡單地計算出來。所以,我也不贊成所有的人都去讀研。讀研只適合那些痛感數學在程式設計中的極端重要性的人。如果對理論工具和理論思維的極端重要性沒有切膚的認識,那麼讀研的價值幾乎為0;讀研的好處在於:A,把你自己放在一個學術和工程的交叉點上;B,讓你具備了進入微軟等世界頂級軟體研發機構的可能性,記住只是可能性。但是不讀研的這種可能性為0;C,如前所述,如果沒有讀研的機會,你也就沒有靜下心來好好鑽研幾年理論的機會。一邊工作拿高薪,一邊深入地學習各種理論,諸位認為這可能嗎?我反正認為不可能,我覺得學習鑽研理論最需要的就是一個長期安靜獨處的環境,一邊工作一邊讀書是不可能有這樣的環境的,你會覺得每天都在疲於奔命。而讀研正好可以提供這樣一個環境。我同時還反對整天跟著導師的屁股後面跑,這樣會浪費很多時間。讀計算機的研究生,主要依靠自己去查閱最新文獻,自己去研讀文獻,和導師的口頭交流一個月一次就足夠了,前提還需要導師的水平足夠牛。如果導師的水平不牛,這也沒關係,不理他就是了,自己做好自己的事情即可。
二、關於研究生教學質量問題。坦白地說,全國都是“洪桐縣中無好人”,尤其在計算科學領域,大牛極少。那為什麼還要去讀研?大哉問!把讀研的收穫寄託在名校或名師的名氣上,我認為是註定要失敗的。讀研全靠自學,研究生之間的差距全部體現在自學能力上面。又有人問,既然是自學,為什麼非要讀研?回答是:因為讀研就是為你買一份保險,就是買一份你自學三年之後不會失業的保險。這份保險主要是一種心理上的後盾,讓你在自學過程中經得起誘惑,能夠從容鎮定地去追尋計算機理論發展的堅實足跡,從尤拉,費馬,高斯,康託,圖靈等巨匠那裡尋找方法論的珠寶。倘若沒有這份保險,你在家裡面自學3個月,保證你會被失業的壓力壓得喘不過氣來,何談安心學習?
三、關於實戰經驗與理論學習的優劣問題。這沒有定論,如前所述,管理資訊系統,裝置驅動開發,工具軟體開發,軟體病毒剖析等等這些工作不太需要創造性,需要的是耐心和經驗,需要的是對既有規範的準確理解。這類開發工作最適合在實戰中提高,理論學習沒什麼作用。但是在人工智慧,模式識別,影象壓縮,虛擬現實,巨量資料檢索,自然語言理解,計算機圖形學等等領域,在這些領域,如果沒有紮實的理論功底,一切都是那麼遙遠,不管你花了多少時間在程式設計上面。
四、關於高階研發人員的知識結構問題。首先宣告,我不是一個純粹理論激進分子,即認為除了理論之外,一切都不重要。我認為,純熟的程式設計技能是最基本但也是最必不可少的技能。沒有這個基礎,一切計算機理論就是空談(研究圖靈可計算性理論的研究者除外)。有了這個基礎之後,下列理論學習方向必須重點突破:
(1)科學哲學。這是核心中的核心!可惜國內不開這門課。不但不開課,而且還作為批判物件來引用,實在是遺憾至極!這是一門教你如何“釣魚”的學科,在一切科學研究中居於最核心的地位。它是古今科研方法和思維方法的集大成者,很難想象一個成熟的研究者沒有一套自己的方法論體系。科學哲學最需要的是領會與總結,它的思想與啟示會伴隨我們的一生。
(2)康託集合論,矩陣方法,離散結構,圖論方法,群論方法之間的緊密關係。最重要的認識這些理論對實踐的重要啟示和方法引導。我始終認為,如果你學了一門理論之後,卻不知道這門理論有什麼作用,那麼你的理論就白學了,你什麼東西都沒有撈著。所以,學習任何理論之前,先問自己:它有什麼用?在哪裡用?如何用?帶著這些問題去學習理論,你才會真正地學到東西(##即學之前問:我為什麼要要去學?#)。用這三個問題去問你的理論課老師,他的回答就是判斷其實際水平的最佳標準。
(3)思維要有極強的穿透力,學會看透文獻作者沒有寫出來的動機。絕大部分大師都有隱瞞自己最具有方法論啟示意義的思考環節的習慣。牛頓和華羅庚先生都有這個壞習慣。這讓大家認為他們是天才,因為很多問題他想到了,我們想不到。但是為什麼他們能想到,我們想不到?他們是怎樣想到的?沒有人告訴我們牛頓發現萬有引力定律時的思考過程。當然,牛頓可以慷慨地把他的思考結果告訴我們,但是,他那可以點石成金的“金手指”卻沒有教給我們。我們的任務就是要培養透過文章看穿作者背後意圖和動機的能力。在這方面,臺灣的侯捷和美國的Donbox是絕佳典範。這兩隻老狐狸(呵呵,是愛稱)憑著其獵犬一般的嗅覺,抽絲剝繭,一個把COM背後的幕後設計動機揭開並暴露到了光天化日之下,另一個把MFC的巨集觀架構做了一次完美的外科手術。其非凡的思維穿透力令人驚歎。
(4)英語。英語本身不重要,但是用英語寫成的文獻就極其重要了。所以,專門把英語作為一個重頭戲列出來。大家不要相信英語無用論的鬼話。對於搞計算機的而言,英語就是你的母語!
(5)其它的具體理論還有很多,但是都不如這四個方面重要,因為我覺得這四個方面是最具有根本性,全域性性的能力培養環節。需要指出的是,很多高深理論對你的工作是無意義的,當心時間陷進去。一定要把效率最高的時間段用在最具有決定性意義的理論學習上。
五、關於讀研之後的出路是否光明的問題。我們應該承認,讀研之後,你的工作機會不是變多了,而是變少了。而且越是高手,他的工作機會和工作範圍就越少。這是因為,越是搞前沿研發的公司,其數量越少,在這個圈子的人也就越少。你找工作的範圍就越小,試問:如果微軟的OS設計專家出來找工作,能夠讓他選擇的公司能有幾家?但是,這種公司數量的減少是以工資待遇的急劇上升為補償的。同時,你在工作中所受到的充分尊重也是在一般公司中體會不到的。所以不要擔心學了高科技用不上,呵呵,你只會越來越感覺自己學的不夠用。相信接到過獵頭公司電話的人會體會得到。真正的高手從來就不會擔心工作的問題,也從來不會到人才市場上去找工作。既然選擇了理論深入,那麼就應該把眼光放得更遠。