TinyPilot: Month 43

Michael Lynch

TinyPilot:43ヶ月目

原文は Michael Lynch により に公開されました。 このブログを購読する

一言でまとめると

うっかりTinyPilotのリリースプロセスを自分一人で抱え込んでしまっていた。

今月の目標と振り返り

毎月のはじめに、その月に達成したいことを宣言しています。今月の結果は以下の通りです。

年次振り返り記事を公開する

数週間遅れでの公開になりましたが、仕上がりには満足しています。

この記事はHacker Newsで1位を獲得しました。嬉しい出来事でしたが、お金の話をすることの諸刃の剣ぶりも浮き彫りになりました。数字を公開すると読者の関心や盛り上がりは格段に高まりますが、コメントの大半は数字の話一色になってしまいます。

TinyPilotのコラボについて5人のブロガーに連絡する

  • 結果: 2人のブロガーに連絡
  • 評価: C

TinyPilotのリリースプロセスのドキュメント化に予想以上に時間がかかり、ブロガーへの連絡に使える時間が減ってしまいました。2人には連絡したものの、どちらからも返事はありませんでした。

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にとって史上2番目に売上が高い月になりました。理由は特に思い当たりません。単なる売上のばらつきだと思います。通常の月は7万5千〜9万5千ドル程度で、今月はそのばらつきの上限に当たり、数件の大口注文が10万ドルの大台を超える押し上げ要因になりました。

利益は異常に高く出ていますが、これも原材料費の支出が外部委託製造への切り替え以降、大きく波打つようになったためです。3ヶ月移動平均がプラスに戻ったのは嬉しいですが、例年よりは低い水準です。

うっかりTinyPilotのリリースプロセスを抱え込んでいた

最初の数台のTinyPilotデバイスを販売した頃、開発用マシンでmicroSDカードを正しく複製できずにいました。そこで、microSDにLinuxを書き込んだあと、TinyPilotのインストールスクリプトを1台ずつ手作業で実行して、顧客ごとにmicroSDを用意していました。

それ以来、ハードウェア向けにソフトウェアをリリースするプロセスについて多くのことを学びました。リリースプロセスはより成熟し、テストは手厚くなり、再現性は高まり、自動化も進みました。

TinyPilotの共有Notionワークスペースにリリースプロセスを文書化し、新しいリリースが私の作業待ちで止まらないように、その大半をチームメンバーに委任してきました。

少なくとも、一通りのプロセスは文書化できたつもりでした。

今回のリリースでは、自分では一切リリース作業を行わずに挑戦してみることにしました。代わりに、ドキュメントを元にチームメンバーにリリースを進めてもらうよう頼んだのです。

最初のタスクをチームメンバーに依頼しようとした時点で、どれだけ多くのプロセスを自分の頭の中だけに閉じ込めていたかに気づきました。リリースの各ステップ自体は文書化されていましたが、それらが全体としてどうつながっているかを説明するものが何もなかったのです。

また、「変更履歴を更新する」や「リリース告知を書く」といったタスクが、その短いフレーズが示すよりもはるかに複雑であることにも気づきました。告知ではどの機能を強調すべきなのか。退屈な詳細に埋もれずに機能を説明するための暗黙のルールは何なのか。

プロセスを文書化する利点は、自分のあらゆる判断について意識的に考えざるを得なくなることです。過去のリリースを振り返ってパターンを抽出しようとした場面が何度もありましたが、自分の判断が一貫していなかったことに気づきました。逆に、一貫してやってきたことでも、いざ理由を説明しようとすると、もっと良いやり方があることに気づくケースもありました。

リリース全体を委任するのは自分でやるより時間がかかりましたが、非常に価値のある取り組みでした。リリースプロセスの私への依存度が下がり、プロセス自体を改善する機会にもなり、将来的に各サブタスクを並行して進めやすくもなります。

サイドプロジェクト

Zigでバイトコードインタプリタを実装する

ここ数ヶ月Zigを探求してきましたが、学びを深めるうえで最大の壁は、Zigに合ったプロジェクトを見つけることでした。

やりたいプロジェクトの多くはウェブアプリで、そうなると自然とGoに行き着きます。Goはウェブアプリを構築するために設計された言語ですが、ZigはCのより汎用的な代替として設計されているからです。

ここ数ヶ月は、Bob Nystrom著のCrafting Interpretersと、Andreas M. AntonopoulosとGavin Wood著のMastering Ethereumを時々読んでいました。Crafting Interpretersではバイトコードインタプリタの実装方法がCで解説されており、Mastering EthereumではEthereumの中核がEthereum Virtual Machine(EVM)と呼ばれるバイトコードインタプリタであることが説明されています。

いくつかの興味を組み合わせれば、ZigでEthereum Virtual Machineの実装を書けるのではないかと思い至りました。そこでeth-zvmというプロジェクトを始めました。

まだEthereum全体の2%程度しか実装できていませんが、すでに実際の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のプレイグラウンド上のJavaScript実装と比較できます。

Zig自体が徹底的にパフォーマンス最適化されているので、他のインタプリタは簡単に凌駕できると思っていましたが、公式のGoによるEthereum実装はかなり高速でした。

私のEthereum仮想マシン実装と公式のGoベース版とのベンチマーク比較(数値が低いほど良い)

私のインタプリタはまだ多くのパフォーマンス最適化の余地を残しているので、メモリアロケーションを削れば他の実装を上回れるはずです。

このプロジェクトをどこまで続けるかは分かりませんが、Zig、Ethereum、そしてインタプリタについての知識を実践的に深める手段になっています。また、OSから読み取る・確保する1バイト1バイトを意識しなければならない、久しぶりの楽しいタイプのプログラミングでもあります。

まとめ

できたこと

学んだこと

  • プロセスは、誰かが実際にドキュメントに沿って実行してみるまでは、本当に文書化されたとは言えません。

来月の目標

  • TinyPilot Pro 2.6.3をリリースする。
  • TinyPilot Proのリリースプロセスを内部向けに文書化する。
  • 2023年分の確定申告を行う。

この記事は「muse-spark-1.2-contributor」を使用して翻訳されました。

コメント