我在阿里实习做开源
作者 | 李志信
來源 | 阿里巴巴云原生公眾號
3 月 19 日,初春的杭州,依舊陰雨朦朧。透過 EFC 健身房的落地窗往外看,遠處的樓宇、青山、整齊的街道和稀疏的車輛在水霧中若隱若現。
午后的小憩時光,我拿了瓶咖啡回到工位,看著剛剛提交的 PR 通過了 CI check,這是我人生中作為實習生的最后一天了。
成長的過程就是不斷經歷和體驗的過程,一段又一段不同心境的開始和結束。我希望三個月后,那個過了 22 歲生日的年輕人會如愿順利拿到畢業證,再次出現在這里,我想那時的他一定更熟悉 Java 了吧。
本科時光
循規蹈矩的大學生涯,大概是是四年本科和三年碩士,而我屬于校園的時光,只有兩年半。在外實習到現在已經整整一年了,從北京到深圳再到杭州,我也非常慶幸能擁有這樣的經歷。
三段不同方向的實習,從最一開始在學校里的 GoOnline 在線 IDE 項目,讓我對真正落地的開發項目充滿了向往;到 “互享“ 平臺運維開發,讓我對企業落地的日常開發運維流程有所了解;再到看點業務開發與需求上線,讓我對擁有百萬用戶的項目和技術充滿了激情;再到中間件研發,專注于云原生領域的探索和落地。
第一段實習是在北京時代復興投資公司,期間充滿了懵懂和糾結的,糾結于是選擇研發還是科研,懵懂與對從沒見過的花里胡哨的各種工具的膽怯,但很幸運最終習慣了自己的選擇。
第二段實習是在深圳騰訊,整個過程充滿了刺激和危機感,危機來源于在社會上和技術上如何站住腳跟,驚險刺激于一連串從沒料到的事情。很感謝我能冷靜對待遇到的各種突發情況,來自就業的壓力,來自轉正的壓力,都不足以壓垮一個有夢想的年輕人。至今依舊懷念當時帶領我成長的導師 Steven。
去年秋天開始在阿里集團中間件團隊開始了我的第三段實習經歷,相比前兩次,這次實習舒服了很多。當看清前路的時候,活的還是比較滋潤的,所要做的就是積累、沉淀和享受來自研發的快樂。很幸運,實習經歷中遇到的導師、同事和領導們都非常 nice,都可以遇到一起聊天交心、一起吃飯喝酒的前輩們,或許對于初入社會的年輕人,是一盞盞指向未來散發光芒的燈塔。
dubbogo 社區
拿到阿里實習 offer 后還未入職西廠前,便被大 Boss 引入了 dubbogo 社區,被告知實習的任務就是推動dubbo-go?在內部的落地和 dubbo-go 3.0 的開發。這是一個有技術的組織,更是一個有人情味的地方。
時光到回到去年剛拿到 offer 的 10 月份,第一次將 dubbo-go clone 到本地,成功實現了 RPC 調用,心情是無比激動的。因為這個場景陌生中帶著熟悉。第一次 bug fix,第一次貢獻 feature,寫源碼解讀,再到后面成為 dubbo committer,投入 Dubbo-go 3.0 的貢獻中。專屬于年輕 IT 工程師的快樂,莫非于讓自己和項目一起成長。
在阿里的實習過程,2021 年的重大版本 dubbo-go 3.0 貫穿了整條時間線。從我尚未入職還在石家莊的時候,便開始一邊在按摩店洗腳一邊開周會接任務,到后面熟識了社區中的領導們、技術大佬們,很多次被前輩的技術和精神所感動,說社區充滿了人情味毫不為過。
馬上就要到了三月底,我也希望 dubbo-go 3.0 可以成為實習過程中屬于我的一份期末答卷,而 3.0 版本一定不是終點,而是國內開源 RPC 框架發展的過程所在,因為有了每一個階段的創新,才成就了在未來長河中的豐富的云原生發展史。
比起項目本身,我更愛這種技術氛圍:
- 很多技術人員可以凝聚在一起,各盡所長為了一個目標而努力;
- 一種“有我在項目就在”的責任心;
- 一種在貫徹于編碼中的開源項目的嚴謹;
- 一種聚會時可以快樂吹水和交流的默契。
就在上周六晚上,dubbogo 社區負責 dubbo-go-pixiu 項目的負責人鐵城大哥,為了慶祝自己成功從阿里外圍公司轉到盒馬,召集了社區杭州的網友們成功小聚。觥籌交錯間從技術八卦到社區秘聞,無所不談,并紛紛“討伐”圖中某位馬上從杭州某 IoT 公司離職要投奔螞蟻的大佬 _。很感激在前行路上遇到的許多優秀又充滿情懷的前輩!
Triple-go
實習當然不可能只有周末的風月,更多的是期間的工作經歷和成長。整個實習期間個人主要負責 dubbo-go 3.0 的 Triple 協議和新路由規則實現。
開源 Triple 協議作為 dubbo-go 3.0 的重要 feature,簡單來說,就是擴展 gRPC 協議,在 gRPC 的基礎上引入 dubbo 的服務治理能力和擴展空間。
剛開始想的很簡單,在 HTTP2 之上實現 Triple,并兼容 gRPC。但難點在于既要和 gRPC 在普通/流式/狀態碼上完全兼容,又要具有 dubbo 服務治理能力 — 在 dubbo-go 已有基礎上擴展,還要擴展的優雅。
- **手撕 HTTP2?**
只借助數據幀層的 SDK 手撕 HTTP2 協議,首先需要解決發包邏輯的正確性。搞了一兩個星期。實現了調用打通。
但自己實現的總會有問題…
除了數據幀發送正確,還要考慮滑動窗口流控、上下線、數據幀的拆包合包等等一系列流式場景下的問題。我的解決方法很直接,抓包看 grpc 怎么做的(沒時間看源碼了),然后按照它的邏輯去實現。
當問題一個在掉頭發的過程中解決,看似美好,實則陷入死胡同 — 手撕真的比不上官方庫,無論是穩定性還是速度。
- 改官方庫
一開始沒有選擇官方庫,因為 gRPC 并不是這么做的。調研的過程中感覺困難重重,Go 語言官方庫只給了少的可憐的接口,怎么自定義 Header 和 Trailer?怎么實現 stream 調用?給官方庫提交 issue 后被回復:“想法不錯,你自己實現個貢獻出來吧”…
在這一點上,隔壁 java 的實現就舒服了很多,功能強大的 java-http2 庫直接信手拈來。后來對于大型項目的貢獻已經有點恐懼了,條條框框太多,跟師兄學聰明點,干脆 fork 個分支自己改,改的自己都覺得騷,但是能實現需求。
很感謝經驗豐富的領導提醒我,官方庫可以試試用。
- 絲滑體驗
花了兩天時間換了底層網絡庫,體驗絲滑了很多,尤其是幾兆的大個兒數據包,跟社區前輩一起測了一下,最后 2-3MiB 的雙向數據包單機壓測可達到 1.5k qps。
當然沒考慮到的問題還有很多,但沉浸在開發的快樂和成就感中真的很爽。
未來的云原生
實習期雖然只有三個多月,但到后來我越來越發現,中間件研發已經承包了我的太多快樂,我越來越發覺了對編程的熱愛,對專業的敬畏,對云原生技術的信仰。
我認為任何一位 IT 工程師,無論技術深度如何,無論經驗是否豐富,都應該擁有自己的技術信仰。我希望技術信仰于我而言,始于對于編程的喜愛和強烈的項目成就感,成長于與前輩的交流和源碼的學習中,希望在未來將落實于在 “落地” 和 “創新” 兩個詞中。
我認為,任何的技術,如果不落地生產,將不具有太多意義。而將“形而上學”的架構觀念,突破層層阻礙和壁壘,例如和已有服務/語言/設計理念相悖,不斷推進落地,這過程是偉大的,這個過程中付出過努力的人都是站在浪潮之巔的弄潮兒。
中間件的未來是什么?sidecar 架構真正優雅落地是什么樣子?Java 和 Go 以后的關系又是如何?RPC 又能被什么替代,或者是以一種新形態出現?
很多東西就像年初的股市一樣撲朔迷離,但未來一定會有一個唯一的答案。未來在杭州,我在技術上又會經歷什么變化,業內技術棧又會產生什么樣的突破和進展。
難以想象未來三年后,我的技術棧將會變成什么樣?畢竟從測試、運維、業務開發、再到基礎架構,唯一不變的是變化。
最后的話
配上實習最后一天離開西廠前的紀念照 — 紀念一段人生路程的結束。祝福開源的 dubbo/dubbogo,在未來將會變得越來越強大,越來越多的開發者可以使用它們,創造云原生更大的價值。
dubbo/dubbo-go 3.0 將于近期正式發布,敬請期待!如有興趣,可到 dubbogo 社區釘釘群 31363295 找我聊聊。
謹以此文致敬我的三段實習經歷中幫助我成長的各位導師和技術前輩們,并以此紀念我即將逝去的大學生涯!
總結
- 上一篇: 透过 3.0 Preview 看 Dub
- 下一篇: 实习就参与“服务过亿用户的项目”,是什么