寫這篇文章,是為了糾正上篇關于編譯技術職業(yè)發(fā)展的帖子中自己的觀點可能帶來的誤導。
盡量讓面臨碩士、博士選方向的學弟學妹了解編譯知識在未來計算機技術職業(yè)生涯中的重要性,以及光明的未來方向。
要想體現(xiàn)自己的價值,就要有一個獨門秘籍。不管是自己開公司,賣產品。還是打工,掙錢。都要有別人做不到,只有你才能做到的才行。
高薪,是因為你能給別人帶來價值。薪水的高低,要看你的技術能否滿足社會的需要,是不是社會所必須的。比如,曾經會點MFC,能做個簡單的網站,就能找到很不錯的工作。但現(xiàn)在可能,Android系統(tǒng)開發(fā),網絡(協(xié)議棧),手機應用開發(fā)更加火爆。而且一定要學的精,才有好的薪水,才能開能活下來,賺到錢的公司。
那些不可或缺的、高精尖的技術是首選。比如,最底層的微波、電路相信誰都知道它的重要性,不可或缺。大學本科時,師兄說過一句玩笑話:搞微波的,玩多高的頻率,就能掙多少錢。不過學過電磁場理論的人都知道有多痛苦。參考中的鏈接1和2也能說明這個。其中參考2,針對復旦大學畢業(yè)生就業(yè)的分析,有下面一段話:
碩士畢業(yè)生的實際薪水排名前三位的專業(yè)依次是國際法、電路與系統(tǒng)、電磁場與微波技術,調查發(fā)現(xiàn),這三個專業(yè)的實際薪水比期望薪水高
編譯就是這樣一種獨門秘籍,有很高的門檻,而又不可或缺??傄腥藢懗绦?。有人要性能更好的程序,但又不想多寫代碼,不想錯誤百出,不想調優(yōu)。編譯器,或者更大點,一個好的編程環(huán)境是所有程序員最歡迎的。
在計算機行業(yè),這個可能要縮短到20年。并行計算,在計算機剛剛出現(xiàn)的時候,也非常熱門。不過自從上世紀九十年代到04年左右,有關并行計算的研究就非常少了。因為CPU的頻率增加,使得串行程序只要換換CPU就能跑的更快了。但今天,并行計算又成了重要的研究方向。
CPU的結構,從單發(fā)射、順序執(zhí)行的標量處理器,到多發(fā)射、流水線、亂序執(zhí)行的超標量處理器,曾經給處理器性能帶來了很大的提升。但今天,功耗問題、成品率、芯片面積等問題,使得幾乎所有的眾核處理器又回到了順序執(zhí)行的模式。
向量機 90年代的時候也很火爆,但隨著標量處理器的性能提升,漸漸被冷落了。但如今,GPU、Intel的AVX2,又隱隱約約看到了一點向量機的影子。
整個產業(yè)界處在不斷的變化,更新之中。技術和方法基本就那么多,至少不同的歷史時期,需要不同的排列組合方式,把他們放到一起,再加上不斷的技術革新。只有一個因素永遠不會變,就是使用計算機的人。而編譯器正是供計算機從業(yè)人員使用(雖然Office軟件,瀏覽器也是)。另外一個因素,目前來看也還沒怎么變,就是計算機的執(zhí)行模型。而編譯器的最后結果是提供給執(zhí)行模型的。所以編譯器這個技術,更像鐵飯碗。尤其是體系結構比較亂的今天。
內功是最上乘的武功,計算機科學的內功:就是算法和體系結構。
算法,不用多說。實際中遇到的問題,如何利用計算機這種確定的、有限狀態(tài)的、非連續(xù)的工具去解決,就是算法要研究的問題。當然這個算法中,還包括數(shù)據結構,好的數(shù)據結構才能更好的對現(xiàn)實問題做建模,以便供算法處理。
體系結構方面,目前來看,基本就沒有變化,依然是馮-諾依曼的結構,不過多核和眾核的并行執(zhí)行模式,可能會帶來一些新的變化,這也是為什么最近并行研究如此的熱。有了體系結構這種內功,你就知道如何使用計算機。體系結構包括底層相關的,不僅僅是CPU、主存、cache、硬盤,還包括上層的操作系統(tǒng)和編譯器。雖然說執(zhí)行模型很簡單,但操作系統(tǒng)和編譯器里的學問也很大。操作系統(tǒng)牽涉到資源的分配問題,編譯器牽涉到人與機器的交互問題。
其他神馬,從計算機技術的角度看,都是浮云。
比如,上層語言經歷了從匯編,到宏編程,到命令式語言(C),到面向對象編程(C++),到腳本語言(Python),以及編譯+解釋語言(Java)的大致演進過程。語言五花八門,我們不去爭論應該學哪個,不該學哪個。最后這些語言,都要用那些指令在CPU上執(zhí)行起來。不管上層扯什么語言特性,什么編譯執(zhí)行或者解釋執(zhí)行。最后,都是一系列的算術、邏輯、跳轉指令;以及一系列的寄存器。語言到指令的過程,就是編譯器和解釋其(JVM)要做的工作。語言標準只是一些具體的規(guī)定語言如何實現(xiàn)而已。
比如,了解了Java所有對象都基于Object類,C#為底層CPU指令支持的數(shù)據類型,如整型,單/雙精度浮點類型生成更直接的CIL代碼,你就知道為什么使用C++的模板會生成很大的可執(zhí)行文件,為什么Java的模板實現(xiàn)代碼會比C#的模板代碼性能略差一些。
什么基于C語言的Glibc標準庫,基于C++的boost代碼庫,基于Python的Django網站架構,基于Java的J2EE web架構。除去上層的整個系統(tǒng)的結構設計,算法設計外,其他堆砌代碼的工作居多。(搞編譯,調bug最多)
前不久,聽張曉東老師介紹Mapreduce,臺下一個老師疑問,數(shù)據庫方向的研究專家許多年前就意識到需要更大的存數(shù)據的軟件,研究了這么多年好像都沒有太顯著的進展。為什么一個搞搜索的互聯(lián)網公司,卻能發(fā)明這種Map 加 Reduce的機制來應對大規(guī)模的數(shù)據存取?!?張曉東老師的回答是,Google的創(chuàng)始人從函數(shù)式語言中得到的靈感。MapReduce機制的兩位發(fā)明人 Jeffrey Dean 和 Sanjay Ghemawat,一個是做程序設計語言的, 一個是研究面向對象數(shù)據庫的。
前不久,聽 Yuanyuan Zhou 老師講座。周老師也是華人計算機學術界的榜樣之一,其領導的研究組在國際上是絕對數(shù)一數(shù)二的,在最頂級的會議上每年都有數(shù)篇高質量的論文。
不僅僅如此,她們還在將成果做成產品,比如 Pattern Insight.這個公司致力于應用機器學習的方式來協(xié)助程序員編寫程序,發(fā)現(xiàn)代碼bug。這里面有意思的工作包括:結合代碼注釋發(fā)現(xiàn)bug,利用機器學習的方法來尋找操作系統(tǒng)中許多復制粘貼代碼中的bug,利用條件分支語句的邏輯推導增強軟件中的log輸出,以便得到更豐富的log信息等等??梢詮?a >這里找到許多她們所從事的研究工作??梢钥吹皆S多針對源代碼的分析工作,都能看到很多編譯的影子,她們的工作應該偏向于利用語法和語義方面的技術。她們的很多工作都是在實際的開源項目,如Linux內核、瀏覽器、apache、mysql中尋找bug,因此公司比較歡迎這種實用的技術創(chuàng)新。
雖然,其他還有很多可以選擇的方向。但當你迷茫,不知道要學點什么的時候,又想以后從事計算機方向的技術類工作時,編譯是個值得考慮的選擇。
這個網站網站常年發(fā)布編譯方向招聘信息,感興趣的可以把握把握技術需求的方向: Compiler Jobs