天天看點

程式員的十個層次(牛人成長之路)(轉)

       自西方文藝複興以來,中國在自然科學方面落後西方很多,軟體領域也不例外。當然現在中國的許多程式員們對此可能有許多不同的意見,有些人認為中國的程式員水準遠落後于西方,有些則認為中國的程式員個人能力并不比西方的程式員差,隻是整個軟體産業落後而已。那麼,到底中國的程式員水準比西方程式員水準差,還是中國有許多優秀的程式員達到或超過了西方程式員同等水準呢?要解決這個問題,必須先知道程式員有多少種技術層級,每個層級需要什麼樣的技術水準,然後再比較中國和西方在各個技術層級的人數,就可以知道到底有沒有差距,差距有多大。

當然,對于如何劃分程式員的技術層級,不同公司或不同人會有不同的劃分标準,下面的劃分僅代表個人的觀點,如有不當之處,還請砸闆磚予以糾正。

第1層 菜鳥

       第1層樓屬于地闆層,邁進這層樓的門檻是很低的。基本上懂計算機的基本操作,了解計算機專業的一些基礎知識,掌握一門基本的程式設計語言如C/C++,或者Java,或者JavaScript,...,均可入門邁進這層。

在這層上,中國有着絕對的優勢,除了從計算機專業畢業的衆多人數外,還有大量的通信、自動化、數學等相關專業的人士進入這一行,此外還有衆多的其他專業轉行的人士,人數絕對比西方多出甚多。并且還有一個優勢就是我們這層人員的平均智商比西方肯定高。

沒有多少人願意一輩子做菜鳥,因為做"菜鳥"的滋味實在是不咋的,整天被老大們吆喝着去裝裝機器,搭建一下測試環境,或者對照着别人寫好的測試用例做一些黑盒測試,好一點的可以被安排去寫一點測試代碼。當然如果運氣"好"的話,碰到了國内的一些作坊式的公司,也有機會去寫一些正式的代碼。

是以,菜鳥們總是在努力學習,希望爬更高的一層樓去。

第2層 大蝦

        從第1層爬到第2層相對容易一些,以C/C++程式員為例,隻要熟練掌握C/C++程式設計語言,掌握C标準庫和常用的各種資料結構算法,掌握STL的基本實作和使用方法,掌握多線程程式設計基礎知識,掌握一種開發環境,再對各種作業系統的API都去使用一下,搞網絡程式設計的當然對socket程式設計要好好掌握一下,然後再學習一些面向對象的設計知識和設計模式等,學習一些測試、軟體工程和品質控制的基本知識,大部分人經過2~3年的努力,都可以爬到第2層,晉升為"大蝦"。

中國的"大蝦"數量和"菜鳥"數量估計不會少多少,是以這層上仍然遠領先于西方。

大蝦們通常還是有些自知之明,知道自己隻能實作一些簡單的功能,做不了大的東西,有時候還會遇到一些疑難問題給卡住,是以他們對那些大牛級的人物通常是非常崇拜的,國外的如Robert C. Martin、Linus Torvalds,國内的如求伯君、王志東等通常是他們崇拜的對象。其中的有些人希望有一天也能達到這些大牛級人物的水準,是以他們繼續往樓上爬去。第3層 牛人

由于"大蝦"們經常被一些疑難問題給卡住,是以有了"大蝦"們隻好繼續學習,他們需要将原來所學的知識進一步熟練掌握,比如以熟練掌握C++程式設計語言為例,除了學一些基礎性的C++書籍如《C++ Primer》,《Effective C++》,《Think in C++》,《Exception C++》等之外,更重要的是需要了解C++編譯器的原理和實作機制,了解作業系統中的内部機制如記憶體管理、程序和線程的管理機制,了解處理器的基礎知識和代碼優化的方法,此外還需要更深入地學習更多的資料結構與算法,掌握更深入的測試和調試知識以及品質管理和控制方法,對各種設計方法有更好的了解等。

學習上面說的這些知識不是一揮而就的,不看個三五十本書并掌握它是做不到的。以資料結構算法來說,至少要看個5~10本這方面的著作;以軟體設計來說,光懂結構化設計、面向對象設計和一些設計模式是不夠的,還要了解軟體架構設計、互動設計、面向方面的設計、面向使用的設計、面向資料結構算法的設計、情感化設計等,否則是很難進到這個樓層的。

      當然除了上面說的知識外,大蝦們還需要去學習各種經驗和技巧。當然這點難不倒他們,現在出版的書籍衆多,網絡上的技術文章更是不勝數,然後再去各種專業論壇裡泡一泡,把這些書籍和文章中的各種經驗、技能、技巧掌握下來,再去學習一些知名的開源項目如Apache或Linux作業系統的源代碼實作等。此時對付一般的疑難問題通常都不在話下,菜鳥和大蝦們會覺得你很"牛",你也就爬到了第3層,晉升為"牛人"了。

看了上面所講的要求,可能有些大蝦要暈過去了,成為牛人要學這麼多東西啊!要求是不是太高了?其實要求一點也不高,這麼點東西都掌握不了的話,怎麼能讓别人覺得你"牛"呢?

需要提一下的是,進入多核時代後,從第2層爬到第3層增加了一道多核程式設計的門檻。當然要邁過這道門檻并不難,已經有很多前輩高人邁進了這道門檻,隻要循着他們的足迹前進就可以了。想邁進這道門檻者不妨去學習一下TBB開源項目的源代碼(連結:http://www.threadingbuildingblocks.org/),然後上Intel的部落格(http://softwareblogs-zho.intel.com/)和多核論壇(http://forum.csdn.net/Intel/IntelMulti-core/)去看看相關文章,再買上幾本相關的書籍學習一下。

在國内,一旦成為"牛人",通常可以到許多知名的公司裡去,運氣好者可以挂上一個架構師的頭銜,甚至挂上一個"首席架構師"或者"首席xx學家"的頭銜也不足為奇。有不少爬到這層的人就以為到了樓頂了,可以眼睛往天上看了,開始目空一切起來,以為自己什麼都可以做了,什麼都懂了,經常在網絡上亂砸闆磚是這個群體的最好寫照。由此也看出,國内的牛人數量仍然衆多,遠多于西方的牛人數量,在這層上仍然是領先的。

也有不少謙虛的"牛人",知道自己現在還不到半桶水階段。他們深知爬樓的遊戲就像猴子上樹一樣,往下看是笑臉,往上看是屁股。為了多看笑臉,少看屁股,他們并沒有在此停步不前,而是繼續尋找到更上一層的樓梯,以便繼續往上爬。

       從第3層爬到第4層可不像上面說過的那幾層一樣容易,要成為大牛的話,你必須要能做牛人們做不了的事情,解決牛人們解決不了問題。比如牛人們通常都不懂寫作業系統,不會寫編譯器,不懂得TCP/IP協定的底層實作,如果你有能力将其中的任何一個實作得象模象樣的話,那麼你就從牛人更新為"大牛"了。

當然,由于各個專業領域的差别,這裡舉作業系統、編譯器、TCP/IP協定隻是作為例子,并不代表成為"大牛"一定需要掌握這些知識,以時下熱門的多核程式設計來說,如果你能比牛人們更深入地掌握其中的各種思想原理,能更加自如的運用,并有能力去實作一個象開源項目TBB庫一樣的東西,也可以成為"大牛",又或者你能寫出一個類似Apache一樣的伺服器,或者寫出一個資料庫,都可以成為"大牛"。

要成為"大牛"并不是一件簡單的事情,需要付出比牛人們多得多的努力,一般來說,至少要看過200~400本左右的專業書籍并好好掌握它,除此之外,還得經常關注網絡和期刊雜志上的各種最新資訊。

當"牛人"晉升為"大牛",讓"牛人們"發現有比他們更牛的人時,對"牛人"們的心靈的震撼是可想而知的。由于牛人們的數量龐大,并且牛人對大蝦和菜鳥階層有言傳身教的影響,是以大牛們通常能獲得非常高的社會知名度,幾乎可以用"引無數菜鳥、大蝦、牛人競折腰"來形容,看看前面提過的Linus Torvalds等大牛,應該知道此言不虛。

雖然成為"大牛"的條件看起來似乎很高似的,但是這層樓并不是很難爬的一層,隻要通過一定的努力,素質不是很差,還是有許多"牛人"可以爬到這一層的。由此可知,"大牛"這個樓層的人數其實并不像想像的那麼少,例如比爾·蓋茨之類的人好像也是屬于這一層的。

由于"大牛"這層的人數不少,是以也很難統計除到底是中國的"大牛"數量多還是西方的大牛數量多?我估計應該是個旗鼓相當的數量,或者中國的"大牛"們會更多一些。

看到這裡,可能會有很多人會以為我在這裡說瞎話,Linus Torvalds寫出了著名的Linux作業系統,我國并沒有人寫出過類似的東西啊,我國的"大牛"怎麼能和西方的比呢? 不知大家注意到沒有,Linus Torvalds隻是寫出了一個"象模象樣"的作業系統雛形,Linux後來真正發展成聞名全球的開源作業系統期間,完全是因為許多支援開源的商業公司如 IBM等,派出了許多比Linus Torvalds更高樓層的幕後英雄在裡面把它開發出來的。

可能有些菜鳥認為Linus Torvalds是程式員中的上帝,不妨說個小故事:

Linus,Richard Stallman和Don Knuth(高德納)一同參加一個會議。

Linus 說:"上帝說我創造了世界上最優秀的作業系統。"

Richard Stallman自然不甘示弱地說:"上帝說我創造了世界上最好用的編譯器。"

Don Knuth一臉疑惑的說:"等等,等等,我什麼時候說過這些話?"

由此可以看出,Linus Torvalds的技術水準并不像想像中那麼高,隻是"牛人"和"大蝦"覺得"大牛"比他們更牛吧了。在我國,有一些當時還處于"大蝦"層的人物,也能寫出介紹如何寫作業系統的書,并且書寫得非常出色,而且寫出了一個有那麼一點點象模象樣的作業系統來。我想中國的"大牛"們是不會比西方差的,之是以沒有人寫出類似的商業産品來,完全是社會環境的原因,并不是技術能力達不到的原因。

"大牛"們之是以成為大牛,主要的原因是因為把"牛人"給蓋了下去,并不是他們自己覺得如何牛。也許有很多菜鳥、大蝦甚至牛人覺得"大牛"這層已經到頂了,但大多數"大牛"估計應該是有自知之明的,他們知道自己現在還沒有爬到半山腰,也就勉強能算個半桶水的水準,其中有些爬到這層沒有累趴下,仍然能量充沛,并且又有志者,還是會繼續往更上一層樓爬的。

看到這裡,也許有些菜鳥、大蝦、牛人想不明白了,還有比"大牛"們更高的樓層,那會是什麼樣的樓層?下面就來看看第5層樓的奧妙。

第5層 專家

      當大牛們真正動手做一個作業系統或者類似的其他軟體時,他們就會發現自己的基本功仍然有很多的不足。以記憶體管理為例,如果直接抄襲Linux或者其他開源作業系統的記憶體管理算法,會被人看不起的,如果自動動手實作一個記憶體管理算法,他會發現現在有關記憶體管理方法的算法數量衆多,自己并沒有全部學過和實踐過,不知道到底該用那種記憶體管理算法。

看到這裡,可能有些人已經明白第5層樓的奧妙了,那就是需要做基礎研究,當然在計算機裡,最重要的就是"計算"二字,程式員要做基礎研究,主要的内容就是研究非數值"計算"。

非數值計算可是一個非常龐大的領域,不僅時下熱門的"多核計算"與"雲計算"屬于非數值計算範疇,就是軟體需求、設計、測試、調試、評估、品質控制、軟體工程等本質上也屬于非數值計算的範疇,甚至晶片硬體設計也同樣牽涉到非數值計算。如果你還沒有真正領悟"計算"二字的含義,那麼你就沒有機會進到這層樓來。

可能有人仍然沒有明白為什麼比爾·蓋茨被劃在了大牛層,沒有進到這層來。雖然比爾·蓋茨大學未畢業,學曆不夠,但是家有藏書2萬餘冊,進入軟體這個行業比絕大部分人都早,撇開他的商業才能不談,即使隻看他的技術水準,也可以算得上是學富五車,頂上幾個普通的計算機軟體博士之和是沒有問題的,比起 Linus Torvalds之類的"大牛"們應該技高一籌才對,怎麼還進不了這層樓呢?

非常遺憾的是,從Windows作業系統的實作來看,其對計算的了解是很膚淺的,如果把Google對計算方面的了解比做大學生,比爾·蓋茨隻能算做一個國中生,是以比爾·蓋茨永遠隻能做個大牛人,成不了"專家"。

看到這裡,也許國内的大牛們要高興起來了,原來比爾·蓋茨也隻和我等在同一個層次,隻要再升一層就可以超越比爾·蓋茨了。不過爬到這層可沒有從"牛人"升為"大牛"那麼簡單,人家比爾·蓋茨都家有2萬多冊書,讓你看個500~1000本以上的專業書籍并掌握好它應該要求不高吧。當然,這并不是主要的條件,更重要的是,需要到專業的學術站點去學習了,到ACM,IEEE,Elsevier,SpringerLink,SIAM等地方去下載下傳論文應該成為你的定期功課,使用Google搜尋引擎中的學術搜尋更是應該成為你的日常必修課。此外,你還得經常關注是否有與你研究相關的開源項目冒出來,例如當聽到有TBB這樣針對多核的開源項目時,你應該第一時間到Google裡輸入"TBB"搜尋一下,将其源代碼下載下傳下來好好研究一番,這樣也許你的一隻腳已經快邁進了這層樓的門檻。

當你象我上面說的那樣去做了以後,随着時間的推移,總會有某天,你發現,在很多小的領域裡,你已經學不到什麼新東西了,所有最新出來的研究成果你幾乎都知道。此時你會發現你比在做"牛人"和"大牛"時的水準不知高出了多少,但是你一點也"牛"不起來,因為你學的知識和思想都是别人提出來的,你自己并沒有多少自己的知識和思想分享給别人,是以你還得繼續往樓上爬才行。

我不知道國内的"專家"到底有多少,不過有一點可以肯定的是,如果把那些專門蒙大家的"磚家"也算上的話,我們的磚家比西方的要多得多。

第6層學者

       當"專家"們想繼續往上一層樓爬時,他們幾乎一眼就可以看到樓梯的入口,不過令他們吃驚的是,樓梯入口處豎了一道高高的門檻,上面寫着"創新"二字。不幸的是,大多數人在爬到第5層樓時已經體能消耗過度,無力翻過這道門檻。

有少數體能充足者,可以輕易翻越這道門檻,但是并不意味着體力消耗過度者就無法翻越,因為你隻是暫時還沒有掌握恢複體能的方法而已,當掌握了恢複體能的方法,将體能恢複後,你就可以輕易地翻越這道門檻了。

怎麼才能将體能恢複呢?我們的老祖宗"孔子"早就教導過我們"溫故而知新",在英文裡,研究的單詞是"research",其字首"re" 和"search"分别是什麼意思不用我解釋吧。或許有些人覺得"溫故而知新"和"research"有些抽象,不好了解,我再給打個簡單的比方,比如你在爬一座高山,爬了半天,中途體力不支,怎麼恢複體力呢?自然是休息一下,重新進食一些食物,體力很快就可以得到恢複。

由此可知,對體能消耗過度者,休息+重新進食通常是恢複體能的最佳選擇。可惜的是,國内的老闆們并不懂得這點,他們的公司裡不僅連正常國家規定的休息時間都不給足,有些公司甚至有員工"過勞死"出現。是以國内能翻越"創新"這道門檻的人是"少之又少",和西方比起來估計是數量級的差别。

再說說重新進食的問題,這個重新進食是有講究的,需要進食一些基礎性易消化的簡單食物,不能進食山珍海味級的複雜食物,否則很難快速吸收。以查找為例,并不是去天天盯着那些複雜的查找結構和算法進行研究,你需要做的是将二分查找、哈希查找、普通二叉樹查找等基礎性的知識好好地複習幾遍。

以哈希查找為例,首先你需要去将各種沖突解決方法如鍊式結構、二次哈希等編寫一遍,再試試不同種類的哈希函數,然後還需要試試在硬碟中如何實作哈希查找,并考慮資料從硬碟讀到記憶體後,如何組織硬碟中的資料才能快速地在記憶體中建構出哈希表來,...,這樣你可能需要将一個哈希表寫上十幾個不同的版本,并比較各個版本的性能、功能方面的差別和适用範圍。

總之,對任何一種簡單的東西,你需要考慮各種各樣的需求,以需求來驅動研究。最後你将各種最基礎性的查找結構和算法都了然于胸後,或許某天你再看其他更複雜的查找算法,或者你在散步時,腦袋裡靈光一現,突然間就發現了更好的方法,也就從專家晉升為"學者"了。

學者所做的事情,通常都是在前人的基礎上,進行一些小的優化和改進,例如别人發明了鍊式基數排序的方法,你第1個發現使用一定的方法,可以用數組替代連結清單進行基數排序,性能還能得到進一步提高。

由于學者需要的隻是一些小的優化改進,是以中國還是有一定數量的學者。不過和國外的數量比起來,估計少了一個數量級而已。

也許有人會覺得現在中國許多公司申請專利的數量達到甚至超過西方發達國家了,我們的學者數量應該不會比他們少多少。是以,有必要把專利和這裡說的創新的差別解釋一下。

所謂專利者,隻要是以前沒有的,新的東西,都可以申請專利;甚至是以前有的東西,你把他用到了一個新的領域的産品裡去,也可以申請專利。比如你在房子裡造一個水泥柱子,隻要以前沒有人就這件事申請專利,那麼你就可以申請專利,并且下次你把水泥柱子挪一個位置,又可以申請一個新的專利;或者你在一個櫃子上打上幾個孔,下次又把孔的位置改一改,...,均可申請專利。

這層樓裡所說的創新,是指學術層面的創新,是基礎研究方面的創新,和專利的概念是完全不同的,難度也是完全不同的。你即使申請了一萬個象那種打孔一類的專利,加起來也夠不到這層樓裡的一個創新。

當你爬到第6層樓時,你也許會有一種突破極限的快感,因為你終于把那道高高的寫着"創新"二字的門檻給翻過去了,實作了"0"的突破。這時,你也許有一種"獨上高樓,欲望盡天涯路"的感覺,但是很快你會發現看到的都是比較近的路,遠處的路根本看不清楚。如果你還有足夠的體力的話,你會想爬到更高一層的樓層去。

第7層大師

        從第6層樓爬到第7層樓,并沒有多少捷徑可走,主要看你有沒有足夠的能量。你如果能象Hoare一樣設計出一個快速排序的算法;或者象Eugene W. Myers一樣設計出了一個用編輯圖的最短路徑模型來解決diff問題的算法;或者象M.J.D. Powell一樣提出了一個能夠處理非線性規劃問題的SQP方法;或者你發現基于比較的排序算法,它的複雜度下界為O(NLogN);或者你發現用棧可以将遞歸的算法變成非遞歸的;或者你設計出一個紅黑樹或者AVL樹之類的查找結構;或者你設計出一個象C++或Java一樣的語言;或者你發明了 UML;...,你就爬到了第7層,晉升為"大師"了。

上面舉的這些例子中,其中有些人站的樓層比這層高,這裡隻是為了形象說明而舉例他們的某個成就。從上面列出的一些大師的貢獻可以看出,成為大師必須要有較大的貢獻。首先解決問題必須是比較重要的,其次你要比前輩們在某方面有一個較大的提高,或者你解決的是一個全新的以前沒有解決過的問題;最重要的是,主要的思路和方法必須是你自己提供的,不再是在别人的思路基礎上進行的優化和改進。

看了上面這些要求,如果能量不夠的話,你也許會覺得有些困難,是以不是每個人都能成為"大師"的。中國軟體業裡能稱得上是"大師"的人,用屈指可數來形容,估計是綽綽有餘。值得一提得是,國外的"大師"就象我們的"大牛"一樣滿天飛的多。

我把我猜測本國有可能進到這層樓的大師列一下,以起個抛磚引玉的作用。漢王的"手寫識别"技術由于是完全保密的,不知道它裡面用了什麼思想,原創思想占的比重有多少,是以不知道該把它劃到這層樓還是更高一層樓去。原山東大學王小雲教授破解DES和MD5算法時,用到的方法不知道是不是完全原創的,如果是的話也可進到這層樓來。

陳景潤雖然沒有徹底解決哥德巴赫猜想,但他在解決問題時所用的方法是創新的,是以也可以進到這層樓來。當然,如果能徹底解決哥德巴赫猜想,那麼可以算到更高的樓層去。

求伯君和王志東等大牛們,他們在做WPS和表格處理之類的軟體時,不知是否有較大的原創算法在裡面,如果有的話就算我錯把他們劃到了大牛層。由于所學有限,不知道國内還有那些人能夠得上"大師"的級别,或許有少量做研究的教授、院士們,可以達到這個級别,有知道的不妨回個文章晾一晾。

鑒于"大師"這個稱号的光環效應,相信有不少人夢想着成為"大師"。或許你看了前面舉的一些大師的例子,你會覺得要成為大師非常困難。不妨說一下,現在有一條通往"大師"之路的捷徑打開了,那就是多核計算領域,有大量的處女地等待大家去挖掘。

以前在單核時代開發的各種算法,現在都需要改寫成并行的。資料結構與算法、圖像處理、數值計算、作業系統、編譯器、測試調試等各個領域,都存在大量的機會,可以讓你進到這層樓來,甚至有可能讓你進到更高一層樓去。

繼續閱讀