TinyPilot:第 43 個月
一句話摘要
我不小心把 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-95k 的區間,我想這個月是碰上了波動的高點,幾筆大額訂單把我們推上了 $100k 以上。
利潤高得離譜,但同樣是因為我們轉用委外製造商後,原物料支出的波動變得很大。很高興看到三個月移動平均仍為正數,雖然比平常低一些。
我不小心把 TinyPilot 的發布流程全攬在自己身上
剛開始銷售最初幾台 TinyPilot 裝置時,我在自己的開發機上無法正確複製 microSD。於是我改為逐一為每位客戶的 microSD 進行設定:先將 Linux 燒錄到 microSD 上,然後在每台裝置上手動執行 TinyPilot 安裝指令碼。
從那之後,我對硬體裝置的軟體發布流程有了更深的了解。我們的發布流程也變得更加成熟,測試更完整、重現性更好,也加入了更多自動化。
我在 TinyPilot 共用的 Notion 工作區中記錄了發布流程,並將大部分流程委派給團隊成員,讓新的 TinyPilot 版本不再卡在我一個人身上。
或者說,至少我以為自己已經把大部分發布流程都記錄下來了。
在最近一次發布中,我挑戰自己完全不親自執行任何發布步驟。相反地,我請團隊成員根據我的文件來執行發布流程。
甚至還沒請團隊成員執行第一項任務,我就意識到自己把多少流程細節都封存在腦中。發布流程的每一步都有記錄,卻沒有任何說明解釋這些步驟如何串連起來。
我也發現,流程中的某些任務,像是「更新更新日誌」或「撰寫發布公告」,其實遠比這些簡短詞句所暗示的複雜得多。我們該在公告中強調哪些功能?在解釋功能時,有哪些不成文的規則,讓我們既能說清楚又不會陷入枯燥的細節?
記錄流程的好處在於,它迫使我審慎思考每一個決策。有很多時候,我回顧過去的版本並試圖歸納出模式,卻發現自己的決策其實不一致。在其他情況下,我雖然做法一致,但當必須解釋原因時,才發現其實有更好的策略。
把整個發布流程委派出去,比我自己做要慢,但這是一次很有價值的練習。這讓我們的發布流程不再那麼依賴我,也讓我們有機會改善流程,並在未來更容易將其中子流程平行處理。
業餘專案
用 Zig 實作 bytecode interpreter(位元組碼直譯器)
過去幾個月來,我一直在探索 Zig,而要更深入學習的最大障礙之一,就是找到適合 Zig 的專案。
我大多數的專案構想都是網頁應用程式,這通常會讓我選擇 Go,因為 Go 本就是為建構網頁應用程式而設計,而 Zig 則被設計為更通用的 C 語言替代方案。
過去幾個月,我偶爾會閱讀 Bob Nystrom(鮑伯·奈史卓姆)的 Crafting Interpreters(《打造直譯器》)以及 Andreas M. Antonopoulos(安德烈亞斯·M·安東諾普洛斯)與 Gavin Wood(蓋文·伍德)合著的 Mastering Ethereum(《精通以太坊》)。《打造直譯器》展示了如何在 C 中實作 bytecode interpreter,而《精通以太坊》則描述了 Ethereum 的核心是一個名為 Ethereum Virtual Machine(以太坊虛擬機)(EVM)的 bytecode interpreter。
我意識到可以透過用 Zig 撰寫 Ethereum Virtual Machine 的實作來結合幾個不同的興趣。我開始了一個名為 eth-zvm 的專案。
目前我只實作了約 2% 的 Ethereum,但我的直譯器已經可以執行真正的 Ethereum 程式並回傳結果。
以下是我的直譯器執行一個編譯為 Ethereum 位元組碼的簡單程式時的樣貌:
$ 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 virtual machine 實作與官方 Go 版本進行比較的效能基準測試(數值越低越好)
我的直譯器仍有許多效能優化尚未實作,所以我敢說只要花些時間減少記憶體配置,就能超越其他實作。
我不知道這個專案會做到什麼程度,但它正作為一個實際的方式,幫助我累積對 Zig、Ethereum 和直譯器的知識。這也是一種我好久沒做過的有趣程式設計方式,因為我必須對從作業系統讀取或配置的每一個位元組都審慎以對。
總結
已完成事項?
- 發布了 「My Sixth Year as a Bootstrapped Founder」,該文登上 Hacker News 當日第一名。
- 開始記錄 TinyPilot 的發布流程。
經驗教訓
- 一個流程在有人真正依照文件實際執行之前,都不算真正被記錄下來。
下個月的目標
- 發布 TinyPilot Pro 2.6.3。
- 在內部記錄 TinyPilot Pro 的發布流程。
- 申報 2023 年稅務。
隨機一篇部落格