4、过程域详解(上):系统工程过程组(SYS.1-SYS.5)、软件工程过程组(SWE.1-SWE.6)
好,咱们今天来啃硬骨头了。ASPICE 里最核心、最绕不开的就是这两组过程域——系统工程(SYS)和软件工程(SWE)。
我个人习惯把这两组称为「干活的过程」。你想想看,没有它们,你连需求怎么来、设计怎么做、代码怎么测都不知道。很多公司找我做评估,一上来就问「老师,我们能不能跳过 SYS 直接做 SWE?」——嗯,我的回答永远是:不行。
4.1 系统工程过程组(SYS.1 - SYS.5)
系统工程,说白了就是「从客户需求到系统实现」这条链。它关注的是整个产品,不光是软件,还包括硬件、机械、甚至人机交互。
SYS.1:需求挖掘
这个过程的目的是搞清楚「客户到底想要什么」。注意,不是客户说什么你就记什么。我见过一个项目,客户说「我要一个能自动刹车的系统」,结果团队直接写了个「当检测到障碍物时刹车」。后来才发现,客户真正想要的是「在特定速度下、特定天气条件下、特定障碍物类型下才刹车」。
所以 SYS.1 要求你:
- 识别所有利益相关方(客户、用户、法规机构、生产部门)
- 收集原始需求(用访谈、文档、竞品分析等方式)
- 明确需求来源和优先级
SYS.2:需求分析
需求收集完了,接下来就是分析。这一步很多人会忽略,觉得「需求都有了,直接写设计不就行了?」——大错特错。
SYS.2 的核心是:把模糊的、矛盾的、不完整的需求理清楚。比如客户说「系统响应要快」,那「快」是多少毫秒?100ms?10ms?还是 1ms?
我曾经在一个项目中,客户说「系统要支持 OTA 升级」。我们团队直接写进了需求文档。结果分析时发现,客户的车机根本没有 4G 模块,只能通过 USB 升级。这就是典型的「需求分析不到位」。
SYS.2 的输出是:
- 经过评审的系统需求规格
- 需求之间的追溯关系
- 需求优先级和风险等级
SYS.3:系统架构设计
有了需求,就要开始搭架子了。系统架构设计就是决定「系统由哪些子系统组成,它们之间怎么通信」。
这里要注意,架构设计不是画几张框图就完事了。你需要考虑:
- 功能分配(哪个功能由哪个子系统实现)
- 接口定义(信号、协议、数据格式)
- 关键质量属性(可靠性、安全性、可维护性)
SYS.4:系统集成与集成测试
子系统做完了,就要把它们拼起来。SYS.4 关注的是「集成策略」和「集成测试」。
我个人习惯用「增量集成」的方式。先集成核心功能,再逐步加入外围功能。这样如果出了问题,能快速定位到是哪个模块的问题。
SYS.4 的关键输出:
- 集成策略(大爆炸?增量?还是持续集成?)
- 集成测试用例(覆盖所有接口和交互场景)
- 集成测试报告
SYS.5:系统合格性测试
最后一步,验证整个系统是否满足客户需求。注意,这里不是「单元测试」也不是「集成测试」,而是「端到端的系统级测试」。
比如一个 ADAS 系统,SYS.5 要测试的是:在真实道路场景下,系统能不能正确识别行人、车辆、交通标志。而不是只测某个传感器的数据对不对。
SYS.5 的输出:
- 系统测试用例(覆盖所有系统需求)
- 测试结果和缺陷报告
- 合格性判定(是否满足验收标准)
4.2 软件工程过程组(SWE.1 - SWE.6)
好,系统层面的事说完了,接下来咱们聚焦到软件。SWE 过程组就是「从软件需求到软件实现」这条链。
SWE.1:软件需求分析
系统需求下来了,软件团队要从中提取出「软件需要做什么」。注意,系统需求里可能包含硬件、机械的内容,软件团队要过滤出只跟软件相关的部分。
比如系统需求说「系统在 100ms 内响应」,那软件需求就要细化成「软件从接收到传感器信号到输出控制指令的延迟不超过 50ms」。
SWE.1 的输出:
- 软件需求规格
- 软件需求与系统需求的追溯矩阵
- 软件需求评审记录
SWE.2:软件架构设计
软件架构设计,就是决定「软件由哪些模块组成,模块之间怎么调用」。这里我建议用分层架构,比如:应用层、中间件层、驱动层。
为什么要分层?因为分层能降低耦合度。你想想看,如果所有代码都写在一个大文件里,改一个功能可能影响十个地方。分层之后,每层只关心自己的事,改起来就轻松多了。
SWE.3:软件详细设计与单元构建
架构搭好了,就要开始写代码了。SWE.3 要求你先做详细设计,再写代码。详细设计包括:数据结构、算法、接口签名、状态机等。
我曾经在一个项目中,团队直接跳过详细设计开始写代码。结果写到一半发现,两个模块之间的数据格式不兼容,又得回头改设计。嗯,从那以后我再也不敢跳过详细设计了。
SWE.3 的输出:
- 软件详细设计文档
- 源代码(符合编码规范)
- 单元测试用例
SWE.4:软件单元验证
代码写完了,要测。SWE.4 关注的是「单元测试」——也就是对每个最小的代码单元(函数、方法、模块)进行测试。
单元测试要做到什么程度?我个人习惯是:语句覆盖 >= 100%,分支覆盖 >= 80%。当然,如果是安全关键系统(比如 ASIL D),要求会更高。
// 示例:一个简单的单元测试(C语言)
void test_calculate_brake_force() {
// 输入:车速 60km/h,障碍物距离 10m
// 预期输出:刹车力 500N
assert(calculate_brake_force(60, 10) == 500);
// 边界测试:车速为 0
assert(calculate_brake_force(0, 10) == 0);
// 异常测试:距离为负数
assert(calculate_brake_force(60, -1) == 0);
}
SWE.5:软件集成与集成测试
单元测完了,要把它们拼起来。SWE.5 和 SYS.4 类似,但这里集成的是「软件模块」,而不是「系统子系统」。
集成测试要关注:模块之间的接口是否匹配、数据传递是否正确、时序是否满足要求。
SWE.5 的输出:
- 集成测试用例
- 集成测试报告
- 缺陷记录
SWE.6:软件合格性测试
最后一步,验证软件是否满足软件需求。注意,这里不是测「代码有没有 bug」,而是测「软件功能是否完整、性能是否达标」。
比如一个车载娱乐系统,SWE.6 要测试的是:导航功能是否正常、蓝牙连接是否稳定、语音识别是否准确。而不是只测某个按钮能不能点。
SWE.6 的输出:
- 软件测试用例(覆盖所有软件需求)
- 测试结果和缺陷报告
- 合格性判定
4.3 总结一下
系统工程过程组(SYS.1-SYS.5)和软件工程过程组(SWE.1-SWE.6),说白了就是两条平行线:
| 阶段 | 系统工程 | 软件工程 |
|---|---|---|
| 需求 | SYS.1 + SYS.2 | SWE.1 |
| 设计 | SYS.3 | SWE.2 + SWE.3 |
| 集成 | SYS.4 | SWE.5 |
| 测试 | SYS.5 | SWE.4 + SWE.6 |
记住一个原则:先系统后软件,先设计后实现,先单元后集成。这个顺序一旦乱了,项目大概率会出问题。
好,这一章的内容就到这儿。下一章咱们讲「支持过程组」和「管理过程组」,那些是「怎么管好这些活」的内容。到时候见。