如何選擇開源項目?
今天這篇文章也是因為最近不少人給我留言說「張哥,現在我接觸到了開源社區,發現不少開源項目,但是卻不知道如何選擇應用到自己的項目上?」
這個問題比較好,相信不少人都有這樣的疑問,且聽我細細給大家說來。
什么是開源?
「開源」是從英文「Open Source」翻譯精簡而來,其實是開放源碼的意思,我們知道所有的軟件都是由代碼編寫,經編譯生成的系統或者應用。而一旦你把它開源,意味著任何人、任何組織都可以使用你的代碼或者軟件,當然也可以給你免費貢獻代碼,優化你的應用,開放源碼意味著自由選擇的權力,而自由選擇意味著激發更多創新的能量。Linux 就是最著名的開源操作系統,而 Java 與 Android 同樣也是開源的。
開源社區
開源社區在這兩年發展的非常火爆,一些巨頭爭相加入開源社區,一些常客如Google、非死book、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、非死book貢獻的開源項目多的多,而且質量非常高,著名的 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 庫請求的示例來教大家如何選擇一個最優的開源項目,其他類別的開源項目一樣適用。我想告訴大家的是,開源項目的選擇永遠沒有一個最好的,你只有在綜合評估的指標下,選擇一個相對來說成熟并且適合你自己的就好了。
最后我要提醒大家的是,我們并不只是單純的會使用開源項目就行了,尤其是在商業項目上使用,一定要是比較成熟的項目,并且是自己已經了解了其原理,覺得能駕馭了才能在商業項目中采用,不然會造成很大的風險,要知道,商業,穩定是第一位,永遠要學會控制風險!
來源:geek
沒有最好,只有適合!