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公司的首席技术官。我们联系他的时候,他正在为公司即将发布的第一个产品忙得不可开交。

C++ API设计大师Martin Reddy:选择最合适的语言

恭喜你们公司在最近推出了新产品,你们的新产品是基于语音识别和人工智能技术,你认为语音识别和人工智能会是未来的主要发展方向之一?

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来说,你理解引用计数是如何工作的吗?你知道变量是由值还是由引用通过的?对于你工作上最重要的工 具,不要满足于表面的知识。你对自己的工具了解越深,你就会成为更好的程序员。

但是我个人认为一个好的程序员和一个好的工程师是不同的。优秀的程序员知道如何写代码,而一个优秀的工程师知道如何架构以及如何建造复杂的系统,在 这样的结构上会有更多的工程师为其工作。要成为一个好的工程师更加困难,而最好的老师就是经验。所以我会建议在校生去拥有大型软件产品的公司做实习,同时 作为工程师团队的一员,学习在复杂生产的软件上工作的流程和技巧。

记者在中国,很多人都更倾向于成为管理层。你认为程序员可以作为一生的事业吗?

相关推荐