为什么商业基础软件需要开源

Bytebase 本身是一家商业软件公司,而作为最核心资产的代码从 Day 0 却是开源的。同时我们还是 star-history.com 的运营者,大家在各种开源渠道会看到它生成的图:

file

一直以来,常会被别人问起的一个问题,就是为什么 Bytebase 要开源。结合这 2 年多的实战经验,一次性把能想到的写下来。

先圈定一下范围,就是标题中的 2 个定语:

  • 基础软件。基础软件的特质就是基本没有行业属性,各行各业都能用,底层的如操作系统,数据库,往上走一点的如开发框架,消息队列,再往上层一点的开发者工具都属于基础软件的范畴。
  • 商业。商业就是以盈利为目的的。与之相对应的则是非营利性,依靠赞助和爱好者用爱发电。

开源的好处

1. 增加渠道曝光度

GitHub 作为全球最大的程序员社交平台,成为了现在基础软件最大和最优质的分发渠道。从 Bytebase 自己官网的流量统计看,从 GitHub 引来的流量,跳转率和驻留时长指标都远远优于其他渠道。而 Bytebase 目前的付费客户中,也有超过 7 成的线索是通过 GitHub 和相关开源渠道过来的。

file

2. 增加客户安全感

因为是基础软件,处于底层,所以通常都会支撑到客户的核心系统。商业化公司对于软件是要收费的,动辄每年几万到几十万不等。客户花不少钱采购支持他们核心业务的软件,肯定是要挑选更放心的产品。开源软件的代码是全公开的,整个的研发过程也被 GitHub 记录的一清二楚。从原材料到最终成品的整个制作过程都是完全透明的。开源厂商不敢堂而皇之地植入恶意代码,另外如果厂商本身跑路了,社区或者客户本身至少还有继续维护下去的途径。

3. 构建生态壁垒

同类软件,开源的只要能达到闭源水平的 50% 甚至更低,就有资格挑战了。移动时代的 Android 之于 iOS,到现在的各种开源大模型之于 OpenAI。而要用一款开源产品去替代另一款占据市场多年的开源产品,难度可就高多了。像 web 服务器,Nginx 和 Apache 同为开源产品,Apache 发布于 1995 年,Nginx 发布于 2004 年,Nginx 的架构领先 Apache 一代,但即使过了那么多年,从市场占有率看,Nginx 也只领先了几个点。

file

前不久 Redpoint 发布的 InfraRed 100 榜单里,新兴者挑战在位者的模式有:

  • 用开源挑战闭源,比如 Supabase 挑战 Firebase,ClickHouse 挑战 Snowflake,MINIO 挑战 S3。
  • 用开源挑战开源,比如 Deno 挑战 Node。
  • 用闭源挑战闭源,比如 Linear 挑战 Jira。

file

最常见的是用开源挑战闭源,而唯独没有的是用闭源挑战开源的模式。

4. 让用户自助

代码就是最好的文档,一些错误定位,文档要是缺失,根据错误提示搜索代码仓库,就能自己定位问题。

打消开源的顾虑

1. 商业版被破解

他人可以不遵守开源软件的商业协议,肆意篡改代码,在没有购买商业证书的情况下使用商业版。盗版的问题也并不是开源软件独有的,像微软,Adobe,Oracle 这样先睁一只眼闭一只眼,等到时机成熟了,再让律师出马。使用破解版的风险始终在使用者这边,在基础软件这块,风险更加会被放大,没有售后 SLA 支持,出现问题无法解决,遭受的损失往往要大的多。

2. 泄露核心商业机密

代码是公司的核心资产是没有错,但是这个代码本身包含了多少独特的商业机密,需要打个大大的问号。基础软件主要是各种 API,算法模块的组装,业务软件里才会藏着各种独门策略。就像提供搜索能力的基础软件并非什么机密,机密的是具体的搜索排序规则。

3. 开源代码的安全性

代码开源后,别人就可以研究代码,找漏洞,进行攻击。但正因为代码开源,也更容易让别人帮忙找到漏洞,进行修复。既然连 OpenSSL 都是开源的,其他项目也没什么好担心的。

4. 代码写得太烂,拿不出手

写好的代码不是为了取悦他人,而是为了让软件变得可扩展,可维护。客户也不会为了好的代码买单,而是为能解决的问题买单。

剩下的一些摇摆 ⚖️

1. 外部贡献者的参与究竟是好是坏

Bytebase 历史上也有同学贡献过比较大的功能点,比如集成 GitHub,集成 OceanBase,集成达梦。但从总的代码量来说,Bytebase 外部贡献者的代码量大概只占 1%。当然也有不少开源项目培养出了积极的外部贡献者,但商业驱动的开源项目和靠着兴趣和解决个人问题驱动的个体贡献者,两者的目标还是不同的。从纯时间投入来说,指导,审核,协调外部贡献者未必比自己团队操刀来得更高效。

2. 维护成本是增加还是减少

因为代码都开源了,也就少了需要把代码保密的需要。其实国内采购软件的客户,往往也都需要软件的源代码。代码开源,也就少了这个麻烦。但另一方面,因为代码完全开源,一些密钥配置就更加不能直接放在代码里了,这增加了代码的复杂度。

写在最后

最近国外开源圈也有一次交锋,MongoDB 开发者关系副总裁 Matt Asay「The open source licensing war is over」vs RedMonk 创始人 Stephen O’Grady「Why Open Source Matters」。双方都是开源圈的资深人士,Matt 在 AWS 和 MongoDB 间反复横跳,至于 Stephen,更多人知道的是他这本书的封面。

file

首先双方都认可开源的价值,分歧点在谁有权力分配价值上。国外这两年争议的焦点都是围绕开源的定义以及开源协议,他们是已经在开源的价值上形成了共识,剩下就在掰扯怎么分配开源的蛋糕。

而在国内,对于基础软件是否开源尚未达成共识。当然也因为这个原因,Bytebase 作为一个开源项目还能享受到不少红利,而像本篇这样宣扬开源的文字也还显得有所价值。

希望 2 年后回看这篇文章,那剩下的摇摆也已经找到了答案,至于其它的,就让它们全都变成废话吧。


💡 你可以访问官网,免费注册云账号,立即体验 Bytebase。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/75910.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RocketMQ部署 Linux方式和Docker方式

一、Linux部署 准备一台Linux机器,部署单master rocketmq节点 系统ip角色模式CENTOS10.4.7.126Nameserver,brokerMaster 1. 配置JDK rocketmq运行需要依赖jdk,安装步骤略。 2. 下载和配置 从官网下载安装包 https://rocketmq.apache.org/zh/downlo…

青翼科技自研2路250MSPS DA回放FMC子卡模块

FMC150_V30是一款基于VITA57.1规范的2路125MSPS采样率16位分辨率AD采集、2路250MSPS采样率16位分辨率DA回放FMC子卡模块。该模块遵循VITA57.1规范,可直接与符合VITA57.1规范的FPGA载卡配合使用,板卡ADC器件采用ADI公司的AD9268芯片,板卡DAC器…

LeetCode 33题:搜索旋转排序数组

目录 题目 思路 代码 暴力解法 分方向法 二分法 题目 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 …

【Linux】IO多路转接——epoll

目录 epoll初识 epoll的相关系统调用 epoll工作原理 epoll服务器 epoll的优点 epoll工作方式 对比LT和ET epoll初识 epoll也是系统提供的一个多路转接接口。 epoll系统调用也可以让我们的程序同时监视多个文件描述符上的事件是否就绪&#xff0c;与select和poll的定位是…

【量化课程】02_3.投资学基础概念

文章目录 1. 投资和投资学的关系1.1 什么是投资&#xff1f;1.2 什么是投资学&#xff1f; 2. 投资学的主要内容2.1 金融市场与投资环境2.1.1 金融资产2.1.2 债券市场的意义2.1.3 金融市场与经济2.1.4 投资过程2.1.5 竞争性的市场2.1.6 市场参与者2.1.7 主要的市场债券市场外汇…

介绍一些编程语言— Visual Basic 语言

介绍一些编程语言— Visual Basic 语言 Visual Basic 语言 简介 Visual Basic&#xff08;简称 VB&#xff09;是美国 Microsoft 公司于 1991 1991 1991 年研制的一种基于图形用户接口的 Windows 环境下的开发工具&#xff0c;是一种面向对象、可视化的新型开发工具&#x…

Integer中缓存池讲解

文章目录 一、简介二、实现原理三、修改缓存范围 一、简介 Integer缓存池是一种优化技术&#xff0c;用于提高整数对象的重用和性能。在Java中&#xff0c;对于整数值在 -128 到 127 之间的整数对象&#xff0c;会被放入缓存池中&#xff0c;以便重复使用。这是因为在这个范围…

C++QT教程3——手册4.11.1自带教程(笔记)——创建一个基于Qt Widget的应用程序

文章目录 创建一个基于Qt Widget的应用程序创建Text Finder项目素材文件 填补缺失的部分设计用户界面完成头文件完成源文件创建资源文件 编译和运行程序 参考文章 创建一个基于Qt Widget的应用程序 本教程介绍如何使用Qt Creator创建一个小型Qt应用程序&#xff0c;名为Text F…

maven如何建立JavaWeb项目并连接数据库,验证登录

这里是建立建立web项目&#xff1a;Maven如何创建Java web项目&#xff08;纯干货版&#xff09;&#xff01;&#xff01;&#xff01;_明天更新的博客-CSDN博客 我们主要演示如何连接数据库验证登录。 1.在webapp目录下创建我们的登录页面&#xff1a;index.jsp 还需要再…

STM32F4X-GPIO输入功能使用

STM32F4 GPIO输入模式配置 上一节讲GPIO的时候说到了将GPIO设置成输出模式&#xff0c;并通过将GPIO的电平拉高拉低控制LED灯的例程。GPIO除了用作输出功能之外&#xff0c;还可以用作输入功能。最常用的就是检测按键的输入电平。 硬件设计 本章的硬件是基于正点原子的探索者…

POSTGRESQL 关于安装中自动启动的问题 详解

开头还是介绍一下群&#xff0c;如果感兴趣Polardb ,mongodb ,MySQL ,Postgresql ,redis &#xff0c;SQL SERVER ,ORACLE,Oceanbase 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加 liuaustin3微信号 &…

IDEA 中Tomcat源码环境搭建

一、从仓库中拉取源代码 配置仓库地址、项目目录&#xff1b;点击Clone按钮&#xff0c;从仓库中拉取代码 Tomcat源码对应的github地址&#xff1a; https://github.com/apache/tomcat.git 二、安装Ant插件 打开 File -> Setting -> Plugins 三、添加Build文件 &…

24届近3年青岛理工大学自动化考研院校分析

今天给大家带来的是青岛理工大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、青岛理工大学 学校简介 青岛理工大学是一所以工为主&#xff0c;土木建筑、机械制造、环境能源学科特色鲜明&#xff0c;理工经管文法艺等学科协调发展的多科性大学。是国家首批地方…

SpringCloud实用篇6——elasticsearch搜索功能

目录 1 DSL查询文档1.1 DSL查询分类1.2 全文检索查询1.2.1 使用场景1.2.2 基本语法1.2.3 示例1.2.4 总结 1.3 精准查询1.3.1 term查询1.3.2 range查询1.3.3 总结 1.4.地理坐标查询1.4.1 矩形范围查询1.4.2 附近查询 1.5 复合查询1.5.1 相关性算分1.5.2 算分函数查询1&#xff0…

Linux fork()||fork()问题

以下代码会输出几个"A"&#xff1f; int main() { fork() || fork();printf("A\n");} 代码分析&#xff1a; //父进程fork() || fork();printf("A\n");这里父进程中的第一个fork先执行&#xff0c;产生一个子进程&#xff1a; //子进程…

图扑数字孪生智慧乡村综合管控平台

数字乡村是伴随网络化、信息化和数字化在农业农村经济社会发展中的应用&#xff0c;既是乡村振兴的战略方向&#xff0c;也是建设数字中国的重要内容。为了进一步提升乡村治理智能化、专业化水平&#xff0c;解决建设顶层缺失、数据孤岛等问题&#xff0c;数字孪生技术被广泛应…

SpringBoot、Java 使用 Jsoup 解析 HTML 页面

使用 Jsoup 解析 HTML 页面 什么是 Jsoup&#xff1f; Jsoup 是一个用于处理 HTML 页面的 Java 库&#xff0c;它提供了简单的 API&#xff0c;使得从 HTML 中提取数据变得非常容易。无论是获取特定标签的内容还是遍历整个页面的元素&#xff0c;Jsoup 都能轻松胜任。 如何使…

PHP自己的框架实现function引入和dump函数(完善篇一)

1、实现效果 2、创建三个function.php 3、文件加载&#xff08;KJ.php&#xff09; 定义目录 define("FILE_PATH",KJ_CORE./file); //定义框架文件路径define("COMMON_PATH",ROOT_PATH./common); //定义公共目录 加载文件 public static function run(){…

Pod控制器

Pod控制器 一、Deployment 部署无状态应用 负责创建和管理 ReplicaSet&#xff0c;维护 Pod 副本数量与期望值相同 负责创建和删除 Pod 资源&#xff0c;多个 Pod 副本时是并行执行的&#xff0c;升级策略默认为滚动更新的方式无中生有出配置文件 kubectl create deployment …

【es6】函数柯里化(Currying)

柯里化&#xff08;Currying&#xff09;&#xff1a;把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数&#xff0c;并且返回接受余下的参数且返回结果的新函数。 柯里化由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的&#xff0c;它是 Mos…