為什麼大部分傑出的程序員都在內心傾向於研究操作系統和編譯器?

有人說,操作系統和編譯器技術含量沒有應用軟體含量高。我不信,如果不高的話,為什麼還有這麼多傑出的人去研究他們。


Big clean problem弄起來都是很有意思的。問題要夠複雜,而且要夠純潔。純潔的意思就是說詳細的目標說出來也就那麼幾句話,十分單一。只是你要客服相當多的困難去達到那一個目標。

譬如說開發一個大家喜歡的軟體就不是big clean problem,雖然有時候他很big,但是他不clean,因為用戶實在太難伺候了。

但是開發一個計算器程序也不是big clean problem,軟體模擬售貨員阿姨使用的計算器很clean,但是他太不big了,也夠不成big clean problem。

編譯器和不考慮用戶體驗的操作系統就同時滿足這兩個條件。當然也有大量的其他問題是滿足這樣的條件的,譬如說排版軟體,譬如說軟體渲染器,IDE的intellisense部分等等。


可能只是想去搞清楚為什麼是這樣,還原程序的本質。操作系統我不知道,但是編譯器么,其實很多時候就是一個比較「吃屎」與受虐的過程,一頓虐完,柳暗花明後,有時候還大喊舒服...嗯,就是這樣的過程。


感覺不是技術高的程序員都要研究操作系統和編譯器,而是研究操作系統和編譯器的程序員都技術高吧。


很顯然不是所有的牛逼程序員都要研究操作系統和編譯器。但是,仍有相當比例的牛逼程序員會去研究這兩樣東西。為什麼呢,我覺得還是計算機行業太年輕,才幾十年的歷史,操作系統和編譯器沒有完全標準化,導致很多追求性能的程序最後要去遷就操作系統和編譯器的約定。

這就好比最初的天文學家都是磨鏡片高手,因為要自己製造或者調整望遠鏡,而現在的天文學家肯定跟磨鏡子一點邊都沾不上了,因為有人會替他們處理這些製造上的難題,他們只需要專心研究觀測數據就行了。

至於操作系統和編譯器有沒有軟體技術含量高,這句話本身問得太寬泛了,難道操作系統和編譯器不也是軟體么?技術含量高又是怎麼定義的?

我上學時研究的是信號處理,寫過一段時間的信號處理程序,後來因為個人興趣自學過編譯器。我覺得複雜度而言,實現一個編譯器的複雜度勝過很多信號處理問題,但是就涉及到的數學知識而言,信號處理要比編譯器難得多,不信可以去看看ISAR成像、小波變換、還有壓縮感知這些東西,一篇論文有一半以上的篇幅都是數學公式,現在想想還頭大。

最後看看樓主的判斷依據:「如果(技術水平)不高的話,為什麼還有這麼多牛逼的人去研究他們。」

事實上自然科學的每個領域都有一群牛逼的人在搞研究,或者更具體一點,計算機產業的每個領域都有一群牛逼的人在搞研究,比如計算機圖形學,計算機視覺,人工智慧等等。

那為什麼我們聽說過很多編譯器和操作系統大牛,而沒有聽說過其他領域的大牛。那是因為只要是程序員,就難以避免和操作系統、編譯器打交道,天長日久,多多少少會了解一些。而如果你不從事計算機圖形學/計算機視覺/人工智慧這些領域,你根本就不會知道這個領域有多少大牛。


普遍性的斷言「A都是B」是無法用枚舉法(有A是B)證明的。你需要用「沒有一個A不是B」來證明普遍性。

但是很明顯對於這個問題,可以舉出無數「A不是B」的反例,所以問題不成立。

做程序員的,這點邏輯都沒有,別人說了還不信,可以考慮換行了。


因為只有深入了解操作系統(虎),編譯器(龍),再加上系統結構(hardware architecture,X_X)才能清晰的分析出程序的性能。才能在腦海中刻畫出程序執行的流程。寫一個程序實現功能容易,寫一個高性能robust的程序難!

至於為啥選擇這些研究,個人角度無非是想弄清楚一個問題:「一個程序如何能在計算機硬體上運行起來的?」。可沒想到tmd為了這個問題我讀了快10年的計算機。。。4年本科,3年碩士,2年博士,目前還在讀,問題。。。。還沒有完全解決!。


並不是牛逼的都需要吧。

但是如果要細緻的控制程序的執行的話,就需要去研究了吧。

如果是提出演算法或者只是研究理論的話,大概是不用的,然而這批人里厲害的也是大有人在呢


可能因為特別喜歡去搞清楚: "為什麼" , 而大家都是跑在操作系統上的....


如果你喜歡開車, 如果身邊好多比你小的人也喜歡開車, 然後還開跟你一樣的車, 你會不會有一種換一輛更瀟洒的車然後漠視他們的慾望.

每天有大量的程序員湧進不管是前端後端各個領域, 我們之前學的東西打磨成熟了結果他們更短時間就學會了. 這個時候你想不想有一種有趣而且有門檻的東西, 別人每天都被那種東西約束著, 你想不想要有一種而你卻能說"你看, 一切如此簡單"的輕鬆?

接著就回到了一樓 big and clean 的問題...


簡單來說,編程和修真是一樣的,要追求世界本源。


牛逼的程序員,不應該研究牛逼嗎?


倖存者偏差。


上層抽象足夠簡潔,底層實現足夠複雜,模塊化程度高,可復用性好。

講真每次寫編譯器和操作系統的時候我都有造高達的感覺,重型機械是男人的浪漫呀!

而且看著一個Well-written的編譯器一層一層地運作,通過Scanner把Pure text變成Token,通過Parser變成Parse Tree,再經過幾個Optimizing Pass變成漂亮的IR,最後Generator一氣呵成生成棒棒的目標代碼,每個部分都銜接的順暢,每個變換都按照預想的發生,簡直要顱內高潮的!

其實不僅僅是編譯器或者操作系統,我覺得寫架構明晰的大型系統,比如資料庫呀,或者軟體渲染器應該都是很爽的體驗。


只有我一個人看到問題之後在考慮多麼牛逼的程序才會研究操作系統和編譯器么。。


編譯器、操作系統、計算機圖形。不是號稱程序員三大浪漫么


山就在那裡。

——探險家,馬洛里


這世界上50%以上的牛逼的程序,其作者都沒怎麼研究過操作系統和編譯器。編譯器就是他們的一把鎚子,一台機床,他們只知道如何造出精緻的工藝品就好了,完全不用知道如何再去造一台機床,一把鎚子。

其實吧,就是知乎上的某些人,其實只會操作系統和編譯器,但是每天就帶領著幾十萬粉絲吹吹吹,跟你們講Computer Science裡面最重要的就是操作系統和編譯器,所以許多小白就信了。但你問他到底寫過多少關於操作系統和編譯器的paper,他估計一篇都沒有。

吹操作系統多牛逼,反正大部分人也寫不出paper來,更造不出比Windows和類Unix的新操作系統出來,這樣方便裝比,反正我說自己厲害就厲害了。但是如果這位胖子說,Computer Vision和Machine Learning是程序員兩大浪漫,別人問你是寫出caffe還是tensorflow,CVPR上發過幾篇paper,他這不就裝不下去了么。


一是因為逼格高,總有那麼一群喜歡造輪子,研究輪子的人,二是知識都是相通的,真正做過才會明白那種恍然大悟的感覺,相比於做業務軟體更能讓人去明白本質的東西


因為對操作系統的研究可以獲得規則之外的許可權,你們說吼不吼?


感覺90%學到的演算法數據結構都來自各種操作系統和編譯器。。。


推薦閱讀:

GNU GCC使用ld鏈接器進行鏈接的完整過程是怎樣的?
VC++ __FUNCTION__的實現原理是什麼?能通過這個拿到整個的函數列表嗎?
做編譯器的人如果遇到了bug,他們怎麼判斷是編譯器自己的問題還是編譯這個編譯器的編譯器的問題?
學習編譯原理只是研究lex和yacc嗎?
sibling call是什麼?

TAG:操作系統 | 編譯器 |