我的編程語言經歷

Alan Perlis 說過:“一種不改變你編程的思維方式的語言,不值得去學。”,雖然寫了這麼多年程序,用了這麼多的語言,但我自認還沒悟道編程語言如何改變我的思維方式。

幾天前,我需要用python來爲ledisdb寫一個客戶端,我突然發現,對於c++,go這種語言,我如果需要實現一個功能,首先想到的是問題是代碼應該怎麼寫。但是當我使用python的時候,我首先考慮的問題是在哪裏去找一個庫用來解決我的問題。可能這就是使用不同語言帶給我的不同思考方式吧。

我的編程語言經歷沒有那麼複雜,沒用過很多,但是其實也夠我受的了,尤其是在不同語言語法糖之間切換的時候,有種讓人崩潰的感覺。沒準我應該升級一下我的大腦cpu,使其能夠更快速的進行中斷處理。

c

我是從大學纔開始學習編程的,相比現在的小朋友來說,可以叫做輸在了起跑線上面。誰叫以前生活在山區,沒機會接觸電腦這玩意。

我的第一門編程語言是c,不同於很多童鞋使用的譚浩強神書,我用的是周純傑的<<c語言程序設計>>,不知道每年有多少同學受到過它的摧殘,當然還有那哥們蹩腳的普通話。

在大學裏面,很多同學的c的畢業設計都是我幫其完成,但我始終覺得自己仍然是個半吊子,除了c的基礎稍微強一點之外,很多方面譬如操作系統,算法等完全不會。(現在隨着工作年限的增加讓我越發後悔,當初怎麼就不稍微學點這些知識,尤其是編譯原理。)

我幾乎沒怎麼用c開發過項目,只在tencent可憐的維護過別人的c項目,但至少能看懂c代碼,這就夠了。

因爲大多數時候,我用的是c++,而不是c來解決我的問題。

c++

c++是我工作使用的第一門語言,也是我使用時間最長的一門語言,都七年之癢了,不過還是有點不離不棄的。

以前上學的時候有一句口頭禪,叫學好c++,走遍天下都不怕。但是有幾個人能把它學好的?所以千萬別說自己精通c++,那會被人鄙視的。

我使用c++可以分爲三個階段:

類c階段

這個階段主要是我第一份工作的時候,那時候才畢業,c的烙印很深,面向對象除了有個概念,真正是啥完全不知道。所以最喜歡的方式還是寫着一堆函數來解決問題,當初VIA身邊那幫c++的牛人竟然能忍受我這樣的代碼,真佩服他們。

面向對象階段

後來去了第二家公司linekong,開始做遊戲,纔開始真正意義上的用c++寫代碼了。

記得最開始去第一家公司面試的時候,被問了啥是面向對象,當時不假思索的答了繼承,多態和封裝。

啥叫封裝?整一個class,把該包的都包了,一個同事曾告訴我,他見過有幾萬行代碼的class,看來我這個幾千行的太小兒科了。

啥叫繼承?先來一個父類,乾脆叫bird,有一個fly方法,再來一個子類,叫duck吧,繼承了bird,不過duck會fly嗎?一個父類不夠,再來一個,搞個多重繼承,什麼?出現了菱形繼承,那乾脆在來一個virtual繼承得了。

啥叫多態?不就是virtual function,然後父類指針能在運行時根據實際情況調用相應的子類實現。那c++的多態是怎麼實現的?看看<<深度探索c++對象模型>>不就行了。

這段時間,可以算是我寫c++代碼最多的時候,都快寫到吐了,尤其還要忍受那龜速的編譯。我們竟然都實現了直接通過彙編改c++的虛表,使其調用自己的函數這種變態的東西。在那時候我就得出結論,如果不想早死,儘量別用這個東西寫代碼。可是到如今我都在不停的慢性自殺。

現代C++階段

不知道從什麼時候開始,我突然覺得我應該來點modern c++的編寫方式了,c++0x都出了,還不玩一下就晚了。當然新特性那麼多,不可能全部都拿來用的,Bjarne Stroustrup貌似都說過,c++0x應該算是另一門語言了。

於是哥就走上了僞modern c++之路,class還是需要的,不然數據怎麼封裝。繼承嗎,比重減輕吧,最好採用面向接口的編程方式。而多態,能不用就不用吧,反而覺得bing + function的方式實現的delegate模型反而更方便,沒準也更酷喲。

shared_ptr,weak_ptr是需要用的了,c++沒有gc,所以一套好的內存管理方式是必不可少的,每次new之後還要記得delete也比較煩,最嚴重的是可能忘記那就內存泄露了。

於是,我就自認爲我進化了,最典型的例子就是我寫的高性能網絡庫libtnet,感覺很modern了。

lua

最開始知道lua,是雲風那本編程感悟的書,當時可是菊花一緊,覺得這東西是啥,爲什麼能跟c結合到一起使用?

後來自己開發遊戲了,才發現lua真的是一門很強大的語言,短小精悍,嵌入簡單,性能超強,完全是作爲遊戲腳本語言開發的不二人選。不過我最開始使用lua的經歷不怎麼happy,最開始就是接手了一個c++與lua的粘合層庫,關於這個庫的傳說,見這裏Lua 不是 C++。後來,在踩了無數個坑,填了無數個坑之後,我終於弄得相對穩定了。貌似現在我以前的同事還在使用,不過正如我在lua c函數註冊器中說明的那樣,對於語言的交互,簡單一點纔好。現在以前做的遊戲已經開源,見這裏,那個傳說中的蛋疼粘合層也見了世面。當然,我可不會告訴你們好多搓代碼是我寫的。

後來,在現在的公司,因爲項目的需要,我們急需解決python的很多性能大坑問題,於是我開始推廣使用openresty,一個用lua包裹的nginx,用了之後,腰不痛了,腿不痛了,性能妥妥的。

因爲lua,我第一次嚐到了在代碼裏面直接寫配置的便捷,用一個table搞定,相比起來,c++處理ini,json這些的弱爆了。另外,動態語言的熱更新機制使其代碼升級異常方便,不過你得非常小心lua的閉包,沒準你重新加載了代碼運行還是老樣子。

lua是一個動態語言,所以不用我們管內存釋放問題,但是仍然可能會有引用泄露,在開發遊戲的時候,爲了解決我們程序lua內存泄露的問題,我曾經幹過直接從_G遞歸遍歷,掃描整個lua數據的事情。相比在c++使用valgrind這些程序的工具,lua配套的東西還是太小兒科了。

lua的調試也是一個大頭問題,我曾今寫過幾個lua的調試器,例如這個,甚至都支持了類似gdb那樣ctrl+c之後動態的設置斷點,可是仍然沒覺得比gdb方便,所以多數時候,我都是寫log爲主。

python

雖然小時候吃過很多蛇,但是蟒蛇可是從來沒吃過的,現在看來python味道還不錯。

我是來了kingsoft之後纔開始正式使用python的。對於爲啥使用python,我曾跟拉我進來的技術老大討論過,他直接就說,開發快速,上手容易。

python開發的快速很大程度是建立在豐富的第三方庫上面的,我們也使用了很多庫,譬如tornado,gevent,django等,但是正如我最開始說的,因爲我們有太多的選擇,面對一個問題的時候,往往考慮的是如何選擇一個庫,而不是自己如何實現,這其實在某種程度上面使得很多童鞋知其然而不知其所以然。這點,lua可能是另一個極端,lua的定位在於嵌入式和高性能,所以自然地,你得自己動手造輪子(當然,現在也有很多好的第三方庫了),雖然有時候寫起來很不方便,但是至少自己很清楚程序怎麼跑的。

當然,我絕對沒有貶低python的意思,我很喜歡這門語言,用它來開發了很多東西,同時也知道很多公司使用python構建了很多大型穩定的系統(我們的產品應該也算吧)。

只是現在我越發覺得,看起來簡單的語言,如果沒有紮實的基本功底,寫出來的東西也很爛,而python,恰恰給人放了一個很大的煙霧彈,你以爲它有多容易,其實它是在玩你。

go

好了,終於開始說go了,let's go!!!

我使用go的歷史不長,可能也就一年多,但是它現在完全成了我最愛的語言,go具有了python開發的迅速,同時也有着c運行的性能。(當然,還是有差距的!)

網上有太多的語言之爭,包括go,有人恨,有人愛。但蘿蔔白菜,各有所愛,對於我來說,能幫我解決問題,讓我用着舒服的語言就是好語言。

go非常適用於服務端程序開發,比起用c++開發,我陡然覺得有一種很幸福的感覺,譬如對於網絡編程,在c++裏面,我需要自己寫epoll的事件處理,而且這種異步的機制完全切分了整個邏輯,使得代碼不怎麼好寫,我在開發libtnet的時候感觸尤其深刻。但是在go裏面,因爲天生coroutine的支持,使得異步代碼同步化了,非常利於代碼的編寫。

現在我的主要在項目中推動go的使用,我們已經用go搭建了一個高性能的推送服務器,後續還有幾個系統會上線,而且開發的進度並不比使用python差,另外也很穩定,這讓我對go的未來充滿了期待。

我也用go寫了很多的開源程序,也算是拿的出手了,譬如:

  • ledisdb:一個基於leveldb的提供類似redis高級數據結果的高性能NoSQL,真挺繞口的,簡單點就是一個高性能NoSQL。
  • Mixer:一個mysql-proxy,現在支持通用的mysql命令代理,讀寫分離,以及自動主備切換。後續將要參考vitess支持分區,爲此一直在惡補編譯原理的知識。
  • go-log:一個類似python log模塊的東西,支持多種handler,以及不同的log級別。

還有一些,可以參考我的github,譬如moonmq(一個高性能push模型的消息服務器),polaris(一個類似tornado的restful web框架),因爲go,我開始熱衷於開源了,並且認識了很多的好基友,這算得上一個很大的收穫吧。

其它

好了,說完了上面我的長時間使用語言(至少一年以上),我也用了很多其他的語言,現在雖然使用時間比較短,但不排除後續會長久使用。

Objective-C

因爲我家終於有了蘋果三件套,所以決定開發app了,首要的任務就是得學會使用Objective-C。我承認這真是一門奇葩的語言,如果沒有xcode的自動補齊,我真不知道寫起來是神馬樣的感覺。

而且第一次見到了一門推薦寫函數名,變量名就像寫文章的語言,至少我寫c++,go這些的一個函數名字不會寫成一個句子。

我現在在自學iOS的開發,慢慢在整出點東西,畢竟答應給老婆的iphone做點啥的。後續乾脆就寫一個《小白學iOS》系列blog吧(如果我有精力!),反正對於iOS,我真是一個小白。

java

好吧,我也在android上面寫過程序,build到我的S3上面去過,對於java,我的興趣真不大,貌似自己還買過兩本《java編程思想》,那時候腦袋鐵定秀逗了。

但是不得不承認,java在服務器領域具有非常強的優勢,很多很多的大企業採用java作爲其服務器的編程語言。典型的就是淘寶,據傳杭州的很多軟件公司都不用java的,你用java就等於給淘寶培養人才了。(不過我發現他們很多基礎組件譬如TFS這些的可是c++的喲!)

java是門好語言,只是我個人不怎麼喜歡,可能我就是太小衆了,只對c語言體系的感興趣。所以很多公司我去不了,哈哈!

erlang

受《計算機程序的構造與解釋》影像,我一直想學一門函數式編程語言,最開始玩的是elisp,誰叫以前我是個深度的emacser(後來竟然變成了一個vimer,再後來就是sublimer,這世界真神奇)。

後來還是決定好好學習一下erlang,也第一次領略到了函數式編程的魅力。自己唯一用erlang開發過的東西就是bt下載的客戶端,不過後來發現用處不大就沒繼續進行下去了。(好吧,我承認當時想下島國的東西)

學習erlang之後最大的優勢在於現在能看懂很多優秀的erlang項目,譬如我在做moonmq以及公司的推送服務的時候,研究了rabbitmq,這玩意可是用erlang寫的,而我竟然還能看懂,太佩服我了。

還有麼?

想想自己還學了哪些語言?貌似沒了,不知道awk算不算一門。看來我會得語言真不多。

後續可能會學的

逆水行舟,不進則退,計算機發展這麼迅速,我也需要不斷提升自己,其中學習一門新的語言可能是一個很好的提升途徑,至少能爲我打開一扇門。譬如,如果掌握了日文,就能更好的理解島國片的精髓。我不會日文,所以還是個門外漢。

ruby

ruby是一門很優雅的語言,很多大神級別的人物推薦,github貌似也是ruby的幕後推手。

因爲ROR的興起,使得ruby更加流行。看來,一個好的框架庫對於語言的推廣幫助真挺大的。相比而言,python有django,tornado等,光選擇適合自己的就得費點時間。

ruby可以算是一門完全面向對象的語言,連number這種的都是對象,而且看了幾本Matz的書,覺得這哥們挺不錯的,對技術的感悟很深,所以更讓我有興趣去了解ruby了。

javascript

作爲一個技術人員,沒一個自己的個人網站怎麼行,我的阿里雲都是包年買的(明年還是買國外的vps吧),自己的個人站點還無影無蹤。

好吧,我完全不會javscript,看着css就頭疼,沒準我從一開始想自己寫代碼搭建個人站點這個步子就邁的太大,扯着蛋了。如果先用一個開源的框架搭建起來,再自己調整完善,可能會更好。但無論怎樣,javascript這門語言還是要學習瞭解的,尤其是以後隨着html5的流行,加之node.js瘋狂流行,這門語言也會愈發的發光發熱。

C#

其實本來不準備跟ms的東西扯上關係的,雖然vs是一個很強大的開發工具,但是我自從換成mac之後就不準備再遷回windows。

只是c#我可能是必須要學會的,因爲那個坑爹的unity3d,雖然unity3d也提供了其它語言的支持(譬如僞javascript),但是大量的開發者還是選用了c#,至少在中國我問過很多朋友,都妥妥的用c#,既然這樣,我也只能考慮學習使用了。

至於我爲啥蛋疼的想玩unity3d,畢竟幹了很多年遊戲開發,一直有自己弄一個簡單小遊戲的夢想,還是妥妥的unity3d吧。

自己造一個?

語言千千萬,我不可能全部學會的,而且以後沒準因爲業務的需要,沒準都會自己造一門語言,也就是DSL。不過這個貌似還離我比較遙遠,編譯原理的東西太差了(說多了都是淚呀)。自己寫詞法分析還成,後面就菜了。這也是Mixer一直沒啥進展的原因。不過已經買了龍書,在學習屠龍祕籍,希望成爲頂尖高手吧。

後記

寫了這麼多,看來隨着年歲的增加,越來越囉嗦了。不是有一句古話:吾生也有涯,而知也無涯 。以有涯隨無涯,殆已。不過不停地追逐不也是樂趣一件?

只是,現在我首先要做的就是向我老婆申請資金升級電腦了吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章