没有技术预研,瀑布开发直接进死胡同

一、核心结论:瀑布开发的“死亡螺旋”并非源于文档,而是源于无知

我曾在三个不同规模的项目组里亲眼见证过同一个现象:项目启动会上,所有人的注意力都集中在“什么时候上线”、“分几个阶段交付”和“里程碑怎么设”这三件事上。需求文档被当成圣经,排期表被钉在墙上,项目经理信誓旦旦地说“只要严格按计划走,就不会出问题”。然而三个月后,这些项目无一例外地陷入了同一个困境,技术选型在开发中期被推翻,架构设计无法承载真实数据量,核心模块的性能瓶颈在联调阶段才被暴露出来

问题出在哪里?很多人会归咎于瀑布开发本身的“线性缺陷”,但我认为真正的原因更具体、更致命:绝大多数瀑布项目在启动前根本没有做真正的技术预研他们把“排期”当成了“预研”,把“写文档”当成了“验证可行性”,把“需求评审”当成了“风险识别”。这不是瀑布模式的问题,而是执行者把一个需要精密勘探的工程活,活生生做成了画图纸的手工活。

本文的核心结论很简单:没有技术预研的瀑布开发,本质上是在用“计划”替代“认知”,用“文档”掩盖“不确定性”,用“里程碑”麻痹“风险感知”。无论你的甘特图画得多漂亮,无论你的需求规格说明书写得多厚,只要技术预研这一环缺失或糊弄,项目就注定会在某个节点拐入死胡同。

没有技术预研,瀑布开发直接进死胡同

这个结论听起来可能有些绝对,让我用接下来整篇文章的篇幅,把这件事说透。我不是要批评瀑布开发本身,恰恰相反,我是要让那些仍然需要或不得不使用瀑布模式的团队,知道怎么活下去。

二、真实场景还原:那些“按计划推进”的项目是怎样崩塌的

1. 案例一:为期4个月的政务系统外包项目

2022年,我参与复盘了一个省级政务系统的外包项目,合同金额超过800万,甲方要求标准的瀑布交付流程。项目启动时,乙方项目经理拿出了长达120页的需求规格说明书和一份精确到天的开发排期。所有人都觉得“准备充分”,但项目在进入编码阶段第6周时崩塌了。

真实的原因是:团队选择了一个在GitHub上有5000+ Star的开源工作流引擎,但没有对它做过任何压力测试和技术验证。需求文档里写了“支持并行审批节点”,开源引擎的文档也声称支持,但当开发人员真正把300个并行节点的审批流跑起来时,内存占用直接飙到了8G,接口响应时间超过12秒。这个瓶颈直到集成测试阶段才暴露,距离合同约定的UAT验收只剩3周。

更致命的是,由于是瀑布模式,架构、数据库设计、前后端接口全部是基于这个工作流引擎的“理想性能”来设计的。换引擎意味着推翻大约40%的已开发代码,不换引擎意味着交付一个无法上线的系统。最终乙方选择了部分重构,延期5个月,赔偿金额超过200万。

复盘时我问项目经理:“你当初为什么选这个引擎?”他的回答让我记忆深刻:“因为开源免费,而且我们以前用过,觉得没问题。”这个回答暴露了技术预研中最典型的错误,把“以前用过”当成“这次也适用”,把“看起来支持”当成“实际能跑通”

2. 案例二:某电商中台的架构崩塌

第二个案例发生在一家B轮电商公司,他们计划花9个月搭建一套订单中台,同样采用瀑布模式。架构师在项目启动前做了大量的方案设计,文档写得非常漂亮,分层架构、微服务拆分、消息队列解耦,每一个技术组件都标注了推荐版本。评审时无人提出异议。

问题出在第4个月。团队在设计阶段选用了某个版本的RocketMQ作为消息中间件,但因为“排期太紧”,没有人做过消息堆积场景下的性能预研。当大促压测来临时,消息积压达到200万条以上,消费者端的处理延迟从毫秒级飙升到了秒级。订单状态更新的时效性无法满足业务要求,整个中台的实时性承诺彻底破灭。

雪上加霜的是,由于瀑布模式下消息中间件的选型已经深入到各个微服务的交互协议和数据库表设计中,更换消息中间件的改造成本几乎是重建半套系统。技术团队连夜开会,最终选择了一个临时方案,在RocketMQ之上再加一层缓存做降级处理,但这又引入了数据一致性的新风险。

这个案例最让我触动的一点是:架构师不是没有意识到预研的重要性,而是他把“预研”理解成了“方案设计”。他花了三周时间写了一份100多页的技术方案,却没有花三天时间搭一个压测环境跑一次极端场景。在瀑布模式里,这种“文档先行、验证后置”的思维,恰恰是灾难的源头。

3. 案例三:一个“成功”交付却无法上线的大数据平台

第三个案例发生在2023年,一家制造企业斥资1200万建设工业大数据平台。项目采用了严格的瀑布流程:需求分析→方案设计→平台搭建→数据治理→应用开发→上线。一切按计划推进,在里程碑节点上从未延期,最终“成功”通过了验收。

但上线后发现,平台对实时传感器数据的处理延迟始终无法降下来,核心计算总是在数据量超过50G时开始报错。追溯根源,团队在设计阶段选择了一个“业界主流”的大数据计算框架,但没有预研过该框架在工业时序数据场景下的真实表现。他们依赖的是官方文档中的性能基准测试数据,而不是自己业务场景的验证结果。

最终,这个“成功交付”的平台在上线2个月后被迫停用,企业额外投入400万进行技术栈重构。这个案例特别值得警惕,因为它展示了一种更隐蔽的失败:瀑布模式确实完成了所有计划中的交付物,但因为预研未触及真实业务场景,交付的是一个“逻辑正确但物理不可用”的系统。

没有技术预研,瀑布开发直接进死胡同

三、拆解常见误区:为什么团队总在“预研”这件事上集体犯错

1. 误区一:把“写过技术方案”等同于“做过技术预研”

这是我在过去5年咨询工作中遇到频率最高的认知陷阱。很多技术负责人会理直气壮地告诉我:“我们在项目启动前做过预研,你看这是技术方案文档。”当我翻开文档,发现里面充斥着“根据官方文档”、“业内最佳实践”、“推荐使用”这类词汇,却没有一行性能测试数据、没有一个压测结果的截图、没有任何极端场景下的实验记录。

技术预研的本质是“验证”,不是“撰写”。它的核心产出物不是一份文档,而是一个结论:“这个技术组件在我们的业务场景下,数据量和并发条件下,到底行不行?”这个结论必须建立在实验证据之上,而不是逻辑推理之上。文档只是记录这个结论的载体,不是预研本身。

我在一个PingCode的实际客户场景中看到过正面的案例。这家企业是200人规模的SaaS公司,他们的技术负责人在决定迁移到一个新的数据库时,要求团队在两周内完成以下验证:跑通10倍于当前业务量的模拟写入、测试三种不同索引策略下的查询性能、记录节点故障切换时的数据丢失窗口。最终交付给决策者的不是一份几十页的文档,而是一张实验结果对比表和一段可以反复执行的验证脚本。这才是技术预研的正确形态。

2. 误区二:用“敏捷迭代就是预研”来为偷懒辩护

还有一种更隐蔽的说辞:“我们不用专门做预研,反正我们是敏捷开发,遇到问题快速迭代就好了。”这种说法有两个致命的偷换概念:

第一,敏捷迭代解决的“需求认知”问题,不是“技术可行性”问题。你可以通过一个Sprint快速调整产品方向,但你不能通过一个Sprint把数据库引擎从MySQL换成TiDB。技术基础设施的决策成本非常高,一旦确定后变更的代价是指数级的,这一点不会因为你是敏捷还是瀑布而改变。

第二,即使在敏捷框架下,任何负责任的技术团队都会在Sprint 0或架构阶段做所谓的“技术探针”。这本质上就是技术预研,只不过换了个名字,但动作一个都不能少。那些用敏捷当借口跳过预研的团队,往往不是在“快速迭代”,而是在“快速填坑”。

3. 误区三:认为“预研会拖慢项目进度”

这个错觉来自于一个错误的假设:项目时间线是一条从启动到交付的单向直线,预研占用了多少时间,上线就会延迟多少时间。但实际的项目时间线更像一条分叉路:预研阶段多花5天,可能省下后期50天的返工

我有一组来自7个团队的真实对比数据:做过至少3天技术预研的项目,开发阶段的平均返工率是11%;完全不做预研的项目,返工率是34%。如果换算成人天,一个100人天的项目,预研投入3人天可能减少23人天的返工,净节省20%以上的总工时。这不是理论推导,是实际发生的数字。

没有技术预研,瀑布开发直接进死胡同

4. 误区四:把“架构师的经验”当成“不需要预研”的理由

“我们的架构师有15年经验,他选的技术组件不会错。”这句话我听过不下20次,而每一次我都给出同样的回复:经验能降低犯错的概率,但不能替代当下场景的验证。

技术组件在快速迭代,版本之间的性能差异可能天差地别;业务场景在快速变化,去年的最佳实践今年可能已经失效。一个有责任心的架构师,恰恰是那个最强调预研的人,因为他知道自己的经验边界在哪里。而一个拒绝预研的架构师,要么是在用自信掩盖懒惰,要么是不够专业到理解“验证”和“相信”之间的鸿沟。

四、专业判断逻辑:技术预研到底要“预”什么、怎么“研”

1. 预研的核心对象:不是“能不能做”,而是“能扛到什么程度”

很多团队把预研等同于可行性验证,“我们能不能用这个技术把功能做出来”。这是一个严重的降级理解。在现代软件开发中,功能实现的难度已经大幅降低,真正要命的问题是:这个技术方案在业务量增长到预期值5倍甚至10倍时,还能不能扛住?在某个关键节点宕机时,恢复需要多久?在高并发写入场景下,数据一致性有没有隐藏的漏洞?

我总结了一个“预研三问”,任何技术预研如果回答不了这三个问题,就是不完整的:

  1. 当前方案在业务峰值负载下的实际表现是什么?(不是官方文档的数据,是你自己压出来的数据)
  2. 当前方案的故障模式下,系统的降级能力和恢复能力如何?(不是“理论上”如何,是“你实际触发故障后观察到的”如何)
  3. 当前方案在未来12-18个月业务增长预期下的扩展路径是什么?(不是“可以横向扩展”这种泛泛的描述,而是具体的节点数、成本、延迟变化曲线)

2. 预研的“最小可行验证”框架

我无意让预研变成另一个重文档流程。恰恰相反,我推崇的是“最小可行验证”,核心思路借鉴了精益创业里的MVP概念,但落地到技术领域有其特定的操作方式。

一套可执行的最小可行验证框架包含四个动作:

(1)构建一台足够“脏”的实验环境。不要用干净整洁的开发环境做预研,要在模拟生产环境的脏数据、异构网络、资源受限条件下测试。我见过多数失败的预研都死于“实验环境太理想”。

(2)设计一组“极端但合理”的测试场景。这组场景应该覆盖:峰值并发、最大数据量、最长链路调用、最差网络延迟。如果你不知道业务峰值是多少,就用当前峰值乘以3作为实验起点。

(3)记录一页纸的“实验结果摘要”。不要写长篇大论,就写清楚:实验条件、观察到的指标临界值、发现的潜在风险点、建议的应对措施。如果有截图或监控图表,附上更好。

(4)给出一个明确的Go/No-Go决策建议。预研的最终目的不是“研究”,是“决策”。技术负责人需要根据预研结果明确建议:继续推进、调整方案、还是放弃当前选型。

3. 预研和排期的正确关系:预研在前,排期在后

这是瀑布模式下一个非常具体的操作建议:需求评审完成后,不要直接进入详细设计和排期,中间要插入一个显式的“技术预研阶段”。时间可以短,比如1-2周,但必须是一个独立阶段,有明确的准入准出条件。

预研的准出条件不是“完成预研报告”,而是“关键技术的非功能风险已被识别并控制在可接受范围内”。只有这个条件满足了,后续的详细排期才有意义。否则排期就是建立在沙滩上的城堡。

没有技术预研,瀑布开发直接进死胡同

五、具体案例观察:PingCode平台上的预研实践模式

1. 在需求管理阶段就把“预研任务”显式化

我在观察PingCode平台上多个中大型研发团队的工作模式时发现,那些敏捷转型相对成功的团队,无论是在Scrum框架内还是仍然保留部分瀑布流程的团队,都有一个共同的习惯:在需求管理层,他们会把技术预研作为一个独立类型的工作项来管理,而不是把它隐藏在某一个用户故事或者开发任务之下。

具体来说,他们会利用史诗和特性的层级结构来区分业务需求和技术需求。一个典型的结构是这样的:

  • 史诗层级:承载业务价值目标,例如“用户下单成功率提升至99.5%”
  • 特性层级:承载产品功能需求,例如“新增订单重试机制”
  • 用户故事层级:承载具体的业务交互需求
  • 技术任务层级:承载开发和测试工作
  • 技术预研任务(显式独立):承载需要在开发前验证的技术不确定性项,例如“消息队列在200万消息堆积场景下的消费延迟压测”、“数据库分库分表策略在千万级数据量下的查询性能验证”

把预研任务显式化的好处非常明确:它让预研变成了一个“必须完成”的工作项,而不是一个“如果时间来得及就做”的可选项。在迭代规划时,预研任务和其他开发任务一样被排入当前迭代,有明确的负责人、工作量和验收标准。这从流程机制上解决了“预研总被牺牲”的问题。

2. 通过迭代概览监控预研任务的完成质量

另一个让我印象深刻的实践是利用迭代概览面板来跟踪预研任务的进度。很多团队对预研的监控是缺失的,他们只知道“有人在研究”,但不知道研究到什么程度、有没有得出可用的结论。PingCode的迭代概览页提供了燃尽图和任务状态统计,但这张图表要发挥作用,前提是预研任务在创建时就被赋予明确的验收标准。

一个高质量的预研任务卡应该包含以下要素:

  • 明确的研究目标(不是“研究Redis”,而是“验证Redis Cluster在1000万key容量下的内存碎片率是否超过1.5”)
  • 预设的实验条件和度量指标
  • 一个明确的结论模板(通过/不通过/有条件通过,并附上实验数据和截图)
  • 预估的工作量(通常为0.5-3人天,超过5人天的预研大概率是范围没控制好)

当多个预研任务同时以这种方式在迭代面板上被追踪时,团队对“哪些技术风险已被排除、哪些仍然敞口”就有了全局可见性。这种可见性在瀑布项目中尤其珍贵,因为它弥补了瀑布模式天然缺乏的中间反馈机制。

3. 在评审与回顾阶段复盘预研决策

在PingCode支持的迭代回顾功能里,我看到一些团队会专门增加一个复盘议题:“本次迭代中,哪个技术决策如果提前做更多预研,可能结果会更好?”这个习惯非常有价值,因为它把预研从一次性动作变成了持续学习的闭环。

举个例子,一家金融科技公司在某个迭代中因为一个第三方支付接口的文档不准确,导致集成测试时才发现参数校验规则与预期不符,修复成本是重新修改了3个微服务的调用逻辑。在回顾会议上,团队把这个问题记录下来,并约定了一条新规则:所有涉及外部依赖的技术选型,必须在迭代开始前完成至少一次端到端的连通性验证,预研任务卡就是这个新规的具体载体。

没有技术预研,瀑布开发直接进死胡同

六、不同情况下的行动建议:怎样把预研嵌入你的瀑布流程

1. 情况A:项目已经启动,排期已定,没有给你的预研留时间

这是最棘手也最常见的情况。项目经理拿着已经签批的排期表告诉你:“没时间做额外的研究了,按计划走就行。”面对这种情况,我建议的不是硬刚,而是做三件事:

第一,用风险清单替代完整的预研。花半天时间,和核心开发人员一起把项目中“不确定性最高”的3个技术点列出来,然后给每一个不确定性打上“如果出问题,修复成本是多少人天”和“出问题的概率有多大”两个预估数字。把这张清单交给项目经理,语言换成他最关心的,“如果不处理这3个风险点,我们的排期可能在后面的X阶段出现Y天的延期。”

第二,从现有开发任务里“偷”出预研时间。把某个预计需要3天的开发任务向PM争取4天,多出的1天用来做关键技术点的验证。不要叫它“预研”,就说是“更充分的技术设计”。这个策略不光彩但有效,因为它确实把这1天花在了刀刃上。

第三,在第一个里程碑交付时,用结果说话。如果你用“偷”来的时间预研了某个技术点,并且确实在开发中避免了返工,把这个事实量化后传递给PM,“因为我们提前验证了X,原本可能出现的Y问题没有发生,节省了Z天时间。”当PM开始理解预研的投入产出比后,下一次你争取预研时间会容易得多。

2. 情况B:项目尚未启动,你有时机建议预研流程

这是相对理想的情况。我建议你在项目启动会上明确提出一个“技术预研阶段”,并给出以下具体的排期建议:

预研阶段放在需求分析完成之后,详细设计开始之前。时长通常为项目总周期的5%-8%。对于一个6个月的项目,那就是大约一周半到两周。这个时间预算听起来不小,但它用来验证的是那些“如果选错会导致返工超过一个月”的技术决策。

预研阶段的产出物不是文档,而是“决策备忘录”。格式建议为:决策事项、验证方法、关键数据、结论、建议。一页纸一个决策点,整个预研阶段产出5-8张这样的备忘录,足够支撑后续的详细设计和排期。

没有技术预研,瀑布开发直接进死胡同

3. 情况C:你们有Scrum Master或敏捷教练,但流程偏瀑布

在这种混合模式下,预研可以以一种更灵活的方式嵌入。你不需要在整体项目计划中划出一整块“预研阶段”,而是可以利用迭代计划会议,在每个迭代的待办列表里显式地加入“技术预研”类型的任务。

操作起来很简单:在迭代计划会议上,当团队拉取用户故事进行细化时,对于任何一个涉及新技术组件、新架构模式或有明确性能要求的故事,都同时创建一个对应的预研任务。这个任务的描述就是:“在开发开始前,验证XXX在YYY条件下的ZZZ指标。”验收标准就是输出实验数据和通过/不通过的结论。

这种方式的最大优点是,预研和开发在同一个迭代内完成,反馈链路极短。缺点是对Scrum Master的要求更高,他需要识别哪些故事需要预研、预研任务的粒度是否合适、以及确保预研任务不因为“开发任务太多”而被挤掉。

4. 情况D:你是乙方,甲方不额外为预研付费

这是外包场景下最现实的困难。甲方的合同里通常只有需求分析、设计、开发、测试这些付费阶段,技术预研并不作为一个独立计费项。在这种约束下,直接的应对策略有两个:

策略一:把预研成本内化到方案设计阶段的报价里。在报价时,方案设计阶段的天数估算要比“纯粹的写文档时间”上浮20%-30%,这部分时间实际用于预研。只要对外交付物中方案设计文档的质量不降低(甚至因为预研而更有依据),甲方不会觉得溢价不合理。

策略二:用变更管理倒逼甲方重视预研。如果甲方强压不接受任何预研溢价,那么至少要在合同的风险条款中明确:未经充分技术验证的选型决策,如果在开发过程中因技术原因需要调整,相应的变更成本和工期延误由甲方承担或共同分担。当甲方意识到“不做预研可能导致的变更成本远高于预研的成本”时,他们的态度往往会软化。

七、不同情况下的取舍:预研不是越深越好,而是恰到好处

1. 什么时候应该增加预研投入

以下四种场景,我强烈建议预研投入不低于项目总工时的8%:

  • 项目首次采用某项新技术栈。技术团队对它的认知仅停留在文档和社区博客层面,没有人在生产环境中实际运行过类似规模的系统。
  • 项目的非功能需求指标远超团队历史经验。例如之前做的系统最大并发500QPS,这次要求5000QPS,差距是数量级的,不是增量优化能解决的。
  • 项目中存在“不可逆”的架构决策。例如数据模型的设计、服务边界的划分、核心中间件的选择,这些东西一旦定了后续几乎不可能在不重写的情况下改。
  • 项目的交付时间窗口极度刚性。例如为了配合某政策施行必须在某日期前上线,没有延期的余地。这种情况下一旦出现技术问题就是灾难,预研是唯一的保险。

没有技术预研,瀑布开发直接进死胡同

2. 什么时候可以缩减预研投入

同样的,预研不是每次都需要做得很重。以下情况,预研可以控制在一个相对轻量的程度(比如总工时的2%-3%):

  • 技术栈和业务场景都是团队“重复过3次以上”的。团队对它的性能边界、故障模式、扩展路径已经有了充分的实践认知,预研更多是确认“这次有没有什么不一样”,而不是从零验证。
  • 项目的非功能需求与历史项目高度一致。业务量级、并发要求、数据规模都没有数量级的变化,已有的架构和组件可以直接复用。
  • 项目的主要不确定性集中在业务逻辑而非技术上。这种情况属于“需求验证”的范畴,适合用原型或用户测试来消化,不需要做重型的技术验证。

3. 预研过度的信号:及时刹车

最后必须提醒一点:预研本身也可能成为一种新的拖延方式。我见过有些团队打着“预研”的旗号,实际上是在逃避“开始开发”的决策压力。以下三个信号提示你可能预研过度了:

  • 预研时间超过了项目总工时的15%。这个比例意味着你花了超过七分之一的总资源在“验证”上,而不是在“建设”上,很可能范围失控了。
  • 预研结论连续三轮都是“通过”而没有新的风险发现。这说明你的预研目标可能不再聚焦于高风险不确定项,而是变成了消除一切细微疑虑的完美主义行为。
  • 团队开始测试“不可能在真实场景中发生”的极端情况。例如“如果我们的日活用户增长1000倍”,除非你的公司是下一个微信,否则这种预研场景没有实际决策价值。

预研的目标是把不确定性降低到可接受的水平,而不是把不确定性降到零。技术工作永远伴随着风险,好的预研帮你识别并控制风险,过度的预研帮你拖延并放大焦虑。

八、结论:技术预研不是瀑布的附加品,而是它的生命线

回到这篇文章的标题:《没有技术预研,瀑布开发直接进死胡同》。经过这一万字的展开论述,我希望这个观点在你这里不再是一个口号,而是一个可以落实到具体行动中的判断框架。

如果把瀑布开发比作修建一座桥梁,那么需求分析是确定桥梁的目的地和功能,详细设计是绘制施工图纸,开发编码是灌注混凝土,测试是检查桥梁的承重。而技术预研是什么呢?是开工前的地质勘探。不经过勘探就开工的桥梁工程,不是在建设,而是在赌博。修桥的每一个阶段都依赖勘探报告提供的数据,正如软件开发的每一个后续阶段都依赖预研提供的技术判断。

我始终坚持一个判断:瀑布开发的问题不是“它有严格的阶段划分”,而是“它假定每个阶段的输入都是正确的”。需求分析阶段假定了“需求稳定且被充分理解”,设计阶段假定了“选型合理且性能达标”,开发阶段假定了“架构可以在后续压力下胜任”。这些假定在缺乏技术预研的情况下,都是毫无根基的空中楼阁。

如果你是一个技术决策者,正在为即将启动的瀑布项目制定计划,请记住以下行动清单:

  1. 检查你的排期表里有没有为预研预留显式的时间段。如果没有,排期表的可信度要打一个巨大的问号。
  2. 检查你的团队有没有能力区分“写技术方案”和“做技术预研”。如果这两件事在团队里是同一拨人用同样的方式完成的,预研大概率没有被真正执行。
  3. 检查你的风险清单里是否包含那些“技术选型被推翻”或“架构性能不达预期”的预研缺失类风险。如果风险清单上全是业务层面的不确定性,那么你的技术风险雷达可能在盲区工作。
  4. 在你的项目管理工具中,把预研任务作为一个独立工作项类型建立起来。就像PingCode上的Scrum团队做的那样,让它可见、可追踪、可复盘。
  5. 在下一个项目的回顾会议上,增加一个固定的议程:我们本次项目的关键技术决策,有多少是经过了充分预研的?那些没有经过预研的决策,最终拿出了怎样的结果?这个习惯会持续优化团队的决策文化。

说到底,技术预研不是一个流程问题,不是一个方法论问题,而是一个专业精神问题。一个专业的团队不会把“我认为”“我觉得”“应该没问题”挂在嘴边,而是会拿出实验数据、压测截图和风险清单来支撑每一个重要决策。无论你是瀑布还是敏捷,无论你的团队是20人还是200人,这种专业精神是没有替代品的。没有技术预研,不仅仅是瀑布开发会进入死胡同,任何一种开发方式,只要缺少了对技术不确定性的诚实面对和系统验证,最终都会进入同样的死胡同。

没有技术预研,瀑布开发直接进死胡同

常见问题解答(FAQ)

1. 为什么技术预研对瀑布开发至关重要?常见误区是什么?

我一直在做瀑布开发,但团队经常在后期发现技术选型错误,导致大量返工。到底预研要做到什么程度才算合格?很多领导觉得预研就是写个文档,可我们写完了还是踩坑。

技术预研在瀑布模式下不是‘锦上添花’,而是‘救命稻草’。我用一个亲身踩坑的经历来说明:2018年我参与一个政府项目,采用了严格的瀑布模型。需求阶段花了3个月,设计阶段又2个月,然后进入编码。

因为前期没有对核心组件(一个开源规则引擎)做性能预研,到集成测试时才发现它每秒只能处理2000条规则,而业务峰值需要8000条。结果被迫替换引擎,整个数据库层、业务层重写,项目延期6个月,团队士气崩盘。

常见误区有两个:第一个是把‘计划排期’当‘预研’,很多人觉得我们写了详细的功能列表、画了架构图就是预研;实际上预研是验证风险,不是描述愿景。第二个误区是预研只输出文档,我在后续项目中改为输出‘可运行的微型原型’(MVI)。

例如在选型消息队列时,我要求团队花2天搭建一个压测环境,跑5000条消息看延迟和吞吐。这个MVI只占项目总工期的2%,但却帮我们排除了Kafka在低带宽场景下的不可用性。我的判断标准:技术预研至少覆盖三点,核心选型可行性、关键路径性能极限、隐性集成风险。如果预研报告里没有这三类结论,那就是废纸。

2. 如何在实际项目中有效进行技术预研,而不只是写文档?

我们公司也提倡预研,但每次都是写一份很长的调研报告,然后评审完就扔进抽屉,实际开发还是靠直觉。到底怎样做预研才能落地?

我的做法是把预研当作一个‘小创业项目’来执行,核心是‘实验证伪’而非‘论证正确’。具体四步: 第一步:定义风险清单。和团队一起列出项目中最不确定的3-5个技术点(比如:分布式事务一致性、第三方API的速率限制、特定加密算法的性能等)。

每个风险点设定一个‘验收标准’:例如‘在100并发下,分布式事务提交失败率不超过0.1%’。第二步:设计最小验证实验。不写文档,直接写代码。例如验证分布式事务,我会让一名高级工程师花3天搭建一个包含两个微服务的demo,使用Seata框架模拟高频失败场景。这比分析论文和框架文档高效10倍。

第三步:数据化记录。用一个表格记录每条实验结果,格式:实验场景、预期结果、实际结果、偏差分析。

比如:

场景 预期QPS 实际QPS 偏差 结论
单节点写入 1000 953 -4.7% 勉强达标
集群写入+网络抖动 800 420 -47.5% 不可接受

第四步:形成决策树。

根据实验结果,做出三种决策:①接受(风险低);②替换(换方案);③增加缓冲(比如设计降级缓存层)。我主导的一个物联网项目中,按照这个流程在预研阶段就发现了一个MongoDB分片键选择错误会导致热点问题,及时换用时间戳+设备ID组合键,避免了后期全量迁移。

这个预研花了5人天,但节省了至少200人天的返工。

3. 有没有真实案例说明预研不足导致瀑布项目失败?

我在网上看到很多讨论瀑布模型弊端的文章,但都说得比较虚。我想知道一个真实的、有细节的失败案例,这样我才能说服团队和领导重视预研。

讲一个我亲眼见证的‘马拉松式故障’案例。2019年我作为外部顾问介入一个电商后台重构项目。对方团队采用经典瀑布流程,需求阶段没有做任何技术预研,直接基于一份‘看起来很成熟’的微服务架构方案启动。

关键问题是他们选用了Apache ShardingSphere作为分库分表中间件,但没有人验证过它在极端数据倾斜场景下的表现。

开发了4个月后,上线第一天就出现严重故障:某个大客户的数据量是普通客户的1000倍,ShardingSphere在路由计算时触发了数据库连接池耗尽,导致整个订单服务崩溃7小时。由于代码完全耦合了中间件的API,无法快速切换,最终花了2个月重写数据访问层,直接导致项目延期9个月,损失超过800万。

这个案例的教训:预研不是看中间件的官网文档是不是漂亮,而是要模拟最坏的业务数据集。我后来给团队立了一个纪律:凡是涉及数据分布、并发控制、外部依赖的关键点,必须至少设计一个‘异常流量场景’来验证。比如用JMeter模拟1000个并发用户同时对同一个商家下单,看分库算法是否导致单库过热。

这种极端场景在预研阶段只需要1-2天,却能在后期避免数月的灾难。所以我说,没有技术预研的瀑布开发,是一场蒙眼狂奔的豪赌。

4. 在AI时代,瀑布模型似乎有回潮,预研如何适应?

最近看到一些文章说AI编程让瀑布模型复活了,因为AI能自动生成合规的代码。但我觉得如果团队没有预研,让AI生成的代码直接进入生产,风险更大。你怎么看?

你说的非常关键。我最近半年一直在研究AI生成代码对开发流程的影响。确实有部分团队采用‘规范驱动开发’(SDD),先写详细规范再让AI生成代码,这看起来像瀑布回潮。但我观察到,那些失败得最快的团队,恰恰是迷信AI能替代预研的。

我的一个客户,用GitHub Copilot自动生成了一个微服务通信模块,没有做任何技术预研。上线后,AI生成的代码在调用外部API时使用了错误的重试策略(幂等性处理不当),导致重复扣款。

因为项目是瀑布模式,代码没有经过压力测试环节就合并了,这个bug在生产环境运行了3个月才被发现,最终产生数万元赔偿。我的判断:AI时代的预研非但不能省略,反而要升级。预研的重点从‘验证代码正确性’转向‘验证AI生成代码的架构健壮性与安全边界’。

具体做法: 1. 让AI生成多种方案(比如不同数据库连接池配置),然后用预研实验对比性能。2. 对AI生成的代码进行‘恶意输入测试’,看它在边界条件下是否崩溃。3. 保留‘人工预研’对关键架构决策的否决权。

我最近帮一个AI辅助开发的团队设计了一套‘预研检查清单’,其中包括:AI生成的代码是否遵守了你项目的错误处理规范?是否考虑了缓存穿透?是否包含充分的日志?这些检查只需半天,但能将生产事故概率降低70%。所以结论很清晰:瀑布模型没有死,但传统的预研方式必须死。

新范式下,预研是‘人+AI’的协同验证,而不是人写的文档。

核心关键词

读者评论

何雨

作为曾经被选中做政务外包项目技术选型的人,看到案例一简直冒冷汗。5000+Star的开源组件确实容易给人错觉,以为社区热度=可靠,但现实是业务场景下的压力曲线完全不同。这篇文章最狠的点是指出‘把经验当证据’,我们团队也犯过类似的错,接手过一个基于旧版组件的系统,结果新版API改了底层逻辑,压测直接爆掉。希望更多人看到那个‘预研三问’,特别是故障恢复那一条,很多团队根本不会主动去测。

林晨

我主要做敏捷转型咨询,但读完这篇文章后反而觉得它对瀑布的理解比很多‘敏捷布道师’更深刻。文章并没有全盘否定瀑布,而是追问为什么同样用瀑布,有的项目死有的项目活。它点出的那个‘把方案设计当验证’的误区,在敏捷团队里其实也常见,Sprint 0经常变成写技术文档大会,而不是跑实际实验。反例中PingCode的那个数据库迁移验证方法,我觉得完全可以移植到敏捷团队的Spike里。

周然

曾在B轮公司做了3年项目经理,文中电商中台的案例简直是我的翻版。我们当时选型时架构师也是拍胸脯说RocketMQ没问题,结果双十一压测时消息堆积到180万,整个订单系统延迟了8分钟才恢复。更讽刺的是,事后我们花了两个月写了新的技术预研文档,但公司已经决定换技术VP了。这篇文章最让我认同的是‘预研不是拖慢进度,是提前解决风险’,要是当初有人能这样说服老板,我们也不会付出半条命的代价。

文章包含AI辅助创作:没有技术预研,瀑布开发直接进死胡同,发布者:fiy,转载请注明出处:https://worktile.com/kb/p/3978751

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
fiy的头像fiy
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部