我作為自給自足創業者的第七年
原文由 Michael Lynch 于 發布,訂閱此部落格
七年前,我辭去了在 Google 擔任開發者的工作,創立了自己的自給自足軟體公司。每年我都會發文更新近況,分享創業進展以及作為獨立創業者的生活。
我賣掉了公司
過去一年,我職涯上最重要的進展就是賣掉了我在 2020 年創立的公司 TinyPilot。
我和太太想共組家庭,而我不認為自己能在獨自管理一間七人公司的同時,還能成為稱職的新生兒父親。我找到了一位理念與我相符的買家,並在 2024 年 4 月完成了交易。

我賣掉 TinyPilot,好展開家庭生活
關於這次出售以及我學到的教訓,我已經寫過文章、也上過 Podcast 分享,並寫了相關心得,簡單來說,我很感激一切都有好的結果。
我成為了新手爸爸
八月,我和太太迎來了我們的第一個孩子,是個兒子。
寶寶出生後不久,其中一位護理師幫我們一家三口拍了一張很美的合照,我放在下面。因為想保護兒子的隱私,我用手工調校的快速傅立葉轉換把生物特徵資訊都去除了:

我、太太與新生兒子的合照,經過隱私保護濾鏡後製處理
我很感謝獨立創業者的彈性,以及 TinyPilot 出售的時機,過去這五個月是我人生中最快樂的時光。
我投入教育產品
我在四月賣掉了 TinyPilot,但留到五月中旬協助新東家完成交接。
兒子的預產期在八月,我知道他出生後會請假休息一段時間。這中間大約有三個月的空檔可以嘗試新事物,但必須是那種可以暫停幾個月、等我適應有寶寶的生活後再回來繼續的東西。
我認為那三個月最適合做的產品是可下載的課程或書籍。教育產品的好處是容易暫停,就算已經有付費使用者,也不用維護伺服器或回覆客服問題。
我唯一製作教育產品的經驗是在 2021 年,當時我錄了一門關於如何為技術族群寫部落格的影片課程。第一年賺了 7.6k 美元,之後又陸續進帳 2.2k 美元。以課程創作者的標準來看不算爆紅,但當時只花了我約 100 小時製作,我對內容也感到自豪。這是我成為獨立創業者以來投資報酬率最高的專案。

我在 2021 年製作的關於為技術族群寫部落格的課程,四年來總共帶來了 1 萬美元的收入。
夏天期間,我重新整理了 2021 年部落格課程的教材。一開始我透過每週一次的線上直播,以小班制授課。原本的計畫是根據學生的回饋持續優化課程,最後再錄製成可下載販售的正式版本。
直播課程的反應還可以,但學生的回饋是希望多學一些寫作技巧、少一點關於如何吸引讀者的內容。我本來還是想把課程完成,但兒子提早了幾週出生,所以錄製工作就沒能完成。
兒子出生後,在家錄影變得更困難,所以我改為寫一本關於開發者有效寫作技巧的書。我採取逐章發布的方式,並根據讀者的回饋不斷修改內容。
我手上還有一些已錄好但不知如何處理的部落格課程影片,所以在這裡分享其中一支,談的是如果知名的自給自足創業作家 Patrick McKenzie 向你發起寫部落格的挑戰,為什麼你應該答應:
我學了很酷的新技術
經營 TinyPilot 時,我沒有時間做技術工作,這讓我有點沮喪,因為我熱愛寫軟體。
我一直很喜歡寫程式,但從未像過去這一年這麼興奮。我對那些免費開放的優秀開源軟體感到驚艷。
Nix
過去一年對我工作影響最大的技術是 Nix 和 NixOS。
Nix 是一個像 apt-get 或 yum 這樣的套件管理器,同時也是一個像 CMake 或 Bazel 的建構工具。透過將這兩種功能結合在一起,Nix 讓你在軟體專案中管理相依套件並打包發布變得輕鬆。
我是一點一滴開始採用 Nix 的,但因為太喜歡它,現在每個程式專案都用 Nix,所有電腦也都跑 NixOS。
- 誰適合嘗試?
- 欣賞 Docker、Ansible、Terraform 這類基礎設施即程式碼工具的開發者。
- 我的推薦理由是什麼?
- 在軟體專案中,Nix 讓你可以用程式碼定義所有相依套件,任何人都能用一行指令完整重現你的環境。
- NixOS 是圍繞 Nix 理念設計的 Linux 發行版。NixOS 讓你用純文字檔定義整台電腦的設定,輕鬆從零重建或回滾到先前的設定。
- Nix 具備 Docker 的許多優點,但 Nix 套件的組合性比 Docker 映像檔更好。
- 缺點是什麼?
- Nix 學習曲線陡峭,我還沒找到適合開發者的優質入門指南,最接近的是針對 DevOps 工程師寫的NixOS in Production。
- 圍繞一個名為「flakes」的功能存在分歧。如果你使用 flakes,就很難理解沒用 flakes 的教學與文件,反之亦然。
- Nix 社群因為領導問題而處於不太健康的狀態。
- 在持續整合(CI)方面,Nix 在小規模情境下表現不佳。除非改用 Nix 專屬的 CI 服務,否則我找不到任何讓 Nix 相關的 CI 任務在 55 秒內完成的方法。
- 有什麼好的入門方式?
- 小步嘗試 Nix。即使只學習一小部分功能,也能獲得很大的價值。
- 使用Determinate Systems 安裝程式安裝 Nix,然後試著用
nix shell執行一個程式(例如nix shell -p cowsay再執行cowsay howdy, human)。到套件搜尋庫看看所有可以用一行指令安裝的套件。 - 如果你喜歡暫時性的 shell,可以為自己的某個專案建立開發環境,這樣就能用單一檔案管理所有相依套件與開發工具。
htmx
好幾年來朋友們一直在稱讚 htmx,但我始終無法理解它的概念。
「你可以讓 HTML 的 <button> 元素發送 POST 請求?那又怎樣?」
後來在一趟長途飛行中,我讀了那本免費電子書Hypermedia Systems,談的是 htmx 背後的哲學。這本書讓我意識到,htmx 的價值不在於讓 <button> 發送 POST 請求,而是能在不增加自訂 JavaScript 或深層抽象的負擔下,為 HTML 帶來簡單的互動性。
我一直知道網頁開發需要寫很多繁瑣的 JavaScript,但早就把它當成常態。HTML 和 CSS 負責呈現,JavaScript 負責互動,兩者之間一定需要膠水程式碼,而膠水程式碼本來就很無聊。
htmx 的核心主張是,透過讓 HTML/CSS 承擔更多互動,就能消除膠水程式碼與樣板化的 JavaScript,而且不需要引入 npm、Webpack 和龐大的前端框架等複雜度與相依套件。
- 誰適合嘗試?
- 偏好原生 JavaScript 或 jQuery,而非 React 和 Vue 等重量級框架的開發者。
- 我的推薦理由是什麼?
- htmx 會讓你意識到自己過去寫了多少不必要的 JavaScript。
- htmx 是函式庫而非框架,所以不像 React 或 Vue 那樣非得全面採用,你可以先在網頁應用程式的單一表單上試試看。
- 沒有建構步驟,不需要透過 Webpack / Node.js 來產生純文字的 HTML、CSS 和 JavaScript,你寫的程式碼就是在瀏覽器中實際執行的程式碼。
- 缺點是什麼?
- 我發現要轉換成 htmx 的思考方式有點挑戰,但結果往往是更簡潔的程式碼。
- 我覺得 htmx 的錯誤處理不太好用,不過我有一個還不錯的變通方法。
- htmx 會弱化內容安全政策(CSP)。
- 有什麼好的入門方式?
- 閱讀我更詳細的 htmx 推薦文。
- 閱讀我將 ScreenJournal 移植到 htmx 的經驗。
- 閱讀Hypermedia Systems 的前幾章(免費線上閱讀),看看是否能引起你的共鳴。
- 在你的網頁應用程式中,挑一個表單試試 htmx。
Zig
Zig 的理念是,有些程式仍需要用 C 這類低階語言來寫,但我們卻一直用 50 年前的程式語言來寫,讓事情變得更困難。
Zig 提供了與 C 相同等級的能力與效能,同時利用了 C 誕生時還不存在的硬體與編譯器進展。
我立刻愛上了 Zig 的理念,但一直找不到適合的專案。過去 15 年來,我的個人專案都沒再用過 C 或 C++,我通常做的是小型的網頁應用程式,而 Zig 並不是這類工作的最佳工具。
我仍然覺得 Zig 非常有趣。如果我被困在一座荒島上一年,有一台筆電但沒有網路,我最理想的消遣就是把我童年時某款電腦遊戲的開源重製版(例如 Age of Empires II、Command and Conquer)從未經雕琢的 C++ 程式碼移植成優雅的 Zig。
- 誰適合嘗試?
- 對現代化的 C 語言重新想像感到好奇的 C/C++ 程式設計師。
- 我的推薦理由是什麼?
- Zig 是我好久以來寫程式最開心的一次,而我本來就覺得寫程式很有趣。用極低的抽象層次寫程式、完全掌控應用程式觸及記憶體的次數,那種感覺特別過癮。
- Zig 強調明確的控制流程與記憶體配置,所以我覺得 Zig 的程式碼很容易理解。
- Zig 社群非常友善、積極。每當我提問,都能得到耐心且有幫助的回覆,當我分享Zig 教學時,社群也都熱情歡迎。
- 缺點是什麼?
- 有什麼好的入門方式?
- 挑一個你平常用 C 或 C++ 寫的簡單程式,改用 Zig 重寫一次。
- 試試 Ziglings,這是 Zig 的入門練習題。
- Ziglings 練習題依賴 Zig 編譯器的預發布版本,如果你有 Nix,最簡單的取得最新預發布 Zig 編譯器的方式就是執行:
nix shell 'github:mitchellh/zig-overlay#master'
- Ziglings 練習題依賴 Zig 編譯器的預發布版本,如果你有 Nix,最簡單的取得最新預發布 Zig 編譯器的方式就是執行:
使用 Nix 進行模糊測試
你大概以為我講完 Nix 了吧,還沒呢!
我一直想嘗試模糊測試來找出資安漏洞,因為自從十年前在VLC 中發現一個嚴重漏洞後,就沒再用過模糊測試工具了。
我很喜歡 Antonio Morales 在 2021 年的模糊測試教學,但裡面的所有練習都要先做一堆無聊的準備工作,才能建立可用的模糊測試環境。
我試著用 Nix 實作模糊測試流程,結果好太多了。我真希望有時間用 Nix 製作更多模糊測試教學,因為我覺得全世界都低估了 Nix 作為模糊測試工具的潛力。
- 誰適合嘗試?
- 任何會做模糊測試的人,尤其是針對 C/C++ 程式碼。
- 我的推薦理由是什麼?
- Nix 讓模糊測試流程變得可重現。
- 一旦你在 Nix 環境下讓模糊測試器跑起來,任何人只要輸入
nix run就能執行你的模糊測試設定,不用煩惱相依套件,因為 Nix 會自動重現你當時使用的完整環境。
- 一旦你在 Nix 環境下讓模糊測試器跑起來,任何人只要輸入
- Nix 簡化了相依套件的安裝。
- Nix 擁有數一數二大的套件庫,如果你的模糊測試目標有相依套件,很可能在 Nix 套件庫中就已經有了,不需要為每個相依套件想出特殊的建構流程。
- Nix 簡化了自訂修補程式。
- 如果你需要套用自訂修補程式來對目標進行模糊測試,Nix 讓你能輕鬆套用,並把修補檔與模糊測試流程的其他部分放在同一個原始碼目錄中。
- Nix 會快取建構結果。
- 如果你嘗試不同的編譯選項,不需要每次都從頭編譯,Nix 會記住你之前是否用相同選項編譯過,並重複使用該建構結果,你永遠不需要執行
make clean或手動刪除執行檔。
- 如果你嘗試不同的編譯選項,不需要每次都從頭編譯,Nix 會記住你之前是否用相同選項編譯過,並重複使用該建構結果,你永遠不需要執行
- Nix 讓模糊測試流程變得可重現。
- 缺點是什麼?
- 有什麼好的入門方式?
- 試試我的入門教學,了解我是如何使用 Nix 和 honggfuzz 為一套開源 PDF 閱讀器建立模糊測試流程。
這一年整體如何?
每年我都會問自己,是否還喜歡當獨立創業者。
過去幾年,這個問題很難回答。在經營 TinyPilot 時,我以公司為榮,也很享受與團隊共事,但我覺得硬體公司的節奏與複雜度對我來說有點吃不消。
今年,我又重新享受起獨立創業者的生活。我很喜歡能花這麼多時間陪伴太太和兒子,也很感激重返工作的時機完全由自己決定,能完全掌控如何、何時將工作重新融入有寶寶後的生活。
出售 TinyPilot 的過程充滿壓力、令人不愉快,但回首過往,我記得的是和太太、朋友們在西麻薩諸塞的臨時甜點之旅中一同慶祝的時光。
五月時,一位 Google 招募人員不需面試就願意讓我回鍋,但我一點也不心動。
我依然享受獨立創業者的生活,也希望能盡可能長久地做下去。
學到的教訓
不工作也沒關係
在兒子出生前,我一直在煩惱該休息多久。顯然,休一個月沒問題,但如果一個月可以,為什麼不是兩個月?為什麼不是四個月?為什麼不是一年?
兒子出生後的幾個月裡,我突然完全沒有空閒時間,內心也開始掙扎一個更可怕的問題:如果有了寶寶之後,就算我想回去工作也回不去了怎麼辦?如果我再也無法找回足夠不受打擾的時間來寫作和寫程式怎麼辦?
我深吸一口氣,才意識到所謂「沒有空閒時間」,其實是因為每週有好幾天,我會和太太、兒子一起悠閒地散步到市中心享受戶外早午餐,或是招待遠道而來探望寶寶的訪客。我提醒自己,這些都是我喜歡做的好事,而且只要我想恢復工作,時間的主導權依然在我手上。
最終,我回歸工作的過程很自然,並沒有與家庭時間產生衝突。我和太太找到了彼此都覺得合適的托育平衡,並隨著兒子長大、其他家人也加入幫忙照顧,持續進行調整。
只有當別人能照著文件操作,流程才算真正被記錄下來
在 TinyPilot 出售前的幾個月裡,我致力於盡可能將工作交接給團隊其他成員。我不希望新東家接手後,發現某個關鍵任務只有我會做而無法完成。
我原本以為交接會很輕鬆,因為我們對所有事情都有操作手冊,連我自己負責的任務也不例外。然而當我開始把手上的工作交給同事時,才發現那些所謂「已記錄」的流程,很多其實只存在於我的腦中。像是「撰寫版本發布公告」或「更新公開更新日誌」這類看似簡短的步驟,實際上比字面上複雜得多。
現在我認為,只有當同事能完全依照文件完成流程,這個流程才算真正被記錄下來。
賣給現金買家能大幅降低風險與文書作業
從出售 TinyPilot 學到最大的教訓之一,就是成交時間的長短影響有多大。我沒想到交易拖得越久,賣方要承擔的額外風險與文書作業就越多。

買方的資金來源對成交時間有重大影響。如果買方需要向銀行貸款,銀行就會成為交易中的關鍵決策者。銀行動作緩慢、要求大量文書資料,而且很難協商,因為交易告吹對他們來說無關痛癢。
如果我還要再賣另一間公司,我會提供誘因來吸引手上有現金的買家。
檢視去年的目標
去年,我設定了三個年度大目標,以下是達成狀況:
每週只花 20 小時管理 TinyPilot
- 結果:將管理時間縮減至每週 20 小時
- 成績:A
我在四月賣掉了公司,所以這一年只有很短的時間在管理 TinyPilot,但我終於達成了每週只用 20 小時管理的目標,這是過去三年來一直重複設定的目標。
最終能實現的原因,是我別無選擇。光是盡職調查和管理出售事宜本身,每週就要花掉 15 到 20 小時,所以我根本沒有多餘的時間去做以前那些事。幸好團隊挺身而出,接手了我原本沒想到要交出去的工作。
出版一門課程或一本書
- 結果:開設了直播課程,但未正式出版課程或書籍。
- 成績:C
如果跳過直播版本,我很可能已經發布課程了,但我仍很慶幸先做了試驗,因為它讓我對課程的定位有了寶貴的回饋。
每週花十個工作小時寫程式
- 結果:每週寫 10 到 20 小時的程式。
- 成績:A
我現在更頻繁地寫程式,而且樂在其中。
明年的目標
獲利 5 萬美元
在我所有的產品中,我希望能賺到 5 萬美元的利潤。不一定要是經常性收入,一次性銷售也算,但我希望能找到方法,靠銷售自己的產品賺到至少 5 萬美元。
出版一門課程或一本書
從 2021 年以來,我每年都把出版一本書設為年度目標,雖然從未實現,但我覺得今年就是那一年。
學習一門新的程式語言
每當我學會一門新的程式語言,都能獲得一些可以應用在整體程式設計上的啟發。
隨機一篇部落格
留言
登入後參與討論