當前位置: 妍妍網 > 碼農

全職開源四年,一切並沒有那麽簡單。

2024-03-20碼農

前言: 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

    參考資料

    [1]

    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 is a state of,an increasing sense of hopelessness

    [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_(psychology)

    [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

    👇🏻 點選下方閱讀原文,獲取魚皮的編程寶典

    往期推薦