《七週七併發模型》作者Paul Butcher:這是一個激動人心的程式設計時代,也是一個帶有很大不確定性的時代(圖靈訪談)

劉敏ituring發表於2016-05-12

Paul Butcher
一位資深程式設計師,涉獵廣泛,從微控制器編碼到高階宣告式程式設計無所不精,現在他開辦了獨立諮詢公司Ten Tenths。他曾任SwiftKey的首席軟體架構師,並先後擔任Texperts和Smartner的CTO。

Paul Butcher的著作《七週七併發模型》延續了《七週七語言》的寫作風格,通過七個精選的模型幫助讀者瞭解併發領域的輪廓。除《七週七併發模型》外,Paul還著有在亞馬遜獲得全五星好評的《軟體除錯修煉之道》

《七週七併發模型》作者Paul Butcher:這是一個激動人心的程式設計時代,也是一個帶有很大不確定性的時代(圖靈訪談)

訪談英文版

感謝Paul再次接受圖靈的訪談!您曾經講過,在1989年開始攻讀博士學位的時候,平行計算和分散式計算並不是當時的主流。為什麼不選擇當時的主流作為學習研究領域?

老實說,當時我的估計略有偏差。我當時認為平行計算和分散式計算不久就會成為主流。但實際上,CPU執行不斷加快,人們完全沒有必要為了顯著提升效能,從序列程式設計轉向併發程式設計。

最近,CPU的執行速度達到了瓶頸,很難再次提升。正因為如此,我當時的預測最終得以實現(離當時的預測已經有25年了)。

併發和並行非常相似,兩者容易相互混淆。那麼兩者之間的不同點有哪些?

不只是中國人,對於講英語的人也一樣,併發和並行是一種常見的易混淆概念。其實,大多數情況下,兩者的區別不是特別重要,重要的是,從序列程式設計轉向非序列程式設計,也就是併發和並行程式設計。併發和並行都屬於非序列程式設計,它們兩者面臨的挑戰也是一樣的。

併發程式碼具有多個邏輯的控制執行緒,但這些執行緒可以或者不必執行在多個核上。並行程式碼則真正執行在多個核上。通常,並行是關乎效能的(通過使用多核,我們希望我們的程式碼執行得更快),而併發則是關於解決一個本身就是併發的問題域。

我之所以在《七週七併發模型》中探討兩者的區別,是因為存在一個常見的誤解:並行指的是不確定性。事實卻並非如此。如果我們為了執行得更快,並行處理一些數值計算,得到的結果跟序列程式碼的答案完全一樣!

距離本書的出版日期也有一年多了。是否有其他的併發模型出現?

本書出版的時候,就已經存在超過7種的併發模型了!《七週七併發模型》的最後一章也列出了其他的併發模型,如Fork/Join 和work-stealing、資料流、響應式程式設計、函式式響應程式設計、網格計算和元組空間。其中,最有趣的,我認為是函式式響應程式設計。

書中的每一章都選用了恰當的程式語言來展示併發模型。除了程式語言這條線索,是否還有其他線索來學習併發模型?

為每一章選擇不同的程式語言,是為了儘可能地降低讀者對示例的理解難度。整本書也可以只選擇一種語言,比如Java,但這樣做的後果是,程式碼將變得囉嗦冗長,讀者也更難理解。這一點尤其適用於函式程式設計那一章。儘管我們可以用Java編寫函式程式碼,但這並不是Java的常見編寫方式。這樣很容易一葉障目,只見樹木不見森林。

重要的是要明白,你並不需要使用本書中使用的全部語言。如果你目前是一名Java程式設計師,你也可以使用Akka庫輕鬆地編寫Actor程式碼,但你的程式碼肯定會比使用Elixir或者Scala 更加繁瑣。因為你可以運用Elixir和Scala裡面的Actor 程式設計模型。

在選取程式語言的時候,除了考慮程式語言的併發特性,還需要關注哪些其他的特性?

還有許多特性需要考慮,大多數還特別實用,例如:

  • 現有的程式碼有哪些,可以用於之後的互操作?

  • 支援工具怎麼樣?

  • 該語言社群的活躍度怎麼樣?

  • …...

不同程式語言之間的相互競爭,讓語言選取變得更加複雜。而且,目前很難預測出哪種語言未來會受歡迎。

我們正處於一個非常激動人心的程式設計時代,但也是一個帶有很大不確定性的時代。

程式語言變革對程式開發者的影響有哪些?

就像我在上一個問題的回答一樣,我們很難預測究竟哪種語言會變成主流語言。這對於程式開發人員來說,確實是一種嚴峻的挑戰。

儘管如此,我認為還是有一些明確的趨勢的。函數語言程式設計語言將越來越重要,併發、分散式程式設計和容錯性良好的語言同樣越來越受到青睞。

唯一的解決辦法就是繼續學習。選擇一門新語言進行學習,然後選擇另外一門,至少確保一門語言有很強的函式式語言韻味。

上次接受圖靈訪談的時候,您曾經說:“採用多語言編寫的程式本身就很有挑戰性,如果再引入多種併發模型,情況會變得更糟。”有沒有可能建立一種普遍適用的程式語言和一種萬能的併發模型?

建立一種“真正的”程式語言,是所有程式設計師努力追求的“聖盃”,但卻很難實現。有許多嘗試試圖建立一種語言,來滿足每個人的需求,但他們從來都沒有成功。

Scala是一種多範型的語言,允許很多不同的程式設計風格,比如命令式、物件導向式、函式式、Actor......雖然可以運作,許多人認為學習和使用Scala太過複雜。

就我個人而言,我喜歡更簡單、更集中的語言,一次做好一件事。

從我的角度看,編寫程式碼跟寫作在一定程度上非常相似。既然這兩種您都經歷過,可以給我們分享下兩者之間的相同點和不同點嗎?

這是一個非常有趣的問題!是的,至少對於我來說,編寫程式碼和寫書兩者之間有一些相同之處。不管是寫書還是編寫程式碼,最開始我只是大膽地寫出“東西”。它們可能特別冗長、混亂,甚至不能表達出我想要表達的意思。但是,通過反覆地閱讀、檢查,慢慢地我會找到自己最滿意的結果。

當然,寫作和編碼之間最大的區別在於,我可以用自己編寫的測試對程式碼進行驗證。如果測試通過,我有充分的理由認為程式碼的正確性。不過,寫作卻沒有對應的自動化測試。我只能把自己編寫的文字拿給別人審閱,看是否能被他們所理解。

《軟體除錯修煉之道》和《七週七併發模型》兩本書都受到了讀者的追捧,您是否有計劃再寫一本書?

我有計劃再寫幾本書,但計劃還處於非常早期的階段。可能是關於創業者和投資者的建議諮詢類圖書,幫助他們構建開發團隊,落實開發過程和合適的體系結構。

聽說您最近一段時間痴迷於賽車。在上週的一次季賽中,還獲得了第3名的好成績。如此喜愛賽車的原因是什麼?這項運動有沒有激發您某種思維模式或者鍛鍊了某些能力?

我真的希望說,賽車跟軟體程式設計之間存在一定的聯絡。但實際上,它們之間唯一的聯絡,就是軟體工程師的工作讓我賺到足夠的錢來支付賽車方面的花銷。

Paul在2016年Qcon大會做了精彩的演講,歡迎到視訊下載區下載欣賞。


更多精彩,加入圖靈訪談微信!

相關文章