近几年开源项目越发普及,很多商业软件都逐渐引入开源项目。由于我负责的产品线采用了不少开源项目(主要是C++、Java、Python),这几年
就经常会碰到开源项目选型的问题(从几个具有类似功能的开源软件项目中进行抉择)。今天我就大概聊一下自己的几点看法,供大伙儿参考。<!--program-think-->
★License(授权协议)
License是很多人容易忽略的一个问题,所以我们先来聊一下License的问题。因为公司里面开发的软件基本上都属于商业软件,根据开源协议和商业的冲突程度,可以分为三种:非常友好、不太友好、很敌对。下面分别介绍一下:
先说说“很敌对”的协议:GPL(详细解释看“这里”)。
GPL和商业软件是严重冲突的。通俗地说,如果某个软件产品使用了某个基于GPL协议的库,则这个产品必须也使用GPL协议发布(这就是大名鼎鼎的GPL“传染性”)。因此,一旦发现某个开源项目是遵从GPL协议的,即使功能再强再好用,也只好忍痛割爱了。在此郑重提醒大伙儿,切莫抱侥幸心理,偷偷使用。一旦被雪亮的群众眼睛所发现,不光害了自己的名节,公司的名节也不保。
由于GPL对于商业软件太不友好,估计当年很多开源库的作者怨声载道。GNU组织为了缓和一下矛盾,搞出了一个折衷的LGPL协议(详细解释看“这里”)。这个协议相对GPL来说,宽松了一些:商业软件在不修改代码的前提下,可以在产品中使用LGPL的开源库。所以LGPL属于商业“不太友好”的协议。
最后来说一下“非常友好”的协议,比较出名的有这几种:BSD、MPL(Mozilla)、Apache、MIT。这些协议不但允许项目的使用者使用开源库,有些还允许对开源库进行修改并重新分发。因此用起来特别爽。上述这几个协议在细节上有些小差异,大伙儿可以去它们官网瞧一下。
另外,有些开源软件使用公共域授权(Public Domain,详细解释看“这里”)。简单说,就是不作任何限制,软件的使用者可以为所欲为 :)
上面提到的几种协议都是知名协议。还有少数开源项目不是采用知名协议,而是自己搞了一套协议。如果你碰到这种情况,就得硬着头皮认真读一遍协议上的洋文,看看它对于使用者有些什么限制了。
★技术层面的因素
由于技术层面的考量和你所开发的软件密切相关,因此这方面的评判依据千差万别。我只能挑几个比较通用的说一下。
假如你开发的是跨平台的项目,那么你选择开源项目就得考虑它支持哪些平台(操作系统、数据库等)。如果你想支持的平台它不能支持,那就赶紧另找一个。
有时候编译器的支持也是考虑的指标之一。比如我在“C++的可移植性和跨平台开发”里面提到的老式编译器问题。再比如我曾经实施一个Java项目,用户的环境是JDK 1.4。那么有些用了Java 1.5新语法的开源库就不能使用。
假如你开发的软件是性能敏感的,那选型的时候就要测试一下几个候选项目的性能指标。
现在安全问题越来越严重。如果你比较在意安全性的话,还得顺便调查一下候选项目是否有安全问题(比如缓冲区溢出的bug、比如跨站脚本注入等)。
★普及程度(用户的人气)
所谓的普及程度,就是看开源项目的用户占有率。当然大伙儿不是搞市场调查的,花钱请市场调查公司也不现实。简单的办法就是用搜索引擎大致搜一下,就能看出几个候选项目使用的广泛度了。
还有另外一个判断普及程度的方式,就是看某个开源项目是否被知名的软件或者公司采用。比如Firefox(算是知名软件)采用Sqlite来存储页面缓存,这至少可以从侧面反映出Sqlite项目的优秀程度。
对于若干个候选项目,显然要优先考虑普及度高的那个。因为某个项目普及度高,至少说明(但不绝对)它比较成熟、稳定、安全。而且用的人多了之后,相应的文档也会多一些,碰到问题也容易找到人咨询。
★活跃程度(开发的人气)
这里说的"活跃",是指开发层面。一般来说,一个项目越活越,则新功能的推出越快,对提交bug的响应也越快。有些项目,由于开发人员不再继续开发(可能开发人员厌倦了、可能开发人员太忙了),从而导致活跃度很低。
不过也有例外。有些项目由于已经非常完善了,因此反而活跃程度很低。我印象当中bzip2最近几年就很少有更新。
★其它的风险
最后来说说一些其它的风险。一般来说,只有当前几个因素都差不多的时候,才会来考虑其它风险。
有些项目过于依赖个人英雄主义,靠1-2个大牛完成整个项目。一旦大牛出现意外,导致整个项目受到严重影响。典型的例子就是ReiserFS文件系统的创始人Hans Reiser。这位老兄由于谋杀妻子的罪名成立,被判入狱15年(对IT八卦有兴趣的同学可以看“这里”)。导致ReiserFS项目受到严重影响。
还有些开源项目被商业公司收购后,由于种种原因(商业、管理、政治等)导致该开源项目受到不利影响。比如上星期听说Michael
Widenius(MySQL共同创始人)和Marten Mickos(MySQL前CEO)从Sun离职。再加上去年10月走掉了的David
Axmark(MySQL共同创始人)。估计对MySQL的影响不小。
上述提到的几个考量指标,越前面的,权重越高。你在选型时需要综合考虑这几个因素。
http://program-think.blogspot.com/2009/02/how-to-choose-opensource-project.html
分享到:
相关推荐
选择开源项目时,需要考虑业务需求,而不是追求最优秀的开源项目。 其次,架构师需要聚焦于开源项目的成熟度。选择成熟的开源项目可以降低风险,避免带来问题。可以从版本号、使用的公司数量、社区活跃度等方面考察...
在选择开源项目时,我们应考虑以下几点: 1. 项目活跃度:一个活跃的项目意味着有持续的更新和修复,社区支持也更强大。 2. 许可证类型:不同的开源许可证对使用和修改代码有不同的规定,确保选择的许可证符合你的...
7. **项目选择**:根据自身水平选择合适的开源项目至关重要。初学者可以从修复小bug、改进文档等任务入手,随着经验积累,可以挑战更复杂的任务。 8. **问题解决技巧**:在开源项目中遇到问题时,要学会利用搜索...
然而,现有的教学方式存在一些问题,如学生选择开源项目的自由度有限,课程内容往往只侧重于特定的软件工程概念,以及学生对开源项目的不熟悉可能导致提交的代码质量不高,从而被开源社区拒绝。为了解决这些问题,...
标题“流行的c++语言开源项目”表明了本文档将聚焦于目前在开源领域中较受欢迎的C++项目。这些项目通常具有一定的影响力,被广大开发者所关注,并有可能成为其他开发者学习和借鉴的对象。由于C++语言在性能和控制上...
- 一些开源项目专注于提供美观且实用的UI设计组件,如`MaterialDesignLibrary`,它实现了谷歌的Material Design规范,包括按钮、输入框、滑动选择器等,有助于提升应用的用户体验。 2. **图片加载库** - 如`Glide...
这个开源项目名为“Swing全组件演示”,它旨在全面展示Swing库中的各种组件及其用法,为开发者提供一个丰富的参考资料。通过这个项目,我们可以深入了解Swing组件的功能、交互方式以及自定义的可能性。 Swing组件是...
如果你对 .NET CLI 的具体用法、开发流程、如何参与开源项目或者为什么作者不选择 VSCode 开发 Go 项目感兴趣,可以进一步探索这个压缩包的内容,例如阅读项目文档、查看代码结构、运行构建脚本等。这将有助于你深入...
【描述】:本文将介绍六个在中国备受推崇的Java后台管理框架的开源项目,这些框架不仅高效且实用,是开发人员快速构建后台管理系统的理想选择。 【标签】:Java, 后台管理, 框架, 开源, CMS 【正文】: Java后台...
此次我们关注的是Sun公司提供的一个免费开源项目,这对于开发者和学习者来说是一份宝贵的资源。 首先,让我们深入了解"JAVA"。Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(后被Oracle公司收购)...
在"java 人脸识别,一个开源项目.rar"中,我们可以推测这个项目提供了Java实现的人脸识别算法,可能包含人脸检测、特征提取和匹配等核心功能。这样的项目通常会利用现有的图像处理库,如OpenCV或者JavaCV,它们提供了...
开源项目-yaronsumel-filler.zip是一个开源软件项目,由开发者yaronsumel创建并维护。这个项目的主要目的是提供一个小型实用程序,它利用标记填充(Marker Filling)的结构来实现特定的功能。在计算机科学和软件开发...
在 IT 领域,开源项目一直扮演着重要的角色,它们不仅推动了技术的发展,也为开发者提供了学习和实践的平台。对于游戏爱好者来说,GitHub 上有许多有趣的开源游戏项目,能够让我们深入了解游戏开发的过程,甚至参与...
标题中的“Windows录屏软件开源项目(附加源码+安装包)”指的是一个基于Windows操作系统开发的屏幕录制软件,它的核心特性是开放源代码,允许用户查看、学习甚至修改源代码。这样的项目对于开发者,尤其是C#编程...
《开源项目:avelino-awesome-go.zip - 探索Golang的精彩世界》 在IT行业中,开源项目一直是推动技术创新的重要力量。"avelino-awesome-go.zip"这个开源项目,旨在为开发者提供一个全面的、精心整理的Go语言资源库...
新闻开源项目是一个旨在推动新闻数据开放、透明度和可访问性的技术工程。它通常涉及到创建一个平台或工具,使得记者、研究人员以及公众可以方便地获取、分析和利用新闻数据。这个项目的重点在于利用开源软件开发的...
每个开源项目都有其独特的特性和优势,开发者可以根据自己的需求选择合适的技术栈。通过研究和贡献这些项目,不仅可以提升个人技能,还能参与到全球开发者社区,推动技术的进步。无论是初学者还是经验丰富的专业人士...
这个开源项目可能提供了这样的优化功能,使得开发者在进行结构体类型转换时,可以选择性地忽略标签,从而提高代码的灵活性和可维护性。开发者可以通过查看go-master目录下的源代码来了解具体的实现方式,可能包括...
最近项目需要一个时间选择器,github找了个开源项目,然后自己抽出来改了背景,分享下,背景颜色什么的可自己修改
开源项目通常提供丰富的日志记录解决方案,以满足不同项目的需求。本教程将深入探讨如何在开源项目中有效地利用日志记录功能。 一、日志记录的重要性 1. 错误排查:当程序出现异常或故障时,日志记录能提供详细的...