為什么Windows內核比其他系統慢
我曾在 Hacker News 上發表過一篇帖子,解釋為什么 Windows 內核不管是在性能還是在創新方面都比不上 Linux。后來,有一位 Windows NT 內核開發者發文對此進行了回應,承認了這個問題的存在,并解釋了導致這個問題的根源。但因為監管方面的原因,這篇文章被刪掉了。不過,這篇文章意義重大,所以我還是重新把它貼出來。以下是正文。
Windows 在很多方面確實比其他操作系統要慢,而且差距在不斷擴大。導致這個問題的根源是人。Windows 世界的改進不夠純粹,不像 Linux 世界那樣純粹。在 Linux 世界,人們做出一項改進可能僅僅是為了獲得榮耀。
當然,偶爾也會有那么一些人,他們也想把事情做得更好,但幾乎都是以失敗告終。我們確實在某些方面做出了改進,因為那些掌握資源的人相信這些改進影響到了業務目標。但這些工作是徒勞的,我們并沒有正式或非正式的性能改進計劃,我們開始關注安全問題,因為沒有 SP3 的 Windows XP 對業務來說是一個巨大威脅,而性能問題在這個時候顯得微不足道。
通常,系統組件所有者不太喜歡來自其他團隊的補丁。作為開發人員,如果你接受了來自外部的補丁,可能會惹惱你的領導(因為補丁需要維護,導致計劃外的設計變更),讓測試人員不高興(給他們帶來額外的工作量),讓 PM 生氣(進度受影響)。所以,一個團隊通常沒有必要接受來自其他團隊的變更,而且總是可以找到拒絕的理由。
在 Windows 世界,人們幾乎找不到做出改變的源動力。而在 Linux 世界,哪怕是把遍歷文件目錄的性能改進了 5%,也會受到表揚和感謝。在 Windows 世界,如果你不是那個團隊的人,即使你的代碼被接受了,領導們也會不屑一顧。的確,做出一個巨大的改進可以讓你引起高層的注意,這對于你的職業生涯來說是件好事,但這個改進要足夠大,大到可以引起他們的注意。增量式的小改進只會惹人煩,對你的職業生涯并沒有什么好處。如果運氣不好,你跟領導說你為其他系統組件做了性能改進,他可能會反過來問你:如果出了問題,你該怎么辦?
長此以往,人們不再熱心于計劃外的工作,這有什么奇怪的嗎?
導致這種差距的另一個原因是我們無法留住有才華的人。谷歌和其他位于西雅圖的大公司不斷挖墻腳,把我們最好最有經驗的開發人員都挖走了,我們只能從高校招聘年輕的畢業生來替代他們。你會發現,很多輸入系統是初級工程師在維護。這些開發者的出發點是好的,他們也足夠聰明,但他們不理解一些決策的初衷是什么,對系統的工作原理沒有全面的認識,更重要的是,他們不愿意去修改已有的東西。
這些初級開發者傾向于通過實現新的特性來改進系統,而不是在舊有的基礎上做出改變。因為相比修改舊東西,實現新特性可以節省評審時間。
這樣的例子有很多,比如:
- 我們不要去碰命名管道,加個 %INTERNAL_NOTIFICATION_SYSTEM% 吧!
- 我們不能把 %INTERNAL_NOTIFICATION_SYSTEM% 暴露出去,這樣就不用寫文檔了,而且不影響銷售,因為我們只有 90 年代的 Win32 API。
- 我們不要去碰 DCOM,加個 %C#_REMOTING_FLAVOR_OF_THE_WEEK% 吧!
- XNA,這個還用說嗎?
- 怎么會有人需要大于 2G 的文件壓縮格式?
- 我們可以支持符號鏈接,但要確保不會有人用,這樣就不用因為安全漏洞遭受罵名!
- 我們不要去碰 SDX,所以就假裝有四個版本在遷移到 TFS,但實際上什么也沒改變!
- NTFS 代碼使用了全局遞歸鎖和 SEH,太恐怖了,我們需要寫個參考文檔。
- 我們不能實現 C11 支持,在一年內實現可變模板太難了。
看,微軟還是有一些有才華的開發者,他們對操作系統開發的復雜性有著敏銳的洞察力,并對簡潔設計有著獨到的眼光。在某些方面,NT 內核比 Linux 好,但這些有才華的人要么退休,要么去了其他大型的科技公司,替代者很少能夠達到他們的水平。我們的員工要么是朝九晚五有孩子的,要么是迫切希望拿到 H1B 的,要么是被谷歌拒絕的。我們偶爾也會遇到好的人才,但那也只是杯水車薪,難怪我們會落后。
這篇文章的作者以匿名的方式聯系到我,擔心他的文章太過張揚,所以又補充了以下這些內容。
一切都失控了。我太過苛刻了,其實我并沒有打算爆料,只是想抱怨一下。我在寫這篇文章時應該更謹慎一些。我很抱歉,讓你們對微軟內部有了一個錯誤的印象。
首先,我想澄清一下,我之前寫的大部分內容都是半開玩笑的,而且言過其實——NTFS 確實在內部使用了 SEH,但文件系統非常可靠,而且經過了良好的測試。維護人員是我所知道的最有才華和最有經驗的人。我們的其他核心組件也是如此。的確,有一些組件讓更有經驗的人來維護會更好,但我們也并沒有隨便讓不合格的人來做這些工作。
當然,我手里也沒有有關挖墻腳的內部數據,我的觀點帶有主觀性——我看到了一些非常親密的朋友離開了,對新招來的員工也沒有太多印象。我手里沒有全方位的事實和數據。我對人員流動的總體了解可能是錯的,我不應該像之前那樣陳述這件事。
微軟仍然擁有大量的技術人才。我們不會發布沒人維護和理解的代碼,雖然有時候新人需要一段時間才能上手。我可以訪問 Windows 源代碼,偶爾也會提交一些代碼,但除了我以外,還有成千上萬的人也在這么做。我沒有什么特別的。我不是什么爆料者。雖然我個人認為對符號鏈接的限制影響了它的用途,但我們當時確實做了一個合理的工程分析——并不是一個別有用心的家伙試圖避免得到糟糕的評審分數。事實上,這樣的事情幾乎從未發生過。我們幾乎從不單獨做決定,我想強調的是,我們并不瘋狂,也沒有出現功能失調。社會力阻礙了創新,我們應該在文化方面做點什么,但還至于到了崩潰的邊緣。這種負面影響更像是在汽車上安裝了一個不必要的擾流板,遠沒有拆卸發動機那么嚴重。我們的工程部門正常運作,發布可靠、有用的軟件,這些軟件可以在全世界的電腦上運行。不管你怎么看待 Windows 8 的 UI,UI 之下的系統總是堅如磐石,就像 Windows 7 一樣,我很自豪自己參與了整個過程。
我還想為我說過的有關開發部門的事情道歉。我可能對編譯器團隊安排的事項優先級有意見,對為什么某些 C++ 特性需要更長的實現時間感到困惑,但事實是那些優秀的人確實在做工作。他們當然知道什么是依賴循環,我們只不過是世界上僅有的幾個從頭開發優化編譯器的團隊之一。
最后,我遇到了一些很好的人,我覺得自己是某個特殊群體的一部分。如果我認為 Windows 是一個工程噩夢,我就不會在這里說這些了。每個人都有自己的問題,但公司以外的人似乎對我們的問題賦予了特殊的含義。我不明白為什么會這樣。無論如何,之前的文章給那些敬業、努力工作的人抹黑了,我不應該用丑陋的畫筆來刻畫他們。
另外,我對同事們沒有什么意見,我想收回對他們的隨意評判。很多一起工作的同事都很棒,而他們正好有孩子要養。我想說的是,我不喜歡某些人,他們把我們的工作看成是一項工作而不是激情,而且我覺得現在有很多這樣的人。