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