第4章:可变性建模基础:可变点与变体、特征模型入门、正交可变性模型

好,咱们进入产品线工程里最核心的一块——可变性建模。说实话,很多团队做产品线失败,不是技术不行,而是压根没把「变」这件事想清楚。你想想看,如果连哪些地方能变、怎么变都没理清,后面复用就是空谈。

这一章,我带你从三个角度切入:可变点与变体、特征模型、正交可变性模型。这三样东西,是我做产品线时最常用的三板斧。

4.1 可变点与变体:先搞清楚「哪里能变」

先问个问题:你手头有多个产品,它们之间到底差在哪?

我个人的习惯是,先画一张表,把每个产品的功能列出来。然后找「相同」和「不同」。那些不同的地方,就是可变点(Variation Point)。每个可变点下,具体有哪些选项,就是变体(Variant)。

举个例子。我几年前帮一家公司做智能家居产品线。他们的网关设备,有的支持Wi-Fi,有的支持Zigbee,有的两个都支持。这里,「通信协议」就是一个可变点。而「仅Wi-Fi」「仅Zigbee」「Wi-Fi+Zigbee」就是三个变体。

核心定义:

  • 可变点:产品线中允许变化的位置或维度
  • 变体:可变点上具体的选择值或选项

嗯,这里要注意一点:可变点不是随便定的。你得问自己——这个变化,对业务有价值吗?如果只是实现细节不同,那不算真正的可变点。我见过有人把「数据库连接池大小」也当成可变点,这就过度设计了。

避坑指南:我曾经在一个项目中,把「日志级别」也列成了可变点。结果产品经理说,这玩意儿用户根本不在乎。后来我学乖了——可变点必须来自业务需求,而不是技术实现。

4.2 特征模型(Feature Model)入门

有了可变点和变体,下一步就是组织它们。特征模型就是干这个的。

说白了,特征模型是一棵树。根节点是产品线本身,子节点是各个特征。特征之间有关系:有的必须选(Mandatory),有的可选(Optional),有的互斥(Alternative),有的共存(Or)。

我画个简单的例子。假设我们做一个「智能音箱」产品线:

智能音箱
├── [必须] 语音唤醒
├── [可选] 蓝牙连接
├── [可选] 屏幕显示
│   ├── [互斥] 3.5寸屏
│   └── [互斥] 5寸屏
└── [可选] 语音助手
    ├── [或] 小爱同学
    └── [或] 天猫精灵

你看,这棵树把「哪些特征必须存在」「哪些可以选」「选了A就不能选B」都表达清楚了。这就是特征模型的价值。

我的经验:特征模型别画太大。我见过有人画了200多个节点,结果没人看得懂。建议控制在30-50个特征以内,超过就分层。先画核心层,再画扩展层。

特征模型里还有几个关键概念:

  • 特征组(Feature Group):一组有约束关系的特征。比如互斥组、或组。
  • 约束(Constraint):特征之间的依赖或互斥。比如「选了5寸屏,就必须选蓝牙连接」。
  • 父子关系:子特征依赖父特征存在。父特征不选,子特征就不能选。

我记得有一次,团队里有人把约束写错了,导致一个产品配置出来,既选了A又选了B,但A和B其实是互斥的。结果测试阶段才发现,返工成本很高。所以,特征模型建好后,一定要做一致性检查。

4.3 正交可变性模型

特征模型虽然直观,但有个问题:它把所有特征都揉在一棵树里。当产品线复杂时,这棵树会变得又大又乱。

正交可变性模型(Orthogonal Variability Model,简称OVM)就是来解决这个问题的。它的核心思想是:把「可变性」和「功能」分开建模。

怎么理解?你想想看,一个产品线里,变化可能来自多个维度:

  • 功能维度:支持哪些功能
  • 平台维度:运行在什么硬件/操作系统上
  • 市场维度:面向哪个地区、哪个客户群

这些维度是正交的——它们互不干扰。正交可变性模型就把每个维度单独建模,然后用矩阵或表格把它们组合起来。

我举个例子。假设我们做一款「车载娱乐系统」:

可变点 变体1 变体2 变体3
屏幕尺寸 7寸 10寸 12寸
导航引擎 百度地图 高德地图 腾讯地图
音频解码 MP3 FLAC APE
语音助手 小度 小爱

你看,每个可变点都是独立的。屏幕选7寸,不影响导航引擎选百度。这就是「正交」的含义。

注意:正交可变性模型不是万能的。当可变点之间有强依赖时,强行正交反而会引入复杂度。我建议:先用特征模型梳理核心依赖,再用OVM处理独立维度。

正交可变性模型的好处很明显:

  • 可组合性强:每个维度独立变化,组合起来就是新产品
  • 易于扩展:加一个新维度,不影响已有维度
  • 便于管理:每个维度由专人维护,责任清晰

但缺点也有:它不太适合表达特征之间的约束。比如「选了12寸屏,就必须选高德地图」,这种跨维度的约束,在OVM里需要额外用规则来表达。

4.4 三种方法怎么选?

讲到这里,你可能想问:那我到底用哪个?

我的建议是:

  • 小规模产品线(5-10个产品):直接用可变点+变体列表就够了。别搞复杂。
  • 中等规模(10-50个产品):用特征模型。树形结构一目了然。
  • 大规模(50个以上产品,多维度变化):用正交可变性模型。把维度拆开,各自管理。

当然,实际项目中我经常混合使用。比如先用特征模型画出核心功能树,然后把平台、市场等独立维度用OVM管理。这样既保留了特征模型的约束表达能力,又利用了OVM的维度分离优势。

嗯,最后说一句:建模不是目的,目的是让团队能高效地理解和管理变化。别为了建模而建模。工具是死的,人是活的。

本章小结:

  • 可变点与变体是可变性建模的原子单位
  • 特征模型用树形结构表达特征及其约束关系
  • 正交可变性模型将变化维度分离,适合大规模产品线
  • 实际项目中,三种方法可以组合使用