李道兵,七牛云存储首席架构师。他曾是北大化学专业博士研究生,中途毅然转行至自己喜欢的互联网行业。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。