《Lua設計與實現》的作者codedump:學習也要講究性價比
導讀:
訪談之前,我曾多次央求codedump給我一張照片,用於簡介部分的介紹。如他所願,不管是派人偷拍還是全網開搜,我都沒有得到也不可能找到一張照片。所以,就有了這樣一篇沒有嘉賓圖片的訪談文章。
我想,這大概就是技術型人才的「通病」吧。低調、務實、有乾貨!
不過,我還是知道了codedump筆名掩蓋下的真身,他被Lua吸引的原因,研究Lua的方法,Lua的優勢以及Lua的編譯原理,等等。
好了,還是你們自己開閱吧~
訪談嘉賓:
codedump,一線開發人員,長期從事互聯網後端服務的開發工作。
codedump多年的努力,最終以紙質圖書的形式——《Lua設計與實現》呈現給了大家。
越想做好一件事,心理負擔就越大
接下這件事之後,我的心理負擔變得很大。如果成為正式的出版物,讀者是要真金白銀地花錢來買的,我希望盡量做好,不辜負別人的期望。
為什麼使用codedump這個筆名?有什麼特殊的含義?
codedump是我自己造的單詞,其實是code和dump這兩個單詞的組合。我很喜歡深入到代碼層面去了解一些項目的運作原理,也就是把code給dump出來,所以就起了這個名字。總是會有人把它錯看成coredump,話說哪有程序員用這個名字咒自己的。(笑)
寫作《Lua設計與實現》的時候,最大的困難是什麼?
寫作過程中,主要有兩方面的困難。
一方面是技術上的。最大的問題是,Lua解釋器解析Lua文件、生成Lua Opcode的過程中,涉及一些編譯原理的知識。另外,Lua為了效率其實是一次遍歷的,也就是說,只分析一遍源文件就生成Opcode。雖然性能提升了很多,但是對於(當時基礎不太好的)我來說就有不小的困難。
這方面的分析文檔比較少,因為大部分Lua分析的文檔集中在虛擬機本身的結構和運作上,涉及Lua解釋器解析過程的文檔太少了。後來,我找到了調試分析的辦法,也就是像書里分析的那樣:每分析一種類型的指令時,就以一段簡單的Lua來具體分析,同時把握住分析的幾個關鍵函數,如luaK_code和luaV_execute,慢慢地自己也就啃下來了。從我的角度來看,這部分的內容仍然不是很滿意。如果精力允許,我希望可以繼續這方面的研究。
另一方面的困難是心理上的。編輯王軍花看到了我在Github上公開的文檔,通過郵件找到我,希望把內容整理成書出版。等接下這件事之後,我的心理負擔變得很大。如果成為正式的出版物,讀者是要真金白銀地花錢來買的,我希望盡量做好,不辜負別人的期望。
越想做好一件事,心理負擔就越大。加上工作、家庭等因素,寫作會被打斷,重新撿起來又需要更多的時間和精力。因為覺得有些章節寫得不夠好,我一度有放棄這次出版計劃的打算,還好編輯王軍花有足夠的耐心,才把這個差點半途而廢的事情堅持做完了。
從最開始簡單地寫一些東西,到最後和出版社合作、和網上的朋友合作等,這些都是很好的經歷。
你認為,書中哪部分最重要,為什麼重要?
哪些部分「最重要」,其實還要看個人的需求。不過,我認為,應該了解Lua棧和虛擬機的一些原理,比如代碼是如何先分析再到虛擬機中執行的,比如Opcode是如何組織在Lua棧中的。這部分的內容可以在書中的第五章找到,因為明白了這些知識會對理解代碼的生成有幫助。
學習也要講究性價比
接觸Lua時,我發現Lua 5.1.4版本的代碼量只有不到兩萬行。對於一個世界級同時在業界大量使用的腳本語言,這樣的代碼量確實性價比太高。
為什麼對Lua產生濃厚的興趣,談一談對Lua產生興趣的緣由?
接觸Lua時,我發現Lua 5.1.4版本的代碼量只有不到兩萬行。對於一個世界級同時在業界大量使用的腳本語言,這樣的代碼量確實性價比太高。加上,我一直對如何實現一門語言很感興趣,所以就堅持著學習了下來。我發現Lua的代碼組織形式精幹簡潔,幾乎沒有冗餘。相比Nginx,我認為Lua才是最好的C語言項目。
另外,我在Lua身上看到了一種別樣的編程語言設計哲學。Lua從來沒有追求過要做一門號稱「可以解決所有問題」的語言,它對自己的定位就是輔助型的語言,這樣的出發點也決定了它的特點——小巧、性能高、可擴展性強。
跟Python、Ruby這樣的語言相比,Lua有哪些特點?更適合解決哪類的問題?
Python、Ruby的定位是全能型的語言,即它們可以獨立完成一些工作。而Lua的定位是傳球者、助攻者,它需要藉助宿主語言,輔助宿主語言解決問題。
根據我之前從事網路遊戲伺服器開發的經驗來看,Lua更適合運用在既需要高性能又需要靈活性的情況下。我們可以採用C、C++這樣的編譯型語言實現核心的模塊,如網路、資料庫操作等,同時提供介面給Lua層進行調用,在需要靈活實現的業務層用Lua代碼來實現。
討論Lua解決技術問題的時候,你想到的、最佳的實際例子是什麼?
OpenResty,這個項目在章亦春(網名agentzh,OpenResty項目的發起人)的帶領下,已經取得了巨大的成功。它的架構正是我前面提到的:使用高性能的編譯型語言實現底層,同時給業務編寫提供Lua介面。經過這些年的發展,OpenResty已經越來越像一個平台化的軟體,開發人員不需要自己寫底層的C代碼,使用Nginx配置文件和Lua腳本就能驅動Nginx來完成業務。
另外,OpenResty把Lua的協程很好地使用了起來,以同步的方式來寫業務代碼,避免了非同步回調的問題。做過高並發伺服器的人都知道,事件驅動加非同步回調是常用的手段,但是回調層次多了,又會讓代碼邏輯變得支離破碎,這些痛點就是協程類技術最好的發揮場所了。當然,這很大方面也得益於Lua的精簡和高效。試想如果根據OpenResty的設計,每個鏈接就創建一個對應的Lua協程,那成本是很大的。
除了遊戲、擴展資料庫插件等方面,Lua適合開發Web應用嗎?
前面提到的OpenResty就是基於Web伺服器的例子。但是,好像現在還沒有看到很流行的Web框架是使用Lua編寫的。
簡單介紹下Lua的編譯原理?
Lua使用最簡單的遞歸下降的分析方式,只需要掃描一遍Lua源文件,就生成Lua虛擬機執行所用的OpCode。原理本身並不難,只要能夠清楚一些編譯前端的知識就可以閱讀Lua源碼了,只是由於Lua對性能的追求,所以代碼寫得很精簡,需要結合具體代碼的生成過程去理解。我在生成代碼那一章也是這樣,一個一個例子逐漸展開來分析這一過程的。
回頭看你自己學習Lua的這一段歷程,哪部分是最耗費精力的?
其實,前面已經提到了,Lua分析代碼生成Opcode的過程是最耗費精力的。GC部分也是難度比較大的,但是因為雲風寫的關於「Lua GC分析」的系列文章,難度會相對減少很多。
平民化的資本,構建出龐大的網路世界
編程跟數學的特點很像,只需要有一台可以編程的電腦就能構建起虛擬的世界。它對場地設備的要求也還算比較平民化,更多的是需要抽象和邏輯思維能力,這對我而言是相對簡單的。
聽說你並非科班出身,為什麼會選擇進入編程這一行?
雖然我讀的是理科,但是對於需要自己動手做實驗的學科,如化學、物理,卻並不擅長。像數學這樣的只需要紙和筆就能完成的科目,我學得還不錯。編程跟數學的特點很像,只需要有一台可以編程的電腦就能構建起虛擬的世界。它對場地設備的要求也還算比較平民化,更多的是需要抽象和邏輯思維能力,這對我而言是相對簡單的。
DOOM之父卡馬克有一個類似的說法,「在信息時代,進入編程領域的壁壘完全不存在了。即使有也是自我強加的。如果你想著手去開發一些全新的東西,不需要數百萬美元的資本。你只需要足夠的比薩和健怡可樂存在冰箱里,有一台便宜的PC用於工作,以及讓你堅持下來的奉獻精神。」
如果不能走得比別人快,那就盡量走得比別人遠一點、長一點
實際上,很多開發人員遇到的,比如中年危機,比如面對新知識的焦慮,等等,我也有一樣的困惑。目前能想到的不多,只是確定自己是喜歡技術的,願意一直在技術的道路上走下去的。
你平時很喜歡寫作,記錄技術學習的點滴。寫作是你的技術學習方法嗎?
最開始寫博客記錄技術學習的時候,是想在整理思路的前提下,能夠和其他同行分享一些知識。如果能把一個知識點用簡潔清晰的語言寫出來,讓別人看懂,才能說明我的理解很到位。
寫技術類文章的時候,我建議首先把原理和問題解釋清楚,然後才解釋具體的數據結構和偽代碼的演算法,最後才是具體的代碼。我不建議大量地貼代碼,因為可能當時你懂了,等過段時間後你就不懂了。決定寫Lua源碼分析的文章,我也是堅持這個初衷和方式。最開始的時候,我並沒有想到能以紙書的形式呈現,回過頭來看,以前做過的積累才是最重要的。
技術學習的過程中,最重要的三點是什麼?
首先還是得有興趣吧,沒有興趣的話,事情做起來彆扭。其次是善於歸納和總結知識,寫博客、技術文章,嘗試向別人解釋清楚一個知識點,時常整理知識點,跟以前學過的東西串聯起來。最後應該就是不斷提高自己解決問題的思路、能力等。出現了問題不是大事,問題是出了問題之後自己能否解決、能否從裡面學到東西。
你對自己未來的技術之路,是怎麼規劃的?
這個問題太大了,實在回答不了太多。實際上,很多開發人員遇到的,比如中年危機,比如面對新知識的焦慮,等等,我也有一樣的困惑。目前能想到的不多,只是確定自己是喜歡技術的,願意一直在技術的道路上走下去的。然後找對適合自己的技術方向,走好眼前的路吧。
如果不能走得比別人快,那就盡量走得比別人遠一點、長一點吧。當然,做到這些的大前提,還是身心的健康。
對話知名作譯者,品味精彩技術人生
你聽得見他們,他們也聽得見你!
參加訪談問題有獎徵集,圖靈贈送電子書


TAG:圖靈訪談 |