在实际项目中,代码能跑只是起点,能长期维护、能快速定位问题、能顺畅协作才是真正的本事。下面这些技巧都来自真实项目的血泪经验,没有大道理,只有拿来就能用的方法。
1. 一切从明确的接口开始
无论是前后端对接,还是模块间的调用,先把接口格式定下来再开工。
- 用简单的 Markdown 或 Swagger 文档把请求路径、参数、返回值写清楚
- 前后端各自 mock 数据独立开发,联调时才不会被“对方还没写完”卡住
- 接口定义一变更,通知所有人并同步更新文档,口头约定迟早会忘
真实案例:曾有项目因为字段名从
userId改成userId(大小写变化),前端调试一下午才发现。接口文档里定下用小驼峰就全员遵守。
2. 环境隔离,本地能跑才提交
“在我机器上没问题” 是最危险的谎言。用以下方式消灭环境差异:
- 复制一份
.env.example,开发者基于它创建自己的.env文件,不入库 - 使用 Docker Compose 统一启动数据库、缓存等依赖,一键拉起开发环境
- 提交代码前运行完整的编译和单元测试,配合 Git hooks 自动检查
如果新人拉代码后需要折腾半天才能跑起来,这份代码的环境配置就不合格。
3. 日志要能讲故事
好的日志能让你不连生产服务器就知道哪出错了。
- 关键节点必须打日志:收到请求、调用外部服务、数据库操作、异常捕获
- 带上上下文:
User[123] order[456] payment failed, reason: timeout比 “支付失败” 强一百倍 - 区分等级:debug / info / warn / error,生产环境至少输出 info 以上
- 避免敏感信息(密码、token)写入日志
实战经验:在用户反馈问题后,用一条请求追踪 ID(traceId)贯穿所有日志,三分钟内就能捞出完整调用链。
4. 提交信息是写给人看的
git commit -m "fix bug" 这样的记录在一个月后对自己都是天书。
- 采用 “类型: 简短描述” 格式:
feat: 增加用户登录日志、fix: 修复订单金额计算错误 - 描述清楚“做了什么”和“为什么”,比如:
fix: 订单金额使用数据库 decimal 字段,避免浮点数精度问题
- 一次提交只做一件事,方便以后
cherry-pick或回滚
5. 小心“以后再说”的代码
“先这样写,后面再优化”最后几乎都会变成永久的临时方案。
- 如果必须妥协,至少加上
// TODO: 需重构 - 当前方案在每秒1000请求时会瓶颈,并建一个任务卡片跟踪 - 每轮迭代专门留出 10%-15% 的时间清理这类技术债
- 定期用静态分析工具(如 SonarQube)扫描代码嗅觉,防止雪崩式腐化
6. 让错误处理显式化
不要默默吞掉异常,也不要到处写重复的 try-catch。
- 定义项目级的异常类(如
BusinessException),在统一拦截器中处理,返回标准错误响应 - 调用外部服务、读文件、网络请求必须处理异常,提供降级或明确报错
- 对“不可能发生”的
else分支打个警告日志:
log.warn("进入了预期外的分支,参数状态: {}", param);
7. 测试先保关键路径
追求 100% 测试覆盖率不现实,但核心逻辑必须被自动化测试保护:
- 下单、支付、权限校验这类流程必须写集成测试或单元测试
- 当你修一个 bug,先写一个会复现的测试,确认修复后将它留在测试集里
- 善用测试数据工厂,避免测试代码里到处硬编码数据
8. 慢就是快:方案讨论别偷懒
拿到需求直接写代码是返工的主要来源。
- 哪怕只花 10 分钟画个流程图,也能避免一半的逻辑错误
- 涉及状态转换、角色权限的需求,用表格把每种组合列出来再核对
- 需求评审时追问:“如果用户同时点两次提交怎么办?”“网络断了重试会重复扣款吗?”
9. 运维监控从第一天就设计
开发时就把“如何观测系统”想清楚:
- 暴露健康检查接口(/health),返回数据库连接、缓存状态等
- 关键接口埋点:QPS、响应时间、错误率,接入 Prometheus + Grafana 或类似的监控
- 编写部署说明:如何配置环境变量、如何验证部署成功、如何回滚
10. 记录共识,而非只靠沟通
远程或异步协作中,聊天记录里的决策很快被淹没:
- 重要技术决策用 ADR (Architecture Decision Record) 的格式简要记录:背景、决策、后果
- 会后同步结论到项目协作平台(如 Jira、Notion),并@需知悉的人
- 代码即文档:复杂逻辑的 README 或注释里写清“为什么这样设计”
这些技巧没有高深的理论,但每一条都能在真实的开发周期里帮你少踩坑、少加班、少背锅。选几条先在自己项目里用起来,慢慢形成团队习惯,你会明显感受到工程效率的提升。