1. 程式人生 > >如何選擇開源專案?

如何選擇開源專案?

今天這篇文章也是因為最近不少人給我留言說「張哥,現在我接觸到了開源社群,發現不少開源專案,但是卻不知道如何選擇應用到自己的專案上?」

這個問題比較好,相信不少人都有這樣的疑問,且聽我細細給大家說來。

什麼是開源?

「開源」是從英文「Open Source」翻譯精簡而來,其實是開放原始碼的意思,我們知道所有的軟體都是由程式碼編寫,經編譯生成的系統或者應用。而一旦你把它開源,意味著任何人、任何組織都可以使用你的程式碼或者軟體,當然也可以給你免費貢獻程式碼,優化你的應用,開放原始碼意味著自由選擇的權力,而自由選擇意味著激發更多創新的能量。Linux 就是最著名的開源作業系統,而 Java 與 Android 同樣也是開源的。

開源社群

開源社群在這兩年發展的非常火爆,一些巨頭爭相加入開源社群,一些常客如Google、Facebook、Square為開源社群貢獻了不少優質專案,驚喜的是連蘋果、微軟等一些比較封閉的公司也競相加入開源社群,不得不說這是一種好現象,開源也許是軟體的未來。

說到開源社群,毫無疑問 GitHub 是目前最大最火爆的開源社群,全球最優秀的程式設計師與最開放的優秀科技公司都在 GitHub ,你還有什麼理由不加入進來呢?本篇所涉及的所有開源專案都指 GitHub 上的開源專案。

為什麼要用開源專案?

軟體開發領域一直有個原則:DRY,Don’t repeat yourself,翻譯過來就是「不要重複造輪子」。而開源專案主要目的是共享,其實就是為了讓大家不要重複造輪子,尤其是在網際網路這樣一個快速發展的領域,速度就是生命,引入開源專案,可以節省大量的人力和時間,大大加快業務的發展速度,何樂而不為呢?

開源專案的風險

開源專案為我們節省了大量的人力和時間,但是開源專案並不是完美的,相信使用過開源專案的人都大大小小踩過一些坑,如程式碼不規範啊,專案有bug啊等等,出了問題都會為我們的專案以及公司帶來不小的影響,這個時候如何選擇開源專案就變得很重要。

如何選擇開源專案?

下面以一個例子來更詳細具體的說明。假設我們現在急需一個http網路請求庫在專案中使用,是我的話,那我肯定在 GitHub 上搜索「android + http」作為關鍵字。

1. Stars

一般來說我都會優先按照 Stars 來排序,Stars數高不代表一定是最好的,但是起碼說明蠻火的,不然不會那麼多人都 Star 的,要知道在 GitHub 上得一個 Star 遠比在微信上獲得一次「讚賞」難的多。於是首屏的搜尋結果是這樣:

 

首屏按照Stars排序大概出現瞭如上的4個網路庫,大家應該都很熟悉,但是這4個網路庫該怎麼選呢?

2. 作者影響力

Stars 數都還蠻多的,那我肯定會優先看下作者影響力了,有影響力的人不一定是最好的選擇,但起碼說明不會不靠譜,如果作者是你熟悉的那就更好辦了。這4位裡面前兩位是 Square 公司出品,後兩位是個人作品,如果熟知 Square 公司的話那到這裡基本就能做出選擇了,Square 公司真是開源界的良心公司啊,為開源界做出了巨大貢獻,甚至比Google、Facebook貢獻的開源專案多的多,而且質量非常高,著名的 Android 界的傳說 Jake Wharton 就是 Square 公司的員工。一般來說公司專案是優先於個人專案的,何況還是 Square 公司,但是我們也來看下其他兩位作者的 GitHub 主頁。

 

作者 loopj 的followers有2k多,而且自己的好幾個開源專案Star都蠻多的,這一年的GitHub提交不算特別活躍,但是還行,總體來說是影響力蠻大的一位開源作者。

 

作者 wyouflf 的followers有1k,有影響力的開源專案也就數 xUtils 了,而且 xUtils 貌似有了最新版 xUtils3,最近一年在GitHub沒什麼提交,說明不是特別活躍。

所以總體得出結論:Square > loopj > wyouflf

3. README.md

以上只是分析了最基本的一些外在因素,但是我們還是要看具體的關於專案的文件說明,功能介紹也好還是使用方法也好,這些都在 README.md上有所介紹的。

看了這四個專案的文件說明與介紹,都還算是蠻完整的,也比較詳細。我們初步瞭解到各個庫的基本功能:

Retrofit、OkHttp都是針對Java和Android的http網路庫;

android-async-http是專門針對Android平臺的http網路庫;

xUtils是針對Android平臺的一套完整的框架,他包括orm、bitmap、http、view inject好幾個功能;

至此對於我個人來說我基本淘汰了 xUtils 框架,並不是說他不好,因為到這一步我還沒有詳細瞭解各個庫的好壞,我是不喜歡用這種「大而全」的框架,一是個人習慣,二是覺得風險較大,因為一旦其中某一功能出問題你解決起來都比較麻煩,如果要因為這個問題替換掉的話那更麻煩,除非我能確定這套框架非常成熟好用,否則我更寧願選擇「專注」的框架,而我們一開始就提到我們需要的是http網路請求庫,所以xUtils被我淘汰了。

剩下三個網路庫,前面我們也說到 android-asyn-http 是專門針對Android平臺推出的http網路庫,而Square公司的兩個庫比較廣泛,不僅Android,還適用於Java平臺,其實按照我的個性(好吧,我比較喜歡走心),至此我基本就會選擇 android-async-http 了,因為我更喜歡「專注」,事實上我確實是這樣的,我最開始接觸的網路庫確實就是 android-async-http ,確實也蠻好用的。但是在目前我卻不會選擇它了。

4. 最後更新時間、Issues、Fork等

為什麼現在不會選擇 android-async-http 了呢?原因就是這個庫作者最後 release 的時間是15年的9月19號,也就是說作者已經長達7、8個月沒更新了,對於一個開源專案來說最怕的是作者不維護了,這就意味著之後再也不會有改進了,而且出了什麼問題也很難被迅速解決。

回頭看下xUtils這個專案已經長達2年沒更新了。

再看下Square公司的 Retrofit 和 OkHttp 專案最近幾天還在更新程式碼:

 

程式碼有更新代表作者在一直改進該專案,除了最後更新時間之外,Issues數量以及作者回復的速度與比例,Forks 數量等都是體現該專案被關注程度以及流行程度,都是很不錯的參考指標。

5. 開源協議

你們以為開源專案是可以隨便使用的麼?那就錯了,使用開源專案也要遵守一定的原則的,即所謂的開源協議,常見的開源許可協議有:

GPL、LGPL、BSD、Apache Licence vesion 2.0、MIT。

這些協議我就不做過多解釋,除了GPL協議需要注意外,GPL 協議規定使用了該開源庫的程式碼也必須遵循 GPL 協議,也就是說也得開源,不適應於商業專案。其他協議多少也都會有些條件限制,但是影響不大,大家自行搜尋瞭解就可以了。目前為止 MIT 應該算是用的最多的開源協議了。

其實開源界還有一個奇葩的協議叫「WTF」協議,協議名稱是:「DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE」,言外之意就是「他媽的想幹啥幹啥協議」,是不是碉堡了?如果你們不小心在哪個開源專案有見過這個協議,不要大驚小怪,真有這個協議的!

6. 綜合

經過上面的分析,就剩 OkHttp 與 Retrofit 兩個最優選擇了,最後我們來仔細看看這兩個庫有什麼區別。

通過文件我們瞭解到:

OkHttp 是一個 Java 和 Android 平臺的 Http 請求庫,非常高效,支援 SPDY、連線池、GZIP 和 HTTP 快取。預設情況下,OKHttp 會自動處理常見的網路問題,像二次連線、SSL 的握手問題。

Retrofit 是一套 RESTful 架構的 Android 和 Java 平臺 Http 請求庫的客戶端實現,基於註解,提供JSON to POJO(Plain Ordinary Java Object,簡單Java物件),POJO to JSON,網路請求(POST,GET,PUT,DELETE等)封裝。

但是如果你的應用程式中集成了 OkHttp,Retrofit 預設會使用 OkHttp 處理其他網路層請求。

所以一句話如果你想讓你的網路請求寫的更優雅那推薦使用 Retrofit ,尤其是跟 RxJava 結合起來更好用,否則直接使用 OkHttp 一樣是可以的。

你要問我們專案使用了什麼網路庫?我們有好幾個專案,其實用的最多的是 Volley,因為如果是Google官方推出的專案我們一般都是優先使用的,畢竟官方出的總不會太差吧。

總結

以上只是以一個 Http 庫請求的示例來教大家如何選擇一個最優的開源專案,其他類別的開源專案一樣適用。我想告訴大家的是,開源專案的選擇永遠沒有一個最好的,你只有在綜合評估的指標下,選擇一個相對來說成熟並且適合你自己的就好了。

最後我要提醒大家的是,我們並不只是單純的會使用開源專案就行了,尤其是在商業專案上使用,一定要是比較成熟的專案,並且是自己已經瞭解了其原理,覺得能駕馭了才能在商業專案中採用,不然會造成很大的風險,要知道,商業,穩定是第一位,永遠要學會控制風險!

沒有最好,只有適合!
---------------------
作者:stormzhangV
來源:CSDN
原文:https://blog.csdn.net/googdev/article/details/80123041
版權宣告:本文為博主原創文章,轉載請附上博文連結!