过去一年,我在下班后又做了什么?按时间顺序:

  • 一个博客网站(也就是本站的上一个版本)

    • fork 开源代码,修改、测试、部署。

    • 在当时,我认为最好的方式是 Notion 存储博客内容 + Vercel 部署 Next.js 博客应用。这个方式有最好的编辑体验,具备最新的技术栈来实现现代网站效果。我天真地想,这样我就能坚持更新博客,不断分享我的想法。

    • 然而,这套技术栈在出问题时,debug 对一个后端程序员来说很有难度。并且在这个过程中我遇到了一些其他奇怪的问题,也许 Notion 并不想让我用它作为 CMS

    • 我到最近才突然意识到:博客的外在并不重要,我应该专注于博客文章的内容、坚持写作。我对博客的不满意,只能通过这一个唯一途径解决。

  • 一个尝试盈利但快速失败的网页应用

    • 这个项目受哥飞启发,我想尝试快速上线一款产品,使用低成本部署 + AI 辅助开发。MBTI 是典型的刻板印象工具,我认为 LLM 可能会非常擅长解释刻板印象、处理用户的提问输入。

    • 失败原因:项目断断续续地进行了大约 3 周后,我决定完全放弃。我不喜欢这个产品的任何内容,我自己不可能是这个产品的用户,包括 MBTI 这个概念,我感受不到乐趣!

    • 也许最大的乐趣是通过 AI 生成前端代码给我带来的新鲜感。随着项目进行到后期,我需要对组件/界面进行具体调整。而我对项目使用的前端技术栈并不熟悉,只能借助 LLM 寻找零碎知识,逐个复制粘贴、运行尝试,我是一只在敲键盘的疯狂猴子!

    • 虽然哥飞分享了许多有用的产品设计/运营经验,但我在这个项目中并没有认真执行这些步骤(好可惜!)。这个产品没有准确的目标受众,设计上也毫无乐趣;至于运营推广,我还没有进行到 SEO 步骤就放弃了。

  • 一个支持中文搜索的 Telegram 机器人

    • 我从多年前就开始维护一个 Telegram 频道,分享各类编程开发、游戏设计、音乐制作相关的网页链接。Telegram 对中文搜索的支持非常烂,有时候我想找一个我曾经看过的链接,我没有任何办法搜索!

    • 我重构了之前的笔记软件后端代码,新增了文本搜索功能(PostgreSQL)、Telegram 频道数据同步任务。

    • 这个项目解决了我自己的需求,项目完成时我获得了巨大的成就感。

  • 一个每日更新的定时任务,翻译、总结 Hacker News 等网站的新闻内容,执行结果保存为纯文本 Markdown

    • 我需要及时获取科技新闻,但我不想每天在各类网站上花大量时间注视着英语走神发呆。终极目标:我不用再浏览社交媒体,每日新闻将会在这份 Markdown 报纸上告诉我所有我关注的内容。然后,我的时间和注意力可以用来做有意思的事情,而不是在推荐流、信息兔子洞里耗费大量时间。

    • 这个项目的特殊性在于,它的运行结果是一堆 Markdown 文件,存储在 Github 仓库上。因为,编辑器是程序员最好的朋友。

    • 又一个解决自己需求的项目。我的个人使用体验真的很不错,每天只需要花一点时间就能获取到大量有用的信息。它的使用体验类似于阮一峰的科技爱好者周刊,但是是每日更新的。这个项目解决了我的问题,可能也能解决其他人的,我不确定是否真的有市场。

我的本职工作并不轻松,晚上下班时间晚,我曾经一直认为缺少时间是我的最大阻碍。经过对自我的长期观察,我发现最大的问题可能不是缺少时间,而是缺少“心力”。

工具

使用喜欢的工具做我真正想做的事情,这是对我来说维持状态最重要的因素。当满足这个条件时,工作将会和玩耍一样开心。如果你必须要用一个讨厌的工具(比如,JavaScript?),你应该想办法让它变成喜欢的工具。

关于这个话题 Pieter Levels 对我的启发最大,他在这期播客中多次提到了这方面内容:Pieter Levels: Programming, Viral AI Startups, and Digital Nomad Life | Lex Fridman Podcast #440

我想分享一下对开发工具的个人看法,当我决定要开发业余项目时:

  • 所选工具不能太新、不能变化太快。新的技术在互联网上的数据少,LLM 问答能给我的帮助相对于成熟技术会少很多。如果使用新技术,它应该是仅仅占据项目的一小部分内容,或者它本身易于掌握。

  • 所选工具不能是公认的垃圾。这类工具有人尽皆知的问题,解决这些问题和推进项目没有关系。

  • 所选工具尽量是自己熟悉的技术。学习新的编程语言/框架/工具链,需要的时间并不久。但是在实际项目开发中,排查问题的时间才是最久的。

  • 所选工具能保证模块化、提升可测试性。讲述“什么是好代码”的系统理论有很多,但我发现这两点是最切实可行的。模块化做得好的工具容易测试。编写容易测试的代码才能获得快乐。如果你一个人开发项目,还要保持高质量,你必须要把手动测试流程通过代码自动化;模块化程度高的程序编写测试程序是很方便的。

  • 所选工具支持纯文本配置,可以用 git 管理。编辑器是程序员最好的朋友,利用好它!每天都会出现界面漂亮的新工具,但我发现,很多问题其实在许多年前已经被解决了,不需要再新增组件。

  • 时刻提醒自己,没有完美的工具。不要纠结,不要钻牛角尖。

以上内容的反面观点:你只要熟悉了所有最好的工具就好了/你只要熟悉公司让你使用的工具就好了。但本文的讨论范围,是以维护提升开发者“心力”为中心的。

以前我会纠结小问题。比如用 Markdown 写博客的时候,编辑器不能舒服地预览图片让我很难受。现在我的想法是:我觉得我的博客不好,是因为我的文章写得不好;不是我的编辑发布流程不完美。在上一个版本的博客网站,我可以使用 Notion 这样优秀的编辑器写作,但我并没有维持更新,这些问题并不是主要问题。

你应该自动化所有可能自动化的流程,这篇博客让我受到了很大启发,推荐你也阅读一下:Make your own Tools

动力

业余项目几乎没有获得物质回报的可能,并且没有外部压力监督我一定要完成项目。所以,我决定做的所有业余项目都以自己的兴趣为导向,否则我不可能完成。

每个人的大脑工作方式不一样,以下是我在自我观察过程中常见的糟糕情况,可能会对你有启发:

  1. 缺少动力:

    • 拖延、意志力弱。无数百无聊赖的空闲时间,我的注意力陷入无尽的软件推荐流里,一遍一遍地点开新的页面,不愿意做我应该做的事情。

    • 倦怠感导致无法坚持继续工作。我的倦怠感体验比较特殊,我会在某个时刻突然反感正在做的事情。问题可能并不是来源于这些事情本身,而是我的内心出现了强烈的变化。

  2. 不想停止工作,不受控制:

    • 沉浸在想完成事情的执念中,情绪烦躁,不想做其他应该做的事情,不愿意休息,只想继续做正在做的事情。在这个状态的时候,工作效率往往是极端低效的。

上述问题我没有找到非常有效的解决方法。我认为其中一些现象并不是我能通过意志力主动控制的,我正在努力尝试理解自己的真实感受,寻找平衡点。根据历史观察,我的行为严重低估了休息的重要性。在状态好的时候,我往往能用十分钟解决前一天纠结很久的问题。缺少时间不是问题,真正的问题是如何维护自己的心力。“动力”这个词很有意思,似乎我的行为都是有惯性的。

另外,努力为自己营造一个好的环境非常重要。通过环境来被动维护自己的心力,而不是用意志力单打独斗。请主动离开负能量环境,停止因为自身惯性做出的消耗行为,寻找能激励自己的精神粮食。人在积极的环境中,会不断感受到正向能量。最近我的方法是看视频,推荐两个对我有激励作用的频道:ThePrimeTimeagen,Dan Koe

除去上述内因,进行任何项目都会受侯世达定律的影响:

做事所花费的时间总是比你预期的要长,即使你的预期中考虑了侯世达定律。

于是,开发个人项目需要面对的一个残酷现实:在预定期限内,你只能完成计划中的一小部分,这部分往往是低于你的预期的。你需要不断接受现状,否则挫败感会慢慢腐蚀你的动力。

回报

通过个人开发的项目盈利,这是我的目标。在理想情况下,我应该因为我的作品(即,对社会的贡献)获得报酬,而不是大量出租我的时间。这是我的远大目标之一,但我渐渐发现,这个目标不可能通过我靠自己的想法做项目来实现,程序员群体天然地不会找盈利方式,甚至会有不少反抗健康商业模式的思想。我需要提升自己的认知水平。

但如果完全找不到盈利的可能性呢?我正在做的业余项目还值得做吗?我认为是有意义的:保护仅存的编程兴趣。如果想开发一个项目,请努力去做,你会遇到许多新的问题,学习到新的视角,失败了也没有关系,你仍然会有不少收获。

以前我喜欢想各种点子的可能性,并且喜欢找人交流这些点子,但在看到这条推文后,我制止了我的纸上谈兵行为,我不再和不会和我一起行动的人讨论远在天边的话题,而是直接动手去做事情:@levelsio: “Best thing I did was actively surround myself with builders …”

接下来做什么

继续保持博客更新,继续坚持按照新发现的方法论开发更多业余项目。也许会做出更多失败的项目,享受过程吧!

附:关于“工具”章节,我在尽力避免对具体软件的讨论,因为创作者应该专注于创造过程,而不是讨论工具。但是在过去这段时间,这款软件彻底改变了我在 macOS 使用鼠标的体验,我玩了很多年 FPS 游戏,对鼠标速度曲线十分敏感,这款软件能让使用鼠标的感觉和 Windows 一样:LinearMouse。我大受震撼破口大骂,macOS系统的默认鼠标设置真是**啊。

附2: 启发我重新开始写作的两则内容: