上圖爲本文的做者 Sasha Goldshtein,他是 SELA Group 公司的首席技術官,他是 Microsoft C# MVP(最有價值技術人員),是《Introducing Windows 7 for Developers》 (Microsoft Press 出版, 2009) 和 《Pro .NET Performance》 (Apress 出版, 2012) 兩書的做者。他是一位多產的博客做家,是大量的培訓教程的做者,內容包括並行編程、Windows Internals, .NET Debugging, 和 .NET 性能等。他的顧問工做主要圍繞分佈式架構和高性能系統。編程
我發現,對我來講,使用一種新語言,新技術,新框架,最讓我有壓力的事情是,我在使用它們時不能徹底明白它們的實現原理。我每週都要閱讀數百篇關於討論 諸如各類 JavaScript 擴展、新的 iOS 應用框架,新的基於 Windows Azure 的 SaaS 等的博客文章。很顯然,若是隻是使用一些技術或採用一種框架來知足需求,這對於我一般不是很難的事情。問題是,若是我並不理解一個東西的工做原理或實現方 法,我不能把它納入我已經掌握的知識。這也是「Not Invented Here (非我造不用)」毛病的一種表現吧,不一樣的是我並非想真正的寫出我本身的框架;我只是想作到我有能力寫出它們。下面是我最近的一些例子。架構
2011 年底,我開始學習 Node.js,2012 年間,我基於 Node、Express 以及其它不少 Node 模塊,實現了數個私人或商業產品。我開始使用 Node 時很是猶豫,直到我徹底掌握了它的基本原理——事件循環,異步無處不在的屬性——這使我掌握瞭如何實現「相似 Node」之類東西的知識。有一段時間我甚至想寫利用新的 C# 提供的 async/await 實現一個 Node 相似的 HTTP 框架,但最後放棄了,由於網上像這樣的東西不少,好比 ASP.NET MVC 控制器等,只是不通用。框架
還有一個事情就是,某種程度是,我仍然有點「恐懼」WPF (Windows 用戶界面框架)。我談不上是特別喜歡客戶端開發,但從感覺層面上,從各類表現上,WPF 是一種比 XAML 更有吸引力的框架。並非說 WPF 很複雜難用:我理解它的一些基本實現原理,好比數據綁定,風格,資源,以及數據模板,這些足夠讓我實現簡單的桌面應用或簡單的 Windows 8 和 Window Phone 應用。是 WPF 的深度和廣度讓我困惑:我如今的作法是不是最好的作法?這些 XAML 表達式到底是如何在這樣的數據環境和屬性依賴條件下工做的?是否我應該把這段代碼放到一個單獨的動做或控制裏?…我不是沒努力過:我至少讀了 3 本關於 WPF 的書,總頁數超過 1500 頁,但它們並無給我多大幫助。結果是,在潛意識裏,我儘可能避免基於 XAML 的框架,由於我不知道如何實現它。而好笑的是,我對一些「輕量級」的客戶端技術,包括 MFC,Windows Forms,Android,以及 iOS,都很是有信心,而對於 XAML,對於它的那些相對高級的東西,已經在個人內心留下了畏懼的條件反射。異步
說一些我感到很是有自信的東西,我對那些利用反射技術的東西,從序列化校驗到代碼生成,我都感受很輕鬆。這些屬性,這些反射,10 年前當我作一個大 .NET 項目時就根深於個人腦子裏,從那時起它們對於我就是一個很是強大的工具。我想這歸功於我能理解它們這些對象如何存放在內存裏,知道 .NET 的原信息是如何組織的。事實上,我差很少同時也就對其餘語言和框架裏的反射機制很清楚了:例如,當我在開發非官方的 Adnroid SDK 時,第一直覺就是想寫本身的 JSON 序列化工具,而不是利用第三方類庫。以後雖然證實這並非最好的作法,但我可以在 2 小時內讓個人程序支持全部類型的 WAMS 要求。async
最後一個例子,我對新語言有很大的心理壓力,尤爲是當這種語言不僅是從一種語言編譯成另一種語言。換言之,我對像 TypeScript 或 CoffeeScript 這類語言沒壓力,我能夠清楚了理解這種原代碼如何編譯成 JavaScript,如何一種新語法變成同種功能語法的一種簡寫。可是,對於一些「新物種」語言,例如 Objective C,引發我腦海裏一大堆問號。並非它的括弧語義給我形成麻煩,而是這種語言的原理,「how」。Objective C 語言的對象是如何分配內存的?方法是如何調度的?若是方法能夠被過載,還能經過名稱進行動態調度嗎?編譯器是如何動態管理內存的?(沒錯,引用數計數—— 但問題遠比這幾個字複雜)。一樣的事情也發生在 Python 這樣的語言上:我可使用 Python 開發腳本,編寫模塊,甚至和C語法風格的 DLL 交互,但我對這種動態語言裏如何存放一個屬性,如何類型化,沒有一個清晰的畫面。分佈式
做爲總結,我但願全部的教材都提供一個「工做原理」的章節,來告訴我我如何能實現這種語言、技術和框架——我本身。至此,我但願這篇文章解釋清楚了我爲 什麼喜歡對技術原理刨根問底、喜歡本身去實現它們。歸根結底的緣由是,我喜歡對系統、框架、語言作全面的理解;也許我只須要對某個系統修改一個 bug 或作性能調優,但最終結果是,我要去知道它是如何運行的,不然,它會變成個人一個心病,拖得越久我會越痛苦。wordpress