人物

人物

七牛首席架构师李道兵:在开源世界里逼自己成长

{%}

李道兵,七牛云存储首席架构师。他曾是北大化学专业博士研究生,中途毅然转行至自己喜欢的互联网行业。2007年加入金山实验室,2010年加入盛大创新院, 曾先后参与了盛大网盘项目和盛大云项目。2013年,李道兵加入七牛云存储,任职至今。他热爱开源,曾先后担任维基百科中文管理员,Debian Developer,协助维护 iso-codes 等开源软件。他喜欢架构,参与了不少高压力项目的结构设计,推崇高可用,可伸缩,低耦合的架构设计。

问:你是从什么时候开始编程的?为什么没有坚持自己原来的化学专业?

我高中才开始接触到电脑,大学的时候兴趣大增,还找了一份帮人做网站的兼职。研究生阶段专业是计算化学,所以不仅有大量编程的工作(我的课题算法需要自己写,没有现成的软件),还要帮课题组维护一个由几十台Linux服务器组成的集群,所以也积攒了一些 Linux 运维的经验。离开学校后没有继续做化学的一个原因是我没能正常毕业(文章发表不太顺利),最后拿了肄业证书走人;另外一个原因是兴趣转移了,自己的职业规划就是要往软件行业走,所以是否有一份化学的学位证书对我影响不大,所以就没有坚持下去。

问:你认为现在的开源社区环境跟你当初成为Debian Developer时的环境有哪些差别?是否仍然鼓励今天的程序员为开源软件做贡献?

差别挺大的,当时开源软件的最大威胁还是来自大公司的一些不实攻击(特别是微软的一些FUD策略),而现在的最大挑战可能是来自开源软件的主导权问题。主导权是留在社区还是会慢慢变成由公司来主导?GNU组织的影响力也在逐渐下降,大家对开源主导权继续保留在社区的信心也在逐步下降。

我觉得程序员参与开源是好事。一方面开源世界有很多问题需要解决,解决这些问题能倒逼自己快速成长。对于我来讲,如果没有参与开源的话,我的水平会比现在差很多。另一方面是理念方面的原因,我觉得能够贡献一点时间给全人类谋点福利是值得的,特别是在那些可以沉淀下来的事务上。所以我也在维基百科、翻译等项目上贡献过自己的时间。

问:有人认为大量的开源软件其实都是闭源软件公司的广告而已,请问社区主导开发的开源项目和公司主导开发的开源项目有什么本质的区别?这两种方式各有哪些优势?

作为一个开源软件的用户,开源软件给我们提供了一种可能,让我们很方便地使用、研究、改善我们日常的软件,大部分我们的必备软件都算是社区主导的,比如操作系统(Linux), 命令行环境(bash等),编辑器(Vim, Emacs),编译器(GCC),图形界面(GNOME, KDE), 浏览器(Firefox),音视频播放(MPlayer) 等都应该算是社区主导的。只是现在很多新兴的技术逐渐掌握在大公司的手上,比如 Xen, OpenStack, Docker等。

作为一个软件的主导者,我觉得开源提供了一种全新的合作模式,这个合作模式能让软件的发展更顺利,包括 Python, Emacs, Debian 这类的软件都从这个模式获益匪浅。

公司的优势在于可以集中人力,所以在推进方面比较给力(比如 Chromium/Chrome)。开源能够让很多想法充分竞争,最后最有生命力的想法会自然冒出来。比如在命令行环境这个领域,开源方就出现过 sh, bash, ksh, tcsh, zsh 等软件,互相竞争,互相借鉴想法,发展得很好。另外一个优势就是参与感带来的巨大激励,比如开源社区的人更愿意去报告bug,修复bug。相比之下,微软的命令行工具出于保护目的,同时也有投资、改进动力不足等原因,所以一直很难用。

问:你曾先后在金山、盛大创新院、七牛工作,你的足迹和老许基本相同,同时你们也是工作上的好搭档,请问他是否对你造成了某些影响?

那是当然。老许是我认识的人里技术钻研最深的一位,包括 C++, Erlang, Golang 等语言,以及各种高并发模型,还有我们的各个业务的底层模型。我跟老许的选择有一定的互补性,比如我更关注于项目本身,比如项目管理、质量控制、持续集成、持续交付、网络安全这些方面的东西。

问:七牛在2011年成立,而你在2013年才加入七牛,请问你当时是如何加入七牛的?

我2012年离开盛大,加入了一家小公司。大约过了一年,老许请我吃饭,问我是否有兴趣加入七牛,我就直接答应了。毕竟跟老许合作过多次,也知道老许在做一些很酷的事情,所以能加入七牛也是求之不得的事。

问:你曾在一个“七牛为什么要做云存储”的slide中提出过一条理由是“很酷”,请问这种“酷”体现在哪些方面?

对我来讲,存储很酷的原因在于存储之外的其他模块已经逐步平凡化了。Nginx+业务逻辑层+数据库+缓存层+消息队列这种模型几乎能解决所有的业务,再加上最近又从语言层面逐步把高并发的问题解决了,所以只要不涉及到大规模文件上传,大家的架构都会比较类似。

但一旦开始涉及到大规模文件上传,存储就马上转变成架构中最重要的一部分。毕竟对于结构化数据的持久化,我们已经能很熟练地使用数据库、分库、分表、表外索引等技术来支撑数十数百亿的记录,但对于非结构化数据的持久化(即文件存储问题),手边能用的组件都有这样那样的缺点,要么容量不足,要么运维成本太高,要么不支持高可用,要么性能太差。存储作为架构设计中最难啃的一块,能够用云的方式来解决是一个非常漂亮的主意。

常规的 IaaS 平台倾向于把所有东西都放在一朵云上,我觉得应该充分结合不同云的优势。比如把数据库和业务逻辑的部分放在网络覆盖好的8线BGP机房,静态文件和用户上传的文件则要放在流量成本低的普通机房,这样做才更合理。

问:七牛开源了不少项目在Github上,也有很多人在为这些项目做贡献。广泛地参与开源项目为七牛的技术气氛和团队建设带来了哪些好处?

主要是思路的活跃。对于每一个场景,大家都对现有已有的开源解决方案比较熟悉,知道这些项目的优缺点,于是就可以合理利用这些软件。如果是只能用自己写的软件,要么不停地重复造轮子,要么适配上很别扭,降低了组件效率,同时也增加了bug。

问:七牛内部是否有人在鼓励和推进对开源项目的参与(比如你或许式伟)?你们又是如何推进的?

招人是很重要的一环,我们招的人很多都是在 GitHub 有过不少贡献的,这些人已经了解到参与开源项目的好处了,很多人也会持续参与。

另外,我们也鼓励大家把发现的 bug 和引入的补丁回馈到开源社区,特别是我们用的多的 Go 语言、MemCache、MongoDB、FFmpeg这类组件。

当然,控制工作节奏也是很重要的,合理安排工作时间,不仅让大家工作效率高、bug少,也能给大家更多的机会去钻研技术,而参与开源就是钻研技术很重要的一个手段。

问:七牛在持续交付方面有哪些经验可以分享?从持续集成到持续交付,有哪些重要的问题需要解决?

我们的方案算是比较常见的。首先我们用 GitHub 来放我们的代码,用 Travis 来做 merge 前的单元测试。之后又用 Jenkins 来做完整的集成测试,最后是一套我们自己写的部署系统(如果规模小的话,这套部署系统用 Puppet+Capistrano 替代没有任何问题)。

首先,测试方面问题都不大,部署稍微有点麻烦,我们的做法是用一套独立的测试集群实现软件的预发布。其次就是灰度部署的问题,灰度部署完成后如何让开发人员能清晰地判定新版本是否存在bug,这个方面需要很多辅助工具。最后就是多机房、大量机器的程序分发问题。

问:能否详细解释一下你曾提出过的机房云?机房云是否就是七牛现在的一站式数据平台?

机房云是我的一个不太成熟的想法,跟一站式数据平台有点联系,但不是一个东西。机房云的想法主要是针对PaaS平台的一些缺点提出的。PaaS平台试图接管客户的所有业务,但对于大客户来讲,一个没法线上 debug,线上检测性能瓶颈的平台是很难接受的。我很希望一些独立的功能模块能够外包出去,比如数据库、队列、缓存、图片处理、音视频处理、语音识别等。对于这些模块,我希望实现高速访问,那么就不能用简单的 SaaS 平台来满足,而一个贴着机房部署的服务就比较合适了。

对于七牛一站式数据平台,最主要的作用是帮助客户解决如何方便地使用数据的问题。比如围绕图片,就有缩放、裁剪、水印这类常规需求,也有监黄、广告识别等很个性化也很有技术门槛的需求。七牛不会自己来完成每个需求,因为我们首先没有这么多开发力量,也缺少对应领域的技术积累,而且如果每个需求都由七牛来做的话,更妨碍这方面最优秀的服务商的成长。我觉得七牛的最佳做法就是撮合拥有数据的人和能处理好数据的人,我们的目标是降低数据服务的使用门槛,减少接入数据服务的沟通成本,让数据拥有方和数据服务方都能更快地发展。

问:七牛的一站式数据平台的开发现在处于什么阶段?一站式数据平台的技术难点在哪里?

我们已经在针对种子服务商逐个接入了,这个阶段主要还是在摸清接入中可能会遇到的阻碍,以及需要我们调整平台来解决的问题。这个平台的技术难点在于对各个语言的支持、程序的隔离、快速伸缩,以及如何确保客户数据的安全性。

问:为了实现一站式数据平台的愿景,未来还有哪些需要做的?

除了继续改善和稳定平台,还要接入更多的供应商来满足不同客户的需求,设置更灵活的计费方式,建立更多的 demo来降低大家的接入成本,等等。

问:七牛最近推出的鉴黄服务是和图谱科技合作完成的,两个团队各自的分工是什么?在未来七牛还会和什么样的团队继续合作?

图谱科技主要是提供监黄技术,我们的接入平台提供了计算能力支持、伸缩性支持、计费支持。当然,整合的工作量不低,这也是未来我们的重要努力方向,努力让整个接入过程更加自动化,从而加快接入的速度。未来我们会接入更多的处理团队,比如语音识别、面部识别、图片深度压缩、视频指纹、视频深度压缩等等。

问:你很喜欢算法,并且曾经在Topcoder上很活跃,请问你是否推荐其他程序员参与Topcoder或类似社区组织的活动?

我在Topcoder上算不上活跃,成绩也只能算是勉强,不过 Topcoder 对我的帮助很大。在Topcoder上玩,最重要的一个层面在于思路的严密性,你少考虑一个环节,就一点分数都拿不到。当然,在那里我的建模能力,还有视野都得到了很大的提高。我也很喜欢玩过 Topcoder 或者其他算法竞赛的同事,他们的代码出 bug 的概率很小,而且很多地方写得很巧妙,我经常能发现一些对我很有启发的代码。

云巴创始人张虎:一个优秀的软件工程师必然是全栈工程师

{%}

张虎,云巴 (yunba.io) 创始人兼CEO,致力于为开发者提供优质云后端服务。他有十几年的软件研发经验,精通嵌入式系统、服务器端架构、虚拟化等。张虎曾就职于华为、Oracle,他是Oracle VM 的创始团队成员。离开Oracle后,他创立了极光推送,曾任CTO,他创意并主导开发的系统为过万开发者、过亿终端用户提供推送服务。张虎长期关注业界新技术、新实践,并持续引入到团队实践验证。

问:你是从什么时候开始编程的?

高中开始用学习机时就对学习机产生兴趣,当时玩过一点BASIC。正式学习编程是从大学阶段开始的。

问:关于计算机和软件的知识是通过什么渠道获得的?对于大学的计算机教育你有什么看法?

大学学的是数学和机械方面的专业,计算机的基础知识都是靠自学。大学期间,有段时间我的所有活动不是编程就是踢球,或者是在上课时看计算机相关书籍。每当看到好玩的游戏、好用的软件,第一时间想到的都是我自己能否也写一个类似的出来。刚开始工作时,我对操作系统痴迷到了一种几乎狂热的地步,连续花了几年时间研究了很多系统的源代码。

我个人不太赞同目前的大学计算机教育方式,这几年面试了来自各种学校的大学生,普遍的感觉就是基础知识不够牢固。很多大学的计算机教育的核心就是编程,以教授C++,Java这些高级语言为主。但是,高级语言掩盖了太多的细节。虽然它确实有利于你快速编写出可用的软件、提高生产力,但在学习阶段,却不利于基础知识的累积。

问:你是如何加入Oracle的?又是如何成为Oracle VM创始团队成员的?

我是2006年离开华为后加入Oracle的,那时候基于Xen的虚拟化刚开始有一些影响力。Oracle在深圳和北京的一个团队开始启动开发Oracle VM。我当时对虚拟化特别感兴趣,就申请加入了团队。

问:在Oracle工作的经历对你来说最大的收获是什么?

在Oracle的工作经历让我意识到一个软件产品的开发不仅仅需要在技术上到位,还需要有匹配的品牌包装和市场宣传。在产品开发的过程中根据产品需求,我们需要不断地对产品的方向和定位做一些调整。好的产品除了在技术上要有创新之外,还一定要很好地为市场需求服务。

问:作为国内第三方推送的发起者,你在创立极光推送的时候国内还没有类似的服务,请问你当时是怎么想到从这个角度开始创业的?

我当时比较关注Android在中国的发展,也有很多朋友聊过关于推送方面的问题。当时面临的问题是Google的 C2DM(现在的GCM)在国内因为种种原因不能使用,而国内的Android厂商各做各的推送系统,对开发者来说没有一个统一的解决方案,我感觉市场需要有一个面向开发者,独立于厂商的第三方推送产品。正好,当时有个前同事,创业即将失败,账户上还有一点钱,经过沟通,我们就启动了这个产品,也就是后来的极光推送(JPush)。

问:请问你离开极光推送的原因是什么?

因为当初我是以加入一家现有公司的形式启动极光推送这个产品的,当时在股权结构上就有不合理的隐患。后来,公司之前的产品完全放弃,全面投入做极光推送,其结果是团队里很多原来的创始人实际没参与过极光推送。

我作为极光推送的发起人和创始人,却对公司运作的实际控制权有限,管理团队成员之间难免会产生问题,影响了产品和公司的发展,最终促使我做出了离开的决定。

问:在第一次创业过程中遇到过什么困难?这些经历帮助你在现在的创业路上做出了哪些不同的选择?

极光推送可以说是我的第一次创业。现在回头看,当时对创业可以说不是很了解。我只是对产品、服务、技术有自己的认识,知道怎么去做,知道方向是什么,但是对整个创业过程,比如怎么跟团队谈股份,怎么分配大家角色,怎么跟资本沟通,却经验有限。所以常常觉得如果当时能有一个导师指引就好了,这样整个团队的发展可能会到一个更高的层面。

经过这件事之后,我对于在公司初创、发展,以及取得成绩之后的各个阶段中的人员协调、利益保障都有了比较清楚的认识,也因此将这些经验运用到了创建和管理云巴上面。

问:如何想到要创立云巴这个平台?现在的发展方向和最初的想法是否有一些不同?

计算机的网络,除了计算、存储的功能以外,还有个重要的功能就是信息的交换,换句话说就是通讯。随着网络和硬件的发展,通讯逐渐被划分为人与人之间的通讯、人与机器之间的通讯,以及机器和机器之间的通讯。

人与人之间的通讯已经有很多企业在做了,比如QQ、微信还有企业内部通讯工具这些。往往被人们忽略的是人与机器以及机器和机器之间的通讯,这比人与人之间的通讯量大得多,而且通信的方式存在较大的区别。

机器之间发消息,做不到“他没理我,我再给他打个电话”。目前我想做的就是找到两个传统领域的结合点,从人们认为没有太大联系的两者中找到结合的机会,而不是盲目地进入已经成熟的领域。目前国内市场并没有一个真正适合的产品。

目前公司发展的方向和当初的设定基本一致,但在宣传和市场开发的侧重点上略有调整。以前的想法还是以移动互联网App为主,结合智能硬件、物联网。经过过去一年的验证,我们发现现在很多产品实际都是以智能硬件为中心,手机上的App管理智能硬件,所以我们现在对智能硬件、物联网开发者的支持度不断加强

另外,价格策略我们也在不断微调中。我们希望为开发者提供起步门槛足够低,按使用量付费,体验良好,并且可靠、可持续发展的产品。

问:云巴的用户案例中展示了掌阅、Yo、以及云巴小车的案例,这些案例是否代表了云巴提供的主要产品类型?来自各种用户的不同需求是否也对云巴的产品产生了影响?

几个不同的案例展示了我们产品在不同场景不同需求下的使用。包括手机App、智能硬件。另外还有一些智能家居的产品,也在使用云巴服务。

我们在跟不同的用户沟通的过程中,发现用户对服务的极低延迟、可靠性、机房的本地化部署都非常关注,这也直接影响了我们对云巴系统设计的调整,甚至是开发语言的选择。目前,我们产品绝大部分模块的集群管理、业务逻辑代码都用Erlang改写。

问:现在云巴面临的最大挑战是什么?(新产品开发、性能提升、或者技术转型?)

每天,不同的手机App、智能硬件、服务器通过云巴系统进行数千万的实时消息通信。如何为所有的平台提供实时、可靠、高效的服务,是云巴面临的最大挑战。

围绕这些挑战,具体来说我们目前在攻克几个技术点,包括:

  • 高可用、高并发、极低延迟,并且支持复杂数据类型的内存数据库系统;

  • 多机房多活的部署方案。

问:在创业之初,你们在团队的分工问题上(开发、测试、运维各司其职)走过弯路,后来用Devops的方式解决了这个问题。请问Devops是值得推荐给所有初创团队的工作方式吗?

DevOps是开发和运维这两者的有机结合,我认为初创团队都可以尝试一下这种联合开发模式。目前的互联网创业最重要的是要快速响应市场的需求,而在传统的开发模式下技术部门和运维部门是脱节的,他们有不同的目标需求。一款产品需要满足市场上的现有需求,开发部花了很大的心思和精力,完善功能,用了很厉害的新技术,之后一股脑的丢给运维部门。这时运维部门是很慌的,可能这款优秀的产品根本就无法运行,或者他们完全不了解这个产品的新功能,这样运维部门会不断地给开发部门提出改进需求。这样一去一来等产品真正完成了,早已经过了产品上线的黄金时间。有很牛的开发者,有很牛的运维人员,更需要协调统一这两者的步调和目标,而DevOps正好提供了这个方法。

虽然DevOps对产品开发的过程很重要,但团队更需要在意的是整个项目方向的正确性。

问:你对很多新的语言和技术都很关注,比如Rust和Elixir,请问你个人和你的团队都是通过什么方式学习和考察新技术的?

我们团队过去一年(2014)从零基础开始学习 Erlang,并且把我们系统大部分模块用 Erlang 改写。

最初期,从我自己开始,调研了现有使用Erlang的产品,特别是实时高并发的产品,我阅读他们的博客和发表的文章,了解他们的心得。后来我开始写一些产品的原型,团队部分成员开始尝试解决一些小bug,慢慢开始写一些小模块。这段时间我会review所有代码,引导团队学习正确的方法。经过一段时间的积累,部分成员就慢慢能独立编码,再发展就有人能参与review代码了。

我们对于编程语言的选择首先从稳定性、分布式,以及能够长期运行等方面去考虑,不能只一味地跟风现有最“时尚”的语言或者使用人数最多的语言,因为我们的产品需要面向海量并发服务,合适的才是最好的。

另外,我们团队也在持续关注新的语言和平台,比如 Rust、Golang 这些最近新出现的语言。Elixir 这种在现有平台上产生、对开发者更友好的语言,我们也在尝试准备引入。

问:在云巴的招聘要求中,对于全栈软件工程师和前端工程师的要求是最高的,请问云巴的前端工程师和全栈工程师是如何合作的?

云巴的全栈工程师主要负责对后端功能的实现,后端系统的成熟度直接影响整个产品的成熟度。

前端工程师的工作目标是把我们的产品优雅地呈现给我们的用户。视觉、交互体验,直接影响用户对我们产品的喜好,所以我们也非常重视。

在我们团队内部,我们经常说前端就是我们系统的一个HTML5 App,后端的工作就是提供友好的接口,帮助这个App达到良好的用户体验。

问:有一种流行的说法是掌握了Node.js的前端工程师就是全栈工程师,而云巴的全栈工程师似乎更像是传统意义上的后端工程师。请问对你来说,全栈工程师意味着什么?

我们定义的全栈工程师,更强调对一个完整系统的各个环节原理的理解,包括操作系统、网络、编译系统,还包括问题定位、性能测量、性能调优等方面的动手能力。而不像我们经常看到的传统后端工程师,往往强调对某种特定语言的掌握。我们的全栈工程师实际上都掌握多种语言,以满足不同方向上的工作需要。

从某种意义上来说,一个优秀的软件工程师必然是一个全栈工程师。在一个以技术为导向的公司,顶级工程师的能力直接决定了整个公司的能力。

问:你喜欢“玩”操作系统和各种编程语言,你在招人的时候也会以这样的标准来要求程序员吗?

刚开始工作时,我连续花了几年的时间研究 Linux Kernal、uCOS、Nucleus、vxWorks 等系统的源代码,尝试几乎所有的编程语言,包括汇编在内。

“玩”这些东西除了是我自己的兴趣外,也是工作需要。但是不一定每个人都有机会在工作中接触到这些东西,所以我们对工程师也没有这样的硬性要求。

但是,就像任何代码都运行在 CPU 上一样,几乎任何软件也都是依赖操作系统的,软件开发工程师对操作系统的深入理解,几乎是成为一个高手必须具备的能力。另外,学习操作系统的编写,也是提升能力的一个很有效的方法。

除了很底层的几个编程语言外,几乎所有的编程语言都是为特定领域发明的,学习一个领域的新语言,实际是学习了一个新的思维方式,可以帮助工程师从各个不同的角度思考问题。所以我个人觉得多花一点时间去多了解一门编程语言是很值得的。

{%}