介绍
技术债务在每个代码库中累积:重复代码、缺少测试、过时依赖项和不一致的模式。 这些问题可能会累积,因为特征开发通常具有更高的优先级。 本教程介绍如何在不牺牲特征速度的情况下,使用 GitHub Copilot 系统地解决技术债务。
本教程面向谁
本教程旨在帮助工程团队和技术主管减少技术债务,同时保持新功能交付速度。 你应该具备以下能力:
- Copilot 订阅,可以访问 Copilot编程助理
- 至少一个存储库的管理员权限
- 熟悉团队的开发工作流
你要完成的操作
在本教程结束时,你将了解以下内容:
- 使用 Copilot 实现即时修复
- 利用 Copilot编程助理 执行大规模清理任务
- 创建自定义指令,使 Copilot 与你的团队标准保持一致
- 衡量 Copilot 对技术债务的影响
了解技术债务问题
在开始减少代码库中的技术债务之前,你应该花些时间来确定团队最常面临的技术债务类型。
常见的技术债务类型包括:
-
**代码重复** - 在多个位置实现的相同逻辑 -
**缺少测试** - 测试覆盖不足的特性 -
**过时的依赖项** - 库已落后于当前发布的几个版本 -
**不一致的模式** - 跨代码库对相同问题的不同方法 -
**旧代码** - 可以工作但不符合当前标准的旧代码
技术债务的成本随着时间的推移而累积。
- 高级工程师花时间进行例行更新,而不是体系结构设计
- 代码评审因为审阅者对不一致模式的争论而变得更长
- 由于代码组织混乱,新开发人员需要更长的时间加入
- 部署风险随着过时依赖项累积漏洞而增加
在 IDE 中使用 Copilot 执行即刻修复
避免代码库中积累的技术债务的最佳方式是首先防止它进入代码库。
在开发过程中遇到技术债务时,请在 IDE 中使用 Copilot 立即修复。
快速重构工作流
-
在 IDE 中工作时,突出显示需要改进的代码。
-
在 IDE 中打开 Copilot对话。
-
要求 Copilot 重构代码。 例如:
Extract this into a reusable helper and add error handlingStandardize this logging format to match our patternAdd null checks for all optional parametersReplace this deprecated API call with the current version
-
查看建议的更改。
-
接受更改或要求 Copilot 修改其方法。
-
运行测试以验证更改是否正常工作。
示例:标准化错误处理
如果您发现错误处理不一致,例如:
// Highlight this code
try {
await fetchData();
} catch (e) {
console.log(e);
}
要求 Copilot 改进代码,例如:
Refactor this to use structured logging and proper error handling
// Highlight this code
try {
await fetchData();
} catch (e) {
console.log(e);
}
Refactor this to use structured logging and proper error handling
Refactor this to use structured logging and proper error handling
Copilot 可能会建议:
try {
await fetchData();
} catch (error) {
logger.error('Failed to fetch data', {
error: error.message,
stack: error.stack,
timestamp: new Date().toISOString()
});
throw error;
}
注意
此响应是一个示例。 Copilot对话 的响应具有非确定性,因此,当针对同一代码运行相同的提示时,可能会获得不同的响应。
通过采用立即修复方法,有助于确保不合格代码不会添加到代码库,并避免创建可能永远不会解决的积压工作问题。
有关如何在 IDE 中使用 Copilot 的详细信息,请参阅 在 IDE 中提问GitHub Copilot 问题。
使用 Copilot编程助理 进行大规模重构
一些重构任务太大,无法完成,而团队中的每个人都忙于开发新功能。 在这种情况下,可以使用Copilot编程助理自主处理这些任务。 仍然需要人工的参与(至少用于审查 Copilot编程助理 所建议的更改),但让 Copilot 完成大部分工作,可以让你进行大规模重构,对团队生产力的影响要小得多。
何时使用 数据变量.copilot.copilot_coding_agent %}
对以下任务使用 Copilot编程助理:
- 在代码库中修改多个文件
- 需要系统更改(例如删除旧功能标志)
- 需要仔细测试,但实现简单明了
- 如果手动完成,将中断功能开发
示例包括:
- 影响 50 多个文件的框架升级
- 删除已弃用的功能标志
- 迁移到严格的 TypeScript
- 更新依赖项版本
- 标准化导入模式
Copilot编程助理 的工作流
-
创建描述重构任务的 GitHub 问题。
具体说明需要更改的内容。 例如:
Remove all feature flags marked for cleanup in Q2. These flags are: - `enable_new_dashboard` - `beta_export_feature` - `experimental_search` All three flags are enabled by default in production. Remove the flag checks and keep the "enabled" code path. -
将问题分配给 Copilot 用户。
-
Copilot编程助理 将:
- 设置开发环境
- 打开草稿拉取请求
- 对代码进行所需的更改
- 运行测试
- 完成提取请求以供审核
- 请求你对拉取请求进行审核
-
审核拉取请求,就像审核由用户提出的拉取请求一样。
-
如果需要更改,请留下评论。Copilot编程助理 将会根据你的反馈更新拉取请求。
-
以这种方式循环,直到工作完成正确为止。
-
批准和合并拉取请求。
有关详细信息,请参阅 要求 GitHub Copilot 创建拉取请求 和 审查 GitHub Copilot 创建的拉取请求。
安全护栏
Copilot编程助理 使用内置安全措施运行:
- 它只能推送到自己的
copilot/*分支 - 它无法合并拉取请求——需要您的审批
- 所有的提交都被记录且可进行审计
- 现有的分支保护仍处于活动状态
- 在合并任何代码之前运行 CI/CD 检查
为团队创建自定义说明
自定义指令有助于 Copilot 了解你团队的编码标准和模式。 这可确保建议从一开始就符合预期。
设置自定义指令
- 在存储库中创建名为
.github/copilot-instructions.md的文件。 - 以清晰、直接的语句添加团队的编码标准,例如使用项目符号列表。
- 将文件提交到存储库。
自定义说明示例
下面是有效的自定义指令示例:
## Our Standards
- Use structured logging, not console.log
- Sanitize user input before database queries
- Check for null/undefined on all optional parameters
- Keep functions under 50 lines (extract helpers if needed)
- Every public function needs a test
- Flag any loops that might trigger N+1 queries
## Error Handling
- Always use try-catch blocks for async operations
- Log errors with context (user ID, request ID, timestamp)
- Never swallow errors silently
- Return appropriate HTTP status codes
## Testing Requirements
- Unit tests for all business logic
- Integration tests for API endpoints
- Mock external services in tests
- Test both success and failure paths
有关编写自定义说明的详细指南,请参阅 为GitHub Copilot添加存储库自定义说明。
自定义说明的优点
自定义指令已设置后:
- Copilot 根据你的代码模式建议代码
- 代码评审变得更快,关于样式更改的讨论较少
- 新团队成员通过 Copilot 建议了解你的标准
- 提高代码库的一致性
运行试点计划
在广泛推广之前,先从小规模开始,验证 Copilot 对技术债务的影响。
第 1 周:设置和建立基线
-
确保所有试点参与者都有 Copilot 访问权限,并启用了 Copilot编程助理。
-
统计积压事项中的技术债务项:
- “技术债务”、“任务”或类似标签问题的数量
- 过时依赖项数
- 未通过 linter 检查的文件数量
-
跟踪当前指标:
- 从创建拉取请求到合并重构 PR 的平均时间
- 每个重构 PR 的平均审核轮次数
-
将 3-5 个最重要的标准创建到你的第一个
.github/copilot-instructions.md文件中。
第 2-4 周:实施试点
-
为试点选择 5-10 个存储库。
-
选择要解决的 1-2 个特定问题。 例如:
- 特定区域中的代码重复
- 对频繁更改的文件缺少测试
- 过时的依赖项
-
在 IDE 中使用 Copilot,以便在遇到问题时快速解决。
-
将较为复杂的清理任务分配给 Copilot编程助理。
-
仔细查看所有 Copilot 生成的 PR。
-
提供有关建议的反馈,以帮助 Copilot 了解你的偏好。
第 5 周:评估结果
试点后,测量结果:
-
重构拉取请求合并的速度有多快?
-
他们现在需要多少轮审查?
-
开发人员最常接受由 Copilot编程助理 在拉取请求中提出的哪些类型的代码更改建议?
-
哪些建议需要最修订?
-
你的技术债务指标是否正在改进?
- Linter 警告的数量在减少吗?
- 测试覆盖率增加?
- 依赖项版本更最新?
根据你所了解的哪些指导对 Copilot 的帮助最大,更新你的自定义指令。
衡量成功率
跟踪特定指标,了解 Copilot 对技术债务的影响。
速度指标
监控 Copilot 对开发速度的影响:
- 关闭技术债务问题的时间(目标:30-50% 减少)
- 每周合并的技术债务拉取请求数量(目标:增加 2-3 倍)
- 每个重构 Pull Request 的平均评审轮数(评估此轮数是增加还是减少)
质量指标
确保质量随速度一起提高:
- Linter 警告计数(应该呈下降趋势)
- 测试覆盖率百分比(这应呈上升趋势)
- 与重构代码相关的生产事故数量(评估是否有变化)
工程师满意度
定期获取团队反馈:
- 工程师们在例行维护上花费的时间是否更少?
- 代码评审是否更注重体系结构,不关注样式?
- 新团队成员的加入速度是否更快?
Troubleshooting
Copilot 建议的更改不正确
如果 Copilot 总是建议不符合你需求的代码:
- 查看自定义说明 - 它们可能过于模糊或矛盾
- 在提示中提供更具体的上下文
- 向自定义说明添加良好代码的示例
- 在拉取请求审查中留下详细的反馈意见,以便 Copilot编程助理 能够修复问题
拉取请求太大,无法审查
如果 Copilot编程助理 创建了难以审查的拉取请求:
- 将大型任务分解为较小的重点问题
- 要求 Copilot编程助理 一次处理一个文件或目录
- 使用更具体的问题说明
更改导致测试失败
如果重构引入了测试失败:
- 在使用Copilot编程助理之前,请确保您的测试套件可以可靠运行。
- 在合并之前仔细审查 Copilot 的变更
- 要求 Copilot 随代码更改一起更新测试
团队采用速度缓慢
如果你的团队未使用 Copilot 来管理技术债务:
- 分享早期采用者的成功案例
- 演示团队会议中的节省时间
- 从最恼火的技术债务项目开始
- 将制定自定义说明作为团队活动
结论
本教程介绍如何使用 Copilot 系统地减少技术债务。 现在,你已了解如何:
- 在 IDE 中立即使用 Copilot 修复技术债务
- 将大型重构任务分配给 Copilot编程助理
- 创建自定义指令,使 Copilot 与你的团队标准保持一致
- 运行试点计划以验证方法
- 度量 Copilot对技术债务的影响
通过自动执行例行重构和维护任务,Copilot 可让你专注于体系结构、功能开发和其他高价值工作。
快速调查
注释 %}
阅读完本教程后,你是否有信心使用 Copilot 来减少代码库中的技术债务?
<a href="https://docs.github.io/success-test/yes.html" target="_blank" class="btn btn-outline mt-3 mr-3 no-underline">
<span>Yes</span></a><a href="https://docs.github.io/success-test/no.html" target="_blank" class="btn btn-outline mt-3 mr-3 no-underline"><span>No</span></a>
尾注 %}
后续步骤
-
**展开试点**:根据试点结果推广到更多存储库。 -
**自动执行依赖项更新**:为 Copilot编程助理 创建定期问题,处理依赖项更新。 -
**生成重构队列**:将积压工作中的问题标记为适合 Copilot,然后定期将其中一批分配给 Copilot 进行处理。 -
**共享最佳做法**:记录团队的成功提示和自定义说明。
延伸阅读
-
[AUTOTITLE](/copilot/using-github-copilot/coding-agent) -
[AUTOTITLE](/copilot/tutorials/refactoring-code-with-github-copilot) -
GitHub 博客中的[如何在 IDE 中使用 GitHub Copilot:提示、技巧和最佳做法](https://github.blog/developer-skills/github/how-to-use-github-copilot-in-your-ide-tips-tricks-and-best-practices/) -
GitHub 博客中的[将 GitHub Copilot 编码代理集成到工作流程中的 5 种方法](https://github.blog/ai-and-ml/github-copilot/5-ways-to-integrate-github-copilot-coding-agent-into-your-workflow/)