C++ API設計大師Martin Reddy:選擇最合適的語言(圖靈訪談)

盼盼姐發表於2013-10-21

Martin Reddy博士是軟體行業的一名老兵,有著15年以上的從業經驗,早年,他曾在SRI International供職5年,他成功建立了在Web上描述3D地球空間資訊模型的ISO標準,並且還連續兩年被選為Web3D協會的會長。他曾在Pixar動畫工作室工作過6年,擔任內部動畫系統的首席工程師,這些API在一些奧斯卡獲獎及提名影片的製作中都發揮了關鍵作用,這些影片包括《海底總動員》、《超人總動員》、《賽車總動員》、《料理鼠王》,以及《機器人總動員》等。據說《超人總動員》中的超人爸爸的頭部原型就是借用自Martin Reddy。  

他還開辦了一家諮詢公司Code Reddy,為各家軟體公司提供技術諮詢,為大型線上3D虛擬世界《第二人生》設計了API並改善了其基本架構。現在Martin Reddy擔任ToyTalk公司的技術長。我們聯絡他的時候,他正在為公司即將釋出的第一個產品忙得不可開交。

圖靈社群:恭喜你們公司在最近推出了新產品,你們的新產品是基於語音識別和人工智慧技術,你認為語音識別和人工智慧會是未來的主要發展方向之一?

Reddy:非常感謝!是的,在幾年前,Siri問世之後,我們就開始看到越來越多的用語音作為輸入機制的應用和裝置。從控制電話,到電視,再到遊戲控制。我認為我們想和計算機交流的方式應該和我們彼此間交流的方式相同。所以我預測我們將會看到語音識別技術的大規模飛躍,而且為了更好地理解我們說的話和做出合適的回應,自然語言處理和人工智慧這些相關領域發展也會日新月異。

圖靈社群:你曾經為Pixar動畫工作室工作過,這是一家領先於世界的團隊。你把它的成功更多地歸功於創造力還是它在技術上的優越性?

Reddy:從基礎的層面來說,Pixar的成功可以歸功於富有創造力的故事設計。複雜的故事線,討喜的角色,以及機智的對白會讓你鍾情於這部電影;而不是射線追蹤反射,或者新的子面散射演算法。但是,Pixar的獨特之處更在於它能夠把好故事和精彩的3D影像相結合。就像是John Lasseter(《玩具總動員》、《怪物公司》導演,《海底總動員》 和 《超人總動員》製片人)所說的那樣:“藝術挑戰科技,而科技激發藝術。

圖靈社群:除了C++你還喜歡什麼語言?你喜歡什麼工具?

Reddy:我喜歡用合適的工具來做合適的工作。C++對於開發可移植和效能優先的程式碼來說是一門很好的語言。但是其他的語言對於其他的工作很可能更加勝任,而且有些語言在某些環境下可以達到獨霸天下的程度,比如Objective-C之於iOS,JavaScript之於網頁。當我可以選擇的時候,我就愛上了Python。我曾經喜歡使用perl或者shell指令碼程式設計,我現在轉向了Python。甚至對於很多GUI工具,我也轉向了Python,PyQt和 PyInstaller環境下,我可以很快的開發程式碼,然後作為獨立的二進位制程式碼在Windows, Mac OS X, 以及Linux平臺上執行。對於我來說Python的最大問題在於run-time型別檢視的時候容易把程式碼運送給使用者,這樣就會因為型別不匹配或者未定義名稱而造成執行時的異常。為了彌補這個缺憾,我會經常在我的Python程式碼上使用原始碼檢查器,比如PyFlakes 或者 PyChecker。

圖靈社群: C++的應用領域變得越來越小,你認為它未來會有什麼樣的發展?C++的強勢領域在哪裡?你認為C++的演進方向是什麼樣的?

Reddy:好問題!我一直以來看見的都是C/C++處在最受歡迎語言的前列,但是其他的語言也在變得越來越被大家接受。在我的公司我們仍然在很多場合使用C++,因為它可以成為在眾多平臺上都能運轉的有效程式碼,同時也可以進入效能優先的3D影像庫和語音識別系統。但是,新的裝置和環境已經讓其他語言變得越來越突出。比如移動、平板,以及web開發現在正值火熱的時候,而且現在看來這樣的勢頭在未來只會有增無減。我認為C++在我前面說過的領域中是很強勢的,但是這些新湧現出的程式設計環境會有一些不同的需求,而C++對於這些需求來說未必是最好的選擇。我認為這是一件好事。

圖靈社群:你怎麼看C++新標準?它會影響API的設計嗎?現存的庫如何保持更新呢?

Reddy: C++11對於C++來說有很多很棒的提升。對於API設計而言,有很多新的特性你可以拿來用在你的API上,包括向元組、匿名函式、執行緒基元、智慧指標,以及嶄新的重寫和最終關鍵詞。當然,如果你的API必須要被無法使用C++11編譯器的客戶使用的話,那麼你就需要維持C++03語法了,或者為你的C++11客戶提供一個API包裝器。

圖靈社群: C++的ACE框架相當複雜,但ACE是當年分散式框架的首選。現今可選的技術相當多,使用複雜的C++構建分散式應用還有優勢嗎?有沒有更易用的C++網路技術框架?

Reddy:我對ACE不是十分了解,但是有一些可以選擇的底層網路框架,包括Boost Asio, cpp-netlib, 以及Qt的網路訪問API。

圖靈社群:一個新設計的系統API,早期版本經常陷入“狂熱”的增加特性(介面、引數、用途),而到了穩定期卻常常成為升級時甩不掉的包袱,甚至連早期bug都會變成被迫持續支援的“feature”。請問設計第一版API時如何在表達力、易用性、相容性方面達到平衡?

Reddy:這是API設計最為重要的部分之一:保持事情的簡單性。有一點你說得很對,所有出現在早期版本API中的特性都必須在API的整個生命週期中得到持續支援(除非你打破向後相容性的限制)。我支援不要在介面上新增任何東西的辦法,除非真的有必要。不要新增任何現在沒有用,但是你懷疑可能在未來會有用的東西。集中精力解決核心問題。

圖靈社群: Go語言變得越來越流行了,你對這門打算要取代C/C++的語言是什麼態度?

Reddy:我愛Go!它真是一門偉大的語言。事實上,在我們公司裡,我們在伺服器端的基礎設施上用的都是Go語言。它的編譯方式是靜態型別的,這一點和C以及C++很像,但是設計上卻比C++簡單很多,而且Go有強大的網路支援以及內建併發性基元,這點真是太妙了。而且Go語言的設計人之一正是Ken Thompson,他也是C語言的最初設計人,所以這門語言註定是很靠譜的!

圖靈社群:像Python這樣的“可執行虛擬碼”被越來越多的人所接受,你能預測一下未來的程式語言會是什麼樣的嗎?是寫文章一樣任人都會還是仍然屬於程式設計師?

Reddy:像我上面說的那樣,我喜歡Python。它解讀清晰和動態型別的特性讓它變得更容易上手,更好學習。加上大量的標準庫以及垃圾回收儲存器管理,我認為Python是最適合作為第一門程式語言來學習的。我也認同Python可以服務於非電腦科學家,來幫助大家實現計算和自動化,比如Python已經在生物資訊領域裡非常受歡迎。但是我認為我們始終會存在語言的分水嶺,不同語言會有各自適合的領域。有一些語言對於普通人來說更加平易近人,但是我相信我們仍然需要以效能為目的,可編譯、靜態型別的語言,這些語言在效率和準確性至上的領域會更為重要。

圖靈社群:作為程式設計師應該怎麼學習?要變成程式設計大牛需要數十年的時間嗎?有沒有捷徑可走?對於計算機專業的大學生們,你有什麼特別的建議嗎?

Reddy:我認為要變成程式設計大牛不需要數十年的時間。但是我認為要了解你的程式語言的深度和細節需要很多的熱情,要理解你的編譯器或註釋器是如何幫助你的,它們在後臺做的工作細節是什麼樣的。對於C++來說,你理解如何為模板生成程式碼嗎?你知道虛擬函式表是如何工作的嗎?或者多重繼承的問題在哪裡?對於Python來說,你理解引用計數是如何工作的嗎?你知道變數是由值還是由引用通過的?對於你工作上最重要的工具,不要滿足於表面的知識。你對自己的工具瞭解越深,你就會成為更好的程式設計師。

但是我個人認為一個好的程式設計師和一個好的工程師是不同的。優秀的程式設計師知道如何寫程式碼,而一個優秀的工程師知道如何架構以及如何建造複雜的系統,在這樣的結構上會有更多的工程師為其工作。要成為一個好的工程師更加困難,而最好的老師就是經驗。所以我會建議在校生去擁有大型軟體產品的公司做實習,同時作為工程師團隊的一員,學習在複雜生產的軟體上工作的流程和技巧。

圖靈社群:在中國,很多人都更傾向於成為管理層。你認為程式設計師可以作為一生的事業嗎?

Reddy:這是個有趣的現象,因為我看到的多數高階工程師都想一直寫程式碼,而不想變成管理層。如果你很擅長你正在做的工作,你可能就會得到升職,從傳統意義上講,這就意味著管理層。但是我現在看見很多“雙軌”型的事業發展,尤其在科技公司裡,也就是說你會得到升職但是仍然從事一線的開發工作。比如在Pixar的時候,我們就有一個“技術帶頭人”,這個人就會決定其他幾位工程師的技術方向,而另一位“管理帶頭人”就會接受大家的報告,同時也要指導併為這些人寫評語。當然,像技術總監、軟體架構師、以及主工程師這樣的路線都是你提高自己的方向,所以你沒有必要非得擔負起管理這個包袱。


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

相關文章