專訪Jeffrey Richter:Windows 8是微軟的重中之重
Jeffrey Richter 以其多本 Windows 核心技術的經典著作而聞名,同時,他深入掌握微軟的 .NET 等一系列核心技術,他所創辦的 Wintellect 公司與微軟有密切的合作關系,他本人也為微軟的 .NET 框架貢獻良多。
2012年 1 月,Jeffrey Richter 在北京接受了 InfoQ 中文站的專訪,談到 Windows 8 和 WinRT 編程,并就異步編程、Windows 編程中的可擴展性、性能和安全性方面給出自己的建議。
InfoQ:從一開始,Windows 開發基礎知識就一直是您的書的重點。在您看來,哪些最重要、最根本的知識是每個開發人員都應該掌握的?
Jeffrey Richter:我想,了解你的應用構建于其上的系統,這很重要,也令人興奮。內存管理很重要,線程也比較重要,還有錯誤和異常處理,這些都是軟件開發人員每天都要用的東西。如何構建組件,并把這些組件組合在一起,讓它們互相之間互相操作,這些我想都是應該掌握的很重要的理念。當 .NET 剛剛出現的時候,我就是去了解 .NET 里面這些相關的概念。
InfoQ:您與微軟的關系很密切,您是不是曾為微軟工作過?
Jeffrey Richter:我得說我不是微軟的雇員。不過微軟的技術我是用了很多年了,大概從 1980 年開始,到現在有 32 年了吧。我在過去的 20 年一直在給微軟提供咨詢服務。
Windows 8 是微軟的“重中之重”
InfoQ:您如何評論微軟在 Window 8 上的投入?
Jeffrey Richter:過去這幾年,顯而易見的是:人們喜歡移動計算設備。比如 Apple 的 iPhone、iPad,配置了 Android 操作系統的手機等等,人們喜歡這些東西。微軟在這些技術領域是落后了,然而至關重要的一點是:微軟在 Windows 8 上投入巨資,為人們提供微軟技術相關的移動計算設備,讓人們利用自己已有的微軟信息資產。我個人對于 Windows 8 興奮異常,我認為微軟真的在上面做了很多很不錯的東西。從純技術層面講,其中的技術是很有競爭力的。但我也認為還有很多東西需要到位,比如好的硬件廠商、合理硬件的價格,還有基于其上構建的應用等等。還有很長的路要走。不過我認為微軟現在有一個很好的開始。
不能說是整個公司的資源,但這對于微軟來說,確實是重中之重。如果 Windows 8 不能成功,在面對競爭對手時如果敗下陣來,那我想微軟一定會深受其害。
InfoQ:那么這對于開發人員來說意味著什么呢?
Jeffrey Richter:對于開發人員,這等于多了一種移動計算設備的出色選擇,而且是運行微軟操作系統的。對于已經在C#、Visual Basic 等微軟相關技術上投入很多的開發人員,他們知道 Windows 的運行機制,可以把自己已經有的知識應用起來。Windows 8 還支持 HTML 和 JavaScript,掌握這些技術的人也可以利用 Windows 8 來開發應用。
與硬件直接通信是 WinRT 的主要特性
InfoQ:那么說到在 Windows 8 和 WinRT 下的編程,最大的優勢、或者說最重要的特性有哪些?
Jeffrey Richter:WinRT 學習和使用起來都很簡單。它主要的特性,是允許應用直接與底層硬件通信,這不是操作系統做的事情。操作系統是要抽象硬件設備,并把這些抽象提供給應用開發人員。Windows 8 和 WinRT 能夠與很多種硬件通信,包括多種顯示器、鼠標、重力感應計、陀螺儀、鍵盤等等,當然還有觸碰設備,這是它們主要針對的對象。應用開發人員可以使用 WinRT API,與多種不同品牌的硬件通信,這些硬件不久之后就將面市。它們還能讓人們利用已有的、在 Windows 上的很多投資,其中已經內建了文件系統支持、網絡支持。WinRT 的 API 的確簡化了這些方面的操作,讓人們可以用多種語言編程,不像 iOS,只能使用 Objective-C,Android 也主要針對 Java 開發人員。JavaScript 開發人員、C/C++開發人員、.NET 開發人員都可以使用 WinRT。它的編程范式對這些語言的開發人員來說都很簡單。
InfoQ:知道如何開發 .NET 應用的開發人員們是不是也能在 WinRT 下開發?
Jeffrey Richter:當然,開發語言是完全一樣的。C#和 Visual Basic 沒有變化,.NET 的核心部分也是一樣的,對象啊、字符串啊、異常處理啊,這些都一樣。但是在 Metro 應用中,一大部分 .NET 的框架庫不能用了。我要說明的是:Windows 8 同時支持 Metro 應用和以往的應用。微軟主推的是 Metro 應用,也就是在移動設備上的觸碰優先應用。如果開發人員選擇這條路線,他們可以利用自己已有的很多知識,有些庫不能用了,但是可以使用 WinRT 中的庫。
InfoQ:有人說 WinRT 的性能要相對好一些, 那么如何使用 WinRT 開發高性能應用?
Jeffrey Richter:我不確定性能是否是 Window8 和 WinRT 的主要目標。客戶端應用和觸碰應用針對的是消費者,計算設備只要比使用它的人的速度快就好了。我們關心性能的場景,是針對可擴展的服務器端應用。我想說,Metro 應用在 Windows 8 下用起來感覺是快了一些,因為 Window 8 會中止沒有在后臺運行的應用,相關的線程也就不再運行了,所有的計算資源都提供給了前臺運行的應用。用戶會覺得應用的響應很快,微軟用的詞匯是“快速而且流暢”,當你觸碰和滾動屏幕的時候反應快速,隨著你的手指的運動滾動屏幕,沒有延遲感。
InfoQ:與 iPhone 對比呢?
Jeffrey Richter:與 iPhone 對比一下的話,iPhone 在這方面當然做的也不錯,微軟試圖與其競爭。很難說哪個更好或是更快,因為這取決于運行的硬件。Apple 完全控制硬件,微軟選擇與其他硬件廠商合作,自己不做硬件,所以會有很多種硬件。
InfoQ:有些移動開發人員說,要想得到很好的動畫性能表現,就必須要從底層代碼寫起,而不是使用現有的程序庫,那么在 Windows 8 下面是不是也是這樣?
Jeffrey Richter:要說高性能的 Metro 應用,主要應該是游戲了。要是開發游戲,微軟鼓勵大家使用C和 C++ 作為開發語言,并使用 DirectX 支持圖像硬件處理,要說到庫,互聯網上有一些庫,就是用 C++ 開發的。可以直接把這些庫拿過來,集成到自己的應用里,使用其中的物理引擎之類的東西來控制比如飛到空中的球、掉在地上的盒子等等。
InfoQ:那么在 Windows 8 和 WinRT 中使用這些庫不會有兼容性問題嗎?
Jeffrey Richter:對于現有的這些庫是支持的。
創業公司現在就可以開始學習 Window 8
InfoQ:對于創業公司來說,開發人員何時應該擁抱 Window 8 呢?
Jeffrey Richter:我想現在就可以開始學了,我也一直在學。大家現在可以開發一些應用,然后放到應用商店里面去。Window 8 當然也需要一些時間才能起來,現在的目標是在 2 月中旬交付 Beta 版本,正式版可能要在今年年底才能交付。那時可能就有可用的硬件了,消費者到時候就可以買到預裝了 Window 8 的設備,企業和公司的用戶可能還要一到兩年。因此要看你想開發哪些類型的應用。對于創業公司,如果是游戲公司,我覺得現在就是好時機,因為現在市場還很小,沒有多少競爭對手,技術也比較成熟、穩定,這么做應該會不錯的體驗。
InfoQ:那么對于已經使用過去的 .NET 平臺開發了產品的公司呢?
Jeffrey Richter:對他們來說就是個挑戰了。他們也可以不管這些,讓應用直接在 Window 8 上運行,因為 Windows 8 對更早版本的 Windows 應用保證 100% 的向后兼容性。如果出于商業原因,要將應用移植到 Metro 上,這也是他們的決策。如果認為其他人希望拿著移動設備而不是筆記本電腦走來走去,投資開發 Metro 版本的產品也是值得的。不過我覺得這種類型的現在切入就有點早了。
InfoQ:那么 Windows 8 和 Kinect 會有什么聯系嗎?人們都非常喜歡 Kinect。
Jeffrey Richter:Kinect 的 Windows 版本在接下來的一兩個月就會交付了。Windows 8 當然支持,同時還有 SDK,大家現在就可以下載 Beta 版本,使用 Kinect 作為輸入設備,Window 8 會提供完全支持。
異步處理線程對服務器端開發非常重要
InfoQ:您曾經提過,異步處理在服務器端開發中非常重要,能否解釋一下原因?
Jeffrey Richter:從我的經驗看來,很多開發人員沒有認識到:線程是非常寶貴的資源,一個線程一般要占用 1M 內存,通常還要更多。創建和銷毀線程也會占用很多 CPU 資源,當線程要運行時,Windows 還要在它們之間聯系,交換處理線程也會影響性能。很多人在創建服務器端應用時,每當來一個客戶端的請求,他們就會創建一個線程,并用這個線程來處理請求。當這個線程進行某些操作時,比如訪問數據庫這樣的常見場景,或者是跟其他網站對話這樣的常見場景,這個線程和它占用的所有資源就被阻塞了,除非數據庫服務器或是網站服務器有回應,它什么都做不了。如果這段時間內,有更多客戶端請求進入,系統就會不斷創建越來越多的線程,結果就是一個服務擁有很多個線程,占用了很多內存,但是 CPU 使用率非常低,因為處于阻塞的線程們在等待其他服務器或數據庫的回復。因此你的服務很難擴展。如果再進入足夠多客戶端請求,最終會出現異常,導致服務崩潰,再重啟,就無法回復之前那些請求了。
這就是異步處理之所以重要的原因。
其背后的機制是:客戶向服務器發出請求,一個線程開始處理某些東西,當它與另外的數據庫或 web 服務器對話時,我們讓這個線程變成異步的,它就不需要等待另外服務器的回復,線程可以回到線程池,或者處理更多客戶端請求。這就是說,現在服務器上的線程少多了,服務器可以同時處理幾十萬個請求,而只使用少數一些線程。服務器也不會塞滿線程,然后因為內存不足導致崩潰。因此,異步編程至關重要。
然而,在過去,開發人員做異步編程非常困難,因為編程模型不適合,你必須要寫很多回調函數,或者不能使用局部變量做參數,等等限制讓異步編程充滿挑戰。不過,我跟微軟一起工作,知道有個新的特性將會在下個版本的 .NET 中交付,使用對用戶更加友好的編程模型,讓異步編程會簡單許多。
InfoQ:是“async”關鍵字么?
Jeffrey Richter:沒錯。async 在C# 5.0 和下個版本的 Visual Basic 中有,這也借助了我在過去 5 年中使用的技術,是我的 Power Threading 程序庫的一部分,被稱為 AsyncEnumerator。世界上很多人和公司都用過它,也取得了很多成功。現在,微軟把它加入到了 .NET 框架中,我也幫助做了集成。
InfoQ:您能否推薦一些好的異步編程框架?
Jeffrey Richter:我的 Power Threading 程序庫就很棒啊,而且是免費的!:-) 我的 AsyncEnumerator,還有跟它一起使用的 SyncGate,二者一起完成線程異步處理,不會阻塞任何線程。99% 的時候,我會用這兩個庫。SyncGate 是一個讀寫鎖,但是不會阻塞任何線程。有了這兩個,再加上 .NET 4.0 中做并行計算的 Tasks,這就是我每天用的東西。我用 Tasks 完成并行計算,AsyncEnumerator 做異步操作,用 SyncGate 做線程同步,來協調訪問某些資源。從服務器端應用的架構要求來說,這三者已經足夠大部分人完成很多事情了。
不要“過度架構”,不要重新發明安全機制
InfoQ:您能否就 Windows 編程在性能方面提供一些原則和建議?
Jeffrey Richter:我想可擴展性也很重要,現在我做很多服務器端開發,有時候可擴展性要比性能更重要。服務器能否處理 100 個客戶端的請求?1000個客戶端呢?10萬個客戶端呢?一般來說,要想讓某個服務可擴展,你得讓它的性能表現稍微差一點,只能是稍微差一點,性能也非常重要。再次強調,異步編程對于改善可擴展性很重要。
至于其他與性能相關的原則,我總是盡量寫盡可能少、盡可能簡單的代碼,我總是試著不去“過度架構”我的系統。我為其他公司做咨詢的過程中,很多時候,我去看他們的代碼,總是會發現他們存在“過度架構”的現象。很多時候,他們會想:我們猜想這塊兒會很慢,得加入緩存系統,但是他們沒有認識到:緩存會占用很多內存。在 Windows 操作系統中,在內存量和速度上有很緊密的關系。很多人都知道:如果我的系統運行速度慢了,給服務器加更多內存就好了。但是他們沒有想到的是:如果系統占用的內存更少,運行的速度會提高,這也是很重要的。因此我看到很多人使用緩存,往內存里面放很多東西,他們這么做是想讓系統更快,實際上反而更慢了,因為用的內存更多了。但是他們付出的這些額外的努力,構建緩存,測試緩存,修復緩存代碼中的 bug,總的來說,反而讓系統的質量更差了。所以,不要“過度架構”你的系統。
因此,關于性能,還是要讓代碼盡可能簡單,讓代碼工作起來再說。如果性能不好,就用一個 profiler,去看看性能的熱點出現在哪里,找到原因,再去解決問題。
如果有些地方對性能要求真得很高,不妨先寫原生代碼,然后跟其他 C# 代碼放在一起,
InfoQ:那您能不能就安全性方面給些建議?
Jeffrey Richter:對于內存的安全,使用托管語言編程,比如 .NET、Java,這對于防止內存崩潰、堆棧溢出之類的問題非常有幫助,可以事先排除很多現在的安全隱患。原生代碼很容易破壞內存,帶來安全方面的 bug。
除此之外,我建議不要自己再設計一套安全機制,這一向是很糟糕的事情。使用業界已經使用了很長時間,而且經過檢驗的安全機制,比如證書、共享密鑰,也許可以用私有密鑰,類似的算法,已有的哈希算法等等,這些都是好實踐。已經有很多好的書籍和文章記錄這些安全實踐了,還有很多很好的框架,如果是我,一定會把現有的這些安全實踐整合到我的程序里面。
通過寫書,我讓世界變得更美好
InfoQ:大概7、8年前,我也曾是一名 .NET 開發人員,我那時讀過您的《.NET 框架程序設計》,這本書對我幫助很大。現在,您又帶來這兩本新的著作,我想很多中國的 Windows 開發人員也會從中獲益良多。我想知道:驅動您寫出這么多深入而又經典的書籍的,是什么樣的力量?
Jeffrey Richter:我熱愛技術,我自己也喜歡學習這些東西,而且我也喜歡與其他人分享我的發現。這能幫助大家提升工作效率,改善生活質量。我認為,軟件讓我們的生活質量大為提升,做很多事情變得更容易,我帶著我的筆記本電腦到處走,我使用智能手機,用其中的 GPS 導航,搜索東西,這些確實提升了我的生活質量。 通過幫助其他人學習這些東西,他們能構建更多應用,也讓我的生活質量提高了,還有其他人的生活也是。這讓我覺得很受鼓舞,非常受鼓舞,我覺得我能幫助其他人,并以此讓世界變得更美好。
絕對不是為了錢,寫書不能給我帶來多少收入。我在中國遇到很多人,大家對我非常熱情,他們總是在感謝我寫的書,總愿意跟我合影,給他們簽名,我在這里總是覺得很受歡迎。在這里感覺真得很棒。能夠感受到我給他們帶來的影響,我所做的事情影響了他們的生活,這讓我感動得說不出話來。