C++ API設計大師Martin Reddy:選擇最合適的語言
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 的時候,我們就有一個“技術帶頭人”,這個人就會決定其他幾位工程師的技術方向,而另一位“管理帶頭人”就會接受大家的報告,同時也要指導并為這些人寫評 語。當然,像技術總監、軟件架構師、以及主工程師這樣的路線都是你提高自己的方向,所以你沒有必要非得擔負起管理這個包袱。