资讯中心

从SDD到EDD:驾驭驱动开发如何应对不确定性与复杂系统

📅 2026/8/26 9:55:12
从SDD到EDD:驾驭驱动开发如何应对不确定性与复杂系统
1. 从SDD到EDD一次开发范式的深度转向最近在和一些做架构和项目管理的老朋友聊天时频繁听到两个词SDD和EDD。尤其是EDD被不少人称为“驾驭工程的进化”甚至有人觉得它要颠覆我们过去几十年的开发习惯。作为一个在软件工程泥潭里摸爬滚打了十几年的老兵我最初听到这个说法时第一反应是又来新概念了但静下心来结合自己带过的大小项目和踩过的无数坑去琢磨我发现EDD背后代表的可能不仅仅是一个新名词而是一种应对当前复杂、不确定开发环境的必然思路演进。它不是要全盘否定SDD更像是一次关键的“范式升级”。今天我就结合自己的实践和思考来拆解一下什么是EDD编程它和传统的规格驱动开发SDD到底有何不同以及它是否真的配得上“进化”这个词。简单来说SDDSpecification-Driven Development是我们非常熟悉的开发模式一切从一份详尽、前置的规格说明书Spec出发。产品经理或业务分析师产出需求文档架构师据此设计技术方案开发人员按照设计文档编写代码测试人员依据测试用例进行验证。整个流程像瀑布一样环环相扣文档是贯穿始终的“宪法”。而EDDExecution-Driven Development中文可以理解为“执行驱动开发”或“驾驭驱动开发”它的核心思想是以可执行的、动态的“驾驭”过程为核心来引导、验证和演进整个软件系统的构建。这里的“驾驭”Harness你可以把它想象成一套缰绳、一套控制系统它不一定是最终的代码但一定是可运行、可观察、可调整的“活”的指引。为什么会有这种转变根源在于我们面对的问题域变了。在SDD大行其道的时代软件要解决的问题相对稳定边界清晰比如开发一个财务管理系统、一个内容发布网站。需求可以在一开始被比较完整地捕获和描述。但现在我们面对的是机器学习模型调优、智能体Agent行为设计、复杂业务流程编排、高并发分布式系统治理……这些领域充满了不确定性、探索性和涌现性。你很难在项目开始时就写出一份完美无缺的、静态的规格说明书。你需要的是一个能够快速试错、持续反馈、并引导系统向正确方向演进的“驾驶舱”。这就是EDD要解决的问题。2. SDD传统工程的基石与它的阿喀琉斯之踵在深入EDD之前我们必须先充分理解SDD因为它是现代软件工程的起点其价值与局限共同构成了EDD演进的背景。2.1 SDD的核心逻辑与价值SDD的哲学是“先想清楚再做出来”。它建立在几个关键假设之上需求是可知且稳定的在开发开始前业务问题可以被充分分析并转化为完整、无歧义的需求规格说明。设计可以前置基于稳定的需求系统架构、模块划分、接口设计都可以在编码前完成并且这份设计足以指导后续所有实现。验证基于规约测试的目标是验证最终产品是否完全符合最初制定的规格说明。这套模式的价值巨大尤其对于大型团队和复杂但领域固定的项目降低沟通成本一份好的规格说明书是团队产品、开发、测试、运维之间的契约减少了信息传递的失真。便于估算和管理因为任务被提前分解和定义项目经理更容易进行工作量估算和进度跟踪。保证系统一致性前置的设计有助于保持系统架构的清晰和统一避免在开发后期出现结构性的混乱。质量控制关口前移在编写代码之前就发现设计缺陷修复成本远低于编码甚至上线之后。在实际操作中SDD体现为一系列严谨的产出物产品需求文档PRD、软件需求规格说明书SRS、系统设计文档SDD、详细设计文档DDD、测试计划、测试用例等。开发人员的任务就是“按图施工”。2.2 SDD在当代面临的挑战然而随着软件吞噬世界SDD的局限性在越来越多场景下暴露出来我称之为它的“阿喀琉斯之踵”应对“不确定性”的无力在创新业务、AI模型开发、算法策略优化等领域什么是“正确”的功能本身就是在探索中定义的。比如设计一个推荐算法最初的规格可能是“提升点击率”但具体用什么模型、特征如何组合、参数如何设置根本无法在初期规定死。SDD要求先定义“什么”但在这里“什么”本身就是需要被发现的。文档与实现的“双轨制”困境这是最经典的痛点。需求文档、设计文档一旦写完就很容易与快速迭代的代码脱节。开发中遇到实际问题时往往会临时调整方案但文档却来不及更新。久而久之文档沦为摆设新人不敢信老人懒得看。维护两套同步的、准确的系统文档系统和代码系统成本极高。反馈周期过长SDD的流程是线性的需求-设计-编码-测试-反馈。一个想法要经历漫长的管道才能变成可运行的软件并获得真实反馈。在市场变化迅速的今天这个周期太慢了。等你严格按照规格开发出一个功能可能用户的需求已经变了。扼杀创新与适应性过于严格的规约有时会限制开发人员根据技术实现中的新发现进行合理优化的空间。系统变得僵化难以适应运行环境或上下游系统的意外变化。我经历过一个典型的SDD困境项目为一个传统制造业客户开发一套物联网数据监控平台。前期花了三个月做详尽的需求调研和架构设计文档堆起来有半人高。但真正开始编码后发现现场设备型号繁杂通信协议有大量私有定制之前规格里定义的“标准数据模型”完全无法覆盖。结果就是开发过程变成了不断地“发现异常-紧急开会-修改设计-更新文档常常滞后”团队疲惫不堪项目严重延期。问题的核心就在于对于现场设备这种充满“未知未知”的领域试图用一份静态的规格去驾驭动态的现实是注定要吃力的。3. EDD详解以“驾驭”为核心的动态工程哲学正是为了克服SDD的上述困境EDD的思路应运而生。它不是要抛弃规划和设计而是改变了驱动开发的“核心燃料”从静态的文档变为动态的、可执行的“驾驭”体系。3.1 EDD的核心内涵什么是“驾驭”Harness在EDD语境下“驾驭”是一个核心隐喻。你可以把它理解为一套控制系统就像赛车手的方向盘、油门和刹车它不直接等于赛车最终软件但提供了实时控制赛车行为的手段。一个可执行的实验环境它允许你将想法、策略、配置参数快速转化为可观察的运行结果。活的、版本化的“最高指示”它取代了静态文档成为团队对齐和决策的最新、最权威依据并且它本身是代码或配置可被版本管理。“驾驭”的具体形态因领域而异在AI与机器学习领域“驾驭”可能就是你的训练脚本、超参数配置文件、评估流水线Pipeline。你通过修改一个YAML配置文件中的学习率、批大小然后运行训练脚本观察模型在验证集上的指标变化这就是在执行驱动开发。你的“规格”就是那组能产出最佳指标的参数组合而这个规格是通过无数次执行“摸索”出来的。在提示词工程Prompt Engineering与智能体Agent开发中“驾驭”是精心设计的提示词模板、Agent的工作流定义如使用LangChain或AutoGen定义的流程、工具调用规范。你通过不断调整提示词的措辞、添加上下文示例、修改Agent的推理步骤并观察其执行任务的效果来迭代优化整个智能体的行为。这里的“开发”很大程度上就是“调提示词”和“设计交互逻辑”。在复杂业务系统与工作流编排中“驾驭”可以是用DSL领域特定语言或可视化工具定义的业务流程模型、规则引擎的规则集、状态机的状态转换图。你可以直接运行这个模型输入测试数据看流程是否按预期流转规则是否正确触发从而验证和调整业务逻辑。在DevOps与运维领域““驾驭”则是基础设施即代码IaC脚本如Terraform、部署编排文件如Kubernetes YAML、监控与告警规则。你通过修改和运行这些代码文件来驱动基础设施的变更和应用的部署。EDD的核心主张是将这些“驾驭”实体作为项目的一等公民甚至是核心资产。开发活动围绕创建、运行、观察和迭代这些“驾驭”体而展开。3.2 EDD与SDD的核心区别对比为了更清晰地理解我们可以从几个维度对比EDD和SDD维度规格驱动开发 (SDD)执行驱动开发 (EDD)核心驱动力静态的、前置的规格说明书文档。动态的、可执行的“驾驭”体系代码/配置/模型。需求处理力求在开始前冻结和细化所有需求。接受需求的不确定性通过执行快速探索和验证假设。设计方式前期大量设计Big Design Up Front产出设计文档。演进式设计Evolutionary Design设计体现在可执行的“驾驭”中并随执行反馈而调整。验证方式验证产品是否符合预先定义的规格验证Verification。验证产品在真实或模拟环境中的运行效果是否达到目标确认Validation。文档地位文档是权威的、主要的沟通和知识载体。可执行的“驾驭”代码是主要的权威源“文档”往往是代码注释、自述文件或由代码生成的说明。反馈周期长。需经历完整的开发-构建-测试周期。短。修改“驾驭”体如参数、提示词后可立即或快速看到运行效果。适用场景需求稳定、领域成熟、变更成本高的系统如操作系统内核、金融交易核心。需求不确定、需要探索、算法/策略密集型、高度可配置的系统如AI应用、推荐系统、游戏逻辑、业务规则引擎。团队协作基于文档进行交接和分工如产品给开发PRD开发给测试设计文档。围绕可执行的“驾驭”体进行协作共同运行、观察和讨论结果。注意EDD不是对SDD的彻底革命而是一种补充和演进。在很多大型项目中两者是结合使用的。例如系统的整体架构、核心数据模型可能仍采用SDD方式确定因为这部分相对稳定而具体的业务规则、算法策略、UI交互流程则采用EDD方式迭代开发。3.3 EDD的实践框架与关键活动实施EDD通常意味着你的项目工作流会发生以下变化定义可执行的“驾驭”目标项目开始时不是写一份厚厚的PRD而是先定义一组可运行、可衡量的目标。例如不是写“系统需要智能客服”而是定义“创建一个能处理用户退货流程的对话Agent在模拟测试中首次解决率需达到70%”。这个目标直接关联到你的“驾驭”体Agent工作流的运行结果。构建最小可执行“驾驭”体MVE类似于MVP最小可行产品但这里强调的是“可执行”。尽快搭建一个最简单的、能运行起来的“驾驭”框架。比如对于AI项目可能就是一个能读取数据、跑通训练和评估流程的脚本哪怕模型很简单对于工作流项目就是一个能描述主干流程的DSL脚本。运行 - 观察 - 学习 - 迭代这是EDD的核心循环。运行执行你的“驾驭”体如训练模型、运行工作流、部署配置。观察收集运行时指标、日志、输出结果。这需要强大的可观测性Observability工具支持不仅仅是监控是否出错更要理解“为什么”会这样。学习分析运行结果与目标对比形成洞察。是参数不对是提示词有歧义是流程逻辑有漏洞迭代基于学习到的知识修改你的“驾驭”体调整参数、优化提示词、重构流程然后再次运行。将“驾驭”体代码化、版本化所有“驾驭”逻辑参数配置、提示词模板、流程定义、部署清单都必须用代码或结构化配置如JSON, YAML来定义并纳入版本控制系统如Git。这确保了“驾驭”过程的复现性、可审计性和团队协作能力。自动化与持续“驾驭”将“运行-观察”循环自动化。例如设置持续集成CI流水线每当“驾驭”体代码变更时自动运行测试套件评估效果并生成报告。这实现了快速的、低成本的反馈。4. EDD在具体领域的实战解析理论说得再多不如看实际怎么用。我们结合几个热词中的具体领域看看EDD是如何落地的。4.1 AI与机器学习项目中的EDD实践在这个领域EDD几乎是一种天然的工作方式。传统SDD在这里寸步难行因为你无法预先规定神经网络的准确权重。核心“驾驭”体训练/评估脚本Python脚本使用PyTorch、TensorFlow等框架。超参数配置Hydra、Weights Biases的配置文件或简单的YAML/JSON文件。数据流水线定义使用TFX、Kubeflow Pipelines或自定义脚本定义的数据预处理、特征工程步骤。模型评估与比较框架自动化评估多个模型在不同指标上的表现。EDD工作流示例目标提升某个推荐场景下的AUC曲线下面积指标5个百分点。构建MVE用一个简单的逻辑回归模型跑通从数据加载到评估的全流程。代码仓库里最初可能只有train.py、config.yaml、evaluate.py几个文件。迭代循环修改config.yaml中的模型类型为“深度神经网络”调整层数和神经元数。运行python train.py --config config.yaml。观察训练日志和evaluate.py输出的AUC值。发现过拟合于是在配置中添加正则化参数调整学习率调度策略。再次运行训练和评估...版本化每次有潜力的配置变更都通过Git提交。可以用Git标签标记达到特定指标的配置版本如git tag -a auc-0.85-v1。自动化使用CI工具如Jenkins、GitHub Actions在每次向主分支提交代码时自动运行一组标准评估确保效果不会回退。实操心得在AI项目中实验跟踪Experiment Tracking工具如MLflow、Weights Biases是EDD的“神器”。它们能自动记录每次运行的超参数、代码版本、指标和输出文件如模型权重。这样你可以清晰地追溯哪个配置产生了最佳结果避免了“上次那个好用的参数是什么来着”的困境。这本质上是将“驾驭”的过程和结果都进行了系统化管理。4.2 提示词工程与智能体开发中的EDD实践这是当前大模型应用开发最火热的领域也是EDD思想体现得最淋漓尽致的地方。开发过程从“写代码”变成了“调提示词”和“设计交互逻辑”。核心“驾驭”体提示词模板带有占位符如{user_input}、{context}的文本模板可能存储为.txt或.jinja2文件。Agent工作流定义使用LangChain、AutoGen、Semantic Kernel等框架编写的Python脚本其中定义了多个Agent的角色、工具、它们之间的交互顺序和条件。评估测试集一组标准化的用户查询输入和期望的输出或评估标准如通过/失败或评分。EDD工作流示例目标创建一个能根据用户自然语言描述生成SQL查询的Agent在测试集上的准确率超过90%。构建MVE写一个最简单的提示词“你是一个SQL专家请将以下问题转换为SQL语句{user_question}”并封装成一个函数调用大模型API。迭代循环运行用测试集中的问题调用这个函数。观察发现对于复杂问题涉及多表连接生成的SQL错误率高。学习分析错误发现Agent缺乏数据库schema信息。迭代修改提示词模板在系统指令中加入“你拥有以下数据库表结构信息...”并在用户问题前附上相关表结构。或者升级为更复杂的Agent工作流先让一个Agent分析问题并索要所需表结构再让另一个Agent生成SQL。再次运行和观察准确率提升但发现对于“销量最高的产品”这种模糊描述Agent可能选择MAX(sales)或RANK()结果不一致。再次迭代在提示词中增加更明确的指令或设计一个“澄清Agent”在遇到模糊描述时主动向用户提问。版本化与测试将不同的提示词版本、Agent工作流脚本保存在Git中。构建自动化测试流水线每次修改后自动在测试集上运行并报告准确率变化。注意事项提示词工程非常微妙一个词的改变可能导致输出天差地别。因此严格的A/B测试和版本对比至关重要。不要只凭感觉说“这个提示词好像更好”一定要有量化的评估结果作为决策依据。4.3 基础设施与运维中的EDD实践以Kubernetes为例现代云原生运维早已是EDD的天下。基础设施不再是手动配置的服务器而是由代码定义的、可重复部署的资源集合。核心“驾驭”体基础设施即代码IaCTerraform的.tf文件AWS CDK/CloudFormation模板。应用部署定义Kubernetes的Deployment、Service、Ingress等YAML清单文件或Helm Chart。配置管理ConfigMap、Secret或使用外部配置中心。流水线定义Jenkinsfile、GitLab CI.gitlab-ci.yml、GitHub Actions工作流文件。EDD工作流示例目标将应用的新版本安全、零停机地部署到生产环境。构建MVE编写最基本的K8s Deployment和Service的YAML文件能够将应用跑起来。迭代循环运行执行kubectl apply -f deployment.yaml进行部署。观察使用kubectl get pods,kubectl describe pod, 以及监控工具如Prometheus/Grafana观察应用是否健康启动资源使用是否正常。学习发现Pod因为内存请求设置过低而不断重启。迭代修改deployment.yaml中的resources.requests.memory增加内存申请量。再次运行和观察Pod运行稳定。但想实现蓝绿部署以减少风险。再次迭代修改部署策略引入两个Deploymentblue和green并编写Service切换流量的脚本或使用Istio等服务网格进行流量管理。这个“流量管理规则”就是新的“驾驭”体。版本化与GitOps所有的YAML文件、Helm Chart、Terraform脚本都存放在Git仓库中。生产环境的状态由Git仓库中的代码“声明”。通过GitOps工具如ArgoCD、Flux自动同步Git仓库中的变更到集群。这意味着对生产环境的任何变更都始于对“驾驭”体代码的修改和提交实现了真正的“执行驱动”。5. 从SDD迁移到EDD挑战、策略与避坑指南对于长期习惯于SDD的团队来说转向EDD思维会面临不小的挑战。这不仅仅是工具的变化更是工作习惯、团队协作模式甚至考核方式的变革。5.1 主要挑战思维转变困难最大的障碍是思维惯性。开发人员习惯了接到明确的需求和设计任务现在需要他们更多地主动探索、定义“驾驭”目标、设计实验。产品经理和业务方也可能不适应他们觉得“需求文档都没写清楚你们怎么就开始做了”技能要求变化EDD要求团队具备更强的数据敏感度、实验设计能力、系统观测能力和自动化脚本编写能力。传统的“CRUD”开发技能可能不够用。工具链与基础设施EDD需要强大的工具链支持实验跟踪、自动化测试、持续集成/部署、可观测性平台等。搭建和维护这套基础设施需要投入。项目管理与度量传统的基于任务完成度的项目管理方式完成了多少个功能点在EDD下可能失效。如何衡量“探索”的进度如何估算通过迭代优化提示词或参数所需的时间新的度量标准需要建立比如“实验迭代速度”、“指标提升幅度”、“线上问题定位平均时间”等。质量保障演进测试不再仅仅是验证是否符合规格而是要验证在复杂、多变的环境下系统的行为是否稳健、指标是否达标。这需要发展出新的测试方法如混沌工程、基于属性的测试、线上A/B测试等。5.2 迁移策略与实操建议从小处着手选择试点不要试图一次性在全公司推行EDD。选择一个合适的试点项目或团队。最佳试点项目通常具有以下特征业务目标明确但实现路径不确定如提升某个转化率、团队技术热情高、对失败容忍度相对较高如内部工具、创新业务线。明确“驾驭”的范畴和团队一起讨论在当前项目中哪些部分适合用EDD是算法策略是业务流程还是部署配置先在这些部分引入EDD实践其他相对稳定的部分如核心数据模型、用户账户系统仍可采用SDD。投资工具链但避免过度工程优先引入最急需的工具。例如对于AI团队先上MLflow做实验跟踪对于运维团队先完善监控告警和日志聚合。工具是为了提效不要为了用工具而用工具在初期用简单的脚本和Git标签也能完成很多EDD工作。改变协作仪式站立会不再只是汇报“我昨天做了什么功能”而是分享“我昨天运行了一个实验调整了XX参数观察到指标从A变成了B我的分析是...下一步我打算尝试...”。评审会评审的重点从“设计文档画得对不对”转向“这个可执行的流水线/配置/脚本其设计是否便于实验和观测评估指标设置是否合理”规划会从分解“功能清单”转向定义“实验目标清单”和“关键问题清单”。建立新的度量与激励认可并奖励那些通过精心设计和实验为关键业务指标带来显著提升的贡献而不仅仅是完成了多少张任务卡片。5.3 常见问题与排查技巧实录在实践EDD的过程中你会遇到一些典型问题以下是一些实录和应对思路问题1“我们一直在做实验但好像没有明确方向原地打转。”排查检查你们的“驾驭”目标是否足够清晰和可衡量。目标应该是SMART的具体的、可衡量的、可实现的、相关的、有时限的。例如“优化推荐算法”太模糊“在接下来两周内通过调整模型和特征将推荐点击率提升2%”则是一个好的EDD目标。技巧建立“假设驱动开发”的习惯。每次实验前明确写下你的假设“我认为在提示词中加入更多示例能提高代码生成的准确性。” 然后设计实验去验证它。无论假设被证实还是证伪你都有收获。问题2“实验太多了结果混乱记不住哪个配置最好。”排查缺乏实验跟踪和管理。团队成员可能用本地Excel、记事本甚至靠脑子记。解决强制使用版本控制系统管理所有“驾驭”体代码和配置。务必为每次实验提交代码并在提交信息中清晰说明实验目的和关键变更。这是最低要求。更进一步必须引入实验跟踪工具如MLflow, WandB, DVC这是EDD的基础设施值得投资。问题3“修改了一个配置线上出了大问题回滚很麻烦。”排查缺乏渐进式发布和快速回滚机制。EDD鼓励频繁变更但必须配以安全网。解决实施完善的CI/CD和GitOps流程。任何对“驾驭”体的修改都必须通过自动化测试包括单元测试、集成测试、性能测试。部署应采用蓝绿部署、金丝雀发布等策略先让小部分流量接收变更观察无误后再全量。确保回滚操作简单、快速通常就是切换回Git中的上一个已知良好版本。问题4“业务方看不懂我们的‘驾驭’体比如YAML配置或Python脚本无法有效参与评审。”排查“驾驭”体的抽象层次可能太低全是技术细节。解决尝试创建更高层次的、可视化的“驾驭”表示。例如用流程图绘制Agent的工作流用仪表盘展示不同实验的指标对比用自然语言注释复杂的配置项。目标是让非技术人员也能理解核心逻辑和决策点。同时团队需要有一个“翻译”负责向业务方解释技术实验背后的业务含义。6. 总结EDD是进化而非革命回到最初的问题EDD相对于SDD是一次驾驭工程的进化吗我的答案是肯定的但它不是颠覆性的革命而是一种适应新时代软件复杂性的范式扩展和重心转移。SDD并没有过时在需求明确、架构稳定的领域它依然是保证质量、控制风险的基石。EDD的兴起是为了填补SDD在应对不确定性、探索性和涌现性问题时的空白。它将软件开发的焦点从“制造一个符合预设规格的静态产品”部分地转向了“培育一个能在动态环境中达成目标的适应性系统”。这种进化体现在几个方面资产形态的进化从静态文档到动态、可执行的代码/配置。开发节奏的进化从漫长的阶段性交付到快速的、持续的实验迭代。团队协作的进化从基于文档的交接到围绕可运行原型的共同探索和调试。质量内涵的进化从“符合规约”到“在真实环境中表现稳健并达成业务目标”。对于开发者个人而言拥抱EDD意味着提升自己的“元技能”不仅仅是编写实现功能的代码更要学会编写“驾驭”功能的代码不仅仅是解决问题更要学会定义问题、设计实验、解读数据。这无疑对开发者提出了更高的要求但也打开了更广阔的成长空间。所以不要纠结于EDD是否会完全取代SDD。更务实的做法是将EDD视为你工具箱里的一件新利器。在面对那些“不知道最终样子是什么但知道要往哪个方向努力”的挑战时大胆地运用EDD的思想和方法用可执行的“驾驭”去探索未知用快速的反馈去校准方向。这或许就是在这个快速变化的时代保持工程驾驭能力的核心所在。