您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
人工零Coding:用流程驯服AI -- OpenSpec + Superpowers闭环实战
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
人工零Coding:用流程驯服AI -- OpenSpec + Superpowers闭环实战
jd****
2026-07-08
IP归属:北京
376浏览
> 从提出需求到归档验收,AI 不只是写代码的工具,而是被流程约束的工程角色。 ## 引子:两个工具各自好用,合在一起才真正可靠 过去几个月,我在日常开发中分别使用过 OpenSpec 和 Superpowers 两套 Claude Code skill。单独用,它们各有所长: * **OpenSpec** 擅长"想清楚"——把一句模糊的需求结构化为 proposal、design、spec、tasks 四件套,确保动手之前有完整的设计文档。 * **Superpowers** 擅长"做到位"——brainstorming 审查设计缺陷、TDD 驱动编码、verification 逐项验收,确保代码质量。 但只用其中一个,问题很快暴露: | 只用 OpenSpec | 只用 Superpowers | | ----------- | -------------- | | 设计文档写得漂亮,但实现时 AI 容易"自由发挥",偏离设计意图 | 代码质量有保障,但缺乏整体设计,容易做出局部最优的碎片化实现 | | proposal 和 design 生成后,到 coding 阶段就断档了 | TDD 写得很好,但测试用例的设计依据是什么?没有 spec 约束,容易遗漏边界 | | spec 更新和实现之间缺乏强关联 | 没有 proposal/design 阶段,工程决策(如是否改 SDK)无处记录 | **根本原因**:OpenSpec 是设计师,Superpowers 是施工队。设计师画完图纸扔过墙,施工队凭经验盖楼——这在人类工程中就是灾难,在 AI 编码中更是如此,因为 AI 的"自由发挥"比人类更不可预测。 真正需要的是一套**闭环工作流**:设计约束施工,施工反馈设计,验收对照设计。 本文通过一个真实案例,展示这套联合工作流如何运转。 *** ## 案例背景 我正在开发一个 AI Agent 评测框架。其中有一个 `DemoEvaluator`,用 Set-based recall(集合召回率)评估 Agent 的工具调用——只关心"调没调",不关心"调用顺序对不对"。 但在多步骤工具链场景中(比如一个 skill 触发后依次调用下游工具),**顺序是正确性的关键维度**。打个比方:只查"快递有没有送到"和"是否按顺序送到",是两件不同的事。我需要新建一个顺序敏感的评测器。 需求一句话:**把 LCS 这种评测方式在工程的应用层设计并实现,与 DemoEvaluator 并列。** 看起来不复杂——但这个需求背后藏着一个 SDK 层的数据结构限制、一个算法匹配语义的二义性问题、以及一个 breaking change 的决策。如果直接让 AI "写一个 OrderedToolCallEvaluator",大概率会得到一个能跑但设计有缺陷的实现。 *** ## 完整工作流:七步闭环 整个过程用到了以下 skill 组合: ``` /opsx:propose → /superpowers:brainstorming → 人工决策 → /opsx:propose(更新) → /superpowers:test-driven-development → /superpowers:verification-before-completion → /opsx:verify → /opsx:archive ``` 下面逐步展开。 ### 第一步:`/opsx:propose` —— 让设计师出图  输入一句自然语言需求后,OpenSpec 自动完成了几件事: 1. **扫描现有代码和 spec**,理解当前系统有什么能力 2. **判断变更范围**:"纯应用层新增,不需要修改 spec" 3. **生成 proposal.md**,记录 Why(为什么要做)和 What Changes(改什么) 4. **生成 design.md**,记录 Context(现状)、Goals/Non-Goals、技术方案 这一步的关键输出是 `proposal.md` 中的这段: > 现有 `DemoEvaluator` 使用集合召回率(Set-based recall)评估工具调用,只关心"调没调",不关心"调用顺序对不对"。在多步骤工具链场景中(如 skill 触发后调用下游工具),调用顺序是业务正确性的关键维度,需要一个顺序敏感的评测器。 以及 design.md 中的技术方案: > * 在应用层新增 `OrderedToolCallEvaluator`,与 `DemoEvaluator` 并列,实现 SDK 的 `Evaluator` 接口 > * 使用 LCS(最长公共子序列)算法评估工具覆盖率和调用顺序 > * 提供顺序的召回率和精确率两个核心评估维度 > * 不修改 SDK 层任何代码 注意最后一条——"不修改 SDK"。这是 AI 基于当前上下文做出的初始判断。接下来我们会看到,这个判断在设计审查中被推翻了。 **这一步的价值**:需求不再是一句话,而是结构化的文档。后续所有工作都有锚点可以对照。 ### 第二步:`/superpowers:brainstorming` —— 施工队审图  拿到设计文档后,我没有直接开始编码,而是用 brainstorming skill 做了一次设计审查。 AI 读完 proposal、design、tasks 和现有 DemoEvaluator 代码后,**主动发现了一个核心问题**: > **argAccuracy 的序列位置匹配** > > 当 expectedToolCalls 里同一个 tool 出现多次(比如 `[get_weather, get_weather]`),参数校验应该匹配哪一次调用? 这个问题提出了四个选项: 1. **复用现有逻辑(无序)**——argAccuracy 复用 DemoEvaluator 的 findFirst 逻辑,不考虑顺序 2. **匹配序列位置对应的调用**——既然是"有序评测器",参数校验也应该匹配顺序上对应的那次调用 3. **不做参数检查**——先不做 argAccuracy,只做工具调用顺序的评测 4. **Type something**——自定义方案 我选了**方案 2**。这个决策被记录在设计文档中。 **如果没有 brainstorming 这一步会怎样?** AI 大概率会沿用 DemoEvaluator 的 findFirst 逻辑——因为"复用"在代码层面最自然。但这在语义上是错的:一个"有序评测器"的参数匹配却不考虑顺序,是自相矛盾的。这种语义级别的 bug 不会被测试捕获(因为测试用例本身可能也按这个错误逻辑设计),只有在设计审查阶段才能发现。 ### 第三步:设计审查发现更深层问题 —— SDK 数据结构的限制  brainstorming 没有止步于算法语义。在深入分析后,它进一步发现了**三个结构性问题**: **问题 1:argAccuracy 的序列位置匹配没设计(重要)** DemoEvaluator 用 `findFirst()` 找第一个同名 tool 就检查参数,这是"有序评测器"的定位矛盾。需要重新设计 argAccuracy:利用 LCS 的匹配结果,知道 `expected[i]` 对应 `actual[j]`,然后检查参数是否匹配,输出**真正的匹配对** `(expected_index, actual_index)`。 **问题 2:`EvalExpectation.expectedArgs` 的数据结构限制** ```java // 当前结构 Map<String, Map<String, Object>> expectedArgs; // key = tool name → 同名 tool 只能有一组参数 ``` 如果期望 `[get_weather("北京"), get_weather("上海")]`,现在只能存:`{"get_weather": {"city": "北京"}}` —— 上海的期望参数丢了。 **问题 3:测试用例缺少 argAccuracy + 顺序的联合场景** 这三个问题环环相扣,最终指向一个关键决策点: > **这次变更要只做应用层,还是连 SDK 一起调整?** > > **方案 A:连 SDK 一起改(推荐)**——改 `EvalExpectation` 的 `expectedArgs` 为 List,同时适配 DemoEvaluator 和数据集。完整方案但改动大。 > > **方案 B:SDK 不动,先做应用层**——应用层只做顺序召回率 + 简单参数校验(同名多次调用时参数检查有局限性)。快速落地,SDK 改进留给后续。 我选了**方案 A**——既然发现了 SDK 的数据结构缺陷,就一次改到位,而不是在应用层绕过限制写 workaround。  **这个决策的重要性**:如果没有 brainstorming 的深度审查,我不会意识到 SDK 层存在这个限制。AI 会在应用层写一个"看起来能跑但同名 tool 参数匹配有 bug"的实现,而且测试也可能通过(因为测试数据不一定覆盖同名 tool 场景)。这是典型的"实现不严谨"问题。 ### 第四步:更新设计,回到 OpenSpec —— 设计师修改图纸 选完方案后,设计文档被更新。proposal.md 扩大了变更范围: > **SDK 层**:将 `EvalExpectation.expectedArgs` 从 `Map<String, Map<String, Object>>` 改为 `List<Map<String, Object>>`,与 `expectedToolCalls` 位置对齐(**BREAKING CHANGE**) design.md 新增了 Decision 1(expectedArgs 改为 List)和 Decision 3(LCS 匹配对驱动 argAccuracy)。 tasks.md 从 3 步扩展为 7 组任务: ``` 覆盖 SDK 改造 → 数据集适配 → DemoEvaluator 适配 → 新评测器 → 测试 → spec 同步 → 验证 ``` spec 也同步更新——delta spec 新增了 `EvalExpectation` 数据模型的 MODIFIED Requirements,包含 4 个场景覆盖位置对齐、null 跳过、多次同名调用。   **这一步形成了设计↔审查的闭环**:brainstorming 发现的问题回流到 OpenSpec 的设计文档中,而不是停留在对话历史里。后续编码和验收都以更新后的文档为准。 ### 第五步:`/superpowers:test-driven-development` —— 施工队按图施工  设计方案确认后,进入 TDD 实现阶段。AI 先理清了依赖顺序: ``` SDK 类型改造 → 数据集适配 → DemoEvaluator 适配 → OrderedToolCallEvaluator(全新 TDD) ``` 执行过程中的 task 分解: ``` SDK: EvalExpectation expectedArgs → List ✅ SDK: EvalDataset parsing adaptation ✅ Data: JSON dataset format migration ✅ App: DemoEvaluator adaptation ✅ App: OrderedToolCallEvaluator (TDD) ✅ ... +1 pending ``` 最终产出一览: 点击展开完整改动清单 **SDK 层改动:** * `EvalExpectation.java` —— expectedArgs 从 `Map<String, Map<String, Object>>` 改为 `List<Map<String, Object>>`,与 expectedToolCalls 位置对齐 * `EvalDataset.java` —— RawExpectation 字段类型同步更新 * `EvalDataModelTest.java` —— 适配新结构 + 新增 null 元素测试 **应用层改动:** * `DemoEvaluator.java` —— computeArgAccuracy 适配 List 结构,保持无序语义 * `OrderedToolCallEvaluator.java` —— LCS 算法实现,orderedRecall / orderedPrecision / argAccuracy 基于匹配对 * `OrderedToolCallEvaluatorTest.java` —— **17 个测试用例**,覆盖: * 完全匹配 `[A,B,C]` vs `[A,B,C]` → recall=1.0 * 完全反序 `[A,B,C]` vs `[C,B,A]` → recall=1/3 * 部分有序匹配 `[A,B,C]` vs `[A,C]` → recall=2/3 * 有多余调用 `[A,B]` vs `[A,X,B,Y]` → recall=1.0, precision=0.5 * 空 expected → recall=1.0 * 非空 actual, 非空 expected → recall=0.0 * 空 expectation → data-pass * 重复 tool name `[A,B,A]` vs `[A,A,B]` * argAccuracy 基于 LCS 匹配对的位置校验 * 同名 tool 多次调用,不同期望参数的校验 * pass/fail 阈值验证 **数据集改动:** * `demo-agent-v1.json` + `valid-dataset.json` —— expectedArgs 改为 List 格式 核心数字:SDK 层 3 个文件改动,应用层新增 `OrderedToolCallEvaluator` + 17 个测试用例,数据集 2 个文件迁移。 **测试结果**:SDK 143 tests pass, App 17 tests pass。  **TDD 在这里的价值**:测试用例不是凭空设计的——它们直接源于 design.md 中的 Decision 和 spec 中的 scenario 描述。这就是设计文档约束施工的具体体现。 ### 第六步:`/superpowers:verification-before-completion` —— 验收检查   编码完成后,不是直接提交,而是触发 verification skill 做逐项验收。这是**施工方的自检**——测试是否通过、编译是否成功、需求是否覆盖。后面的 opsx:verify 则是**设计方的验收**——文档一致性、spec 覆盖、tasks 状态是否完整。两者视角不同,缺一不可。 **验收流程:** 1. SDK 全量测试:`mvn test` → 143 tests, 0 failures, BUILD SUCCESS 2. App 模块编译:clean 编译通过,无错误 3. 逐项检查变更文件清单是否完整 4. 确认新增的 `OrderedToolCallEvaluator.java` 文件存在 5. 确认新文件能正确编译(它是 untracked 新文件) 6. 需求清单逐项核对 **需求清单核对表:** | 需求 | 状态 | 证据 | | --- | --- | --- | | EvalExpectation.expectedArgs 改为 List | 已完成 | git diff 显示 6 行变更 | | EvalDataset 解析适配 | 已完成 | 2 行变更,2/2 pass | | EvalDataModelTest 适配 + 新增 null 测试 | 已完成 | 6/6 pass | | JSON 数据集迁移 | 已完成 | 均改为 list 格式 | | DemoEvaluator 适配 | 已完成 | computeArgAccuracy 改为遍历 List,编译通过 | | OrderedToolCallEvaluator 新增 | 已完成 | 33 行新增,编译通过 | | DemoAgentMain 集成有序评测 | 已完成 | 新文件存在,含 LCS 算法 + 匹配对 + argAccuracy | | README 更新 | 已完成 | expectedArgs 示例 + 说明文字已更新 | | Spec 更新 | 已完成 | agent-evaluation/spec.md requirement + 3 个新场景 | | App pom 无多余依赖 | 已完成 | dong-boot-starter-test 已移除 | **验证结论:** | 验证项 | 结果 | 证据 | | --- | --- | --- | | SDK 测试 | 143/143 pass | mvn clean test BUILD SUCCESS | | App 编译 | 通过 | BUILD SUCCESS, 0 errors | | 编译 warning | 无本次变更相关 | 仅内网 Maven 仓库 SNAPSHOT metadata warning | | 变更文件 | 9 modified + 2 untracked | git status 确认 | | pom 干净 | dong-boot-starter-test 已移除 | git diff 确认 | | 需求覆盖 | 10/10 项全部完成 | 逐项核对 | **这一步的价值**:它不是"跑一遍测试就完了"。verification 会对照 proposal、design、tasks 中的每一个承诺,逐项检查是否兑现。这是设计文档的"兑付"环节。 ### 第七步:`/opsx:verify` + `/opsx:archive` —— 最终验收与归档 最后用 OpenSpec 的 verify 做全局一致性检查:   **Verification Report: lcs-ordered-evaluator** | 维度 | 状态 | | --- | --- | | Completeness | 10/12 tasks implemented, 0/12 marked done in tasks.md | | Correctness | 4/4 spec scenarios covered in code | | Coherence | 4/5 design decisions followed | 发现了 **3 个 CRITICAL**(tasks.md 中所有 checkbox 未勾选)和 **2 个 WARNING**(details 缺少 missed/extra 工具名输出、spec 缺少 "Expectation with null expectedArgs" 场景)。 修复后再次验证通过。然后执行 `/opsx:archive`:  ``` Archive Complete Change: lcs-ordered-evaluator Scheme: spec-driven Archived to: openspec/changes/archive/2026-06-18-lcs-ordered-evaluator/ Specs: Already synced to main specs during implementation All 4 artifacts complete. All 12 tasks complete. ``` 整个变更从提出到归档,闭环完成。 *** ## 全景流程图 ```mermaid flowchart TD Human["👤 人的角色:决策者<br/>在关键分叉点做选择,其余由 AI 在流程约束下自主执行"] Human --> Propose1 subgraph Propose1 ["① /opsx:propose(设计师出图)"] P1[生成 proposal.md / design.md / tasks.md / delta spec] end Propose1 --> Brainstorm subgraph Brainstorm ["② /superpowers:brainstorming(施工队审图)"] B1["审查设计文档 + 代码<br/>发现问题 → 提出方案选项 → 人做决策"] end Brainstorm -->|"人选择方案"| Propose2 subgraph Propose2 ["③ /opsx:propose(设计师改图)"] P2["更新 proposal / design / tasks / delta spec"] end Propose2 --> TDD subgraph TDD ["④ /superpowers:test-driven-development(按图施工)"] T1["按依赖顺序 TDD<br/>SDK → 数据集 → 应用层"] end TDD --> Verify1 subgraph Verify1 ["⑤ /superpowers:verification(施工方自检)"] V1["测试通过 ✅ 编译成功 ✅ 需求覆盖 ✅"] end Verify1 --> Verify2 subgraph Verify2 ["⑥ /opsx:verify(设计方验收)"] V2["Completeness / Correctness / Coherence<br/>发现问题 → 修复"] end Verify2 --> Archive subgraph Archive ["⑦ /opsx:archive(归档)"] A1["归档到 archive/ · spec 同步确认"] end ``` *** ## 关键洞察:这套工作流到底解决了什么问题 ### 洞察一:设计约束防止 AI "自由发挥" AI 编码最大的风险不是写不出来,而是**写出来的东西跟你想的不一样但看起来能跑**。 在这个案例中,如果没有 OpenSpec 的 proposal 和 design,AI 很可能会: * 沿用 DemoEvaluator 的 findFirst 逻辑做参数匹配(语义错误) * 不触碰 SDK 层,在应用层写 workaround 绕过数据结构限制(技术债) * 缺少同名 tool 多次调用的测试用例(覆盖不足) 这些都不会导致编译失败或测试红灯。它们是**安静的错误**——只有在设计审查阶段才能被发现。 ### 洞察二:施工反馈完善设计 设计不是一次就能做对的。brainstorming 审查出的三个问题(argAccuracy 语义、SDK 数据结构限制、测试联合场景缺失),**都不在初始 proposal 的考虑范围内**。 这不是 OpenSpec 的失败——是"提出需求"和"工程实现"之间天然存在认知落差。brainstorming 扮演的角色是**从工程视角反审设计**,然后把发现的问题回流到 design 文档中。 这种"设计↔施工"的双向反馈,是单独使用任何一个工具都无法实现的。 ### 洞察三:文档是合同,不是装饰 在传统开发中,设计文档写完就扔了,实际实现跟文档不一致是常态。但在这套工作流中: * **TDD 的测试用例依据来自 design.md 中的 Decision 和 spec 中的 scenario** * **verification 阶段逐项对照 proposal/design/tasks 中的每一个承诺** * **verify 阶段检查 spec scenario 是否被代码覆盖** 文档不再是"写给领导看的"装饰品,而是**约束 AI 行为的合同条款**。AI 的每一步操作都可以追溯到文档中的某个决策。 ### 洞察四:人的角色是决策者,不是执行者 回顾整个过程,我实际做了什么? 1. **输入一句需求**:"把 LCS 评测方式在工程的应用层设计并实现" 2. **在 brainstorming 提出的选项中做了两次决策**:选择方案 2(序列位置匹配)和方案 A(连 SDK 一起改) 3. **确认设计更新后 OK** 仅此而已。剩下的所有工作——扫描代码、生成 proposal、审查设计、分析 SDK 结构限制、TDD 编码、逐项验收、spec 同步——都是 AI 在流程约束下自主完成的。 关键词是"在流程约束下"。没有这套流程,AI 也能自主完成,但产出的质量不可控。流程的价值不是让 AI 更聪明,而是**让 AI 的聪明被正确引导**。 *** ## 经验总结:什么时候该用这套联合工作流 ### 适用场景 * **涉及 breaking change 的变更**——需要在动手之前评估影响范围,brainstorming 能发现你没想到的连锁反应 * **跨模块/跨层的变更**——如本案例中 SDK 层 + 应用层 + 数据集的联动修改 * **新增核心能力**——不是修 bug 或加 feature flag,而是新增一个全新的子系统 * **设计有多种选择的变更**——当合理方案不止一个时,需要 brainstorming 把选项摆出来,人来做决策 ### 不适用场景 * 简单的 bug fix 或配置修改——直接写就行,流程反而是负担 * 完全确定的改法——不需要设计决策时,直接 TDD 就好 ### 操作口诀 | 口诀 | 含义 | | --- | --- | | 先 propose 不急动手 | 让设计师出图 | | 再 brainstorm 审一遍 | 让施工队审图 | | 改完设计再开工 | 图纸改了才能施工 | | TDD 写完跑验证 | 施工完自检 | | 最后 verify + archive | 设计师验收归档 | ### 反模式警示 | 反模式 | 后果 | 正确做法 | | --- | --- | ---- | | 跳过 brainstorming 直接 TDD | AI 按初始设计实现,错过了 SDK 层缺陷 | 任何涉及设计决策的变更都要先审查 | | brainstorming 发现问题但不回流 design | 问题在对话中讨论了但设计文档没更新,后续实现还是按旧设计走 | 发现的问题必须更新回 proposal/design | | verification 只跑测试 | 测试通过不代表需求被完整实现 | 逐项对照设计文档中的每个承诺 | | 跳过 verify 直接 archive | 可能遗漏 tasks 未勾选、spec 未同步等一致性问题 | verify 是最后一道防线 | | brainstorming 后选了方案但没记录理由 | 后续回溯不知道为什么选了这个方案 | 决策理由必须写进 design.md | *** ## 人在这套流程中到底做了什么 回头看整个过程,人全程没写一行代码,但做了两个关键决策: * **选择"序列位置匹配"而非"复用 findFirst"**——这来自对业务的理解:一个"有序评测器"的所有维度都应该尊重顺序,不能自相矛盾。 * **选择"连 SDK 一起改"而非"应用层 workaround"**——这来自架构意识:数据结构的缺陷在 SDK 层不修,下游每个使用者都会重复踩坑。 AI 能发现问题、列出选项、写出代码,但做不了这两个判断。因为它不知道这个评测器未来会被谁在什么场景下使用,也没有经历过"当初图省事、后来花十倍代价重构"的教训。 这揭示了 AI Native 时代工程师的两项根本能力: **对业务全面深入的理解**——知道代码是为谁服务的、一个错误决策会在业务链路上产生什么后果。这些隐性知识无法从代码库中推导出来。 **经验积累形成的架构直觉**——看到一个方案,隐约觉得哪里不对劲。这种感觉不是读了代码就有的,而是吃过亏才长出来的。 OpenSpec + Superpowers 联合形成的工程流程,本质上是把这两项能力**从"人亲自写代码"变为"人做判断、AI 去执行"的传动装置**。没有这套流程,人的判断力只能通过亲手写代码来体现;有了这套流程,判断力通过结构化的设计文档和流程化的检查点传导给 AI——效率和质量可以兼得。 代码可以不写,但判断不能缺席。**AI Native 时代的工程师,核心竞争力不再是"能不能写出来",而是"能不能想清楚"。**
上一篇:JD Oxygen AIIC:以LLM/VLM为核心的工业级商品理解、管理与应用系统
下一篇:把业务流程沉淀成高质量 Skill 的实践路径
jd****
文章数
3
阅读量
2864
作者其他文章
01
大促高并发系统性能优化实战--京东联盟广告推荐系统
当一个推荐系统面临高频、瞬时、大幅的流量突变时,如何在维持稳定性的同时,最小化推荐效果损失?背景618对京东来说是一场重要的营销盛会,大促将为业务各个层面带来爆发式增长。然而,超大规模的流量洪峰也对京东各系统提出了严峻考验。京东联盟是京东的联盟营销平台,主要通过投放站外CPS广告来推广京东商品。联盟合作伙伴生成链接并在其他网站或社交媒体平台上推广,用户通过点击这些链接在京东购物,合作伙伴则获得销售
01
Go语言性能剖析利器--pprof实战
关于pprof的文章在网上已是汗牛充栋,却是千篇一律的命令介绍,鲜有真正实操的,本文将参考Go社区资料,结合自己的经验,实战Go程序的性能分析与优化过程。首先说一下性能优化的一般思路。系统性能的分析优化,一定是从大到小的步骤来进行的,即从业务架构的优化,到系统架构的优化,再到系统模块间的优化,最后到代码编写层面的优化。业务架构的优化是最具性价比的,技术难度相对较小,却可以带来大幅的性能提升。比如通
01
人工零Coding:用流程驯服AI -- OpenSpec + Superpowers闭环实战
从提出需求到归档验收,AI 不只是写代码的工具,而是被流程约束的工程角色。引子:两个工具各自好用,合在一起才真正可靠过去几个月,我在日常开发中分别使用过 OpenSpec 和 Superpowers 两套 Claude Code skill。单独用,它们各有所长:OpenSpec 擅长”想清楚”——把一句模糊的需求结构化为 proposal、design、spec、tasks 四件套,确保动手之前
jd****
文章数
3
阅读量
2864
作者其他文章
01
大促高并发系统性能优化实战--京东联盟广告推荐系统
01
Go语言性能剖析利器--pprof实战
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号