如何开发与坚持维护一个企业级的开源项目

2020-12-15 09:13:29 +08:00
 moonrailgun

原文链接: http://moonrailgun.com/posts/28f21ef5/

TRPG Engine 是我一直坚持维护的一个开源项目。正如所有的开源项目都起源于开发者的兴趣,TRPG Engine也是我对于跑团这一小众领域的兴趣。

我在没有支援没有赞助,单凭个人爱好独立坚持开发 3 年以上不间断。前端代码累计提交 2700+, 后端代码累计提交 1200+,风雨无阻。

谨以此文,分享一下我维护这个开源项目的经历。并与千千万万独立坚持的开源人共勉。

起初

所有的个人项目都起源于想做。因为我想做,因此我建立了这样的项目。最初的目的很单纯,就是作为我学习 React 的一个实践。

最初选用的技术栈是React + Redux。之所以用React是为了可以共享一部分的代码到React Native, 这样的搭配会很大的减少重复逻辑的开发与后期的维护,以减少成本。

而事实是我在两者共存与中间代码上花费了很多的精力,写了很多中间脚本使网页版与 RN 版能够相互协作。

明确定位

一个项目,如果要走的长远,必须明确你的产品定位与目标用户。比如同样作为即时通讯应用, 钉钉瞄准的用户群是上班族,slack 的用户群是开发者,discord 的目标用户是游戏玩家,而 qq 的用户群是小学生。以此为原点,钉钉开发出了一系列日历,考勤,协同,已读未读,ding 等功能。slack 只做了大量机器人,discord 专注于语音会话与大用户群组聊天,而 qq 则整出了很多花样。

明确自己的定位,其目标一定是解决某种痛点与缺陷,做出任何的抉择都需要考虑是不是符合自己的定位。一个明确的定位可以帮助你不会花费无意义的时间在没有收益的功能上。

时刻保持热情与思考

时刻记住,项目是为自己做的。它不是一种谋生工具,而是一种兴趣爱好。它最初应当起源于你对现状的小小不满,终止于对此兴趣的终止。不妨增加一些筹码:比如它可以作为你的游戏场,比如他可以作为你谋求更高事业渠道的凭证,比如他可以是你与你伴侣之间的小小私人空间,比如你可以这样告诉自己,你的每一行代码都有可能帮助到素未蒙面的陌生人,而他会感谢你的无私付出。这些会帮助你时刻保持热情与动力,而不至于让这个项目半途而废。

维护自己的门面

如果一个项目想要宣传,一个门面则非常重要。这可能是一个 README, 一片文章,一个官网。但是如果没有任何说明,告诉别人这是什么,你在做什么。又能期待谁来阅读你的源码呢?

自己是第一用户

对于个人项目来说,自己才是自己产品最忠实的用户,只有这样才能不断发掘产品的不足,并不断改善。如果自己都不想用自己的产品,那么这个产品还有存在的必要么?

开发

回到技术细节:

因为技术在不断更新。而有的库又逐步步入生命周期的终结,很多情况不得不花费时间去迁移。

TRPG Engine经历过几次大的迁移 /迭代:

善用单元测试

为了一个项目的长远发展,测试用例与持续集成都是必要的。特别是单元测试,在很多时候能帮助到项目的提前预知问题。坚持每个 bug 都有一个对应的单元测试用例,防止再次出现类似的问题。

TRPG Engine 虽然开始写测试用例比较晚,但是一旦有机会就会补充一些测试用例,以防止出现一些边缘问题。

目前TRPG Engine前端有 223 个测试用例,后端有 284 个测试用例,还远远不够一个项目的健康发展。

学会数据迁移

为了方便数据库的升级,自己 fork 了一个sequelize-auto-migrations库用于生成数据库的迁移脚本, 因为原作者已经不维护了。

数据库迁移脚本可以保证在任意环境下都能生成正确的数据库格式。这对于关系型数据库来说非常重要。

兴趣是原始驱动力

与商业项目不同的是,个人项目可以把一切自己感兴趣、想做的东西都想办法以某种形式糅合到自己的项目中。

TRPG Engine就拥有这些有意思的系统:

运维

为了维护与运营这个项目,唯一的支出就是在服务器和 OSS 上了,零零散散也花费了几千元在上面了。一台 2 核 4G 的主服务器, 在主服务器上运行 Mysql, Redis 与 Mysql 。另外还有一台 1 核 1G 的小型服务器作为语音服务器与测试服务器。前端的代码都是本地编译好后提交到第三方对象存储上,这样用户的访问会更加迅速与快捷。

赞助?

曾经也考虑过要不要和别人一样放出二维码,看看能不能获得一些打赏,后来想了想还是算了。一方面没有多少的关注,我本人也比较低调不善于宣传。另一方面感觉,掺杂了利益后的开源项目,总感觉失去了纯粹性。爱好只能是爱好,如果成为一种牟利方式,那么可能就不像当初那么纯粹了。

感谢

最后感谢所有开源作者的无私奉献,正是你们存在才能让这个互联网世界变得更加精彩。

如果能看到最后的朋友,希望能将你的开源项目在评论区留下。我们一起互勉

4128 次点击
所在节点    程序员
33 条回复
keygen88
2020-12-15 09:51:51 +08:00
这个项目的目标用户是不是比较小众,做了几年怎么会没什么关注?
f6x
2020-12-15 09:57:38 +08:00
整合型的项目适合自己用, 适合产品带起技术.

加油.
raaaaaar
2020-12-15 09:59:22 +08:00
支持
moonrailgun
2020-12-15 10:17:07 +08:00
@keygen88 因为我的项目针对的跑团这个圈子本身就比较小。入门成本高,复杂度高,学习曲线陡峭。这些原因导致了真正的跑团用户并不是很多,另外我个人也不是很擅长宣传。多方面因素下导致这种情况是理所当然。
glacial
2020-12-15 10:20:40 +08:00
加油
tikazyq
2020-12-15 10:23:12 +08:00
支持一个
icyalala
2020-12-15 10:25:07 +08:00
开源项目能健康的维护辖区,宣传和交流是必不可少的一环。。
试试增加一些宣传能力吧。
opengps
2020-12-15 10:35:05 +08:00
"qq 的用户群是小学生",哈哈

还是建议带上利益,有利益注入,关停的风险才能更低,不然哪天楼主没兴趣了,项目也黄了,用户不会敢冒险依赖使用的,顶多用来 copy 代码。
darcylee1998
2020-12-15 10:57:09 +08:00
赞...
zone10
2020-12-15 10:59:37 +08:00
我搞半天没理解跑团什么意思, 搜了一下: 跑团是对 TRPG (桌上角色扮演游戏)的一种俗称,是一种比较流行的桌上游戏形式。游戏往往由三五人组成,其中一人担当游戏的主持人,另外几人担当玩家. 说一下我的看法吧, 你这文档还有 Github 的提交挺像模像样的, 做了有几年没理由这么点 star, 归根结底是你并没有真的在做开源项目, 并不是源码放出来就是开源项目. 想体验一下项目得在你那里注册一个账号, 到这里直接就不想继续下去了, 还有你没有提供文档教怎么部署项目, 而只停留在怎么使用你的项目, 各方面都体现你以一种集中化的思维在做开源项目. 建议, 1.闭源并增加运营能力把它做成一款实用的产品. 2. 完全开源, 但别用集中化思维做开源, 别教我做事
Braisdom
2020-12-15 11:03:10 +08:00
支持楼主,维护开源项目是需要能力,但最终是自身收益的付出,贡献出代码,大家互相学习,我亦如此,这是我的项目,我给楼主 star 并 follow 了,https://github.com/braisdom/ObjectiveSql,互相支持,一起努力
Braisdom
2020-12-15 11:04:57 +08:00
@Braisdom V 站的 Bug 不是一般的多呀,链接都能搞错: https://github.com/braisdom/ObjectiveSql
CismonX
2020-12-15 11:34:01 +08:00
> 不允许用于任何未经授权的商业行为

看上去楼主对 GPL 有些误解

楼主这个项目使用的 GPLv3 是允许商业使用的。甚至 FSF 还大力鼓励在商业场景使用 GPL ——当然是建立在遵守其条款的前提下

(自由软件四大准则第 0 条:以任何目的使用软件的自由)
lithium4010
2020-12-15 12:15:41 +08:00
楼主带我跑团
Kirsk
2020-12-15 13:08:04 +08:00
对企业级是不是有什么误解
renmu123
2020-12-15 13:40:41 +08:00
做产品其实最重要的一环就是推广,酒香也怕巷子深。如果你做得够好,用得人够多,我相信圈子里的人也是愿意付费了。
建议接下来做大量推广,等有不少真实用户反馈之后再进行开发。
以及减少入门的门槛。
先把这个产品运营好,再去考虑开源的事,毕竟不是所有人都是程序员,大多数人都是懒惰的。
jones2000
2020-12-15 15:22:57 +08:00
支持作者,加油.
我自己也有一个前端开源库, 大概 10W+的代码量, 大概开源 2 年了, 都是一个人维护,升级, 是比较累的, 但很有成就感(毕竟第 1 次用 js 开发), 也通过这个开源库交到了很多志同道合的朋友.
moonrailgun
2020-12-15 15:31:17 +08:00
@CismonX 感谢指正。对 GPL 协议有点误解,已改正。谢谢您的指出
moonrailgun
2020-12-15 15:38:56 +08:00
@zone10 不好意思,一方面自己比较内向没有宣传,开发 3 年+前面 2 年多都是一个人在闷头开发,另一方面因为还在不断迭代,总感觉部署文档写了不久就要失效了的错觉。其实已经提供了 Dockerfile 文件和 docker-compose 配置,以及用于 docker-swarm 的配置和简单的教程。可能放在不明显的地方所以看不见吧。谢谢您的指出,我会花时间去考虑写一个比较正式一点的部署文档的。

关于账号问题,其实我没有办法考虑一个比较私人(指没有被邀请不能看到聊天记录)的聊天项目什么情况下可以允许匿名用户访问。可能是我个人的局限性吧

感谢你花时间的回复, 但仍要请教一下什么是一个集中化的思维。因为我目前没有协作者我不知道应该如何开始。期待您的回复
moonrailgun
2020-12-15 15:40:31 +08:00
@Braisdom 之前看到过您的项目,虽然不是很懂 java,但是 star 了,加油开源人!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/735498

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX