最近的杨成立,幸福感有点满,他自谦地说:“终于可以不用装大神了。”
杨成立是阿里云CDN的高级技术专家。对于他,Tengine开源项目发起人、阿里巴巴集团开源委员会成员叔度评论称,成立是撸代码大神。似乎嫌这样的形容力度还不够,叔度又在结尾重点补充:“他是一个纯粹的技术人。”
2007年毕业,到今年正好是杨成立工作的第10个年头,但他却写了12年代码。在这12年里,他做过2年C#和ASP.NET、1年C++程序员,而后外包到微软做了1年测试。“软件最终是要解决问题,而对于业务的熟悉,再加上编程的能力,才能创造大价值。”这份思考和认识,让他接下来在流媒体行业沉淀7年。
这7年,贴给他的标签——除了前观止云CTO外,还有SRS大神。SRS(Simple Rtmp Server)是基于MIT协议的开源流媒体服务器项目,由杨成立发起并维护。谈到这段经历,已经来到阿里云的杨成立轻描淡写地说,他只是写了一个非常简单的RTMP功能,并利用业务时间维护下而已。“和阿里的牛人相比,却是名不副实的空帽子大神。”他说,“哪个更实在这很明显。”
杨成立说,十年前他就立志于工业级大规模软件系统的研发
莎士比亚在《特洛伊罗斯与克瑞西达》中说:“一个人看不见自己的美貌,他的美貌只能反映在别人的眼里。”杨成立究竟是怎样的一个人?云栖社区就此采访了这位阿里云的技术人,将他的经历呈现于各位眼中。
“我想象有个键盘,然后学会了盲打”
“我想做点有用的事情,所以从小就想怎么能独立养活自己。”谈及与计算机结缘的经历,杨成立用这句话做了开头,他说:“我是个穷小子,来自一个很穷的农村。”
高中时,他接触到了计算机——尽管2002年,学校教学用的还是DOS机,但仍然让他眼前一亮。敲一敲就能打出字,程序能按照自己的想法算出点什么,更为关键的是编程只依赖于自己的脑力……自此,杨成立在心中认定计算机会非常有用。并且在没有键盘的情况下,他想象有个键盘,并学会了盲打。
填志愿时,他毫不犹豫地选了自动化——这位高三学生认为用计算机控制机器,用处会更大。然而想法和实际总是有差距,到了大学才发现,自动化专业只是在大二会教计算机课程。
杨成立非常迷恋编程,后面他选择自学。自学的成效,在毕业设计时体现。“用C语言写一个简单的学生管理系统,老师给了2周上机,我用了3天左右写完,剩下的时间就是部分同学抄我代码。”他还分享了一个细节,“记得因为实现一个链表存学生信息,把Next指针直接用Fwrite写磁盘去了,读取时直接读出来,所以那个指针有时候好有时候坏,程序有时候会崩。”后来搞清楚了,他对C语言的指针有了深刻的理解。
大二那年,他有了自己的电脑——第一个属于他的“它”。这份记忆很清晰——3000元、CRT显示器、赛扬1GHZ、512MB。杨成立说,有钱的同学都开始上液晶了,但他不能那么奢侈,因为农民老爸挣点钱不容易。这份珍惜不止如此,“每次看着电脑,要是没有努力用好它,我就很有负罪感。”除了C语言,杨成立还自学了C++、Photoshop、Dreamweaver以及一个古老写网页的IDE,也开始着迷OO(ObjectOriented)思想——那个时候,他什么都是往00上想一想。
在大二下学期,他获得实践的机会。他鼓足勇气去应聘时,还很担心。旁边面试的同学被问到“C++和C的区别是什么”,当听到“C++还没有C好”时,他心中一阵窃喜:“对手是这个水平,有戏!”
在勤工助学中心,他主要负责学校网站,有时也承接外面的网站项目。时隔12年,杨成立还记得负责中勤在线的那位老师名字——欧旭理。在采访中,这位纯粹的技术人用了“伟大”一词形容这位老师,似乎想传递自己的感激之情。之所以如此感激,在笔者看来,除了很多宝贵收获外,还有在进入中勤在线后,杨成立终于实现了养活自己的目标。
中南大学南校区有个荷花池,旁边有桂花树和石桌。杨成立说,大学最美好的回忆就是:“花着中勤在线发的零花钱,九月桂花飘香,在荷花池旁的石桌旁,一点点的翻着经典的软件书籍,享受着作者所享受过的软件过程。”这一切,妙不可言。
“一开始应把基础打牢,而不是找最熟悉的领域多赚几块钱”
C++和C之外,大学期间杨成立还实践了C#,以及看了很多书。
看书,他都是跟着每个例子,一行一行代码反反复复的敲,如果没有弄懂就再看一遍。“比如《MFC深入浅出》,这本书比较难懂,也很厚,结果被我翻得更厚了。”杨成立说,这本书对于理解虚函数非常的有用,因为MFC里面大量的虚函数;同时对于框架的概念,也开拓了他的视野——一般比应用软件大的就是框架,比框架大的就是系统。
编程之外,他也看软件工程的书,譬如《设计模式》、《软件工程》和《人月神话》。这三本书,他的收获是:《设计模式》分享了解决某些通用问题的最佳路径经验;《软件工程》让他知道软件行业大规模软件用瀑布是怎么死的…等;《人月神话》让他学到不仅仅是“人月不可互换”这句话,也还有对于软件规模的本质分析——问题在哪,出路在哪。
毕业时,杨成立已经有10万行代码经验,而且非常擅长ASP.NET和C#。但他不想找一个C#的工作。“我很熟悉C#了,为何要找个C#的工作?”他觉得应该把基础打牢固,而不是找自己最熟悉的工作多赚几块钱。他想找C++的工作,因为高性能服务器和计算领域,都是C和C++。
在做了一年C++后,他又做了一年测试。去做测试,主要是他在毕业时看了TDD相关的书,认识到了测试对高质量代码的重要性,“编程能力和测试都是非常重要的。”
很享受客户惊讶的表情
“软件最终是要解决问题,而对于业务的熟悉,再加上编程的能力,才能创造比较大价值。” 到了毕业的第三个年头,杨成立决定选一个行业沉下来。
2010年互联网流媒体开始兴起,他来到了做网络电视台的浪弯。一开始从Flash播放器做起,Flash是Actionscript,他没接触过,但他很淡定:“没有用过,学就好了,难道能比C++还难么?!”当时浪弯有七八个播放器,一个客户就用一个(定制个功能就拷贝一份代码)。花了6个月时间杨成立调研了OSMF和FlowPlayer,选了Adobe的OSMF框架做播放器,所有客户都用一个播放器,用不同的皮肤和控制器。这些对他而言不难,因为MFC框架比这个要解决的问题多太多了,通过分层就能解决定制化的问题。活干完后的结果是,老板很满意,而杨成立也算入行了。
浪弯的视频文件转码系统质量很差,画面没有竞争对手的清楚,负责项目的同事离职了,老板问杨成立能不能接。彼时的杨成立,连IPB帧都搞不清楚,FFMPEG是什么也不知道,但他不觉得有什么好怕的——不懂可以学嘛。
杨成立除了解决编码质量的问题外,还尝试用Python调用FFMPEG命令,先将视频转码成YUV不压缩,这样对比两个不同的转码参数对于转码质量的影响。参数有很多,每一组参数的效果要隔一定的时间才能知道。经过一个多月的煎熬,用脚本对比解码后的文件大小,读取FFMPEG的输出参数,最后还是没有结果。杨成立决心在这个行业了,所以他没有放弃。这时,他记起PPS的师弟说X264那些默认的Preset非常好用。死马当活马医,调试X264的参数,问题解决。
迈过这个大门槛,杨成立信心大增。解决了质量问题,还需要解决速度问题。当时转码系统设计成切片转码,把大文件切成小片,然后分发到集群各个机器转码,然后再合并,这对于某个文件能达到非常高的倍速转码。对杨成立的挑战是,需要学习FFMPEG的API,了解编解码的基础知识,并和团队的编解码高手一起实现多倍速转码系统。过程很复杂,不同的策略会导致不同的结果,架构也调整了很多次。譬如把音频分离出来,单独转,只是对视频切片。
经过1年左右的调整,终于可以在客户那边开卖了。“当时客户看着我们一个2小时的文件,2分钟就转完时,他们真的好惊讶。”杨成立说,他很享受这个惊讶的表情。
客服高呼研发万岁
2012年,杨成立来到蓝汛,这时RTMP直播,也开始流行起来。
当时蓝汛用的是Adobe的FMS/AMS服务器,每年得付不少的License费用,而且随着客户量的增长,要付的费用越来越高。更重要的是,FMS/AMS没有源代码,也没有提供集成和定制服务。譬如计费就只能解析FMS的日志,这个日志本身不是用来计费的,所以有时候会出现5Gbps的流量。那时候CDN的机房都是千兆网跑满也不过1Gbps,肯定是个Bug。
于是,计费系统就和流媒体组商量好,如果超过1Gbps就算是异常日志,丢弃。然而蓝汛自己RTMP服务器上线时,单台服务器超过了1.5Gbps(一台双网卡服务器),结果就没有计费,免费给客户服务了。除了计费,出了问题也无法排查,只是知道连不上,推流失败,播放失败,不知道为什么,FMS的日志也没有任何信息。蓝汛只好自己研发RTMP流媒体服务器。
流媒体服务器一方面是服务器,一方面是流媒体。杨成立从epoll和select开始看起,学习nginx如何处理连接;看rtmpdump如何处理RTMP连接。那时候RTMP协议已经公开,对照着协议看。三个月的实习期后,他给出了可行性报告,又过了三个月RTMP源站服务器做好了。当实现RTMP边缘时,杨成立发现nginx这种epoll异步处理机制处理RTMP这种复杂协议非常麻烦,每个包都是一个状态变更,特别是需要回源时,这个状态会呈指数增长,多到无法处理。后来研发负责人引荐了当时北美的架构师Michael,一个经验丰富的老程序员,五十多岁还在写代码。杨成立说:“那时我的英语听力很差,只知道他提到要么分割状态把小状态组合成大状态,要么就用setjmp和longjmp实现类似线程的机制——我也写了7年代码了,竟然不知道还有setjmp和longjmp。”于是,他赶紧补课,看ST(StateThreads)这个库的代码,学习怎么用,看setjmp和longjmp,以及coroutine、Golang,事后他感叹到,原来程序的世界还有这么个世外桃源。
杨成立思考,Golang最关键的是goroutine,和ST就非常像。不过ST是解决网络IO问题,在服务器领域用的。而GOLANG是在语言级别,解决所有的通用问题。协程可以简单看成“不用加锁的线程”,因为没有锁所以不用等待,没有竞争条件所以不用小心锁这个锁那个;之前代码上很容易有很多状态需要一起处理,现在就是几个if-else直接搞定。“如果可以用多线程,你的程序会如何写?”,对于服务器来说,会简单太多(如果还不用考虑锁的话)。而对于云计算,大部分程序都是服务性质的,需要在各个连接之间切换,这就是为何Golang在云计算中大行其道的一个原因。于是,他果断把蓝汛的服务器改变架构,从epoll异步状态机,换成ST的,两周之后边缘服务器就发布了,非常非常惊人的速度,他说连自己都吓到了。
上线后,各种问题来了,短则半小时,长则一周,还好Bug都能找到原因,那时候杨成立每天嘴巴里都长着溃疡,压力太大了。在所有Bug中,有一个令他记忆犹新。一个月都找不到原因,每隔三五天就崩溃一次,从coredump也看不出来什么原因,堆栈信息都没有。在一个月之后某天,突然灵光一闪可能是metadata释放后被重用了,野指针的问题,果然顺利重现挖出了这个大bug。
在加入蓝汛仅8个月时间,就上线了服务器1.0版本。2012年底,杨成立成为蓝汛的优秀员工。后续就是各种优化和解决问题,以前排查不了的问题,现在都是清清楚楚知道哪里有问题,大部分服务器直接兼容客户的编码器或播放器,客户只需要再推流就可以接入。但也有特别的,“记得有一次有个客户的编码器很奇特,所有CDN都接入不了,客户嚷嚷着要切其他CDN,我们客服自信的说蓝汛解决不了的问题,别的CDN也解决不了,结果蓝汛最先兼容他的编码器。”杨成立清晰地记得,他们的客服因此高呼研发万岁。
一年之后上线2.0,所有RTMP边缘都换成了蓝汛自己的服务器。这是杨成立做过规模最大的一个系统,部署在CDN全国各地的机房,跑在很多台服务器上,7X24提供服务。
蓝汛的这段经历,让杨成立获得很多启发,他发现技术是山外有山,人外有人,必须要不断地学习、进步,并多交流。“有时候大神一句话,得自己摸索好几年。”也正是CDN的这段经历,让他看到了云计算广泛的市场,那是一个可以用得上工业级大规模系统的地方。
补上技术拼图的最后一块
从C、C++、C#、SQL、JS、Golang到Python,从软件工程的知识和应用到TDD和测试,再到视频行业的播放器、FFMPEG、服务器等,杨成立似乎在完成一个技术拼图,而这块拼图还差一块——团队管理。所以杨成立接下来选择去了观止云,一个需要带领团队完成目标的工作机会。
在蓝汛每天考虑的都是服务器问题和技术,虽然在团队管理上得到了蓝汛VP付亮的大量指导,但是管理的实践机会太少了;而在观止每天考虑的是团队该怎么带,开始定考核晋升制度、选拔干部、培训程序员,CR代码。
当然杨成立也在不断学习,比如AngularJS、BOOTSTRAP、Golang等。“每一门技术都有特殊的背景,想要解决的问题,还有思考问题的方式,表面看是一门语言或技术,但是只要是因为新的业务或者应用场景而诞生,背后的思维方式就会改变。”他进一步解释到,譬如C对比汇编,C++等对比C,GOLANG对比C++,JS和H5,都是完全不同的思考方式和应用场景。
他说,在观止云的管理经历,主要是转换了思路,以前考虑问题总是从技术牛逼不牛逼,门槛有多高,自己怎么解决问题来想。当成为管理者,考虑的有时候是值得不值得,市场是否能接受,是否有替代方案,现有的方案开源的方案如何实现,什么才是最佳的路径达到目标,如何统一团队的目标和每个成员的目标等。
在观止云,他还领导团队和又拍云搭建直播CDN。回顾这段经历的艰难险阻,他说,主要的阻力不是技术上的,而是又拍的业务团队和观止云的研发团队两个团队的合作问题。譬如又拍没有流媒体的经验,而又拍的直播CDN需要和现有业务系统对接;譬如又拍有空间和服务的概念,而流媒体是没有的,流媒体就是域名。因此,业务上的变更也导致对接结构有变更,甚至分发的架构也调整过几次。但后面经过一次培训后,以及差不多一年的磨合,这些问题都解决了,顺利接入客户。最后的结果是:又拍直播的指标,特别是HLS+的指标,在业内是最好的。
写SRS是意外,只是好玩而已
杨成立在SRS领域很有名,被称为SRS大神。对于SRS,杨成立首先指出,SRS是Simple RTMP Server,不是蓝汛的那个服务器。
之所以写SRS,主要是他在和蓝汛的同事交接工作时,因为之前的服务器功能非常多,有些没有用到,比较复杂且难懂。再加上在观止也不做服务器,于是就写了个Simple RTMP Server给蓝汛的同事看。这是一个非常简单的RTMP的功能,后面他也只是利用业余时间维护SRS。
正面SRS,杨成立说其实是个意外,没有大的梦想,没有宏伟的计划,只不过是好玩而已。但直播这股风在2014,特别是2015年达到顶峰,关注SRS的越来越多,所以SRS在直播领域的影响力越来越大。
与此同时,SRS也成了杨成立展示自己想法的平台。譬如软件的概念完整性和一致性,杨成立称,这是非常虚的事情,但是在OOAD中是一个重要强调的理念,也就是提高软件的概念完整性。“我有个ISSUE专门收集破坏概念完整性的情况,譬如HLS应该只在源站出,在边缘出没有意义,边缘需要RTMP访问才能有HLS,这个就是概念完整性性。HLS的功能应该只在源站有,加在边缘就破坏了概念的完整性,这个HLS在边缘是个残废的功能,是不完整的,不可用的。”他举例到,譬如TDD,SRS会有UTEST,不过在这个方面做的还不够,可以有机会展示TDD该怎么做,有什么好处。譬如产品的规划,对于功能的审慎,简化业务,这些都是产品研发中比较重要的理念,如果有一个开源项目,就可以一直探索和实践这些理念,不断的积累。
杨成立说,这些理念最终会呈现在大家面前,无处不在,最终体现在WIKI和ISSUE中。“譬如我发现很多朋友虽然不用SRS,用的是NGINX(譬如阿里云CDN),但是也非常关注SRS,把SRS的WIKI过一遍。因为SRS那些问题都是归档的,概念的变更,遇到的问题都在ISSUE中列出来,这些问题就算不用SRS,用NGINX也一样会碰到。
喜欢身边的人比自己牛
杨成立说,十年前他就立志于工业级大规模软件系统的研发。正是这样的想法,让他从浪弯到了蓝汛,又从蓝汛到了观止云,接着又来到阿里云。
他说,从浪弯的规模上来说,Flash播放器和转码集群都比较小,十几台转码机器的集群算很大的了,离工业级大规模集群的目标相差太远了。到了蓝汛,蓝汛流媒体集群和SRS服务器,是他做过应用最大规模的两个系统。但看到云计算广泛的市场后,他才发现那才会是用得上工业级大规模系统的地方。
今年2月份,杨成立于是来到了阿里云。来阿里云有两个主要原因。一是上面说的,阿里云机会有很多——因为它的规模、客户足够大,难题也足够多。第二个是叔度的一句话打动了他,杨成立还记得这段对话:“我不想去阿里还做SRS,想做点其他不会的,但是这又不会马上给阿里创造效益,怎么办?”叔度回应称,阿里云主要看人,原意给机会尝试,给时间打磨产品,用人的潜力而不仅仅是能力。“用人的潜力而不仅仅是能力。——也是这瞬间,阿里在我心中的份量变得非常高。”基于这些考虑,杨成立毫不犹豫的选择了阿里云,尽管阿里给出的offer待遇不是最高的。
阿里云HR衣航对杨成立的印象非常深刻,他说杨成立是个挺单纯的技术人,对收益各方面不是很在意:“当初跟他聊时说,最打动他加入阿里的是现在的CDN团队牛人很多,他喜欢身边的人比自己牛,有团队的感觉。” 衣航也透露,另一个打动杨成立的地方是阿里云所倡导的白胡子工程师的概念。
回顾面试过程,杨成立说,3轮技术面试,对阿里技术水平有了一个感觉,入职后越了解越觉得阿里工程师文化很好,水平很高。这让他对于大规模系统有了新的认识:大规模业务才能产生大规模系统,以此循环,而反过来却不成立。另外,这位SRS大神也感受到阿里云对于招人的严格,他认为这是非常正确的做法——不拉低团队的水平。物以类聚,聚集一万个参差不齐的程序员,不如聚集十个水平都很厉害的高手,因为高手过招水平会更高,反之只会越来越低。
来到阿里后,杨成立发现阿里的牛人比传说中的要多,幸福感满满的。他说:“终于可以不用装大神了,在阿里我是个小兵——是每天快速学习和成长的小兵。”他谦虚地指出,在SRS圈子我可能是大神,但是却是名不副实空有个大帽子的大神,哪个更实在是很明显的。
当笔者问到他在阿里云接下来的工作,杨成立说,暂时还不清楚,只是知道那一定是他暂时做不到的工作。为什么是这样?这位阿里云技术专家称,借着直播的东风,在流媒体圈子里的他的确是有了点名气,但对于他而言,并不觉得自己现在已经是技术巅峰,相反,还觉得离自己的目标非常的远。“我希望看到更多的可能,能做自己不会的事情。”而不是再次重复一遍搭建一个直播的CDN,他觉得这是在浪费“绳”命。
花名“忘篱”,他说是为了鞭策自己不傲娇
杨成立说,他非常热爱写代码,所以记性和鱼差不多。
鱼的记忆很差,有一句广为流传的话说,鱼的记忆只有7秒。但令我们疑惑的是,热爱代码和记忆差之间,似乎并没有什么因果关系。杨成立并没有直接给出答案,但解答却在他回忆的叙述中。
最直接的,或许就是他在大三一次“忘记”考试的经历。杨成立说:“还记得考试那天,我正好在学校的中勤在线写代码,把考试完全给忘记了。过了一半的时间,突然想起来今天好像是数据结构的考试!赶紧飞奔过去,还好老师让我继续考试了,三下五除二考试完了继续回去写代码。”他说,记性大约就从那个时候开始,越来越差了。
而这也是杨成立在阿里云花名的渊源,他的花名是“忘篱”——出门忘记关篱笆。
“如果在遥远的古代,我想大约每次出门,都会忘记关篱笆吧?”当然,这只是字面上的解读,他进一步解读:“严肃的说,实际上‘忘篱’是英文Winlin的中文发音,也就是Windows+Linux两个非常普及系统的名称缩写。”杨成立认为,这两系统在软件行业有着非常了不起的成就,所以他造了一个单词Winlin做英文名。
“希望我时时刻刻不要忘记,要不断努力,不能傲娇。因为自己的成绩离Windows和Linux还差很远。”
结束语:
在采访最后,笔者也想起他说的两件事:
一件是他谈及国内和国外在流媒体领域的差距。他说,技术上的差距本质是人的问题。国外重视标准,提出各种协议、做各种开源,而不仅仅是做出来一个东西,而更希望是成为标准、互利互惠,减少重复劳动——这是人素质的差距。
第二件是他的爱好。他非常喜欢维护SRS的微信公众号。他觉得这能解决人的问题,一个消息发布出去,几百人收到后能有提升,最终是整个行业人员水平的提升。
而解决人的问题,也是《人月神话》最核心的思想。
想定时阅读更多好文章,请关注微博@阿里云云栖社区