全职开源四年,一切并没有那么简单。
前言: Antfu 是鱼皮非常佩服的一位前端大牛,他不仅是开源领域的狂热爱好者,也是很多知名开源项目的作者以及维护者,如 Slidev、Vitest 等等,同时也是 Nuxt、Vue、Vite 团队的官方成员。
这篇文章是他全职开源四年后的一些感悟,讲述了关于全职开源后的状态、个人心态的成长和变化、软件开发的底层思考以及对自己内在的探索,也许会对你有一定的启发。
这是我开始做开源的第四年。坦白说,我开始感觉到越来越多的事情超出了我的能力范围。我仍然不确定我是否经历过真正的 Burn Out(精力燃尽)[1],但我确实经历了生产力和动力的起伏。
这篇文章不是指南,也不是抱怨。更像是我的个人日记,我把它作为自己的记录。我只是觉得如果我能和你分享这些,可能会很有趣。
如果你经历过燃尽或感觉接近它,我建议你休息一下,找人谈谈,并在需要时寻求专业帮助。这里还有一篇很好的文章 维护开源维护者的平衡[2] 你可以参考。
现在,让我告诉你我最近一直在想的一些随机的事情。
准备不足
在某种程度上,即使到今天,开源对我来说仍然很新。
自从我开始学习编程并了解开源以来,我一直梦想成为一名全职开源开发者。当我在大学时,我渴望被开源社区认可,努力“弄清楚”我能够完成的一些有影响力的工作。突然之间,你会达到一个关键时刻,你的项目可能会意外起飞,或者你被邀请加入一个大项目——在那一刻,你开始感受到所有的兴奋以及随之而来的责任。几天后,当最初的兴奋开始消退,你开始意识到这也意味着很多你从未想过的责任和其他事情。尽管我整个大学时期都在努力进入开源,但当我真正踏入时,我意识到我准备得多么不足。
开源的一个有趣之处在于一个人可能永远没有准备好。你可能会遇到棘手的技术问题,或者不得不跟上新技术,但除了编码之外,你还需要处理一堆其他事情。你需要成为你的「客户支持」来回答问题;成为「设计师」、「技术作者」来准备漂亮的文档;成为「项目经理」保持项目进度;成为「团队领导」接纳新贡献者并保持团队的动力;「营销」你的东西;在会议上「演讲」;等等。这些都是成为开源开发者的“副作用”,许多事情都是捆绑在一起的,不仅仅是代码。
对我来说,这是一个巨大的挑战。我相当内向,我不擅长聊天或进行对话。我在学校时英语考试很糟糕,甚至不自信用英语说话。我甚至只是在同学面前就会感到紧张。我想我也不喜欢团队管理,尽管我从未领导过团队——有这么多事情要害怕。
它不给你准备好的时间(或者另一方面,如果没有迈出第一步,你可能永远不会准备好),因为项目增长,你的责任增长,你将被迫学习和适应。当它自然成长为一个团队时,你不得不学会沟通,领导。当有人邀请你做播客或演讲时,他们不会等你 3 年练习语言或演讲技巧——你要么错过机会,要么战胜你的恐惧去做。因为我太喜欢做开源了,我必须征服它们和自己。
可能看起来很压抑。但如果你能一次一个地接受这些挑战,逐渐地,你可能会发现它们相当有趣和有回报。最终,我非常感激所有这些机会,它们迫使我走出舒适区并迫使自己进步。在这四年的开源生涯中,尽管在许多事情上仍然不完美,我设法更自信地说英语。我在许多会议上发表演讲,其中一些甚至有数千名与会者。我仍然在每次演讲前都非常紧张,但至少我不再害怕做这件事。
仍然有许多挑战和惊喜即将到来。我既害怕又兴奋地想知道接下来会发生什么。
“期望”
这推动我们生存并不断改进,但也使我们难以保持满足。
当我开始我的前几个开源项目时,我非常兴奋。我会不断刷新页面,急切地等待新问题、新拉取请求和新评论的出现。每一个星标都会让我开心,我会尽我所能地帮助解决每一个问题。我设定了像 100 star、500 star 这样的里程碑,并在达到它们时庆祝。我仍然记得当我告诉我的朋友我的项目上有几百个 star,我感到多么自豪,我觉得我对世界产生了一些影响。
一旦你达到了这些目标,事情开始变得“平常”。你将开始期待更多,并设定更高的目标。在某个时候,我开始不再关心那些 star 或下载的数量了。这不一定是坏事,因为它们不是我应该关注的指标,但我有时怀念旧时光,那时我可以从那些简单的事情中得到快乐。
我逐渐意识到,我们生活中许多事情的体验与我们的期望有直接关系。当我们刚开始时,我们几乎没有期望,这可能相对容易达到。随着我们向前发展并站在更高的地方,我们开始期望更多,这可能不会线性增长。当你有 1000 个 star 时,再获得 100 个 star 并不像你一无所有时那么令人印象深刻。当你有 1000 个星标时,你会寻找另外 1000 个,只有 100 个再也不能满足你。这对我来说很奇怪,我不喜欢我自己的这种“人性”。
我发现降低期望并对自己所拥有的心存感激是保持快乐的一种好方法。当你开始意识到你不能再一个接一个地达到你的里程碑时,停止寻求更高的目标,休息一下,享受周围的景色是一个好方法——也许你已经达到了足够高的地方。自从我开始“不过分关心得失”以来,我发现即使可能不成功,我也更快乐地尝试不同的想法——因为我对它们没有高期望,对我来说没有“失败”的概念。如果其中一些后来被证明是好主意,那将是一个不错的“意外惊喜”。
如果你感兴趣,我在关于剃羊毛[3]的帖子中解释了我的想法发现过程。
自我期望
期望不仅适用于我们正在做的事情,也适用于我们自己。当我太关心一个项目时,我经常发现自己在作为一个友好的维护者角色中对自己期望过高。当我读到人们批评我的项目时,当某个错误给别人带来麻烦时,或者我没有及时回复问题时,我会感到不好。这些感觉在流行项目中变得更加强烈,因为你知道有很多人依赖它。这些自我期望给我带来了相当大的压力和压力。
正如我在另一篇帖子中提到的,维护者与用户的比例在开源项目中通常是不平衡的[4]。找到新的协作者或团队成员真的很难,但由于开源软件通常是免费的,基本上没有门槛来增加更多用户。
我认为对于维护者来说,很难做到心态转变,认为他们没有义务为别人解决问题,因为开源软件通常是 server-as-is(按原样提供)[5]。特别是对于那些关心他们的用户和社区的维护者来说,当我们收到新问题时很难忽视。但从另一个角度来看,一个人的时间 and 精力是有限的。当工作量超出一个人的能力时,最好设定优先级,首先专注于最重要的事情。
我希望有人在我开始维护高流量开源项目时告诉我这一点(你在网上有很棒的资源,如这个[6])——我花了很长时间才意识到我不必完美,也没关系按照自己的节奏做事。与其被动地接收通知,不如关掉推送通知,当我准备好时主动检查问题和拉取请求。
我做了一个关于如何管理 GitHub 通知[7]的演讲,如果你对方法论感兴趣,可以了解更多。
降低对自己的期望——没有人是完美的,没有人是机器。不要让他们成为你的负担。更重要的是保持健康和可持续的节奏,并保持自己快乐和有动力,以便在长期内产生更多积极的影响。
当你的梦想成为你的工作
生活在自己的梦想中是很棒的,坦白说,这是一种特权。但也要现实一点,拥有梦想和真正生活在其中是有很大区别的。梦想总是理想化的,它排除了所有乏味的细节。我的梦想是成为一名全职的开源开发者。是的,能够独立工作听起来很棒,做你喜欢的事情,拥有灵活或者根本没有工作时间表,从任何地方工作,为世界做出贡献,等等。但在现实中,事情并不那么简单。
这与“把你的爱好变成你的工作”很相似。它确实有很多好处,比如你会更加享受工作,效率更高,但同时也伴随着义务和责任。当爱好变成工作时,你就失去了选择何时何地做何事的自由。以前,你会在工作之后作为放松来做你的爱好,但现在当你想通过爱好来放松时,它们变成了工作。
我很幸运,软件开发是一个很大的领域,有很多不同的事情可以做。除了“主要”的开源项目维护之外,我有时会做一些小项目(生成艺术[8]、稳定扩散[9]、一些小实验[10]等)来刷新我的思维(作为主要项目的“放松”)。我也非常喜欢玩独立游戏,虽然我一直在考虑认真开发一些游戏——但那是另一个故事——至少现在,当我真正想要远离代码时,我还有一些逃避的方式。
我可能太喜欢编程了,以至于我对这一点没有太强烈的感觉。对我来说,“工作”和“乐趣”之间的界限非常模糊。有时,一个有趣的项目可能变成人们依赖的严肃事情。
速度、Scope 和质量
实际上,是这个话题促使我写下这篇博客文章。
让我们从这个速度、Scope(你理解为功能的丰富度)和质量的“铁三角”[11]开始。
通常,人们会说——在这三个因素中,你只能选择两个。如果你想更快地交付一个项目,你可能不得不牺牲质量或缩小功能范围。如果你想要一个高质量且功能丰富的产品,你可能不得不牺牲速度,慢慢交付好东西,等等。
就我个人的标准而言,开源软件的高质量是一个我永远不会妥协的标准。
同时,保持一定的速度和动力对我来说也非常重要。我的动力主要来自于完成某件事情后的成就感。当我能够迭代事物然后交付的反馈循环时,我可以处于极佳的心流[12]状态。
所以,可以说,我通常选择的是质量和速度。起初,我的项目范围相当明确且小。我设法保持高质量,快速交付,并从社区快速获得反馈。那时,我能够保持生产力和动力,继续从事这些项目。
范围
我“意外地”能够保持这种动力和速度相当长的时间。我开始参与I18n Ally[13]和Vue Use[14]等开源项目,从那时起,我加入了 Vue 和 Vite 团队。仅在2021 年,我就提出了Slidev[15](2021 年 4 月)、UnoCSS[16](2021 年 10 月)和Vitest[17](2021 年 12 月)——一切几乎都太顺利了,我几乎没有意识到拥有更大范围的能力有一定的限制。从那以后,我继续“无知地”保持这种“速度”。我很幸运遇到了了不起的团队和社区,并得到了他们的帮助:
-
了不起且超级支持的Nuxt[18]团队Atinux[19]danielroe[20]pi0[21] -
sheremet-va[22]AriPerkkio[23]和Vitest 团队[24]负责照顾Vitest[25] -
chu121su12[26]zyyv[27]和UnoCSS 团队[28]为UnoCSS[29]做了很多打磨 -
okxiaoliang4[30]wheatjs[31]Alfred-Skyblue[32]Tahul[33]和VueUse 团队[34]为VueUse[35] -
sxzz[36]管理Unplugin[37] -
KermanX[38]tonai[39]推动了许多功能在Slidev[40] -
arashsheyda[41]在Nuxt DevTools[42]上提供了很大的帮助 -
shuuji3[43]Shinigami92[44]为Elk[45]做出贡献 -
patak-dev[46]sapphi-red[47]bluwy[48]与出色的社区一起推动 Vite 前进 -
userquin[49]维护Vite PWA[50]并在几乎每个地方提供帮助 -
yyx990803[51],我从他那里学到了很多关于开源和决策的知识 -
……还有许多通过赞助提供财务支持的你们!
我很遗憾不能列出所有人,他们中的许多人实际上在项目之间是有重叠的。我想说的是,我不是一个人在工作,没有社区的帮助我一个人做不到所有这些事情。我对这一点非常感激。除了质量和速度之外,我似乎还在从事广泛的Scope项目——看起来像是打破了铁三角的规则——但实际上,幕后的了不起的社区是使这一切成为可能的“魔法”。
能力
维护多个高流量开源项目所需的工作量是巨大的。如果没有社区的帮助,我早就应该达到极限了。虽然社区给了我很大的帮助,但沟通、协调以及持续的上下文切换仍然需要消耗大量的精力。随着时间的推移,我积累了许多必须自己完成的事情,许多我想尝试的想法,以及许多我想改进的事情。
我想让这些项目保持活力并继续前进;我想写更多的博客文章来分享我的想法;我想做更多的演讲,旅行和见人;我想做更多的直播,因为我知道很多人在等待;我必须清理这件事,做那个发布;我也想学法语;和家人共度更多时间——我的意思是,这可能只是生活的一部分。每个人都有自己的担忧和责任,我并不比其他人更特别或更忙。
“但不知何故,有些东西让我难以呼吸。”
我可能不愿意承认我可能会燃尽。不是因为我怕它,而更像是我不想放弃并被动地处理它。我知道当我需要休息时就休息,但把自己称为“燃尽”并放弃是逃避责任的“捷径”。我想找出“根本原因”,并尝试改善情况,而不是仅仅“绕过”它。正如我们之前讨论的,期望的转变,以及对我“准备不足”和“自我期望”的重新评估是我接近燃尽时的不同原因的解决方案。通过调整自己并采用,我通常能够在大约一周内从低谷中恢复过来,并继续前进。
这次的情况有点不同,这不是因为我没有动力,而是因为我想做的太多,但我的能力正在耗尽。我开始思考,也许我期望自己以同样的速度继续交付一切,我担心做得不够多,不够快。快速反馈很棒,非常有生产力,但我可能因为太习惯于快速而变得有些不耐烦。结合起来,它们让我在处理需要中长期努力的事情时容易感到沮丧。
例如,写作。我不擅长写作,也不真的喜欢它。文档、博客文章、教程和演讲——所有这些都需要很多时间,也是我必须做的事情。当我写作或中途放弃时,我很容易分心和失去焦点。所以我在 Twitter 上询问[52],并从社区得到了很多很好的建议(查看评论,你可能也会找到对你有用的东西)。我开始尝试放松,慢慢来,尝试转变我的心态,不期望立即看到结果,享受过程。
所以,我应该重新评估我的能力和期望。我必须理解和接受,我不总能保持相同的速度,我不必对自己施加太大压力。放慢一点速度,更关注细节,也许我会在过程中找到不同的喜悦和满足感。
老实说,我甚至不确定我在这篇博客文章中到底想表达什么——可能只是简单地和你分享我的想法和感受。现在,我仍然感到相当有压力。我仍在适应并试图找到更好的应对方法。通过这一周的写作和朋友的交谈,我感觉好多了,我相信我会度过这个难关。这可能就像我们生活中的许多其他事情一样;我们并不总是有完美的解决方案,但我们必须继续前进,找到自己的出路。
维护良好的心理健康是每个开源维护者保持可持续性的重要任务。我不认为会有“一个答案”或“一个解决方案”来应对旅程中的高潮和低谷。这更像是一个持续的学习和适应过程,找到适合我们每个人的方法。
同时,实际上还有很多关于开源的事情我没有在这篇文章中谈到。Artem Zakharchenko[53]写了一篇很棒的文章 开源的阴暗面[54],从不同的角度和观点出发,我也深有共鸣。强烈推荐你也读一读。
感谢
最后,我要感谢我的女朋友,从一开始她就一直在支持我,帮助我度过那些艰难的时刻。没有她的巨大支持,我可能今天就不会在开源领域了。
还要感谢 patak-dev[55] 和 posva[56] 围绕这个话题的深入对话,他们真的帮了我很多,提供了巨大的支持。
还有你,以及伟大的开源社区!我非常感激我从你们那里得到的所有帮助和支持。
英文原文链接:https://antfu.me/posts/mental-health-oss
Burn Out(精力燃尽): https://www.darlingdowns.health.qld.gov.au/about-us/our-stories/feature-articles/signs-you-might-be-experiencing-a-burnout-and-how-to-regain-balance-in-your-life#:~:text=Burnout%20is%20a%20state%20of,an%20increasing%20sense%20of%20hopelessness
[2]维护开源维护者的平衡: https://opensource.guide/maintaining-balance-for-open-source-maintainers/
[3]关于剃羊毛: https://antfu.me/posts/about-yak-shaving
[4]另一篇帖子中提到的,维护者与用户的比例在开源项目中通常是不平衡的: https://antfu.me/posts/why-reproductions-are-required
[5]server-as-is(按原样提供): https://antfu.me/posts/why-reproductions-are-required#open-source-software-is-served-as-is
[6]这个: https://opensource.guide/best-practices/#its-okay-to-hit-pause
[7]如何管理 GitHub 通知: https://antfu.me/posts/manage-github-notifcations-2023
[8]生成艺术: https://100.antfu.me/
[9]稳定扩散: https://antfu.me/posts/ai-qrcode
[10]一些小实验: https://antfu.me/projects
[11]“铁三角”: https://en.wikipedia.org/wiki/Project_management_triangle
[12]心流: https://en.wikipedia.org/wiki/Flow_%28psychology%29
[13]I18n Ally: https://github.com/lokalise/i18n-ally
[14]Vue Use: https://github.com/vueuse/vueuse
[15]Slidev: https://github.com/slidevjs/slidev
[16]UnoCSS: https://github.com/unocss/unocss
[17]Vitest: https://github.com/vitest-dev/vitest
[18]Nuxt: https://github.com/nuxt/nuxt
[19]Atinux: https://github.com/Atinux
[20]danielroe: https://github.com/danielroe
[21]pi0: https://github.com/pi0
[22]sheremet-va: https://github.com/sheremet-va
[23]AriPerkkio: https://github.com/AriPerkkio
[24]Vitest 团队: https://github.com/vitest-dev/vitest/graphs/contributors
[25]Vitest: https://github.com/vitest-dev/vitest
[26]chu121su12: https://github.com/chu121su12
[27]zyyv: https://github.com/zyyv
[28]UnoCSS 团队: https://github.com/unocss/unocss/graphs/contributors
[29]UnoCSS: https://github.com/unocss/unocss
[30]okxiaoliang4: https://github.com/okxiaoliang4
[31]wheatjs: https://github.com/wheatjs
[32]Alfred-Skyblue: https://github.com/Alfred-Skyblue
[33]Tahul: https://github.com/Tahul
[34]VueUse 团队: https://vueuse.org/
[35]VueUse: https://github.com/vueuse/vueuse
[36]sxzz: https://github.com/sxzz
[37]Unplugin: https://github.com/unplugin
[38]KermanX: https://github.com/KermanX
[39]tonai: https://github.com/tonai
[40]Slidev: https://github.com/slidevjs/slidev
[41]arashsheyda: https://github.com/arashsheyda
[42]Nuxt DevTools: https://github.com/nuxt/devtools
[43]shuuji3: https://github.com/shuuji3
[44]Shinigami92: https://github.com/Shinigami92
[45]Elk: https://github.com/elk-zone/elk
[46]patak-dev: https://github.com/patak-dev
[47]sapphi-red: https://github.com/sapphi-red
[48]bluwy: https://github.com/bluwy
[49]userquin: https://github.com/userquin
[50]Vite PWA: https://github.com/vite-pwa
[51]yyx990803: https://github.com/yyx990803
[52]在 Twitter 上询问: https://twitter.com/antfu7/status/1764397930796953823
[53]Artem Zakharchenko: https://twitter.com/kettanaito
[54]开源的阴暗面: https://kettanaito.com/blog/the-dark-side-of-open-source
[55]patak-dev: https://github.com/patak-dev
[56]posva: https://github.com/posva
👇🏻 点击下方阅读原文,获取鱼皮的编程宝典
往期推荐