<a id="blog-hero"></a>

# 现代软件工程与研发交付工具链

Written by guog

Published: 2026-10-14 / 28 min read

以一次需求的完整交付为主线，介绍协作、自动化、可复现构建和持续反馈。

[View more blogs with the tag #软件工程](https://guog.github.io/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/), [View more blogs with the tag #GitHub](https://guog.github.io/tags/GitHub/), [View more blogs with the tag #CI/CD](https://guog.github.io/tags/CI/CD/)

*以一次需求的完整交付为主线，理解协作、自动化、可复现和持续反馈*

![从需求到可追溯交付的工程主线](https://guog.github.io/images/modern-se/delivery-overview.jpg)

一个软件团队是否现代化，不能只看使用了什么编程语言、安装了多少开发工具，甚至不能只看是否已经使用 Git 或人工智能（Artificial Intelligence，AI）编程助手。更能说明问题的是：**一项需求从提出到交付，团队能否清楚回答为什么改、由谁改、如何验证、交付了什么，以及发布后如何发现并修正问题。**

很多工程师已经熟悉 Git 的 `clone`、`commit` 和 `push`，但如果多人长期在同一分支修改、构建依赖某台手工配置的机器、发布包与提交记录无法对应，Git 就容易退化为代码存放处。现代软件工程要建立的不是一串额外审批，而是一套让工作信息、代码变更和交付证据相互连接的机制。

本文以 GitHub 和开源社区实践为主要参照，贯穿一个简单例子：**为现有业务系统增加“报表异步导出”功能**。这个需求将依次经历澄清、方案评审、分支开发、质量检查、环境构建、制品发布和运行反馈。沿途介绍 GitHub Flow、Pull Request、Docker、CI/CD、Sentry 等工具，但工具始终服务于同一个问题：**如何稳定地把想法变成可以验证、可以维护的软件。** GitLab、Azure DevOps 等平台名称虽不同，也可以承载相近的工程原则。

<a id="一先看全局一次变更要留下什么证据"></a>

## 一、先看全局：一次变更要留下什么证据

现代软件工程可以理解为一条**可追踪的变更链**，并且在发布后形成反馈闭环：

**需求 Issue → 方案（按需）→ 代码分支与 Pull Request（PR，拉取请求）→ 评审和自动化检查 → 受控构建与制品 → 版本发布 → 运行反馈 → 新的 Issue。**

这里每个环节都应当留下能够被下一环节理解的信息：

- **需求依据**：为什么需要改变，目标、边界和验收条件是什么。
- **变更依据**：哪次代码或设计修改实现了它，由谁审查，检查是否通过。
- **交付依据**：使用什么依赖和构建环境，产生了哪个不可混淆的制品。
- **运行依据**：哪个版本出现了什么问题，如何重新进入修复流程。

这并不要求小修复也填写完整的设计报告。**复杂度决定记录的深度，风险决定验证的强度**。例如修改文案只需简短 Issue 和 PR；改变工单状态模型可能需要完整设计提案、跨模块审查和专项测试。

Markdown 在这里是重要的辅助载体。它以纯文本保存需求、设计和工程约定，能够像代码一样进行版本比较与评审。关于其语法与 AI 时代的发展另见独立文章[《Markdown：从文档语言到 AI 时代的工程基础》](https://guog.github.io/blog/markdown-101/)，本文只讨论它在研发链上的作用。

<a id="二需求如何进入研发issuerfc-与设计决策"></a>

## 二、需求如何进入研发：Issue、RFC 与设计决策

我们以“新增异步报表导出”为例。如果只留下“报表导出太慢”一句话，开发者无法判断数据量、权限、超时处理和验收条件。\*\*Issue（议题或工作事项）\*\*则把问题转化为可讨论、可追踪的工作对象：说明背景、预期行为、限制条件、负责人及相关讨论，并关联后续 PR。GitHub 的 [Issues 官方文档](https://docs.github.com/zh/issues/tracking-your-work-with-issues/learning-about-issues/about-issues) 提供了这一机制的说明。

![轻量需求与复杂提案两种合理路径](https://guog.github.io/images/modern-se/requirements-paths.jpg)

两种需求路径需要区别对待：

- **轻量路径**：对于边界清楚的功能或缺陷，Issue 澄清后直接开发，具体实现通过 Pull Request（拉取请求，PR）评审。导出按钮颜色修正、已确认的字段缺失等通常不必另写正式方案。
- **设计先行路径**：当异步导出涉及后台任务、访问控制、任务状态、失败重试和历史数据兼容性时，可先用 Markdown 提交**设计提案 PR**。设计被接受后，再拆成实现 Issue 和代码 PR。

复杂讨论经常使用两种文档：\*\*RFC（Request for Comments，征求意见提案）\*\*用于在定案前征求意见；\*\*ADR（Architecture Decision Record，架构决策记录）\*\*用于留存背景、备选方案、结论和权衡。Rust 社区的 [RFC 仓库](https://github.com/rust-lang/rfcs) 是值得研究的真实范例。两者并非必须同时存在，也不是任何需求都要写。

需要明确，**设计文档 PR 被合并，只意味着该提案按团队约定被接受，不意味着功能已经交付**。同样，“设计文档 PR”与“Draft PR（草稿拉取请求）”也不同：前者说明提交了什么内容，后者表明该 PR 暂未准备好正式合并。

这一步的工程价值是减少猜测和返工：开发者知道什么叫完成，评审人员知道什么应被验证，后续维护者知道当初为什么采取这种设计。

<a id="三代码如何安全进入主干github-flow-与-pull-request"></a>

## 三、代码如何安全进入主干：GitHub Flow 与 Pull Request

有了明确的需求，下一步不是让所有人直接向 `main` 提交修改，而是把一次变更组织成可以独立审查的单元。**GitHub Flow** 是 GitHub 官方推荐的轻量、基于分支的协作工作流：从稳定主干创建短期分支，在分支上提交改动，借助 PR 讨论和检查，符合条件后合并回主干。参见 [GitHub Flow 官方中文文档](https://docs.github.com/zh/get-started/using-github/github-flow)。

![短期分支、Pull Request 与主干集成](https://guog.github.io/images/modern-se/short-lived-branches.jpg)

针对异步导出，可以建立 `feature/async-export` 分支。开发者提交后台任务与接口修改，创建 PR 时写明关联 Issue、主要变更、已执行的验证和潜在风险。同事无需先找开发者当面解释，就能从 PR 看见代码差异、讨论、自动化检查状态和修改历史。

**PR 不只是合并按钮，而是一次变更进入共享代码基线前的公共审查入口。** 评审应聚焦行为、风险和设计边界；格式等机械问题尽量交给自动化检查。较大的改动可以先创建 Draft PR，提早获得反馈，而不是等完成后才第一次与团队沟通。必要时可设置受保护分支，要求评审及规定的检查通过才能合并。

常见的三个 Git 概念解决不同层面的问题：

![Fork、Branch 与 Worktree 所在的协作层次](https://guog.github.io/images/modern-se/fork-and-worktree.jpg)

- **Branch（分支）**：在同一仓库中隔离一项变更，是团队内部协作的基本单位。
- **Fork（派生仓库）**：在自己账号或组织下创建另一个仓库，常用于缺少上游写入权限的开源贡献；并非企业内部协作的必备步骤。
- **Git Worktree（工作树）**：在同一个本地仓库基础上同时检出多个工作目录，适合并行处理功能、紧急修复和代码评审。它不替代分支，也不自动隔离端口和数据库等运行资源。参见 [Git 官方 Worktree 文档](https://git-scm.com/docs/git-worktree)。

提交历史也应能解释变更意图。\*\*Conventional Commits（约定式提交）\*\*通过 `feat`、`fix` 等类型提升一致性，有助于变更日志生成；但比格式更重要的是一项提交有清晰目的、能被定位和必要时回退。关于 GitHub Flow、强调短生命周期分支的 Trunk-Based Development 与分支较多的 GitFlow，团队可按发布模型选择；不宜把任何一套流程机械套用到所有项目。

本章的结论很简单：**分支隔离修改，PR 汇集上下文，评审与合并规则保障共享主干的稳定。**

<a id="四如何尽早发现问题质量门禁与持续集成"></a>

## 四、如何尽早发现问题：质量门禁与持续集成

代码进入主干之前，团队需要一种可重复的证据，说明变更至少满足规定的基础质量要求。\*\*持续集成（Continuous Integration，CI）\*\*强调频繁集成，并在每次有意义的变更后尽快得到自动反馈；它不是每晚有人手工运行的编译脚本。

![代码评审、自动化检查与合并门禁](https://guog.github.io/images/modern-se/review-quality.jpg)

对于异步导出 PR，可以将下列检查连接到同一个变更：构建是否成功、现有接口是否兼容、权限用例是否通过、静态分析是否发现明显问题、关键页面操作是否仍可完成。**质量门禁的目的不是让工具代替专业测试，而是把适合机器重复执行的验证前移**，让人工审查集中在业务逻辑和复杂风险上。

![从变更提交到自动化构建、验证与制品生成](https://guog.github.io/images/modern-se/ci-cd.jpg)

一个典型的自动化工作流是：**提交或 PR 触发 → 安装受控依赖 → 构建 → 检查 → 输出结果与制品**。GitHub Actions、GitLab CI/CD 和 Azure Pipelines 都能实现类似机制。执行这些任务的 **Runner** 可以位于云平台，也可以是企业受控的自托管机器。对于依赖 Windows、专用开发套件和硬件许可证的项目，自托管 Runner 比强行改造成 Linux 容器更现实。

不同工具在这一环节扮演不同角色：

- **SonarQube / Semgrep**：分析代码质量或可疑模式，帮助发现部分缺陷与安全问题；具体 PR 功能取决于使用的版本和许可证。
- **Playwright / Testcontainers / WireMock**：分别支持浏览器端到端检查、使用临时真实依赖的集成测试、模拟外部 HTTP（Hypertext Transfer Protocol，超文本传输协议）服务。
- **Grafana k6**：在适当场景中执行性能与负载验证，不应替代专业测试策略。

这些工具不需要全部部署。团队应先识别最常见、代价最高的错误，选择能够缩短反馈时间的检查。**CI 是验证机制，不是工具数量竞赛。**

<a id="五如何让环境不再依赖个人从雪花机器到可复现构建"></a>

## 五、如何让环境不再依赖个人：从雪花机器到可复现构建

假设异步导出功能在开发者电脑上通过，却只能在一台经过多年手工配置的编译机上打包。机器损坏后，团队找不到完整安装步骤和依赖版本。这种“只有这一台能工作”的环境常被称为**雪花服务器（Snowflake Server）**；风险的本质是构建条件没有被记录为可维护的工程资产。

![从手工环境到可定义、可重建的构建环境](https://guog.github.io/images/modern-se/standardized-environments.jpg)

解决办法不是只引入一个 Docker，而是分层管理环境：

- **应用运行环境**：\*\*Docker Image（镜像）\*\*定义打包的应用和运行依赖，\*\*Container（容器）\*\*是镜像启动后的实例。Docker Compose 用声明式文件组织应用、数据库、缓存等多个关联服务；适合本地开发和部分验证场景，不等同于生产集群编排。
- **开发工具环境**：\*\*Dev Containers（开发容器规范）\*\*用于描述开发工具链、扩展和环境配置，让新成员更容易获得可用的工作空间。
- **构建环境**：锁定依赖、运行时、SDK（Software Development Kit，软件开发工具包）和编译工具版本，把构建步骤写成脚本或 CI 配置，并控制 Runner 或虚拟机镜像。容器本身不保证构建完全确定，还需要处理时间戳、外部下载和其他不稳定输入。

工程能力再往前一步，是让这些环境按定义创建、变更和恢复。\*\*IaC（Infrastructure as Code，基础设施即代码）\*\*可用 OpenTofu 等工具管理基础设施；**Infisical 或 SOPS** 可用于受控密钥管理或加密配置；**Backstage** 等开发者门户则可以把标准环境、服务目录和文档入口交给开发者自助使用。它们属于支撑工程体系的横向能力，不是所有项目的强制依赖。

例如，异步导出测试需要应用服务、PostgreSQL、Redis 和消息队列模拟环境。团队可以先定义可复用的测试依赖，再让本地和 CI 尽量使用一致的运行版本；若后台编译仍依赖 Windows 专用工具，则另外通过受控虚拟机或自托管 Runner 复现。这比争论“是否所有东西都必须容器化”更有实践价值。

**检验标准是：换一名维护人员、换一台机器，是否仍能依照版本化定义恢复开发和构建能力。**

<a id="六如何知道交付了什么依赖制品与供应链"></a>

## 六、如何知道交付了什么：依赖、制品与供应链

源代码只是交付的起点。真正安装到用户环境中的可能是压缩包、二进制程序、NuGet 包、容器镜像或离线安装介质。即使能找到某个 Git 提交，如果不知道构建工具版本、依赖来源和制品哈希，也不一定能还原现场正在运行的内容。

![从依赖、构建到软件制品与可信来源](https://guog.github.io/images/modern-se/software-supply-chain.jpg)

这一环节要把三种不同对象区分清楚：

- **依赖（Dependency）**：项目使用的外部组件与内部库。通过版本锁定、校验和、升级记录等降低“今天构建与昨天不同”的风险。
- **制品（Artifact）**：某次受控构建实际产生的安装包、程序库或镜像，是要保存、分发、部署的交付对象。
- **证据（Provenance / Attestation）**：记录制品来自哪个代码版本、使用什么构建过程、执行了哪些必要验证。\*\*SBOM（Software Bill of Materials，软件物料清单）\*\*用于列出组件，SLSA（Supply-chain Levels for Software Artifacts）则提供软件供应链完整性的相关实践框架。

存储工具也不能因为“都能放文件”就混为一谈：

- **容器镜像仓库**：Harbor、GitHub Container Registry（GHCR）、GitLab Container Registry 等面向符合 OCI（Open Container Initiative，开放容器倡议）格式的镜像或相关制品。
- **软件包／制品仓库**：Nexus Repository、Artifactory、GitHub Packages、GitLab Package Registry 等侧重不同类型的软件包、代理缓存、权限和版本治理。
- **对象存储**：SeaweedFS、Ceph 等适合存放文件或对象，某些企业也使用 S3（Simple Storage Service，简单存储服务）兼容接口保存构建结果和备份；**对象存储并不天然具备完整的软件依赖治理能力**。历史上的 MinIO 开源仓库已于 2026 年 4 月归档，新项目选型应检查其后续维护与授权状态。

安全检查与依赖升级应穿过这条证据链，而不是另起一套孤立流程。例如 **Renovate** 自动创建依赖更新 PR，**Trivy** 在构建与发布前检查已知漏洞，必要时同时保存 SBOM 和扫描结果。它们无法证明软件“绝对安全”，但能让风险被更早发现、被明确记录、被持续治理。

回到异步导出需求：现在应能回答“用于发布的包是哪次 PR 合并后生成的、使用了哪些组件、由哪个 Runner 构建、保存在哪里”。**一个可重建、可追踪的制品，比一台机器上的‘最新版安装包’更可信。**

<a id="七如何把制品变成可控发布版本启用与恢复"></a>

## 七、如何把制品变成可控发布：版本、启用与恢复

完成构建还不是完成发布。\*\*Tag（标签）\*\*用于在 Git 中标记特定代码状态；\*\*Release（发布）\*\*对应一次面向用户或下游团队的交付；\*\*Changelog（变更日志）\*\*与 \*\*Release Notes（发布说明）\*\*则回答“此版本有什么变化”。GitHub 官方的 [Releases 文档](https://docs.github.com/zh/repositories/releasing-projects-on-github/about-releases) 将这些对象与源码版本和发布资产联系起来。

![版本、构建证据、发布制品与部署记录的关联](https://guog.github.io/images/modern-se/traceable-releases.jpg)

对于面向外部依赖方的库或 API，可以采用 **SemVer（Semantic Versioning，语义化版本）**：在已约定公共接口语义的前提下，使用主版本、次版本、修订号表达不兼容变更、兼容功能和兼容修复。对企业定制应用，版本规则还应考虑客户分支、数据库迁移和支持窗口，而不是一律套用库的版本策略。

现代发布还有两个容易混淆的动作：

- **部署（Deploy）**：将制品安装到目标环境。
- **启用（Release to users / Enable）**：让特定用户真正使用新能力。通过 \*\*Feature Flags（功能开关）\*\*可以把两者分离；Unleash 是这一领域的代表性工具。对于 Kubernetes 环境，Argo CD 展示了 **GitOps（Git Operations，基于 Git 的运维协作实践）** 如何以 Git 中声明的期望状态管理部署，但它与功能开关并不相互替代。

异步导出可以先发布到受控环境，通过检查后按客户、租户或范围逐步启用。若出现问题，应能定位实际制品、切换功能开关或执行经过验证的恢复措施。**回滚也不是简单替换旧安装包**：数据库结构和数据迁移可能无法直接逆转，必须考虑兼容性、备份和恢复演练。对于工业现场、离线交付和严格变更窗口，这一点尤其重要。

本章的工程目标不是“更快点发布按钮”，而是**每一次发布都有明确版本、可找回的制品、必要审批与已知恢复路径**。

<a id="八如何让交付形成闭环从-sentry-到下一次-issue"></a>

## 八、如何让交付形成闭环：从 Sentry 到下一次 Issue

很多交付过程以“安装成功”结束，但软件真正的问题常在真实使用中出现。我们需要把**发布 → 异常发现 → 定位 → 工作事项 → 修复 PR → 再发布**连接起来，才能判断上一次改动是否达到了预期。

以报表导出为例：上线后只有个别现场在大数据量情况下出现超时。没有运行反馈时，研发团队只能依赖人工截图、聊天和远程重现；有合适的诊断基础设施后，可以把错误与版本号、时间、服务及调用关系关联，再针对确认的问题创建 Issue。

这一反馈环节有几种不同能力：

- **应用异常追踪**：**Sentry** 可以汇集异常、调用栈、发布版本等诊断上下文；**GlitchTip** 提供与 Sentry 生态兼容的开源错误追踪选择。Sentry 主服务端采用带限制的 FSL（Functional Source License，功能源码许可证），不能直接称作宽松许可证开源产品。
- **统一遥测数据**：**OpenTelemetry** 提供厂商中立的日志、指标、链路追踪相关接口与采集组件。它不是一个自动替你诊断所有问题的监控平台。
- **存储与可视化**：**Prometheus** 适合收集时序指标；**Grafana** 连接不同数据源形成仪表盘与告警；**SigNoz** 提供基于 OpenTelemetry 的集成式可观测性方案。具体选型依赖数据规模与运维能力，并不意味着这些产品应同时部署。

![发布、异常发现、工作事项和再次交付的反馈闭环](https://guog.github.io/images/modern-se/quality-feedback-loop.jpg)

只有当反馈能回到工程流程，监控才真正产生研发价值。报表超时可能由 SQL 查询、异步任务队列、外部接口或网络问题引起；定位后形成带有复现条件和发布版本的 Issue，由短期分支修复，通过 PR 与 CI 验证，再进入下次受控发布。

在私有化部署的工业软件场景，遥测首先涉及**客户授权、敏感信息最小化、数据保留周期和网络边界**。不能为了获取更丰富的日志，默认将工厂业务数据上传公有云。可采用本地存储或受控同步等方式，具体实现需遵守客户与组织的安全制度。

由此可以看出：**现代软件工程的终点不是部署，而是把真实运行经验重新转化为下一轮可验证的改进。**

<a id="九如何判断改进是否有效指标要对应真实交付"></a>

## 九、如何判断改进是否有效：指标要对应真实交付

只有需求、PR、自动化检查、制品、发布和运行记录相互连接，团队才具备度量工程表现的基础。否则，单纯统计提交数、代码行数或 AI 生成量，容易把活动量当成成果。

![软件交付吞吐与稳定性的五项度量](https://guog.github.io/images/modern-se/dora-metrics.jpg)

**DORA（DevOps Research and Assessment）** 在其[官方软件交付性能指标](https://dora.dev/guides/dora-metrics/)中使用五项指标，分别观察交付吞吐与不稳定性：

- **Change Lead Time（变更前置时间）**：从代码提交到实际部署所需时间。
- **Deployment Frequency（部署频率）**：成功部署发生的频次。
- **Failed Deployment Recovery Time（失败部署恢复时间）**：失败部署需要干预后恢复所需时间。
- **Change Fail Rate（变更失败率）**：导致需要干预的生产问题的部署比例。
- **Deployment Rework Rate（部署返工率）**：因生产事件而进行的非计划部署比例。

前面三项从吞吐角度观察，后面两项侧重不稳定性。官方同时强调：**这些指标应结合单个应用或服务的背景理解，不宜跨不同业务和部署模式直接排名。** 工厂现场的受控发布与互联网服务的高频自动发布，对质量和窗口的约束可能完全不同。

PR 合并率、等待评审时间、CI 成功率也能帮助定位瓶颈，但**PR 合并率并不是 DORA 官方指标**，不能把它单独作为 AI 编程效果判断。我们更需要追问：交付是否更快、错误是否更早发现、问题是否更容易修复、现场是否更稳定。度量服务于改善流程，而不是制造漂亮的统计数字。

<a id="十工程接口如何支持-ai-agentcliskills-与-mcp"></a>

## 十、工程接口如何支持 AI Agent：CLI、Skills 与 MCP

前述能力不仅需要人能通过网页操作，还需要流水线与自动化程序可靠调用。这里涉及三个应当分清的层次：**执行接口、使用约定、工具连接协议**。

![命令行、Skills 与 MCP 在工程工具链中的位置](https://guog.github.io/images/modern-se/cli-and-tool-ecosystem.jpg)

\*\*CLI（Command-Line Interface，命令行接口）\*\*适合明确参数、可组合的重复操作。GitHub 官方的 `gh` 和 GitLab 的 `glab` 能在终端中查询 Issue、PR/MR（Merge Request，合并请求）、CI 状态或发布信息。对具备终端能力的 Agent，成熟 CLI 通常比模拟鼠标点击更可重复、易于记录和调试，因此“CLI First”是一种值得重视的工具设计思想；但它并不是永远优于 API 的规则。

\*\*Agent Skills（智能体技能）\*\*主要解决“怎样按照项目约定使用工具”的问题。以 `SKILL.md` 为入口的技能文件可以说明适用条件、工作步骤、结果要求和风险边界。它不负责为 Agent 自动提供权限。GitLab 等厂商及社区已经提供 `glab` 相关技能和示例，但实验性功能和第三方脚本都应经过审查。

\*\*MCP（Model Context Protocol，模型上下文协议）\*\*则定义了 AI 应用如何发现并调用外部工具和数据。GitHub 和 GitLab 都提供相关 MCP 能力；对结构化调用、鉴权隔离与可控工具集，MCP 可能比开放任意终端操作更合适。**CLI、Skills、MCP 可以协同使用而非互相替代**：Agent 阅读项目约定，通过 CLI 或受控 MCP 工具读取 Issue、创建 PR，再由既有 CI 和评审规则决定是否接受变更。

例如，一个 Agent 接到“完善异步导出错误处理”的 Issue，应该先读取需求和项目约定，在独立分支或 Worktree 中修改代码，运行规定检查，创建 PR 并给出验证证据。**它并不因为能执行命令，就有权绕过代码评审、读取不必要的凭据或直接发布生产。** 最小权限、人工确认和审计记录仍是工程边界。

AI 编程带来的变化不是让这些约定失效，而是让清晰的需求、可复现环境和自动化验证变得更重要。我们可以用更强的工具加快实现，但仍需要一套独立于具体模型的工程机制来定义何为可接受的结果。

<a id="结语真正先进的是一条能够闭合的证据链"></a>

## 结语：真正先进的是一条能够闭合的证据链

回看“报表异步导出”的全过程：Issue 说清需求，复杂设计通过文档 PR 形成共识；短分支和 PR 管理代码变更；自动化检查尽早暴露问题；受控环境产生可追溯制品；发布记录说明交付了哪个版本；运行反馈再次转化为 Issue。**这些不是彼此孤立的工具，而是同一条工作链的不同接口。**

团队并不需要从第一天就拥有完整的工具矩阵。先有清晰的需求与 PR 协作，再逐步建立自动化检查、可重建环境、可追溯制品及运行反馈，就能沿着明确的方向持续改善。对管理者，这意味着结果和风险更可见；对研发工程师，这意味着减少猜测、手工重复和个人知识依赖；对未来的 AI Agent，也意味着拥有可以遵循和验证的工程边界。

**判断现代软件工程是否真正建立起来，最终看四点：协作是否清晰、反馈是否及时、环境是否可复现、交付是否可追溯。**

***

<a id="附录一常用术语速查"></a>

## 附录一：常用术语速查

本附录用于首次接触相关术语时快速查阅；部分名称是产品或工作方式，而不是需要机械展开的缩写。

- **Issue**：问题、需求或任务的协作记录。
- **RFC（Request for Comments）**：征求意见提案；**ADR（Architecture Decision Record）**：架构决策记录。
- **PR（Pull Request）**：拉取请求；**MR（Merge Request）**：合并请求；**Draft PR**：尚未准备正式合并的草稿 PR。
- **Branch / Fork / Worktree**：分支／派生仓库／本地多工作目录。
- **CI（Continuous Integration）**：持续集成；**CD（Continuous Delivery / Continuous Deployment）**：持续交付／持续部署，讨论时须指明含义。
- **CLI（Command-Line Interface）**：命令行接口；**API（Application Programming Interface）**：应用程序编程接口。
- **SDK（Software Development Kit）**：软件开发工具包；**VM（Virtual Machine）**：虚拟机。
- **IaC（Infrastructure as Code）**：基础设施即代码；**GitOps**：以 Git 中期望状态驱动声明式部署的实践。
- **OCI（Open Container Initiative）**：开放容器倡议；**Artifact**：构建制品。
- **SBOM（Software Bill of Materials）**：软件物料清单；**SLSA（Supply-chain Levels for Software Artifacts）**：软件供应链完整性框架。
- **SemVer（Semantic Versioning）**：语义化版本；**Feature Flags**：功能开关。
- **DORA（DevOps Research and Assessment）**：开发运维研究与评估；**DevOps（Development and Operations）**：开发运维协同。
- **FSL（Functional Source License）**：带特定使用限制的源码可见许可证；**AGPL（GNU Affero General Public License）** 与 **MPL（Mozilla Public License）**：具有不同开源合规义务的许可证。
- **SAST（Static Application Security Testing）**：静态应用程序安全测试；**APM（Application Performance Monitoring）**：应用性能监控。
- **AI（Artificial Intelligence）**：人工智能；**MCP（Model Context Protocol）**：模型上下文协议；**Agent Skills**：Agent 按需加载的技能说明。
- **JSON（JavaScript Object Notation）**：JavaScript 对象表示法；**YAML（YAML Ain’t Markup Language）**：常用于工程配置的文本数据格式。

<a id="附录二工具索引按工程职责而不是按流行程度"></a>

## 附录二：工具索引——按工程职责，而不是按流行程度

正文有意只讲工具所承担的工作，详细产品集中放在这里。**本索引是进一步学习的入口，不是建议在一个项目中同时部署下列所有工具。** 产品有不同版本和授权方式；“支持商用”“可自托管”“开源核心”是不同维度，尤其要核实商业插件与 SaaS 服务的许可条件。

<a id="需求版本控制与变更协作"></a>

### 需求、版本控制与变更协作

- **[Git](https://git-scm.com/)**：管理代码和文档的提交、分支与历史。
- **[GitHub](https://github.com/)**：提供仓库、Issue、PR、评审及相关自动化平台。
- **[GitLab](https://about.gitlab.com/)**：提供仓库、Issue、MR、CI/CD 和包管理等协作能力。
- **[Azure DevOps](https://azure.microsoft.com/zh-cn/products/devops)**：微软的工作项、源码管理与研发交付平台。
- **[GitHub CLI（gh）](https://cli.github.com/)**：在终端操作 GitHub 任务、PR、流水线与发布。
- **[GitLab CLI（glab）](https://docs.gitlab.com/cli/)**：在终端操作 GitLab Issue、MR、流水线与发布。

<a id="质量反馈与自动化验证"></a>

### 质量反馈与自动化验证

- **[GitHub Actions](https://docs.github.com/zh/actions)**：响应 GitHub 事件执行构建、测试与交付工作流。
- **[GitLab CI/CD](https://docs.gitlab.com/ci/)**：GitLab 的持续集成和持续交付系统。
- **[Azure Pipelines](https://azure.microsoft.com/zh-cn/products/devops/pipelines)**：多平台构建、测试和发布流水线。
- **[SonarQube Community Build](https://www.sonarsource.com/products/sonarqube/downloads/)**：持续分析代码质量和技术债；不同组件及商业版本许可证不同。
- **[Semgrep Community Edition](https://semgrep.dev/products/community-edition)**：基于规则执行静态代码扫描；企业服务另外授权。
- **[Playwright](https://playwright.dev/)**：自动执行浏览器端到端验证；Apache-2.0。
- **[Testcontainers](https://testcontainers.com/)**：为测试创建临时容器化依赖；各语言核心库需分别核实许可证。
- **[WireMock](https://wiremock.org/)**：模拟 HTTP 服务以降低测试对真实外部系统的依赖；Apache-2.0 核心。
- **[Grafana k6](https://grafana.com/oss/k6/)**：性能与负载测试工具；AGPL-3.0。
- **[Renovate](https://docs.renovatebot.com/)**：自动提出依赖升级 PR/MR；AGPL-3.0，可自托管。
- **[Trivy](https://trivy.dev/)**：扫描依赖、镜像与配置中的已知安全问题；Apache-2.0。

<a id="开发构建与基础设施"></a>

### 开发、构建与基础设施

- **[Docker](https://www.docker.com/)**：构建、分发与运行容器镜像。
- **[Docker Compose](https://docs.docker.com/compose/)**：声明多服务应用的本地或验证环境。
- **[Dev Containers](https://containers.dev/)**：使用开放规范描述标准化开发环境。
- **[PostgreSQL](https://www.postgresql.org/)**：常用于业务及测试环境的开源关系型数据库。
- **[Redis](https://redis.io/)**：用于缓存和其他内存数据场景；具体部署与许可证以所选版本为准。
- **[OpenTofu](https://opentofu.org/)**：通过声明式代码管理基础设施；MPL-2.0。
- **[Infisical](https://infisical.com/)**：集中管理应用密钥和相关授权；开源核心及企业功能有不同许可。
- **[SOPS](https://github.com/getsops/sops)**：对需要进入版本管理的敏感配置进行加密；MPL-2.0。
- **[Backstage](https://backstage.io/)**：开源开发者门户与服务目录框架；Apache-2.0。

<a id="软件包镜像与存储"></a>

### 软件包、镜像与存储

- **[npm](https://docs.npmjs.com/about-npm/)** / **[pnpm](https://pnpm.io/)** / **[NuGet](https://www.nuget.org/)**：分别承担常见 JavaScript 与 .NET 生态的依赖和软件包管理。
- **[GitHub Packages](https://docs.github.com/zh/packages/learn-github-packages/introduction-to-github-packages)**：与 GitHub 仓库及权限体系集成的软件包服务。
- **[GitLab Package Registry](https://docs.gitlab.com/user/packages/package_registry/)**：GitLab 软件包托管与分发。
- **[Sonatype Nexus Repository](https://www.sonatype.com/products/sonatype-nexus-repository)**：集中代理与治理不同类型的软件包。
- **[JFrog Artifactory](https://jfrog.com/artifactory/)**：集中管理多种制品格式与依赖分发。
- **[Docker Hub](https://hub.docker.com/)** / **[GitHub Container Registry](https://docs.github.com/zh/packages/working-with-a-github-packages-registry/working-with-the-container-registry)**：公共或 GitHub 关联的容器镜像分发入口。
- **[Harbor](https://goharbor.io/)**：适合企业自托管的开源 OCI 制品仓库；Apache-2.0。
- **[GitLab Container Registry](https://docs.gitlab.com/user/packages/container_registry/)**：GitLab 项目级容器镜像仓库。
- **[SeaweedFS](https://github.com/seaweedfs/seaweedfs)** / **[Ceph](https://ceph.io/)**：开源对象存储或分布式存储方案，不能直接替代制品生命周期治理。
- **[MinIO 历史开源项目](https://github.com/minio/minio)**：S3 兼容对象存储的代表性项目，其原仓库已在 2026 年 4 月归档，选型需特别审查维护风险。

<a id="发布与运行反馈"></a>

### 发布与运行反馈

- **[Unleash](https://www.getunleash.io/)**：通过功能开关管理渐进式开放；不同发布形态的许可证存在差异。
- **[Argo CD](https://argo-cd.readthedocs.io/en/stable/)**：在 Kubernetes 上按 GitOps 管理声明式交付；Apache-2.0。
- **[Sentry](https://sentry.io/)**：应用错误与性能问题追踪；主要服务端采用 FSL 源码可见许可，并非严格意义上的开源软件。
- **[GlitchTip](https://glitchtip.com/)**：与 Sentry 生态兼容的错误追踪方案；社区核心采用 MIT 许可证。
- **[OpenTelemetry](https://opentelemetry.io/)**：遥测数据采集与传输规范及组件；主要核心采用 Apache-2.0。
- **[Prometheus](https://prometheus.io/)**：指标采集、时序存储与相关告警能力；Apache-2.0。
- **[Grafana](https://grafana.com/)**：统一可视化多种监控数据源；主要开源版本采用 AGPL-3.0。
- **[SigNoz](https://signoz.io/)**：基于 OpenTelemetry 的可观测性平台；社区核心与企业功能分开授权。

<a id="ai-agent-的工程接口与公开技能"></a>

### AI Agent 的工程接口与公开技能

- **[GitHub MCP Server](https://github.com/github/github-mcp-server)** / **[GitLab MCP](https://docs.gitlab.com/user/gitlab_duo/model_context_protocol/)**：供兼容 AI 应用调用代码托管平台能力的工具接口。
- **[Agent Skills 规范](https://agentskills.io/specification)**：规定 `SKILL.md` 与相关资源的开放格式。
- **[Anthropic Skills](https://github.com/anthropics/skills)** / **[OpenAI Skills](https://github.com/openai/skills)**：分别提供公开的技能示例与实践仓库。
- **[GitLab AI Skills](https://gitlab.com/gitlab-org/ai/skills)**：包括 `glab` 相关协作技能，使用前需核对实验状态与权限要求。
- **[GitHub Awesome Copilot](https://github.com/github/awesome-copilot)** / **[Vercel Agent Skills](https://github.com/vercel-labs/agent-skills)**：可参考社区指令与工程技能组织方式；外部脚本必须经过审查。
- **[OpenAI Codex](https://openai.com/codex/)** / **[Claude Code](https://claude.com/product/claude-code)**：可参与代码修改、工具执行和任务协作的 AI 编程产品。

<a id="附录三社区规范与工程约定"></a>

## 附录三：社区规范与工程约定

下列规范用于帮助团队建立可理解、可协作的约定，**并不是要求一次性全部采用**。

- **[Conventional Branch](https://github.com/conventional-branch/conventional-branch)**：一种社区约定式分支命名建议，并非 Git 官方强制标准。
- **[Conventional Commits 1.0.0（中文）](https://www.conventionalcommits.org/zh-hans/v1.0.0/)**：约定提交类型与破坏性变更的表达方式。
- **[Semantic Versioning（中文）](https://semver.org/lang/zh-CN/)**：约定公开接口版本的主、次和修订号含义。
- **[Keep a Changelog（中文）](https://keepachangelog.com/zh-CN/1.1.0/)**：维护面向使用者的版本变更记录。
- **[EditorConfig](https://editorconfig.org/)**：在仓库中共享缩进、字符集和行尾等编辑器约定。
- **[GitHub Issue 模板（中文）](https://docs.github.com/zh/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository)**：让需求和缺陷报告包含必要背景与字段。
- **[GitHub PR 模板（中文）](https://docs.github.com/zh/communities/using-templates-to-encourage-useful-issues-and-pull-requests/creating-a-pull-request-template-for-your-repository)**：规范变更描述、验证、风险和审查信息。
- **[CODEOWNERS（中文）](https://docs.github.com/zh/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners)**：声明仓库路径与代码所有者，配合审查规则使用。
- **[CONTRIBUTING（中文）](https://docs.github.com/zh/communities/setting-up-your-project-for-healthy-contributions/setting-guidelines-for-repository-contributors)**：说明如何提交问题、贡献变更和遵循项目流程。
- **[Contributor Covenant](https://www.contributor-covenant.org/)**：开源社区行为准则模板。
- **[SECURITY.md（中文）](https://docs.github.com/zh/code-security/how-tos/report-and-fix-vulnerabilities/configure-vulnerability-reporting/add-security-policy)**：说明安全问题的报告与处理渠道。
- **[SPDX](https://spdx.dev/)** / **[CycloneDX](https://cyclonedx.org/)**：软件组件与许可证信息相关的开放标准和生态。
- **[SLSA](https://slsa.dev/)**：软件供应链完整性相关框架与实践。
- **[OCI](https://opencontainers.org/)**：容器镜像格式与运行时相关的开放规范。
- **[Dev Containers Specification](https://containers.dev/)**：开发环境的可移植配置规范。
- **[AGENTS.md](https://agents.md/)** / **[Agent Skills](https://agentskills.io/specification)**：面向兼容 AI Agent 的项目级指令与可复用技能约定。

<a id="主要参考资料"></a>

## 主要参考资料

- [GitHub 官方中文：GitHub Flow](https://docs.github.com/zh/get-started/using-github/github-flow)；[GitHub 官方中文：Issues](https://docs.github.com/zh/issues/tracking-your-work-with-issues/learning-about-issues/about-issues)；[GitHub 官方中文：Pull Requests](https://docs.github.com/zh/pull-requests/reference/pull-requests)。
- [Git 官方：git-worktree](https://git-scm.com/docs/git-worktree)；[Rust 社区：RFC 仓库](https://github.com/rust-lang/rfcs)。
- [Docker 官方：概览](https://docs.docker.com/get-started/docker-overview/)；[Compose 官方文档](https://docs.docker.com/compose/)；[Development Containers Specification](https://containers.dev/)。
- [GitHub 官方中文：Releases](https://docs.github.com/zh/repositories/releasing-projects-on-github/about-releases)；[SemVer 官方中文规范](https://semver.org/lang/zh-CN/)。
- [DORA 官方：软件交付性能指标](https://dora.dev/guides/dora-metrics/)；[SLSA 官方](https://slsa.dev/)。
- [Sentry 官方：许可证说明](https://open.sentry.io/licensing/)；[OpenTelemetry 官方文档](https://opentelemetry.io/docs/)；[MinIO 已归档源码仓库](https://github.com/minio/minio)。
- [GitHub CLI](https://cli.github.com/)；[GitLab CLI](https://docs.gitlab.com/cli/)；[MCP 官方文档](https://modelcontextprotocol.io/docs/2026-07-28/getting-started/intro)；[Agent Skills 规范](https://agentskills.io/specification)。

*本文图示用于帮助理解工程关系，并非要求所有团队采用相同架构；具体功能、许可证和部署要求应以所使用的版本及其官方资料为准。*

[HTML](https://guog.github.io/blog/modern-se/) · [llms.txt](https://guog.github.io/llms.txt)
