TinyPilot: Month 27

Michael Lynch

TinyPilot:第 27 个月

原文由 Michael Lynch 发布,订阅该博客

一句话总结

完全远程办公的 TinyPilot 会是什么样子?

亮点

  • 我正在做一个思想实验,思考 TinyPilot 是否可以在没有实体办公室的情况下运转。
  • 思考外包迫使我正视现有工作流程中的低效之处。
  • Playwright 这款端到端测试工具已经让我彻底信服。

目标完成情况

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

将 TinyPilot Pro 迁移至新一代更新系统

  • 结果:发布了 TinyPilot Pro 2.5.0,其中包含了新的更新系统。
  • 评分:A

此次发布最大的变化在于更新机制。过去 TinyPilot 会向 Git 服务器查询更新,并总是尝试更新到最新版本。现在,我们有了一个定制的网络服务,TinyPilot 会向它查询下一个版本。新的更新系统让我们对更新过程有了更多掌控,也让我们更容易测试新版本。

这次发布花了五个月,比我们任何人预期的都长。我们通常的发布周期大约是两个月。我期待新系统能帮助我们在未来更快地迭代和测试。

将 TinyPilot Voyager 寄给两位 YouTube 创作者或博主进行评测

  • 结果:由于要重新招聘,取消了这一目标。
  • 评分:不适用

我最终解聘了一名技术支持工程师,因此将精力转到了招聘继任者上。招聘很顺利,我在十月初聘到了一位新工程师。

探索新的外壳制造方案

  • 结果:已订购金属外壳原型。
  • 评分:A

这算是一个比较宽泛的目标,因为目前我仍在探索各种方案。过去我曾探索过注塑外壳,单件成本很低,但前期投入很高。现在我正在研究金属外壳,它的前期成本没那么高,而且便于规模化生产。

TinyPilot 数据一览

指标2022年8月2022年9月变化
独立访客11,9039,040-2,863 (-24%)
总浏览量23,21417,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%)

* 该利润数据只是根据我持有的现金变化所做的粗略计算,月中才会进行正式的账务核算。

数据一片惨淡的红色,看着吓人,但我认为这个月其实表现不错。看到又一个月营收超过 7 万美元,我感到很振奋。

利润下滑是因为我收到了一笔 1.1 万美元的原材料意外账单,追溯到六个月前。即便如此,月末出现如此大幅的亏损还是让我有些意外。我猜这主要是发票入账时间的问题,接下来几个月会逐渐拉平、回归正向。

金属外壳对 TinyPilot 意味着什么?

生产方面剩下的瓶颈之一就是外壳。我们目前采用 3D 打印外壳,使用的是打印速度较慢的高端材料,因此每月只能生产约 160 个外壳。而且我们只能依赖某一家特定的 3D 打印供应商,因为我们依靠的是马萨诸塞州的一项资助,而该资助只能通过这家供应商使用。

我们每月要卖出 200 多台设备,所以外壳很快就会成为限制因素。按目前的出货速度还能再维持几个月,是因为之前销量低于产能时我们囤积了一批外壳。

我们的硬件合作伙伴建议采用金属外壳,就像消费级网络设备上常见的那种:

TP-Link TL-SG1005P 五口金属交换机的照片

如果把 TinyPilot 换成这样的金属外壳会怎样?

金属外壳会降低成本,并消除每月 160 个的生产限制,因为我们每月可以生产数千个。

我们的硬件合作伙伴还随口提了一句,让我陷入思考:如果我们在中国生产外壳,那么也可以直接在中国组装设备。

起初,在中国组装对我并没有吸引力。我们在马萨诸塞州的组装流程运转良好,何必去折腾呢?

假设在美国每台设备的组装成本是 10 美元,中国厂商也许能做到 1 到 2 美元。每台节省 9 美元,还不足以抵消改变一个运转顺畅的流程所带来的各种风险。

但想到在中国生产,又让我开始思考这会如何改变 TinyPilot 的办公室。我们的货架上将不再堆满成百上千的外壳、USB 线和细小的橡胶脚垫,因为这些都会存放在制造商那里。如果原材料都放在制造商那里,制造商还可以负责库存管理、及时补货以维持生产。

接着,我开始问自己:我们是否还需要 TinyPilot 的办公室?

TinyPilot 办公室里都在做什么?

如今,TinyPilot 办公室主要承担六项职能:

  1. 存放库存
  2. 组装设备
  3. 烧录 microSD 卡
  4. 测试已组装的设备(质量保证)
  5. 打包和寄送客户订单
  6. 处理退货订单

没有自己的办公室,TinyPilot 还能完成这些职能吗?我们来一探究竟!

存放库存与组装设备

如果把生产搬到中国,库存管理实际上也就一并转移到了中国。

如果一切顺利,将库存和生产外包会大大简化 TinyPilot 的许多工作流程。另一方面,一旦出了问题,当制造商远在数千英里之外时,问题会严重得多。

如果海外制造商接管设备生产,TinyPilot 办公室里的大量工作会瞬间消失。办公室的大部分存储空间将被释放,因为我们只需要存放成品。库存追踪也会变得简单得多,因为我们只需追踪成品,而不再需要管理原材料或半成品。我们终于可以取消库存管理工具的订阅了——那是我们技术栈中最让人头疼、质量最差的一款软件。

进口环节应该会更省时。我们的大部分原材料都来自中国,如果一次性以成品的形式收货,管理起来要比零零散散地接收原材料容易得多。

我经常被卡在进口的关键环节上,因为 DHL 更倾向于拨打包裹上的电话,而不是给我们的客服邮箱发邮件。我们没有办公室电话,所以他们最后总是打到我的手机上。如果每月只有几批发货,数量少到我们的员工可以主动追踪物流并在对方来电前就缴清进口关税。而如果把外包生产与第三方物流(3PL)结合起来,我们甚至可以完全不用插手,因为制造商可以直接将货物发往第三方履约中心。

缺点在于,这要求我们对制造商给予极大的信任。在芯片短缺的情况下,我们不得不为数月甚至数年的生产囤积电子元器件。如果制造商弄丢了我们一整年的某种元件库存,我们就会陷入极其被动的境地。我们可以要求定期盘点、派遣第三方审计,但如果制造商只是轻描淡写地说一句“哎呀,我们弄丢了你价值 2 万美元的库存”,我也不确定自己能有什么补救措施。

TinyPilot 的产品会随着我们升级元器件或发现设计问题而经历许多细微调整。自主生产时,如果零件配合不够精准或某个元件受力过大,我们能很快发现。而交给海外制造商,反馈周期就会变慢。等我们发现问题时,制造商可能已经用同样的缺陷生产了数百台。

烧录 microSD 卡

每台 TinyPilot 都需要一张烧录了 TinyPilot 软件的 microSD 卡。目前我很有信心没有人篡改过这些卡,因为烧录后它们从未离开过我们的掌控。在我们与客户之间,唯一可能篡改 microSD 卡的就是快递方,而如果美国邮政(USPS)真想使坏,他们大概有比 TinyPilot 更值得下手的目标。

我还不确定如何外包烧录 microSD 卡的流程。我们使用的是定制品牌的 microSD 卡,生产厂家也很乐意帮我们烧录软件。但我对此有所顾虑,觉得恶意软件的风险太高。理论上我可以随机抽检他们的成品,确保与我提供的镜像一致,但即便如此也无法让我完全放心。

印有 TinyPilot 品牌的 microSD 卡照片

我们目前有一家可以为我们烧录镜像到 microSD 卡的供应商,但我对此仍有顾虑。

我们也可以考虑继续由自己烧录 microSD 卡,然后寄给制造商。这同样要假设制造商是诚信的,但这恐怕也是所有将电脑产品放在海外生产的公司都要承担的风险。

测试已组装的设备

设备组装完成后,我们目前会手动测试,确保所有功能正常。

我们现有的测试装置既慢又复杂,很难移交给制造商。它需要一名 TinyPilot 员工将新组装好的 TinyPilot 连接到一台目标电脑上,再用另一台电脑的浏览器访问 TinyPilot 的网页界面。员工需要等待 TinyPilot 启动,然后验证它是否正在捕获目标电脑的画面,并准确转发键盘和鼠标输入。

我们现有测试装置的手绘示意图

TinyPilot 现有的质检流程需要两台笔记本电脑和相当复杂的线缆连接。

自动化这一流程一直在我们的待办清单上,但实现自动化需要硬件工程资源,而这正是我们目前最稀缺的资源。

写到这里,我意识到我们或许可以用通用硬件加上纯软件工程资源来解决这个问题。我们应该可以用一台树莓派(Raspberry Pi)来做一台 TinyPilot 测试机。

树莓派有 HDMI 输出和 USB 输入。我们可以编写程序,让树莓派充当测试执行器,确保 TinyPilot 正在捕获来自树莓派 HDMI 输出的视频信号。树莓派还可以验证:当它指令 TinyPilot 发送一次按键时,树莓派能否通过来自 TinyPilot 的 USB 输入接收到同样的按键。这样的测试能让我们确信新组装的 Voyager 2 的各项连接和功能都正常工作。

潜在的简化测试装置手绘示意图

我们很可能可以通过将 Voyager 2 连接到一台运行定制脚本的树莓派来实现质检流程的自动化。

到那时,我们只需要在测试设备上加一个外部指示器,来显示 TinyPilot Voyager 2 是否通过验证。这套测试装置应该足够简单,我们可以把树莓派和网络交换机交给制造商,并教会他们如何在自己的产线上完成测试。

这是一个很好的例子:仅仅是思考如何外包一项任务,即使最终没有外包,也能带来好处。

打包与寄送客户订单

在我们整个工作流程中,订单履约是目前最容易外包的环节。

我们总会备有一批可直接发货的成品包装盒,因此完全可以把它们交给第三方物流供应商,而不是存放在办公室里。

纸箱包装中的 Voyager 2 照片

我们在办公室里存放着已预先组装好、可直接发货的 Voyager 2。

外包履约的好处在于,我们本就灵活的工作时间会变得更加灵活。目前,TinyPilot 办公室每周六天、每天安排几小时有人值班。如果有了第三方物流供应商,只要我们组装的设备足以维持订单流转,就不需要任何人在特定某天去办公室。

我们还能腾出办公室的物理空间,因为纸箱和包装材料在我们狭小的办公室里占用了大量地方。

另一个好处是客户将拥有更多物流选择。我们目前只提供 USPS 和 DHL,因为与每家快递公司对接都会增加复杂性。而第三方物流供应商本来就与各大快递公司有每日取件合作,因此他们很容易支持任何主流快递。

发货速度或许会略有提升,不过这一点没那么重要,因为 TinyPilot 已经有 90% 的订单能在下一个工作日内发出。

缺点是引入第三方物流会增加复杂性。目前,我们的客服体验非常出色,因为当客户发邮件来时,他们直接对话的是熟悉业务的 TinyPilot 员工。很有可能,正是这位员工组装、打包或寄出了他们那台设备。他们也有权查询物流状态、取消订单和安排退货。

如果由第三方物流履约的订单出了问题,TinyPilot 的客服代表就得先联系我们在第三方物流那边的对接人,而对方可能又要再去找其他人,如此层层转达。

处理退货

我还不知道如果没有办公室,我们该如何处理退货。

我不放心让第三方物流来翻新 TinyPilot 设备,但也不想让他们直接把退货销毁掉。

也许我们可以设一个单独的退货地址,就用一个邮政信箱。员工可以去邮局取回退货,进行翻新,然后再寄给第三方物流供应商作为翻新机出售。

我还没和第三方物流供应商谈过,所以他们很可能有更好的解决方案。

如果一切都外包,会发生什么?

假设我们能够成功地将所有办公室职能转移给第三方供应商或与地点无关的替代方案,这对我和公司意味着什么?

我们将实现地点无关

目前,我们被实体办公室所束缚。如果取消办公室,理论上每一位 TinyPilot 员工都可以从任何地方完成工作。

我们对时间的依赖会降低

没有了履约和生产,我们唯一对时间敏感的职责就只剩下客户支持了。

我们对员工缺勤的抵御能力会更强

过去几个月里,TinyPilot 本地团队的成员有好几次连续多日无法工作。有些是计划好的休假,有些则是因病缺勤。

TinyPilot 有足够的冗余,让我们在不影响客户的情况下维持运转,但这确实给系统的其他环节带来了压力

如果我们将生产和履约外包,TinyPilot 应对员工缺勤就会容易得多。我们将不再手忙脚乱地保证订单按时发出,因为我们已不再处于履约的关键路径上。

本地员工的角色将发生变化

外包的一个挑战在于它对现有本地员工工作的影响。如果我们取消 TinyPilot 办公室并外包生产和履约,本地团队目前约 75% 的工作将被消除。

本地团队的工作非常出色,我希望确保即使取消办公室,他们在公司中仍有岗位。

本地团队仍将承担客服工作。外包很可能会让我们扩大销售规模,客户增多也就意味着对客服的需求更大。

本地员工还可以承担更多的外联工作。过去,我们主动联系大客户、询问他们对产品的使用体验,曾取得过积极的效果。我们之前因时间所限做得不多,但如果能腾出时间,就可以在这方面投入更多。同样,本地员工也可以与更多的评测者和 YouTube 创作者合作,这将有助于市场推广。

我们能减少繁文缛节

目前,TinyPilot 的本地员工是公司里唯一在法律上被归类为雇员的人,其他人都是独立承包商。由于本地员工在办公场所工作,美国劳动法要求他们必须被认定为雇员,而不能是承包商。

如果取消 TinyPilot 办公室,雇员就可以转为承包商。我知道这听起来像是“我迫不及待要削减福利了!”,但我认为我们可以以一种对各方都有利的方式完成这种转变。我的目标与其说是降低薪酬,不如说是减少压力和文书工作。

向雇员和向承包商付款的复杂程度有天壤之别。几乎每个月,马萨诸塞州的某个政府部门都会给我寄来一封晦涩难懂的信,讲一些关于预扣税或合规要求的事,但信中从未说清楚我到底需要采取什么行动,甚至是否需要采取行动。

市面上也有帮助处理合规和正确缴税的服务,但我从未找到一家做得特别好的。当我把政府通知转发给我的薪资服务商 Gusto 时,他们只是告诉我得自己打电话去问政府、自行解决。而当我拨打州政府机构的电话时,又会在语音菜单中被转来转去,最后接电话的人对我收到的通知一无所知,于是我只能置之不理,祈祷这样做是对的。

承包商需要的文书工作要少得多。我们可以调整薪酬,让员工获得与作为雇员时相当甚至更好的报酬,同时对每个人来说都减少了繁文缛节。

我们能降低成本

外包也会降低成本,尽管这对我来说是最不值得关注的好处。

没有办公室后,我们就不再需要支付房租(550 美元/月)、Gusto 薪资服务费(80 美元/月)、库存管理费(59 美元/月)、工伤保险(30 美元/月)或租客保险(10 美元/月)。

理论上,单位人工成本也会降低几美元,因为中国制造商的制造成本仅为我们的零头,而第三方物流供应商凭借规模效应,能够以比我们更低的成本完成订单履约。

我们会降低灵活性和敏捷性

将一切外包会优化我们的“理想路径”,但会让处理例外情况或纠正错误变得更困难。

过去,我们能够对产品进行快速迭代,以减少外观瑕疵并提升易用性。一旦全部外包,反馈周期就会变慢。我们可能要等到多位客户反馈后才会发现问题。而到那时,可能已有数百台设备越过了出现问题的环节,正被运往客户或仓库的途中。

我们的出错率会上升

外包几乎肯定会提高我们的出错率。我们目前的出错率已接近于零。在过去 18 个月中,我们处理了约 2500 笔订单,只有两三起客户反馈我们发错了商品或商品存在制造缺陷。

我想,即便是经验丰富的生产和履约供应商,也难以达到我们自主完成的低出错率。不过,我认为我们目前的出错率远比维持客户满意度所需的水准要好。即使出错率达到 0.3% 左右,也不会对客户体验造成显著影响。

外包会增加还是降低复杂性?

我外包的主要目的是降低复杂性。我仍在努力将自己的管理时间压缩到每周 20 小时

我最大的担忧是,生产和履约恰恰是 TinyPilot 中最不需要管理的环节,因此外包并不能为我节省时间。前期为了建立可重复的工作流程投入了大量精力,但自那以后,一切基本都顺风顺水。

需要我介入生产和履约的,往往是零件短缺或客户遇到足够特殊、需要升级到我这里的配送问题。即使换成外部供应商,这些问题仍需我介入,而且跨公司协调会更难处理。

与此同时,直觉又告诉我,与外部供应商合作肯定比继续维护我们自建的生产和履约体系要轻松。尽管办公室运转顺畅,但仅仅是维持办公室本身及相关流程,就带来了相当大的心智负担。

我希望我们目前在复杂性上正处于一个局部最低点。切换流程的摩擦会暂时增加复杂性,但我认为外包最终会让我们达到一个更低复杂度的状态。

图表显示:随着我们不断优化流程,复杂性逐渐下降;在外包时会急剧上升;而当外包流程理顺后,复杂性会降至低于当前水平的状态。

业余项目

你好,Playwright;再见,Cypress

自从 2018 年在一场前端开发聚会上看到 Gleb Bahmutov 演示 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。
  • 向每一位在 8 月份申请技术支持工程师职位的人都做了亲自回复。
  • 聘请了第二位 TinyPilot 技术支持工程师。

经验教训

  • 仅仅是思考如何外包任务,就能发现现有工作流程中的改进机会。

下月目标

  • 让新入职的技术支持工程师快速上手。
    • 我的目标是让第一位能够独立回答 80% 的问题,第二位能独立回答 50%。
  • 启动第二版金属外壳原型的生产。
  • 联系三家第三方物流供应商,洽谈履约环节的过渡流程。

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

评论