一、背景与问题
我是大二学生,同时要管课程、竞赛、部门事务和好几个开发项目。市面工具要么太重——Notion 全家桶学习成本高、打开慢;要么只解决单点——番茄钟、待办、笔记各自为政,数据分散在五个 App 里,复盘时凑不齐。
我要的是一个打开就能看到”今天该干什么”的单一入口:待办、学习目标、专注计时、热点资讯、健康打卡、每日复盘在同一个系统里互相引用(复盘能一键转成明日待办,考试倒计时能触发提醒)。
约束条件:学生预算(服务器成本必须为零)、手机 + 笔记本双端、数据云端同步且可备份导出。
二、我的角色
独立产品人与开发者,own 全部环节:需求定义与优先级排序、模块规划与信息架构、技术选型、前后端实现、测试与发布流程。AI 深度参与编码与审查,但架构决策、验收标准、发版节奏由我把握——为此建立了版本号制度(SemVer 裁剪 + 发版 checklist)和自动化发版脚本(v1.15 起,一条命令出包)。
三、过程与关键取舍
取舍 1:模块注册表,让”加功能”不再是体力活。 多模块 SPA 的侧边栏、底部 Tab、路由、首页卡片最初分散在四处,新增模块要改 4 个文件。改为单一类型化注册表后,导航/路由/首页卡片全部由它生成,新增模块 = 新建文件夹 + 注册表加一行,且每个模块自动独立 chunk 懒加载。代价是注册表引用超前会卡构建,纪律是每个 commit 保持可构建。
取舍 2:双适配器数据层,不被云端阻塞。 Supabase 凭据、建表在开发早期无法就绪。我定义了 33 个方法的 Repository 接口,本地实现(localStorage)与云端实现(Supabase)按环境变量切换——整个开发周期无凭据也能全功能跑通。代价:两个实现必须逐方法对齐语义(任务完成状态机、upsert 必须带 id),这类”本地/云端行为分叉”是项目里最隐蔽的 bug 类。
取舍 3:体积预算门禁,被否掉的 Motion 方案。 v1.13 起引入客户端体积预算门禁 + Playwright E2E。v1.22 我想用 Motion 动画库做启动动画,实测包体 +123KB,破预算——放弃,降级为零依赖 Canvas 氛围层 + 手写 FLIP 动画替代。预算门禁的价值就在这一刻:它让”要不要引一个库”从感觉问题变成数字问题。
取舍 4:AI 代码审查不盲信。 v1.9 对一轮 72 条 AI 代码审查逐条核实:约 1/3 是误报,5 条标 CRITICAL 的全部不成立。AI 提效,但验证权必须留在人手里——这条后来成了我仓库执行规则的固定条款。
四、结果与量化
- 4 周内发布 22 个版本(v1.0 → v1.22),从 5 模块长到 7 大主模块(总览、学习与科研、自我提升、资讯与资料、健康、复盘、我的),全程每个 commit 可构建。
- 质量门禁全绿:98 个单元测试 + Playwright 端到端 + 体积预算门禁(拦下 123KB 的劣化方案)。
- 产品在线运行:personal-workbench-lilac.vercel.app(注:*.vercel.app 域名国内直连需代理)。支持 PWA 安装、Web Push / Server酱 提醒、备份导出导入、云端多设备同步。
- 诚实交代:这是 N=1 的自用产品,没有外部用户数据。它的价值在于完整产品过程的证据——版本制度、发版 checklist、验收清单、体积预算,这套流程可以直接复用到团队场景。
五、复盘与反思
成立的:注册表 + 双适配器让四周密集迭代没有烂尾(此前我做项目常死于结构混乱);质量门禁让”快速迭代”没有变成”快速腐化”。
过度设计的:v1.18 我花两天纯 CSS 手绘启动动画,被打回重做——v1.19 换 Meteocons 素材库一天完成,效果更好。教训固化:先找现成方案,自研是最后选项。
下次会验证的:提醒到达率(Web Push vs Server酱)值得做对比实验;若未来开源,双适配器数据层和注册表模式是两个可独立复用的模块。