什么是开源软件
开放源代码促进会(OSI:Open Source Initiative),是一个致力于推动开源软件发展的非盈利组织。
开源软件(OSS:Open Source Softwar)即开放源代码软件,其定义首先起源于自由软件(FS:Free Software)。OSI将开放源码定义为:“开放源码,通过支持源代码的独立同行评议和快速发展演变,提高了软件的可靠性和质量。要通过 OSI 认证,软件必须在获得许可证的情况下发布,该许可证可保证免费读取、重新发布、修改和使用该软件的权利。
开源软件的特点:可自由使用、无任何担保、无许可费、可获得源代码、享有版本、有特定License
开源软件的三大组成要素;
- License:是游戏规则 ,有严密的组织监管
- 社区是组织方式:是其发展的核心学问所在,主要特征:无明确路标、子项目充分竞争、充分的对等评审、用户充分参与、源码发布、经常发布,Internet发布。
- 商业模式是本质:模式并不是其独有的,主要包括:捐赠、技术服务、广告、增值产品,双重授权、软硬件结合等。
自由软件VS开源软件VS免费软件
“自由软件运动”是一项倡导软件这种知识产品应该免费共享的社会运动,它主要是从社会伦理学,道德的高度,强调我们每个人都有自由使用软件的权利。自由软件反对软件私有,首先反对的就是软件的知识产权、版权,所以自由软件运动明确反对以申请专利的形式将软件产品据为私有。为了表达对Copyright(知识产权)的憎恶,Stallman甚至生造了一个单词Copyleft。
自由软件运动有点太极端、太理想化了,生活在这么一个商品化社会,要完全如此的反商业,还是很有难度。自由软件和商业软件之间的折中—-开源软件就此诞生了,它既继承了自由软件所提倡的知识共享的理念,同时又允许人们以专利的形式从知识产品中谋取利益,从而保护了人们生产、创造知识产品的积极性。
免费软件就是免费提供给用户使用的软件,但是其免费的时候,通常都会有其他的限制,比如其源码不一定会公开,而且使用者也并没有使用、复制、研究、修改和再散布的权利。
开源License
License是游戏规则,是开源软件许可证。在开源软件代码仓/包中,通常在NOTICE,COPYRIGHT,AUTHOR,README,COPYING,LICENSE说明其采用的开源许可证。
开源软件使用遵从义务:按照开源软件软件许可证规定开源软件使用者需要覆行的义务
- 开源使用声明义务:在产品发布时,随产品附上一份文档Open Source Softwre Note,在该文档中写明产品所有使用的开源软件及其版权和许可证信息,并附上免责声明。
- 代码对外开源义务:按照开源许可证要求,将一定范围内的代码对外开源,开源范围视具体许可证的要求和使用方式而定。
- 修改声明义务:做出对修改的开源软件就修改时间,修改的代码以及修改过的文件做出具体的声明。
BSD类
BSD许可证原先是用在加州大学柏克利分校发表的各个BSD4.4/BSD4.4-Lite版本上面(BSD:Berkly Software Distribution)的,后来也就逐渐沿用下来。1979年加州大学伯克利分校发布了BSD Unix,被称为开放源代码的先驱,BSD许可证就是随着BSD Unix发展起来的。
BSD授权许可证没有实现"通透性"自由,也就是其不保证软件源代码开放的连续性。这样如果你希望采用别人开发的BSD软件,进行一些修改,然后作为产品卖,或者仅仅保密自己做的一些除了软件开发以外的工作,那么你就可以从中得利。
- Apache V2.0:如ACE,Tomcat
- BSD:Berkly Software Distribution,如FreeBSD
- MIT:Massachusetts Institute of Technology,X License,如X Windows,ASN.1
许可说明:
- 允许各种链接,无开源义务
- 允许修改,无开源义务
- 软件所有人授予专利许可(Apache)、无专利规定(BSD、MIT)
推荐使用,商业友好许可证。
MPL类
MPL是The Mozilla Public License的简写,是1998年初Netscape的 Mozilla小组为其开源软件项目设计的软件许可证。MPL许可证出现的最重要原因就是,Netscape公司认为GPL许可证没有很好地平衡开发者对 源代码的需求和他们利用源代码获得的利益。
- CPL V1.0:Common Public License,如Junit
- EPL V1.0:Eclipse Public License,如Eclipse
- MPL V1.0:Mozilla Public License,如Firefox
- CDDL V1.0: Common Development and Distribution License,如OpenSolaris
许可说明:
- 允许各种链接,无开源义务
- 允许修改,但修改部分需要开源
- 部分源码使用,或全部源使用与私有代码混合使用,会被视为对原有软件使用,则混用私有代码需要开源
- 软件所有人授予专利许可
可以使用,但关注修改后对应的开源义务。
GPL类
1980年美国人Richard Stallman因为无法容忍软件私有化,而建立了GPL许可证。他认为,软件的源代码是全人类的财富,应该允许程序员自由共享。
GPL许可证的核心含义是,允许任何人观看、修改,并散播程序软件里的原始程序码,条件是如果你要发布修改后的版本就要连源代码一起公布。
LGPL V2:
- 许可说明
- 允许各种链接,动态链接无开源义务,静态链接需要开放与之链接私有软件的.o文件与makefile
- 允许修改再链接到私有软件,但是个性增加的功能实现不能依赖私有软件的数据功能
- 允许不受限制的使用头文件中数值参数,数据结构布局,存取,小宏,内联参数,十行以内的模板
- 仅原则性声明专利应免费许可,无详细规定
- 慎重使用,只允许动态链接方式使用
GPL V2:
- 许可说明
- 允许各种链接,但被链接的整个产品需要开源
- 允许修改,但被修改的部分及整个产品均需要开源
- 通过pipes, sockets的命令行参数与GPL软件进行通讯,不会导致私有软件被传染
- 仅原则性声明专利应免费许可,无详细规定
- 慎重使用,由于可能导致产品整个负有开源义务,不建议使用
社区
社区是松散的组织方式,人人都可参与
- 正式或非正式的网络支持
- 软件代码公开、共享
- 由志愿者运作管理
- 有多样性的可用资源
- 任何人可参与
- 非盈利组织
开源维权组织
- OSI(开源促进委员会)定义所有开源License
- FSF(自由软件基金会)是业界软件最大的开源软件维权组织
- Software Freedom Law Center(软件自由律师联盟)
社区两种组织方式:
- 会员制:如Liunx社区
- 集市:如Apache社区
区分社区可采用如下开放性原则:
- Open Code:只提供源码
- Open Release:提供源码+软件包
- Open Dev:透明的开发过程
- Community:透明的管理
Apache社区的组织架构:
- Contributor:任何人都可参是Contributor,但无代码库写权限,提交的内容需要Committer审核通过后才能合入代码库
- Committer:相比Contributor增加代码库写权限
- PMCer:社区项目有相关的决策权,能够影响项目的发展方向。有权提议将Contributor提升为Committer
- VP:项目的VP,领域专家
- 董事会:负责管理赞助,法务,品牌,公共事务,提议创建新项目,不参与具体项目管理
商业模式
- 捐赠模式:将项目捐赠给开源社区,达到打击竞争对手,或占领市场的目的
- 增值产品:在开源软件基础上开发增值产品
- 广告模式:在软件中植入广告,赚取广告投放费用
- 服务模式:提供开源相应的专业服务
- 双重授权:同时使用开源软件与商业授权模式
- 软硬件结合:通过对开源软件的支持,促进硬件的销售
- 社区模式:指那些并非为营利而存在的开源组织的运营模式,通过宣传,合作和开发、编写更好软件提供更好的技术支持,领导业界发展趋势。
使用开源
使用开源软件可能存在风险
- 使用的开源软件可能没有维护
- 不可捉摸,未来没有固定的路标计划
- 发现Bug没有管,提交修改没有人理会
- …
用好开源软件基本要求
- 来源可靠:来源正规社区官方网站,供应商或合作商提供,软件有明确的许可性或签订有相关使用协议
- 合法合规:按许可性要求使用,避免知识产权;履行开源义务;获取授权
- 网络安全:选型与评估,漏洞闭环管理,安全问题处理
- 可追溯:统一管理,先申请后使用,变更受控,修改记录可控
- 优选归一:建立优选库,给出优选版本与禁用版本等
- 生命周期管理:生命周期与产品版本配套
用好开源软件的秘决:
- 生态选型:关键看是否可持续发展
- 架构解耦:架构上要适应开源软件频繁更迭
- 社区协同开发:影响力不是重点,关键是达成产品商用生态要求
- 同步社区特性及测试套:建立测试基线,构建验证的防护网
- 回馈社区:根据使用开源软件的重要程序,主导或参与社区实践,及明回馈社区。
开源软件声明的范围与内容
- 范围:只需要声明开源软件,其它采购软件,免费软件,技术合作等非开源软件不在使用声明文档中声明
- 内容:使用声明文档、不担保声明,软件版本声明,软件许可证声明,书面邀约(GPL,LGPL需要开源义务的软件)
产品发布时,开源软件包的要求:
- 完整性:开源范围满足License要求,如须包含所有GPL与LGPL代码,以及传染部分
- 可编译性:开源代码必须能够编译通过,提供详细的编译指导文档,不能含有.git等文件夹等冗余信息
- 一致性:开源代码包编译结果与产品发布中使用的开源部分一致;不得包含不涉及开源义务履行的二进制文件(若源始开源包含了,则要相应提供)
修改声明义务:
- 修改时间
- 修改内容,简要说明修改内容
- 修改人及邮箱
- 若新增文件,则需要在文件头附上版本声明与免责声明