从0到1:我的开源项目成长记

小而美开发者
2026-04-24 06:36
阅读 572

去年冬天的某个凌晨三点,我缩在杭州出租屋的飘窗边,盯着屏幕上一行行跳动的日志,一边啃着冷掉的葱包桧儿,一边调试一个死活跑不通的 AI Agent 工作流。窗外运河边的路灯昏黄,屋里只有机械键盘咔嗒作响——那一刻,我突然意识到:这玩意儿,或许真能做成点什么。

我是自由开发者一枚,坐标杭州,离阿里西溪园区骑个共享单车也就二十分钟。过去几年,要么接外包单子,要么给大厂做远程协作模块,日子过得自由但有点寂寞。尤其到了深夜,代码写得飞起,却没人能一起吐槽产品经理临时加的需求:“这个功能很简单嘛,不就是让 AI 自动帮我改 bug 吗?”——呵,简单?那你来啊!


起心动念:为什么要做 OpenCode?

其实最初的想法很朴素:我不想再重复造轮子了

每次接新项目,总要花好几天搭基础架构——用户权限、日志收集、CI/CD、文档生成……更别提那些“AI 集成”的需求,客户张口就要“智能助手”,结果连个像样的 Prompt 管理都没有。有一次,我甚至在同一个项目里写了三套不同的 LLM 调用封装,就因为前期没想清楚抽象层。

那会儿刚好刷到 GitHub 上有个叫 “OpenCode” 的倡议(不是官方项目,是我自己取的名字),核心思想是:开源、可组合、面向开发者的 AI 编程基础设施。灵感一来挡不住,我心想:干脆自己搞一套?

于是,2023 年 11 月 7 日,我在 GitHub 上建了个仓库,README 只有一句话:

A minimal, composable foundation for AI-powered developer tools. Built by one tired dev in Hangzhou.

项目名叫 devmate —— 开发者伙伴的意思。目标很明确:让独立开发者也能轻松集成 AI Agent,不用被繁琐的工程细节拖垮


第一次提交:理想很丰满,现实很骨感

最初的版本简直惨不忍睹。

我用 FastAPI 搭了个后端,前端是个简陋的 CLI 工具,AI 部分直接调用 OpenRouter API。想着“先跑起来再说”,结果第一天就遇到三个坑:

  1. Token 管理混乱:不同模型返回的 token 格式不一致,有的带 usage 字段,有的没有;
  2. 上下文截断太狠:用户问个复杂问题,Agent 回答到一半就被截断,还美其名曰“节省成本”;
  3. 本地调试巨慢:每次改一行代码都要重启整个服务,而我的小破笔记本风扇狂转像要起飞。

最崩溃的是上周五晚上,我正准备发第一个 release,结果测试时发现:当用户连续提问超过 5 次,Agent 会把之前的对话历史全丢掉!查了半天,原来是 Redis 缓存键名拼错了,少了个下划线。当时真的想砸电脑——但转念一想,砸了还得自己修,算了,泡杯咖啡继续干。


关键转折:重构 + 社区反馈

转折点出现在今年 1 月。我把项目链接发到了几个技术群,没想到竟有几位朋友认真试用了,还提了 issue。其中一位在网易做平台工程的老哥说:

“你这个 Agent 的记忆机制太 naive 了,能不能支持按 session 分片存储?我们内部工具都这么干。”

这句话点醒了我。原来我一直纠结于“通用性”,却忽略了真实场景中的隔离需求。于是,我花了整整两周重构核心模块,引入了 Memory Store 抽象层,支持 Redis、SQLite、甚至内存存储。同时,把 AI 调用逻辑拆成 AgentExecutor + ToolRegistry 模式,方便用户自定义工具链。

代码结构也彻底重做。以前是“面条式”代码,现在变成这样:

# devmate/agent/core.py
class DevMateAgent:
    def __init__(self, memory: BaseMemory, tools: List[BaseTool]):
        self.memory = memory
        self.tools = tools

    async def chat(self, user_input: str, session_id: str) -> str:
        context = await self.memory.get(session_id)
        prompt = self._build_prompt(context, user_input)
        response = await self._call_llm(prompt)
        await self.memory.save(session_id, response)
        return response

是不是清爽多了?可读性和可维护性,永远比“快”更重要——这是我从阿里前同事那儿学到的血泪教训。他们有个内部规范:函数超过 30 行必须拆,否则 Code Review 直接打回。


引入 AI Agent:不是噱头,而是生产力

很多人觉得“AI Agent”就是个营销词,但在我这儿,它是实打实的开发加速器

比如,devmate 内置了一个 CodeFixer 工具,用户可以直接说:

“这段代码报错了:AttributeError: 'NoneType' object has no attribute 'strip',帮我修一下”

Agent 会自动分析错误栈,定位到可能出问题的变量,然后生成修复建议。虽然不能 100% 正确,但在 70% 的场景下能省去我查文档的时间。

更酷的是,我还加了个 自学习机制:如果用户采纳了某条建议,系统会记录这个 pattern,下次遇到类似错误就优先推荐。这其实借鉴了 GitHub Copilot 的 feedback loop 思路,只不过我用的是轻量级向量数据库 Chroma。

当然,也踩过雷。有次为了“炫技”,我把所有日志都喂给 LLM 做摘要,结果账单暴涨——AI 不是免费的,每一 token 都是钱。后来赶紧加上 cost estimator 和 rate limit,这才稳住。


开源之后:孤独开发者不再孤单

说实话,开源之前,我总觉得“一个人做项目”很酷。但真正发布后才发现:开源的魅力,在于连接

GitHub Star 从 0 到 100 的那天,我在朋友圈发了张截图,配文:“终于有人比我更早发现这个 bug 了”。结果评论区炸出好几个杭州同行,有人说“要不要一起搞个 meetup?”,还有人直接 PR 了中文文档。

最感动的是上个月,一个大学生私信我:

“学长,我用你的 devmate 做课程设计拿了优秀,谢谢!”

那一刻,所有的熬夜、debug、自我怀疑,都值了。

目前项目已经有 800+ stars,12 位 contributor,甚至有两家 startup 在生产环境试用。虽然离“爆款”还差得远,但对我这个自由开发者来说,已经是莫大的鼓励。


开发心得:几点掏心窝子的话

回顾这一年,除了代码,我收获更多的是心态上的成长。分享几点心得,希望能帮到同样在路上的朋友:

  • 别追求完美,先跑通 MVP。我一开始想做“全能型”工具,结果三个月没动静。后来改成“只解决一个问题”,反而快速迭代。
  • 文档就是产品的一部分。我花了一周时间写 tutorial,结果 issue 量减少了 40%。用户不是懒,是看不懂。
  • 自动化测试不是负担,是安全感。现在每次 push,GitHub Actions 自动跑单元测试 + lint + 安全扫描,心里踏实多了。
  • 远程办公更要主动连接。我每周固定参加两次线上 tech talk,不然真的会“社恐退化”。

对了,关于工作生活平衡——我现在强制自己 晚上 12 点关电脑(除非真有紧急 bug)。毕竟,代码可以重写,头发掉了可长不回来。


效果如何?数据说话

上线半年,devmate 的核心指标如下:

指标 数值 说明
GitHub Stars 842 截至 2024 年 6 月
Weekly Active Users (社区版) ~120 通过 telemetry 统计
Avg. Response Time 1.8s P95 < 3s
Cost per Session $0.0023 使用 Mixtral + caching 优化后
Community PRs 27 包含文档、测试、新工具

最关键的是:我的外包项目交付效率提升了约 35%。以前要两天搭的脚手架,现在用 devmate 模板,半天搞定。


下一步:不止于工具,更是生态

未来,我希望 devmate 能成为 OpenCode 生态的一块积木。比如:

  • 支持与 VS Code / JetBrains 插件深度集成;
  • 提供 “Agent Marketplace”,让用户共享自定义工具;
  • 探索基于 WASM 的本地推理,减少对云端依赖。

当然,这些都需要时间和社区共建。我不着急,慢慢来。


写这篇文章的时候,又是凌晨两点。窗外运河依旧安静,但我的心情和一年前完全不同。那时焦虑、迷茫,怀疑自己是不是选错了路;现在虽然还是一个人写代码,但知道世界另一头,有人在用我的工具解决问题

如果你也在独自开发的路上,不妨试试开源一个小项目。不为名利,只为证明:哪怕是一个人的团队,也能创造有价值的东西

最后,送大家一句我贴在显示器边的话:

“代码会过时,但解决问题的热情不会。”

—— 一个还在杭州写代码的独立开发者

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝