Uploaded avatar of kytrinyx

專訪 Meade Kincke

@kytrinyx
7年多前

一篇與 Meade Kincke 的訪談,他和 Katrina Owen 聊了 Rust 編譯器、一個用科學色彩空間判斷啤酒顏色的圖形介面,以及他的書《A Practical Guide To Rust》。

嘿,Meade。謝謝你接受訪談。我們想找你聊聊,因為你是我們 Rust 賽道上最多產的導師。你已經幫助超過 400 位學員。你是怎麼知道 Exercism 的?

Reddit 的 Rust 版上有人發文提到 Exercism 的 Rust 賽道需要導師,所以我就去了解了一下。我很慶幸自己真的去做了,因為這件事帶給我極大的成就感,而且每個人都非常友善、很懂得感謝。我和我在 Exercism 的學員建立了很棒的情誼,我很喜歡幫助他們。

有沒有哪些故事特別讓你印象深刻?

有,有一個 Rust 練習特別受歡迎:畢氏三元組。

這個練習最常見的問題通常是效能。大多數人一開始會用巢狀的for迴圈來解,複雜度至少是 O(n²),效率非常差。我的目標是帶學生走到線性解法:O(n)。

我的做法是提出問題。我會先問他們想不想學 Rust 的疊代器方法,因為它的好處多到數不完,其中一項就是你可以用 Rayon 函式庫把工作平行化。

有一位學員回答「好啊,拜託」之後提到,他學 Rust 是因為他打算用它來做嵌入式控制,再處理它產生的大量資料輸出。所以平行化對他來說很重要。他很開心我拿一個看似簡單的練習,來教 Rust 更複雜、更道地的部分。

現在,多虧了 Exercism,他請我一對一教他,我們還要一起做一些實驗性專案。等他讓整間公司全面轉用 Rust 之後,我也會教他的整個團隊。

我非常享受和這些我引導過的學員一起工作,也希望這件事能持續成長。

我太喜歡這件事了,所以現在自願擔任 Rust 賽道的維護者,在幕後幫忙更多。

那種人與人之間的連結真的很重要!你是 A Practical Guide to Rust 的作者。這本書在談什麼?你當初為什麼想寫它?

我寫這本書,是為了幫大家更了解 Rust 的某些面向。這門語言的相關文件並不多,我覺得需要有這樣一本書:帶點幽默,又能具體地解釋這門語言的概念。書裡涵蓋了一些基礎和進階領域的指引。我希望讀者能確實掌握這門語言在真實世界中的實用方式。書中給的是真實的例子,不是假設性的。

我一直都知道自己總有一天會寫一本書。當我開始遠端教一位同事用 Rust 寫程式時,整本書的架構就自然成形了。他以前完全沒碰過程式碼,我必須用新的、容易理解的方式,去解釋我們這些阿宅習以為常的術語和方法。在談到 Rust 的所有權概念時,我用了「從圖書館借書」對比「自己擁有這本書」這樣的比喻。

我也把自己專案 BrewStillery 裡的例子放進去。這是個很好的方式,可以看到結構體和列舉這類東西在真實程式裡如何運作。它也展示了如何真正實際地運用平行化。

寫這本書的時候,我很確定我要讓它讀起來像個故事,而不只是一本參考手冊。它前後彼此鋪陳,但每個部分也都能獨立閱讀。這就像照著化學手冊做菜,跟看一集 Julia Child 的「The French Chef」之間的差別。

喔,這聽起來很有意思。你的書是寫給誰的?讀者能從中得到什麼?

這本書是寫給任何想學 Rust 的人。我鋪陳觀念的方式有個共通點:它能讓讀者真正理解基本原理,而很多其他書則偏向死記硬背。

我看到你得到很多好評。你打算出第二冊嗎?

會!我當然會繼續寫,也打算再出版更多冊。

除了透過引導教學和寫作,你也參與了 Rust 編譯器的一些工作。可以聊聊嗎?

當然!

先簡單介紹一下我的工作:程式基本上有兩個運作的階段,編譯期和執行期。當一個函式在執行期被執行時,裡面的所有東西都得重新產生、重新計算。這一點非常關鍵,因為它意味著必須重新配置記憶體,而這是我們向來極力想避免的事。當一個函式是常數時,它會在程式啟動時就被載入記憶體。我們能在編譯期完成的事情越多,程式的效能就越好。

前陣子我聽說 Rust 正在實作編譯期函式執行(const fn)這個概念,我超興奮的。我對讓東西變得既有效率又精確這件事非常有熱情。我很喜歡const fn的一點是,等它完成之後,我們就能優雅地決定數學常數這類美妙的東西。目前 pi 是寫死的值。很多人會說這樣已經夠精確了,但我覺得它應該用滿所有可用的數值空間。有了const fn,我們就能用萊布尼茲公式,把浮點數的空間完整填滿。

我又多讀了一些資料,看到一篇部落格文章說 MIRI 會讓const fn的穩定化容易得多。時間過去,新版本發布時我卻沒看到任何進展。我聯絡了 Rust 團隊,開始動手改編譯器。

最棒的是,編譯器本身就是用 Rust 寫的。它最初是用 OCaml 寫的,後來改寫成 Rust,這就叫做自舉(bootstrapping)。基本上,編譯器會先把所有輸入解析成 抽象語法樹(AST),再交給高階中介表示法(HIR),接著是中階(MIR),然後是低階(LIR),最後由 LLVM 處理。我們走過這每一個步驟,就離機器碼越來越近。

有一點要理解:編譯器就只是一個程式,只是非常複雜的程式。Rust 的編譯要花不少時間,跑完所有測試更是如此。所以你不能隨便塞幾行程式碼進去,就說「我完成了」。

我第一次參與編譯器的工作是在 HIR 上。那牽涉到大量閱讀標準函式庫(stable 和 nightly 版都有),還得一路追著各種線索往細節裡鑽。我必須一層層遞迴下去,走遍編譯器裡每一個巢狀型別,直到把所有可能都試過為止。nightly 的編譯器函式庫有超多巢狀型別。要一路記住自己正在追的是哪條線索,需要非常專注。

更麻煩的是,編譯器是由一個分散各地的團隊共同開發,所以我們經常會遇到合併衝突。

這真的超好玩。還有一大堆工作要做,我近期就會投入。

除了這些開源貢獻,我知道你是一家區塊鏈公司的技術長。我對區塊鏈的印象,就是我在 Etherium 上賠了一堆錢。區塊鏈對你來說代表什麼?

很遺憾地,區塊鏈已經變成史上最夯的那個流行語了。

它遠不只是倫敦金融城和華爾街拿數位貨幣的新潮流來撈一筆而已。我們其實不是一家「區塊鏈公司」,我們 Chainetix 提供私有帳本,安全地保護公司的資料。事實上,我們甚至不碰加密貨幣。Chainetix 的目標,是把我們的專業交到每一位對程式設計有基本認識的人手上。

我的工作包括從零開始規劃我們的系統和基礎架構,打造出固若金湯的成果。我選了一個叫做 Habitat by Chef 的專案。我會知道它,是因為它是用 Rust 寫的,這對 Chef 這樣的大公司來說挺有意思的。和單純的 Docker 相比,Habitat 建立的映像檔能自動更新自己,還能做到服務綁定之類很厲害的事。我也對 Habitat 的 core-plans 儲存庫貢獻了不少。

你剛才提到你的專案 BrewStillery。聽起來它對你很重要。可以多跟我們聊聊嗎?

當然,它確實很重要!

BrewStillery 是我用 Rust 和 GTK3 寫的開源全方位啤酒、葡萄酒和烈酒工具。我還加了一套美得獨一無二的 CSS 主題。一句話說,它是給任何製作酒類的人用的進階計算機。

我做了不同的分頁,把啤酒和香檳專屬的計算機分開,同時留了一個通用分頁,適用於釀啤酒、釀葡萄酒和蒸餾的人。如果你看大多數啤酒和葡萄酒的瓶身,會看到那瓶酒的酒精百分比,也就是酒精體積百分比(Alcohol By Volume)。而 BrewStillery 做的其中一件事,就是算出那個酒精體積百分比(ABV)。你大概猜得到,這背後有一堆很宅但超厲害的東西。我最得意的是計算啤酒顏色這部分:

BrewStillery 啤酒分頁,空杯

BrewStillery 啤酒分頁,滿杯

這兩張前後對照的圖片,展示了輸入數量之後的變化。我採用的做法,是之前沒有人做過的。另一個很棒的特點是,它會在你輸入的同時即時計算。如果你想聽色彩空間的細節,在研討會上找我,我們可以邊喝幾杯邊聊!

2019年02月09日 · 覺得有幫助嗎?