這位知乎大佬,初中就開始學(xué)編程,大學(xué)畢業(yè)后直接進(jìn)微軟...
點(diǎn)擊上方“大魚機(jī)器人”,選擇“置頂/星標(biāo)公眾號”
福利干貨,第一時間送達(dá)!
來源:vczh dwz.cn/sWwZoQEl
-
中學(xué) -
大學(xué) -
實(shí)習(xí) -
轉(zhuǎn)正 -
Microsoft SQL Server -
跳槽 -
Microsoft Research Asia -
出國 -
Microsoft Office -
尾聲
vczh,本名陳梓瀚,因知乎的個人信息介紹上寫有“專業(yè)造輪子”,所以江湖人稱“輪子哥”。vczh大學(xué)時代就在微軟實(shí)習(xí),畢業(yè)后即加入微軟。開始時是在微軟上海,后來進(jìn)入北京的微軟亞洲研究院?,F(xiàn)已移居美國西雅圖,在Office組做工程師。
以下是輪子哥帶來的技術(shù)貼:
以前經(jīng)常有人問我,要怎么樣才可以去微軟。其實(shí)我從來沒有想過這個問題,所以那個時候的答案自然就是微軟的廣告(編程好,數(shù)學(xué)好,態(tài)度好)了。09 年大四那會兒,剛好碰上了美帝的次貸危機(jī),令我們這些想去美帝的公司被剝削的這幫人倍感艱辛。
所幸后來還是過五關(guān)斬六將,最后在實(shí)習(xí)結(jié)束之后成功留了下來。這其中的因果,顯然不是面試的那幾天所能夠決定的,因此還得從 hello world 講起。
中學(xué)
我有幸從初二開始就學(xué)習(xí)編程。那個時候世界已經(jīng)處于一個現(xiàn)代化的程度了,操作系統(tǒng)都有虛擬內(nèi)存,有圖形界面,有因特網(wǎng),開發(fā)軟件還有集成開發(fā)環(huán)境可用,跟一些老前輩所描述的編譯一個程序還要換幾次磁盤的日子已經(jīng)完全不一樣了。
那個時候正值購買電腦半年,處于看見什么東西都感到十分好奇的時候,再加上父親那個時候不太同意我玩游戲,所以我就在想什么時候也自己做幾個游戲,就可以光明正大地玩了。所以在聽到汕頭華僑中學(xué)開 Visual Basic 5.0 的課的時候,感到比較興奮。但是其興奮程度比起初一為了上第一節(jié)電腦課興奮過度,騎自行車超速以至于流了一大堆血沒了幾顆牙的那一天,已經(jīng)可以忽略了。
那個時候還是 21 世紀(jì)的第一年,正處于上網(wǎng)費(fèi)用巨貴無比、Google 還剛起來沒多久基本沒人知道的時候,學(xué)習(xí)編程要比現(xiàn)在困難很多。當(dāng)時想尋找什么知識,因特網(wǎng)基本上是沒什么指望的,所以我就有了一個沒事去書店的愛好。
沒過多久我就找到了一本《Visual Studio高級圖形程序設(shè)計(jì)教程》。這本書我很喜歡,插圖十分漂亮,而且還是使用 Visual Basic 編程繪制的,更是愛不釋手??上?nèi)容過于高深,所以后來就有了初三的時候自學(xué)學(xué)會初步的立體解析幾何,以及高三上課不聽講僅憑自己看數(shù)學(xué)分析后來還被我看明白了的故事。
中間因?yàn)樵噲D使用編程繪制很多復(fù)雜的圖形和對圖像進(jìn)行各種復(fù)雜的變換,于是每當(dāng)寫程序之前都要在紙上推導(dǎo)長長的公式。如果程序的運(yùn)行結(jié)果不對了,根本無從調(diào)試,只好重新推導(dǎo),借以希望可以發(fā)現(xiàn)公式的幾個 bug 以解釋為什么會出現(xiàn)錯誤。
從此以后我對符號運(yùn)算就十分拿手。而且做數(shù)學(xué)物理作業(yè)也好,為了編程推導(dǎo)公式也好,需要計(jì)算的東西太多懶得到處尋找廢紙,從而便獲得了心算復(fù)雜過程的本領(lǐng)(可惜現(xiàn)在已經(jīng)喪失了)。這順帶還給我?guī)砹艘粋€好處,就是高考數(shù)學(xué)選擇題在發(fā)卷后不許動筆的 10 分鐘內(nèi)就被我全部心算出答案,而且全對了。
圖形編程做久了,就想起了當(dāng)初的理想,于是就搞游戲去了。那會兒看到了成都金點(diǎn)工作組開發(fā)的《圣劍英雄傳》,點(diǎn)燃了我開發(fā) RPG 的熱情。在經(jīng)歷了幾次失敗之后,我終于在高二的正月初一那一天完成了《天地傳》的所有編碼工作,沒過多久就上傳到了 GameRes 的網(wǎng)站上。
這是我第一個行數(shù)過萬的程序。為了順利完成它,我悟到了很多道理,包括為什么要面向?qū)ο?,為什么要劃分模塊減少互相依賴。這也成為我后來開發(fā)自繪圖形界面和腳本引擎的契機(jī)。后來我試圖用 OpenGL 做 3D 游戲,但是由于很難找到有共同愛好的美工跟我一起做,便作罷了。但是這卻讓我獲得了很多時間,可以投入到圖形界面和腳本引擎之中去。
后來我就萌發(fā)了解釋高級語言的想法。這是我整個編程歷史上的第一個轉(zhuǎn)折點(diǎn)。那個時候我數(shù)據(jù)結(jié)構(gòu)只會用鏈表,而且編譯原理也好,設(shè)計(jì)模式也好,都還沒聽過。那個時候去解釋高級語言自然是比較困難的。因此我經(jīng)過很多天的苦思冥想自己想出了一個如今稱之為一遍編譯(也就是很爛)的方法來把一個簡單的高級語言重新處理成一個簡單的指令集語言,就跟匯編長得差不多。
那個時候已經(jīng)高三了,所以其實(shí)也沒多少時間可以投入在編程上面,因此做出來的第一個原型是一個簡化后的 Pascal 的解釋器,用 Delphi 開發(fā)的。現(xiàn)在想起來,里面肯定有巨多內(nèi)存泄露和性能問題,不過當(dāng)時根本不知道這些東西是什么。在高中畢業(yè)之后的三個月無所事事的日子里,我就重新把這個東西設(shè)計(jì)了一遍,得到了一個幾十頁的計(jì)劃。由于后來沒來得及做完,就打印出來帶去了華南理工大學(xué)。
大學(xué)
剛進(jìn)了大學(xué)沒幾天,就聽一個大四的師姐說我們的班主任陳健老師是教編譯原理的,于是我就把這一疊紙拿給了她看。她什么也沒說(現(xiàn)在回想起來,只能是那一份設(shè)計(jì)實(shí)在是不堪入目……),就給了我一本編譯原理的課本。我很快就看完了,然后用了里面的知識做了第一個真正意義上的腳本引擎,語法山寨了 Java 語言的一些簡單的部分,還添加了一個編譯的時候自動把模板參數(shù)都改成 Object 類型的語法,起了個名字叫 Jove。后來上了 Java 的課,發(fā)現(xiàn) Java 竟然真的這么干了,讓我覺得好生奇怪。
后來我陸陸續(xù)續(xù)寫了很多腳本引擎。大一的時候做的 Jove 是第一個我覺得還能見人的腳本引擎。第二個就是大二失敗了一整年吸取了很多教訓(xùn)之后,于大三開發(fā)出的動態(tài)語言,名字叫 Free(可以在我的博客 http://www.cppblog.com/vczh 上找到)。最近正在打算將其更新到 3.0 來配合一個正在開發(fā)中的顯卡加速的 GUI 類庫 GacUI。接下來就是在去微軟上海的 WCFTools 組實(shí)習(xí)的那一段時間里面,利用每天晚上的時間完成的一門純函數(shù)式語言叫 KernelFP,這后來成為了我的畢業(yè)設(shè)計(jì)。
提交了畢業(yè)設(shè)計(jì)之后,我又在畢業(yè)前的幾個月時間里面完成了 CMinus。這不是編譯原理課程設(shè)計(jì)上的那個簡單到?jīng)]法再簡單的 CMinus,而是一個完整的 C 語言編譯器(其中函數(shù)指針的語法被我改掉了,但是仍然支持)。其編譯結(jié)果是保存到內(nèi)存中的一段 X86 二進(jìn)制代碼,可以將函數(shù)的起始地址強(qiáng)制轉(zhuǎn)換成函數(shù)指針直接在 C++ 程序中使用,這是因?yàn)槲以谏芍噶畹臅r候遵守了 Visual C++ 中的一些在 MSDN 里描述得很清楚的約定。
畢業(yè)后我又雄心勃勃地做了 NativeX,是一個帶泛型以及 concept mapping 的 C 語言。前幾個月我又試圖山寨 C#,但是無奈 C# 實(shí)在是太復(fù)雜,所以轉(zhuǎn)而去做 GacUI。圖形界面(GUI)類庫我也寫了不少。繼高中的時候?yàn)?RPG 而開發(fā)的兩個控件類庫之后,在上大學(xué)的過程中使用 OpenGL 開發(fā)的兩次 GUI 類庫均告失敗。后來還封裝了一次 Windows 的 API(Vczh GUI),試圖讓其易用性接近 VCL 或 WinForm。
畢業(yè)后我又嘗試發(fā)了若干次基于渲染的 GUI,換了幾次架構(gòu),一直到現(xiàn)在正在開發(fā)的 GacUI 才感覺走上了正軌。我在這個過程中得到的一個結(jié)論就是:Windows Presentation Foundation 的設(shè)計(jì)實(shí)在是太完美了……在做這些東西之余,我還開發(fā)了三次三維物體的軟件渲染程序,前兩個是在畢業(yè)前做的,最后一個是一年前因?yàn)橐幌伦硬恢酪绾卫脴I(yè)余時間來充實(shí)生活而開發(fā)出來的,目的是用于打發(fā)時間。
在這里我想可以回答一個月前不能很好地回答師弟師妹們的一個問題了。如何能夠在微軟找到工作?因?yàn)槲野盐疑厦孀龅倪@些東西都寫進(jìn)了簡歷。同時如果你們到了大四才來問這個,就已經(jīng)太遲了……
值得一提的是,我從大三開始指導(dǎo)一名基礎(chǔ)幾乎是零的、比我低兩個年級的軟件學(xué)院的一位學(xué)生學(xué)習(xí)編程。為了讓對方在接受我為期 3 年的訓(xùn)練之后有扎實(shí)的 C++ 基礎(chǔ)、熟練的單元測試編寫水平以及能夠靠直覺給出一些不算太差的設(shè)計(jì),我回顧了許多關(guān)于 C++ 的內(nèi)容,特別是給指針的幾節(jié)課備課了好幾天,并且每一天都要出一個作業(yè)。
在這個過程中我深刻的感覺到,如果要快速提高自己的編程水平的話,你必須總是去做一些你做得出來,但是難度大到只要再難一點(diǎn)點(diǎn)你就做不出來的事情。再這么堅(jiān)持好些年之后,肯定會進(jìn)入高手的行列。
因此我在安排作業(yè)的過程中,有意推遲了關(guān)于指針的內(nèi)容。首先讓對方接受變量和分支循環(huán),然后要養(yǎng)成一個好的風(fēng)格(譬如說不能老是用一個字母給變量命名之類),然后學(xué)會操作數(shù)組,接下來才是關(guān)于沒有強(qiáng)制類型轉(zhuǎn)換的指針的一些操作,并且在一個月之內(nèi)做出一個帶單元測試的字符串類。指針的重點(diǎn)是要對方深刻的理解,“指針本身就是一個指向位置的數(shù)字”這么一個概念。
為此我特別設(shè)計(jì)(但沒有實(shí)現(xiàn))了一門只帶有一個全局無限長數(shù)組的匯編語言來講述指針背后一些復(fù)雜的概念。之后就是一些關(guān)于面向?qū)ο蟮闹R、設(shè)計(jì)模式的知識、還有跟腳本引擎有關(guān)的一些東西。
該學(xué)生的畢業(yè)設(shè)計(jì)是一個簡單的動態(tài)語言的腳本引擎,并且該腳本引擎的實(shí)現(xiàn)正確地運(yùn)行了我在上面模仿 Linq 的一個列表處理函數(shù)庫。這個實(shí)現(xiàn)閉包一層套一層,到處都在給一個物體添加刪除函數(shù),創(chuàng)建各種延遲執(zhí)行的迭代器,很是能夠考驗(yàn)一個腳本引擎的實(shí)現(xiàn)。對方畢業(yè)后被網(wǎng)易招去了,并且在待遇上給予了一些人文關(guān)懷。
自己的編程歷程不僅包括自己在業(yè)余時間內(nèi)做的這些程序,而且也包括在微軟實(shí)習(xí)和工作的過程。高中的時候就聽說了華南理工大學(xué)有微軟俱樂部的事情,再加上自己對微軟也持有一定的向往,因此在入學(xué)之后,除了學(xué)院的學(xué)生會以外,我就一直在密切關(guān)注著微軟俱樂部的招新,并且忽略其它所有社團(tuán)。不過說實(shí)話在學(xué)生會和微軟俱樂部的工作也純屬打醬油,沒干過什么正事兒。
大二的時候微軟搜索技術(shù)中心(STC)來微軟俱樂部收簡歷的時候,我在路上碰到了陳健老師,也就是之前提到的班主任,就跟她說了這個事情。后來由于對方說我年齡太小而作罷,因?yàn)槠渌巳慷际茄芯可5搅舜笕臅r候,陳健老師就跟我提到她可以找老同學(xué)幫我投微軟的實(shí)習(xí)簡歷,因此我于 2008 年 3 月份接到了微軟上海的電話面試。
電話面試有兩次,第一次對方是一位 HR,第二次則是一位軟件工程師。在第二次電話面試的過程中,我們聊了上面提到的 Free,還針對一些數(shù)據(jù)結(jié)構(gòu)和框架設(shè)計(jì)的問題進(jìn)行了熱情洋溢的討論。沒過幾天,我就收到了面試通知,前往上海閔行區(qū)的紫竹數(shù)碼信息港面試。那是我人生中的第一次面試。
實(shí) 習(xí)
微軟的面試安排精確到秒,這跟某些公司比起來要人性化許多,不會動輒浪費(fèi)別人數(shù)個小時的時間。實(shí)習(xí)的面試一共有三輪,對話全部使用英語,盡管里面只有一個是外國人。我還依稀記得被那個年輕的老外面試的時候由于過于緊張,而導(dǎo)致一道簡單的問題沒有給出最優(yōu)解的事情。不過他們最終還是讓我進(jìn)入微軟位于上海的一個 WCF Tools 小組實(shí)習(xí)。
這個小組有一位讓我十分尊敬的軟件開發(fā)主管葛子昂先生。葛先生是一位熱愛敏捷并且經(jīng)常投身于實(shí)踐中的人。他在我長達(dá) 4.5 個月的實(shí)習(xí)過程中,教給了我很多軟件工程上的東西,而其中最重要的、讓我受益匪淺的則是關(guān)于單元測試的內(nèi)容。
除此之外,我也體驗(yàn)了快速迭代、Scrum 會議、結(jié)對編程以及基于源代碼版本管理系統(tǒng)(我們使用的是 TFS)進(jìn)行多人協(xié)作開發(fā)的流程。在經(jīng)歷了為 TechEd 大會修改 PetShop 制作 WCF的Demo、為 Visual Studio 2010 的 WCF 開發(fā)工具修 bug 和開發(fā)一個具有高度可擴(kuò)展性的配置文件編輯器之后,我于 2008 年 12 月份結(jié)束了在微軟的實(shí)習(xí)。經(jīng)過了這次實(shí)習(xí),我對源代碼的掌控能力也得到了提高,并且直接體現(xiàn)在我利用業(yè)余時間開發(fā)的項(xiàng)目的代碼質(zhì)量上。
轉(zhuǎn) 正
在實(shí)習(xí)結(jié)束之前,我獲得了一次面試全職員工(FTE)的機(jī)會。當(dāng)時形勢十分嚴(yán)峻。2008 年美國的次貸危機(jī)于 10 月份正式影響微軟上海,公司在那一段時間決定減少全職員工的招聘數(shù)量。而我是 11 月份進(jìn)行轉(zhuǎn)正的面試,結(jié)果這件事情令我十分緊張。后來葛先生表示他的個人建議是希望我畢業(yè)后留下來繼續(xù)工作,讓我吃了一顆定心丸。
實(shí)習(xí)生轉(zhuǎn)全職員工的面試一共有五輪。其中令我印象非常深刻的是有一輪的面試官問了我很多非常復(fù)雜的問題,最后還考了我一道關(guān)于線索二叉樹在線更新的問題,不過我已經(jīng)記不清楚具體是什么內(nèi)容了。我只記得我花了很長時間終于想到了一個正確的算法之后,時間就結(jié)束了,根本來不及在白板上寫代碼。后來我終于通過了面試,少數(shù)的幾個名額里面終于被我拿走了一個。不過聽說幾個月后限制開始放寬,沒有我面試的時候那么困難了。
在實(shí)習(xí)和面試的過程中,我覺得華南理工大學(xué)軟件學(xué)院開設(shè)的很多課程其實(shí)都是十分有用的,特別是關(guān)于數(shù)據(jù)結(jié)構(gòu)、設(shè)計(jì)模式和軟件測試的內(nèi)容。這些都是在工作中十分有用的知識,并且也需要在今后的工作中繼續(xù)積累這些東西的經(jīng)驗(yàn)。只不過因?yàn)閷W(xué)院學(xué)生人數(shù)眾多,而一個新的學(xué)院總是免不了缺乏一些師資力量,所以我有很多同學(xué)都表示很難體會到課本中所提到內(nèi)容的作用。想必如今應(yīng)該比我們那幾年要改善許多了。
Microsoft SQL Server
面試結(jié)束到獲得 offer 中間隔了幾十天,最后HR的通知在除夕的那一天終于到來了。之后的半年時間我就在學(xué)校里面繼續(xù)做自己的事情,偶爾參加幾個活動介紹經(jīng)驗(yàn)等等,還有就是跟一些人出去游玩。畢業(yè)后動身前往上海微軟。中間發(fā)生了一些事情,因?yàn)槊~變動的問題,我雖然拿的是WCF Tools的offer,但是最后卻被安排到SQL Server組,在此之前我并沒有收到通知。由于我比較不喜歡數(shù)據(jù)庫,對SQL Server了解很淺,所以我做了一年半的SQL Server Management Studio(也就是傳說中的“界面”)的開發(fā)。
在這期間我跟同事們傳播了一些關(guān)于單元測試、界面開發(fā)、設(shè)計(jì)模式、Linq和語法分析器的知識。
這一年半的經(jīng)歷讓我成長了許多,主要是比起實(shí)習(xí),正式工作的時候總是免不了經(jīng)常要跟別的團(tuán)隊(duì)、公司、民族、國家和物種進(jìn)行熱情洋溢的廣泛交流,而且還占用了不少的時間。
有些時候還要坐飛機(jī)前往美帝,感受一下社會主義的優(yōu)越性。正式軟件的界面部分十分復(fù)雜,不僅要在操作系統(tǒng)的 DPI 變動以及本地化(大部分內(nèi)容是把界面上的文字翻譯成別的語言)的過程中界面的布局需要自動調(diào)整,以便不讓一些文字或者按鈕只顯示一半,還要照顧各式各樣的殘疾人(特別是失去視力的人群),并且對于某些自繪的復(fù)雜內(nèi)容還要提供一些運(yùn)行時的接口,使得自動測試團(tuán)隊(duì)可以完成他們的工作。
這個經(jīng)歷讓我感受到了開發(fā)一個嚴(yán)謹(jǐn)?shù)慕缑媸嵌嗝吹夭蝗菀?。另一個感受是關(guān)于需求變更的。
設(shè)計(jì)模式的存在就是為了抵御需求變更,這個真理我直到工作之后才能明白。你必須把一個軟件的架構(gòu)設(shè)計(jì)得如此之好,才能在需求大規(guī)模變更之后,還能在整體上讓你的代碼是漂亮的、易于修改的、高性能的、并且是安全的。
每一次改動都不能是打補(bǔ)丁,你總是需要重構(gòu)來使得你的代碼在任何一刻都在整體上是好的。為了達(dá)到這個目標(biāo),就需要熟練掌握并使用設(shè)計(jì)模式來開發(fā)項(xiàng)目。
微軟的跟別的公司比起來罕有一個好處就是他會給你很多時間,讓你慢慢把軟件做好。而這個好的定義,當(dāng)然是以功能和可維護(hù)性為重點(diǎn)。倘若一段代碼以非常精妙的方法來高速完成一個任務(wù),但是卻復(fù)雜到哪怕寫遍了注釋也不能讓后續(xù)維護(hù)的人看懂的話,那這段代碼是沒有實(shí)用價(jià)值的。一段好的代碼,不在于它的設(shè)計(jì)有多么巧妙,不在于它的算法有多么高深,而在于它可以被幾千個人同時開發(fā) 10 年,并且在持續(xù)添加功能的過程中,不會因?yàn)檫^于混亂而導(dǎo)致出現(xiàn)了重寫的需要。
跳槽
后來我因?yàn)橐恍┰蛏暾埩说轿④泚喼扪芯吭海∕SRA)的人事調(diào)動。2011年1月份我在獲得了經(jīng)理的批準(zhǔn)之后,從上海前往北京參加研究院的面試。這一次面試仍然有五輪。這次面試很難,其中一個面試官因?yàn)樵谖业暮啔v上發(fā)現(xiàn)了很多跟編譯器有關(guān)的東西之后,決定讓我實(shí)現(xiàn)一個 strncpy 函數(shù),要求是 CPU 對內(nèi)存的訪問次數(shù)要最少。這包含了很多諸如帶寬、對齊和二進(jìn)制字節(jié)位移操作等各種問題。方法本身就已經(jīng)很繁瑣,再加上紙上寫代碼總是免不了要犯錯誤,所以我依然沒有時間把整個程序?qū)懲?。另一個面試官老外在年輕的時候也做過一些編譯器的事情,讓我出乎意料的是他在面試的過程中沒有跟我出題目,反而就編譯器的各種算法和問題聊了整整一個小時,基本上我會的知識全部都因?yàn)橐卮饐栴}而說了出來。之后我跟這個人產(chǎn)生了深厚的友誼。
不久之后我就獲得了調(diào)動的批準(zhǔn)。在做了一些包括給上海的SQL Server團(tuán)隊(duì)建立單元測試標(biāo)準(zhǔn)之類的收尾工作之后,我于2011年的4月份前往北京,正式成為微軟亞洲研究院的一員,做一些跟分布式系統(tǒng)相關(guān)的研究。
Microsoft Research Asia
研究院的工作比較特殊,主要是由于我沒有加入什么長期的項(xiàng)目,都是跟著幾個 Researcher 干活。第一個項(xiàng)目做的主要是一個動態(tài)分析的項(xiàng)目,判斷一個C/S架構(gòu)的程序會不會死鎖,以及給出一些報(bào)告,幫助程序員弄明白問題的根源,進(jìn)一步修改調(diào)試自己的程序。后來就跟著他們做了一下圖像搜索引擎、分布式圖數(shù)據(jù)庫,臨走前幫他們做了幾個爬蟲來充實(shí)微軟自己的 knowledge graph 項(xiàng)目的數(shù)據(jù)等等。
在研究院的這幾年,其實(shí)除了增長了一些技術(shù)上的見識,和學(xué)會了如何成為一個老油條以外,技術(shù)上主要的成長仍然來源于自己開發(fā)的 項(xiàng)目。研究院的結(jié)構(gòu)是非常適合我這種喜歡把玩復(fù)雜(但不一定是新)技術(shù)程序員的。而且我在研究院的直屬老板還是鄒欣,讓我深刻的明白了一位好的領(lǐng)導(dǎo)是多么的重要。
已經(jīng)寫了四年半了。寫 GacUI 的初衷是,想給自己的語言做 IDE,但是只有 C++ 寫parser才寫的爽,之前又試驗(yàn)過 C# 寫 UI,C++ 寫智能提示算法的項(xiàng)目。
后來我干脆就想,要是整個都能用 C++ 來寫多好啊。但是 C++ 的 GUI 庫對 MVVM 的支持都是垃圾,于是就有了 GacUI。但是做一個 GUI 庫工作量實(shí)在是有點(diǎn)大,我又追求要有良好的開發(fā)體驗(yàn),因此就做了這么久。今年應(yīng)該可以出 1.0 了……
通過開發(fā) GacUI,不僅理順了之前那么多年做的 7 個天國的 GUI 庫的經(jīng)驗(yàn)教訓(xùn),還學(xué)會了如何最小代價(jià)開發(fā)跨平臺的客戶端程序。其實(shí)寫一個跨平臺的程序一點(diǎn)都不難,不知道為什么網(wǎng)上有那么多人搞的雞飛狗跳。GacUI 給我?guī)淼牧硪粋€好處是,基本全部復(fù)習(xí)了一遍設(shè)計(jì)模式的內(nèi)容,而且由于體積龐大,我還弄了一個專門在不同 git repo 之間實(shí)現(xiàn)偏序依賴的小工具——用來把一整個 repo 下的 C++ 代碼打包成兩個文件,以便于其它repo直接使用。本來想試試 submodule 的,無奈 submodule 只能實(shí)現(xiàn)樹形依賴,實(shí)在太爛。
GacUI 最后還復(fù)習(xí)了之前學(xué)過的編譯原理的內(nèi)容。因?yàn)?GacUI 在編譯 XML 的過程中,實(shí)際上是把所有的東西都翻譯成了一個腳本引擎的字節(jié)碼,最后要么直接運(yùn)行這個腳本,要么把腳本翻譯成 C++(正在開發(fā))。因此為了實(shí)現(xiàn)這一點(diǎn),寫一個編譯器在所難免,而且編譯出來的東西還要能跟 C++ 那邊的類相互溝通,從而又復(fù)習(xí)了一遍 COM 的內(nèi)容(盡管我并沒有使用它,我只是嘗試做了一個一樣的東西)。
等 C++ 生成搞定之后,我就要繼續(xù)寫去年就開始的 GacJS了,把 GacUI 搬上瀏覽器,全方位運(yùn)行我的 IDE。適合使用 C++ 的那些領(lǐng)域真是博大精深啊。
出國
不得不說,當(dāng)初由于不喜歡數(shù)據(jù)庫所以跳槽到了研究院,結(jié)果研究院看我是從 SQL Server來的,弄了很多數(shù)據(jù)庫的東西給我做。后來我找了老板說能不能弄點(diǎn)別的啊?老板問我那你想做什么,我說弄點(diǎn)編譯器的東西試試?于是老板后來安排我給另一幫研究院,替他們做一個分布式圖數(shù)據(jù)庫的 query language。不過這種東西本來就是超級簡單的,很快弄完之后,我又變成做數(shù)據(jù)庫的了。于是這讓我明白了一個道理,多半研究院是沒有我喜歡的東西的了。
于是又過了一些年,由于我對北京(主要)和研究院(次要)的不慢逐漸增加,于是我趕緊弄了個老婆之后,就觸過了。
其實(shí)跟普通的面試是一樣的:
-
找到你想要去的組 -
聯(lián)系他的老板,把簡歷給他 -
看他是否因?yàn)榻?jīng)濟(jì)危機(jī)或者收購案件什么的,正在裁員或者無法招人 -
然后面試 -
拿 offer(這是肯定的) -
辦簽證
這個過程讓我不由得感嘆,美帝的面試官就是沒有見過世面啊。競爭壓力太小了,搞出來的題目都超級容易,得讓他們來中國呆一呆,面一面,不然美帝遲早藥丸。不過我覺得另一個方面是,我給 Office 做跨平臺 GUI 的那個組看了一下我做的 GacUI,估計(jì)他們覺得還不錯吧,就隨便面了一下我,這也是有可能的。
在這里不得不提到微軟照顧員工真是無微不至,不僅幫我提供優(yōu)質(zhì)的搬家服務(wù),在我到了美帝之后還給我安排了一位大媽,負(fù)責(zé)幫我融入現(xiàn)代社會。還說如果我覺得自己牛逼不需要這些東西,就給我兩萬刀。這些就算在谷歌,也只有被公司強(qiáng)行安排到美帝(而不是員工自己想出國)的那些人才有。最重要的是,微軟員工買 BMW 還能打折,真開心。
雖然牛逼的人在中國和美帝拿的工資并沒有太大差距,但是撇去美帝的IT地區(qū)跟北上廣相似的房價(jià)以外,美帝除了汽車和電器的其他東西貴得一逼啊,總體來講幸福感還是下降了。不過幸好中國IT發(fā)達(dá)地區(qū)空氣污染太嚴(yán)重,不僅抵消了這個缺點(diǎn),反而讓我覺得窮一點(diǎn)過得更爽了。于是自從翻了墻,每天就過著再也沒空把玩電子產(chǎn)品的日子,有空就開車,沒空就上班,爽的不行。
果然站在風(fēng)口豬都會飛啊。明明其它行業(yè)的工資中國比美帝低那么多,但是程序員居然只有1-3 倍的差距。果然中國還是需要大量的、專門訓(xùn)練來添補(bǔ)社會主義發(fā)展過程中的缺口的、專業(yè)的程序員的。
Microsoft Office
這次跳槽剛好遇到了微軟要開除諾基亞的人,搞到大部分的組都凍結(jié)名額了,只有財(cái)大氣粗的Office能招人,因此我也就只能來Office了。本來我的目標(biāo)是想給Edge弄JS引擎,或者去VS組搞搞編譯器什么的,無奈他們都太窮了,只好作罷。
在Office的工作讓我大開眼界,算是體驗(yàn)了一把一萬個人寫了三十年的、一個repo的snapshot就有幾百G代碼的軟件是怎么弄出來的。由于機(jī)器實(shí)在太貴,所以平時修改代碼的時候,只能在本機(jī)編譯,因此我們基于msbuild弄出來的這套CI,還包含了如果需要鏈接的lib/dll的代碼在硬盤里面沒有的話,就去服務(wù)器找當(dāng)前checkpoint的編譯好的緩存,下載下來編譯的功能。因此偶爾build farm掛掉的那幾天,由于網(wǎng)絡(luò)連接斷了,本機(jī)編譯也沒辦法弄。
尾聲
回顧一下自己的編程之路,學(xué)生時期大概就是從一開始寫游戲,到寫游戲引擎,到專門搞游戲引擎需要的圖形、GUI 庫和腳本引擎,最終由于精力的關(guān)系生下了 GUI 庫和編譯器。我從一開始設(shè)計(jì)腳本引擎的時候就很注意腳本如何暫停的問題——其實(shí)基本就是源自于游戲的需要——于是人肉做了 coroutine 的各種奇怪的實(shí)現(xiàn)方式。到了最后終于學(xué)習(xí)到了正統(tǒng)的方法,于是本來可以很簡單的完成的問題,由于后來需求就是復(fù)雜了那么一丁點(diǎn)(說白了就是要讓腳本也可以 customize(或者說 hack)coroutine 相關(guān)的類型系統(tǒng)的一部分內(nèi)容),導(dǎo)致了需要用無限復(fù)雜的方法來實(shí)現(xiàn) coroutine。人類為什么要互相傷害?
到了工作,基本就是
-
本來沖著去弄 Visual Studio 的,而且學(xué)生時期還不喜歡 SQL,結(jié)果工作的時候由于經(jīng)濟(jì)危機(jī)的關(guān)系給我弄到 SQL 去了,工作的內(nèi)容包含了學(xué)習(xí)專業(yè)的數(shù)據(jù)庫知識和拖控件。 -
但是我做了幾年還是覺得不喜歡 SQL,就跳槽到了 MSRA,結(jié)果 MSRA 拼命讓我搞數(shù)據(jù)庫的東西。也不想想本來我就是不喜歡弄這個才走的…… -
后來我想好吧,反正編譯器沒得搞了,那我還是拖控件吧。于是我就告訴Office的人說,你看我做 GacUI 多屌不屌!Office 的人說,屌!于是把我招了進(jìn)來,專門負(fù)責(zé)組里面不是 GUI 的那部分。 -
過了半年老板開始安排工作了,我想了個辦法表達(dá)了一下我還是喜歡弄別的東西。于是終于干起了老本行——給Office的程序員開發(fā)內(nèi)部的編譯器了。
總算最后還是做了喜歡的工作。
-END-
猜你喜歡
嵌入式牛人 | 這些單片機(jī)編程思想超硬核
為什么中國開發(fā)不出流行的操作系統(tǒng)和編程語言?
30條代碼,拿去“表白”
?最 后??
?
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!