今年事情比較多,第一個(gè)是自己終于從本科畢業(yè)了,第二個(gè)是自己找到了工作,拿了一份offer。雖然當(dāng)初為了去Microsoft實(shí)習(xí)錯(cuò)過了一大堆其他公司的面試機(jī)會(huì),只投了Microsoft,Google和百度。不過最后還是進(jìn)了Microsoft,在這危機(jī)四伏的日子里,雖然說自己寫了10年代碼總歸有點(diǎn)功力,但是也有運(yùn)氣的成分在。只是面試百度的時(shí)候我明明在簡(jiǎn)歷上寫了我人在上海,他非要我飛回廣州面試,很不爽,拒了他。
去年下半年幾乎都投身Microsoft的實(shí)習(xí),到了12月上旬回學(xué)校,于是從今年的元旦開始其實(shí)就是在學(xué)校里面混日子了。其實(shí)還好,完成了一個(gè)
閹割版的Haskell編譯器當(dāng)畢業(yè)設(shè)計(jì),還做了一個(gè)
C語言編譯到機(jī)器碼寫入內(nèi)存的編譯器,最后
重寫了Vczh Library++3.0,還把它
開源了,雖然還沒最終完成。不過開源了之后就得補(bǔ)文檔了,因此近期的開發(fā)進(jìn)度可能會(huì)慢一點(diǎn)。
回想大學(xué)四年,還是寫了不少代碼的,也足夠拼成一張至少可以留住HR眼球的簡(jiǎn)歷了。當(dāng)初比較大的轉(zhuǎn)變是我剛上大一,可憐的Borland就不行了,于是很喜歡的Delphi看來也有危機(jī)了,所以轉(zhuǎn)去C++。幸好所學(xué)的知識(shí)并不是綁定在Delphi的平臺(tái)上,因此剛開始也只覺得是換了個(gè)語法。不夠C++實(shí)在是博大精深,里面可以用各種各樣的范式寫代碼,比較突出的是元編程,雖然這種東西在現(xiàn)實(shí)生活中重要性不言而喻不過所占比例還是很小的。
于是開始拿C++練手了。高中的Delphi時(shí)代寫了不少游戲,積累了一個(gè)2D的游戲引擎,其實(shí)也不復(fù)雜,不過好歹也到了3.0了,里面有圖形圖像、音效、數(shù)據(jù)管理、腳本引擎,還有一個(gè)UI。因此C++上手了之后,自然是移植它了。移植的過程中發(fā)現(xiàn)C++的寫法跟Delphi還是截然不同,因此Vczh Library++ 1.0基本上是失敗告終,雖然那個(gè)Delphi的游戲引擎大部分都實(shí)現(xiàn)了。在開發(fā)的途中我曾經(jīng)寫了一個(gè)模仿顯卡固頂管線的3D軟件渲染器,不過最后一個(gè)Demo應(yīng)該是在大二,用OpenGL實(shí)現(xiàn)了3D模型的骨骼動(dòng)畫,用的好像還是Halflife 1的幾個(gè)模型,什么鳥啊,僵尸啊,警察啊。后來覺得實(shí)在是找不到美工,而且自己還有一項(xiàng)喜歡的,也就是寫編譯器了,所以干脆就集中力量搞編譯器吧。
第一個(gè)見得人的編譯器應(yīng)該是
Vczh Jove Script了。這個(gè)東西閹割了Java,然后實(shí)現(xiàn)了一次,主要是針對(duì)OOP,有繼承,有虛函數(shù),還有泛型。當(dāng)然泛型我實(shí)現(xiàn)了跟C#一樣的參數(shù)約束,也就是可以指定說某個(gè)類型參數(shù)必須繼承與另一個(gè)類。數(shù)組使用引用計(jì)數(shù),其他的都垃圾收集。當(dāng)然最后發(fā)現(xiàn)數(shù)組用引用計(jì)數(shù)是不對(duì)的,會(huì)導(dǎo)致垃圾收集。
之后我就對(duì)計(jì)算機(jī)的理論燃起了熱情了,首當(dāng)其沖當(dāng)然是編譯原理。當(dāng)時(shí)受到了CSDN上那個(gè)袁泳的一點(diǎn)指導(dǎo),其實(shí)主要不是技術(shù)上的,是方向上的,后來給我看了一本很厲害的書叫《Parsing Techniques》。很多知識(shí)都從這里面吸收了,然后就要開刀,當(dāng)然是從最簡(jiǎn)單的正則表達(dá)式引擎下手。第一次寫還是有點(diǎn)別扭,到現(xiàn)在一共寫了三次,其中第二次是在第一次寫完了之后覺得很不爽立刻重寫的。寫完了就輪到Syngram,是一個(gè)將文法寫進(jìn)C++然后自動(dòng)變成語法分析器的小庫。當(dāng)然后來也重寫了。
上面的事情完成了之后就著手
Vczh Free Script的開發(fā)了。這是一個(gè)“純”動(dòng)態(tài)語言。為什么說純呢,因?yàn)槲覉?jiān)持所有東西匿名(包括類定義,其實(shí)結(jié)果就是返回一個(gè)類型,像C#的System.Type,然后可以到處傳),所以為了給一個(gè)東西命名就寫一個(gè)賦值語句。當(dāng)然不僅如此,我還實(shí)現(xiàn)了函數(shù)閉包,然后將之后的所有特性譬如說動(dòng)態(tài)的Multiple Dispatch(虛函數(shù)是Single Dispatch)啊,namespace啊,類和繼承什么的統(tǒng)統(tǒng)編譯到函數(shù)閉包上,整個(gè)語言是匿名的。當(dāng)然我還是把它是實(shí)現(xiàn)成一個(gè)C++的類庫,如果你愿意在我的接口下面寫插件的話,就可以跟Python一樣直接應(yīng)用到你自己的工程里面去了。
在這個(gè)過程中我學(xué)習(xí)了很多關(guān)于編程語言方面的基礎(chǔ)理論,還學(xué)了一點(diǎn)數(shù)學(xué)雖然我還是覺得數(shù)學(xué)有點(diǎn)難度。完了之后就開發(fā)一個(gè)小型的IDE,其亮點(diǎn)是就算代碼是動(dòng)態(tài)生成的,我也能捕捉到然后給你單步調(diào)試。不過這個(gè)由于穩(wěn)定性并不是非常好,第一次將C++跟C#混起來用還是有點(diǎn)力不從心,因此就沒拿出來貢獻(xiàn)給大家了。
之后就開始Microsoft的實(shí)習(xí)之旅了,在實(shí)習(xí)的過程中我首先封裝了一次win32api的GUI部分,盡量達(dá)到跟Delphi一樣好用,于是有了這個(gè)
Demo,然后做了閹割版Haskell——也就是Kernel FP了。當(dāng)初叫這個(gè)名稱我只是想看看實(shí)現(xiàn)一個(gè)最小的純函數(shù)式語言的內(nèi)核要怎么辦,要包含多少功能(當(dāng)然是越少越好,其他的都是語法糖或者庫,不過不能讓能力下降)。后來又看了一本書好像叫做《The Implementation of Functional Programmang Languages》,也很好看,學(xué)到了很多東西。
于是2008年就結(jié)束了,進(jìn)入2009年,做了一個(gè)CMinus,可以把C語言編譯到內(nèi)存里面,搞成x86的機(jī)器碼,然后就能將一個(gè)寫了代碼的txt文件變成一個(gè)函數(shù)指針了。然后就畢業(yè)了。
7月13日開始入職Microsoft,雖然說是在開發(fā)界面,不過我還是覺得需要自己仍然保持熱情,于是工作結(jié)束之后自己要繼續(xù)寫自己的代碼,也就是Vczh Library++ 3.0了。上面做了很多4個(gè)編譯器,剛好針對(duì)語言的4中特性,這次看看能不能把它們綜合起來,變成一個(gè)真正有用的腳本引擎。當(dāng)然這不是重復(fù)勞動(dòng)了,畢竟自己實(shí)現(xiàn)給自己帶來的質(zhì)的提高會(huì)比你純粹用別人的要高很多。但至于最后怎么辦,其實(shí)我還是覺得.NET的潛力比較大,總之挑戰(zhàn)它是不明智的,但我還是想自己試一試。
從第一個(gè)QBasic的Hello World到現(xiàn)在也差不多要10年了,初中因?yàn)椴恍⌒哪玫搅吮綫Basic的書然后戲劇性地開始了我程序員的人生,所幸中間沒有間斷過,而且也將對(duì)一貫來編程的激情很好的保存了下來,有增無減。至于說30歲(其實(shí)日本說的是35歲)就要轉(zhuǎn)管理什么的,我還是不太相信,或者說我愿意就做一線的開發(fā)人員,或者架構(gòu)師(當(dāng)然這個(gè)跟通常意義上的架構(gòu)師還是不一樣的,有朝一日真的給我做了,我還是想跟一線的程序員一起寫代碼)。管理還是不適合我,畢竟我對(duì)錢(或者是權(quán)力?)沒那么渴望,夠花就好了,雖然我自己沒多少錢。
總之,要有激情,無論是對(duì)什么事情。剩下的就是要追求快樂,不同的人對(duì)快樂的定義還是不一樣的,不過我目前只要能寫有挑戰(zhàn)性的代碼,我就會(huì)覺得很快樂了。工作了之后因?yàn)樵谏虾?,瞬間感到了房?jī)r(jià)的壓力。只是如果要我犧牲寫代碼的時(shí)間和樂趣去換取那些所謂的財(cái)產(chǎn),我還是不太愿意的。
posted on 2009-12-23 05:22
陳梓瀚(vczh) 閱讀(14821)
評(píng)論(40) 編輯 收藏 引用 所屬分類:
啟示