前阵子我参加了一个用爱发电的独立游戏项目,是由一批网友聚集起来想要复刻某三国单机游戏的团队。“用爱发电”,即不获取酬劳,为了自己的梦想去努力奋斗。从24年2月4日开始得知这个组,2月7日进组,到4月4日离开,共经历了两个月。

我不想过多讨论这个游戏开发组中遇到的问题,因为在这个组的问题有其特殊性,并不具有普遍性。我想探讨的是个人开发者面对用爱发电项目时需要注意的内容,和一些心得体会。

进组时间线

  • 2.4 了解这个项目组
  • 2.6 通过面试,成功进组
  • 2.7-2.17 过年回家,没有学习项目知识,被轻微pua
  • 2.18-2.24 开始学习项目知识
  • 2.24 修复第一个bug
  • 2.25-3.30 修复大大小小6个bug
  • 3.30-4.4 发现自己做的很多是帮人擦屁股的活,觉得没有意义,进这个组浪费太多个人时间
  • 4.4 提出离开

团队的问题

这个团队的问题主要是文档不齐全,大量依赖视频教程,但是视频信息密度太低,学习起来难度很大。另外,之前项目的代码中,很多功能实际仅完成了50%大概一半,另一半作为bug处理,但是这样会让处理bug的人很难下手,因为无法明确知道功能边界在哪里,改起来心里没有底。加上文档不齐全,修改难度非常之大。最后,用爱发电项目没有直接利益刺激,做一段时间就觉得是帮人打工义务劳动,甚至没有github星星之类的荣誉,让人做久了有倦意。

用爱发电的心态

经过这个项目的体验,对于我个人,有以下几点体会:

  1. 一个人的空闲时间,比想象中更多一些。有时候,高效率的一两个小时就能做很多事。如果对自己要做的事情有正确的预期,那么行动起来之后并不会有什么心理负担,并且完成一点小小的里程碑也会让人感到非常愉悦。
  2. 对于一个大的项目,千万不要马上就想着把功能都做完。一定要花时间对模块进行整理。并且,在做功能模块的时候,一定要划分好什么是“功能未开发”,什么是“Bug”。如果是未开发功能,则要对功能进行分析,评估工时,逐步推进;如果是Bug,则要对Bug的成因进行分析,分析结果正确的原因和结果错误的原因,分析后再讨论解决方案。这是一个很漫长的过程,千万不能因为没有收入没有好处而松懈。
  3. 如果是不能获得直接报酬的项目,一定要控制好预期,一定要找到自己继续下去的理由。并且,没有直接报酬的话,想放弃,也不要有任何的愧疚感。

而在选择什么样的项目组,我也有以下几点体会:

  1. 如果一个项目不直接提供报酬(如这个组或者为github公开仓库贡献),那么就一定要索取其他东西(如github星星、行业内名声、资源、人脉),又或者是这件事本身已经足够有意思、有价值、有希望。一定不能什么都不要,那样是违背客观规律的。 什么都不能给予 = 无价值 = 无用之事。
  2. 只靠画饼,一定是坚持不下来的。能坚持下来的一定是在有价值的情况下,成为习惯,一点一点做出来的。
  3. 尽量要有主业。有自己谋生的手段,才能真正支撑自己的理想。或者,这份没有报酬的项目能提供资源和人脉,那么它必然很有价值。
  4. 随时调转船头,不要一条路走到底,不要害怕试错和犯错。没有报酬,也就意味着没有责任。虽然我们普世价值中建议大家负责,但是前提是要保障自己的自身利益。

项目总结

我不能说我在组里一点错都没有。事实上我从零开始学lua,学习整套代码框架的速度比我想象中要慢,弱类型语言,游戏客户端开发,确实和游戏服务器开发略有不同。我花了比较多的时间才完成基础项目的了解。这一点让我体会到,当我们在讨论某个开源项目的时候,能真正理解开源项目代码,并且帮忙处理问题的人其实是很稀少的。阅读别人的代码是有门槛的。门槛不止在于语言、框架和设计方式,还在于当没有人能实时解答问题。当没有人能正确提供解答时,如何仅靠源码和运行环境(有的项目甚至没有运行环境)进行代码的学习。这个门槛甚至包含我们是否有足够的业余时间来分配给这些项目进行研究。

所以,“为什么我要做XXX”,其实是一个非常有价值的问题。如果是为了“找工作时简历能好看点”,那么直接背面经,刷题,学习框架细节和各种常用设计,甚至是向更有经验的人讨教吃个饭,可能会更有用;如果是觉得“有意思”,那么这个项目的有趣程度,是否达到值得替代你原有的休闲方式(出游、玩游戏、喝酒KTV等),如果没有,那么也没什么必要去做;如果是为了学习某个技术热点,那么这个技术热点真的有意义、有必要学吗?也许在开始动手之前,先想明白这些事才是首要之事。

另外,学习别人项目的代码,是一件非常乏味的事情。由于编程开发的自由性,每个人都有自己的设计方案。虽然有代码规范,但是人会经常受限于自己的思维之中。这时候务必要有一种开放的心态,尽力去理解代码。当然,更重要的是在遇到困难时能否对项目价值做出合理的判断,能否利用好每一分每一秒。因为业余时间就应该属于自己。

最后,关于远程沟通,有很多噪音在里面。一个词,一句话,说出来就有可能变味。这也是为什么技术文档是如此重要。好的文档应该是没有歧义的,可以用来传递大量信息的介质,甚至比代码本身更重要。特别是无法面对面沟通的两个人,如何处理好沟通的节奏,如何“心往一处使”,是一个非常复杂的问题。关于这一点,在这两个月的实践中,我在这方面的想法是,双方都要有很高的技术水平、沟通能力、且拥有足够的耐心和责任心,才能让这件事推进下去。所以这应该也是远程工作都倾向于招聘高级程序员的原因吧。

关于开源项目

接下来的内容并不与这两个月用爱发电项目相关,但也确实是这两个多月的心得体会。

自23年5月开始,我重新开始游玩Counter Strike反恐精英这款游戏,它的缩写是CS,刚好和Computer Science的缩写一致。所以有时候我觉得自己也挺应景的,我在大学时主动选择CS,然后工作时候从事CS的职业,现在又几乎“沉迷”CS这款游戏。

最近的体会来自于CS主播莱昂凯讨论什么样的人能成为CS职业选手,这个视频 。在这个视频中,主播莱昂凯提到了很多CS天才少年,他们游玩CSGO大概700多小时的时候就已经打到了天梯第一等成就,然后才会有职业战队邀请他们去当职业选手。而大部分带着所谓“打职业”的梦想的路人玩家,其实根本没有足够的天赋去成为CSGO的职业选手。最后,莱昂凯说,大多数职业选手是因为自己真的很喜欢CSGO,打着打着发现自己可以打得更好,可以和更厉害的人一起对决,所以他们才去当职业选手。

这一点我在开源项目的维护者身上看到了类似的影子。远的不说,Vue的作者尤雨溪正是在谷歌工作的业余时间开发了Vue,然后由于其设计简单易用而引起大部分开发者注意。但前期核心团队也只有4个人 这个视频的15:06处。也就是说,大部分人其实根本无法真正踩进github贡献的大门,因为他们并没有足够的热爱和天赋(是的,我说的就是我)。基于不同的原因,将自己的代码上传开源,并且无偿为社区维护,就类似于现在在CSGO打职业的职业哥们,他们不像LOL项目有完整的LPL、LDL赛事体系能提供足够的温饱,他们兢兢业业的练枪、学道具、跑战术、报名各个大小比赛拿奖金。这真的需要热爱和天赋。只有足够的热爱才会让他们面对一件虚无缥缈的事不断努力,只有天赋才能让他们在自己的技术上登峰造极,让全世界能看到并且提供支持。

找到有价值的项目,然后坚持下来,最后等待一个结果。结果可能有好有坏,但愿意尝试和坚持的过程也总会有收获。

为了星星而做开源的开发者,就像那些为了当职业选手而玩CSGO的玩家,一定是坚持不下来的。这种没有直接利益的事情,能坚持下来的动力来源,只有热爱和习惯。除了那些外界能提供的金钱、名声、荣誉之外,你在业余中做的事,是否真的让自己感到快乐,是否是自己特别想做特别喜欢的事?业余时间的这一秒是否真的属于自己?如果是的话,那么太好了,你没有浪费这一秒,真正做到了热爱生命。

我想起Linux的作者Linus写的自传的书名叫《Just For Fun》,我想起EDG大满贯辅助Meiko接收采访的时候说“英雄联盟真的很好玩”(大概是类似的话)。Linus不是带着“我要做一个比UNIX更好的操作系统”的想法开始编写Linux,Meiko也不是因为有“我要成为世界第一辅助”的信念才开始打LOL。但是最后他们真的慢慢做到了,这背后充满了热爱和坚持。

扪心自问,我目前既不能快速上手一个不熟悉领域的项目,又暂时没有遇到自己特别想做的、热爱的开源项目,所以我还是找个班上,然后多看看书、看看开源项目开拓视野,等待属于我的“那个项目”吧。