QCon全球软件开发大会8折优惠倒计时,购票立减¥1760!了解详情 >>> 了解详情
写点什么

专访阿里巴巴研究员赵海平:从 Facebook 到阿里巴巴

2015 年 4 月 02 日

赵海平,2007 年加入只有不到 50 个软件工程师的 Facebook,致力于软件性能和架构分析,在此期间创建了 HipHop 项目,重新编写和实现 PHP 语言,使其速度提高 5 到 6 倍,为公司节约数十亿美元。HipHop 项目之后,致力于“用异步处理来优化分布式系统”的设计理念中,并为此做了多项分布式数据库的优化研究,在 PHP 语言中加入了 yield 和 generator 的新功能,来帮助日趋复杂的 Facebook 网页设计。

2015 年 3 月,他回到中国,加入阿里巴巴技术保障部,任职研究员,将重点攻克阿里巴巴在软件性能以及Java 使用过程中遇到的技术问题。

InfoQ 已经邀请他在 4 月 23 日~25 日举行的 QCon 北京 2015 大会上做主题演讲,分享《异步处理在分布式系统中的优化作用》。是什么吸引他加入了一家中国的互联网公司呢?InfoQ 对他进行了专访。

InfoQ:首先欢迎您回到中国。可以介绍一下您加入阿里巴巴的初衷吗,阿里巴巴最吸引您的地方在哪里?

赵海平:去年机缘巧合,我和阿里巴巴的同事有了交流的机会。当时我们聊了很多技术细节,发现阿里巴巴的规模非常之大,很多技术上的难题是美国公司都没有的。比如说双十一这个问题,没有哪家美国公司单天有这么大的交易量,这是很特殊的一个问题。这个技术问题对我特别有吸引力。

当规模大到一定程度,简单的问题也会变得复杂。有的时候软件就是这个样子,在一台或者几台机器上执行是一个情况,当机器多到一定程度时,对软件的要求就特别高了。在多台机器上,怎么才能保持很快的速度,并且节省机器,又不出问题,这是一个很难的技术问题。

单天的资源需求是平时的好多倍,怎么计划机器,让峰值最高的那天不出现问题,平时又要做到很好的利用,这是很不容易的。我特别希望自己能够有这么一个经历,去阿里巴巴解决这个问题,这是在其他公司找不到的技术问题,而且跟我很对口,我一直在做的都是怎么提高大规模系统的性能、稳定性,所以这正是我的兴趣所在。

InfoQ:您在阿里巴巴的新角色就是解决这些基础设施的性能问题?

赵海平:基本上是几个方面,性能、稳定性、容量、架构,还有运维,恰恰就是我现在这个团队——技术保障部——的工作。性能提升上去,容量就增加了,随着我们监控系统的改进,系统的稳定性也会提高,运维也会更方便。如果发现架构上的问题,我们也会做些调整。

InfoQ:谈到性能问题,定位是很关键的一点。像这种规模的分布式系统,如何实现全系统的监控,准确定位问题就非常重要,您会在这方面发力吗?

赵海平:Profiling 特别重要。如果能有一个特别强大的 Profiling 系统,就知道整个系统在哪个地方,哪台机器上,花了多少 CPU、内存、磁盘 IO 或者网络带宽等资源,才能知道优化什么地方效益最大。

所以我的第一步工作就是帮助完善阿里巴巴的监控和 Profiling 系统,希望能够很清楚地把软件的整个性能展现给大家,做到实时监控,同时让研发人员看到自己的代码在线上的运行情况,了解这些代码花掉了多少资源,这样有问题的话他们可以自己解决。

InfoQ:大家对您的最初印象多是来自 HipHop for PHP 这个项目。像淘宝之前就从 PHP 切换到了 Java,而 Facebook 选择了自己改进 PHP。可以谈一下这个项目吗,当时的出发点是什么样的?

赵海平:HipHop 也是一步步慢慢建立起来的。最初是我遇到了一个 PHP 的函数,在 C++ 里也想用。当时想,重写一下就可以。不过那个 PHP 函数不断在变,我就想写一个简单的工具,把这个函数转换成 C++,这样就可以跟上 PHP 代码的变化。那时正好机器开始吃紧,大家意识到 PHP 的速度问题,CPU 消耗很大。大家就开始讨论如何提高 PHP 的性能。当时想法很多,有人想改变 PHP 本身,有人想干脆用 Python 或 Java 重写网站。

当时也重写过,有三四个人在做这件事情,但这些人改的速度远远赶不上另外二三十人写新 PHP 业务代码的速度。所以我们就想到写一个工具,来转换这些新写的代码,既不干扰既有的开发节奏,又能大幅优化性能,跟上变化。

当时我也读了下 Zend Engine 的代码,研究 PHP 为什么会慢。发现 PHP 速度之所以慢,是因为有很多的函数调用是动态的,而像 C 和 C++ 里,很多函数是静态调用,不需要在执行的过程中去查询函数指针在什么地方,所以速度才快。

所以我们做了很大的调整,一定要改变这种方式,争取让所有的函数调用都能尽快实现,在编译的时候静态处理,执行的过程中就不需要再查询,指针已经在那儿了,这是最主要的加速思路。

那时候就萌芽了一个想法,如果能够把 PHP 直接转换成 C++,也许这个性能问题就解决了。然后就花了很多时间去做原型。我们做了很多工作,把底层的 PHP 实现都改变了,有一个自己的 Runtime Library,再就是一个 PHP 的扩展库,这个实际上是很大的一块代码。在这个上面,我们又写了一个把 PHP 转换成 C++ 的一个编译器。先将 PHP 编译成 C++,然后靠底下的这个库实现功能。这是最早期的工作。

不过这在当时只是一个副业,因为不知道这个东西到底有没有意义,是不是能提高性能。大概能拿出 30%~40% 的时间做这个。做完之后发现效果很好,就加入了其他同事一起做。后来速度不断提高,第一年提高了 2 倍,第二年又提高了 2 倍,后来提高到 5~6 倍的样子。

现在回头看,如果当时雇很多人把网站改成 Java 的,也是可以做到的,但 Facebook 的发展可能要停半年到一年时间,甚至更久,就有可能对 Facebook 的发展带来不可预期的影响。这件事情主要还是业务推动的。

InfoQ:后来 HipHop 发展成 HHVM,从原来的静态编译变成了动态的 JIT 机制,您也参与了这方面的工作吗?

赵海平:引入 HipHop 之后,我们也有自己本身的一些问题,比如产品环境和开发环境就是不一样的,这样多多少少会存在一些问题,也就容易出现 bug。再就是 Facebook 的代码量非常庞大,编译时间非常长,另外生成的二进制文件也非常大(超过 1G),发布也很困难。

这时就出现了 HHVM。HHVM 不再是把 PHP 转换成 C++,而是采用了一种新方法,把 PHP 转换成一个中间码,这个中间码在执行过程中再转换成机器码,不过调用的还是我们原来为 HipHop 写的底层库,它取代的主要是把 PHP 编译为 C++ 的过程。

我并没有参与 HHVM 的编写,当时我已经离开这个小组了,另外一件事情吸引了我,这就是异步处理在分布式系统中的优化作用。

之所以离开这个小组,原因大概有几个方面:一个是,个人认为 HHVM 不再能把性能提高更多了,后来也确实如此,两三年之后 HHVM 出来,速度并没有更大的提高,最高只比原来静态编译机制快 10%~15%,而且是因为静态编译这一块不再开发了。再就是新的课题特别有意思,具体我会在 QCon 北京上分享。

这就是为什么去 GitHub 上看,HHVM 里面会有我的代码,主要是底层的代码还是基于 HipHop 的。HHVM 的头两个字母就是来自 HipHop,引擎还是原来的,不过上面做了很多工作,把 PHP 转换成中间代码,这个有点像 Java 的 JVM。这样的好处就是研发过程和产品过程其实是一样的,而且不会有原来说的那种超大二进制文件的问题。中间代码很小,PHP 可以直接发布到线上系统上。

InfoQ:国外一些著名的互联网公司,在性能调整和优化的过程中,慢慢都发展出了自己的编程语言,像 Facebook 设计了 Hack 语言,Google 有 Go 和 Dart 等语言,Apple 有 Swift 等。这方面您有什么感想吗,Facebook 的 Hack 语言您是不是参与设计了?

赵海平:Google 的 Go 语言挺有意思的,写得非常好。Hack 语言我没有太多的参与。

PHP 是弱类型的,这是性能提高的一个瓶颈,而强类型的话就可以做很多优化。最初我们是想增强 PHP 的类型系统。强化数据类型,这是引入 Hack 的一个主要因素。

InfoQ:PHP7 最近也有很多改变,性能提高也比较大。

赵海平:这也是我临来之前刚刚听到的。PHP 核心开发组的力量是很强的。我也跟他们的人员交流过,他们对整个 PHP 的优化有自己的思路和想法,也做了很多工作。这是件好事。其实重要的并不是说哪个团队或小组把 PHP 优化到什么样的地步,有几个小组都在做这个事情,彼此竞争,会促进整个 PHP 生态系统的发展。这种竞争也恰恰说明了 PHP 的重要,所以会有很多人关注它的性能优化。

InfoQ:您对公司发明创造自己的编程语言怎么看?

赵海平:编程语言这个问题,我说两点。第一,不能把语言当成一个特别神圣、至高无上的东西。语言也是整个软件系统的一部分,只是它分割的很好,独立出来了,可以执行更多的功能,我们可以用它实现我们的功能,可是在整体架构上看,语言也只不过是软件系统的一部分,而这一部分我们完全可以做一些调整,使其更适合我们的系统。而设计语言时一般考虑的是比较通用的目标,我们拿来用,只是因为它的绝大部分特性都是我们想用的。比如我们用 C 和 C++ 写程序的时候,每次都要思考内存的模式是什么,是不是用 share pointer,是不是用自己写的 Object,内存的 allocation/deallocation 怎么做,一个语言帮我们把这些事情都做好了,这就是它的好处。它提供了一个很大的库,提供了一个软件执行的环境和范围,而这正是我们选择语言的初衷。

第二,作为一个公司来讲,不能说为了研发一个语言而去研发一个语言。这是没有意义的。一定要根据自己想要做的事情,在现有的软件架构当中,我们发现当前所用的语言提供的环境和范围不太适合,或者说这个语言的很多假设和假想,和我们所期待的东西并不一样,只有在这个时候,我们怎么也找不到一个合适语言的时候,我们才会创造一个新的语言,让这个语言更适合公司的事情。如果可以通用化,提炼出来,那就是语言,否则设计成软件库就可以了。

这是水到渠成的,不要强求。像 Google 开发 Go 语言,我认为它有自己的考量,可能在开发很多分布式系统的时候,现在的语言写法上不太直观,或者速度不够快,所以才创造了这么一个东西。Go 应该能解决公司内部的很多问题,否则是很难存活的。

InfoQ:您可以结合自己这些年的经验,给中国开发者的成长一些建议吗?

赵海平:在美国的时候,我跟 Facebook 的中国员工聊的很多。我给他们最多的建议就几条。

第一,一定要提高交流能力。咱们中国人,尤其是中国搞计算机的人,很多人有个不该有的特点,就是喜欢把自己锁在黑屋子里埋头干活,跟机器交流特别擅长,跟人的交流一窍不通。这样不行,我相信在中国也是这样的,你不但要把自己的工作,技术活要做得特别好,而且要擅长表达自己的想法,擅长在工作当中讲述做的是什么,怎么样能够说服别人,怎么样能够跟别人在不伤和气的情况下,把问题解决好,这是很强的一个能力,而这个能力不是在学校里能学会的,是我们走向社会之后慢慢学到的东西,这个我恰恰认为中国的员工,尤其是在美国那样的环境,因为不是母语,可能处理得就不是特别好,有时说出来的话比较生硬,给对方的感觉不是特别好。

第二,中国人比较谦虚、内敛,讲究内涵,自己心里有的东西不表达出来。但是在工作中,可以适度强势一点,勇敢表达自己的想法。当然这个建议是基于美国多元文化的背景,在国内大家的文化背景一致,也许可以探讨最合适的沟通方式。

第三,掌握好英语,开拓眼界。我觉得在计算机这个技术里边能够非常了解英语,把英语的这个隔阂给去掉还是非常重要的。

我回来的时间还不长,等和大家接触多了,可能会有新的想法,目前就这几点吧。

InfoQ:好,感谢您接受我们的采访。期待您在 QCon 上的分享。

2015 年 4 月 02 日 03:1223305
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 117.7 次阅读, 收获喜欢 27 次。

关注

评论

发布
暂无评论
发现更多内容

面试阿里被质问:ConcurrentHashMap线程安全吗

Java架构师迁哥

LeetCode题解:18. 四数之和,哈希表,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

阿里大牛亲自总结整理的一线互联网公司面试真题及面经(阿里、网易、字节)

Java架构之路

Java 程序员 架构 面试 编程语言

架构师训练营第 13 周课后练习

薛凯

北纬37°的浪漫与理性,穿越千年的信息之变

脑极体

架构师训练营第九周作业

丁乐洪

光知道SpringBoot,不用thymeleaf就太不对了

小Q

Java 学习 编程 面试 Spring Boot

字节首发Redis笔记,基础+原理+应用+源码+拓展五大核心模块

Java架构追梦

Java redis 编程 架构 面试

Swift函数调用逆向分析

ios swift

第四周 系统架构 作业 「架构师训练营 3 期」

feiyun123

极客大学架构师训练营

架构师训练营第 13 周作业

netspecial

极客大学架构师训练营

如何透彻理解 Redis 核心原理?怎样才能形成 Redis 系统观?

Java架构师迁哥

在wildfly中使用SAML协议连接keycloak

程序那些事

程序那些事 SAML openid SSO wildfly

mybatis二级缓存,7个问题拿下它

田维常

mybatis

区块链落地应用开发- 珠宝溯源,不当“冤大头”

13828808769

区块链技术 区块链落地开发 珠宝溯源

DeFi流动性挖矿系统APP软件开发

开發I852946OIIO

系统开发

第四周 系统架构 学习总结

feiyun123

极客大学架构师训练营

列举出常见的Java面试题100+,我靠这个在十月拿到了阿里的offer

Java架构之路

Java 程序员 架构 面试 编程语言

泡泡玛特市值千亿背后,我们为什么会为盲盒买单?

脑极体

mybatis一级缓存是啥?5个面试题回答你

田维常

mybatis

懒人神器——新手必备的图片后期处理软件

懒得勤快

图片后期 修图 滤镜 ps

阿里P8传授给小老弟的Java面试宝典,竟让让小弟也拿到了P8的offer,傻眼了

Java架构之路

Java 程序员 架构 面试 编程语言

从月薪3K的Java菜鸟,到年薪80W的Java架构师,靠这份文档,让我学习像打怪升级一样简单!

Java架构之路

Java 程序员 架构 面试 编程语言

工厂模式学习

en

golang 设计模式 工厂模式

面试必问系列,源码解析多线程绝对不容忽视得问题:线程活性故障

小Q

Java 学习 架构 面试 多线程

阿里9年老开发终于总结出微服务架构设计模式PDF了

小Q

Java 学习 编程 架构 面试

架构训练营-week13-作业1

于成龙

架构训练营

[架构师训练营第 1 期] 第 13 周学习总结

猫切切切切切

极客大学架构师训练营

架构训练营-week13-总结

于成龙

智慧城市管理平台,多规合一平台搭建解决方案

t13823115967

智慧城市

可视化指挥调度平台搭建,应急指挥调度监控中心建设方案

t13823115967

可视化 指挥调度

移动应用开发的下一站

移动应用开发的下一站

专访阿里巴巴研究员赵海平:从Facebook到阿里巴巴-InfoQ