开源合规实践避坑指南

《新程序员》编辑部 《新程序员》编辑部     2023-03-02     322

关键词:

【CSDN 编者按】当前开源软件的应用范围不断扩大,企业和开发者对其合规使用问题的关注度也在逐渐上升。企业和开发者在使用、参与或主导开源项目的过程中,通常会涉及诸多开源合规相关问题。如何确定软件的权属选用恰当的开源许可证,从而避免触犯法律禁区?开放原子开源基金会高级法律顾问刘伟,以其多年参与各类知识产权诉讼案件的经验,为大家总结了开源合规实践避坑指南。

作者 | 刘伟      责编 | 何苗

出品 | 《新程序员》编辑部

 

 

开源合规一直以来都是开源实践中的重要话题。我国“十四五”规划中也提到,要“完善开源知识产权和法律体系,鼓励企业开放软件源代码、硬件设计和应用服务”。但“开源协议”或“开源许可证”大多为舶来品,国内的司法案例较少,企业对使用开源软件的实际法律风险和后果往往存在不同的认识。

在我 2015 年首次了解开源软件、参与开源案件之时,国内的开源案件还非常少,几无先例可循。进入开放原子开源基金会,正式踏上开源合规之路后,我发现开源合规的法律保护基本仍在现有的知识产权法律体系框架之内,涉及最多的知识产权类型也还是软件著作权。本次受 CSDN 《新程序员》邀请,我希望借助自己在知识产权领域的从业经验,从一些常见的开源合规痛点问题入手,帮助正在从事开源工作的企业和开发者们避开开源合规中常见的“坑”,更合规地参与开源软件开发、对开源项目进行贡献。
 

我写的代码一定就是我的吗?

关于程序员职务作品的权属问题,是我们在开源合规中遇到的最常见问题之一。

程序员在入职时签署的劳动合同(有可能是劳动合同的某个条款,也可能是跟劳动合同同时签署的单独协议)中通常会对职务作品归属进行明确约定。各公司关于该职务作品约定可能不尽相同,但通常会根据《著作权法》第十八条进行约定。《著作权法》第十八条具体规定如下:“自然人为完成法人或者非法人组织工作任务所创作的作品是职务作品。有下列情形之一的职务作品,作者享有署名权,著作权的其他权利由法人或者非法人组织享有,法人或者非法人组织可以给予作者奖励:(一)主要是利用法人或者非法人组织的物质技术条件创作,并由法人或者非法人组织承担责任的......计算机软件等职务作品。”

根据该法律条款规定,劳动合同中的职务作品条款通常会约定,对程序员主要利用雇主公司的物质技术条件创作,并由雇主公司承担责任的计算机软件,是程序员的职务作品,程序员作为代码作者仅享有署名权,著作权的其他权利均由其雇主公司享有。

但实践中,经常会有程序员不太理解职务作品的含义,并认为自己对工作期间开发的软件拥有著作权,也有程序员并未关注自己是否签署了该类职务作品条款。程序员可能因为对代码所有权的误解,做出未经雇主公司授权便将这部分代码进行发布或开源等侵犯雇主公司权利的行为,如早期的 Drew Technologies Inc. v. Society of Auto Engineers 案。在这类程序员未经授权发布代码的案件中,通常会通过删除代码来解决问题,但也不排除雇主公司对该程序员提起著作权侵权诉讼的可能。所以程序员一定要有基本的权利边界意识,明白在工作期间写的代码未必就属于自己。如果程序员对自己写的代码的归属存有疑问,应及时咨询法律专业人士的意见。从而避免因误解代码权属而侵犯雇主公司的合法权益引发纠纷,给自己的职业生涯带来不利影响。
 

开放出来的代码真的可以随便用吗?

这一问题涉及开源许可证的条件变更所带来的影响和纠纷。

实践中,程序员对开源软件还普遍存在这样的误解:既然软件权人把代码开放出来了大家就可以随便用。的确,在上游软件权人附开源许可证发布代码、开源代码的那一刻,其著作权就被单方授予了所有人,但对下游开发者而言,获得该许可并不意味着永久拥有该许可。通常开源许可证(无论为著佐权型许可证还是宽松型许可证)都是附许可条件的,一旦下游开发者违反了开源软件所适用的许可证的许可条件,其使用许可便从“有”变“无”了。丧失了开源软件的使用许可后,下游开发者继续使用该开源软件的行为同样会构成著作权侵权。此时,上游软件权人可以对其提起著作权侵权诉讼(与违约之诉竞合,但因为罚则不同,通常权利人会选择著作权侵权之诉),下游开发者便会面临侵权损害赔偿等法律后果。

希瑟·米克(Heather Meeker)律师在其 Open Source for Business 一书中提到,“Enjoy this boon until you misbehave(享有该恩惠,直至你行为不端)”,说的也是此类问题。此处的“ misbehave ”指的是下游开发者因违反该开源软件适用的许可证的许可条件,而丧失其原本已获得的开源软件使用许可的情况。

因此,上游软件权人将代码开放出来并不意味着下游开发者可以随便用。开源许可证常见的许可条件有版权及许可声明、修改说明、开放源代码、相同开源许可证许可、网络使用视同传播等。总体而言,无论宽松型许可证还是著佐权许可证,通常均有版权及许可声明的条件,著佐权许可证还会包括开放源代码、相同开源许可证许可等许可条件,而像 AGPL 这样的强著佐权许可证还包括网络使用视同传播的许可条件。下游开发者在使用开源软件时,请务必留意该软件所适用的开源许可证,并满足其对应的许可条件,防止因违反许可证的许可条件而丧失该开源软件的使用许可,从而致使自己(或雇主公司)陷入著作权侵权的风险之中。
 

软件权人可以随意为开源项目选择许可证吗?

许可证的合理选择对开源项目发展至关重要,如许可证选择不当或不遵守所依赖的第三方组件许可证的要求,会引发一系列的商业风险及开源合规风险,如何正确选用开源许可证要考虑的因素非常多。

开源许可证种类繁多,目前仅通过 OSI 认证的开源许可证已有一百多个,软件权人(可能是企业或开发者)面对纷繁复杂的开源许可证往往难以选择。这时,有的企业/开发者可能会参考其竞品开源软件采用的开源许可证,或是随意选一个较为常见的开源许可证。

因竞品软件与自身软件所属领域及特点均有相似之处,该做法或有可取之处,但也会存在二者因开源时机不同、开源目的不同、所依赖的第三方组件不同等原因而不应适用同一开源许可证的情况。随意选用开源许可证则更加不可取。但在实践中,此类情况屡见不鲜。

在 2021 年最高人民法院十大知识产权典型案件之罗盒公司诉玩友公司案中,软件权人最初于 2016 年 7 月 8 日为其 VirtualApp 项目引入 LGPL v3.0 开源许可证,将该项目开源。两个月后(2016 年 9 月 10 日),软件权人便将该项目的开源许可证从 LGPL v3.0 更改为GPL v3.0。一年后( 2017 年 10 月 29 日),软件权人又删除了该项目的开源许可证( GPL v3.0 )。两个月后(2017 年 12 月 31 日),软件权人停止了更新该项目的开源版本,并转为开发不开源的商业版本,并申明任何人如需将其用于商业用途,需向软件权人购买商业授权。

本案中,被告玩友公司“微信美颜版” App(V1.8.2)使用了原告于 2017 年 12 月 30 日在 GitHub 网站上发布的 Virtual App 开源版本,此时原告已经删除了该项目的 GPL v3.0 开源许可证,并申明任何人如需将涉案软件用于商业用途,需向其购买商业授权。因 GPL v3.0 开源许可证的著佐权范围本就延及至其衍生作品,因此,软件权人虽已删除了该项目的开源许可证,下游开发者仍可基于涉案软件先前的开源许可使用该项目。因此,如果被告玩友公司遵守了 VirtualApp 项目选用的 GPL v3.0 开源许可证的许可条件,并且将其基于VirtualApp 项目开发的“微信美颜版” App 的源代码也采用 GPL v3.0 开放出来,并同时满足 GPL v3.0 的版权及许可声明等其他许 可条件,则可以认为,以上为玩友公司基于开源许可证使用 VirtualApp 开源项目的行为合法。但本案中,玩友公司并没有遵守 GPL v3.0 开源许可证的开放源代码的许可条件,而是将基于 VirtualApp 项目开发的“微信美颜版” App 进行了闭源分发,因此,玩友公司对 VirtualApp 开源项目的后续使用,均系未经授权使用,构成著作权侵权。

从罗盒公司在短时间内(约一年半)先后多次变更许可证、删除许可证、进行闭源商业许可等行为,可见其软件权人在最初选用开源许可证时可能并未充分考虑 各开源许可证及软件自身的特点,选取合适的开源许可证。

软件权人选择开源许可证至少应从发布源代码的目的、软件的专利状态、软件是否与 Linux 进行交互、软件是否分发(还是仅为网络使用)等多个维度进行考虑,并在常见的开源许可证,如 GPL v2.0/3.0、LPL v2.0/3.0、 AGPL v3.0、MPL v2.0、Apache v2.0、MIT、BSD 中进行选择。

从软件权人发布开源代码的维度分析。如果软件权人希望促进软件的采用最大化,且允许下游开发者(包括竞争对手)将其软件用于专有产品,则可从 Apachev2.0、MIT、BSD 等宽松开源许可证中进行选择。如果软件权人希望促进其软件的采用最大化,但下游开发者必须也将其源代码开放出来,且不希望其代码被私有化,则可从 GPL v2.0/3.0、LPL v2.0/3.0、AGPL v3.0、MPL v2.0 等著佐权许可证中进行选择。如果软件权人希望下游开发者要么开放其源代码,要么通过商业许可获得授权,则可以考虑选用著佐权许可证与商业许可结合的双许可模式。但是,如果软件权人希望下游开发者仅将其软件用于非商业目的(或增加与开源软件定义相矛盾的其他限制),则从严格意义上而言,并没有这样的开源许可证可供选择,此时软件权人或许可以考虑选择商业许可或 CC-NC 协议。另外一种极端情况是,软件权人仅希望发布开源软件供下游开发者使用,但不想进行任何限制也不要求任何回报,这时可以考虑选用 CC 协议,但 CC 协议并非严格意义上的开源许可证。

从软件专利状态的维度考虑,如果软件存在相关专利/专利申请,则可考虑附带专利许可条款的开源许可证,如 GPL v3.0、LGPL v3.0、AGPL v3.0或MPL v2.0、Apache v2.0 等开源许可证。

从软件是否与 Linux 进行交互的维度考虑,如果软件与 Linux 进行交互,因 Linux Kernel 采用的开源许可证为 GPL v2.0 开源许可证,还需要考虑软件选用的许可证 与 GPL v2.0 开源许可证的兼容性问题,可选择与 GPL v2.0 兼容的开源许可证,如 GPL v2.0、LGPL v2.0、MPL v2.0、MIT、BSD 等开源许可证。

从软件是否分发还是仅为网络使用的维度考虑,如果软件不进行分发而仅通过网络使用(主要用于 SaaS 场景),此种情况下,若软件权人希望下游开发者后续仍基于同样的开源许可证开放其源代码,则建议选用 AGPL v3.0 开源许可证。

另外,软件权人在选择开源许可证时还要考虑,代码是完整程序还是仅为一个库、代码是否用于物联网设备等相关因素,进行综合考量。当软件权人实在无法确定选择哪个开源许可证时,同样建议咨询开源许可专业人士的意见。
 

结语


除了开源代码的归属权、开源许可证的条件变更、开源许可证的选择等常见问题,开源合规中还有许多问题,在此不再一一赘述。建议开发者与企业在参与开源项目时,重点关注知识产权相关法律与开源许可证相关知识,遵循开源软件相关许可要求,合规使用开源软件,明确开源软件的使用范围和使用的权利与义务,保障开源软件作者或权利人的合法权益,同时保护自身与第三方供应商免受侵权风险。如若遇到难以判断的问题,请优先咨询开源许可专业人士的意见。

此外,对开源合规问题特别感兴趣的读者,非常推荐读一下希瑟·米克(Heather Meeker)律师所著的Open Source for Business-A Practical Guide to Open Source Software Licensing。该书凝聚了作者从程序员到全球顶级开源许可律师传奇职业经历中的心得体会,及其对开源许可问题深入浅出的分析,在开源圈小有名气。另外,本书中译本《商业开源:开源软件许可实用指南》也经笔者翻译预计在 2022 年年底出版,届时基金会也会通过 CC 协议面向公众共享该中译本电子版,欢迎大家阅览与学习。
 

开源合规实践避坑指南

【CSDN编者按】当前开源软件的应用范围不断扩大,企业和开发者对其合规使用问题的关注度也在逐渐上升。企业和开发者在使用、参与或主导开源项目的过程中,通常会涉及诸多开源合规相关问题。如何确定软件的权属... 查看详情

开源合规实践避坑指南

【CSDN编者按】当前开源软件的应用范围不断扩大,企业和开发者对其合规使用问题的关注度也在逐渐上升。企业和开发者在使用、参与或主导开源项目的过程中,通常会涉及诸多开源合规相关问题。如何确定软件的权属... 查看详情

机器视觉行业实践技巧--opencv技巧与方法:避坑指南

文章大纲光源的使用镜头与焦距OpenCV代码脚手架摄像头计数视频转图片视频播放速度更改后保存USB4K高清免驱摄像头windows下无法修改分辨率?OpenCV图片处理-添加文字OpenCV同时拼接两个摄像头OpenCV视频关键帧提取OpenCV多摄像头视... 查看详情

10个常见的postgresql错误及避坑指南!(代码片段)

...按】PostgreSQL作为当下流行的数据库,不少开发者因其开源、可靠、可扩展等特性把它应用到实际的生产环境中,帮助无数PostgreSQL厂商的Percona编制了一个最常见错误的列表。即使你认为自己已经正确地安装配置PostgreSQL... 查看详情

避坑指南!网上买卡“坑”太深,七个避坑指南或许能用得上!

  经常用纯流量卡的应该都清楚,这种卡就是所谓的物联卡、物联网卡、消费级物联卡,从外观上看,和普通手机卡差不多,都可以放在手机上使用,但是从功能上来讲,物联卡,也就是所谓的纯流量... 查看详情

jmeter避坑指南

1.jp@gc-PerfMonMetricsCollector控件中必须要将文件进行写入,否则报错:    2.并发测试后报java.net.BindException:Addressalreadyinuse:原因:操作系统会为TCP/IP服务预留临时端口,Jmeter在跑并发测试的时候每开启一个线程(newsoc... 查看详情

fabric.js避坑指南(持续更新中)

1.group中add(),addWithUpdate(),setCoords()的区别使用过程中发现,addWithUpdate()会把组当前scale设为1,angle设为0。例如当前组大小为初始组的0.6倍(即scale=0.6),执行addWithUpdate()之后,组将视当前大小为scale=1的大小。所以,如果你希望组s... 查看详情

.netasynclocal避坑指南(代码片段)

...AsyncLocal用法简介AsyncLocal实现原理AsyncLocal的坑AsyncLocal的避坑指南HttpContextAccessor的实现原理AsyncLocal用法简介通过AsyncLocal我们可以在一个逻辑上下中维护一份数据,并且在后续代码中都可以访问和修改这份数据。无论是在新创建... 查看详情

nginx常用配置,避坑指南!(代码片段)

安装Nginx#更新软件包,请确保服务器的软件包已经是最新的。sudoyumupdate-y#添加Nginx源sudorpm-Uvhhttp://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm#安装Nginxsudoyuminstall-ynginx#启动Nginx 查看详情

速记:安卓netty部署ssl/tls和避坑指南(代码片段)

速记:安卓Netty部署SSL/TLS和避坑指南先按照https://blog.csdn.net/russle/article/details/99086684方法操作第一步生成服务器端私钥和证书仓库命令keytool-genkey-aliasmySrvAlias1-keysize2048-validity365-keyalgRSA-dname“CN=localhost”-k 查看详情

速记:安卓netty部署ssl/tls和避坑指南(代码片段)

速记:安卓Netty部署SSL/TLS和避坑指南先按照https://blog.csdn.net/russle/article/details/99086684方法操作第一步生成服务器端私钥和证书仓库命令keytool-genkey-aliasmySrvAlias1-keysize2048-validity365-keyalgRSA-dname“CN=localhost”-k 查看详情

zabbix的安装避坑指南

(1)zabbix的服务端的安装:①zabbix部署流程规划:1、centos7不支持yum安装服务端,客户端可以yum安装2、部署ngx+php环境并测试3、部署数据库mariadb10.5以及上4、编译安装zabbix-server服务器以及后端配置5、部署前端代码进行访问6、web... 查看详情

jobshow互联网大厂-裁员加班薪资-实况,求职避坑指南

【JobShow裁员加班实况】,求职避坑指南。薪火相传,欢迎新增,欢迎转发👏👏👏【发布3天:累计访问人数5000+】话不多说,你懂得!  查看详情

如何判断一个创业团队是否有前景?避坑指南

如何判断一个创业团队是否有前景?17年的时候,我在一家智慧停车的创业公司,待过2年左右,团队30多人。接下来将结合自己的经历,从项目本身、团队情况、认清自己三方面,来谈谈对「如何判断一个创业团队是否有前景」... 查看详情

万字避坑指南!c++的缺陷与思考(下)(代码片段)

导读 |在万字避坑指南!C++的缺陷与思考(上)一文中,微信后台开发工程师胡博豪,分享了C++的发展历史、右值引用与移动语义、类型说明符等内容,深受广大开发者喜爱!此篇,我... 查看详情

springaop通知细节-避坑指南(代码片段)

文章目录1.Spring基于XML的通知执行顺序1.1.XML文件配置说明1.2.各种通知说明1.3.在配置同一个切入点且不出现异常时的执行顺序1.4.情况一1.2.情况二1.3.情况三1.4.情况四1.5.小结2.Spring基于注解的通知执行顺序2.1.正常情况2.2.异常情况2... 查看详情

python函数默认参数避坑指南(代码片段)

列表是一种经常使用的数据类型。在函数的定义中,常常会使用列表作为参数。比如,要测试一个接口的数据,接口返回的数据格式如下:"code":"20000","data":["孙悟空","李白","甄姬"],"msg":"success","status":0要测试的内容是:返回的data... 查看详情

rocketmq避坑指南:阿里面试100题

灵魂发问:我们为什么要学习SpringBoot???官方对SpringBoot的定位:BuildAnything,Build任何东西。SpringBoot旨在尽可能快地启动和运行,并且只需最少的Spring前期配置。同时我们也来看一下官方对后面两个... 查看详情