【位元熊故事匯】6月MVP英雄故事|技術實踐碰撞境界思維

微軟技術棧發表於2022-06-29

位元熊:夏天不能少的一項活動就是追《怪奇物語》了,這季可太好看了,搓搓手等季終結局了。

位元熊:大家看到本期直播的Banner顏色是不是能猜到這次的嘉賓和Visual Studio以及C++有關?沒錯!這次位元熊請到了我們的微軟MVP毛利老師以及英特爾特邀來的專家張銀奎老師!

【位元熊故事匯】作為位元熊直播間的重要欄目,定期請來技術大牛和行業先鋒做客。這裡不僅講最“熱”的技術,還有更多待解鎖的個人故事和趣味話題!請持續關注,更鼓勵大家推薦你想認識的“英雄”。歡迎大家來到直播間,跟位元熊一起,與專家們零距離暢聊

歡迎大家訪問MSLearn學習平臺
與位元熊一起規劃學習路徑,加速進階

image.png


位元熊:在技術分享和MVP英雄故事前,想問問兩位老師在電影或電視劇裡有沒有崇拜或者憧憬的人物?IT圈子裡大家都比較熟悉的靈魂人物也行。

張銀奎:可能和年齡有關,我喜歡的比較偏重中國傳統文化,比如周潤發演的孔子,還有中國歷史上另一位著名思想家——朱熹,可惜朱熹還沒被拍成電影,至少沒有太有名的。

毛利:我個人的偶像是Windows現代核心即Windows NT之父大衛·卡特勒,我非常佩服他,他今年80了,依然在一線崗位進行高強度專案開發。我希望自己也成為這樣的人,能一輩子寫程式碼,把程式碼寫到人生的最後一刻其實也是非常不錯的一件事情,把自己之前開的坑都負責任地填完,算是我的人生理想之一。


位元熊:毛利老師“終身寫程式碼”的決心令人敬佩,毛利老師也是我們的微軟MVP,下面有請毛利老師開始技術分析。

毛利:我今天主要講的是如何使用現代Visual Studio C++ 工具鏈改善實際專案開發中的體驗,今天主要從XAML入手,然後談到UEFI,雖然這兩個名詞跨度有點兒大,但我相信通過接下來的講解可以讓大家非常平順地轉換概念。

去年九月份我建立了一個檔案歸檔工具NanaZip,做這個東西的原因是去年6月份的時候Windows 11釋出了第一個預覽版,然而過了兩個月,我卻還沒看到第三方的適配Windows 11檔案資源管理器新式上下文選單的檔案歸檔工具。我自認為是一個專業的Windows桌面應用開發者,肯定要跟進最新的Windows,但如果我升級到新的平臺,卻在右鍵選單裡沒法用壓縮工具的話,生產力會大幅降低。

於是我8月31號建立了NanaZip這個專案,通過一個月的開發火速上線,在這種情況下幫到了一些人。NanaZip是7-Zip的衍生版,7-Zip本身是一個非常傳統的Windows桌面應用,所以這是一個非常好的例子,講述如何把一個傳統的應用,逐步進行現代化的時候遇到的一些問題以及解決方案。比如我們建立一個Windows應用程式打包專案,試圖去打包的時候大概率會出現找不到你寫的動態連結庫。

主要原因在於Windows應用程式打包專案預設情況下會把你的每一個專案生成的檔案單獨存放在每一個資料夾裡面,這個問題的解決方案比較簡單,在應用程式打包專案配置檔案中上方新增下面的內容即可解決問題。

當我們要對一個傳統桌面應用進行現代化的時候,必然會使用Windows Runtime介面去武裝自己的傳統應用,我們一般推薦使用NuGet 版本。Visual Studio C++專案裡面,NuGet版本用起來挺不方便的。當然,如果你用.NET,就會發現.NET專案裡面是支援Package Reference特性的……如果你希望在使用XAML的情況下,還能使用Visual Studio設計器來時來修改介面的話,為了編譯能夠成功,我們還需要加入以下內容:

詳細資訊可以閱讀NanaZip實戰案例這裡自用的MSBuild的配置裡面的實現。

為了實現NanaZip從 2.0 開始使用XAML Islands進行現代化的承諾,我根據自己的實際情況出發,需要先做兩個專案以探明XAML Islands的邊界,其中一個介面比較簡單的專案是個檔案傳輸工具,即開源的 aria2 前端 NanaGet,我以NanaGet為例子講解如何在 Visual Studio 下較舒適的使用XAML Islands進行開發……為了能夠使用UWP的或者是XAML Islands的現代資原始檔,我們需要引入PRI檔案的生成……


因為現階段Windows App SDK 中的Windows UI Library 3 並不支援和Win32 HWND進行互操作,如果要做的話需要用到非公開且經常變動的介面,但XAML Islands由於可以把 XAML 內容當作一個Win32 HWND 進行操作,於是就沒有這個問題,這也是我目前不使用Windows App SDK而選擇XAML Islands的原因,並且我覺得XAML Islands是一個比較好的一個方案。

張銀奎:今天我想跟大家分享一下我對於軟體除錯技術的經驗和想法。今天元宇宙這個詞很熱,我理解所謂的元宇宙其實就是位元的宇宙,是二進位制的宇宙,位元熊直播間這個名字取得非常好,我們今天其實已經生活在一個位元的世界裡了。這次為了直播呢,我畫了一個很特別的架構圖,模仿了宇宙天體關係圖。宇宙是大的套小的,幾乎無限對吧?軟體世界差不多也是這樣。最下面是硬體世界,比如基於英特爾的x86架構、386486奔騰之類,酷睿之後,英特爾喜歡用美國國家公園的名字來命名新的處理器微架構,比如這個Skylake, Ivy Lake, Tiger Lake, Alder Lake,比較新的第12代就是Alder Lake啊。我很喜歡這個命名方法,讓我們可以展開想象的空間。

硬體世界上就是軟體世界,有韌體——剛才毛利老師提到的UEFI,再往上有虛擬化、雲,Hypervisor (VMM)。那Hypervisor內部又包含虛擬機器內部的Supervisor,就是我們傳統說的作業系統核心,作業系統上面也有環境子系統,比如我們今天的Windows其實也是可以跑Linux的。Windows作業系統裡有傳統的Windows程式,Windows程式裡又細分成.NET和CLR的……今天又有很多容器技術,這個世界任何一個點,深挖起來都非常複雜,剛才毛利老師分享的Visual Studio的一些開發技巧,任何一個點都會讓我們困擾,說搞不定卡在那裡。今天我想給大家講講,如何理解這樣一個紛繁複雜的世界。

我現在給大家展示的是英特爾十一代的Tiger Lake的移動版本,既包含CPU又包含GPU。中間藍色這一塊可以看做是CPU的核,右側是GPU的核心,我在英特爾最後的五年,就在英特爾的GPU團隊。無論是CPU還是GPU,都是個人力量無法對抗的複雜度。遠遠超出個人甚至一個小團隊的控制力,所以需要大規模團隊,大規模團隊還要依賴一些外部條件,整個產業的充分協作,軟硬體的協作。面對這樣一個極其複雜的軟硬世界,對於個人技術的工程師來說,應該怎麼樣看,引用我非常喜愛的朱熹的一句話就是“千頭萬緒,終歸一理”。當我們深入看硬體和軟體的時候,任何一個小的點,都很複雜,在有限的人生不可能完全理解,如何能快速掌握一些規律,才能快速地攻克它,所以要找到“一理”。長話短說,歸納成四個字——上偵錯程式。

我們使用以偵錯程式為核心的除錯工具,來快速穿透到我們想理解的關鍵點。那怎麼來深刻理解它呢?需要很多實踐的體會,才能轉換成我們自己的方法論,我2003年加入英特爾的時候,沒想到會在英特爾做這麼久,一做就是13年。英特爾有太多我捨不得離開的地方,非常寬鬆的工作環境讓我有時間在英特爾工作的時候還能寫一本書,《軟體除錯》第一版有1000多頁, 100多萬字,那幾年在英特爾工作的時候,我晚上基本不加班,所有業餘時間都投入到寫書上來了,《格蠹彙編》也是在英特爾工作期間寫的。

但是想學好除錯技術也不容易,原理加實踐,左一腳右一腳,才可能實現深刻認識軟體的目標。我今年已經50歲,國內很多同行覺得這個年紀已經不適合做技術,但我仍然堅持做技術,大家看桌面就完全還是一個程式設計師的桌面。我這裡開啟一個虛擬機器給大家演示一下……我推薦大家用調製器穿透到你最想理解的那一部分,比如說我現在把核心中斷下來,可以快速理解最關鍵的一些概念,每次停下來大家最先看到的就是所謂的CPU的暫存器上下文,計算機系統遵循一個最基本的原理,就是圖靈所開創的基本原理,它的狀態是有限的。從CPU的角度來說它的有限狀態就直接體現在暫存器上下文,對CPU來說最核心的就是暫存器,我們現在看到的x86經典架構,有一個非常好的優點就是易於學習。它的暫存器數量非常少,如果把同樣的ARM斷下來,你一下子看到30多個暫存器,但是我們經典x86只有8個通用暫存器,加上一個程式指標。

我們現在停的是什麼位置,為什麼在這個位置停下來呢?可以執行K命令看他的執行經過,這是核心裡的一個著名的執行緒,idle程式。我說CPU一上電就要奔跑,要取指令,當沒有指令執行的時候,因為我這個虛擬機器比較空,CPU就會到idle程式裡來打盹,進入一個低功耗狀態。所以我給他一個break那它執行一個著名的int 3指令,中斷調製器接受審查,就可以看到CPU現在很空,在執行idle迴圈。

現在給大家執行一個我寫的軟體,叫“I’m Buggy!”,專門模擬各種錯誤。偵錯程式你可以認為它像一個幽靈,始終監視著我們的計算機系統,計算機系統的任何關鍵事件都會彙報給調製器,這是作業系統核心設計,CPU硬體或者設計整個軟體世界所遵循的一個基本原理。我們今天所謂的電腦科學,其實稱的上科學的東西是不多的,大多數都是細枝末節,各種code,那我們今天能稱的上科學的東西就是圖靈建立的有限狀態機的思想。

我現在模擬一個錯誤,Load一個驅動,著名的空指標。一點空指標立刻斷下來了,因為軟體和硬體一起約定,有些空間是不可以訪問的,比如說地址0,整個0號頁都不可以訪問,整個CPU是在保護模式下執行的,這個時候它有一些潛規則。我剛才故意觸發空指標,核心立刻報警。我們發揮強大的偵錯程式的威力,就可以看到它的來龍去脈,這裡大體看到說是一個叫RealBug的核心模組觸發了空指標。我們也可以u,r命令來看執行的指令的上下文,這是一條x86的mov指令,mov指令就是賦值,直接地址0寫1,是故意的一個空指標。這個一執行CPU報警報給作業系統核心,作業系統核心報給偵錯程式,因為我在除錯,如果不帶偵錯程式就藍屏藍掉了。

剛才我是用虛擬機器給大家做演示,我在實際工作中有大量的除錯裝備,這都是大大小小的x86系統,又分成不同的版本,有的是專門用來除錯Hypervisor,有的是用來調Windows 10、Windows 11的。那稍微歸納一下,我對基礎部分的一個分享,引用王國維的一句話就是“有境界自成高格”……文學作品是有境界的,電視劇也是有境界的,第一個鏡頭就給你境界,到底是硝煙瀰漫,還是綠水青山。軟體也有境界,就像我剛才一個斷點停在那裡,看現在是在核心模式還是使用者模式,是在執行.NET還是在執行Java程式碼,立刻就區分現在CPU在做什麼。所以我們一定要建立這樣的境界思維……要抓住這個境界,進入場景才可以深刻思考。


位元熊:大家知道張老師做技術的時間很長,從業經歷非常豐富,下面有請張老師分享一下自己的創業經歷。

張銀奎:我的創業故事從手邊的一把扇子講起,朱熹做了一個最大的貢獻,就是把我們中國的文化提煉成了四本書,第一本叫《大學》(雖然不是朱熹寫的),只有205個字,一個扇面就可以放下。這把扇子是我創業的團隊做的,做了幾百把,用安徽宣紙。第一句話是“大學之道,在明明德”,“明明德”就是我創業最發自內心的一個想法。我創業的主要做的一個平臺,就是“盛格塾”,目標就是通過這個平臺把網際網路技術傳播出去。

剛才毛利老師也提到,核心之父大衛·卡特勒。他的這張照片大約是兩年前拍的,今年他已經80歲,我非常佩服。他是我現代的人生偶像,通過郵件我感受到過他內心的光明。比如我們看卡特勒這張照片,都有一種力量,80歲高齡的人坐在那裡寫程式碼,和一個80歲的人躺在病床上,給我們的感受是不一樣的。我創業的所有產品都帶著這樣的思想,這是2020年第一批GDK7上面印的這個鍾馗,因為鍾馗專門抓鬼,祛除人間的邪惡,所以我的所有產品上面都是鍾馗的Logo。

GDK7是基於英特爾的DCI技術,可以在沒有軟體偵錯程式的情況下直接從硬體層面把系統中斷下來,找一些流氓軟體、病毒,這種方法非常徹底,任何軟體偵錯程式都可能被流氓軟體所綁架,所以我們這款產品得到國內許多研究安全的同行,尤其是偏底層的同行的喜歡……我們最新在做的“揮碼槍”,是一種更小巧的偵錯程式,適合隨身攜帶。

那創業是否賺錢呢?坦白說我真的不太在乎,所以我現在也沒有用投資,投資人可能會給我壓力,我現在隨心所欲來做自己喜歡做的事情。


位元熊:我們在開篇介紹了毛利老師是一位新晉MVP,請問毛利老師為什麼要加入MVP大家庭呢?

毛利:原因非常簡單,我最早接觸計算機的時候,看的第一本關於Windows的啟蒙書籍就是兩位MVP寫的,他們是彭愛華和劉暉,這本關於《Windows Vista 使用詳解》的書我翻了不下50遍。我一直對他們非常憧憬,也希望有一天能成為MVP。後來我也瞭解到,如果某天不小心進入了微軟,MVP就大概率拿不到了。所以對我來說,越早拿到MVP越好。即使我一不小心進了微軟,至少也有做過MVP的經驗,讓我遺憾少一點,某種程度上是湊個大滿貫的感覺。

張銀奎:我也認識彭老師。盆盆!

位元熊:看起來彭老師很有名啊!希望以後也有機會可以請盆盆老師來我們直播間。


位元熊:之前張老師提到自己喜歡看的電影,比如周潤發的《孔子》,還有毛利老師,據我瞭解您跟張老師的電影“口味”也十分不同!

張銀奎:我很喜歡周潤發演的孔子,這個故事是從孔子人生最輝煌的時刻講起,到他周遊列國遇到各種艱難曲折。裡面有一幕是孔子在講課的時候,有人來搗亂,把大樹砍倒了。還有很有趣的一個細節,孔子去見一位著名的美女南子,這場戲的矛盾衝突非常精彩。無論是人生還是軟體,其實都充滿了矛盾。

毛利:我看電影少一些,一般看美劇或者紀錄片。美劇的話強推《絕命毒師》,老白是一個不折不扣的大反派,但是我從他這邊學到了一件事情。如果有機會去做自己喜歡的事情,那就要儘可能去做。我還想推薦一個紀錄片系列,叫《巔峰拍檔》(Top Gear),BBC講汽車的節目。我從他們的表現中,看到了對汽車的熱愛。我大學的時候,學的是汽車專業,但是我對汽車一點興趣都沒有。即使是這樣的我,也喜歡看這個節目。如果一個人對自己的事業真的熱愛的話,也能吸引其他原本對這件事情一點興趣都沒有的人。

位元熊:通過一個節目喜歡上了原本不太感興趣的領域,如此有魅力的紀錄片位元熊也要看看!

位元熊有話說

本期位元熊請來了從事Windows桌面開發的微軟新晉MVP——毛利,還有擅長運用除錯工具的英特爾特邀大來賓——張銀奎!毛利長期應用C++做一些開發,所以他用例項分享了用 Visual Studio 開發 UEFI 應用程式和XAML Islands C++ 開發方面的一些使用技巧,也給我們大方地看了自己寫的“傢伙們”! 而張銀奎老師有著多年行業經歷和感悟,以特別“形象”的示意圖講解開場,應用很多有趣的舉例,高飽和度暢談了軟體除錯技術的多重價值。

兩位嘉賓雖然在年齡和經歷上都有一定“距離”,但是他們共同的偶像——NT 核心之父David Cutler,一直鼓勵著他們追尋著自己“終身寫程式碼”的夢想!位元熊還了解到毛利老師從2014年就投身開源(當時還是在校生),直到現在開源熱情沒有減,我們可以看到他做了很多事情,以他的話來說“填好坑”。在直播時還有很多毛利老師的“粉絲”和朋友持續支援,整場直播充滿了積極溝通的氛圍。張銀奎老師推崇孔子、朱熹等文化名人,用其思想指導實踐,在直播中引經據典,讓位元熊在技術學習之餘也享受了一場文化之旅。張銀奎老師在工作之餘種種田,而毛利老師喜歡騎著單車四處逛,觀察他所生活的城市。即使兩位經歷和習慣如此不同,但談到技術,兩位對於自己喜歡的事業不惜力的付出和探索是高度一致的。位元熊也希望大家可以在自己喜歡的領域沒有遺憾地追尋自己的夢想並享受這個過程!


位元熊與各位的消夏聚會告一段落啦!歡迎夥伴們把你想說的話告訴位元熊,可能會收到意想不到的驚喜回覆哦!

Attention Pls!月末還有大事件!

滿心歡喜,敬請期待!

點選重溫本次直播

相關文章