Work Summary
过去 2.5 天的开发工作主要集中在分数录录系统 (fenshululu) 的全栈重构和认证服务 (fenshululu-auth) 的性能优化。这是一个典型的"从原型到生产"的演进过程,涉及后端 API 修复、前端 E2E 测试覆盖、微信登录流程优化,以及基础设施的高可用配置。
核心成果:
- 修复了后端 API 路由缺失问题(
assign-classes端点),解决了班级与考试关联失败的根本原因 - 将分页限制从 100 提升到 500,解决了 ExamModal 班级列表不完整的问题
- 完成了 177 个 E2E 测试用例,40 个 Hotpath 核心业务流程测试全部通过
- 优化了微信扫码登录流程,从 EdgeOne KV(延迟 500-1200ms)切换到 Upstash Redis,显著降低了轮询延迟
- 实现了前端音频格式转换(WebM → MP3),减少了后端 CPU 开销
- 配置了 New-API 中转服务的高可用策略,解决了 LLM 渠道切换时的
signature字段错误
技术决策亮点:
- 架构简化:移除了"管理员"概念,所有教师用户平权,学校 ID 仅作为数据隔离标签
- 性能优先:选择 Upstash Redis 替代 EdgeOne KV,牺牲一定的 Serverless 纯度换取更低的延迟
- 测试驱动:先编写完整的业务流程集成测试,再进行代码重构,确保语义正确性
这段时间的工作展现了从"能跑"到"跑得好"的工程成熟度提升,尤其是在测试覆盖率和性能调优方面。
Improvement Areas
1. 性能问题的根因分析能力
现象:在解决微信登录延迟问题时,经历了多次尝试才定位到 EdgeOne KV 的地理位置(新加坡节点)是根本原因。初期尝试了优化轮询间隔、调整前端逻辑等方向,但都未触及核心问题。
根因:缺乏系统化的性能分析方法论。遇到延迟问题时,应该先建立完整的调用链路图,测量每个环节的耗时,而不是凭直觉猜测瓶颈。
行动项:
- 学习使用 OpenTelemetry 或类似工具进行分布式追踪
- 建立性能基线测试流程:在架构决策前先做 POC 性能测试
- 养成"测量优先于优化"的习惯:先用
curl -w或 Postman 测量实际延迟,再决定优化方向
2. 架构决策的文档化习惯
现象:在 Session 存储方案选型(EdgeOne KV vs Upstash Redis)和音频处理策略(前端转换 vs 后端转换)时,做出了正确的技术决策,但缺乏结构化的决策记录。后续如果需要回顾"为什么当时选择 Upstash",只能从聊天记录中拼凑。
根因:缺少 ADR(Architecture Decision Record)的实践习惯。技术决策散落在代码注释和聊天记录中,难以追溯和传承。
行动项:
- 为 fenshululu 项目建立
docs/adr/目录,记录关键架构决策 - 使用标准 ADR 模板:Context → Options → Decision → Consequences
- 每次重大技术选型后,花 10 分钟写一份 ADR,包含性能数据和权衡分析
3. E2E 测试的业务语义覆盖
现象:虽然完成了 177 个 E2E 测试用例,但初期测试更多是"打开页面"级别的验证,缺乏完整业务流程的端到端覆盖。经过多次迭代才补充了"用户登录 → 创建班级 → 创建考试 → 关联班级 → 录入分数"这样的完整流程测试。
根因:测试设计时过于关注技术细节(API 是否返回 200),而忽略了业务价值(用户能否完成核心任务)。这导致测试通过了,但实际功能仍然不可用。
行动项:
- 采用 BDD(Behavior-Driven Development)思维:先写 Given-When-Then 场景,再实现测试
- 每个 Hotpath 测试必须覆盖一个完整的用户故事,而不是单个 API 调用
- 引入视觉回归测试(如 Percy 或 Playwright 截图对比),确保 UI 变更不破坏用户体验
Strengths
- 问题解决的持续性:在遇到 New-API 渠道切换
signature错误、EdgeOne KV 延迟等问题时,没有轻易放弃,而是通过多次尝试、查阅文档、网络搜索最终找到解决方案。这种"不轻易放弃"的特质是工程师的核心竞争力。
- 架构权衡的务实性:在 Session 存储方案选型时,能够跳出"Serverless 纯度"的思维定式,选择 Upstash Redis 这种更实用的方案。这体现了"解决实际问题"优先于"技术纯粹性"的成熟工程思维。
- 测试驱动的意识觉醒:从初期的"能跑就行"到后期主动要求"完整业务流程测试",展现了测试意识的显著提升。尤其是对"测试语义正确性"的强调,超越了单纯的代码覆盖率指标。
- 基础设施的高可用思维:在配置 New-API 中转服务时,考虑了渠道优先级、权重分配、自动禁用阈值等高可用策略,而不是简单的负载均衡。这种思维在初创项目中尤为难得。
Action Items
- P0 - 为 fenshululu 项目建立 ADR 文档体系 → 输出 3 份关键决策记录(Session 存储、音频处理、权限模型)
- P0 - 学习 OpenTelemetry 分布式追踪 → 在 fenshululu-auth 中集成基础追踪,可视化请求链路
- P1 - 补充 Hotpath 测试的视觉回归验证 → 为核心流程添加 Playwright 截图对比
- P1 - 整理 tools/ 目录下的项目文档 → 为每个工具项目生成 README 和技术栈说明
- P2 - 研究 JVM 性能优化案例(参考 HN 文章) → 输出一份 Go 语言性能调优的对比笔记
Tech Trends
今日 HackerNews 热门技术话题精选。
1. A 40-line fix eliminated a 400x performance gap
Points: 105 | Comments: 23
OpenJDK 通过一个 40 行的修复,将 getCurrentThreadUserTime() 的性能提升了 400 倍。核心改进是用 clock_gettime() 系统调用替代了读取 /proc/self/task/ 文件的方式。旧实现需要多次系统调用(open、read、close)和复杂的字符串解析,而新实现利用 Linux 特有的 clockid 位操作技巧,直接从内核调度器数据结构读取线程 CPU 时间。
Key Takeaways:
- 性能优化的本质是减少系统调用和内核态切换
/proc文件系统虽然方便,但在高频调用场景下性能开销巨大- 利用平台特定 API(如 Linux 的 clockid 位掩码)可以突破 POSIX 标准的限制
对 Go 开发的启示: Go 的 runtime.ReadMemStats() 也存在类似问题(需要 STW),可以考虑用 runtime/metrics 包的低开销 API 替代。
2. A deep dive on agent sandboxes
Points: 30 | Comments: 9
深入分析了 AI Agent 沙箱技术的实现方案,包括容器隔离、WebAssembly 沙箱、以及基于 seccomp/AppArmor 的系统调用过滤。文章对比了 E2B、Modal、Fly Machines 等商业方案的架构设计,强调了安全性与性能的权衡。
Key Takeaways:
- AI Agent 的安全隔离需要多层防护:进程隔离 + 网络隔离 + 文件系统隔离
- WebAssembly 提供了轻量级沙箱,但功能受限(无法直接访问系统资源)
- 生产环境建议使用 gVisor 或 Firecracker 实现强隔离
对当前项目的启示: fenshululu 的语音识别功能如果未来需要支持用户上传的自定义脚本,需要考虑沙箱隔离方案。
3. Confer – End to end encrypted AI chat
Points: 68 | Comments: 58
Signal 创始人 Moxie Marlinspike 推出的端到端加密 AI 聊天服务。核心技术是"私有推理"(Private Inference),通过同态加密和安全多方计算,让 AI 模型在不解密用户输入的情况下完成推理。虽然性能开销较大(约 10-100 倍延迟),但为隐私敏感场景提供了新思路。
Key Takeaways:
- 端到端加密不仅适用于消息传输,也可以扩展到 AI 推理
- 隐私计算的性能瓶颈仍然显著,需要在隐私和体验之间权衡
- 开源社区对"可验证的隐私保护"需求日益增长
对认证服务的启示: fenshululu-auth 的微信登录流程中,用户的 openid 可以考虑在传输和存储时加密,避免明文泄露。
4. No management needed: anti-patterns in early-stage engineering teams
Points: 71 | Comments: 117
分析了初创团队常见的管理反模式,包括"扁平化迷信"、"自组织幻觉"、"技术债务积累"等。作者强调,即使是小团队也需要明确的角色分工和决策机制,否则会陷入"人人负责=无人负责"的困境。
Key Takeaways:
- 扁平化组织不等于无管理,而是需要更清晰的协作协议
- 技术债务的根源往往是缺乏架构决策记录(ADR)
- 早期团队应该建立轻量级的 Code Review 和设计评审流程
对个人项目的启示: 虽然是个人开发,但 ADR 文档和决策记录同样重要,避免 3 个月后忘记"为什么当时这么做"。
Learning Resources
性能优化与系统调用
- Linux Performance - Brendan Gregg 的 Linux 性能分析工具集
- The Definitive Guide to Linux System Calls - 系统调用深度解析
- Go runtime metrics - Go 语言低开销性能指标 API
AI Agent 与沙箱技术
- gVisor: Container Runtime Sandbox - Google 开源的容器沙箱
- Firecracker: Lightweight Virtualization - AWS 的微虚拟机技术
- WebAssembly System Interface (WASI) - WebAssembly 的系统接口标准
架构决策与文档化
- Architecture Decision Records (ADR) - ADR 模板和最佳实践
- Documenting Architecture Decisions - Michael Nygard 的经典文章
- C4 Model for Software Architecture - 软件架构可视化方法
测试驱动开发
- Playwright Best Practices - E2E 测试最佳实践
- Testing Library Guiding Principles - 测试语义化原则
- Visual Regression Testing with Percy - 视觉回归测试工具