需求获取是需求工程的核心环节,它旨在确定和理解不同用户群体的具体需要与限制。在软件需求的三层结构中,获取用户需求居于中间层级,上层由项目视图和范围文档中的业务需求 1指导,下层则生成特定的软件功能需求以支持用户完成他们的任务。
通过运用“使用实例”等方法聚焦于用户如何利用系统执行其实际工作,需求获取为从问题识别到解决方案构建架设了桥梁。有效的需求获取过程要求参与者对项目中的客户需求有普遍的理解,以便分析者、开发者和客户共同探索满足这些需求的各种可能方案。关注用户任务而非仅关注用户接口,有助于避免开发团队因过早进入设计阶段而产生的错误。
需求获取、分析、编写需求规格说明以及验证并非线性顺序进行,而是相互交织、增量迭代的过程。在这个过程中,开发团队会不断向客户提问并收集信息(需求获取),同时处理这些信息以理解其内在含义,并将它们分类关联至潜在的软件需求。随后,将这些信息结构化,形成文档和图表供客户代表审查并修正其中的错误。
虽然针对不同的软件开发项目和组织文化,不存在一种统一、固定的需求开发 2流程,但以下列出的14个步骤可作为指导你进行需求开发活动的参考框架:
这种迭代的过程旨在不断深化对需求的认识,减少误解和遗漏,从而提高最终产品的质量和用户满意度。
当完成上述步骤特别是第13步后,就可以有信心地继续进行系统的各个部分的设计和构建,因为你已经为创建一个高质量的产品奠定了坚实的需求基础。
需求获取在软件开发中扮演着至关重要的角色 6,它是识别项目成功与否的关键环节,同时也是最具挑战性、最容易出错且最需要有效沟通的部分。为了确保需求获取的成功,开发团队必须与客户建立紧密的合作关系,并创造一个开放的环境来深入探讨与产品相关的问题。
分析者需明确区分不同的利益相关者 7小组,避免假定所有参与者都对需求有相同的理解。采用合适的技术手段全面考察问题,不仅要关注功能需求,也要充分讨论非功能需求,如性能、可用性、安全性等。同时,要确保用户明白讨论的功能并不意味着一定会被纳入最终的产品设计,对于收集到的所有需求,应进行优先级排序以防止项目范围失控。
在实际操作中,分析者的工作不只是简单地记录客户所提出的需求,而是通过提问和深入了解,揭示用户真正想要解决的问题和期望达成的目标。例如,询问如何扩展业务流程、新系统如何适应未来变化,以及在异常情况下用户有何需求等。这些问题应以开放式问句引导,以便发现潜在需求和细节。
在需求获取过程中,一个重要的任务是揭示和阐明客户所持有的潜在假设,特别是那些可能导致冲突的部分。分析者需要深入理解客户的意图,找出他们可能没有明确表达但希望包含在产品中的特性或功能。Gause 和 Weinberg提出的“上下文无关问题”是一种有效的策略,这类高层次的问题能帮助我们全面了解业务问题及其可能的解决方案。例如,询问产品的精度要求或是让客户解释为何不同意某个观点,这样的开放式问题能够更直接地揭示深层次的需求,而封闭式问题往往无法做到这一点。
需求获取应当充分利用所有与问题域相关的信息来源以及软件解决方案中合理的特性描述。研究显示,相较于失败的项目,成功的项目通常在开发者和客户之间采取了更多元化的沟通方式。对于业务软件包或信息管理系统的应用来说,与单个客户或潜在用户群体进行座谈讨论是一种传统的、行之有效的需求收集方法。直接聘请实际用户参与需求获取过程,可以为项目赢得支持并确保各方对最终成果的认可。
每次座谈会后,记录下讨论的要点,并请参会用户评论和修正,以确保准确无误。尽早且频繁地开展此类讨论是成功获取需求的关键步骤,因为只有提出需求的人才能确定需求是否已被正确理解和捕捉。应深入挖掘和分析,消除任何存在的冲突或不一致性。
在理解用户需求时,要努力揣摩用户表述其需求背后的思维过程,仔细研究用户执行任务时的决策逻辑,并提取出其中的潜在关系。流程图和决策树是可视化这些逻辑路径的有效工具。
同时,在需求获取阶段要注意避免过早陷入具体细节。在达成关于核心客户任务的共识之前,用户可能会过于关注报表设计、对话框布局等细节问题。如果将这些细节过早记录为需求,可能会给后续的设计工作带来不必要的束缚。因此,有必要周期性检查需求获取的过程,确保用户参与者保持在适合当前讨论主题的抽象层次上,并向他们保证开发过程中将会详细地实现他们的需求。
在逐步细化的过程中,多次迭代地描述需求,首先确定用户的总体目标和任务,并转化为使用实例。然后,将任务进一步转换为功能需求,以便用户完成其任务;同时,也定义非功能需求来描述系统的约束条件和用户对系统质量的期望。虽然初步的屏幕设计有助于展现你对需求的理解,但必须对用户界面设计进行更为细致的打磨和完善。
多年来,分析者在获取和描述用户与软件系统交互需求时,经常采用故事化或情境化的方法。Ivar Jacobson等人将这种方法进一步系统化,并引入了使用实例(Use Case)的概念来进行需求获取和建模工作。尽管使用实例最初源于面向对象的开发环境,但因其关注的是用户如何与系统互动以达成目标,而非具体的实现技术细节,因此该方法也被广泛应用于多种开发方法的项目中。
使用实例是一种结构化的表述方式,它详细记录了系统与外部“执行者”为了完成特定任务而进行的一系列交互过程,这些交互最终能为某个利益相关方带来价值。这里的“执行者”可以是人、其他软件应用、硬件设备或其他任何与系统进行交互以实现其目标的实体。在实际应用中,一个执行者角色可能映射到多个潜在的用户类上,例如,在“物流管理系统”中,“确认库位可用性”的使用实例就包含了一个名为“仓库管理员”的执行者角色,这个角色可以由客户或仓库的工作人员等不同人员扮演。
通过使用实例来表达用户需求,能够确保所描述的需求紧密贴合系统的业务需求。分析者与用户必须共同审查每一个使用实例,确认它们是否符合项目定义的范围后,再将其纳入正式需求文档。基于使用实例方法进行需求获取的核心目的,在于全面捕捉并描述用户需要借助系统完成的所有任务。理论上讲,所有合理的系统功能都应体现在使用实例集合之中。虽然实际上不可能做到绝对的全覆盖,但是相较于其他已知的需求获取方法,基于使用实例的方法往往能够更为有效地识别出关键需求和场景,从而更接近于全面覆盖的目标。
在软件工程和需求分析中,一个使用实例(Use Case)是描述系统功能如何满足特定参与者(如用户、外部系统等)目标的一系列相关动作和交互的集合。
主过程(普通流/满意之路):在“查询仓位库存”的使用实例中,主过程指的是从用户发起请求到获取并显示仓位库存信息这一基本步骤序列。当此流程完成时,用户能够了解到当前仓库中的物流管理情况,并据此可能做出进一步决策,例如是否需要订购更多物料。
可选过程:在同一个使用实例或不同的使用实例中,存在一些额外的逻辑路径,这些被称为可选过程。例如,在“查询采薇库存”(这里可能是笔误,应当为“查询仓位库存”)的场景中,“向物流管理仓库查询仓位库存并选择合适的容器”就是一个可选过程,它允许用户根据查询结果对多种容器进行筛选和选择。
公共函数与包含关系:为了减少冗余和提高一致性,多个使用实例间共享的功能可以抽象为独立的使用实例。这种公共使用的部分可以通过UML中的include
关系来表示,意味着其他使用实例在执行过程中必须包含这个公共使用实例。这类似于编程语言中的公共子程序或方法调用。
例外处理:在某些情况下,系统可能会遇到无法按照正常顺序完成任务的情况,这些称为例外或异常路径。例如,“查询仓位库存”使用实例的一个例外条件是没有业务上可用的物流库存。正确地定义和记录这些例外路径对于确保系统设计时考虑各种边界条件至关重要,以免因未预见的异常导致系统崩溃或不恰当的响应。
通过合理地组织使用实例、明确普通过程、可选过程及异常处理,开发团队能够更好地理解用户期望的行为模式,从而设计出更贴近实际需求、更具鲁棒性的软件系统。
确定使用实例的方法多种多样,可以采用以下方式:
识别执行者及其角色:首先明确系统中的各个执行者(用户、外部系统等)以及他们在业务流程中的作用。通过分析这些角色在业务过程中的活动,可以推导出相应的使用实例。
关联外部事件与执行者:发现可能触发系统响应的外部事件,并将这些事件与相关的执行者及具体的使用实例相结合,形成系统的功能需求。
从日常行为和业务过程提炼:以叙述形式记录业务过程或日常操作行为,从中抽象出使用实例,并确定哪些执行者参与其中。
从现有功能需求中提取:审视现有的功能需求说明,从中提取并转化成使用实例。如果某些需求不符合使用实例的模式,应当考虑它们是否真正必要或者是否需要重新定义。
为了确保使用实例准确反映不同用户类的需求,在物流管理系统项目中,分析人员组织了一系列持续时间为2到3小时的使用实例收集研讨会 8,会议间隔一天举行一次。参会者包括代表特定用户类的产品代表、其他被选出的用户代表,以及至少一名开发者。当用户提出看似不可行的需求时,开发者的早期参与有助于及时评估其可行性,从而更好地理解即将开发的产品特性。由于不同的用户类对于多个使用实例的需求不尽相同,“物流管理系统”项目的研讨会有针对性地邀请了不同用户类成员参加。
在研讨会上,分析人员会让用户先思考他们期望新系统能够完成的任务或业务流程。每个任务都可以作为一个候选使用实例,分析人员会为这些实例编号并命名,如“查询仓位库存”或“打印物流管理安全数据单”。小组讨论过程中,有时会发现一些实例实际上可以合并为一个更抽象的使用实例,同时也会剔除超出项目范围 9的建议实例。此外,团队还可能在讨论过程中发现先前未考虑到的额外使用实例。
在确定优先级方面,通常的做法是根据用户最初关注的重要程度来排序使用实例。另一种方法是在提出候选使用实例时,为其编写简短的描述,然后根据描述内容来决定优先级。优先级高的使用实例会被首先详细填充内容,随后再重新评估其余使用实例的优先级。
每次需求获取研讨会后,都会探索并记录多个使用实例,并按照标准化模板将其整理成文档,以便后续的设计与开发工作。
在收集和分析使用实例的过程中,参与者遵循一系列步骤来确保需求的准确性和完整性:
在需求分析过程中,对于复杂的使用实例,采用图形化分析模型是十分有效的辅助手段。这些模型包括但不限于:
通过构建和审查这些模型,分析者可以从多个角度深入挖掘和清晰表达需求,从而揭示文档中可能存在的遗漏、模糊不清和不一致之处。每天研习会后,参与者都会对功能需求进行复查,这有助于及时发现并修正可选过程、例外情况、错误的功能需求及执行者—系统对话中的遗漏步骤。然而,为了保证参与者的有效审查,不宜过于频繁地组织研习会,一周内主持2至3次较为合适,以确保参与者有足够的时间消化和反思所讨论的内容。
此外,在需求开发阶段早期,测试人员可以根据使用实例为“物流管理系统”设计概念性测试用例。这些测试用例不仅能够帮助开发团队明确文档编写,并达成对系统预期行为的共识,还能够验证分析者是否已从测试用例中捕获到所有必需的功能需求。同时,它们也是检验分析方法正确性和一致性的重要工具。
虽然大型系统可能涉及大量的使用实例,需要投入大量时间来识别、详细说明、记录和审核,但通过举办使用实例研习会明确系统预期功能的做法,是对构建高质量、能满足多样化用户需求的软件系统的宝贵投资。
使用实例(Use Cases)是描述用户如何与系统交互以实现特定目标的高层次描述,它们通常不提供开发者在编码阶段所需的详细功能规格。为了减少开发过程中的不确定性,并确保软件设计和构建的准确性,将每个使用实例细化为具体的功能需求至关重要。
以下是三种结合或单独利用使用实例来编写功能需求文档的方法:
使用实例方法在软件需求工程中的优势主要体现在以下几个方面:
在使用实例方法中,确实需要注意以下几种潜在的陷阱 11以确保需求获取和分析的有效性:
在需求分析过程中,分析者需要对客户提供的大量、零散且可能不完整的信息进行分类和提炼。以下是对各类信息类型的归纳:
在需求获取阶段,准确界定产品范围至关重要。如果范围定义过大,可能导致收集了过多的需求,增加项目复杂性、延长开发周期,并可能引入冗余或不切实际的功能。这不仅会消耗额外资源,还可能模糊产品的核心价值。
相反,若项目范围定义过小,则可能会遗漏关键的客户期望和业务需求,最终交付的产品可能无法满足用户的实际需要,造成用户满意度下降。在这种情况下,适时调整项目范围是必要的,但必须谨慎处理,确保变更不会对项目的整体目标、时间表和成本产生颠覆性影响。
需求获取过程应侧重于明确“做什么”,而不是“怎么做”。尽管设计实现方案对于系统开发同样重要,但在需求分析阶段,关注点应在于理解和记录用户需求的本质,而不涉及具体的技术实现细节。通过创建分析模型、绘制屏幕草图和构建原型等手段,可以帮助各方更好地理解需求,并有效地发现潜在的错误和遗漏。
团队规模也是影响需求获取效率的因素之一。过多的参与者可能导致讨论陷入琐碎细节、意见难以统一的局面,从而拖慢进度。实践中发现,精简参与人员,选择具有代表性的关键角色(如客户、设计师、开发者等)组成高效团队,往往能够加快决策进程并确保关键需求得到充分考虑。
同时,避免仅依赖少数几位声音响亮或者影响力较大的用户来决定所有需求。这样容易忽视其他用户群体的重要需求,导致产品不能全面反映大多数用户的诉求。最佳的做法是识别并邀请到各个用户类别中有代表性和受广泛支持的代言人,确保从多元化的视角出发,全面而公正地获取与整合用户需求。
在需求获取过程中,确实不存在一个明确的终点标志,因为需求可能会随着时间和深入探讨而不断演化。然而,以下迹象可能表明你已经接近或完成了需求收集阶段:
尽管如此,需求管理是一个持续的过程,并且应当保持一定的灵活性以适应变化。即使在上述情况出现后,也应继续关注市场动态、客户反馈和技术更新,以便适时调整产品需求。同时,确保通过评审 16会议、迭代规划等机制来确认和锁定最终的需求集合并达成共识。
假设的客户意见输入:
分类:
对于第5点,尽管它涉及账户锁定和邮件通知,这些也是为了保证系统的安全性和可用性,所以可归类为安全性需求。
使用实例:购买商品
主要过程:
可选过程:
例外情况:
功能需求:
本文同步发表在 软件需求探索的https://srs.pub/theory/ling-ting-ke-hu-de-xu-qiu.html