Skip to content

聊聊过去的技术历程 #30

Open
@codefollower

Description

@codefollower

这篇文章的写作背景来自知乎的这个问答
zhh-2015在分布式系统和数据库领域研究水平和工程能力怎样?

快奔四的老码农了,正好在休养期间,写篇长文如实回顾一下,年轻人看了也许会有点帮助吧。
工作、考研、成长、晋升、技术研究、创业、职业病都涉及了。

从2006年讲起,分三个阶段:

  1. 2006年-2010年 独立研究阶段
  2. 2010年5月-2012年7月 在淘宝工作的阶段
  3. 2012年8月至今 独立研究与创业阶段

1. 2006年-2010年 独立研究阶段

2006年以前做过4年的电信移动行业的应用项目,因为厌倦了做业务系统,想寻找方向,并且还攒了点积蓄,所以在2006年年初选择了辞职,走上了考研之路,复习了8个月后又发现读研不是自己想要的,刚好又迷上了编译器和程序语言理论,随后放弃考研,宅在家不工作,走上了兴趣驱动的自学之路,一直持续到2010年5月初。

这4年沉寂的时间阅读了大量技术书籍,下面这篇博文中提到的书名大多数都是在这段时间涉猎的:
想通过自学成为一个有良好计算机专业素养的Java程序员要读哪些书?

书本上的知识自然是满足不了我对技术的饥渴的,因为最开始是痴迷编译器,加上2006年当时的SUN公司把Java语言编译器(Javac)和HotSpot VM都开源了,所以在补完了基本的理论基础后就很兴奋地去研究Javac的源代码了。

2007/2008年Ruby On Rails大火,Java社区感受到了前所未有的恐慌,当年的JavaEye论坛上一大片Java将死的言论,作为Java铁杆粉丝我自然是不服的,为了探索Java全栈web框架的新方向,进而转去研究Tomcat、iBatis甚至包括MySQL/PostgreSQL的JDBC Driver这类开源项目的代码。

经过几年书本和代码的狂轰乱炸,很自然的产生了把编译器用于应用服务器的想法,第一次品尝了我也能做技术创新的甜头,造了第一个纯技术的属于自己的全栈web框架,直到2009年的11月份,在JavaEye论坛首次发布了第一个原型版本并讲了一下心路历程,获得了不小的轰动,见下文:
Without SSH/JSP/Servlet,不走寻常路,Java可以更酷

也是因为在JavaEye论坛上发布的这一篇博文,开始在网上有了点小名气,并且被当时的淘宝员工看到了,问我想不想去淘宝工作,可以帮我内推。2010年经过好几轮面试,在5月初,我正式入职淘宝中间件团队,结束了4年多独自一人宅在家潜心研究技术的生活。
这期间深入研究过的开源项目,包括Javac、Tomcat、iBatis、MySQL/PostgreSQL JDBC Driver、Volocity等等,我都或多或少的加了代码注释、文档以及自己写的测试用例,5年前我把它们都放到GitHub了,一方面怕丢失,另一方面对于有兴趣的人也可以看看。以下是连接:
Open-Source-Research
Tomcat-Research

我造的全栈web框架叫Douyu,名字来源于斗鱼,这是一种小时候很喜欢的生命力很强悍颜色又很艳丽的鱼类,可以从下面这个连接中找到这个框架的源码(里面对Java语言编译器做了定制):
Douyu

2. 2010年5月-2012年7月 在淘宝工作的阶段

2.1 TDDL小组

淘宝中间件团队当时的负责人是华黎,团队以Java开发语言为主,中间件团队有三个最核心的小组,刚好对应三架马车,分别是:
TDDL(Taobao Distributed Data Layer): 俗称"头都大了",TDDL是对MySQL进行读写分离和分库分表的中间件
HSF(High Speed Framework): 被戏称为"好舒服"框架,其实是一个RPC的服务框架
Notify: 消息中间件

我被内推到中间件团队在面试时是不知道具体岗位的,入职后分到了TDDL小组,可能是因为我比较了解iBatis和MySQL JDBC Driver的代码吧,加上我还懂编译器的知识,TDDL也有SQL Parser这些东西,所以综合来看,进TDDL小组比较合适。

进TDDL小组时正好赶上下一个大版本的规划,当时加上Team Leader(TL),有4个核心开发,然后还有一个新人,总共5个人。在没加班的情况下,经过将近4个月的开发,顺利发布。这个大版本如今看来是个里程碑,当时所用的架构和设计至今都没有什么大的变化。

开发完TDDL这个大版本后,团队有个同事离职了,他负责的一个项目没什么进展,然后我跟TDDL小组的一个同事又接管了这个项目,这个项目叫DB-Proxy,想用来解决MySQL的连接数受限问题。我们俩从头开始,用Google的Protocol Buffer设计了新的协议,实现了一个遵循JDBC规范的客户端,还有一个Proxy Server。用了两个月就做完了,不过后来又不用了,可能是因为在MySQL之前挂个Proxy,多了一个中转站,损失了10%-15%性能,所以觉得划不来。淘宝的应用基本上都是用Java开发的,并且并发量很大,对于中间件的要求很高,在网络中多一个中转站就会损失一些性能,为了追求极致的性能,TDDL才被设计成一种部署在客户端的中间件,这样就避免了不必要的网络开销。

另外值得一提的是,TDDL这个产品几年前已经在阿里云上面提供对外服务了,公有云的版本叫DRDS,这个版本因为考虑到外部客户的应用不一定是用Java开发的,如果客户用的是Node.js,那就不能在用Node.js开发的应用中直接使用TDDL的接口了,所以DRDS多了一种可选方案,为了支持多语言客户端,引入TDDL-Server,这跟DB-Proxy的架构差不多,但是要接受一点性能损失。

TDDL之前有开源过一小部分代码,后来不知为何又不开源了,可以从以下链接中找到开源的部分,还能从代码中找到@author yangzhu,这是我在淘宝的花名,这是阿里巴巴的企业文化之一。
TDDL

DRDS在阿里云上面的介绍可以从下面的链接中找到:
DRDS

2.2 Land小组

在TDDL小组工作了半年后,年底我晋升了一级,工资多加了几千,还配了点期权。

前面提过我进中间件团队前对Tomcat的源代码有比较深的研究,又自己造了个叫Douyu的web框架,我进淘宝时是打算看看有没有机会推广我的web框架,再加上TDDL小组的工作已经告一段落了,听说有个小组正在开发一个新的名叫Land的应用服务器,已经有一年了,这个小组比较边缘,刚好也归属在中间件团队,我很顺利地转过去了。

Land小组在我加入之前有三个人,过去才发现Land是个死气沉沉的项目,只能部署简单的后台Spring应用,连基本的web项目都不能部署,也不是什么Servlet容器。当时淘宝的应用服务器还是古老的JBoss(内置Tomcat 6),JBoss是一个完整的遵循J2EE规范的应用服务器,但是淘宝的应用绝大多数都是用Spring开发,所以J2EE中的功能大多数都用不到,只要使用Tomcat/Jetty这类Servlet容器就满足需求了。

分析了当时业务系统的需求后,我们觉得重新开发一个新的应用服务器是没什么必要的,如果想使用Servlet 3.0的新功能,还不如用Tomcat 7替换掉JBoss。

在Land小组期间我们做了一个叫依赖中心的小项目,经过三个月的挣扎后,Land项目宣告失败,Land小组被合并到HSF小组,Land小组的TL转岗了,我们三个人被归到HSF小组。

2.3 HSF小组

来到HSF小组后,因为当时的HSF经过两代人的努力已经相对稳定了,没有什么大的需求,只有一两个人在维护,做些小特性修点bug。这期间,因为集团层面想把一些老旧的基础设施做一些升级,所以JBoss也是要拿来开刀的,要用Tomcat 7替换掉JBoss。然后我就接手了Tomcat 7的工作,一方面是做Tomcat 7与HSF的集成,另一方面得找上百个应用放到Tomcat 7上面跑,看看兼容性如何。

另外我们小组当时还负责Webx框架的维护,Webx是一个类似Spring MVC的框架,是阿里巴巴的创始人之一周悦虹开发的,我去淘宝面试时最后一轮的技术面就是菲青(早期JBoss核心之一)跟他一起的。Webx也要依赖Spring,并且在阿里系的web应用中几乎是处于统治地位的。周悦虹大多数时间都在国外,Webx的代码基本上还是他一个人在弄,还好Webx当时已经相当成熟了,我对Webx的贡献不多,只贡献了一个特性,加快Webx的启动速度,我们组还有一个同事大多数时间都在负责Webx的答疑。

虽然我一直想把我的开源项目Douyu也用上,但是Douyu完全不走Servlet那一套技术栈,而Webx是难以撼动的,所以Douyu的后续开发就断了,光有好的Idea不行,得有场景去用去持续开发才可能成功,PlayFramework 跟Douyu的思路类似,还是同一时期出来的,它现在还是有挺多人用的,虽然Douyu失败了,但至少证明我的技术眼光还是不错的。

Tomcat这边几乎都在测试应用的兼容性,应用方也没有动力升级到Tomcat 7,太难推动了,直到毕玄跟多隆那边在做T4容器(虚拟化相关),才把JBoss替换成Tomcat 7这件事重视起来。期间有一件事能看出多隆还是很厉害的,好像是用户登录系统后发生了窜号问题,多隆比我还先发现是因为Tomcat中某处与Cookie相关的代码有bug。一直以为他是C/C++领域的大牛,没想到Java这边排查问题也这么快。
当然了,我也不弱啦,在Tomcat这边有件趣事也能证明我的实力。

事情是这样的,因为折腾Tomcat 7也有半年了,但是应用又不想升,所以当时我就想找找JBoss的安全漏洞吧,还跟HSF小组的TL说,要是有安全漏洞,JBoss又没有补丁,那升级到Tomcat 7就好办了。

因为当时淘宝用的是Apache + JBoss(内置Tomcat 6)的组合,我不擅长C/C++,对Apache的代码也没什么研究,我当时想,要如何通过http client发送一个数据包就能无声无息地通过Apache再对JBoss发起攻击,不但能拿到后端的一些敏感信息还能让JBoss所在的服务器CPU陷入循环达到类似DoS 的效果。Apache和JBoss之间走的是AJP协议,而http client跟Apache之间又是http协议,所以只能通过发送表面上正常的http协议包通过Apache后再用AJP协议转给JBoss。只要AJP协议有漏洞,那么就能通过精心伪造的数据包发起对JBoss的攻击,按这个思路,接下来两天(还是几天我忘了)把重心放到JBoss端的AJP协议实现上,没想到轻松地搞了个大漏洞,因为JBoss与AJP这一块本身就是Tomcat 6的代码,所以自然Tomcat也中枪了,而且是全部系列版本。只可惜的是,哪怕我这么努力了,在我辞职之前也没有看到应用从JBoss升级到Tomcat 7。

以下是寻找这个安全漏洞的最好证明,Reported: 2011-08-20 07:54 UTC by zhh
2011年就是我在HSF小组的那一年。
ajp CPing/Forward-Request packet forgery, is a design decision? or a security vulnerability?
CVE - CVE-2011-3190

2.4 HBase、TLog

从Land小组到HSF小组,直到2011年11月份,差不多整个2011年都像是打杂的。

从11月份开始,我们都在找活干找创新点,从HSF框架的调用日志开始思考,毕竟HSF是个RPC框架,如果能把每个API的调用通过抓取日志后做一些存储分析应该是件挺好玩的事,但是API调用日志的量太大了,全网每天都是千亿级别,肯定不适合存到MySQL。刚好当时NoSQL运动正是热火朝天的时候,加上Facebook成功把HBase应用到了自己的Message系统中,已经有人先吃了螃蟹,HSF框架的创始人毕玄虽然不在HSF小组了,但是他把HBase带到了阿里,并且历史订单查询库已经用上了HBase,数据平台部门还有个Hadoop/HBase团队,所以我们也要尝试用HBase来存HSF的调用日志。

当时HBase团队在维护HBase 0.90/0.92这两个版本,社区正在开发的是0.94,经过三周的调研,发现HBase 0.90/0.92无法满足我们的需求,而正在开发的0.94可以满足,然后我们不等发布就大胆使用还处在trunk中的代码了,当时工作之余我都在读0.94的代码,HBase出任何问题都算是我的。我们基于HBase构建了一个TLog系统,包括采集存储分析,经过三个月的努力成功上线了一个HBase 0.94的集群,TLog是这个集群的第一个应用。

因为开始做HBase和TLog已经是快年底的事了,所以2011年实际上没做出什么成绩,晋升自然也无望。阿里就是这样的,成果导向,技术再好,没做出成绩也没机会晋升。所以,要么跟对团队,要么自己跟团队努力寻找新方向。

TLog这个系统还包含了一个叫EagleEye 的子系统,经过小组其他人的努力,现在也在阿里云上面作为HSF一个功能模块提供对外的服务了,见下面的链接:
HSF

题外话: 我辞职后,某一年在网上听说HSF的小伙伴们给TLog这个系统引入了Storm,用于实时的流计算,然后似乎不太喜欢Storm所用的Clojure语言,不好定制Storm,最后用Java重写了一遍,弄出了一个JStorm。

2.5 辞职

2012年上半年,跟HBase团队一起推广普及HBase,从HBase 0.94集群上线以来,除了TLog之外,陆续有10来个新应用部署过来了,然后我们想扩大应用范围,也有业务团队的系统想接入,剩下的工作大多都是开会定日志格式之类的扯皮事情了。我对这些事情不是很感兴趣,辞职前的最后一两个月有点消极了,感觉在中间件团队没太多挑战了,去其他两个团队聊过也提不起兴趣,加上人在杭州家在桂林,30岁了,总有种漂泊的感觉,就想辞职回去了,于是在2012年7月底正式辞职。

中间件团队还是非常不错的,我印象中从没加过班,因为房子租在古荡湾新村,离公司很近,下班回去也无聊,所以常常晚上在公司呆到11点才回去,公司还有免费的夜宵吃,周末也常常在公司,同样有免费的盒饭。

在这里要很感谢我们的老大华黎,是他当初抗住HR的压力让我这种奇葩进了中间件团队,老大人很好,没有架子。还得感谢在JavaEye上发现我,并推荐我去淘宝工作的前同事伯岩,让我有了一段值得一提的工作体验。最后还得感谢我的几任TL,我确实不是那种很温顺的人,过去的一些小的不愉快都请忘记吧,对于沈询我特别抱歉,不应该在辞职后因为HBase的问题在微博上闹翻。还有各小组的同事们,都是我工作中遇到过的最和谐的小伙伴。

3. 2012年8月至今 独立研究与创业阶段

在淘宝工作两年半不到,攒了25万块钱,回到桂林后也不想工作,还是想像以前一样按自己的兴趣做点技术研究。因为HBase在阿里的应用很成功,大数据和NoSQL正是大热门,有阿里背书,HBase在国内就慢慢普及了。考虑到HBase的API相比SQL还是太难用了,当时我就产生了为HBase套一个SQL引擎的想法,因为我想把这样的SQL引擎内嵌到HBase中,而HBase又是用Java开发的,我又不想从头写一个SQL引擎,所以就找到了H2数据库。

从阅读H2数据库的源代码到把它改成一个分布式SQL引擎放到HBase上面跑花了半年时间,就这样做出了属于自己的第二个开源项目,给她起了个名字叫Lealone,灵感来自于在淘宝中间件团队工作时办公桌上那些叫绿萝的室内植物,一直想做个项目以它命名。

基于H2和HBase做出的第一代Lealone我不满意,然后2013年转去研究Cassandra了,参考Cassandra的架构对Lealone做了大量改造,第二代Lealone就是这么产生的。不过最后还是遇到了瓶颈,一时找不到好的突破点,于是在2014年转去研究HotSpot VM的代码了,跟数据库无关,只想从HotSpot VM层面做一些代码分析的工作,因为我读过很多Java开源项目的代码,总想找到一种能快速读懂大中型开源项目代码的有效途径,差不多整个2014年都是在苦哈哈的研究HotSpot VM的代码,因为实在是太难读了,一边读一边试着改,验证一些想法,虽然很苦,但这一年也没拿到什么创新成果。

2015年又回到数据库领域,继续探索下一代分布式关系数据库应该是什么样子,逃出Cassandra的固有思维,花了一年第三代Lealone就出来了,逐渐变成自己想要的产品,所以就决定在2016年创业了。
Lealone的详细演变过程可以看这篇文章:
Lealone过去现在将来
H2数据库的源代码研究在这里:
H2-Research
Cassandra这个NoSQL的源代码研究在这里:
Cassandra-Research
下面这个是HotSpot VM的源代码研究:
OpenJDK-Research

2016年创业第一年还是比较顺的,一边做数据库产品,一边做电信移动行业的大数据项目,因为不找风投,所以做点高质量的应用项目还是可以的,能赚点钱,也能积累客户,对将来推广产品有帮助。

不幸的是第一年工作太拼了,加上年纪大了,又长年坐在电脑前工作10几个小时,到了2017年年初,身体的毛病就出来了,颈椎和腰间盘都不好,特别是腰间盘,2017/2018年各有一半时间长期受腰间盘问题困扰,都没办法舒服坐在电脑前工作,基本上都处在休养状态,直到发这篇文章的现在都没法像以前一样高强度工作了,数据库产品开发进度缓慢。

现在只要身体好转了就会写写代码,没钱用了,就接点有价值的项目做做,有时也义务或有偿地做做技术顾问。

Lealone这个数据库会一直做下去的,因为除了她,也想不到什么更有挑战更感兴趣的技术方向了。
不是为了钱,只是不想生活太无聊。

就写到这吧,以下是Lealone的项目主页,90%的代码都开源了。
Lealone
以下是近期实现的或正在实现或构思的想法:
日常各类技术想法分享
统一批处理、流计算与 OLTP 数据库

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions