使用编程技能赚取被动收入 [译]

十年亲身经验:从受雇软件开发者到成功独立开发者,打造并运营自己的业务

在 2017 年,我从一家拥有 150 人规模的软件公司 CTO 的职位上辞职,想试试能否通过在互联网上销售自己的软件来赚钱

八年后,我已经成为一名全职的 “独立创客”(solopreneur),运营一系列能带来收入的软件产品组合 作为全职工作。现在我可以自己安排工作时间,想休假就休假,而且令人惊讶的是,我的收入比当 CTO 时还要高。

在下面这场演讲中,我会分享我是如何做到这一切的,以及在这个过程中学到了什么。我会分享程序员在开始出售网络软件时应该掌握的技能,包括技术技能和非技术技能。我会讨论如何着手、如何评估你的想法、如何构建产品、以及如何获取第一批用户和付费顾客。内容来自我多年来自行构建和销售软件的经验,以及我通过 SaaS Pegasus 帮助数百人推出自身业务所积累的见解。

如果你曾经想过把编程技能变成能产生收入的副项目,我希望这次演讲能够既激励你、又帮你迈出第一步。


要点概览(TL;DR)

有人在 Reddit 上让我为这次演讲写一个 TL;DR,这是我即兴的回复:

  • 首先,你得在自己的生活中为此腾出空间。需要很长、连贯的时间来做深度工作。

  • 你最初选的想法很可能行不通,所以找个想法赶紧开始行动。许多最好的产品,都是在做别的东西过程中萌芽出来的。

  • 在构建产品时,要追求速度。尽快把东西推向市场,再快速迭代。

  • 选择你熟悉且上手最快的技术栈。

  • 尽量把一半的时间花在市场推广/销售上,即使你并不喜欢这么做。

  • 你能拥有的最重要技能是“韧性”(resilience)。不放弃是通往成功的最佳途径。因为这条路上充满不确定性,所以坚持会很难。

  • 值得去做!这种自主与自由是任何其他职业都无法匹敌的。


演讲内容

本演讲于 2024 年 10 月 4 日在 PyCon South Africa 的闭幕式上进行。

时长约 30 分钟,外加 15 分钟的问答环节。

你也可以往下阅读我整理的带注释演讲稿,我用的方法与 Simon Willison 的方式非常相似。


演讲稿文本

Using Coding Skills to Make Passive Income (标题页)

今天我想谈谈如何用编程技能来赚取被动收入。

活动宣传邮件里对这次演讲的标题让我觉得有点好笑,因为它听起来 确实 很像“赚快钱”的标题党。

不要被标题吓跑!

希望这是一个不带标题党性质的版本。至于是不是标题党,就留给你来判断了。

首先,我得先解释一下我的工作。

解释我的工作

“所以,你是做什么的?”

每次有人问我这个问题,我都不知道怎么回答。最无聊的说法是 “我是一名软件开发者,同时也经营一家自己的公司。” 如果对方知道一些行业用语,我会说自己是独立创客(solopreneur)或独立开发者(indie hacker)。要是更具体一点,我会说我经营着一系列能带来收入的技术产品组合,这听上去有些拗口。要是我想开点玩笑,我可能会说: “我做一些应用,让我睡觉时也能赚钱,或者……我想干嘛就干嘛吧?”

事实上,我的收入来源就是一系列在线赚钱的技术产品组合。

我的收入来源

基本意思就是:我做一些东西并放到互联网上,有的通过一次性付费赚钱,有的通过订阅、广告、联盟分成等赚钱。我有好几个项目,它们带来的收入各有不同。我每天就挑一个来做,维护它、开发新功能,或者开发一个新东西,诸如此类。

我就是这样一路走来的:

我如何走到今天

抱歉,这张幻灯片里有很多动态叠加效果,放到这里图像就不太清晰了。

我最开始跟很多人一样,在普通公司上班。我很快就离职,加入了一个朋友的公司 Dimagi,当时团队就三个人。他说:“嘿,你要不要当 CTO?” 我说:“好啊,那我就当 CTO 吧。” 结果我就这样“角色扮演”了几年的 CTO。

不过,这家公司后来发展得不错,等我反应过来时,公司已经有 200 多人,我手下带了 35 人左右的团队。按理说我那时就是真正的 CTO 了,但我并不喜欢这份工作。我每天就泡在各种会议和管理工作里,基本上已经碰不到代码。最后我就烧尽了(burn out)。

于是我和那位朋友说我需要休息一下,决定来个 6 个月的不带薪休假 来重新思考生活。这段休假里,我发现一个网站叫 Indie Hackers,专门讲一些跟我现在类似的故事——人们做一些稀奇古怪的小应用,然后以此谋生。我一想:“这听起来挺酷,我也来试试吧。” 所以我决定在这 6 个月里,看能不能以“独立开发者”的方式赚到 1 美元。

我最先成功的项目蠢到我自己都觉得不好意思,实际上它只是一个 制作座位卡(Place Cards)的应用——就是婚礼或其它活动常见的那种座位名牌。你把宾客名单的表格上传,然后下载一份 PDF,付给我 5 美元(约 100 南非兰特)。令我惊讶的是,这竟然真能赚钱!我挣到了第一笔钱,那种感觉非常刺激,于是我就上瘾了。接着我试着继续重复这种模式。

后来我想:“我打赌也有人想跟我一样一次又一次地做这些事。” 于是我更进了一步,做了一个能帮别人快速上线自己应用的产品,这就是 SaaS Pegasus —— 一个可配置的 Django 代码基础,我现在 80% 的收入都来自这款产品。

到今天,我非常惊喜地看到有那么多人用 Pegasus 代码做了 非常酷的产品甚至成功的商业项目,包括 YCombinator 公司,也包括别人随便拉个朋友做的业余项目。它目前有上千人在用,可能成百上千的真实产品是基于它开发的,真是挺神奇的。

现在,我来澄清一下这种职业道路的几个关键特征。

这条路上的关键特征

我说的重点是做 产品,也就是说,不要将时间直接出卖给金钱——而是让用户直接买某个东西,然后你在不需要投入额外工作时就能赚钱。

我指的是 能赚钱的 项目。做个兴趣项目当然好,但这里主要针对想替代(或补充)工资收入的人。

我还说的是 “自启动”(bootstrapped),意思是你不去融资,而是靠自身项目收入养活自己,拥有全部利润。

最后,这是一条相对“平静”的道路(calm path)——目标不是打造一家百人企业。当然也可以,但我从来不想把公司做大到上百人,我只想过一种从容、有大量自由度的生活。

一个相对主流的叫法是:独立开发者(indie hacking)。

我这次演讲的目标

我这次演讲有两个目标:
第一,让大家相信这可以是一条可行的职业道路。很多人根本没想过还有这种选择,但它确实可行。
第二,如果你决定想试一试,那么我会给一些提高成功概率的建议。

下面是实现这条路的示意图:

如何成为独立开发者

首先你要在生活里创造空间。对很多人来说,这也许是最难的部分——找到足够的空闲时间去做这件事。

然后你进入一个不断迭代的循环:你尝试做某件事儿,如果不奏效,就吸取教训,然后继续尝试。这里的“换个方向”不一定非要完全重做一个新产品,也可以是尝试新营销方式、调整用户体验等。只要不停试,终有一次会成功,然后你就赢利了(Profit)!

先说说如何腾出空间。

创造空间

想开始,需要什么?

开始需要什么?

老实说,几乎什么都不用准备!

几乎不需要任何东西

除了时间。

时间

而且这需要的是能连续投入、用于深度工作的时间片段,而不是那种碎片化的、被各种琐事打断的时间。要找到这种时间并不容易。

那怎么能挤出时间呢?

如何挤出时间?

最常见的方法,就是在晚上或周末加班搞副业。

夜晚和周末的勇士

这位是我的朋友 Wisani,他开发了一个名为 Boardroom 的应用(有点像 LinkedIn 的 “Tinder” 版本),目前在南非开始走红,而且他手上还有十来个项目。与此同时,他还在 Allan Gray 全职上班,并且好像还在读 MBA。

在夜晚和周末做项目是对生活影响最小的一种方式,但这非常累。就我而言,我得顾着孩子,白天上班一天也挺疲惫,实在很难抽出这样的时间。

如果这样不行,还有另一种方法,就是“放手一搏”。

彻底放手一搏

也就是辞职,跟自己说:“行,我就攒了十二个月的生活费,我要做出点名堂来。” 但大多数情况下,这并不好,因为会有极大的时间和经济压力。创业本身就有很多不确定性——并不是说你努力干一年就一定能成功,这和常规工作或许不一样。

我自己的做法,也是我推荐的做法,更像是“耐心地一点点来”,把这个目标和自己的生活慢慢地融合在一起。

耐心之道

常见的思路就是减少自己打工的时间,收入略有下降——比如跟老板商量只工作四天,工资减到 80%,或者通过做合同工或自由职业者来提高时薪。然后把剩下的时间投入到自己的产品里。等这些产品有了一些收入后,再慢慢调整你的工作小时,直到它完全接替你的开销。

这是我在这个领域头七年的真实收入分布:

我的耐心之路

2016 年我还在全职上班,2017 年我休了假,正式开始折腾这条路,同时把原来的工作量降到了一半,然后大部分收入来自给别人做咨询。我动用了一些人脉,告诉他们“我有空,而且收费会比较高”,幸好有人愿意买账。那块很薄的黄色部分,就是我卖座位卡所赚的钱。

它的状态就像滚雪球一样,第二年收入比第一年更多,第三年更多,然后我渐渐把咨询业务减到很少,最后辞掉了工作。虽然用了好几年时间,但好处是我从来不怎么焦虑——没有过大的经济压力。

现在我们进入主要的迭代循环。

迭代

放大来看,其实可以归纳为:找一个想法、做出来、卖出去,然后重复。

迭代循环

再回到那句“人人都可以创业”,其实这里面没什么火箭科学——如果你能自学编程,你也能学会怎么做市场、怎么验证想法。这些都能学。

但这里面最大的挑战是“高度不确定性”。

这意味着你需要在这个循环里尽可能多地转一圈又一圈,因为每一次尝试,你都无法提前知道结果。如果你花了两年做一个产品,最后发现没市场,那就浪费了很多时间。但如果你能在两周、两个月内确认这东西不行,就能更快开始下一轮尝试。

我喜欢把自己想象成一个人的“风险投资基金”。

把自己当成一人的风投组合

风投基金投 100 家企业,会预计其中 90 家会失败,但只要有一家是下一个 Facebook 或 Uber,基金就大赚特赚。

对个人来说,也是同理。你要像在球门前多次射门,看哪一次能进。也许你能先赚到 10 美元、100 美元,然后你就可以把主要精力放在那个项目上,让它持续增长。

下面举几个独立创客圈的例子:

例子

对不起,这张图也因为叠加效果而变得有些混乱。

Pieter Levels 现在可能是在“钱堆里睡觉”,他说他做项目的成功率只有 5% 左右。但是这 5% 就足够让他以这种方式过上很好的生活了。还有个南非人 Rob Hope 在他的网站上有个 项目墓地(project graveyard),列出了他过去所有失败的尝试。另一个例子是 Pat Walls 也在 Twitter 上公开了他的失败记录,我也照着他的格式发过。你会看到我也尝试过很多东西,能成功的就那么寥寥几个。

既然失败概率高,就一定要尽可能地缩短每次尝试的周期。

下面说说如何“选点子”。

选择想法

这张图来自一位非常成功的企业家 Rob Walling

Rob Walling 的楼梯式方法

关键在于,你要像爬楼梯一样,一步一步提升难度。先从台阶 1 开始做最小、最简单的东西。就像我卖 5 美元一次的座位卡 PDF——非常简单,做起来也很快,卖起来也相对容易。

等你做成了,就再做下一个,再下一个,如果你真的成功了,你就掌握了支配自己时间的主动权(台阶 2)。

Rob 所说的台阶 3,指的是再去冲击一个更庞大、更有野心的项目。我把它画了个虚线,因为你 不一定 非要去第三层。你可以做很多台阶 2 上的小项目,依旧可以过得很好,拥有很多自由。有没有必要去做“登月”项目,纯看你自己的兴趣。我自己就更倾向于停留在第二阶段。

所以,“从小处着手” 是选点子时的关键。

从小做起

对第一个项目而言,要 “易于开发、易于维护、易于销售”,而且如果它并不是那种独角兽级别的想法,反而更好。千万别一上来就想做下一个 Facebook、Uber 或 OpenAI,你要找的是一个足够细分的市场。

那如何想出好点子呢?

如何想点子?

网上有很多人写文章总结方法,他们见过的案例比我多得多,我就不展开了。我只想强调:去 行动

去行动!

用我自己的例子:我那时结婚,需要打印这些讨厌的座位卡,于是有了那个做座位卡的项目。后来在做各种应用的过程中又遇到新问题,就去做 SaaS Pegasus。又因为运营 SaaS Pegasus 社区,经常回答重复问题,我又去做了一个 RAG 聊天机器人。

做事会带来新的问题和点子

你做一个项目的过程,肯定会遇到新的痛点,然后那可能成为你下一个产品的切入点。并不是说第一个想法一定能成功,而是“行动”会让你不断产生新想法。找到让你觉得有趣、值得解决的问题,然后就继续做下去。

有一本书叫 《The Mom Test》,专门讲如何验证创意。

验证想法很难

这本书的关键点是:当你向任何人讲述你的“创业点子”时,对方很可能会像你妈妈一样,笑呵呵地鼓励:“亲爱的,这主意真不错,我相信你一定能成功!”
大家这样做,是因为不想让你丧失信心。你去问朋友或同事:“我有个 App 的想法,你觉得怎么样?” 他们也不会直接泼冷水。这本书就是教你如何避开这种“善意的谎言”,并提供一套方法让你更真实地验证想法。

接下来聊聊开发——特别是做一个 MVP(最简可行产品)。

构建 MVP

很多人都听过 MVP——其实就是尽量构建一个“最小却有用”的版本。

什么是 MVP?

在这个示意图里,滑板是可用的交通工具,但只做一台车子的轮子或轴,就没什么用。也有人提出过 SLC(Simple, Lovable, and Complete) 的概念,我也很喜欢。

但说 MVP 之前,我想先谈谈独立产品为什么会失败。

为什么独立产品会失败?

我想强调的是:独立产品和许多大公司的软件开发有很大区别。

独立产品不一样

在 Amazon 这样的大公司,你可能要和一堆遗留代码打交道,作者已经离职了、没有文档,还有各种可怕的扩展性、性能问题——但 这些都不是独立产品失败的原因。对独立产品来说,失败往往是因为用户根本不需要这个东西,或者你不懂营销,或者你资金和精力都耗光了。

因此,你要做的是 一切以速度为优先——越快上线,越快收集反馈,越快迭代,越快发现这个想法根本没市场,就能越快开始下一个。

追求速度也会带来...

我并不是说要写质量很差的代码,而是说你要聪明地取舍。

这不等于"写糟糕的代码"

比如测试,你无需追求覆盖率 100% 或极致的测试体系,而是要问自己:“写这些测试,能不能让我之后更快、更放心地改代码?” 如果能,那就写;如果不能,那么此刻就不用太纠结。

在实践中追求速度

换言之:不要过度思考。

接下来说说设计。

借用他人的设计

对开发者来说,设计往往是个弱项,我自己也不例外。好在现在完全不必自己设计了,网上有各种开源或付费的模板——即便是免费模板,也可让界面很好看,兼容不同设备,还有现成的组件。

所以你完全可以 自己做设计,直接拿别人的现成设计来用。我非常推荐这样做,因为它更快,而且想做得更精致或更独特,可以放到之后再说。

另外,你也 不必从零开始

你不必从零开始

虽然这有点像给自己做广告,但也是事实:我见过很多人用 SaaS Pegasus(我的项目)大大缩短了他们上线的时间。其实这是一个完整的行业——SaaS BoilerplatesSaaS Starter Kits,有免费的开源版本,也有付费的商业版本,都能帮你把常见的登录、付费、多租户等功能开箱即用。这样你就能把前两周从零写起的时间省下来,专注做自己核心的部分。

那么,应该选什么技术栈呢?

用什么技术栈?

其实答案只有一个:

用你最熟悉的那一套

用你最熟悉的!

如果你只是想顺便学个新技术来提升自己,那当然可以。但如果你的目标是尽快推出能赚钱的产品,就应该用你最熟悉的东西,让自己保持最高开发效率。

如果你还啥都不懂,那就选当下最流行的。

如果你什么都不会...…那就选流行的技术

流行技术有更好的社区、文档,而且大语言模型(LLM)对它们的支持度也更好。我自己主要用 Django、HTMX 和 Tailwind,但你用自己最顺手的就好。

还要记住一句话:如果你在推出第一版时还不觉得自己做得“太简陋、真丢脸”,那就意味着你推得太晚了。这是 LinkedIn 创始人的名言。

别忘了……

这是 Place Card Me 刚上线时的页面,我用的只是几个 Font Awesome 图标和一个特别大的按钮,但它就这样跑了一年左右。你得习惯先拿出一个不太完美的版本,只要它能运转、能收到反馈就好,比起追求完美的东西,尽快开始用户反馈循环要重要得多。

下面聊聊如何“卖”出去。

卖出你的产品

许多开发者都有一个误区——以为只要把产品做得“最好”,就会成功。

如果你造好了,他们也不一定会来

他们觉得某款软件能成功,是因为它质量最好。其实大部分情况下,那家公司的市场/销售团队才是大功臣,或者成功来自“好产品+好营销”的组合。

一个残酷的现实是,你需要花大量时间来做营销或销售。书籍 《Traction》 提到,你大概要把 50% 的时间花在市场和销售上。

将一半时间花在市场/销售上

对我来说,这就像“吃蔬菜”一样。我喜欢写代码,却不喜欢做营销。但我知道自己必须把营销这碗“蔬菜”吃下去,然后才能痛快“吃薯条”。

我也建议“在产品还没准备好时就尝试卖”。

产品没做好就卖

我敢说大家都见过某个很酷的应用,当你想注册时,却弹出了个对话框,让你先留下邮箱。

对于用户来说,这很讨厌。但对开发者来说,这非常有用,有两个原因:

  1. 如果连让别人留下邮箱都做不到,那想让人家付费就更别提了。用收集邮箱来检验是不是有人对这个产品有一点点兴趣。你可以想办法给这个页面引流,如果发现只拿到寥寥几个邮箱,就说明市场反响一般。

  2. 你需要一个潜在用户名单,当产品真的上线时,可以通知他们。如果你是在黑暗中埋头苦干,然后突然上线,发个 Hacker News 帖子,结果无人问津,最后只能感叹失败,但其实很可能只是不够曝光。如果你预先有 200 位对产品感兴趣的人,上线前先联系他们中的 20 个做做用户访谈,完善完再给下一个 20 个,依次迭代,最后正式上线就能给全部人发邮件。这种从第一天就能获得用户关注的感觉会好很多。

再来谈谈如何获取第一批用户。

获取第一批用户

这些是我用过的一些方法。

社区

各种社区非常适合寻找早期用户。因为社区通常都很“垂直”或“小众”。无论你是做给“喜欢打 DnD 的水管工”用的,都能找到对应的 Reddit 或 Facebook 群组。你可以直接进去和目标用户对话。

但要注意,社区往往很反感那些专门来做营销的人,所以要“有技巧”地发言,多给社区带来价值,然后在合适的时机里提一下你的产品。

广告

广告也是比较直接的方式,比如 Google 的搜索赞助位非常醒目,其他平台也有各式各样的广告机会。

广告很适合在早期验证你的想法,看看是不是有人想用、能不能顺利用上。但我不建议拿它来直接赚钱,你很大概率会烧钱。但是用花钱买来的流量做一点用户研究,还是值得的。

冷邮件(Cold outreach)

“冷邮件”或者冷联系也是一种你可能会不太舒服但有时很有效的手段。比如当我做 Place Card Me 时,我每天花一个小时去看各种婚礼博客,然后给博主写了一封又一封个性化的长邮件。绝大多数博主都不鸟我,但有一个人理了我。她对我帮助很大,让我了解行业现状,在她网站上给了我反向链接,还帮我定制一些座位卡的设计。

现在有了 AI 垃圾邮件泛滥,想要用“千篇一律”的模版轰炸,基本没戏。比起批量发送 100 封随便拼凑的邮件,宁愿写 1 封更走心的邮件或私信,成功率更高。

内容/SEO

“内容”是我目前最常用的营销渠道——写文章、做搜索引擎优化(SEO),靠这些带来访问量。比如你要是针对某个行业,就写面向那个行业的有用内容。

我服务的对象是 Django 开发者,所以我就写很多 Django 相关的文章。有人搜索 如何部署 Django如何对接 Stripe 就会找到我的文章,也就顺便了解到我的产品。这样还能带来反向链接,累计口碑等。

我也开始在 YouTube 上放一些教程,虽然我频道没多少粉丝,但依然能带来可观的访问量。录点小屏幕演示就能搞定,任何个人都可以这样做。

公开构建(Building in public)

我犹豫要不要提这个,但毕竟我自己也做过,就是“公开构建”——你在博客或社交媒体上分享你目前在做的事情。你会在 Twitter 上见到很多人也这样做,而且已经比较杂乱了。

不过它的好处在于,不需要额外投入精力。比如你今天花 2 小时做了点功能,就截图发个推,可能有人对你的进度感兴趣,然后一路关注,逐渐成为你的第一批拥趸。他们可能会主动试用、帮你推广或者给你引荐资源。

最后我想谈一点和心理因素有关的东西。

心理因素

前面那张看上去挺简单的迭代图,其实还隐藏了另一条“岔路”:

就是 放弃

心理因素

Indie Hackers 的创始人 Courtland Allen 采访过几百位往这条路上走的人。他说,他从成功案例里得到的最大启示是:你只要坚持不退出。除此之外并没有更“通用”或“有效”的方法—— 就是别放弃

“你的终极目标就是不要放弃”

那怎么才能让自己不放弃呢?

如何不放弃?

一个办法是,让自己拥有 无限的跑道(runway),也就是前面说的稳住经济状况。

无限跑道

这样你就不会因为“没钱”而被迫放弃。

然而你还是可能会因为失去动力而退出。为了持续保持动力,我觉得最重要的是管理好自己的预期。

预期管理

比尔·盖茨曾说过:“人们往往高估自己一年能做到的事,却低估自己十年能做到的事。”

这句话让我感触很深。很多人认为:“我给自己三个月时间做个产品,结果上线不成就彻底算了。” 这确实很常见。但如果把它当作一条五年、十年的旅程,你就会用小而稳的步子走下去,别看它们单个效果有限,但累加到一起,会有巨大增量。

还有一个关键点是要“把学习当作目的”。

把学习当作目标

你可以想象一个角色扮演游戏的技能树。对大多数软件开发者来说,编程算是主力技能,可能也懂一点产品和市场。但要想在这个领域做出成绩,你需要比较“全才”。

这意味着你要愿意学习新技能,尤其是那些让你不舒服的领域。比如我从没想过当一个营销人,但为了卖产品,我必须去学。如果你无法跳出舒适区去学营销、学其它不熟悉的事情,就很难坚持下来。

保持韧性

最后,保持韧性。

这张图展示的是 2020 年初 Place Card Me 每周的收入走势。刚开始一个星期能有 400 美元左右,然后忽然新冠疫情全球爆发,没人再办婚礼了,我的核心被动收入一下子归零。

这只是无数突发状况中的一个,这条路的确充满“不确定”。当你生意好的时候,会非常好,但遇到低谷可能又会直接跌入谷底。你得接受这样的心态起伏。以前拿工资是平稳的,这种做独立产品的收入忽高忽低,需要更强的心理承受能力。

不过,如果你能撑过去,你就能有所收获。

盈利

这是我第一篇博客写的目标:在互联网上赚到 1 美元。

最初 VS 现在

八、九年后,我的收入比当 CTO 时还高。更重要的是现在的生活方式很好:我可以想何时陪孩子就何时陪,想休长假就休,也没人给我下命令,我也可以不去参加那些冗长会议。

所以我非常推荐这条路。

如果你听起来觉得有趣,那就去试试吧。看看能不能把它变成现实。

提问时间

如果你能读到这里,真是非常感谢!如果觉得有帮助,欢迎在下面留言、分享给他人,或订阅我的更新,之后我发新内容时你就能收到通知。