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 迎来了历史上收入第二高的月份。除了销售的正常波动外,我找不到其他解释。我们典型的月收入一般在 7.5 万至 9.5 万美元之间,我认为这个月恰好处于波动的高位,几笔大额订单让我们突破了 10 万美元。

利润高得离谱,但这同样是因为自从转向合同制造商后,TinyPilot 在原材料上的支出变得非常集中。我很高兴看到三个月的平均利润为正,尽管比平时要低一些。

我意外地把 TinyPilot 的发布流程囤在了自己手里

当我卖出最初几台 TinyPilot 设备时,我无法在自己的开发机上正确地复制 microSD 卡。于是,我只能逐个为每位客户的 microSD 卡刷入 Linux,然后在每台设备上手动运行 TinyPilot 安装脚本来完成配置。

从那以后,我对硬件设备的软件发布流程了解了很多。我们的发布流程已经变得更加成熟,测试更全面,可复现性更好,自动化程度也更高。

我在 TinyPilot 共享的 Notion 工作区中记录了发布流程,并已将大部分流程委托给团队成员,这样新的 TinyPilot 版本就不会因为我而受阻。

或者说,至少我以为自己已经记录了大部分发布流程。

在最近一次发布中,我挑战自己不直接执行任何发布步骤,而是让团队成员根据我的文档来完成发布流程。

还没等我让同事执行第一个任务,我就意识到有多少流程细节仍然只存在于我的脑海中。发布中的所有步骤都已记录在案,但却没有任何内容说明它们是如何协同工作的。

我还意识到,流程中的某些任务,比如“更新更新日志”或“撰写发布公告”,其实际复杂度远超这些简短描述所暗示的。我们在公告中应该突出哪些功能?在解释功能时有哪些不成文的规则,既能说清楚又不陷入枯燥的细节?

记录流程的好处在于,它迫使我审慎地思考每一个决策。有很多情况是,我翻阅过去的版本,试图归纳规律,却发现自己的决策并不一致。还有一些情况,我的做法一直很一致,但当需要解释原因时,我才意识到其实有更好的策略。

将整个发布过程委托出去比我自己做要慢,但这是一次很有价值的锻炼。它让我们的发布流程不再那么依赖我,给了我们改进流程的机会,也让未来更容易将其中各个子部分并行化。

副业项目

用 Zig 实现 bytecode interpreter(字节码解释器)

过去几个月里,我一直在探索 Zig,而学习过程中最大的障碍之一是找到适合 Zig 的项目。

我的大多数项目想法都是网络应用,这通常会让我选择 Go,因为 Go 就是为构建网络应用而设计的,而 Zig 则被设计为更通用的 C 语言替代品。

在过去几个月里,我偶尔会阅读 Bob Nystrom(鲍勃·尼斯特罗姆)的Crafting Interpreters(《手作解释器》)和 Andreas M. Antonopoulos(安德烈亚斯·安东诺普洛斯)与 Gavin Wood(加文·伍德)合著的Mastering Ethereum(《精通以太坊》)。《手作解释器》演示了如何实现 bytecode interpreter(书中用 C 语言实现),而《精通以太坊》则描述了以太坊的核心是一个名为 Ethereum Virtual Machine(EVM)的 bytecode interpreter。

我意识到可以通过用 Zig 编写一个 Ethereum Virtual Machine 的实现来结合这几种兴趣。于是我启动了一个名为eth-zvm 的项目。

目前我只实现了约 2% 的以太坊功能,但我的解释器已经可以运行真实的以太坊程序并返回结果。

以下是我的解释器运行一个编译为以太坊字节码的简单程序时的样子:

$ 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 Virtual Machine 实现与官方 Go 版本的基准测试对比(数值越低越好)

我的解释器仍有许多性能优化尚未实现,所以我相信如果花些时间减少内存分配,就能超越其他实现。

我不确定这个项目会做到什么程度,但它作为一个实践项目,帮助我加深了对 Zig、以太坊和解释器的理解。这也是一种我很久没有做过的有趣编程类型,因为我必须对从操作系统读取或分配的每一个字节都慎重对待。

收尾

完成了什么?

经验教训

  • 只有当有人真正按照文档操作过流程,流程才算真正被记录下来。

下月目标

  • 发布 TinyPilot Pro 2.6.3。
  • 在内部记录 TinyPilot Pro 的发布流程。
  • 完成 2023 年报税。

原文由 Michael Lynch 发布

本文章由 muse-spark-1.2-contributor 进行翻译