(基于Jacobson et al. 《软件工程精要》与Dick et al. 《需求工程》)
一、需求不完整与用户参与缺失:项目失败的核心诱因
-
实证数据揭示的困境
Standish Group(1995)的CHAOS报告指出,需求问题是项目失败的首要原因:-
13.1% 的项目因"需求不完整"失败;
-
12.4% 归因于"缺乏用户参与";
-
8.7% 因"需求频繁变更"导致失控(见表1.1)。
2015年数据进一步验证:用户参与(15%)和清晰业务目标(6%)仍是成功关键因素(见表1.3)。这些数据表明,需求质量与用户协同的缺失是跨时代的持续性困境(Standish Group, 1995, 2015)。
-
-
教育与实践的落差案例
学生Smith在团队开发日历应用时,即使面对简单功能(如事件提醒),也需长时间辩论才能达成共识。这暴露了需求沟通的基础困境:"就应用功能达成一致极具挑战性,即便简单如日历应用,团队也需反复讨论界面布局与功能范围"(Jacobson et al., p.5)。而在行业实践中,TravelEssence公司的需求规模远超教学场景,新员工需学习大量领域术语(如"No-Show(预订未入住)"、"PMS(物业管理系统)"),凸显业务知识鸿沟加剧需求理解难度(Jacobson et al., pp.6-8)。
二、需求动态性与变更管理的两难
-
行业本质引发的不可预测性
软件工程本质是"将想法转化为软件产品"的过程(Jacobson et al., p.5),但此过程面临根本矛盾:-
用户通常在使用产品后才明确真实需求。如瀑布模型要求前期固化需求,但"一旦用户使用产品,几乎总会要求修改"(Jacobson et al., p.18);
-
迭代开发虽通过分阶段交付缓解该问题,但仍需每轮迭代后"向用户展示成果以确认价值",而反馈常导致"回溯重做已完成部分"(Jacobson et al., p.11)。
-
-
变更成本与范围蔓延风险
-
需求工程师需平衡"完整性"与"可变性":前期过度细化需求可能因后续变更造成浪费;模糊定义则导致开发偏差(Dick et al., p.30);
-
复杂系统(如铁路系统)的需求满足依赖跨组件协同(如列车、轨道、信号子系统),单一需求变更可能触发系统级连锁调整(Dick et al., p.32)。
-
三、需求沟通与共识建立的多维障碍
-
术语与视角差异
-
Smith在TravelEssence实习时发现,业务人员与开发者使用"完全不同术语"(如"Book(预订)"、"Skipper(逃单旅客)"),导致沟通效率低下(Jacobson et al., p.6);
-
大型系统中,利益相关方(用户/客户/供应商)需求可能存在冲突,且需求常以自然语言描述,易产生歧义(Dick et al., p.30)。
-
-
跨领域知识整合难题
开发者不仅需编程能力,更要理解问题域知识(如酒店管理)和技术栈特性(如Java/MySQL的组合逻辑)。Smith在实习后总结:"仅掌握编程语言远远不够,技术栈的实践知识至关重要"(Jacobson et al., p.8)。这对团队知识广度提出高要求,尤其涉及微服务、云架构等新技术时(Jacobson et al., p.22)。
四、规模化工程中的需求协同困境
-
团队协作的隐性成本
-
学生项目揭示:代码可读性直接影响团队效率。"编写能被同伴理解的优质代码并不容易,常需多人协作才能实现可读性与功能性"(Jacobson et al., p.5);
-
企业级开发强调"安全修改"(Do no harm),需通过代码审查与测试降低变更风险,但此类实践显著增加时间成本(Jacobson et al., p.8)。
-
-
大规模系统需求分解难题
-
当软件规模超出单团队能力时(如微软/苹果级产品),需多团队协同。此时"需求对齐"成为关键挑战:团队间如何同步需求理解?如何避免重复或冲突?
-
现有方法论(如SAFe、LeSS)试图通过标准化实践(Scrum/持续集成)解决该问题,但各框架术语与逻辑差异反而加剧"方法论战争",导致实践复用困难(Jacobson et al., p.25)。
-
五、教育与实践的鸿沟:需求工程能力培养缺失
-
学术训练与工业现实的脱节
学校项目通常基于"简短描述(<100词)"开发独立程序,完成后无需维护。但工业环境中"代码需留存数年并由多人修改",需求必须支持长期演化(Jacobson et al., p.10)。Smith的反思极具代表性:"学校经验是必要起点,但他希望教学更贴近工业现实"(Jacobson et al., p.10)。 -
需求工程的专业化迟滞
尽管需求工程已是独立学科,但其教学仍落后于编程:"以系统化、通用方式教授需求活动更为困难,因其存在大量变体且缺乏共同基础"(Jacobson et al., p.13)。这导致开发者初期更关注技术工具,直至经验积累后才转向需求等"更具挑战性领域"(Jacobson et al., p.13)。