My Seventh Year as a Bootstrapped Founder

Michael Lynch

我作为独立创业者的第七年

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

七年前,我辞去了在 Google 做开发者的工作,创办了自己的自筹资金软件公司。每年,我都会发布一篇更新,聊聊进展如何,以及作为独立创始人的生活是怎样的。

我卖掉了公司

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

我和妻子想组建家庭,而我觉得自己无法一边独自管理一家七人的公司,一边做好一个新生儿的父亲。我找到了一位愿景与我一致的买家,我们在 2024 年 4 月完成了交易。

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

我卖掉 TinyPilot,去组建家庭

我已经写过文章、也在播客里聊过关于这次出售以及学到的教训,简而言之,我很庆幸一切都顺利收场。

我成了新手爸爸

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

孩子出生后不久,一位护士给我们一家三口拍了一张很美的合照,就放在下面。出于对儿子隐私的保护,我用手调的快速傅里叶变换处理了这张照片,去掉了生物特征细节:

我家的火柴人简笔画

我、妻子和刚出生的儿子经隐私保护滤镜处理后的合照

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

我做了教育类产品

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

儿子的预产期在八月,我知道他出生后会休假一段时间。这样我就剩下三个月可以做点新东西,但它必须是我能在接下来几个月里暂时搁置、等安顿好有娃后的生活再继续的项目。

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

我之前唯一做教育产品的经历是在 2021 年。我录制了一门关于面向技术受众写博客的视频课程。第一年收入 7600 美元,之后又赚了 2200 美元。按课程创作者的标准不算爆款,但我只花了大约 100 小时制作,而且对内容很满意。这是自成为独立创始人以来投资回报率最高的项目。

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

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

直播课效果还行,但学员反馈说他们更想学写作技巧,而不是如何吸引读者。我本来还想把课程做完,但儿子提前几周出生了,录制也就没能完成。

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

那门只录了一半的博客课程还剩下不少视频,不知道该怎么处理,这里放一个,讲的是如果知名的精益创业作家 Patrick McKenzie 向你发起博客对决,为什么你应该答应:

我学了些很酷的技术

经营 TinyPilot 时,我没时间做技术工作,这让我挺郁闷的,因为我热爱写代码。

我一直热爱编程,但在过去这一年里,我觉得它比以往任何时候都更令人兴奋。那些免费开放的优秀开源软件让我惊叹不已。

Nix

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

Nix 是一个像 apt-getyum 这样的包管理器,同时也是一个像 CMake 或 Bazel 这样的构建工具。它将这两种功能合二为一,让你在软件项目中管理依赖、打包分发变得轻松。

我一点点地开始用 Nix,现在喜欢到在每个编程项目中都用它,所有电脑也都装上了 NixOS。

  • 适合谁尝试?
    • 喜欢 Docker、Ansible、Terraform 这类基础设施即代码工具的开发者。
  • 我的推荐理由是什么?
    • 在软件项目中,Nix 让你可以用源码来定义所有依赖。任何人都可以用一条命令复现你的环境。
    • NixOS 是围绕 Nix 理念设计的 Linux 发行版。NixOS 让你可以用纯文本文件定义整台电脑的配置。你可以轻松地从零重建电脑,或回滚到之前的配置。
    • Nix 拥有 Docker 的许多优点,只不过 Nix 包比 Docker 镜像更容易组合。
  • 有什么缺点?
    • Nix 学习曲线很陡,而且我还没找到一本面向开发者的好入门指南。最接近的是NixOS in Production,但它是面向 DevOps 工程师的。
    • 围绕一个叫“flakes” 的功能存在分歧。如果你用了 flakes,就很难看懂不用 flakes 的教程和文档,反之亦然。
    • 由于领导层的问题,Nix 社区处在不太健康的状态。
    • 在持续集成(CI)中,Nix 在小规模场景下表现不佳。除了换成 Nix 专用的 CI 服务商,我还没找到办法让任何依赖 Nix 的 CI 任务在 55 秒以内跑完
  • 怎么入门比较好?
    • 一点点地尝试 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 是库而不是框架,所以不像 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 的模糊测试

你可能以为我聊完 Nix 了。才没有呢!

我一直想试试用模糊测试来找安全漏洞,毕竟自从十年前在 VLC 中发现一个严重漏洞后,我就没再用过模糊测试工具了。

我很喜欢 Antonio Morales 在 2021 年写的模糊测试教程,但所有练习都要做大量枯燥的准备工作,才能搭好可用的模糊测试环境。

我尝试用 Nix 实现了一套模糊测试工作流,体验好太多了。我真希望有时间用 Nix 再多写几篇模糊测试教程,因为我觉得大家都低估了 Nix 作为模糊测试工具的潜力。

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

这一年总体如何?

每年,我都会问自己是否还喜欢做独立创始人。

过去几年,这个问题很难回答。经营 TinyPilot 时,我为公司感到自豪,也很喜欢和团队共事,但硬件公司的节奏和复杂度让我感到吃不消。

今年,我又重新享受起做独立创始人的感觉。我很珍惜能有大量时间和妻子、儿子在一起的自由。也很感激复工的时机完全由我自己决定,何时、如何把工作重新融入有娃后的生活,也完全由我掌控。

出售 TinyPilot 的过程充满压力、并不愉快,但回首往事,我记得的却是和妻子、朋友们在马萨诸塞州西部即兴来了一场甜品之旅的庆祝。

五月,一位 Google 的招聘人员说可以让我免面试重回旧岗位,但我一点也不心动。

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

经验教训

不工作也没关系

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

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

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

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

只有别人能照着文档做,流程才算真正写清楚了

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

我本以为委派会很轻松,因为我们什么都有操作手册,连我自己做的任务也不例外。但当我开始把任务交给同事时,才发现那些所谓“已记录”的、由我负责的流程,其实很多都只存在于我的脑子里。像“撰写发布公告”或“更新公开更新日志”这样的步骤,远比这几个字看起来复杂得多。

现在我认为,只有当同事能完全依靠文档来执行流程时,这个流程才算真正被记录下来。

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

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

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

买家的资金来源对成交时间有重大影响。如果买家向银行借款,银行就会成为交易中的关键决策方。银行动作慢、要求大量文书,而且很难谈判,因为它们根本不在乎交易是否告吹。

如果以后再卖公司,我会提供激励来吸引手头有现金的买家

给去年的目标打分

去年,我设定了三个年度大目标。以下是我的完成情况:

每周只花 20 小时管理 TinyPilot

  • 结果:已将管理时间降至每周 20 小时
  • 评分:A

我在四月就卖掉了公司,所以这一年里管理 TinyPilot 的时间并不长,但我终于实现了每周只花 20 小时管理的目标。这已经是我连续三年都没能实现的目标了。

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

发布一门课程或一本书

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

如果跳过直播版,我很可能已经发布了课程,但我仍庆幸做了这次试运行,因为它让我获得了关于课程重点的有用反馈。

每周写 10 小时代码

  • 结果:我每周写 10 到 20 小时代码。
  • 评分:A

我现在写代码更频繁了,而且乐在其中。

明年的目标

盈利 5 万美元

我希望所有产品加起来能盈利 5 万美元。不一定是经常性收入,一次性销售也算,但我想找到一种方式,通过销售自己的产品至少赚到 5 万美元。

发布一门课程或一本书

自 2021 年以来,我每年都把出书设为目标一次都没实现过,但今年感觉就是我的时机。

学习一门新的编程语言

每学一门新的编程语言,都能给我带来可以应用于整个编程领域的启发。

我喜欢的很多博主都在为 ElixirPhoenix 感到兴奋,所以我也很好奇想试试这套技术栈。

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

评论