作者 | Radon Rosborough

译者 | 弯月,责编 | 郑丽媛

出品 | CSDN(ID:CSDNnews)

去年我从大学毕业,现在一家公司担任开发运维及基础设施工程师。工作之余,我还利用空闲时间维护了一些开源项目。

在大学期间,我曾在一家创业公司 Replit 实习。本文主要讲述了 Replit 胁迫我关闭他们不喜欢的开源项目的经过。

Replit 是什么?

Replit 开发了一款 Web 应用,你可以通过这款应用在线运行使用不同的编程语言编写的代码。这并不是什么新的点子,但 Replit 的价值在于附加功能,比如分享工作成果、安装第三方软件包以及托管 Web 应用等等。

2019 年夏天,我在 Replit 工作期间,曾负责重建 Replit 的包管理技术栈,并将其开源了(源代码地址:https://github.com/raxod502/upm)。

2020 年夏天,我进入了另一家公司工作,但有时 Replit 会告诉我他们开发了一些非常酷的功能,我也会通过电子邮件与他们聊天。

我的开源项目

Replit 能够支持许多不同的编程语言,这一点我非常喜欢。我经常思考一个问题:一个网站可以容纳多少种编程语言?

为了研究这个问题,我构建了一个很小的可以在线运行代码的 Web 应用。我花了一天的时间,这款应用的雏形就构建好了。为什么我的这款应用如此之快?其实,在 Web 应用中运行 Python 代码只需要 30 行代码就可以了!这可能就是为什么在线运行 Python 代码的网站如此之多……

在这款小应用可以正常运行之后,我开始陆续加入各种不同的编程语言。如下是该项目的部分版本历史记录,我超级兴奋:

languages---------
2020-06-05 df9ba38 Initial commit                                          0
2020-06-05 5e3a4a4 Install some packages into a Docker image               0
2020-06-05 e937c8f Simple Express server with "Hello world"                0
2020-06-06 0961498 Embed terminal on frontend app                          0
2020-06-06 c66cf63 Embed Monaco editor on frontend                         0
2020-06-06 27ab1f7 Add "run" button                                        0
2020-06-06 f417858 You can run Python code now                             1
2020-06-07 d543081 You can run many languages now                          8
2020-06-07 e2a3e71 All languages 17 working now                           17
2020-06-07 473c50c ALL THE LANGUAGES                                      25
2020-06-08 3718315 even more languages                                    33
2020-06-08 548c1c1 repl.it superiority!!                                  38
2020-06-08 1ae424f More languages, we need all the languages              48
2020-06-09 c34ccf2 A lot more languages                                   77
2020-06-09 846caf2 At this point the number of languages is absurd        79

最终,我一共添加了 216 种语言,包括 Replit 支持的 38 种语言。你可能会问:为什么我要花这么多时间,在一个没什么人使用的 Web 应用中添加如此之多鲜为人知的编程语言?我只能说:这算不算是 2020 年你所见过的最奇怪的个人爱好?

与 Replit 分享了我的开源项目

有一天,我收到了一封来自 Replit 的电子邮件,通过邮件我得知他们发布了一项新功能。我认为这是与他们分享我的开源项目的好时机,也许他们可以从我的工作中获得一些灵感:

起初,我获得了一些积极的回应。然而,30 分钟后,Replit 突然开始指责我,说我不道德,还说我抄袭他们的设计:

首先,我的开源项目用到的所有想法均不是他们的“内部设计决策”(internal design decisions):他们的设计决策都发布到了 Replit 的博客上(我知道这一点是因为在我实习期间也写了一些博文)。其次,我的项目并非 Replit 克隆版,你去网上搜索一下“在线运行 Python”(或者搜索英文 run python online)就知道了,大部分代码都是大同小异:

但是,我觉得这中间可能有一些误会,因此我询问了细节:

然而,不幸的是,Replit 拒绝提供任何细节详细说明我究竟做错了什么。他们只是重申了之前的陈述,并威胁会起诉我:

接着,Replit 发来了另一封电子邮件,提醒我上个月他们刚刚从投资者那里筹集到了 2000 万美元,有必要的话,他们会利用这笔资金来对付我。然而,我曾是他们公司的一名实习生,一年前刚从大学毕业,并且没有经营任何商业机构。

关于这封邮件,我想指出两点:

  • 邮件中提到“类似这样的代码提交”(commits like this),实际上是一种误导。我的项目中只有一次代码提交提到了“Replit”,就是我上面展示的那个,在写代码的第三天,我就添加完了 Replit 支持的 38 种语言,然后又继续添加了 178 种其他语言。

  • 邮件中还说他们非常需要我这样的实习生,但我不明白这是什么意思。尤其是在第一份邮件中,他们还说希望我能回去。但是无所谓了,因为这与眼前的问题并没有什么关系。

Replit 威胁要起诉我

于是,我立即撤了我的项目,我觉得需要一些时间冷静下来,而且我还向 Replit 发了邮件道歉。我觉得有些东西在邮件中说不清楚,所以我问他能不能通个电话:

然而,不幸的是,Replit 无视了我的邮件,所以我又发送了邮件。这一次虽然我得到了回应,但是与我的希望有所出入:

为了让 Replit 明白,我并不满意眼前的情况,在接下来的几周内我又先后发送了三封电子邮件,但都被无视了。

换句话说,Replit 非常坚定:如果我重新发布我的开源项目,他们就会聘请“顶级律师”起诉我。

Replit 做的对吗?

Replit 声称我的开源项目是:

1. 抄袭 Replit;

2. 抄袭他们的商业秘密(“内部设计决策”);

3. 不道德。

下面,我们来逐个看看他们的这些说法:

1. 在开发项目的时候,我克隆 Replit 了吗?

2. 在开发项目的时候,我利用任何 Replit 的商业秘密了吗?

3. 在他们公司工作过一段时间后,我开发一个类似于 Replit 的开源项目,就是不道德?

问题 1 和问题 2 涉及很多技术细节,总的来说:

1. 如果说我的项目抄袭了 Replit,那么网上的其他项目呢?网上搜索的结果有 15 个之多(而且是商业项目!)。你只需要搜索一下“在线运行 python”(run python online)或“在线编程环境”(online programming environment)就知道了。

2. 通过 GitHub 代码库和 Replit 在线发布的博客文章就可以找出我的项目和 Replit 之间的每一个相似之处,这显然不是什么秘密。

下面,我们再来说一说问题 3:在他们公司工作过一段时间后,我开发一个类似于 Replit 的开源项目,就是不道德?

在我看来,这个问题的答案是“否”,原因有以下几个:

  • 我的项目 Riju 完全是非商业性质的。与 Replit 不同,我没有从任何资金来源:广告、捐赠、集资、订阅等等。我对商业经营没有兴趣,而且也从来没想过有一天我的项目会非常流行,因为服务器的费用都是我个人支付的。

  • 我的项目 Riju 并没有挖走任何 Replit 的客户。根据我的分析数据,2月份 Riju 共收到了38次访问(其中一半可能是我自己)。然而,Replit 拥有 700 多万用户。显然,Riju 不可能与 Replit 竞争。

  • 我的项目 Riju 的建立初衷根本不是为了成为Replit 的竞争对手。由于我的架构仅限于在单个服务器上运行,因此只要任何人向我扔一个 fork 炸弹,我的整个系统都会崩溃。如果我想设计一个能与 Replit 竞争的产品,绝不会选择如此儿戏的架构。

  • Replit 的核心价值主张不是在线运行代码(许多网站都有此类免费的服务),而是提供附加功能。而我的项目 Riju 根本没有这些功能,比如:用户账号、保存工作成果、分享工作成果、发布 Web 应用、永久的工作空间、论坛、与 GitHub 集成等等。

  • 在开发 Riju 的时候,我对 Replit 没有任何恶意,也没有试图隐藏任何东西。从一开始,我就通过 GitHub 公开了该项目,而 Replit 发现这个项目,也是因为我主动与他们分享了我的项目,希望他们能够从我的产品中获得一些灵感。

  • 我从未想过将 Riju 打造成一款产品,这只不过是我个人的实验或艺术品。我甚至花了几十个小时添加了 Hexagony 和 SNOBOL 等语言。

我不是一个商人,我只是一个开源开发者,喜欢为了好玩而构建奇怪的东西。只要翻看一下我的网站项目列表(https://intuitiveexplanations.com/about/projects),就可以发现我没有构建过任何赚钱的产品。

我从未想过抄袭任何人的商业构思。伤害 Replit 并不是我构建 Riju 的目的,但他们却对我妄加指责(尤其是没有澄清问题,并拒绝讨论),在我看来,Replit 有很大的恶意。

为什么 Replit 会有如此行为?

Replit 所倡导的思想包括:

  • 鼓励开源开发。例如,部分开源技术,为 Replit 添加 GitHub 支持;Replit 的 CEO还声称:“我的整个职业生涯都应归功于开源”(https://web.archive.org/web/20210108083314/https://amasad.me/github)。

  • 回馈社区(https://web.archive.org/web/20210504051428/https://blog.replit.com/upm)。

  • 降低分享与创作的难度。例如,Replit 的 CEO 在学习编程时曾说:“我会下载相关的项目……并进行相应的修改,以及获取灵感。”(https://web.archive.org/web/20210522215545/https://blog.replit.com/github)

然而,此次事件暴露了 Replit 的虚伪:

  • 他们说他们鼓励开源开发,但是当我的开源项目冒犯了他们时,他们就采用极端偏激的手法要求我立即关闭项目。

  • 他们声称通过希望开源和博客文章回馈社区,但是当我在社区项目中使用这些想法时,他们威胁要起诉我。

  • 他们说他们希望降低分享与创作的难度,但是当我尝试借鉴 Replit 构建新项目时,却成为了他们的眼中钉。

在 Replit 给我的电子邮件中,他们的威胁基于这样一个事实:我曾在他们公司工作。但是,我认为这又是一个烟雾弹。为什么?我们来看看在我收到威胁的电子邮件后,Replit 的首席执行官 Amjad 发布的推文:

后来,由于引发了争论,Amjad 删除了这些推文:

在这些推文中,Amjad 指出 Athens Research 受到了另一家公司的启发,并认为因此他们应该被诟病,并禁止接受资助。此外,他说:“我对于抄袭者的看法非常坚定”,他鄙视所有他认定的“抄袭者”,而不仅仅是他推文中的某个公司。

Amjad 对 Athens Research 的评论,与我的项目收到的威胁有明显的相似之处。他甚至使用了同一个词:“copycat”(抄袭者)。对于 Athens Research,除了在推特上诋毁他们之外,Amjad 也别无他法。但就因为我曾在 Replit 工作过,所以 Amjad 就能对我提出起诉了。对于不了解此事情前后的人来说,这些指控看起来像是很合法。

最后,我还要重申一次:Replit 利用“顶级律师”和“大量资金”威胁一个没有公司、没有资金、没有商业野心、刚刚从大学毕业的人。如果是一个真正的商业企业冒犯到 Replit,我不敢想象他们会受到怎样对待。

Replit 给予这篇博文的回应

在我发布这篇博文之后,在 Hacker News 上引起了广泛的讨论。后来,Amjad 在 Hacker News 上发表了道歉声明,又引发了新一轮的讨论。

后来,他还联系我,想与我通话,我自然同意了:

在通话过程中,Amjad 向我道歉了,但他重申他认为我克隆了 Replit,而且认为我的行为不道德。最终,我们无法在这件事上达成一致,但他以书面形式承诺,同意我重新启动我的项目:

回想起来,我对 Amjad 有点失望:

  • 他没有因为威胁我的事情而向我道歉(甚至没有提及),也没有在电话结束后更新帖子;

  • 他没有因为公开转发指控我“窃取和发布 IP”而道歉(甚至没有提及),尽管他删除了转发;

  • 他没有因为对我进行人身攻击而道歉(甚至没有提及),尽管前面曾提到十分需要我;

  • 在电话中,在“道歉”之后,他觉得就好像他邀请我去他家,而我却背叛了他的信任;

  • 即使我在电话中多次询问,他依然拒绝了详细说明我究竟复制 Replit 的哪一部分,他坚持声称我复制 Replit 的行为很不道德,无论是私下还是公开场合;

  • 他断章取义,引用我说过的话,让人看起来好像是我同意他的指控。

总而言之,我以为我们本可以更好地处理这件事。

尽管如此,我仍然很高兴我们能够和解,而且我也非常期待接下来的生活,包括重启我的项目 Riju。

网友评论

评论 1:

怎么感觉你被一个 CEO 欺负了。他指责你行为不端,还威胁要请律师告你。他只不过是连哄带吓唬,迫使你关闭项目,结果真奏效了。

我想对所有读者说,不要害怕律师。律师不喜欢败诉,也不喜欢接会败诉的案子。然而,他们必须按照客户的要求行事,因此他们会调查问题,甚至发送恶意邮件。但是这些都没有关系。只有当律师真正接下案子,才有意义。在此之前的一切都是装腔作势和欺凌。

如果遇到相同的情况,我绝不会承认错误,不道歉,无视他们的邮件(尤其是人身攻击),然后任由事态发展,直到他们采取某种实际的行动。

同时,也需要有心理准备,如果真的打起官司来,无疑是劳民伤财,对双方都没有好处。最好看一看雇佣合同,有无这方面的明确声明。一方面遵纪守法,一方面也不要被别人不成熟的行为吓到。

评论 2:

Replit 好歹也是一家资金雄厚的公司,怎么就被一个实习生的业务项目给吓到了,真是有趣。如果他们的护城河这么低,几天之内就可以复制,那么恐怕他们需要担心的不止是这一个开源项目了。

原文:https://intuitiveexplanations.com/tech/replit/

本文为 CSDN 翻译,转载请注明来源出处。

“Replit 威胁我,要求我关闭我的开源项目!”相关推荐

  1. 大厂前实习生被威胁,“关闭开源项目,不然就告你”

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 梦晨 明敏 发自 凹非寺 量子位 报道 | 公众号 QbitAI 程 ...

  2. “我的开源项目被威胁了!”

    作者 | Radon Rosborough 译者 | 弯月 出品 | CSDN(ID:CSDNnews) 去年我从大学毕业,现在一家公司担任开发运维及基础设施工程师.工作之余,我还利用空闲时间维护了一 ...

  3. idea关闭所有打开的项目窗口

    为了完成一个项目,我们可能打开很多项目进行参考,但是关闭以后不能重新全部打开,需要手动一个一个的点开,但是idea有可以全部关闭所有打开的项目,并在下一次打开时再自动打开上次关闭的所有项目 左上角fi ...

  4. “美版贴吧” 强制对 API 收费遭开发者反击:关闭第三方 App 开源代码、数千个子论坛改私有模式、直接搞崩官网!...

    整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 网站大规模宕机: 第三方开发者欲关闭客户端之际,直接在 GitHub 上开源代码: 存档团队开始提前存档内容: 近六千个子论坛关闭了对外访 ...

  5. 一个开源项目维护者的笔记 — 为什么我关闭 PRs

    我在 GitHub 上和其他地方维护着许多的开源项目(截止本文写作时超过 160 个).在过去几年里,我已经合并 以及/或者 关闭了上千个 Pull Requests (PRs) 和补丁,现在想在这里 ...

  6. vue 关闭log_vue或react项目生产环境去掉console.log的操作

    在开发环境写了很多console.log/info/debug,在生产环境需要去掉这些console. 如果手动删除未免也太累了,再说以后想再开发还得重新写console. 事实上webpack提供了 ...

  7. IoT黑板报0112:谷歌关闭Titan无人机上网项目

    点击上方"IoT黑板报"关注我们 网络连接技术不断升级,智能硬件轮番发布,一个万物互联的物联网(Internet of Things)时代即将到来.在这里,我们每天将为大家带来Io ...

  8. Gitee崩了?大量仓库被关闭,官方答复“迫于无奈”

    PART 01 Gitee开发者:项目被封了 5月18日,大量开发者反映自己Gitee上的开源项目,发现被关闭公开访问了. 对此,Gitee的答复是:"此举也是迫于无奈,目前已经是Gitee ...

  9. 开源公司被云厂商“寄生”,咋整?

    上周 OSS Capital 召集一些开源公司,组织了一场关于如何面对"云厂商给开源带来的危害"的会议. OSS Capital 是一家风险投资公司,该公司只投开源,其董事会合伙人 ...

最新文章

  1. href=javascript 显示开发中_折叠屏iPhone原型机开发中:铰链连接 双屏独立显示
  2. osg prebuild 准备好开发工具
  3. zz让你成功的九个心理定律
  4. 为自己而活,这很难吗?
  5. ASP.Net请求处理机制初步探索之旅 - Part 3 管道
  6. Memcache缓存系统
  7. mysql中文乱码 go_Mysql binlog乱码问题研究-Go语言中文社区
  8. java numberformat 方法_java.text.NumberFormat用法
  9. Unity3D基础20:游戏打包发布
  10. python迭代器和生成器_python迭代器和生成器
  11. ADB 命令知多少?详细 ADB 命令大全来啦
  12. php实现过滤中英文标点符号[gbk编码环境]
  13. leetcode-739.每日温度-单调栈
  14. 畅谈癌症的过去现在未来
  15. 取消input默认提示框
  16. LCD1602 液晶
  17. 关于BAPI_CONTRACT_CREATEFROMDATA涉及使用价格
  18. 面试题之如何实现一个深拷贝
  19. GNSS基本概念(2):多路径效应
  20. LeetCode546-20.8.15-移除盒子

热门文章

  1. 剑指offer——29.顺时针打印矩阵(不熟)
  2. 【软件测试从入门到放弃】入门阶段:迈入软件测试大门
  3. Java Web(1)高并发业务
  4. MySQl数据库常用的DOS命令
  5. Linux 死机时抢救措施
  6. 后代选择+++margin-right:auto
  7. NET报表工具 EastReport
  8. open vswitch常用操作
  9. [VSCode] 设置 pylint 以解决 Module ‘torch‘ has no ‘xxx‘ member
  10. 简单理解梯度消失与梯度爆炸