首发于stormzhang
如何选择开源项目?

如何选择开源项目?

本文原创发布于微信公众号: AndroidDeveloper「googdev」,转载请务必注明出处!

今天这篇文章也是因为最近不少人给我留言说「张哥,现在我接触到了开源社区,发现不少开源项目,但是却不知道如何选择应用到自己的项目上?」


这个问题比较好,相信不少人都有这样的疑问,且听我细细给大家说来。


什么是开源?


「开源」是从英文「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 库请求的示例来教大家如何选择一个最优的开源项目,其他类别的开源项目一样适用。我想告诉大家的是,开源项目的选择永远没有一个最好的,你只有在综合评估的指标下,选择一个相对来说成熟并且适合你自己的就好了。


最后我要提醒大家的是,我们并不只是单纯的会使用开源项目就行了,尤其是在商业项目上使用,一定要是比较成熟的项目,并且是自己已经了解了其原理,觉得能驾驭了才能在商业项目中采用,不然会造成很大的风险,要知道,商业,稳定是第一位,永远要学会控制风险!


没有最好,只有适合!



编辑于 2016-05-04 10:38