TinyPilot: Month 43

Michael Lynch

TinyPilot:第 43 個月

一句話摘要

我不小心把 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-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 和直譯器的知識。這也是一種我好久沒做過的有趣程式設計方式,因為我必須對從作業系統讀取或配置的每一個位元組都審慎以對。

總結

已完成事項?

經驗教訓

  • 一個流程在有人真正依照文件實際執行之前,都不算真正被記錄下來。

下個月的目標

  • 發布 TinyPilot Pro 2.6.3。
  • 在內部記錄 TinyPilot Pro 的發布流程。
  • 申報 2023 年稅務。

原文由 Michael Lynch 發布

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