TinyPilot: Month 23

Michael Lynch

TinyPilot:第 23 个月

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

一句话总结

历时八个月的改版终于完成了!

亮点

  • TinyPilot 网站改版终于完成。
  • 我学会了制作 Debian 软件包,其实比想象中简单得多。
  • 我已经放弃了 Vue 以及所有前端框架。

目标评分

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

发布一篇关于使用 TinyPilot 搭建家庭实验室 NAS 服务器的博文和视频

这是我一年多来第一篇非回顾或年终总结的博文。它在 reddit 上的反响一般,但在 Hacker News 上冲上了第 2 名

这篇博文为 TinyPilot 官网带来了大量访客,当月独立访客达到 1.4 万,创下历史新高,比之前的最高纪录高出 30%。我花了大约 45 小时撰写文章和制作视频,能取得这样的成果,也算对得起付出的精力了。

完成 TinyPilot 网站改版

  • 结果:终于完成了!
  • 评分:A

改版终于完成了。过去四个月里,每个月我都以为项目马上就要收尾了,结果总有意外导致延期。现在终于正式完工了。

聘请一家营销代理机构或自由职业者

  • 结果:6 月初聘请了一位自由职业者
  • 评分:B

我找到一家看似合适的代理机构,但总觉得有点不靠谱。我们已经谈好了为期三个月合同的价格,可在我答应之后,他们又要求改成至少签五个月。这是一个很大的危险信号。我继续尝试与他们协商,但他们的方案都让人觉得不太可信,最终我结束了洽谈。

幸运的是,我的电子工程合作方给我推荐了一位数字营销自由职业者。第一次通话,他就比我之前接触过的所有人都更合拍,于是我当场就聘用了他。

TinyPilot 数据一览

指标2022 年 4 月2022 年 5 月变化
独立访客5,26814,296+9,028 (+171%)
总浏览量11,97424,131+12,157 (+102%)
销售收入$43,771.00$54,844.20+$11,073.20 (+25%)
企业订阅$47.75$47.750
版税$2,253.61$3,269.56+$1,015.95 (+45%)
总收入$46,072.36$58,161.51+$12,089.15 (+26%)
利润-$19,392.76$6,445.38+$25,838.14 (+inf%)

这个月在访客和销量方面表现强劲。访客量几乎增长了两倍,销量也提升了 25%。

大部分访客来自 Hacker News,但似乎对销量影响不大。在文章登上 Hacker News 之前,销量就已经有望比 4 月增长约 25%。效果可能会有所滞后,因为 6 月初的开局异常强劲。

TinyPilot 网站改版

唉,改版这事。

该怎么说呢?

这个项目已经拖了好几个月,总感觉再过几周就能结束。

在项目初期面试设计师和代理机构时,我告诉他们,我想花 8000 至 15000 美元,做一个持续两三个月的改版。我明确表示,绝对不想陷入那种要花六个月、投入 4 万美元之后才能看出改版是否对销量有实际影响的境地。

结果,项目做了八个月,花了 4.6 万美元。我恰恰掉进了自己最想避免的坑里。

我会专门写一篇长文来聊这次经历,但主要的教训有:

  • 范围定得太宽:我本应该严格控制范围,先从品牌重塑做起,再让代理机构扩展到全面改版。
  • 工时汇报太慢:我本应该要求代理机构实时向我汇报计费工时,而不是延迟两周才给。如果我看不到一项任务花了多长时间,就无法在发现超出预期时及时调整范围。
  • 进度需要更透明:我本应该要求对方更及时地沟通时间安排,这样就不会对项目拖了这么久感到意外。
  • 管理时间投入不足:我原以为一家每月工作 40 小时的代理机构,和一位每月工作 40 小时的自由职业者,需要的管理开销差不多。但代理机构涉及更多人,人越多就需要更多管理

不过,还是来看看成果吧。这次改版涉及结账流程中的三个页面:落地页、产品页和购物车页面:

旧版落地页截图新版落地页截图

落地页改版前后对比

旧版 Voyager 2 产品页截图新版 Voyager 2 产品页截图

产品页改版前后对比

旧版购物车页面截图新版购物车页面截图

购物车页面改版前后对比

抛开花销不谈,我对结果还是满意的。我觉得新设计无疑比之前好得多,新的 Logo 和图片让项目看起来更专业、也更有辨识度。

那么,新设计真的值 4.6 万美元吗?

如果能回到过去,我肯定不会为改版花这么多钱、投入这么多时间。不过,它仍有可能收回成本。

除去固定成本,TinyPilot 销售收入的 70% 是利润。这意味着改版需要带来 6.6 万美元的额外销售额才能回本。如果它能让销量提升 10%,那么月均销售额就会从 5 万美元涨到 5.5 万美元,大约一年就能回本。如果更好的营销能吸引更多访客,回本还会更快。

Debian 软件包其实很简单

TinyPilot 有一个比较奇怪的设计决策,就是它的安装和更新机制。我们用的是 Ansible,这是为运维工程师大规模批量部署系统而设计的工具。我用 Ansible 来配置第一版 TinyPilot 原型的树莓派,当时能跑通,我们就一直沿用了下来。

我知道在 Linux 上有更好的软件安装方案,但我没有相关经验。TinyPilot 对树莓派硬件功能的配置有特殊要求,我很担心用标准安装工具来满足这些需求会非常麻烦。于是我们继续使用 Ansible,毕竟它能正常工作,也没出过什么问题。虽然速度慢,本来几秒钟就能完成的安装要花两分钟,但也还能接受。

两年过去了,我们已经快把 Ansible 用到极限。安装过程变得越来越复杂,更新一次甚至要花五分钟以上。

我以前也考虑过 Debian 软件包(比如 apt-get),但听说 Debian 的打包工具不好用。再加上还要涉及仓库服务器、密钥对和软件包签名流程?光是搭好基础环境似乎就要费很大劲,之后要实现我们的需求更是会非常痛苦。

作为一次尝试,我试着构建了一个 Debian 软件包,结果发现远比我担心的要简单。Debian 软件包本质上就是具有特定目录结构和几个特殊文件的 tar 包。我大约用了一小时就做出了第一个可用的 .deb 文件。

而那些仓库服务器和密钥对?其实是可选的。你完全可以直接分发 .deb 文件,根本不需要仓库。

debhelper 这个官方打包工具确实和传闻中一样让人困惑、难以使用,但其实并不需要它。我们发现直接跳过 debhelper、手动生成 Debian 的元数据文件反而更简单。

更棒的是,我们不需要一次性从 Ansible 惊险地切换到 Debian 软件包。可以按照自己的节奏,逐步把逻辑从 Ansible 迁移到 Debian 软件包上。

我们的第一个 Debian 软件包是给 Janus 这个开源 WebRTC 服务器做的。以前我们需要在每台设备上从源码编译,要花大约 30 分钟。现在用新的 Debian 软件包,几秒钟就能装好。而且即便我们需要的是 32 位 ARM 二进制包,也可以在 x64 云服务器上借助 Docker 的 QEMU 集成来构建。所有用于编译和打包的代码都已开源

以下是对我们学习 Debian 打包有帮助的资料:

搜索广告趋于平稳

上次统计时,Google 搜索广告的效果看起来非常好。我在 Google Ads 上每花 1 美元就能赚 0.69 美元的利润。但随着时间推移、数据增多,现在的情况就没有那么乐观了。

上个月统计时,我把 4 月和 5 月第一周的数据都算了进去。而第一周的数据其实是个异常值,所以按月细分后,利润就没那么高了:

指标4 月5 月
广告支出$804.12$4,283.71
展示次数5,270239,498
点击次数3513,327
点击率 (CTR)6.6%1.4%
单次点击成本 (CPC)$2.29$1.29
转化带来的收入$1,314.91$7,649.60
广告支出回报率 (ROAS)1.631.79

我的收入中约有 30% 要用于硬件和人力成本,所以 ROAS 达到 1.43 时大致就是盈亏平衡(1.43 - 30% = 1.0)。高于这个数值就是盈利。以 1.79 来看,我在广告上每花 1 美元仍能赚 0.26 美元,所以我会继续投放。

TinyPilot 新聘的数字营销顾问审核了我的 Google Ads 账户,发现了几个在低价值关键词上花费过多的地方,因此未来几个月我们很可能会改善这些数据。

业余项目

PicoShare

PicoShare 是我在 3 月发布的一款开源工具,用于分享那些因体积过大而无法通过邮件发送的文件。

5 月,我新增了上传后编辑文件元数据的功能:

PicoShare 中元数据编辑界面截图

5 月,我在 PicoShare 中加入了编辑文件元数据的功能。

最初,你只能在上传时为文件添加备注和选择过期时间,而且一旦确定就无法更改。现在,PicoShare 更加灵活,允许你随时修改文件的元数据和过期时间。

加入编辑页面后,我意识到这也是让删除文件更不容易误操作的好机会。以前,只要在文件列表中点击删除按钮,文件就会立刻被删除——没有确认,也无法撤销。现在,删除文件需要先进入编辑页面,点击删除,再确认删除:

PicoShare 中删除确认对话框截图

我增加了一个确认对话框,以减少误删文件的情况。

WanderJest

2020 年初,我曾在开发 WanderJest,这是一个帮助人们发现附近现场喜剧演出的网站。我在 3 月因疫情暂停了这个项目。随着生活逐渐恢复正常,我在周末和晚上又重新拾起了 WanderJest。

在开发 PicoShare 时让我印象深刻的一点是,更简单的技术栈能显著提升我的开发速度:

PicoShareWanderJest
后端GoGo
前端Go templates + HTML5Vue 2
数据存储SQLite + LitestreamFirestore

Firestore 会拖慢我的速度,因为它的结构变更非常困难。我所知道的唯一方法就是编写自定义的迁移代码并部署到生产服务器。而使用 SQLite,我只需下载生产数据库,写几条 SQL 语句摆弄一下,然后再推送到服务器即可。

我现在正在重构 WanderJest,用 Go 模板替代 Vue,用 SQLite 替代 Firestore。

WanderJest 现有线上站点截图基于 Go 重构的新版 WanderJest 站点截图

现有的基于 Vue 的 WanderJest 站点(左)与正在用 Go HTML 模板重构的新版 WanderJest(右)对比

用 Go 写前端比我预想的要简单。前期的体验不如 Vue 那么好。我很想要条件渲染或响应式属性这类功能,而在原生 JS 中是没有的。但总体来说,用 Go 渲染页面要简单得多。

使用 Vue 时,我在页面上渲染数据的流程是:

  1. 后端从数据存储中检索数据。
  2. 后端生成一份仅包含希望与前端共享属性的数据副本。
  3. 后端将数据序列化为 JSON。
  4. 前端从后端获取 JSON 数据。
  5. 前端根据从后端获取的数据填充页面元素。

相比之下,用 Go 模板渲染页面只需两步:

  1. 后端从数据存储中检索数据。
  2. 后端用数据存储中的数据填充页面模板。

当你在 Go 中渲染前端时,就可以省去所有关于后端向前端暴露哪些数据、如何序列化和反序列化、以及如何管理本地缓存的工作。

要等到实现与 Vue 版本功能对等后才能确定,但我估计总代码量能减少约 50%。

总结

完成了什么?

  • 完成了 TinyPilot 网站改版。
  • 发布了新版 TinyPilot。
  • 发布了一篇关于家庭实验室 NAS 服务器的新博文。
  • 聘请了一位数字营销自由职业者。

经验教训

  • Debian 软件包比看起来要简单。
  • 不用前端框架,生活更轻松。

下月目标

  • 为 TinyPilot 创建一个自包含的安装 tar 包。
  • 完成关于 TinyPilot 网站改版的长篇博文初稿。
  • 将付费搜索广告的 ROAS 提升至 2.0。

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

评论