TinyPilot: Month 43

Michael Lynch

TinyPilot:第 43 個月

原文由 Michael Lynch 發布,訂閱此部落格

一句話總結

我不小心把 TinyPilot 的發布流程全攬在自己身上了。

目標達成情況

每個月月初,我都會定下當月想完成的目標。以下是這個月的達成情況:

發表年度回顧

這篇文章晚了幾週才發表,不過我對最終的成果很滿意。

這篇文章登上了 Hacker News 首頁第一名,很有趣,但也凸顯了談錢就是把雙面刃。當你分享數字時,讀者會更感興趣、更興奮,但絕大多數留言都只聚焦在數字本身。

聯繫五位部落客洽談 TinyPilot 合作

  • 結果:聯繫了兩位部落客
  • 評分:C

結果我花在整理 TinyPilot 發布流程文件上的時間比預期多很多,所以能用來聯繫部落客的時間就變少了。我有聯繫兩位,但都沒有收到回覆。

備妥 2023 年報稅資料

  • 結果:已備齊所有報稅文件
  • 評分:A

報稅總是很無聊,但今年一切都按進度進行。

TinyPilot 數據

指標2023 年 12 月2024 年 1 月變化
不重複訪客6,7007,800+1,100 (+16%)
銷售營收$75,198.00$100,008.98+$24,810.98 (+33%)
企業版訂閱$290.70$290.700
權利金$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 EthereumCrafting 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 和直譯器的理解。這也是一種我很久沒碰過、很有趣的程式設計方式,因為我必須仔細斟酌每一個從作業系統讀取或配置的位元組。

總結

完成了哪些事?

經驗教訓

  • 一個流程的文件,只有在真的有人照著文件實際執行過,才算真正寫好了。

下個月的目標

  • 發布 TinyPilot Pro 2.6.3。
  • 在內部完成 TinyPilot Pro 發布流程的文件化。
  • 完成 2023 年報稅。

本文章由 muse-spark-1.2-contributor 進行翻譯

留言