当前位置: 首页 > news >正文

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

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。

相关文章:

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

Bytebase 本身是一家商业软件公司,而作为最核心资产的代码从 Day 0 却是开源的。同时我们还是 star-history.com 的运营者,大家在各种开源渠道会看到它生成的图: 一直以来,常会被别人问起的一个问题,就是为什么 Byteba…...

【自用】云服务器 使用 docker 搭建 HomeAssistant + MQTT 物联网平台

总览 1.搭建流程概述 2.准备工作 3.开始搭建! 4.总结 如果想看 ESP32 或其他使用 MicroPython 编程的单片机如何连接到该云服务器,实现 HomeAssistant 控制 单片机的内容,请看我这篇博客的下一篇。 一、搭建流程概述 0.总体流程 我们需要…...

ABAP: SQL 多值查询

基础查数据 问题举例:例如查物料类型为ZFRT、ZROH和ZRSA的物料编码。 1、直接查询,三种不同类型的物料类型是或的关系。 SELECT DISTINCT ma~matnr ma~mtartFROM mara AS maINNER JOIN mbewh AS mbON ma~matnr mb~matnrINTO CORRESPONDING FIELDS OF…...

分布式学习最佳实践:从分布式系统的特征开始

正文   在延伸feature(分布式系统需要考虑的特性)的时候,我逐渐明白,这是因为要满足这些feature,才设计了很多协议与算法,也提出了一些理论。比如说,这是因为要解决去中心化副本的一致性问题&…...

第三章 图论 No.8最近公共祖先lca, tarjan与次小生成树

文章目录 lcaTarjan板子题:1172. 祖孙询问lca或tarjan:1171. 距离356. 次小生成树352. 闇の連鎖 lca O ( m l o g n ) O(mlogn) O(mlogn),n为节点数量,m为询问次数,lca是一种在线处理询问的算法 自己也是自己的祖先 倍…...

[Kubernetes]Kubeflow Pipelines - 基本介绍与安装方法

1. 背景 近些年来,人工智能技术在自然语言处理、视觉图像和自动驾驶方面都取得不小的成就,无论是工业界还是学术界大家都在惊叹一个又一个的模型设计。但是对于真正做过算法工程落地的同学,在惊叹这些模型的同时,更多的是在忧虑如…...

Sui网络的稳定性和高性能

Sui的最初的协议开发者设计了可扩展的网络,通过水平扩展的方式来保持可负担得起的gas费用。其他区块链与之相比,则使用稀缺性和交易成本来控制网络活动。 Sui主网上线前90天的数据指标证明了这一设计概念,在保持100%正常运行的同…...

RabbitMQ 安装教程

RabbitMQ 安装教程 特殊说明 因为RabbitMQ基于Erlang开发,所以安装时需要先安装Erlang RabbitMQ和Erlang版本对应关系 查看地址:www.rabbitmq.com/which-erlan… 环境选择 Erlang: 23.3及以上 RabbitMQ: 3.10.1Windows 安装 1. 安装Erlang 下载地…...

STM32F429IGT6使用CubeMX配置GPIO点亮LED灯

1、硬件电路 2、设置RCC,选择高速外部时钟HSE,时钟设置为180MHz 3、配置GPIO引脚 4、生成工程配置 5、部分代码 6、实验现象...

DOM的节点操作+事件高级+DOM事件流+事件对象

一.节点操作 1.父节点: node.parentNode 得到的是离元素最近的父级节点 2.子节点: parentNode.childNodes 所有的子节点 包含元素节点 文本节点等等parentNode.children (非标准) 获取所有的子元素节点,实际开发常用 parentNode.firstChild 获取…...

云端剪切板,让你的数据同步无界

云端剪切板,让你的数据同步无界! 每个人都应该保护自己的数据,同时使它易于访问和共享。这就是我们的云剪切板网站诞生的原因!无论你在哪里,只要登录我们的网站,就可以随时随地使用你的剪切板数据。 你可…...

Location匹配与Rewrite重写

一、常见的Nginx正则表达式 ^ :匹配输入字符串的起始位置 $ :匹配输入字符串的结束位置 * :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”:匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“oll…...

Docker源码阅读 - goland环境准备

docker 源码分为两部分 cli 和 moby(docker) tips: docker是从moby拷贝过去的;docker整体是一个C-S架构,cli客户端,docker服务端 docker-ce:https://github.com/docker/docker-ce cli:https://…...

数据库信息速递 -- MariaDB 裁员后,前景不确定 (翻译)

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加 liuaustin3微信号 ,在新加的朋友会分到3群&#xff…...

4.1 Windows终端安全

数据参考:CISP官方 目录 安全安装保护账户安全本地安全策略安全中心系统服务安全其他安全设置软件安全获取 一、安全安装(以安装windows系统为例) 选择合适的版本 商业版本:家庭版、专业版、专业工作站版、企业版特殊版本&…...

win10强制卸载奇安信天擎

1、win r 打开运行 2、输入msconfig进入系统配置面板 3、点击引导,修改安全引导配置项 4、重启系统(桌面会变成纯黑背景,符合预期,莫紧张) 5、删除安装的文件夹 若是安装天擎时选择的自定义安装,则配置…...

npm常用命令

npm -v:查看 npm 版本 npm init:初始化后会出现一个 Package.json 配置文件,可以在后面加上 -y,快速跳到问答界面 npm install:会根据项目中的 package.json 文件自动给下载项目中所需的全部依赖 npm insall 包含 -…...

(一)创建型设计模式:4、原型模式(Prototype Pattern)

目录 1、原型模式的含义 2、C实现原型模式的简单实例 1、原型模式的含义 通过复制现有对象来创建新对象,而无需依赖于显式的构造函数或工厂方法,同时又能保证性能。 The prototype pattern is a creational design pattern in software development. …...

【算法学习】高级班九

这种互为旋变串&#xff1a; 给定两个字符串&#xff0c;判断是否互为旋变串 代码&#xff1a; 打表法&#xff1a; 每一层内的数字不互相依赖&#xff0c;只依赖它下面的层但实际上size会约束L1和L2的值&#xff0c;即L1和L2<N-size 思路&#xff1a;设置一个窗口…...

数据安全加固:深入解析滴滴ES安全认证技术方案

前文分别介绍了滴滴自研的ES强一致性多活是如何实现的、以及如何提升ES的性能潜力。由于ES具有强大的搜索和分析功能&#xff0c;同时也因其开源和易于使用而成为黑客攻击的目标。近些年&#xff0c;业界ES数据泄露事件频发, 以下是一些比较严重的数据泄露案件&#xff1a; 202…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...