TinyPilot: Month 40

Michael Lynch

TinyPilot:第 40 个月

一句话总结

烧录 microSD 卡出人意料的困难

亮点

  • TinyPilot 迎来了历史上收入第二高的月份。
  • TinyPilot 已接近完成向第三方供应商转移生产的工作。
  • 我可能已经踏入了机械键盘的“暗面”。

目标评分

每月初,我都会公布当月想要完成的目标。以下是本月目标的完成情况:

尽快将生产转移至我们的合同制造商

  • 结果:首批生产出现了一个小问题,但我们应该很快就能完成转移。
  • 评分:B

我们收到了来自合同制造商的首批生产设备,并将在 11 月发给客户。

我原本希望这批产品完美无缺,这样就能宣告转移完成。可惜,组装过程中出现了一个小错误,我们不得不在办公室进行修复,因此目前尚未实现从制造商到仓库再到客户的顺畅流程。

减少 TinyPilot 软件发布流程中的人工操作

  • 结果:我们消除了一项原本依赖于我的人工发布任务。
  • 评分:A

我一直在寻找自动化和简化 TinyPilot 软件发布流程的方法。我尤其希望将自己从 TinyPilot 日常工作流的关键路径中移除。10 月,我们通过自动化 TinyPilot 网站上新版本 TinyPilot Pro 可用时的更新方式,在这两方面都取得了进展。

过去,我发布新版本后,还需要手动更新网站以指向新的下载链接。现在,网站已与我们的更新服务同步,能够自动发现新版本。

制定更有效执行 TinyPilot Pro 许可证的计划

  • 结果:我们尚未在计划上取得进展。
  • 评分:F

开发团队在 10 月的可用时间比我预期的要少,因此我们最终未能在许可证执行计划上取得进展。

TinyPilot 数据统计

指标2023 年 9 月2023 年 10 月变化
独立访客6,2008,700+2,500 (+40%)
销售收入$83,380.02$98,896.81+$15,516.79 (+19%)
企业订阅$290.70$290.700
版税$2,056.30$2,609.84+$553.54 (+27%)
总收入$85,727.02$101,797.35+$16,070.33 (+19%)
利润$8,644.82$69,280.58+$60,635.76 (+701%)

这是 TinyPilot 历史上表现第二强的月份,原因我完全不清楚。我们的分析数据中没有任何特别之处,我也没有注意到任何新的评测或提及。我们在2022 年 10 月也出现了强劲销售,所以这可能只是季节性因素。

我原本预计数据会有所下滑,因为我一直专注于生产转移,没有在营销上投入。很高兴看到我们能够依靠 momentum 维持,但我也开始在 2023 年最后几个月加大对增长的投入。

与新制造商一起把 microSD 卡做好

丢失的磁盘

TinyPilot 设备将数据存储在名为 microSD 的微型磁盘上。就在制造商本应寄出 TinyPilot 设备首件样品的几天前,他们注意到我寄给他们的参考设备中装有 microSD 卡。他们问我是否需要 microSD 卡?

TinyPilot microSD 卡

原来,制造商从未在 bill of materials(物料清单)(BOM)中包含 microSD 卡。我自己也没有注意到它们缺失了。

幸运的是,购买和烧录 microSD 卡是一个快速而简单的过程。我们已经有一家供应商可以制作印有 TinyPilot 标志的 microSD 卡。我们让制造商与该供应商对接,并向制造商说明了如何将 TinyPilot 的软件烧录到 microSD 卡上。

制造商和我一致认为,不值得因为 microSD 卡而推迟首件样品的交付。我们决定让他们先发货不含 microSD 卡的设备,然后在一两周后再补寄 microSD 卡。

首件样品最终出现了太多问题,以至于我完全忘记了 microSD 卡的事,而制造商也从未寄出它们。

检查 microSD 卡是否正确烧录

到 10 月中旬,制造商表示他们已经修复了我提出的所有首件样品问题。他们将寄出一小批生产批次的产品,这批产品应该是完全成品,可以直接发给客户。

我们仍计划对首批产品进行额外的 QA,以确保它们符合我们在内部生产时的标准。验证的一部分包括检查制造商是否正确烧录了 microSD 卡。

直到这批货按计划到达的两天前,我才想到——我该如何检查制造商是否正确烧录了 microSD 卡?我想要确保磁盘上的每一个字节都是正确的。

验证 microSD 卡并非易事,因此我请 TinyPilot 的支持工程团队创建了一个快速的 shell 脚本,用于将制造商提供的 microSD 卡与我们的“golden”磁盘镜像进行比对并报告任何差异。他们及时在我的测试前完成了该脚本。

首批到货后,我加载了一张 microSD 卡,运行了我们的完整性检查脚本,脚本报告一切匹配。太好了!

我们进行了功能测试,一切都按预期工作。我非常高兴。这意味着制造商已经完全正确地完成了这一批次,因此我们可以宣告向第三方制造商的过渡取得了胜利。

正当我准备关闭测试中的最后一台 TinyPilot 时,我注意到了一件事。视频设置并非 TinyPilot 出厂时的默认值。看起来有人在我之前使用过这台设备。

我关闭了正在测试的设备,并重新运行了 microSD 检查脚本。这一次,由于我在测试过程中更改了大量设置,脚本理应报告存在差异。然而,脚本却报告我的 microSD 卡与我们的 golden 镜像完全一致。

糟糕。

尽管该脚本在支持工程师的机器上运行正常,但在我的测试环境中,它总是返回假阳性结果。

进一步检查 microSD 卡后,很明显制造商误解了我们的说明。我们希望他们使用一张测试用的 microSD 卡进行 QA,并在打包发给客户之前更换为一张全新的卡。制造商并没有执行更换操作,因此他们发给客户的设备中装的是已被使用过的 microSD 卡。

幸运的是,这个错误在我们办公室相对容易纠正。我们的本地团队打开了每一个包装,将 microSD 卡重新烧录至干净状态,重新打包,然后发往仓库。

从长远来看,我们显然不想在办公室重新烧录每一张 microSD 卡。当我们向制造商报告这个问题后,他们表示确实误解了我们的说明,并已修改流程,以确保每一张到达客户手中的 microSD 卡都是全新烧录了我们镜像的。我们将再次验证下一批次,但我有希望这个问题即将得到解决。

我本可以如何预防 microSD 卡的问题?

microSD 卡的问题是此前多个错误累积的结果:

  • 我没有注意到制造商的 bill of materials 中缺少 microSD 卡。
  • 制造商从未寄给我 microSD 样品,而我也忘记跟进了。
  • 直到流程的后期,我才考虑如何验证 microSD 卡。
  • 我低估了 microSD 检查脚本应有的严谨程度。

在审核 BOM 时,我只是凭记忆检查,以为一切都在。我本可以对我们的一件产品进行更严谨的拆解,逐一清点所有组件,以验证制造商 BOM 中的每一项都与我们产品中的组件一一对应。

这已经是我们第二次遇到围绕制造商未兑现的承诺的问题,而我仍然没有很好的解决方案。总体而言,他们能跟进大多数任务,但如果我不跟进,他们就会遗漏约 10% 的任务。我一直在等待事项时主动提出问题,但这使得像 microSD 卡或说明书这类看似不重要的部件很容易被遗漏。它们是产品中看似不重要、却会在阻碍发货时变得至关重要的部分。

我在 microSD 检查脚本上的投入也过少。当时,它感觉像是一个一次性的脚本,因此我们没有像对待面向客户的代码那样投入时间和精力。但当遇到假阳性时,我才意识到该脚本在我们的 QA 流程中按预期工作是多么重要,以及一个错误可能会带来多么昂贵的代价。因此,我们正在按照创建生产级代码的标准流程重写该脚本。

我不确定如何端到端地验证制造商的流程。当我们在内部完成这些工作时,我们在 Notion 上有一套操作说明,整个团队都会照此执行。我们无法与制造商共享 Notion 工作区,因为他们的工人并非都能阅读英文。因此,我们将英文说明交给他们,制造商将其翻译成越南语,工人则阅读越南语版本。我无法验证越南语流程是否与英文流程一致。

要求提供 QA 流程的视频很有帮助。它们以与语言无关的方式展示了制造商如何执行 QA。但很难获得整个端到端流程的视频。QA 流程视频并没有明显显示出他们用于测试的 microSD 卡最终留在了成品中,我也不确定该如何防止这种情况发生。

制造商确实邀请我去越南参观工厂。我拒绝了,因为今年我已经出差得够多了,但回过头来看,也许那次访问本可以避免一些代价高昂的错误。我本也可以将这次出差机会提供给本地团队的一名成员。

创建 customer success(客户成功)流程

年初时,本地 TinyPilot 团队的工作大约 20% 是客户服务,80% 是组装和履约。今年随着我们将生产和履约转移给外部供应商,这一比例发生了显著变化。到 2024 年初,组装和履约应占本地团队工作的 0%。

问题在于,客户服务目前仍只占本地团队每周工时的不到 50%,那么如何利用他们多出来的时间呢?

团队从年初就一直在讨论这个问题。最自然的转变似乎是从被动响应支持请求,转向主动联系现有客户。一些公司将这一角色称为“customer success”。

令人尴尬的事实是,我很少主动联系客户。这是那些重要但不紧急的任务之一,而我总是忽略它。但如果我能教会本地员工来做这件事,它就不再受限于我的可用时间。

我们正在试点一个新的 customer success 流程,具体如下:

  1. 客户服务团队调研在 TinyPilot 上花费较多的客户(尤其是回头客)。
  2. 客户服务团队向客户发送一封人工撰写的邮件,提及关于其公司和订单的具体细节(以免显得像是自动发送的),并邀请对方进行一次通话,讨论功能需求或痛点。
  3. 我们与客户会面,了解他们如何使用 TinyPilot。
  4. 我们将客户的反馈整合到我们的功能路线图中。

当我作为客户收到其他企业的外联信息时,通常能明显感觉到对方的自私。他们会说类似“我们想帮助您了解我们的所有产品”这样的话,但实际上只是想让我购买更多东西。

我希望 TinyPilot 的客户外联能让人感觉是协作性的,而非寄生或贪婪的。我认为这将有助于我们根据客户想要的功能来调整路线图,并帮助我们发现那些否则不会察觉的 TinyPilot 新机遇。

业余项目

再见 Ansible,你好 Nix

在过去几年里,我一直使用 Ansible 来管理我的开发环境,但它的许多痛点让我越来越难以忍受。在过去几个月里,我一直在尝试用 Nix 来取代 Ansible,我想我终于完成了。

我以前见过Nix Home Manager,但没明白它的意义。它管理我主目录下的文件?NixOS 不是已经管理了整个系统吗?

我忽略的关键点是:

  • Home Manager 可在任何 Linux 或 Mac 系统上运行,而不仅仅是 NixOS。
  • 由于 Home Manager 针对文本文件进行了优化,它在管理文本文件方面的接口比 NixOS 的更好。

现在,我不再使用 Ansible 管理我的开发系统,而是使用 Home Manager 和针对项目的 Nix flakes来管理一切。我已经有一个多月没有运行过 Ansible playbook 了。

一个显著的变化是,我更经常地为常用命令使用和定义 bash 别名。我过去添加 bash 别名的方式是将其添加到我的 Ansible playbook 中,然后在任何想要使用该别名的系统上重新运行 playbook。但在我的系统上运行 Ansible playbook 非常缓慢且容易失败,以至于最终一半系统知道某个别名,另一半却不知道。整个过程阻力很大,以至于我很少有动力去添加新别名并将其融入日常习惯。

使用 Nix 后,Home Manager 现在管理着我所有的 bash 别名。如果我想添加一个 shell 别名,只需编辑 ~/.config/home-manager/home.nix,然后运行 home-manger switch 来应用更改(实际上,我已将其缩短为一个 bash 别名:hs)。整个过程不到一分钟,而且不会像 Ansible 那样因外部因素而失败。

我曾尝试完全切换到 NixOS,但遇到了困难,因为我常用的 Debian 开发环境与 NixOS 之间存在太多差异。使用 Home Manager 是在全面投入 Nix 和保留熟悉的 Debian 工作流之间的一个很好的折中方案。

我现在成了个痴迷机械键盘的怪人

在 Lex Fridman(莱克斯·弗里德曼)对 Python 创始人 Guido von Rossum(吉多·范罗苏姆)的访谈中,弗里德曼有一段较长的插话,讲述了他有多么喜欢自己的 Kinesis Advantage 2 键盘。

Kinesis 是机械键盘的一个热门厂商。他们的键盘独特之处在于按键位于凹陷的键井中,且键盘的左右两半相隔数英寸。

Lex Fridman 非常喜欢他的 Kinesis Advantage 2 机械键盘。

弗里德曼非常喜欢他的 Kinesis 键盘,以至于坐飞机时都会随身携带,因为他宁愿拖着一块巨大的键盘,也不愿使用笔记本电脑自带的按键。

从 14 岁起,我就一直在用某种型号的 Microsoft 人体工学键盘。我喜欢它,但不像弗里德曼谈论 Kinesis 那样热爱它,所以在过去的几个月里,我对机械键盘产生了好奇。

Microsoft Natural Ergonomic Keyboard 4000,我直到最近的主力键盘

我只认识几个使用机械键盘的人,但我从未理解其吸引力。如果他们想在某件事上钻研极客精神,那也无妨,但我觉得自己能从键盘上获得的最大乐趣相当有限,那又何必折腾呢?

后来,我产生了好奇,开始阅读更多关于高端键盘的资料。我清醒时的大部分时间都在键盘前度过,所以或许我应该投资优化这一体验。

在考察了 Kinesis、Ergodox 和 ZSA 等几个选项后,我最终选择了Kinesis Advantage 360

我刚刚换成了Kinesis Advantage 360 键盘。

使用这款键盘的第一天非常艰难。我的打字速度只有平时的约 5%。我有大量文书工作要处理,所以第二天早上就暂时把它搁置了。

第二天要轻松一些,但仍然是个挑战。我坚持了下来,现在用这款键盘输入英文散文时速度更快了,但在编程时却更慢。我还没有习惯在这款键盘上输入像 [{= 这样的字符。我甚至已经重新映射了按键以使其更易于输入,但仍在努力建立肌肉记忆。

我看过其他人的评测,他们说一旦习惯了 Kinesis,再换回普通键盘也没有问题,但到目前为止我的体验并非如此。当我切换到 Surface Pro 6 上那块紧凑的笔记本键盘时,会打出大量错别字。也许最终我会重新适应两种键盘。

虽然有 60 天的退货期,但到目前为止,我相当确定会坚持使用 Kinesis。

总结

完成了什么?

  • 我们发货了由合同制造商生产的首批 TinyPilot Voyager 2a 设备。
  • 我们消除了 TinyPilot 发布流程中的人工操作。
  • 我换成了机械键盘。

经验教训

  • 更积极地跟踪制造商的承诺。
    • 这是我之前犯过且未能正确解决的错误。
    • microSD 卡事件重复了一种模式:制造商承诺做某件事,我以为他们会处理,我们双方都忘记了,最终在后续引发问题。
    • 我需要开始记录他们的承诺并每周检查状态,以防他们遗忘。
  • 逐个组件地核对 BOM。
    • 几个月前制造商发来 bill of materials 时,我只是凭印象在脑中核对自己预期会看到的内容,却漏掉了 microSD 卡缺失的问题。
    • 今后在进行 BOM 确认流程时,我会将现有产品拆开,清点所有组件,然后验证其是否与制造商的 BOM 一致。

下个月的目标

  • 尽快将生产转移至我们的合同制造商。
  • 进行五次客户外联电话。
  • 清理 TinyPilot 办公室中所有的旧库存和备件。

原文由 Michael Lynch 发布

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