第三章:领域工程与产品工程

好,咱们今天聊一个核心话题。很多团队做产品线,做着做着就乱了。为什么?

说白了,就是没搞清楚「领域工程」和「产品工程」到底谁该干什么。我见过不少项目,架构师跑去写具体产品的业务代码,产品经理又跑来定义底层组件。嗯,这肯定要出问题。

3.1 领域工程的角色

领域工程,你可以把它理解成「造轮子的人」。它的目标不是交付一个具体产品,而是交付一套可复用的资产。

我个人习惯把领域工程比作「兵工厂」。兵工厂不直接上战场打仗,但它负责生产枪炮子弹。前线战士(产品工程)拿着这些武器去打赢具体的战役。

领域工程的核心产出:

  • 领域模型(Domain Model)
  • 可变性模型(Variability Model)
  • 核心资产库(Core Asset Base)
  • 产品线架构(Product Line Architecture)

我在项目中遇到过一件事。有个团队做电商产品线,领域工程组花了三个月,把订单、支付、库存这些核心模块的通用逻辑全部抽象出来了。结果产品工程组说:「你们做的这些我们用不上,太抽象了。」

为什么会这样?因为领域工程只顾着「造轮子」,没去前线看看战士到底需要什么口径的子弹。这是个教训。

3.2 产品工程的角色

产品工程,就是「上战场的人」。它的目标很明确:在特定时间、特定预算内,交付一个满足客户需求的具体产品。

产品工程不需要关心底层框架怎么搭,也不需要操心通用性。它只需要做一件事:从核心资产库里拿东西,然后快速组装、定制、交付

产品工程的核心职责:

  • 需求分析:搞清楚这个具体产品要什么
  • 资产绑定:从领域工程拿来的资产中做选择
  • 可变性解析:把「可选」变成「确定」
  • 产品构建:快速交付可运行的产品

你想想看,如果产品工程组的人天天去改底层框架,那跟传统开发有什么区别?产品线工程的价值就没了。

3.3 两者如何协同工作

好,重点来了。领域工程和产品工程怎么配合?

我总结了一个简单的原则:领域工程负责「定义可能性」,产品工程负责「实现确定性」

维度 领域工程 产品工程
关注点 共性 + 可变性 具体需求
时间跨度 长期(持续演进) 短期(项目周期)
产出物 核心资产库 具体产品
变更频率 低(稳定为主) 高(快速响应)
决策权 架构决策 业务决策

我曾经在一个金融产品线项目里,看到过最理想的协同模式。领域工程组每两周发布一次核心资产的新版本,产品工程组则每周从资产库拉取最新版本,然后做自己的定制开发。

两边有一个「接口人」角色,专门负责沟通。领域工程的人会定期参加产品工程的迭代评审会,听听前线有什么新需求。产品工程的人也会参与领域工程的架构评审,确保资产库的方向是对的。

避坑指南:

我曾经见过一个团队,领域工程和产品工程完全隔离。领域工程闭门造车,产品工程自己另起炉灶。结果半年后,两边代码完全对不上,产品线工程彻底失败。

记住:没有反馈循环的领域工程,就是空中楼阁

3.4 一个实际的协同流程

我建议采用这样的流程:

  1. 领域工程定义可变性点:比如支付方式支持「支付宝、微信、银行卡」,这就是一个可变性点。
  2. 产品工程提出需求:某个具体产品只需要「支付宝和微信」,不需要银行卡。
  3. 领域工程评估影响:这个需求是否影响核心资产库的稳定性?如果只是绑定选择,没问题。
  4. 产品工程做绑定:在配置文件中把「银行卡」这个选项去掉,然后构建产品。
  5. 反馈闭环:产品工程告诉领域工程,银行卡这个可变性点其实没人用,建议下个版本移除。

你看,这个流程里,两边各司其职,但又紧密配合。

核心原则总结:

  • 领域工程不要替产品工程做决策
  • 产品工程不要擅自修改核心资产
  • 两者通过「可变性模型」进行契约式协作
  • 定期同步,保持信息透明

嗯,说到这我想起一个细节。有一次产品工程组急着上线,想直接改核心资产库的代码。我拦住了。我说:「你改完这个产品是快了,但下个产品怎么办?其他产品线怎么办?」

后来我们建立了一个机制:产品工程如果要改核心资产,必须走变更请求流程,由领域工程评审。虽然多了一步,但长期来看,这步不能省。

好了,这一章就聊到这。下一章我们聊聊可变性建模的具体方法,那是个技术活。