來到阿裏雲後,SRS大神楊成立說:“終於可以不用裝大神了”
最近的楊成立,幸福感有點滿,他自謙地說:“終於可以不用裝大神了。”
楊成立是阿裏雲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是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的微信公眾號。他覺得這能解決人的問題,一個消息發布出去,幾百人收到後能有提升,最終是整個行業人員水平的提升。
而解決人的問題,也是《人月神話》最核心的思想。
想定時閱讀更多好文章,請關注微博@阿裏雲雲棲社區
最後更新:2017-07-19 09:32:46