任何软件系统开发的共同本质:
– 从现实空间的需求到计算机空间的软件代码之间的映射与转换;
软件工程本质:
用严格的规范和管理手段来缩小偏差,通过牺牲“时间”来提高“质量”。
软件工程的两个映射:
概念映射:问题空间的概念与解空间的模型化概念之间的映射
业务逻辑映射:问题空间的处理逻辑与解空间处理逻辑之间的映射
软件工程的作用:
为了实现以上两个映射,软件工程需要解决以下问题:
– 需要设置哪些抽象层次——单步映射?多步映射?几步?
– 每一抽象层次的概念、术语与表达方式——公式?图形?文字?
– 相邻的两个抽象层次之间如何进行映射——需要遵循哪些途径和原则?
软件工程:不同抽象层次之间的映射过程
需求分析:在一个抽象层上建立需求模型的活动,产生需求规约(Requirement Specification) ,作为开发人员和客户间合作的基础,并作为以后开发阶段的输入。
软件设计:定义了实现需求规约所需的系统内部结构与行为,包括软件体系结构、数据结构、详细的处理算法、用户界面等,即所谓设计规约(Design Specification) ,给出了实现软件需求的软件解决方案。
实现:由设计规约到代码的转换,以某种特定的编程语言,对设计规约中的每一个软件功能进行编码。
验证/ 确认:一种评估性活动,确定一个阶段的产品是否达到前阶段确立的需求(verification) ,或者确认开发的软件与需求是否一致(validation)。
软件工程所关注的对象
产品:各个抽象层次的产出物;
过程:在各个抽象层次之间进行映射与转换;
软件工程所关注的目标
功能性需求(Functional Requirements)(FR):软件所实现的功能达到它的设计规范和满足用户需求的程度。
– 功能1、功能2、…、功能n。
– 完备性:软件能够支持用户所需求的全部功能的能力;
– 正确性:软件按照需求正确执行任务的能力;
– 健壮性:在异常情况下,软件能够正常运行的能力
• 容错能力;
• 恢复能力;
——正确性描述软件在需求范围之内的行为,而健壮性描述软件在需求范围之外的行为。
– 可靠性:在给定的时间和条件下,软件能够正常维持其工作而不发生故障的能力。
非功能性需求(Non-Functional Requirements)(NFR):系统能够完成所期望的工作的性能与质量。
– 效率:软件实现其功能所需要的计算机资源的大小,“时间-空间”;
– 可用性:用户使用软件的容易程度,用户容易使用和学习;
– 可维护性:软件适应“变化”的能力,系统很容易被修改从而适应新的需求或采用新的算法、数据结构的能力;
– 可移植性:软件不经修改或稍加修改就可以运行于不同软硬件环境(CPU、OS和编译器)的能力;
– 清晰性:易读、易理解,可以提高团队开发效率,降低维护代价;
– 安全性:在对合法用户提供服务的同时,阻止未授权用户的使用;
– 兼容性:不同产品相互交换信息的能力;
– 经济性:开发成本、开发时间和对市场的适应能力。
– 商业质量:上市时间、成本/受益、目标市场、与老系统的集成、生命周期长短等。
不同目标之间的关系——折中(tradeoff)
不同类型的软件对质量目标的要求各有侧重:
– 实时系统:侧重于可靠性、效率;
– 生存周期较长的软件:侧重于可移植性、可维护性;
多个目标同时达到最优是不现实的:目标之间相互冲突
软件开发中的多角色
在软件开发过程中同样需要多种角色之间紧密协作,才能高质量、高效率的完成任务。
顾客企业(Client ,甲方) :
– 决策者(CxO)、终端用户(End User)、系统管理员;
软件开发公司(Supplier ,乙方) :
– 决策者(CxO);
– 软件销售与市场人员;
– 咨询师、需求分析师;
– 软件架构师、软件设计师;
– 开发人员:开发经理/项目经理、程序员;
– 维护人员。