全職開源四年,一切并沒有那么簡單。
前言: Antfu 是魚皮非常佩服的一位前端大牛,他不僅是開源領域的狂熱愛好者,也是很多知名開源項目的作者以及維護者,如 Slidev、Vitest 等等,同時也是 Nuxt、Vue、Vite 團隊的官方成員。
這篇文章是他全職開源四年后的一些感悟,講述了關于全職開源后的狀態(tài)、個人心態(tài)的成長和變化、軟件開發(fā)的底層思考以及對自己內(nèi)在的探索,也許會對你有一定的啟發(fā)。
這是我開始做開源的第四年。坦白說,我開始感覺到越來越多的事情超出了我的能力范圍。我仍然不確定我是否經(jīng)歷過真正的 Burn Out(精力燃盡)[1],但我確實經(jīng)歷了生產(chǎn)力和動力的起伏。
這篇文章不是指南,也不是抱怨。更像是我的個人日記,我把它作為自己的記錄。我只是覺得如果我能和你分享這些,可能會很有趣。
如果你經(jīng)歷過燃盡或感覺接近它,我建議你休息一下,找人談談,并在需要時尋求專業(yè)幫助。這里還有一篇很好的文章 維護開源維護者的平衡[2] 你可以參考。
現(xiàn)在,讓我告訴你我最近一直在想的一些隨機的事情。
準備不足
在某種程度上,即使到今天,開源對我來說仍然很新。
自從我開始學習編程并了解開源以來,我一直夢想成為一名全職開源開發(fā)者。當我在大學時,我渴望被開源社區(qū)認可,努力“弄清楚”我能夠完成的一些有影響力的工作。突然之間,你會達到一個關鍵時刻,你的項目可能會意外起飛,或者你被邀請加入一個大項目——在那一刻,你開始感受到所有的興奮以及隨之而來的責任。幾天后,當最初的興奮開始消退,你開始意識到這也意味著很多你從未想過的責任和其他事情。盡管我整個大學時期都在努力進入開源,但當我真正踏入時,我意識到我準備得多么不足。
開源的一個有趣之處在于一個人可能永遠沒有準備好。你可能會遇到棘手的技術問題,或者不得不跟上新技術,但除了編碼之外,你還需要處理一堆其他事情。你需要成為你的「客戶支持」來回答問題;成為「設計師」、「技術作者」來準備漂亮的文檔;成為「項目經(jīng)理」保持項目進度;成為「團隊領導」接納新貢獻者并保持團隊的動力;「營銷」你的東西;在會議上「演講」;等等。這些都是成為開源開發(fā)者的“副作用”,許多事情都是捆綁在一起的,不僅僅是代碼。
對我來說,這是一個巨大的挑戰(zhàn)。我相當內(nèi)向,我不擅長聊天或進行對話。我在學校時英語考試很糟糕,甚至不自信用英語說話。我甚至只是在同學面前就會感到緊張。我想我也不喜歡團隊管理,盡管我從未領導過團隊——有這么多事情要害怕。
它不給你準備好的時間(或者另一方面,如果沒有邁出第一步,你可能永遠不會準備好),因為項目增長,你的責任增長,你將被迫學習和適應。當它自然成長為一個團隊時,你不得不學會溝通,領導。當有人邀請你做播客或演講時,他們不會等你 3 年練習語言或演講技巧——你要么錯過機會,要么戰(zhàn)勝你的恐懼去做。因為我太喜歡做開源了,我必須征服它們和自己。
可能看起來很壓抑。但如果你能一次一個地接受這些挑戰(zhàn),逐漸地,你可能會發(fā)現(xiàn)它們相當有趣和有回報。最終,我非常感激所有這些機會,它們迫使我走出舒適區(qū)并迫使自己進步。在這四年的開源生涯中,盡管在許多事情上仍然不完美,我設法更自信地說英語。我在許多會議上發(fā)表演講,其中一些甚至有數(shù)千名與會者。我仍然在每次演講前都非常緊張,但至少我不再害怕做這件事。
仍然有許多挑戰(zhàn)和驚喜即將到來。我既害怕又興奮地想知道接下來會發(fā)生什么。
“期望”
這推動我們生存并不斷改進,但也使我們難以保持滿足。
當我開始我的前幾個開源項目時,我非常興奮。我會不斷刷新頁面,急切地等待新問題、新拉取請求和新評論的出現(xiàn)。每一個星標都會讓我開心,我會盡我所能地幫助解決每一個問題。我設定了像 100 star、500 star 這樣的里程碑,并在達到它們時慶祝。我仍然記得當我告訴我的朋友我的項目上有幾百個 star,我感到多么自豪,我覺得我對世界產(chǎn)生了一些影響。
一旦你達到了這些目標,事情開始變得“平?!薄D銓㈤_始期待更多,并設定更高的目標。在某個時候,我開始不再關心那些 star 或下載的數(shù)量了。這不一定是壞事,因為它們不是我應該關注的指標,但我有時懷念舊時光,那時我可以從那些簡單的事情中得到快樂。
我逐漸意識到,我們生活中許多事情的體驗與我們的期望有直接關系。當我們剛開始時,我們幾乎沒有期望,這可能相對容易達到。隨著我們向前發(fā)展并站在更高的地方,我們開始期望更多,這可能不會線性增長。當你有 1000 個 star 時,再獲得 100 個 star 并不像你一無所有時那么令人印象深刻。當你有 1000 個星標時,你會尋找另外 1000 個,只有 100 個再也不能滿足你。這對我來說很奇怪,我不喜歡我自己的這種“人性”。
我發(fā)現(xiàn)降低期望并對自己所擁有的心存感激是保持快樂的一種好方法。當你開始意識到你不能再一個接一個地達到你的里程碑時,停止尋求更高的目標,休息一下,享受周圍的景色是一個好方法——也許你已經(jīng)達到了足夠高的地方。自從我開始“不過分關心得失”以來,我發(fā)現(xiàn)即使可能不成功,我也更快樂地嘗試不同的想法——因為我對它們沒有高期望,對我來說沒有“失敗”的概念。如果其中一些后來被證明是好主意,那將是一個不錯的“意外驚喜”。
如果你感興趣,我在關于剃羊毛[3]的帖子中解釋了我的想法發(fā)現(xiàn)過程。
自我期望
期望不僅適用于我們正在做的事情,也適用于我們自己。當我太關心一個項目時,我經(jīng)常發(fā)現(xiàn)自己在作為一個友好的維護者角色中對自己期望過高。當我讀到人們批評我的項目時,當某個錯誤給別人帶來麻煩時,或者我沒有及時回復問題時,我會感到不好。這些感覺在流行項目中變得更加強烈,因為你知道有很多人依賴它。這些自我期望給我?guī)砹讼喈敶蟮膲毫蛪毫Α?/p>
正如我在另一篇帖子中提到的,維護者與用戶的比例在開源項目中通常是不平衡的[4]。找到新的協(xié)作者或團隊成員真的很難,但由于開源軟件通常是免費的,基本上沒有門檻來增加更多用戶。
我認為對于維護者來說,很難做到心態(tài)轉(zhuǎn)變,認為他們沒有義務為別人解決問題,因為開源軟件通常是 server-as-is(按原樣提供)[5]。特別是對于那些關心他們的用戶和社區(qū)的維護者來說,當我們收到新問題時很難忽視。但從另一個角度來看,一個人的時間 and 精力是有限的。當工作量超出一個人的能力時,最好設定優(yōu)先級,首先專注于最重要的事情。
我希望有人在我開始維護高流量開源項目時告訴我這一點(你在網(wǎng)上有很棒的資源,如這個[6])——我花了很長時間才意識到我不必完美,也沒關系按照自己的節(jié)奏做事。與其被動地接收通知,不如關掉推送通知,當我準備好時主動檢查問題和拉取請求。
我做了一個關于如何管理 GitHub 通知[7]的演講,如果你對方法論感興趣,可以了解更多。
降低對自己的期望——沒有人是完美的,沒有人是機器。不要讓他們成為你的負擔。更重要的是保持健康和可持續(xù)的節(jié)奏,并保持自己快樂和有動力,以便在長期內(nèi)產(chǎn)生更多積極的影響。
當你的夢想成為你的工作
生活在自己的夢想中是很棒的,坦白說,這是一種特權。但也要現(xiàn)實一點,擁有夢想和真正生活在其中是有很大區(qū)別的。夢想總是理想化的,它排除了所有乏味的細節(jié)。我的夢想是成為一名全職的開源開發(fā)者。是的,能夠獨立工作聽起來很棒,做你喜歡的事情,擁有靈活或者根本沒有工作時間表,從任何地方工作,為世界做出貢獻,等等。但在現(xiàn)實中,事情并不那么簡單。
這與“把你的愛好變成你的工作”很相似。它確實有很多好處,比如你會更加享受工作,效率更高,但同時也伴隨著義務和責任。當愛好變成工作時,你就失去了選擇何時何地做何事的自由。以前,你會在工作之后作為放松來做你的愛好,但現(xiàn)在當你想通過愛好來放松時,它們變成了工作。
我很幸運,軟件開發(fā)是一個很大的領域,有很多不同的事情可以做。除了“主要”的開源項目維護之外,我有時會做一些小項目(生成藝術[8]、穩(wěn)定擴散[9]、一些小實驗[10]等)來刷新我的思維(作為主要項目的“放松”)。我也非常喜歡玩獨立游戲,雖然我一直在考慮認真開發(fā)一些游戲——但那是另一個故事——至少現(xiàn)在,當我真正想要遠離代碼時,我還有一些逃避的方式。
我可能太喜歡編程了,以至于我對這一點沒有太強烈的感覺。對我來說,“工作”和“樂趣”之間的界限非常模糊。有時,一個有趣的項目可能變成人們依賴的嚴肅事情。
速度、Scope 和質(zhì)量
實際上,是這個話題促使我寫下這篇博客文章。
讓我們從這個速度、Scope(你理解為功能的豐富度)和質(zhì)量的“鐵三角”[11]開始。
通常,人們會說——在這三個因素中,你只能選擇兩個。如果你想更快地交付一個項目,你可能不得不犧牲質(zhì)量或縮小功能范圍。如果你想要一個高質(zhì)量且功能豐富的產(chǎn)品,你可能不得不犧牲速度,慢慢交付好東西,等等。
就我個人的標準而言,開源軟件的高質(zhì)量是一個我永遠不會妥協(xié)的標準。
同時,保持一定的速度和動力對我來說也非常重要。我的動力主要來自于完成某件事情后的成就感。當我能夠迭代事物然后交付的反饋循環(huán)時,我可以處于極佳的心流[12]狀態(tài)。
所以,可以說,我通常選擇的是質(zhì)量和速度。起初,我的項目范圍相當明確且小。我設法保持高質(zhì)量,快速交付,并從社區(qū)快速獲得反饋。那時,我能夠保持生產(chǎn)力和動力,繼續(xù)從事這些項目。
范圍
我“意外地”能夠保持這種動力和速度相當長的時間。我開始參與I18n Ally[13]和Vue Use[14]等開源項目,從那時起,我加入了 Vue 和 Vite 團隊。僅在2021 年,我就提出了Slidev[15](2021 年 4 月)、UnoCSS[16](2021 年 10 月)和Vitest[17](2021 年 12 月)——一切幾乎都太順利了,我?guī)缀鯖]有意識到擁有更大范圍的能力有一定的限制。從那以后,我繼續(xù)“無知地”保持這種“速度”。我很幸運遇到了了不起的團隊和社區(qū),并得到了他們的幫助:
-
了不起且超級支持的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]與出色的社區(qū)一起推動 Vite 前進 -
userquin[49]維護Vite PWA[50]并在幾乎每個地方提供幫助 -
yyx990803[51],我從他那里學到了很多關于開源和決策的知識 -
……還有許多通過贊助提供財務支持的你們!
我很遺憾不能列出所有人,他們中的許多人實際上在項目之間是有重疊的。我想說的是,我不是一個人在工作,沒有社區(qū)的幫助我一個人做不到所有這些事情。我對這一點非常感激。除了質(zhì)量和速度之外,我似乎還在從事廣泛的Scope項目——看起來像是打破了鐵三角的規(guī)則——但實際上,幕后的了不起的社區(qū)是使這一切成為可能的“魔法”。
能力
維護多個高流量開源項目所需的工作量是巨大的。如果沒有社區(qū)的幫助,我早就應該達到極限了。雖然社區(qū)給了我很大的幫助,但溝通、協(xié)調(diào)以及持續(xù)的上下文切換仍然需要消耗大量的精力。隨著時間的推移,我積累了許多必須自己完成的事情,許多我想嘗試的想法,以及許多我想改進的事情。
我想讓這些項目保持活力并繼續(xù)前進;我想寫更多的博客文章來分享我的想法;我想做更多的演講,旅行和見人;我想做更多的直播,因為我知道很多人在等待;我必須清理這件事,做那個發(fā)布;我也想學法語;和家人共度更多時間——我的意思是,這可能只是生活的一部分。每個人都有自己的擔憂和責任,我并不比其他人更特別或更忙。
“但不知何故,有些東西讓我難以呼吸?!?/p>
我可能不愿意承認我可能會燃盡。不是因為我怕它,而更像是我不想放棄并被動地處理它。我知道當我需要休息時就休息,但把自己稱為“燃盡”并放棄是逃避責任的“捷徑”。我想找出“根本原因”,并嘗試改善情況,而不是僅僅“繞過”它。正如我們之前討論的,期望的轉(zhuǎn)變,以及對我“準備不足”和“自我期望”的重新評估是我接近燃盡時的不同原因的解決方案。通過調(diào)整自己并采用,我通常能夠在大約一周內(nèi)從低谷中恢復過來,并繼續(xù)前進。
這次的情況有點不同,這不是因為我沒有動力,而是因為我想做的太多,但我的能力正在耗盡。我開始思考,也許我期望自己以同樣的速度繼續(xù)交付一切,我擔心做得不夠多,不夠快??焖俜答伜馨簦浅S猩a(chǎn)力,但我可能因為太習慣于快速而變得有些不耐煩。結合起來,它們讓我在處理需要中長期努力的事情時容易感到沮喪。
例如,寫作。我不擅長寫作,也不真的喜歡它。文檔、博客文章、教程和演講——所有這些都需要很多時間,也是我必須做的事情。當我寫作或中途放棄時,我很容易分心和失去焦點。所以我在 Twitter 上詢問[52],并從社區(qū)得到了很多很好的建議(查看評論,你可能也會找到對你有用的東西)。我開始嘗試放松,慢慢來,嘗試轉(zhuǎn)變我的心態(tài),不期望立即看到結果,享受過程。
所以,我應該重新評估我的能力和期望。我必須理解和接受,我不總能保持相同的速度,我不必對自己施加太大壓力。放慢一點速度,更關注細節(jié),也許我會在過程中找到不同的喜悅和滿足感。
老實說,我甚至不確定我在這篇博客文章中到底想表達什么——可能只是簡單地和你分享我的想法和感受?,F(xiàn)在,我仍然感到相當有壓力。我仍在適應并試圖找到更好的應對方法。通過這一周的寫作和朋友的交談,我感覺好多了,我相信我會度過這個難關。這可能就像我們生活中的許多其他事情一樣;我們并不總是有完美的解決方案,但我們必須繼續(xù)前進,找到自己的出路。
維護良好的心理健康是每個開源維護者保持可持續(xù)性的重要任務。我不認為會有“一個答案”或“一個解決方案”來應對旅程中的高潮和低谷。這更像是一個持續(xù)的學習和適應過程,找到適合我們每個人的方法。
同時,實際上還有很多關于開源的事情我沒有在這篇文章中談到。Artem Zakharchenko[53]寫了一篇很棒的文章 開源的陰暗面[54],從不同的角度和觀點出發(fā),我也深有共鳴。強烈推薦你也讀一讀。
感謝
最后,我要感謝我的女朋友,從一開始她就一直在支持我,幫助我度過那些艱難的時刻。沒有她的巨大支持,我可能今天就不會在開源領域了。
還要感謝 patak-dev[55] 和 posva[56] 圍繞這個話題的深入對話,他們真的幫了我很多,提供了巨大的支持。
還有你,以及偉大的開源社區(qū)!我非常感激我從你們那里得到的所有幫助和支持。
英文原文鏈接: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]穩(wěn)定擴散: 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
???? 點擊下方閱讀原文,獲取魚皮的編程寶典
往期推薦
