My Seventh Year as a Bootstrapped Founder

Michael Lynch

我作为自筹创始人的第七年

七年前,我辞去了在 Google 做开发者的工作,创办了自己的自筹资金软件公司。每年,我都会发布一篇年度回顾,分享进展以及作为独立创始人的生活。

我卖掉了公司

过去一年我职业上最重要的进展,是卖掉了我在 2020 年创办的公司 TinyPilot

我和妻子想组建家庭,我觉得自己无法同时兼顾一家七人公司的唯一管理者身份和一个新生儿的好父亲角色。我找到了一位愿景与我一致的买家,我们在 2024 年 4 月完成了交易。

我向乘坐小型螺旋桨飞机飞走的 TinyPilot 吉祥物挥手告别的插图

我卖掉 TinyPilot 去组建家庭

我已经写过文章并在播客中分享这次出售以及学到的教训,但简而言之,我很感激一切都顺顺利利。

我成为了新手父母

八月,我和妻子迎来了我们的第一个孩子——一个儿子。

出生后不久,一位护士为我们三人拍了一张漂亮的合影,我放在了下面。出于对儿子隐私的保护,我用手调的快速傅里叶变换处理了这张照片,去除了生物识别细节:

我家的火柴人简笔画

我、妻子和新生儿子的合影,经隐私保护滤镜处理后

我很感激作为独立创始人所拥有的灵活性,也感激 TinyPilot 出售的时机——过去的五个月是我一生中最幸福的时光。

我投入了教育类产品

我在四月卖掉了 TinyPilot,但一直留到五月中旬帮助新主人完成过渡。

我儿子预产期在八月,我知道他出生后会休假一段时间。这样我就剩下三个月来开启新项目,但它必须是我能在搞定有娃后的生活的那几个月里暂时搁置的东西。

我决定这三个月最适合做的产品是一门可下载的课程或一本书。教育类产品的工作很容易暂停,即使有了付费用户,也不需要维护服务器或回答客服问题。

我唯一一次制作教育类产品的经验是在 2021 年。当时我录制了一门关于面向技术受众的博客写作的视频课程。它在第一年赚了 7.6 千美元,之后又赚了 2.2 千美元。按课程创作者的标准不算爆款,但我只花了大约 100 小时制作,而且我为内容感到自豪。这是自成为独立创始人以来我做过的投资回报率最高的项目。

我 2021 年关于面向技术受众的博客写作的课程在四年里总共赚了 1 万美元。

夏天里,我基于 2021 年博客课程的素材进行了修订。我先通过每周一次的直播视频课教给一小批学员。我的计划是根据学员反馈继续打磨课程,然后录制最终的可下载版本进行销售。

直播课效果还行,但学员反馈说他们更想学习写作技艺,而不是如何吸引读者。我本来还想完成这门课,但儿子提前几周出生了,所以录制始终没能完成。

儿子出生后,在家录视频变得更困难了,于是我转而写一本书,主题是面向开发者的高效写作技巧。我正在逐章发布,并根据读者反馈迭代内容。

那门只录了一半的博客课程还剩下一堆视频,我还没想好怎么处理,所以先分享其中一支——讲的是如果知名的自筹创业作家 Patrick McKenzie(帕特里克·麦肯齐)向你发起博客对决,为什么你应该答应:

我学了些很酷的技术

运营 TinyPilot 时,我没有时间做技术工作,这让我很郁闷,因为我热爱写软件。

我一直热爱编程,但在过去一年里,我从未觉得它如此令人兴奋。那些免费提供的优秀开源软件让我惊叹不已。

Nix

过去一年对我工作影响最大的技术是Nix 和 NixOS

Nix 是一个像 apt-getyum 这样的包管理器。它也是一个像 CMake 或 Bazel 这样的构建工具。通过融合这两种功能,Nix 让管理软件项目中的依赖并将其打包分发变得轻松。

我一直在一点点地采用 Nix,但我太喜欢它了,以至于现在每个编程项目都用 Nix,所有电脑都跑 NixOS。

  • 适合谁尝试?
    • 欣赏 Docker、Ansible 和 Terraform 这类 Infrastructure as Code(基础设施即代码)工具的开发者。
  • 我的推荐理由是什么?
    • 在软件项目中,Nix 让你用源码定义所有依赖。任何人都能用一条命令复现你的环境。
    • NixOS 是围绕 Nix 理念设计的 Linux 发行版。NixOS 让你用纯文本文件定义整台电脑的配置,可以轻松地从零重建系统或回滚到之前的配置。
    • Nix 拥有 Docker 的许多优点,但 Nix 包比 Docker 镜像更易于组合。
  • 有什么缺点?
    • Nix 学习曲线陡峭,我还没找到一本好的面向开发者的入门指南。最接近的是NixOS in Production(《生产环境中的 NixOS》),它是面向 DevOps 工程师的。
    • 围绕一个叫“flakes”的功能存在分歧。如果你用了 flakes,就很难看懂不用它的教程和文档,反之亦然。
    • 由于领导不力,Nix 社区处于不太健康的状态。
    • 在持续集成(CI)中,Nix 在小规模场景下表现不佳。除了换成 Nix 专用的 CI 服务商,我还没找到能在 55 秒内跑完任何依赖 Nix 的 CI 任务的方法,见在 55 秒内
  • 怎么入门探索?
    • 小步尝试 Nix。哪怕只学 Nix 功能的一小部分,也能获得巨大收益。
    • 使用Determinate Systems 安装器安装 Nix,然后试着用 nix shell 运行一个程序(例如 nix shell -p cowsay 然后 cowsay howdy, human)。搜索包仓库,看看所有可以一行命令安装的包。
    • 如果你喜欢临时 shell,可以为你的某个项目创建一个开发 shell,这样就能用单个文件管理所有依赖和开发工具。

htmx

朋友们已经夸了 htmx 好几年,但我一直没 get 到它的理念。

“你能让 HTML 的 <button> 元素发送 POST 请求?那又怎样?”

后来,在一次长途飞行中,我读了关于 htmx 理念的免费电子书Hypermedia Systems(《超媒体系统》)。这本书让我意识到,htmx 的价值不在于让 <button> 能发送 POST 请求——而在于无需让开发者编写定制 JavaScript 或陷入深层抽象,就能为 HTML 带来简单的交互性。

我一直知道 Web 开发涉及大量繁琐的 JavaScript,但早已将其视为常态。HTML 和 CSS 负责展示,JavaScript 负责交互。两者之间一定需要胶水代码,而胶水代码本质上就很无聊。

htmx 的主张是,通过把更多交互性带到 Web 应用的 HTML/CSS 部分,你可以消除胶水代码和样板 JavaScript。而且无需引入 npm、Webpack 和庞大前端框架那样的复杂性和依赖。

  • 适合谁尝试?
    • 比起 React 和 Vue 这类重型框架,更偏爱原生 JavaScript 或 jQuery 的开发者。
  • 我的推荐理由是什么?
    • htmx 会让你意识到自己一生写了多少不必要的 JavaScript。
    • htmx 是一个库而非框架,所以采用 htmx 不像 React 或 Vue 那样需要全盘投入。你可以在 Web 应用的单个表单上试试 htmx,看是否喜欢。
    • 没有构建步骤,所以你不需要把代码丢进 Webpack / Node.js 来生成纯文本的 HTML、CSS 和 JavaScript。你写的代码就是在浏览器中运行的代码。
  • 有什么缺点?
  • 怎么入门探索?

Zig

Zig 的理念是,仍有一些程序需要用 C 这样的底层语言来写,但如果继续用已有 50 年历史的编程语言来写,我们就是在自找麻烦。

Zig 提供了与 C 相同的能力和性能,但利用了 C 诞生时还没有的硬件和编译器进步。

我立刻爱上了 Zig 的理念,但一直找不到合适的项目来用它。我已经有 15 年没在个人项目中用过 C 或 C++ 了。我通常做的是小型的 Web 应用,而 Zig 并不是做这类应用的最佳工具。

我仍然觉得 Zig 非常有趣。如果我带着一台笔记本但没有网络被困荒岛一年,我幻想的活动就是把我童年时的一款电脑游戏的开源重制版(例如 Age of Empires IICommand and Conquer)从粗糙的 C++ 代码移植成优雅的 Zig。

  • 适合谁尝试?
    • 对这些语言的现代化重塑感到好奇的 C/C++ 程序员。
  • 我的推荐理由是什么?
    • Zig 是我很长时间以来编程最开心的一次,而我本来就觉得编程挺有乐趣。用极低抽象层级编码有一种额外的乐趣,完全掌控应用触碰一块内存的次数让我感到兴奋。
    • Zig 针对显式的控制流和内存分配进行了优化,所以我觉得 Zig 代码很容易推理。
    • Zig 社区热情而积极。每当我提问,总能得到耐心、有帮助的回答。当我分享自己的Zig 教程时,社区也会热情地欢迎。
  • 有什么缺点?
    • 还没有稳定的 1.0 版本。每次更新到最新的 Zig 编译器,你很可能都得重写部分代码。
    • 由于编译器频繁变动,你通常需要调整在博客文章中读到的示例,有时甚至是官方语言文档中的示例。
    • 我还没找到学习这门语言的好资源。目前还没有 Zig 的书籍。我主要是通过拼凑零散的博客文章、论坛讨论和Zig 语言规范来学习。
  • 怎么入门探索?
    • 挑一个你通常会用 C 或 C++ 写的简单程序,改用 Zig 来写。
    • 试试Ziglings,这是学习 Zig 的入门练习。
      • Ziglings 练习依赖 Zig 编译器的预发布版本。如果你有 Nix,获取最新预发布 Zig 编译器的简单方法是运行:nix shell 'github:mitchellh/zig-overlay#master'

结合 Nix 的 Fuzz testing(模糊测试)

你可能以为我已经说完 Nix 了。还没呢!

我一直想尝试 Fuzz testing 来寻找安全漏洞,因为自我十年前在 VLC 中发现一个严重漏洞后,就再也没用过 Fuzzing 工具。

我很喜欢Antonio Morales(安东尼奥·莫拉莱斯)2021 年的 Fuzz testing 教程,但所有练习都涉及大量枯燥的准备工作,只是为了搭建一个可用的 Fuzzing 环境。

我尝试了用 Nix 实现 Fuzzing 工作流,体验好太多了。我真希望有时间用 Nix 做更多 Fuzzing 教程,因为我觉得大家都低估了 Nix 作为 Fuzzing 工具的潜力。

  • 适合谁尝试?
    • 任何做 Fuzz testing 的人,尤其是针对 C/C++ 代码的。
  • 我的推荐理由是什么?
    • Nix 让 Fuzzing 工作流可复现。
      • 一旦你在 Nix 下让 Fuzzer 跑起来,任何人都可以通过输入 nix run来运行你的 Fuzzing 配置。他们不需要去琢磨依赖,因为 Nix 会自动复现你使用的精确环境。
    • Nix 简化了依赖安装。
      • Nix 拥有所有包管理器中最大的包仓库之一。如果你的 Fuzzing 目标有依赖,它们很可能已经在 Nix 包仓库中可用,所以你不必为每个依赖琢磨特殊的构建流程。
    • Nix 简化了自定义补丁。
      • 如果你需要打自定义补丁来对目标进行 Fuzzing,Nix 能让你轻松应用这些补丁,并将补丁文件与 Fuzzing 工作流的其余部分保存在同一源码树中。
    • Nix 会缓存构建。
      • 如果你尝试不同的编译选项,不必每次都从零开始编译。Nix 会记住你之前是否用相同选项编译过,并复用那次构建。你再也不用执行 make clean 或手动删除二进制文件。
  • 有什么缺点?
    • 你必须弄清楚如何通过 Nix 来构建你要测试的代码,这多了一层抽象。
    • Nix 会施展魔法帮你构建基于 CMake 的项目,但 Nix 的构建选项全是隐式的,这让它的行为难以理解。
    • 我在让 Nix 生成调试符号时遇到了困难,到现在也不确定自己哪里做错了。
  • 怎么入门探索?
    • 试试我的新手友好教程,了解我如何使用 Nix 和 honggfuzz 为一个开源 PDF 阅读器创建 Fuzzing 工作流。

这一年总体怎么样?

每年我都会问自己是否还享受做独立创始人。

过去几年里,我很难回答这个问题。运营 TinyPilot 时,我为公司感到自豪,也很享受与 TinyPilot 团队共事,但我觉得硬件公司的节奏和复杂度对我来说太重了。

今年,我重新享受了做独立创始人的感觉。我喜欢能有自由花这么多时间陪妻子和儿子。我很感激复工的时机完全由我自己决定,我可以完全掌控如何以及何时将工作融入有娃后的生活。

出售 TinyPilot 的过程充满压力、令人不快,但回过头看,我记得的是和妻子、朋友们在马萨诸塞州西部即兴来了一场甜点之旅的庆祝。

五月,一位 Google 的招聘人员免面试邀请我回去做原来的工作,而我完全没有动心。

我依然享受作为独立创始人的生活,并希望尽可能长久地做下去。

学到的教训

不工作也没关系

儿子出生前,我一直在纠结该休多久。显然,休一个月没问题。但如果一个月可以,为什么不是两个月?为什么不是四个月?为什么不是一年?

儿子出生后的几个月里,我突然没有了空闲时间。我开始纠结一个更可怕的问题:如果有了孩子后,即使我想回去工作也回不去了怎么办?如果我再也找不回足够的不间断时间来写作和编程怎么办?

我深吸一口气,意识到我之所以“没有空闲时间”,是因为每周有好几天,我都会和妻子、儿子一起在市中心长时间散步,享受户外早午餐。或者我们会招待远道而来见宝宝的访客。我得提醒自己,这些都是我喜欢做的好事,而如果我决定恢复工作,时间依然在我掌控之中。

最终,我回归工作是自然而然发生的,并没有与家庭时间冲突。我和妻子找到了一种适合我们的育儿平衡,随着儿子长大和其他家人也加入帮忙带娃,我们还在不断调整。

只有别人能照着文档执行,流程才算真正被记录下来

在 TinyPilot 出售前的几个月里,我专注于尽可能多地把工作委派给团队其他成员。我不希望新东家接手后,因为只有我会做某项关键任务而感到无法完成。

我以为委派会很容易,因为我们对所有事情都有操作手册,即使是我自己做的任务也是如此。当我开始把任务交给队友时,才意识到我负责的那些“已记录”流程其实大多只存在于我的脑海里。像“撰写发布公告”或“更新公开更新日志”这样的步骤,远比简短的描述要复杂。

现在我认为,只有当同事能够仅靠文档就完成整个流程时,这个流程才算真正被记录下来。

卖给现金买家能大幅降低风险和文书工作

出售 TinyPilot 最大的教训之一是成交周期有多重要。我没意识到交易每拖一个月,卖方就要承担多少额外的风险和文书工作

一名男子在数周内收到尽职调查请求后变得越来越虚弱的漫画

买方的融资方式对成交时间有重大影响。如果买方从银行借款,银行就成了交易中的关键决策者。银行行动缓慢,要求大量文书,而且很难谈判,因为他们不在乎交易是否告吹。

如果我再卖一家公司,我会提供激励来吸引手握现金的买家

对去年目标的评分

去年,我设定了三个宏观目标,希望在这一年内实现。以下是完成情况:

每周用 20 小时管理 TinyPilot

  • 结果:将管理工作缩减至每周 20 小时
  • 评分:A

我在四月卖掉了公司,所以这一年只有很短时间在管理 TinyPilot,但我终于实现了每周仅用 20 小时管理的目标。这已经是过去三年里反复出现的目标了。

最终奏效的原因是我别无选择。尽职调查和管理公司出售本身每周就要花 15 到 20 小时,所以我根本没有多余的时间去做以前做的那些事。好在团队主动站出来,接手了我之前没想过要委派的任务。

发布一门课程或一本书

  • 结果:开了一门直播课,但没有发布课程或书籍。
  • 评分:C

如果跳过直播版,我很可能已经发布了一门课程,但我依然很高兴做了这次试运行,因为它让我对课程的重点获得了有用的反馈。

每周用十个工作小时写软件

  • 结果:每周写 10 到 20 小时软件。
  • 评分:A

我现在更频繁地写代码,并且乐在其中。

明年的目标

赚取 5 万美元利润

在我的所有产品中,我想赚取 5 万美元的利润。不一定是经常性收入,一次性销售也算,但我想找到一种通过销售自己的产品至少赚 5 万美元的方法。

发布一门课程或一本书

自 2021 年以来,出版一本书一直是我的年度目标(始于 2021 年)。我从未实现过,但感觉今年就是我的机会。

学习一门新的编程语言

每当我学习一门新的编程语言,都能获得可应用于整体编程的洞见。

我喜欢的许多博主都对 ElixirPhoenix 感到兴奋,所以我很想试试这个技术栈。

原文由 Michael Lynch 发布

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