TinyPilot:第 27 个月
一句话总结
一个完全远程化的 TinyPilot 会是什么样子?
亮点
- 我做了一个思想实验,探讨 TinyPilot 能否在没有实体办公室的情况下运转。
- 思考外包问题促使我认识到我们当前工作流程中的低效之处。
- 端到端测试工具 Playwright 已经彻底赢得了我的青睐。
目标评分
每个月初,我都会宣布本月想完成的目标。以下是我对这些目标的完成情况:
将 TinyPilot Pro 迁移到下一代更新系统
- 结果:发布了 TinyPilot Pro 2.5.0,其中包含新的更新系统。
- 评分:A
这个版本的重大变化在于更新的工作方式。TinyPilot 过去会查询一个 git 服务器来获取更新,并总是尝试更新到最新版本。现在,我们有一个自定义的 Web 服务,TinyPilot 会向它查询下一个版本。新的更新系统让我们对更新过程有了更多控制,也让我们更容易测试新版本。
这个版本花了五个月,比我们任何人预期的都要长。我们通常的发布节奏大约是两个月。我希望新版本能帮助我们在未来更快地迭代和测试。
把 TinyPilot Voyager 寄给两位 YouTube 创作者或博主进行评测
- 结果:取消该目标,改为重新招聘。
- 评分:N/A
我最终让一位支持工程师离职了,所以我转而专注于招聘他的接替者。这件事很成功,我在十月初雇到了一位新工程师。
探索新的外壳制造方案
- 结果:订购了一个金属外壳原型。
- 评分:A
这是一个比较模糊的目标,因为我目前仍在探索各种方案。过去我曾探索过注塑成型外壳,它的单件成本低,但前期投入昂贵。我现在在探索金属外壳,它不需要那么多前期成本,而且能高效扩展。
TinyPilot 数据统计
| 指标 | 2022 年 8 月 | 2022 年 9 月 | 变化 |
|---|---|---|---|
| 独立访客数 | 11,903 | 9,040 | -2,863(-24%) |
| 总页面浏览量 | 23,214 | 17,608 | -5,606(-24%) |
| 销售收入 | $76,082.06 | $68,640.50 | -$7,441.56(-10%) |
| 企业订阅收入 | $290.70 | $242.95 | -$47.75(-16%) |
| 版税收入 | $3,264.23 | $3,440.90 | +$176.67(+5%) |
| 总收入 | $79,636.99 | $72,324.35 | -$7,312.64(-9%) |
| 利润 | $21,580.82 | -$8,764.28* | -$30,345.10(-inf%) |
* 这个利润数字只是对我现金持有量变化的粗略计算,真正的记账要到月中才会做。
这些数字全是吓人的红色,但我认为这实际上是一个强劲的月份。看到我们又一个月收入超过 $70k,我非常高兴。
利润下降是因为我收到了一笔意外的 $11k 原材料账单,这笔账可以追溯到六个月前。不过,我对最终亏损这么多还是有点意外。我怀疑这主要是发票时间安排的问题,接下来几个月应该会平均回来并转为正数。
金属外壳对 TinyPilot 意味着什么?
我们生产中剩下的瓶颈之一就是外壳。我们的外壳是 3D 打印的,而且使用的是一种打印速度很慢的高端材料,所以我们每月只能制造大约 160 个外壳。我们还受限于一家特定的 3D 打印供应商,因为我们依赖一项马萨诸塞州的州政府补助金,而这项补助金只能通过这家供应商获得。
我们每月销售 200 多台设备,所以外壳很快就会成为限制因素。由于我们在销量低于产能时囤积了外壳,所以还能按目前的速度再发货几个月。
我们的硬件合作伙伴建议使用金属外壳,类似于消费级网络硬件上常见的那种:

如果我们把 TinyPilot 改用这样的金属外壳会怎样?
金属外壳可以降低成本,并消除每月 160 个的产能限制,因为我们可以每月制造数千个。
我们的硬件合作伙伴还随口提到一件让我开始思考的事:如果我们在制造外壳,那我们也可以在中国组装设备。
起初,在中国组装对我并没有吸引力。我们在马萨诸塞州有一套行之有效的组装流程,为什么要去折腾它?
假设每台设备在美国的组装成本是 $10,也许中国的供应商只需 $1-2 就能做到。每台节省 $9 并不足以抵消改变一套顺畅运转的流程所带来的所有风险。
但接着思考在中国制造的问题时,我开始琢磨这会如何改变 TinyPilot 的办公室。我们的货架上不会再堆放数百个外壳、USB 线和微型橡胶脚垫,因为这些都会存放在制造商那里。而且如果原材料存放在制造商那里,制造商还可以跟踪库存并补订物料,以跟上生产进度。
然后,我开始问自己:我们到底还需要 TinyPilot 办公室吗?
TinyPilot 办公室里都在做什么?
目前,TinyPilot 办公室主要用于六项功能:
- 存放库存
- 组装设备
- 烧录 microSD 卡
- 测试组装好的设备(质量保证)
- 打包并发送客户订单
- 处理退回的订单
没有自己的办公室,TinyPilot 还能完成这些功能吗?让我们一探究竟!
存放库存与组装设备
如果我们将制造转移到中国,那么库存管理实际上也会转移到中国。
如果一切顺利,外包库存和制造会大大简化 TinyPilot 的许多工作流程。另一方面,一旦出问题,当制造商远在数千英里之外时,问题的严重程度会显著加剧。
如果海外制造商接管设备制造,我们在 TinyPilot 办公室的大量工作就会突然消失。办公室的大部分存储空间都可以腾出来,因为我们只需要存放成品。库存跟踪也变得简单得多,因为我们只需要跟踪成品,而不是原材料或半成品组件。我们终于可以取消库存跟踪工具的订阅了——那是我们技术栈中最令人沮丧、质量最差的软件。
进口货物应该会更省时间。我们的大部分原材料都来自中国,如果它们一次性以成品的形式到达,比零散地处理原材料要容易管理得多。
我经常被困在进口的关键路径上,因为 DHL 更喜欢拨打包裹上的电话号码,而不是给我们支持邮箱发邮件。我们没有办公室电话号码,所以他们最后只能打我的手机。如果我们每月只剩下几次收货,数量少到 TinyPilot 的员工可以主动跟踪包裹并在快递公司打电话之前就缴清进口关税,那就没问题了。而且如果我们将外包制造与 3PL(第三方物流) 供应商结合起来,我们甚至可以完全置身事外,因为制造商可以直接发货到第三方履约中心。
缺点是这需要我们对制造商给予极大的信任。由于芯片短缺,我们必须为几个月甚至几年的生产囤积电子元件。如果制造商弄丢了一年的某种元件供应,我们会陷入非常糟糕的境地。我们可以要求定期盘点并派第三方审计员进场,但如果制造商只是说一句“哎呀,我们弄丢了你们价值 $20k 的库存”,我不确定自己有什么追索手段。
TinyPilot 的产品在升级组件或发现设计问题时会经历许多小的调整。在自制模式下,我们能很快发现零件配合不严或某个组件承受过大应力的问题。而在海外制造商那里,反馈周期更慢。等我们发现问题时,制造商可能已经生产了几百个带有同样缺陷的产品。
烧录 microSD 卡
每台 TinyPilot 都需要一张烧录了 TinyPilot 软件的 microSD 卡。目前我有很高的把握确信没有人篡改过这些 microSD 卡,因为在烧录之后它们从未离开过我们的保管。在我们和客户之间唯一可能篡改 microSD 卡的人只有快递员,而如果 USPS 想作恶的话,他们应该有比 TinyPilot 更有意思的目标。
我不确定如何外包烧录 microSD 卡的流程。我们使用定制的品牌 microSD 卡,生产它们的厂商很乐意帮我们把软件烧录上去。但我不太愿意这么做,因为我觉得恶意软件的风险太高。理论上,我可以随机抽检他们的产出,确保与我提供给他们的磁盘镜像一致,但即便如此也无法给我十足的信心。

我们目前使用的厂商可以帮我们把镜像烧录到 microSD 卡上,但我对此有所保留。
我们也可以继续自己烧录 microSD 卡,然后把它们寄给制造商。这假设制造商是诚实的,但这大概也是每家把电脑产品放到海外制造的公司所承担的同样风险。
测试组装好的设备
设备组装完成后,我们目前会手动测试,确保所有功能正常。
我们目前的测试设置缓慢、复杂,很难移交给制造商。它需要一名 TinyPilot 员工把新组装的 TinyPilot 接到一台目标计算机上,然后用第二台计算机的浏览器访问 TinyPilot 的 Web 界面。员工随后要等待 TinyPilot 启动完成,然后验证 TinyPilot 正在捕获目标计算机的画面,并且准确地转发键盘和鼠标输入。

TinyPilot 目前的 QA 流程需要两台笔记本电脑和不简单的线缆连接。
自动化这个流程一直在我们的待办清单上,但自动化需要硬件工程资源,而这正是我们目前最稀缺的资源。
写到这里,我意识到其实可以用通用硬件加上纯软件工程资源来解决这个问题。我们应该可以用一台 Raspberry Pi 搭建一个 TinyPilot 测试机。
Raspberry Pi 有 HDMI 输出和 USB 输入。我们可以编程让 Raspberry Pi 充当测试运行器,确认 TinyPilot 正在捕获来自 Pi 的 HDMI 输出的视频。Pi 还可以验证:当它指示 TinyPilot 发送一次按键时,Pi 通过其 USB 输入从 TinyPilot 收到了同样的按键。这项测试能让我们确信新组装的 Voyager 2 中的一切连接和功能都正常。

我们很可能可以通过把 Voyager 2 连接到 Raspberry Pi 并配合一些自定义脚本,来实现 QA 流程的自动化。
到那时,我们只需要在测试设备上加一个外部指示器,用来标示 TinyPilot Voyager 2 是否通过验证。这个测试设置足够简单,我们可以把 Pi 和网络交换机交给制造商,教他们如何在自己那边执行测试。
这是一个很好的例子:仅仅思考如何外包某项任务,即使最终没有真的外包,也能带来收益。
打包并发送客户订单
在我们工作流程的所有环节中,订单履约是目前最容易外包的部分。
我们始终有一批随时可发货的箱子,所以可以把它们交给 3PL 供应商,而不必存放在办公室里。

我们在办公室里保存预组装好的 Voyager 2 设备,放在随时可发货的箱子里。
外包履约的好处是,我们本来就很灵活的工作时间会变得更加灵活。目前,我们每周有六天每天安排几个小时的人员值守 TinyPilot 办公室。如果有 3PL 供应商,只要我们有足够的设备组装来维持订单流转,就不需要在任何特定日子有人待在办公室。
我们还能腾出办公室的物理空间,因为箱子和包装材料占用了我们小办公室里大量的空间。
另一个好处是客户会有更多的配送选项。我们目前只提供 USPS 和 DHL,因为协调每家快递公司都会增加复杂度。3PL 服务商本来就有各大承运商的每日揽收安排,所以他们很容易支持任何主流快递公司。
发货速度可能会略有提升,不过这一点意义不大,因为 TinyPilot 本来就在一个工作日内发出 90% 的订单。
缺点是 3PL 供应商会增加复杂度。现在,我们的客户服务体验非常好,因为客户给我们发邮件时,直接对话的是一位了解情况的 TinyPilot 员工。很可能正是同一位员工组装、打包或发出了他们的那台设备。他们还有权查询物流状态、取消订单以及安排退货。
如果一笔由 3PL 供应商履约的订单出了问题,TinyPilot 的客服代表就得先联系我们在 3PL 供应商那里的对接人,对接人可能还得去问另一个人,等等。
处理退货
我不知道没有办公室的话该如何处理退货。
我不会信任 3PL 供应商去翻新 TinyPilot 设备,但我也不想让他们直接销毁退货。
也许我们可以设一个单独的退货地址,就是一个邮政信箱。员工可以去邮局取回退货,翻新之后再寄给 3PL 供应商作为翻新品出售。
我还没有和 3PL 供应商谈过,所以他们也许对此有更好的解决方案。
当一切都外包出去之后会发生什么?
假设我们能成功地把所有办公室职能转移给第三方供应商或不依赖特定地点的替代方案,这对我和公司意味着什么?
我们将不再依赖特定地点
现在,我们被实体办公室束缚着。如果去掉办公室,理论上每位 TinyPilot 员工都可以在任何地方完成他们的工作。
我们将减少对时间的依赖
没有了履约和制造,我们唯一对时间敏感的职责就只剩客户支持了。
我们对员工缺勤的抵御能力更强
在过去几个月里,TinyPilot 本地团队的成员有几次连续几天无法上班。有些是计划内的休假,有些是因为生病。
TinyPilot 有足够的冗余,我们得以在不影响客户的情况下继续运转,但这确实让我们系统的其他部分承受了压力。
如果我们外包制造和履约,TinyPilot 应对员工缺勤就会容易得多。我们不必手忙脚乱地维持订单发货,因为我们不再是履约关键路径上的一环。
本地团队的角色会发生变化
外包的一个挑战是它对我们现有本地团队工作的影响。如果我们去掉 TinyPilot 办公室并把制造和履约外包出去,那会砍掉本地团队目前大约 75% 的工作。
本地团队干得很出色,我想确保即使去掉办公室,他们在公司里仍然有角色。
本地团队将继续承担客户服务工作。外包很可能让我们扩大销售规模,客户越多,对客服的需求也就越大。
本地员工还可以承担更多的对外拓展工作。过去,我们主动联系大客户、询问他们对产品体验的做法取得了积极效果。由于时间限制,我们做得不多,但如果腾出了时间,我们可以在这一领域投入更多。类似地,本地员工还可以联系更多评测者和 YouTube 创作者,这将有助于营销。
我们减少繁文缛节
目前,TinyPilot 的本地员工是公司里唯一在法律上被归类为雇员的人。其他所有人都是独立承包商。由于本地成员在现场办公,美国劳动法要求他们必须是雇员而不是承包商。
如果去掉 TinyPilot 办公室,雇员就可以变成承包商。我知道这一点听起来像是“我迫不及待要削减福利了!”,但我认为我们可以以一种让所有人都受益的方式完成转变。我的目标不是降低薪酬,而是减少压力和文书工作。
支付雇员和支付承包商之间的复杂程度差别巨大。几乎每个月,马萨诸塞州的某个政府部门都会寄给我一封莫名其妙的信,告诉我一些关于代扣税款或合规要求的事情,但从来不清楚我是否需要采取什么行动。
有一些服务可以帮助处理合规和正确纳税,但我从未找到一家做得特别好的。当我把政府通知转发给我的薪资服务商 Gusto 时,他们只会告诉我必须自己打电话给政府弄清楚。而当我打给州政府机构时,我被语音菜单转来转去,接电话的人对我收到的通知一无所知,最后我只能选择无视它,希望这是正确的做法。
承包商需要的文书工作少得多。我们可以调整薪酬,使员工的待遇与作为雇员时相当甚至更好,同时每个人的繁文缛节也更少了。
我们降低成本
外包还会降低成本,尽管这对我来说是最无趣的好处。
没有办公室后,我们不再需要支付房租($550/月)、Gusto 薪资服务($80/月)、库存跟踪工具($59/月)、工伤保险($30/月)或租客保险($10/月)。
人力成本理论上每台也能省下几美元,因为中国制造商可以用我们劳动力成本的一小部分来组装设备,而 3PL 供应商拥有规模经济,能够比我们更便宜地履约订单。
我们降低灵活性和敏捷性
把一切都外包出去是在优化我们的“理想路径”,但会让处理异常情况或纠正错误变得更难。
过去,我们能够快速迭代产品,减少外观瑕疵并提升易用性。全部外包之后,反馈循环会变慢。我们可能要等到好几位客户报告之后才能发现问题。到那时,可能已经有几百台通过了问题环节的设备正在运往客户或仓库的路上。
我们会提高出错率
外包几乎肯定会提高我们的出错率。我们目前的出错率已经接近于零。在过去 18 个月里,我们处理了大约 2,500 笔订单,只有两三次客户告诉我们发错了商品,或者商品到达时有制造缺陷。
我想即使是经验丰富的制造和履约供应商,也很难达到我们在内部实现的出错率。不过,我认为我们目前的出错率远低于让客户满意所需的水平。我们可以承受大约 0.3% 的出错率,而不会明显影响客户体验。
外包会增加还是减少复杂度?
我外包的主要目标是降低复杂度。我仍在努力把我的管理时间压缩到每周 20 小时。
我最担心的是,制造和履约恰恰是 TinyPilot 中最不需要管理的部分,所以外包并不能省回多少时间。当初为所有事情建立可重复的工作流程花了很多功夫,但从那以后基本上一帆风顺。
我需要介入制造和履约的时候,往往是零件短缺或者客户遇到足够特殊、需要上报给我的配送问题之类的事件。即使改用外部供应商,这些问题仍然会找到我头上,而且跨公司边界的管理会更困难。
与此同时,我又觉得与外部供应商合作肯定会比继续维护我们自己土生土长的制造和履约方案更容易。尽管我们的办公室运转顺畅,但仅仅是维护一个办公室及其配套的所有流程,就有相当大的心智负担。
我希望我们目前在复杂度上正处于一个局部最小值。切换流程带来的摩擦会增加复杂度,但我认为外包最终会把我们带到一个复杂度更低的状态。

业余项目
你好,Playwright;再见,Cypress
自从我看到 Gleb Bahmutov(格列布·巴赫穆托夫)在2018 年的一场 Web 开发者聚会上演示 Cypress 端到端测试工具以来,我就一直是它的粉丝。这些年,关于 Playwright——微软推出的 Cypress 竞品——的讨论越来越多。
一年前我试过 Playwright,当时印象并不深刻。最近我在读一个 Hacker News 讨论帖,里面的人似乎一致认为 Playwright 已经超越了 Cypress,于是我又给了 Playwright 一次机会。
现在我必须承认,我同意 Hacker News 的看法。作为一个实验,我用 Playwright 重写了 PicoShare 的所有端到端测试。我发现 Playwright 几乎在各个方面都比 Cypress 更好用。
我正在写一篇更长的文章介绍从 Cypress 迁移到 Playwright 的过程,简单来说就是:对于 Web 应用的端到端测试,我现在推荐 Playwright 而不是 Cypress。
总结
完成了什么?
- 发布了 TinyPilot Pro 2.5.0。
- 亲自回复了八月份申请支持工程师职位的每一位应聘者。
- 聘用了第二位 TinyPilot 支持工程师。
学到的经验
- 仅仅思考如何外包任务,就能发现现有工作流程中的改进机会。
下个月的目标
- 培养新的支持工程师。
- 我的目标是第一位能在无人协助的情况下回答 80% 的问题,第二位达到 50%。
- 启动第二个金属外壳原型的生产。
- 联系三家 3PL 供应商,洽谈履约业务交接的流程。
随机一篇博客