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 的时候,我们就有一个“技术带头人”,这个人就会决定其他几位工程师的技术方向,而另一位“管理带头人”就会接受大家的报告,同时也要指导并为这些人写评 语。当然,像技术总监、软件架构师、以及主工程师这样的路线都是你提高自己的方向,所以你没有必要非得担负起管理这个包袱。