從噹噹看打造高星 GitHub 開源項目的經驗

2021-01-15 開源中國

編者按:本文是張亮在高可用架構群新年聚會暨架構開源研討會上的分享。轉載請註明來自高可用架構公眾號「ArchNotes」。

張亮,當當網架構師、噹噹技術委員會成員、消息中間件組負責人。對架構設計、分布式、優雅代碼等領域興趣濃厚。目前主導噹噹應用框架 ddframe 研發,並負責推廣及撰寫技術白皮書。

「我們認同馬丁福勒這位代碼溝通大師的理念,任務代碼是給人看的,不是僅僅給機器編譯用的。維護一個有缺陷但是代碼清晰的項目,遠比維護一個代碼混亂但暫時未發現缺陷的項目要更加容易、更加受歡迎。」 —— 張亮


大家好,我是張亮,目前任職噹噹架構部架構師一職,也是高可用架構群的一員。

首先我介紹一下項目背景。噹噹在 2015 年 9 月開始開源了內部使用的分布式作業調度框架——elastic-job,然後又於 2016 年 1 月 18 日開源了資料庫分庫分表中間件——sharding-jdbc。

噹噹後端使用 Java 開發較多,所以這次做的開源項目也是基於 Java 開發者而非產品型。目的是讓 Java 程式設計師能夠順暢使用,對於非 Java 用戶可能未必友好。這兩個開源項目的背景不太一樣,elastic-job 是先於公司使用,基本成熟之後再開源於社區。而 sharding-jdbc 是先開源至社區,再於公司內部同步推廣落地。(小編:點擊文末連結了解 elastic-job 10 大特性介紹)

截止到目前,我們做了 4 個月的開源相關的事情,雖然經驗並不豐富,但是也想和大家分享一下與開源相關的經驗和問題。

1. 開源初心

1.1 為什麼要做新項目?

在做新項目之前,我們做過大量的調研。

分布式作業調度這塊,quartz 可做到依賴於資料庫的高可用,但無彈性調度功能。tbschedule 這樣老一些的項目在時間調度方面又不如 quartz 強大。

分庫分表的資料庫中間層方面,雖然有 cobar、tddl、mycat、compass、oceanus、kingshard、atlas 等一系列開源產品,但目前確實無法完全覆蓋我們的需求。

1.2 做成什麼樣?

我們選擇做一個面向開源,且不與業務系統耦合的純技術組件。也就是說,底層的這些組件,並不是從業務系統分離出來的,而是完全從技術組件的角度去開發,然後再向業務系統發起落地。所以,這兩個組件可以在只做很少改動的情況下開源。

1.3 標準

既然已經決定開源,項目的質量要求即是以開源的標準來要求。

公開給所有人的並不只是功能和文檔,而是全部代碼,這樣的質量要求和做一個內部項目是不同的。我們認同馬丁福勒這位代碼溝通大師的理念,任務代碼是給人看的,不是僅僅給機器編譯用的。維護一個有缺陷但是代碼清晰的項目,遠比維護一個代碼混亂但暫時未發現缺陷的項目要更加容易、更加受歡迎。

測試用例的覆蓋率是另一項重要標準,我們要求測試覆蓋率儘量達到 80% 以上。如此才可以放心的重構和完善新功能。目前我們兩個開源項目的測試覆蓋率均超過 90%

代碼要完全掌控,不能允許有誰都不敢碰的黑箱存在。

1.4 目的

1.4.1 反饋社區。每個開發者都或多或少的使用過開源產品。在使用開源的同時儘量的反饋社區,讓開源成為良性循環。

1.4.2 吸取社區精華。使用的人越多,看代碼的人越多,項目的缺陷和風險就會越小。而且眾多社區成員的使用,有助於疑難問題重現。比如:我們公司內部的 ZooKeeper 環境比較快,延遲低,一些分布式的問題就較少發生。但有的公司網絡環境稍差,就會產生 ZooKeeper 延遲導致的一些問題。發現問題的途徑越多就越有利於項目的健康發展。而且社區人員確實反饋了一些關鍵問題,貢獻了關鍵代碼,這些代碼也解決了噹噹內部的一些部分使用問題。

1.4.3 提升公司技術品牌。開源之後收到越來越多的人詢問噹噹是否還招人,也更多收到了討論技術問題的郵件和 QQ。這些影響都是潛移默化的,會漸漸的讓公司的技術影響力提升。對於不發出技術聲音的網際網路公司,可能會越來越難招募到優秀的開發者。

2. 經驗分享

2.1 文檔問題

文檔要清晰,代碼不能代替文檔。代碼寫的再清晰漂亮,很多使用者也是通過文檔來了解並使用項目的,通讀代碼的使用者畢竟是少數。但文檔絕不是越多越好,一定要適中,信息量爆炸不利於信息的吸收消化和檢索

2.2 信任度問題

項目是否靠譜,是否穩定,是否可以拿來即用,是開發者選擇使用開源項目要面對的問題。以下三點可能會有助於開發者選擇這個開源項目信心的提升。

2.2.1 公司案例

只要自己的公司在大規模使用,則至少證明在某些場景下,項目是穩定的。公司案例的推廣和分享有助於開發者選擇

2.2.2 測試數據

需要通過公布疲勞測試的穩定性,性能測試的對比場景等數據提升使用者信心。

2.2.3 通過代碼展現實力

代碼需精雕細琢。舉個例子,sharding-jdbc 一共開發了三個月多一些,核心代碼一個月左右就開發完成了,剩下兩個月都是在打磨。主要包括整體流程梳理、模塊拆分規劃、代碼可讀性重塑、封裝粒度縮小等。開源項目是否可持續發展的關鍵點即在於此,這是對一個項目負責的態度。

我看到過的一個開源的項目,使用的 SQL 解析完全是從第三方的 SQL 解析包中複製過來,除去修改包名,大段大段的英文注釋都沒有改。而 SQL 解析一般使用 javaCC 這樣的技術生成的代碼,這種代碼動輒上萬行,難於維護。這等於是將引用第三組件的技術債放到了自己的項目中,這種做法是不太負責任的。

2.3 溝通問題

我們更傾向於需要一個 QQ 群,用於輕便和愉快的溝通,也便於頭腦風暴。部分開發者屬於內向型,如果是 issue 或者郵件這種溝通方式,他們未必會採用。QQ 群的另一個好處是提升親和度和社區粘性。QQ 群中最好有一個活躍的組員是項目主導人員,及時溝通和反饋項目情況。

2.4 版本問題

開源項目一旦更新,是首發於 github 還是先於公司內部發布。有些公司內部的比較著急的需求,需要在內部改完直接使用,長久下去會導致公司內部代碼和開源版本混亂,不易維護。個人傾向於維護統一版本,先於社區開源,再拉取到公司的 maven 私服。這樣做的好處是優秀的想法不會滯後,而且可利用社區活躍度規避一些潛在風險。

2.5 技術難度問題

開源項目一般難度會大於業務項目。這裡以 elastic-job 和 sharding-jdbc 舉例。兩個項目的難度展現在不同的地方。elastic-job 屬於分布式框架,代碼編寫並不難,難點在於分布式環境下的調試和問題重現。sharding-jdbc 剛好相反,調試難度不高,一條 SQL 能否正確執行,這個環境非常容易重現,但編碼難度卻較大,SQL 解析、路由、歸併的難度遠遠大於一般項目。

針對於這樣的問題,為了可以讓更多的人參與項目貢獻,我們考慮把任務分級,分為簡單型、長期型、討論型、缺陷型和技術難點型

簡單型例如運維頁面由中文專為支持多語言,這樣的任務可以讓有興趣的社區人員參與開發,並無太多門檻。

長期型屬於核心任務,最好由資深的開發人員或者項目的主導人員完成,比如:作業系統增加任務依賴。分布式資料庫增加柔性最終一致性的事務。

討論型一般會在 QQ 群,wiki,issue 等平臺討論,比如 roadmap 先做哪些,某個具體任務的取捨等,最終會轉化為其他的任務類型,當然,一般不會轉化為簡單型。

缺陷型屬於快速響應的任務,在下個升級版本就會發布。

技術難點型需要做調研,調研明白之後才決定如何做,有這方面技術經驗的社區人員可以提供更多的幫助。

3. 未解決問題

3.1 時間分配問題

開源之後必然會吸引一些愛好者關注。有些愛好者因為時間關係,並未閱讀代碼,甚至未閱讀文檔,就直接問一些基礎問題。有些愛好者因為經驗尚淺,會問一些和項目不直接相關的問題,比如:maven,zookeeper 怎麼用之類的。可能會導致項目 master 浪費一定時間。

3.2 技術反饋問題

很多愛好者將項目用於自己公司的系統,也確實做了一些改進。但是限於時間原因,未能將代碼質量控制的很好,或者未能完全剝離公司的業務場景。這樣就很難再將有意義的更新反饋至社區。

3.3 多人合作質量保障問題

項目小團隊集中開發時,這個問題並不明顯。一旦貢獻者多了,代碼評審,質量管控,處理 pull request 等就會比較難。

總的來看,以上噹噹開源的經歷主要介紹了初創開源項目從 0 到 1 的過程,在以後肯定需要進一步完善並面對新的問題,以後的問題和上面說的也會有很大差別。但我們也相信,更多同行面臨的是我們上面碰到的新的項目從 0 到 1 的過程,希望通過以上的分享,吸引更多感興趣的同行一起加入到開源的大家庭,共同推進技術的進步。

4. 參考閱讀

新一代分布式任務調度框架:噹噹 elastic-job 開源項目的10項特性(點擊圖片進入)


本文來自微信公眾號高可用架構:

相關焦點

  • 推薦一些 GitHub 上值得前端學習的開源實戰項目,進階必看!
    最近好多同學問我了解找一些學習的實戰項目;看一個別人寫的優秀的項目,從中可以學到很多;比如代碼的規範,項目的結構;從項目作者每次提交記錄,去學習一些別人的開發思維以及開發整個項目的流程;下面我主要找了一些比較火的一些框架以及 node 項目。
  • 6月份Github上熱門的開源項目
    6月份GitHub上熱門的開源項目排行已經出爐啦,一起來看看上榜詳情吧!這個項目的代碼實現。5. vanillawebprojectshttps://github.com/bradtraversy/vanillawebprojectsStar 6589這是一個使用HTML5,CSS和JavaScript構建的20多 個小型項目的集合,一共包含20個項目,諸如電影訂票頁面,視頻播放器界面、匯率計算器、
  • 盤點:2017年GitHub上30個優秀的機器學習項目
    我們比較了過去一年近8,800個開源的機器學習項目,從中選擇了30個表現優秀的,分享給讀者。這是一份非常精彩的名單,它仔細挑選了2017年1月至12月之間發布的最佳開源機器學習庫、數據集和應用程式。我們綜合考慮項目的受歡迎程度,參與度和進展程度來評估項目質量。為了給讀者更直觀的感受,使用GitHub上的關注量(星星數量)來表示項目熱度。
  • 安全專業人士最愛的 19 個 GitHub 開源項目
    GitHub上有許多開源項目可供安全專業人士選擇,而且每天都有新的項目出現。不妨將這些項目添加到你的工具庫,讓你工作起來更得心應手。
  • 2018 年度 GtiHub 開源項目 TOP 25:數據科學 & 機器學習
    https://www.analyticsvidhya.com/blog/2018/12/key-breakthroughs-ai-ml-2018-trends-2019/現在,準備好去探索新的項目,並努力成為 2019 年的數據科學之星吧。
  • 國產開源軟體在Github上「刷星」遭熱議,這還是開發者的理想烏託邦...
    現在看來,重新評估 GitHub 的星到底有什麼價值是很有必要的。 Github 上「刷星」事件頻出 近日,國內某網際網路平臺向用戶發送私信,如果用戶在 Github 上為其平臺上的開源項目點星,則會收到該平臺的紅包獎勵。
  • WAVE SUMMIT+2020:如何打造一個成功的AI開源項目?
    Zilliz 創始人兼執行長星爵受邀,與北京大學助理教授董豪,PreAngel 合伙人李卓梈,以及復旦大學計算機科學技術學院教授、 fastNLP 負責人邱錫鵬一起,共同探討如何打造成功的 AI 開源項目。
  • 如何上傳項目到GitHub
    本文轉載自【微信公眾號:吾非同】,經微信公眾號授權轉載,如需轉載與原文作者聯繫 圖丨pixabaygithub作為開源的分布式版本管理系統,上面有眾多的優秀開源項目,也有豐富的學習資料,熟練使用github也是程式設計師的一項必備技能。
  • GitHub開發者自製火星車,完整教程全面開源
    圖|美國宇航局 「好奇號」 火星車在第 2553 個火星日的自拍照(來源:NASA)你有沒有興趣手工打造一臺自己的 「火星車」?在開源社區 GitHub 中,開發者雅各布 · 克蘭茨(Jakob Krantz)分享了一份全面的開源製作教程,引起不少關注。
  • 基於TensorFlow2.0的中文深度學習開源書來了!GitHub趨勢日榜第一
    近日,一個叫做深度學習開源書的項目在火了。GitHub趨勢日榜排名全球第一,已斬獲2K+星。為什麼這麼火?因為這是一本基於TensorFlow 2.0 正式版的中文深度學習開源書。還包含電子書和配套原始碼。話不多說,一起來看看這本爆款書籍吧!
  • 2018年阿里巴巴關於Java重要開源項目匯總
    從架構上看,其本質是一個基於 zk 的分布式調度系統。地址:https://github.com/alibaba/jstorm6. apns4japns4j 是 Apple Push Notification Service 的 Java 實現!
  • GitHub硬核創客自製火星機器人,免費開源模擬「好奇號」
    並且開源了全部製作資料,引起眾多關注。在這個開源社區中作者公布了這個項目包括配套的控制器全部源文件但他表示,項目仍需進行大量調整才可以使其更加完善,基於目前的基礎平臺,任何有經驗的技術人員都可以進一步參與構建它。
  • 如何在 Github 上發現優秀的開源項目?
    問到點子上了,GitHub 其中一個最重要的作用就是發現全世界最優秀的開源項目,你沒事的時候刷刷微博、知乎,人家沒事的時候刷刷 GitHub ,看看最近有哪些流行的項目,久而久之,這差距就越來越大,那麼如何發現優秀的開源項目呢?這篇文章我就來給大家介紹下。1.
  • 四大開源無人機項目,極客要Get了
    無人機製造界已開發出了許多軟硬體項目,採用開放許可證,讓你可以製造、修理、定製或試驗自己的無人機,或者以另外某種方式補充無人機的用途。不妨看一下其中的幾個項目。 1.Paparazzi UAV Paparazzi UAV這個項目結合了製造和飛行開源飛行器所需的軟體和硬體,它們是採用開放許可證發布的。
  • 取代GitHub?工信部公布2020開源託管平臺項目結果
    日前,工業和信息化部技術發展司公布了「2020年開源託管平臺項目」的招標結果,工業和信息化部選擇Gitee來構建「面向中國的獨立,開放原始碼託管平臺」。據悉,該項目由深圳市奧思網絡科技有限公司(開源中國)牽頭,與國家工業信息安全發展研究中心、工業和信息化部電子第五研究所、中國電子技術標準化研究院、華為技術有限公司、奇安信科技集團股份有限公司、浪潮電子信息產業股份有限公司、蘇州稜鏡七彩信息科技有限公司、北京理工大學、西南科技大學共10家單位組成的聯合體中標該項目,聯合體將依託碼雲Gitee建設中國獨立的開源託管平臺。
  • 在GitHub上8800個開源機器學習項目中,選出了其中的Top30
    大數據文摘作品編譯:葉一、Shan LIU、Aileen2017年是機器學習應用全面開花的一年,驚為天人的想法和項目層出不窮。我們對比了過去一年中近8800個開源機器學習項目,並挑選了其中較好的30個(Top 0.3%)列舉於此。
  • 適合Java新手的開源項目集合——在 GitHub 學編程
    在開源的世界裡,有著無數的 Java 項目等待你去發現探索,讓我們一起跟著本篇文章去看看有哪些開源項目吧?興趣是最好的老師,HelloGitHub 就是幫你找到編程的樂趣。>JavaScript 篇本期是 Java 篇 希望這篇文章能讓大家找到 GitHub 上適合自己學習的 Java 開源項目。
  • 萬物皆可內卷,開源社區GitHub都有人刷數據了
    事實上,「刷星」這事兒並不是只有小公司會做,去年韓國電信巨頭SKT就在GitHub上同步了自己的一個開源項目「metatron-discovery」,並且為其搞了一個營銷活動,即點star後截圖就可免費獲得星巴克或炸雞等商品禮券。儘管無論是此次曝光中這家做AI框架的公司,還是韓國的SKT,最終都迫於輿論壓力,很快取消了類似營銷意味很重的這類活動。
  • Github累積1.6萬顆星,這家AI公司的開源項目有望讓程式設計師少加班
    OpenMMLab 是商湯科技開源的一個計算機視覺領域的 AI 算法框架。自 2018 年 10 月逐步開源以來,OpenMMLab 在軟體原始碼託管服務平臺 Github 上共累積了 1.6 萬個星。開發 OpenMMLab 對於商湯來說意味著什麼?商湯對於未來 OpenMMLab 又會有怎樣的發展計劃?
  • GitHub 的 App 會開源嗎?
    開源是現在的一個大趨勢,雖然有很多軟體確實是不需要開源的,但作為全球最大的開源軟體平臺,自己的產品不應該開源麼?當今很多開源項目的開發都是在 GitHub 上或者通過 GitHub 進行的。對於這一開發者用來「吃飯」的工具,改善 GitHub App 的使用體驗能有效的改善開發者的工作效率和方式,所以如果該項目真的開源,一定會吸引很多開發者參與其中。