日常开发提效实战:习惯与工作流

20 阅读6分钟

日常开发提效实战:习惯与工作流

上一篇聊的是「用 Cursor 在 .NET 项目里提效」,这篇换一个角度:不依赖某款 IDE 或 AI,靠习惯、工作流和小工具,把「需求 → 开发 → 排查 → 交付」这条链路捋顺,少返工、少熬夜。


一、需求到手先拆解:三句话 + 一张表

需求文档或口述需求经常又长又散,直接开写容易漏点、做错范围。提效的第一件事:在写代码前,先把需求压成「可执行清单」。

三句话定边界

用三句话逼自己说清楚(可以写在任务描述或注释里):

  1. 做什么:用一句话说清功能/改动目标(例如:「支持按申请单号查询发票申请单详情并返回 DTO」)。
  2. 动哪些层:接口层、应用层、领域层、表结构、外部调用——勾出会碰到的,避免写到一半才发现要改表。
  3. 不做什么:明确排除项(例如:「本期不做分页」「不接 ERP 回写」),减少和产品来回扯皮。

一张表拆任务

用表格把「需求 → 具体改动点」拆开,一行一个可交付小任务,例如:

序号改动点涉及文件/模块验收方式
1Domain 新增查询接口IInvoiceService, InvoiceService单测/手测
2Application 封装InvoiceAppService调 API 验证
3Controller 暴露InvoiceController接口文档/Postman

拆完再开分支、写代码,思路清晰,也方便估时和汇报进度。


二、分支与提交:少在合并上耗时间

分支乱、提交信息随意,合并时冲突多、回滚难。养成固定习惯,能省很多「理历史」的时间。

分支命名约定

  • 功能feature/需求简写-简短描述,如 feature/invoice-query-by-applyno
  • Bugfix/问题简写bugfix/ticket-123
  • 发布/热修release/版本号hotfix/问题描述

同一需求只开一个 feature 分支,从 develop 或 main 拉,改完再合回去,避免「好几个分支不知道哪个是最终版」。

提交信息写清「做了什么」

不用写小作文,但至少要让人(以及三个月后的自己)一眼看懂:

  • 好的feat(invoice): 按申请单号查询申请单详情接口fix: 空列表时 NRE,增加 null 判断
  • 差的修改更新fix bug

习惯用「类型(模块): 简短说明」的格式,后续用 git log --oneline、按模块筛选都会很顺手。

小步提交,大功能拆多次 commit

一个需求可以拆成 3~5 个 commit:例如「加接口定义」「加实现」「加 Controller」「补单测」。这样回滚、code review、bisect 找问题都方便,不必在一个巨型 commit 里翻。


三、调试与排查:先定范围再下断点

很多人一报错就全项目下断点、盲目 F10。先缩小范围,再精确打断点,能少走一半弯路。

先看调用栈和首行

  • 看异常第一次出现的堆栈行(通常是你的业务代码,而不是框架深处)。
  • 看报错信息里的关键实体(如「OrderInvoiceApply 为 null」「InvoiceOrderList 为空」),直接去构造/赋值这条数据的地方查。

用「二分法」锁定时序问题

怀疑是「A 执行完才到 B,但实际顺序反了」这类问题时:

  • 在关键路径前后打日志(如 Log("Step1 done")Log("Step2 start")),跑一遍看顺序。
  • 或临时加断言/抛异常,确认「代码是否真的执行到这里」。

日志:关键步骤必打,格式统一

  • 入口:入参(脱敏)、关键 ID(订单号、申请单号)。
  • 分支:进入哪个 if、调了哪个下游。
  • 出口:返回码、影响行数、耗时(大操作建议记一下)。

格式统一(如 [InvoiceApply] Create start, applyId=xxx),方便用日志系统按关键字搜、按 traceId 串起来看。


四、代码模板与 Snippet:少敲重复结构

每个项目都有大量重复结构:构造函数注入、try-catch 包一层、标准 API 返回格式、单测的 Arrange-Act-Assert。用 Snippet / 文件模板 一次配好,长期省时间。

VS / Rider 的 Snippet

  • C#ctor 生成构造函数、prop 生成属性;可以自定义 svc → 生成「带 ILogger 的 Service 构造函数」等。
  • 为你们项目定制:例如 invapp → 生成「Application 层调用 Domain 并转 DTO」的模板方法骨架。

文件级模板

  • 新建 Service 时:类名、命名空间、接口 + 实现、构造函数注入的骨架一次生成。
  • 新建 Controller 时:路由前缀、[HttpGet]/[HttpPost]、标准返回类型、日志与异常处理。

把团队共用的模板放到仓库的 docs/templates 或 Wiki,新人也能快速统一风格。


五、读老代码:先画边界再进细节

接手老项目或改别人模块时,不要一上来就逐行读。先划清边界,再按调用链往下走。

第一步:找入口和出口

  • 入口:API 的 Controller 方法、消息队列的 Handler、定时任务的入口方法。
  • 出口:调了哪些其他 Service、写了哪几张表、发了哪些 MQ/HTTP。

用 IDE 的「查找引用」「调用层次」快速画出「谁调我、我调谁」,一张小图或列表就够。

第二步:抓主流程,忽略分支

  • 先跟一条主流程(例如「创建发票申请单」从 Controller → AppService → DomainService → 仓储)。
  • 分支逻辑(各种 if、异常处理)第一遍可以略读,等改到再细看。

第三步:用注释和便签做「路标」

在复杂方法或类上临时加 // TODO: 理解后再删 或简短注释,标出「这里在干什么」「为什么这样写」。下次再摸这块代码,直接看自己的路标,不用重新推演。


六、文档与方案:用结构代替发挥

写技术方案、设计文档、复盘报告时,先搭结构再填内容,比边想边写快很多。

方案文档的通用结构

  • 背景与目标:为什么要做、做到什么算完成。
  • 方案概述:一两段话总览,再分「接口设计」「数据流」「存储/依赖」。
  • 影响范围:动哪些服务、哪些表、有没有兼容旧逻辑。
  • 风险与回滚:可能出什么问题、怎么回滚、有没有开关/灰度。

按这个结构填空,产品、测试、运维都能快速找到关心的部分。

复盘/总结的通用结构

  • 做了什么:需求/问题简述。
  • 怎么做的:关键设计、关键代码或配置。
  • 踩坑与解决:遇到的问题、怎么查、怎么修。
  • 后续可优化:没做完的、可以改进的点。

写给自己看也行,用来做分享、写周报都方便复用。


七、小结:提效的本质是「少返工」

环节习惯/动作
需求三句话定边界 + 一张表拆任务,再开分支写代码。
分支与提交统一命名、写清 commit 信息、小步提交。
调试先看调用栈和首行,用二分法锁定时序,日志格式统一。
写代码用 Snippet/模板统一重复结构,减少手敲。
读老代码先找入口/出口,跟主流程,用注释做路标。
文档与方案先搭结构再填内容,背景→方案→范围→风险。

这些都不依赖特定 IDE 或 AI,坚持一段时间,你会明显感觉「想得清、查得快、写得少重复」。若你已经在用 Cursor 或其它 AI 工具,可以把「需求拆解表」「提交规范」「日志格式」写进 .cursorrules 或团队规范,让 AI 生成的代码和你的习惯同频,效率会再上一档。


你平时还有哪些「习惯或工作流」明显提升了效率?欢迎在评论区分享。