TinyPilot:第 43 個月
原文由 Michael Lynch 于 發布,訂閱此部落格
一句話總結
我不小心把 TinyPilot 的發布流程全攬在自己身上了。
目標達成情況
每個月月初,我都會定下當月想完成的目標。以下是這個月的達成情況:
發表年度回顧
- 結果:發表了 「My Sixth Year as a Bootstrapped Founder」
- 評分:A
這篇文章晚了幾週才發表,不過我對最終的成果很滿意。
這篇文章登上了 Hacker News 首頁第一名,很有趣,但也凸顯了談錢就是把雙面刃。當你分享數字時,讀者會更感興趣、更興奮,但絕大多數留言都只聚焦在數字本身。
聯繫五位部落客洽談 TinyPilot 合作
- 結果:聯繫了兩位部落客
- 評分:C
結果我花在整理 TinyPilot 發布流程文件上的時間比預期多很多,所以能用來聯繫部落客的時間就變少了。我有聯繫兩位,但都沒有收到回覆。
備妥 2023 年報稅資料
- 結果:已備齊所有報稅文件
- 評分:A
報稅總是很無聊,但今年一切都按進度進行。
TinyPilot 數據
| 指標 | 2023 年 12 月 | 2024 年 1 月 | 變化 |
|---|---|---|---|
| 不重複訪客 | 6,700 | 7,800 | +1,100 (+16%) |
| 銷售營收 | $75,198.00 | $100,008.98 | +$24,810.98 (+33%) |
| 企業版訂閱 | $290.70 | $290.70 | 0 |
| 權利金 | $1,792.51 | $3,313.11 | +$1,520.60 (+85%) |
| 總營收 | $77,281.21 | $103,612.79 | +$26,331.58 (+34%) |
| 獲利 | $-59,117.41 | $79,764.14 | +$138,881.55 (+inf%) |
TinyPilot 創下了有史以來營收第二高的月份。我找不到特別的原因,只能說是銷售上的正常波動。我們平常單月營收大約落在 75,000 到 95,000 美元之間,這個月算是剛好站上了波動的高點,加上幾筆大額訂單,就一舉突破了 10 萬美元。
獲利數字看起來高得離譜,但同樣是因為我們改用合約製造商後,原物料的支出變得非常集中、波動很大。看到近三個月的平均獲利為正,我很開心,雖然比平常低了一些。
我不小心把 TinyPilot 的發布流程全攬在自己身上了
剛開始賣 TinyPilot 的時候,我沒辦法在自己的開發機上正確地複製 microSD 卡。所以我只能一片一片手動處理:先把 Linux 燒錄到 microSD 卡上,然後在每台裝置上手動執行 TinyPilot 的安裝腳本,來為每位客戶準備 microSD 卡。
從那之後,我對硬體裝置的軟體發布流程學到了很多。我們的發布流程也變得更成熟,測試更完整、可重現性更高,也多了更多自動化。
我把發布流程都記錄在 TinyPilot 共用的 Notion 工作區裡,也把大部分步驟都交給團隊夥伴執行,這樣新的 TinyPilot 版本就不會卡在我一個人身上。
至少,我以為我已經把大部分流程都記錄下來了。
在最近一次發布時,我挑戰自己完全不親自動手做任何發布步驟。相反地,我請夥伴們根據我寫的文件來執行發布流程。
都還沒來得及請夥伴執行第一個任務,我就發現有多少流程其實還鎖在我的腦袋裡。發布流程的每一步確實都有寫下來,但完全沒有說明這些步驟之間是如何串起來的。
我也發現,流程中的某些任務,像是「更新更新日誌」或「撰寫發布公告」,其複雜度遠比這些短短的片語所暗示的要高得多。我們在公告中要突顯哪些功能?有哪些不成文的規則,告訴我們該如何說明功能,才不會陷入無聊的細節裡?
把流程寫下來的好處,在於它迫使我仔細思考每一個決策。有很多時候,我回頭檢視過去的發布紀錄,試圖歸納出規律,卻發現自己的決策其實並不一致。另一些時候,我的做法雖然一致,但當我必須解釋原因時,才發現其實有更好的策略。
把整個發布流程交出去,比我自己做要慢得多,但這是一個很有價值的練習。它讓我們的發布流程不再那麼依賴我,也讓我們有機會改善流程,未來也更容易將其中的子任務平行分工。
業餘專案
用 Zig 實作 bytecode 直譯器
過去幾個月我一直在探索 Zig,而學習上最大的障礙之一,就是要找到適合用 Zig 來做的專案。
我的專案點子大多是網頁應用,這通常會讓我選擇 Go,因為 Go 本來就是為建構網頁應用而設計的,而 Zig 則是被設計成更通用的 C 語言替代品。
過去幾個月,我偶爾會讀 Bob Nystrom 的 Crafting Interpreters 以及 Andreas M. Antonopoulos 和 Gavin Wood 合著的 Mastering Ethereum。Crafting Interpreters 示範了如何用 C 實作 bytecode 直譯器,而 Mastering Ethereum 則說明了 Ethereum 的核心就是一個名為 Ethereum Virtual Machine(EVM)的 bytecode 直譯器。
我發現可以結合幾個不同的興趣,用 Zig 來實作一個 Ethereum Virtual Machine。我開了一個叫 eth-zvm 的專案。
目前我只實作了大約 2% 的 Ethereum 功能,但我的直譯器已經可以執行真正的 Ethereum 程式並回傳結果。
以下是我的直譯器執行一個編譯成 Ethereum bytecode 的簡單程式時的樣子:
$ echo '600160005260206000f3' | xxd -r -p | zig-out/bin/eth-zvm -v
PUSH1 0x01
Stack: push 0x1
---
PUSH1 0x00
Stack: push 0x0
---
MSTORE
Stack: pop 0x0
Stack: pop 0x1
Memory: Writing value=0x1 to memory offset=0
Memory: 0x00000000000000000000000000000001
---
PUSH1 0x20
Stack: push 0x20
---
PUSH1 0x00
Stack: push 0x0
---
RETURN
Stack: pop 0x0
Stack: pop 0x20
Memory: reading size=32 bytes from offset=0
Return value: 0x0000000000000000000000000000000000000000000000000000000000000001
---
EVM gas used: 18
execution time: 792.395µs
0x0000000000000000000000000000000000000000000000000000000000000001你可以在 evm.codes playground 上用 JavaScript 實作來對照我的直譯器結果。
我本來以為憑著 Zig 本身對效能的高度優化,可以在效能上輕鬆碾壓其他直譯器,但結果發現官方的 Go 版 Ethereum 實作其實相當快:

我的 Ethereum 虛擬機實作與官方 Go 版本的效能比較(數值越低越好)
我的直譯器還有很多效能優化可以做,所以我相信如果花點時間減少記憶體配置,應該有機會超越其他實作。
我不確定會把這個專案做到什麼程度,但它是一個很務實的方式,讓我同時增進對 Zig、Ethereum 和直譯器的理解。這也是一種我很久沒碰過、很有趣的程式設計方式,因為我必須仔細斟酌每一個從作業系統讀取或配置的位元組。
總結
完成了哪些事?
- 發表了 「My Sixth Year as a Bootstrapped Founder」,該文登上 Hacker News 當日第一名。
- 開始整理 TinyPilot 發布流程的文件。
經驗教訓
- 一個流程的文件,只有在真的有人照著文件實際執行過,才算真正寫好了。
下個月的目標
- 發布 TinyPilot Pro 2.6.3。
- 在內部完成 TinyPilot Pro 發布流程的文件化。
- 完成 2023 年報稅。
隨機一篇部落格
留言
登入後參與討論