软件工程_软件工程导论 - CSDN
软件工程 订阅
软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。在现代社会中,软件应用于多个方面。典型的软件有电子邮件、嵌入式系统、人机界面、办公套件、操作系统、编译器、数据库、游戏等。同时,各个行业几乎都有计算机软件的应用,如工业、农业、银行、航空、政府部门等。这些应用促进了经济和社会的发展,也提高了工作效率和生活效率 。 展开全文
软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。在现代社会中,软件应用于多个方面。典型的软件有电子邮件、嵌入式系统、人机界面、办公套件、操作系统、编译器、数据库、游戏等。同时,各个行业几乎都有计算机软件的应用,如工业、农业、银行、航空、政府部门等。这些应用促进了经济和社会的发展,也提高了工作效率和生活效率 。
信息
外文名
Software Engineering
简    称
SE
类    别
学科
中文名
软件工程
相关专业
通信工程、计算机科学与技术
软件工程定义内涵
软件工程一直以来都缺乏一个统一的定义,很多学者、组织机构都 分别给出了自己认可的定义: [1]  BarryBoehm:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料。IEEE:在软件工程术语汇编中的定义:软件工程是:1.将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件;2.在1中所述方法的研究FritzBauer:在NATO会议上给出的定义:建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。《计算机科学技术百科全书》:软件工程是应用计算机科学、数学、逻辑学及管理科学等原理,开发软件的工程。软件工程借鉴传统工程的原则、方法,以提高质量、降低成本和改进算法。其中,计算机科学、数学用于构建模型与算法,工程科学用于制定规范、设计范型(paradigm)、评估成本及确定权衡,管理科学用于计划、资源、质量、成本等管理。比较认可的一种定义认为:软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。ISO 9000对软件工程过程的定义是:软件工程过程是输入转化为输出的一组彼此相关的资源和活动。 [2]  其它定义:1.运行时,能够提供所要求功能和性能的指令或计算机程序集合。2.程序能够满意地处理信息的数据结构。3.描述程序功能需求以及程序如何操作和使用所要求的文档。以开发语言作为描述语言,可以认为:软件=程序+数据+文档。 [2]  一、软件工程过程是指为获得软件产品,在软件工具的支持下由软件工程师完成的一系列软件工程活动,包括以下四个方面:1、P(Plan)——软件规格说明。规定软件的功能及其运行时的限制。2、D(DO)——软件开发。开发出满足规格说明的软件。3、C(Check)——软件确认。确认开发的软件能够满足用户的需求。4、A(Action)——软件演进。软件在运行过程中不断改进以满足客户新的需求。二、从软件开发的观点看,它就是使用适当的资源(包括人员,软硬件资源,时间等),为开发软件进行的一组开发活动,在活动结束时输入(即用户的需求)转化为输出(最终符合用户需求的软件产品)。三个阶段:定义阶段:可行性研究初步项目计划、需求分析;开发阶段:概要设计、详细设计、实现、测试;运行和维护阶段:运行、维护、废弃原则:1、抽象;2、信息隐蔽;3、模块化;4、局部化;5、确定性;6,一致性;7、完备性;8、可验证性
收起全文
精华内容
参与话题
  • 软件工程--实践者的研究方法

    千人学习 2019-12-30 10:56:06
    软件工程专业以计算机科学与技术学科为基础,强调软件开发的工程性,该课程使学生在掌握计算机科学与技术方面知识和技能的基础上熟练掌握从事软件需求分析、软件设计、软件测试、软件维护等工作所必需的基础知识、...
  • 软件工程知识点复习总结

    万次阅读 多人点赞 2018-01-07 23:23:07
    软件工程

    Software:

    (1)指令的集合,通过执行这些指令可以满足预期的特征、功能和性能需求;
    (2)数据结构,使得程序可以合理利用信息
    (3)软件描述信息,它以硬拷贝和虚拟形式存在,用来描述程序操作和使用


    Software Engineering:

    软件工程是:
    (1)将系统化的、规范化、可量化的方法应用于软件的开发、运行和维护,即将工程化方法应用于软件。
    (2)在(1)中所述方法的研究

    What the difference between software and hardware?
    1.软件是设计开发的,而不是传统意义上生产制造的。
    2.软件不会“磨损”
    3.大多数软件根据实际的顾客需求定制的。

    Why does software need Change or Evolved?
    软件必须适应新的计算环境或技术的需要。
    必须增强软件来实现新的业务需求。
    软件必须扩展到与其他更现代的系统或数据库进行互操作。
    必须重新构建软件,使其在网络环境中可行。
    列表内容
    支持软件工程的根基在于质量关注点(quality focus)
    是对软件的组织承诺,是支持软件工程的基石
    软件工程的基础是过程(process)层。软件过程将各个技术层次结合在一起,使得合理、及时地开发计算机软件成为可能。
    软件工程方法(method)为构建软件提供技术上的解决方法。方法包括:沟通、需求分析、设计模型、编程、测试和技术支持。


    Software Process :

    软件过程:软件过程是工作产品构建时所执行的一系列活动、动作和任务的集合。

    Generic Framework Activity
    适用于所有软件项目,无论其规模和复杂程度如何
    1.沟通(Communication):目的是理解利益相关者的项目目标,并收集需求以定义软件特性和功能。
    2.策划(Planning):定义和描述了软件工程工作,包括需要执行的技术任务、可能的风险、资源需求、工作产品和工作进度计划。
    3.建模(Modeling):利用模型哎更好地理解软件需求并完成符合这些需求的软件设计。
    4.构建(Construction):它包括编码和测试以发现编码中的错误。
    5.部署(Deployment):软件交付到用户,用户对其进行评测并给出反馈意见。

    Umbrella Activities(普适性活动):
    普适性活动贯穿软件项目始终。
    1.软件项目跟踪和控制:项目根据计划评估项目进度,并且采取必要的措施保证项目按进度计划进行。
    2.风险管理:对可能影响项目成果或者产品质量的风险进行评估。
    3.软件质量保证:确定和执行软件质量保证的活动
    4.技术评估:评估软件工程产品、尽量在错误传播到下一个活动之前,发现并清除错误。
    5.测量:定义和收集过程、项目和产品的度量,以帮助团队在发布软件的时候满足利益相关者要求。同时,测量还可以与其他框架活动和普适性活动配合使用。
    6.软件配置管理:在整个软件工程中,管理变更所带来的影响。
    7.可复用管理:定义产品复用的标准,并且建立构建复用机制。
    8.工作产品的准备和生产:包括了生产产品所必需的活动。


    Process Flow

    过程流:描述了在执行顺序和执时间上,如何组织框架中的活动,动作,任务。
    线性过程流(Liner process flow):从沟通到部署顺序执行五个框架活动。
    这里写图片描述
    迭代过程流(iterative process flow):在执行下一个活动前重复执行之前一个或多个活动。
    这里写图片描述
    演化过程流(evolution process flow):采取循环的方式执行各个活动。
    这里写图片描述
    并行过程流(parallel process flow):将一个或是多个活动与其他活动并行执行。
    这里写图片描述


    过程模式(process pattern):描述了软件工程工作中遇到的过程相关的问题、明确了问题环境并给出了针对该问题的一种或几种可证明的解决方式。


    Process Model

    惯用过程模型是为了改变软件开发的混乱状态,促使软件开发更加有序。
    瀑布模型(waterfall model):又被称为经典生命周期(classic life cycle),它提出了一个系统的、顺序的软件开发方法。
    优点:
    有利于大型软件开发过程中人员的组织、管理,从而提高了大型软件项目开发的质量和效率。
    当需求确定、工作采用线性的方式完成的时候瀑布模型是一个很有用的过程模型。
    一个有用的过程模型,其中需求是固定的,工作将以线性方式完成。
    缺点:
    过于理想,缺乏灵活性,容易产生需求偏差。
    实际的项目很少遵守瀑布模型提出的顺序。
    客户通常很难清除的描述所有的需求。
    客户必须要有耐心,因为只有在项目接近尾声的时候,他们才能的带执行的程序。
    适用范围:需求确定,工作能够采用线性的方式完成的软件。
    这里写图片描述
    V模型(V-model):
    描述了质量保证动作同沟通、建模相关动作以及早期构建相关的动作之间的关系。
    V模型强调软件开发的协作和速度,将软件实现和验证有机地结合起来,在保证较高的软件质量情况下缩短开发周期。
    优点:适合工程量小、人力资源少并且开发过程中改动不大的项目
    缺点:错误发现时间迟,产生的风险代价高
    这里写图片描述

    增量过程模型(Incremental Model)
    增量过程模型侧重于每一个增量都提交一个可以运行的产品。
    优点:
    1.能在较短的时间内向用户提交可完成部分工作的产品。
    2.逐步增加产品功能可以使用户有充裕的时间学习和适应新产品,从而减少一个 全新的软件可能给客户组织带来的冲击。
    3. 规避技术风险
    4. 可并行开发构件,加快开发的进度
    5. 对于在业务截止日期之前完全实施的人员配置非常有用。
    缺点:
    (1)并行开发构件有可能遇到不能集成的风险,软件必须具备开放式的体系结构;
    (2)增量模型的灵活性可以使其适应这种变化的能力大大优于瀑布模型和快速原型模型,但也很容易退化为边做边改模型,从而是软件过程的控制失去整体性。
    适用范围:
    (1)进行已有产品升级或新版本开发,增量模型是非常适合的; (2)对完成期限严格要求的产品,可以使用增量模型;
    (3)对所开发的领域比较熟悉而且已有原型系统,增量模型也是非常适合的。
    (4) 项目在既定的商业要求期限之前不可能找到足够的开发人员
    这里写图片描述

    演化过程模型(Evolutionary Model)
    演化模型是迭代的过程模型。
    原型开发(prototyping ):当需求很模糊的时候,原型开发可以帮助软件开发人员和利益相关者更好地理解究竟需要做什么。
    优点:
    开发者与用户充分交流,可以澄清模糊需求,需求定义比其他 模型好得多
    开发过程与用户培训过程同步
    为用户需求的改变提供了充分的余地
    开发风险低,产品柔性好
    开发费用低,时间短
    系统易维护,对用户更友好

    缺点:
    1、 没有考虑软件的整体质量和长期的可维护性。
    2、 大部分情况是不合适的操作算法被采用目的为了演示功能,不合适的开发工 具被采用仅仅为了它的方便,还有不合适的操作系统被选择等等。
    3、 由于达不到质量要求产品可能被抛弃,而采用新的模型重新设计。
    适用范围:
    尽管原型可以用作独立的流程模型,但它更常用作一种可以在任何流模型的上下文中实现的技术。
    这里写图片描述
    螺旋模型(Spiral Model)
    螺旋模型是一种风险驱动型的过程模型生成器,对于软件集中的系统,它可以指导多个利益相关者的协同工作。
    优点:
    它结合了原型的迭代性质和瀑布模型的系统性和可控性特点。
    1. 强调风险
    2. 强调阶段质量
    3. 提供纠错的机会
    4. 使用原型作为风险降低机制,进一步使开发人员能够在产品演变的任何阶段应用原型方法。
    缺点:
    1. 每个阶段都要提出被选方案,进行风险分析,研发周期长,效率低
    2. 必须要转业的风险分析人员的参与
    3. 如果没有发现和管理重大风险,问题无疑将会发生。
    适用范围:大型项目
    这里写图片描述

    协同模型(concurrent development model)
    有时候又称为协同工程,它允许软件团队表述本章所描述的任何模型中的迭代和并发元素。
    协同建模提供了项目当前状态的准确画面。
    适用范围:所有类型的软件开发,协同模型通常更适合涉及不同工程团队的产品工程项目。
    这里写图片描述

    统一过程(Unified Process)
    统一过程模型
    统一过程模型是一种“用例驱动、以体系结构为核心、迭代及增量”的软件 过程框架,由 UML 方法和工具支持。它是一种增量模型,定义了五个阶段:
    a、起始阶段,包括用户沟通和计划活动,强调定义和细化用例
    b、 细化阶段,包括用户沟通和建模活动,重点是创建分析和设计模型。
    c、构件阶段,细化模型设计,并将设计模型转化为软件构件实现
    d、 转化阶段,将软件从开发人员传递给最终用户,并由用户完成 beta 测试和验 收测试
    e、生产阶段,持续地监控软件的运行,并提供技术支持。
    优点:
    1. 任何功能开发后就进入测试过程,及早进行验证
    2. 早期风险识别,采取预防措施

    缺点:
    1. 需求必须在开始之前完全弄清楚,否怎有可能在架构上出现错误
    2. 必须有严格的过程管理,以免使过程退化为原始的试→错→改模式
    3.如果不加控制的让用户过早接触没有测试完全,版本不稳定的产品可能对用 户和开发团队都带来负面的影响。
    这里写图片描述


    Agile Development

    敏捷宣言(Agile development manifesto):
    个人和这些个人之间的交流胜过了开发过程和工具
    可运行的软件胜过了宽泛的文档
    客户合作胜过了合同谈判
    对变更的良好响应胜过了按部就班地遵循计划

    极限编程(Extreme Programming (XP))
    极限编程是敏捷软件开发使用最广泛的一个方法。

    极限编程过程:
    1.策划:
    开始创造“用户故事”
    敏捷团队评估每个故事并分配一个成本(开发周数)
    故事被分组到一个可交付增量
    承诺在交付日期进行
    在第一次递增之后,“项目速度”用于帮助估计后续发行版本的发布日期和进度安排,确定是否对整个开发项目中的所有故事有过分承诺。
    2.设计
    遵循KIS(保持简洁)原则
    鼓励使用CRC(类-责任-协作者)卡(见第8章)
    对于困难的设计问题,建议创建“尖峰解决方案” - 一个设计原型
    鼓励“重构”: 重构是以不改变代码外部行为而改进其内部结构的方式来修改软件系统的过程。
    3.编码
    在编码开始之前,建议对故事进行单元测试
    鼓励“结队编程”
    4.测试
    所有的单元测试每天都执行
    “验收测试”,由客户规定技术条件,并且着眼于客户可见的、可评审的系统级的特征和功能。
    这里写图片描述

    工业极限编程(Industrial XP (IPX))
    IXP是XP的一种有机进化。它由XP的最低限要求、以客户为中心、测试驱动精神组成。IXP和XP的主要差别在于其管理具有更大的包容性,它扩大了用户角色,升级了技术实践。
    IXP合并了六个新实践
    Readiness assessment(项目准备)
    Project community(项目社区)
    Project chartering(项目承租)
    Test-driven management (测试驱动管理)
    Retrospectives.(回顾)
    Continuous learning (持续学习)

    需求工程(Requirement engineering)

    七个任务
    1.起始(Inception):在项目起始阶段,要建立基本的理解,包括对问题、谁需要解决方案、所期望解决方案的性质、与项目利益相关者和开发人员之间达成初步交流合作的效果。
    2.导出(Elicitation –gathering requirements):询问客户、用户和其他人,系统或产品的目标是什么,想要实现什么,系统和产品如何满足业务的要求,最终系统或产品如何利用于日常工作。
    3.精化(Elaboration-requirement modeling):在起始和导出阶段获得的信息将在精化阶段进行扩展和提炼该任务集中于开发一个精确的需求模型。
    4.协商(Negotiation-win-win):使用迭代的方法给需求排序,评估每项需求对项目产生的成本和风险,表述内部冲突,删除、组合和修改需求,以便参与各方均能达到一定的满意度,实现双赢。
    5.规格说明(Specification-document,Model,prototype):一个规格说明可以是一份写好的文档、一套图形化的模型、一个形式化的数学模型、一组使用场景、一个原型或上述各项的任意组合。
    6.确认(Validation-Quality assess):在确认这一步对需求工程的工作产品进行质量评估。
    7.需求管理(Management-Change):基于计算机的系统其需求会变更,并且变更的要求贯穿于系统的整个生存期。需求管理是用于帮助项目组在项目进展中标识、控制和跟踪需求以及需求变更的一组活动。

    需求建模的元素

    这里写图片描述
    这里写图片描述

    基于场景建模(功能)

    使用基于场景的方法可以从用户的视角描述系统。
    开发用例图时,应列出特定参与者执行的功能或活动。
    例:
    这里写图片描述

    UML**活动图**在特定场景通过提供迭代流的图形表示来补充用例。
    例:
    这里写图片描述

    UML**泳道图**是活动图的一种有用变化,可以让建模人员表示用例所描述的活动流,同时指示哪个参与者或分析类是由活动矩形所描述的活动来负责。
    这里写图片描述

    基于类的建模

    基于类建模表示了系统操作的对象、应用于对象间能有效控制的操作、这些对象间的关系以及已定义类之间的协作。
    基于类的分析模型包括类和对象、属性、操作、类的职责协作者(CRC)模型、协作图和包。

    识别分析类
    外部实体(其他系统、设备、人员),产生或实验基于计算机系统的信息。
    事物(报告、显示、字母、信号),问题信息域的一部分。
    偶发事件或事件(所有权转移或完成机器人的一组移动动作),在系统操作环境内发生。
    角色(经理,工程师,销售人员),由和系统交互的人员扮演
    组织单元(部门,组,团队),和某个应用系统相关
    场地(制作车间或码头),建立问题的环境和系统的整体功能
    结构(传感器、交通工具、计算机),定义了对象的类或与对象相关的类。
    例:
    这里写图片描述
    这里写图片描述

    类-职责-协作者建模(CRC)
    CRC模型实际上是表示类的标准索引卡片的集合。
    顶部写类名,左侧列出类的职责,右侧部分列出了类的协作者。
    这里写图片描述

    类:
    Entity classes 实体类:一般代表保存在数据库中和贯穿应用程序的事物。
    Boundary classes 边界类:创建用户可见的和在使用软件时交互的接口
    Controller classes 控制类:管理“控制单元”

    职责:
    职责的基本原则:
    属性:描述了已经选择包含在需求模型中的类
    操作:定义了某个对象的行为。
    5个指导原则:
    1.智能系统应分布哎所有类中以求最佳地满足问题的需求。
    2.每个职责的说明应尽可能具有普遍性。
    3.信息和与之相关的信息应局限于一个类中而不要分布在多个类中。
    4.信息和与之相关的行为应该放在同一类中。
    5.适合时,职责应由相关类共享。

    生成行为模型

    生成行为模型的步骤:
    1.评估所有的用例,以保证完全理解系统内的交互顺序
    2.识别驱动交互顺序的事件,并理解这些事件如何与特定的对象相互关联
    3.为每个用例生成序列
    4.创建系统状态图
    5.评审行为模型以验证准确性和一致性。

    状态图:
    UML状态图就是一种行为模型,该图为每个类呈现了主动状态和导致这些主动状态变化的事件。
    例:
    这里写图片描述
    顺序图:
    表明事物引发从一个对象到另一个对象的转移。
    这里写图片描述

    软件设计(Software Design)

    这里写图片描述

    设计概念

    1.抽象(Abstraction):
    过程抽象是指具有明确和有限的指令序列(描述动作)
    数据抽象是描述数据对象的冠名数据集合(描述动作怎么做)

    2.体系结构(Architecture):软件的整体结构和这种结构为系统提供概念完整方式。构件表示主要的系统元素及其交互。

    3.模式(Patterns):模式承载了已证实的解决方案的精髓。设计模式描述了在某个特定场景与可能影响模式应用和使用方法的“影响力”中解决某个特定的设计问题的设计结构。

    4.关注点分离(Separation of concerns):它表明任何复杂问题如果被分解为可以独立解决和优化的若干块,该复杂问题能够更容易的被处理。

    5.模块化(Modularity):模块化是关注点分离最常见的表现。模块化设计使得开发工作更易规划。

    6.信息隐蔽(Hiding):隐蔽意味着通过定义一系列独立的模块可以得到有效的模块化,独立模块互相之间只交流实现软件功能所必须的那些信息。隐蔽定义并加强了对模块内过程细节的访问约束和对模块所使用的任何局部数据结构的访问约束。

    7.功能独立(Functional independence):开发具有“专一”功能和低耦合性的模块即可实现功能独立。

    8.求精(Refinement):通过连续精化过程细节层次来实现程序的开发,通过逐步分解功能的宏观陈述直到形成程序设计语言的语句来进行层次开发。
    抽象和精化是互补的概念。

    9.方面(Aspects):一个方面作为一个独立的模块进行实施,而不是作为“分割的”或者和许多构件“纠缠的”软件片段进行实施。设计体系结构应当支持定义一个方面,该方面即一个模块,该模块能够使该关注点经过它横切的所有其他关注点而得到实施。

    10.重构(Refactoring):重构是使用这样一种方式改变软件系统的过程:不改变代码的外部行为而是改进其内部结构。

    11.面向对象的设计概念(OO design concepts):
    面向对象概念(类、对象、继承、消息和多态)

    12.设计类(Design Class):提供设计细节,使程序得以实施。

    设计概念强调了:
    (1)抽象的必要性,它提供了一种创造可重用软件构件的方法
    (2)体系结构的重要性,它使得能够更好地理解系统整体结构
    (3)基于模式的工程的有益性,它是一项用于已证明能力的软件的设计技术
    (4)关注点分离和有效的模块化的价值,他们使得软件更容易理解、更容易测试以及更容易维护。
    (5)信息隐藏的直接作用,当错误发生时,它能够减少负面影响的传播
    (6)功能独立的影响,他是构造有效模块的标准
    (7)求精作为一种设计方法的作用
    (8)横切系统需求方面的考虑
    (9)重构的应用,他是为了优化已导出的设计
    (10)面向对象的类和与类相关特征的重要性

    设计模型(design model)

    数据设计元素:数据设计创建在高级抽象级上表示的数据模型和信息模型。
    体系结构设计元素:体系结构设计元素通常描述为一组相互关联系统的子系统,且常常从需求模型中的分析包中派生出来。
    接口设计元素:软件接口设计元素描述了信息如何流入和流出系统以及被定义为体系结构一部分的构件之间是如何通信的。
    接口设计有3个重要的元素:
    (1)用户界面
    (2)和其他系统、设备、网络或其他信息生成者或使用者的外部接口
    (3)各种设计构件之间的内部接口
    构件级设计元素:软件的构件级设计完整地描述了每个软件构件的内部细节。构件级设计为所以局部数据对象定义数据结构,为所有在构件内发生的处理定义算法细节,并定义允许访问所有构件操作的接口。
    部署级设计元素:部署级设计元素指明软件功能和子系统将如何在支持软件的物理计算环境内分布。

    体系结构设计

    程序或计算机系统的软件体系结构是指系统的一个或者多个结构,它包括软件构件、构件的外部可见属性以及它们之间的相互联系
    体系结构并非可运行的程序。
    确切的说,它是一种表达,是能够:
    (1)对设计在满足既定需求方面的有效性进行分析
    (2)在设计变更相对容易的阶段,考虑体系结构可能的选择方案
    (3)降低与软件构造相关的风险

    体系结构重要的3个关键原因
    1.软件体系结构的表示有助于对计算机系统开发感兴趣的各方展开交流。
    2.体系结构突出了早期的设计决策,这些决策对随后所有的软件工程工作有深远影响,同时对系统作为一个可运行实体的最后成功有重要作用。
    3.体系结构“构建了一个相对小的、易于理解的模型,该模型描述了系统如何构成以及其构件如何一起工作”

    体系结构风格
    1.以数据为中心的体系结构。
    2.数据流体系结构。
    3.调用和返回体系结构
    4.面向对象体系结构
    5.层次体系结构

    体系结构环境图(ACD)
    上级系统:这些系统把目标系统作为某些高层处理方案的一部分
    下级系统:这些系统被目标系统使用,并为完成目标系统的功能提供必要的数据和处理
    同级系统:这些系统在对等的基础上相互作用
    参与者:通过产生和消耗必要处理所需的信息,实现与目标系统交互的实体(人,设备)
    这里写图片描述
    这里写图片描述

    构件级设计

    构件的概念:
    1.构件是计算机软件中的一个模块化的构造块。
    2.OMG定义构件:系统中模块化的、可部署的和可替换的部件,该部件封装了实现并暴露一组接口。
    面向对象的观点(Object-Oriented view):构件包括一组协作的类。
    传统观点(Traditional View):一个构件就是程序的一个功能要素,程序由处理逻辑及实现处理逻辑所需的每部数据结构以及能够保证构件被调用和实现数据传递的结构构成。

    基本设计原则

    开闭原则(Open-Closed Principle ,OCP):模块应该对外延具有开放性,对修改具有封闭性。
    依赖倒置原则(Dependency Inversion Principle ,DIP):依赖于抽象,而非具体实现。

    Liskov替换原则(Liskov Substitution Principle (LSP)):子类可以替换他们的基类。
    接口分离原则(The Interface Segregation Principle (ISP)):多个客户专用接口比一个通用接口好
    发布复用等价性原则(The Release Reuse Equivalency Principle,REP):复用的粒度就是发布的粒度
    共同封装原则(The Common Closure Principle (CCP)):一同变更的类应该合在一起
    共同复用原则(The Common Reuse Principle (CRP)):不能一起复用的类不能被分到一组

    内聚性(Cohesion):内聚性意味着构件或者类只封装那些相互关联密切,以及与构件或类自身有亲密关系的属性和操作。
    功能内聚:主要通过操作来体现,当一个模块只完成某一组特定操作并返回结果时,就称此模块是功能内聚的。
    分层内聚:高层能够访问低层的服务,但低层不能访问高层的服务。
    通信内聚:访问相同数据的所有操作被定义在同一个类中。(数据的查询,访问,存储)

    耦合性(Coupling):
    耦合是类之间彼此联系程度的一种定性度量。
    随着类(构件)相互依赖越来越多,类之间的耦合程度亦会增加。
    内容耦合:暗中修改其他构件的内部数据,这违反了信息隐蔽原则
    公用耦合:当大量的构件都要使用同一个全局变量时发生这种耦合
    控制耦合:当操作A调用操作B,并向B传递控制标记时,就会发生这种耦合。
    标记耦合:当类B被声明为类A某一操作中的一个参数类型时,就会发生这种耦合。
    数据耦合:当操作需要传递长串的数据参数时,就会发生这种耦合。
    例程调用耦合:当一个操作调用另一个操作时,就会发生这种耦合。
    类型使用耦合:当构件A使用了在构件B中定义的一个数据类型时,就会发生这种耦合。
    包含或者导入耦合:当构件A引入或者包含一个构件B的包或者内容时,就会发生这种耦合。
    外部耦合:当一个构件和基础设施构件进行通信和协作时,就会发生这种耦合。

     为什么要高内聚?  
     模块之间的关系越紧密,出错就越少!
     为什么要低耦合?  
     子程序间的关系越复杂,就会产生更多的意想不到的错误!会给以后的维护工作带来很多麻烦!
      高内聚低耦合,是软件工程中的概念,是判断设计好坏的标准,主要是面向对象的设计,主要是看类的内聚性是否高,耦合度是否低。

    用户界面设计

    黄金准则

    1.用户操纵控制
    (1)以不强迫用户进入不必要的或不希望的动作的方式来定义交互模式
    (2)允许用户交互被中断和撤销
    (3)当技能级别增长时可以使交互流线化并允许定制交互
    (4)使用用户与内部技术细节隔离开来
    (5)设计应允许用户与出现在屏幕上的对象直接交互
    2.减少用户的记忆负担
    (1)减少对短期记忆的要求
    (2)建立有意义的缺省
    (3)定义直观的快捷方式
    (4)以不断进展的方式揭晓信息
    3.保持界面一致
    (1)允许用户当前任务放入有意义的环境中
    (2)在应用系统家族内保持一致性
    (3)如果过去的交互模型已经建立起了用户期望,除非有迫不得已的理由,doze不要改变它。

    可用性

    可用性是指用户在使用高科技产品所提供的功能和特性时,对使用的容易程度和有效程度的定量测量。

    用户界面的分析与设计

    工程师建立用户模型。软件工程师创建设计模型。最终用户在脑海中对界面产生映像,称为用户的心理模型或系统感觉。系统的实现者创建实现模型
    用户模型:确定了系统最终用户的轮廓。
    设计模型:用户界面的设计
    心理模型:最终用户在脑海里对系统产生的印象。
    实现模型:组合了计算机系统的外在表现,结合了所有用来描述系统语法和语言的支撑信息。

    用户界面的分析和设计过程是迭代的,用户界面分析和设计过程开始于螺旋模型的内部,并且包括4个阶段:(1)界面分析及建模。(2)界面设计。(3)界面构造。(4)界面确认。

    这里写图片描述

    界面设计的目标是定义一组界面对象和动作,使得用户能够以满足系统所定义的每个使用目标的方式完成所有定义对的任务。

    界面分析

    在用户界面的设计中,理解问题就意味着了解:
    (1)通过界面和系统交互的人
    (2)最终用户为完成工作要执行的任务
    (3)作为界面的一部分而现实的内容
    (4)任务处理的环境

    界面分析:
    (1)用户分析:
    设计师能够将用户心理模型与设计模型聚合在一起的唯一办法就是努力了解用户,以及了解用户是如何使用系统的。
    可以从各种途径获得信息
    用户访谈:软件团队(代表)与用户讨论。
    销售输入:销售人员与用户定期见面。
    市场输入:市场分析,分析/理解市场每个部分使用软件的细微差别。
    支持输入:技术支持人员与用户访谈。

    (2)任务分析与建模
    任务分析的目标就是将这些技术应用到用户界面:
    a.用例:用例描述了参与者和系统的交互方式。从用例描述中,软件工程师可以提炼出任务、对象和整个的交互过程。
    b.任务细化:改进了交互流程。任务细化有两种方法:
    1.理解实现活动目标而必须完成的任务
    2.研究已有的基于计算机的解决方案的规格说明,并且得到一个适应于用户模型、设计模型和系统感觉的用户任务集合。
    逐步细化。
    c.对象细化:对象细化标识了接口对象
    d.工作流分析:工作流分析定义了涉及多个人(和角色)时工作流程是如何完成的。
    e.层次分析:
    用户任务:请求重新填写处方
    提供识别信息。
    指定名称。
    指定用户ID。
    指定PIN和密码。
    指定处方号码。
    指定日期重填是必需的。

    测试

    测试:测试是在交付给最终用户之前以特定意图找出错误为目的来执行程序的过程。
    验证与确认(Verification and Validation,V&V):
    验证是指确保软件正确地实现某一特定功能的一系列活动。
    确认是指确保开发的软件可追溯到客户需求的另外一系列活动。

    测试策略

    从小到大

    这里写图片描述

    传统的测试策略

    单元测试

    单元测试侧重于软件设计的最小单元(软件构件或模块)的验证工作。
    单元测试侧重于构件的内部处理逻辑和数据结构。
    可以对多个构件并行执行。
    测试模块的接口是为了保证被测试程序单元的信息能够正常地流入和流出;
    检查局部数据结构以确保临时存储的数据在算法的整个执行过程中能维持其完善性。
    执行控制结构中的所有独立路径(基本路径)以确保模块中的所有语句至少执行一次。
    测试边界条件确保模块在到达边界值得极限或受限处理的情形下仍能正确执行。
    最后要对所有的错误处理路径进行测试。
    这里写图片描述
    在单元测试期间,选择测试的执行路径是最基本的任务。
    边界测试时最重要的单元测试任务之一。

    单元测试过程
    这里写图片描述
    驱动模块:接收测试用例数据,将这些数据传递给被测模块,并输出结果。
    桩:替换那些从属于被测模块的模块
    当设计高内聚的构件时,就可以简化单元测试。当构件只强调一个功能时,测试用例数就会降低,且比较容易预见错误和发现错误。

    集成测试

    集成测试时构造软件体系结构的系统化技术,同时也是进行一些旨在发现与接口相关的错误的测试。
    集成测试的目标是利用单元测试的构件建立设计中描述的程序结构。

    自顶向下集成:自顶向下集成测试是一种构造软件体系结构的增量方法。
    深度优先:深度优先集成是首先集成位于程序结构中主控路径上的所有控件。
    广度优先:广度优先集成首先沿水平方向,将属于同一层的构件集成起来。
    自顶向下集成过程:
    1.主控模块作为测试驱动模块,用桩模块代替直接附属的下层模块;
    2.根据所选的集成策略(深度优先/广度优先),每次用一个实际模块替换一个桩模块;
    3.每集成一个模块都进行测试;
    4.完成每个测试集之后,用实际模块替换另一个桩模块;
    5.可以进行回归测试(即全部或部分地重复已做过的测试),以避免引入新错误。
    回到第2步继续执行此过程,直到完成整个程序结构的构造。

    自底向上集成测试:就是从原子模块(程序结构的最底层构件)开始进行构造和测试。
    自底向上集成测试过程:
    1.连接底层构件以构成完成特定子功能的簇。
    2.编写驱动模块(测试的控制程序)以协调测试用例的输入和输出
    3.测试簇
    4.去掉驱动程序,沿着程序结构向上逐步连接簇
    这里写图片描述

    回归测试

    回归测试重新执行已测试过的某些子集,以确保变更没有传播不期望的副作用。
    回归测试有助于保证变更不引入无意思行为或额外的错误。
    回归测试可以手工进行,方法是重新执行所以测试用例的子集,或者利用捕捉/回放工具自动进行。

    面向对象软件的测试策略

    面向对象软件的类测试等同于传统软件的单元测试。
    不同的是:
    传统软件单元测试侧重于模块的算法细节和模块接口数据;
    面向对象类的测试侧重于封装在该类中的操作和类的状态行为。
    封装的类是单元测试的重点,但不再孤立地对单个操作进行测试,而是将其作为类的一部分。
    簇测试时面向对象软件集成测试中的一个步骤。

    确认测试(Validation Testing)

    确认测试准则:软件确认是通过一系列表明与软件需求相符合的测试而获得的。

    α测试(Alpha testing):α测试测试是由代表性的最终用户在开发者的场所进行。软件在自然的环境下使用,开发者站在用户的后面观看,并记录错误和使用问题。α测试在受控的环境下测试。

    β测试(Beta testing)(又称客户验收测试,Acceptance testing):β测试在一个或多个最终用户场所进行。与α测试不通过,开发者通常不在场,因此,β测试是在不为开发者控制的环境下软件的“现场”应用。是在不可控的环境下测试。

    系统测试

    系统测试实际上是对整个基于计算机的系统进行一系列不同考验的测试。所有测试都是为了验证系统成分已经正确地集成在一起,并且完成了指派的功能。

    恢复测试(Recovery testing):通过各种方式强制让软件以各种方式失败并验证恢复是否正确执行。
    安全测试(Security testing):安全测试验证建立在系统内的保护机制是否能够实际保护系统不受非法入侵。
    压力测试(Stress testing):压力测试的目的是是软件面对非正常的情形。是一种要求以非正常数量、频率或容量的方式进行彻底评估。
    性能测试(Performance testing):性能测试用来测试软件在集成环境中的运行性能。
    部署测试(Deployment testing):部有时也将署测试称为配置测试,是在软件将要在其中运行的每一种环境中测试软件。

    测试传统的应用系统

    白盒测试:白盒测试有时也称为玻璃盒测试,是一种测试用例设计方法,它利用作为构件层设计的一部分描述的控制结构来生成测试用例。
    白盒测试是在了解模块内部结构的情况下进行的测试。
    利用白盒测试方法导出的测试用例可以:
    (1)保证一个模块中的所有独立路径至少被执行一次。
    (2)对所有的逻辑判定均需要测试取真和取假两个方面。
    (3)在上下边界及可操作的范围内执行所有的循环。
    (4)检验内部数据结构以确保其有效性。

    基本路径测试(Basic path testing)
    基本路径测试时由TOM首先提出的一种白盒测试技术。
    流图(程序图)是一种简单的控制流表示方法。
    流程图用于描述程序的控制结构,流程图映射为相应的流图。
    圆称为流图结点(flow graph node),表示一个或多个过程语句。处理框序列和一个菱形判定框可以映射为单个节点。
    流图中的箭头称为边或者连接,标识控制刘,类似于流程图中的箭头。
    由边和结点限定的区域称为域。当计算域时,将图的外部作为一个域。
    包含条件的结点称为判定结点,其特征是由它发射出两条或多条边。
    这里写图片描述
    这里写图片描述
    独立路径是指任何贯穿程序的、至少引入一组新语句或一个新条件的路径。
    如果设计测试用例强迫执行这些路径(基本集合),就可以保证程序中的每条语句至少执行一次,同时,每个条件判断的真和假都被执行。
    这里写图片描述
    环复杂度(Cyclomatic Complexity )计算方法:
    这里写图片描述
    V(G)的值提供了组成基本集合的独立路径的上街,并由此得出覆盖所有程序语句所需设计和运行的测试数量的上界。

    黑盒测试

    黑盒测试也称为行为测试,侧重软件的功能需求。
    黑盒测试使软件工程师能设计出将测试程序所有功能需求的输入条件集。
    黑盒测试不是白盒测试的替代品,而是作为发现其他类型错误的辅助方法。
    黑盒测试试图发现以下类型的错误:
    (1)不正确或遗漏的功能
    (2)接口错误
    (3)数据用在测试的后期阶段
    (4)行为或性能错误
    (5)初始化和终止错误
    黑盒测试的方法:
    Graph-based testing methods 基于图的测试方法
    Equivalence partitioning 等价类划分
    Boundary value analysis 边界值分析
    Orthogonal array testing 正交数组测试

    黑盒测试的例子:
    这里写图片描述
    这里写图片描述
    这里写图片描述

    展开全文
  • 软件工程基础知识

    千次阅读 2018-08-02 11:32:26
    (1)概念:软件危机是指在计算机软件开发、使用与维护过程中遇到的一系列严重问题和难题。  (2)产生软件危机的原因主要有:  ①软件的规模越来越大,结构越来越复杂  ②软件开发管理困难而复杂  ③软件开发...

    一.软件危机 
    (1)概念:软件危机是指在计算机软件开发、使用与维护过程中遇到的一系列严重问题和难题。 
    (2)产生软件危机的原因主要有: 
    ①软件的规模越来越大,结构越来越复杂 
    ②软件开发管理困难而复杂 
    ③软件开发费用不断增加 
    ④软件开发技术落后 
    ⑤生产方式落后 
    ⑥开发工具落后,生产率提高缓慢 
    (3)软件危机的表现有: 
    ①经费预算经常突破,完成时间一再拖延 
    ②开发的软件不能满足用户需求 
    ③开发的软件可靠性差 
    ④开发的软件可维护性差 
    二.软件工程 
    (1)概念 
    软件工程是指用工程、科学和数学的原则与方法开发、维护计算机软件的有关技术和管理方法。 
    (2)软件工程的三要素 
    方法、过程、工具 
    三.常见的软件开发模型 
    (1)原型模型 
    a.适用场合 
    原型模型适合于那些不能预先确切定义需求的软件系统的开发,更适合于那些项目组成员(包括分析员、设计员、程序员和用户)不能很好交流或通信有困难的情况。 
    b.特点 
    及早提供工作软件 
    (2)瀑布模型 
    a.定义 
    将软件生存周期各个活动规定为依线性顺序连接的若干阶段的模型,又称为生存周期模型。 
    b.适用场合 
    瀑布模型一般适用于功能、性能明确、完整、无重大变化的软件系统的开发。例如操作系统、编译系统、数据库管理系统等系统软件的开发。 
    c.特点 
    文档驱动、线性 
    d.缺点 
    1)在软件开发的初期阶段就要求做出正确、全面、完整的需求分析,这对许多应用软件来说是极其困难的 
    2)在需求分析阶段,当需求确定后,无法及时验证需求是否正确、完整 
    3)不支持产品的演化,缺乏灵活性,使软件产品难以维护 
    (3)螺旋模型 
    a.定义 
    是一种将瀑布模型和快速原型模型结合起来的软件开发模型 
    b.适用场合 
    螺旋模型支持需求不明确、特别是大型软件系统的开发,并支持面向规格说明、面向过程、面向对象等多种软件开发方法,是一种具有广阔前景的模型 
    c.特点 
    支持用户需求的动态变化、风险分析 
    (4)增量模型 
    a.定义 
    分成多个子系统进行开发,最后集成起来 
    (5)喷泉模型 
    a.定义 
    喷泉模型是一种以面向对象的软件开发方法为基础,以用户的需求为动力,以对象来驱动的模型 
    四.结构化分析方法(SA) 
    (1)概念 
    结构化分析方法是面向数据流进行需求分析的方法。结构化分析方法使用数据流图DFD与数据字典DD来描述,面向数据流问题的需求分析适合于数据处理类型软件的需求描述。其核心思想是自顶向下、逐层分解。 
    (2)常见的工具 
    2.1 数据字典【DD】 
    a.包括的条目 
    数据流+数据存储+加工说明+数据项(一般不包含源点与终点) 
    b.定义 
    数据字典是系统描述工具中的数据的工具,是对数据定义信息的集合,其所定义的对象都包含于数据流图。 
    2.2 数据流图【DFD】 
    a.定义 
    数据流图是SA方法中用于表示系统逻辑模型的一种工具,以图形的方式描绘数据在系统中流动和处理的过程,反映系统必须完成的逻辑功能,是一种功能模型。 
    b.四种符号元素

    符号 含义
    方框 源点与终点
    箭头 数据流
    圆/椭圆 加工
    双杠 数据存储

    (3)数据字典+数据流图=系统的逻辑模型 
    五.结构化设计方法(SD) 
    (1)定义 
    结构化设计要解决的任务,就是在需求分析的基础上,将DFD图映射为软件系统的结构。换句话说,这类设计方法允许把用DFD图表示的系统逻辑模型方便地转换成对于软件结构的初始设计描述。 
    从结构化分析到结构化设计工具的转变:

    结构化分析结果 结构化设计结果
    数据流图的信息 程序结构的设计描述

    (2)一般分为两个阶段 
    总体设计(概要设计)+详细设计 
    (3)基本要点 
    (1)采用自顶向下,逐步求精的程序设计方法。 
    (2)使用三种基本控制结构构造程序,分别是顺序,选择和循环 
    (3)采用主程序员制的组织形式。 
    (4)采用单入口单出口的模块形式。 
    六.软件生存周期 
    ①软件定义过程:可行性研究+需求分析 
    ②软件开发过程:设计(概要设计、详细设计)+实施(编码+单元测试)+测试(集成测试+确认测试) 
    ③软件使用与维护过程:使用与维护+退役 
    七.概要设计 VS 详细设计

    概要设计 详细设计
    又称结构设计(总体设计) 又称过程设计(模块设计)
    软件需求——>软件表示 模块功能——>精确的、结构化的过程描述
    数据库的”逻辑设计” 数据库的”物理设计”
    任务是确定每个模块的功能和接口,数据结构和数据库设计,编写概要设计文档,以及评审 任务是确定每个模块的内部特性(具体执行过程),即模块的算法和数据库的物理设计
    采用的工具:图形(程序流程图、盒图,即N-S图、PAD图)、表格(判定表)、语言(过程设计语言,即PDL)

    八.软件测试 
    (1)概念 
    软件测试指为了发现软件中的错误而执行软件的过程。它的目标是尽可能多地发现软件中存在的错误,将测试结果作为纠错的依据。 
    (2)目的 
    ① 软件测试是为了发现错误而执行程序的过程。 
    ② 一个好的测试用例能够发现至今尚未发现的错误。 
    ③ 一个成功的测试是发现了至今尚未发现的错误。 
    (注:软件调试的目的则是改正错误。) 
    (3)阶段 
    【注:由于系统测试实际上超出了软件工程的范畴,故这里没有详细说明。】

    阶段顺序 单元测试 集成测试 确认测试 系统测试
    测试方法 白盒测试 渐增式测试(包括:自顶向下结合法,自底向上结合法)+非渐增式测试 黑盒测试  
    发现错误的阶段 编码阶段 设计阶段 需求分析阶段  
    涉及的文档 编码和详细设计文档 详细设计文档和概要设计文档 需求规格说明书和用户手册  

    (4)方法 
    a.黑盒测试——把测试对象看成一个黑盒子,只在软件的接口处进行测试,依据需求规格说明书,检查程序是否满足功能要求,又称为功能测试或数据驱动测试。 
    测试手段:等价类划分、边界值分析、错误推测法、因果图 
    b.白盒测试——把测试对象看成一个透明的盒子,对程序中的逻辑路径进行测试,检查内部控制结构和数据结构是否有错,实际的运行状态与预期的状态是否一致。 
    测试手段:逻辑覆盖(语句覆盖,判定覆盖,条件覆盖,判定条件覆盖,条件组合覆盖,路径覆盖)、基本路径测试、循环覆盖 
    九.模块独立性 
    模块独立性是软件设计的基本原则之一,其他的几个分别是:模块化,抽象,信息隐藏。模块独立指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。衡量模块独立性有两个标准——耦合性和内聚性,模块划分时应做到高内聚,低耦合,从而提高模块的独立性。 
    ①内聚 
    模块之间联系越紧密,其内聚性越强。 
    ②耦合 
    模块的耦合性由低到高依次是: 
    非直接耦合(不传递任何信息),数据耦合(传递数据值),标记耦合(传递数据结构),控制耦合(传递控制变量),外部耦合,公共耦合,内容耦合。 
    一般来说,在传递信息类型上尽量使用数据耦合,避免控制耦合,慎用或有控制地使用公共耦合。 
    十.其他知识点 
    【N-S图】 
    START 

    IF x1 THEN 
    REPEAT UNTIL x2 

    END REPEAT 
    ELSE 
    BLOCK 


    END BLOCK 
    END IF 
    STOP 
    解答

    伪码 
    START 
    S1 
    if(x>5); 
    else S2; 
    i:=1; 
    DO S3,i:=i+i; 
    while i<3 
    if(y<0) S4; 
    else S5; 
    END 
    解答 
    【PAD图】 
    画出下面用PDL写出的程序的PAD图。 
    WHILE P DO 
    IF A >O THEN A1 ELSE A2 ENDIF; 
    S1; 
    IF B>0 THEN B1; 
    WHILE C DO S2;S3 ENDWHILE; 
    ELSE B2 
    ENDIF; 
    B3 
    ENDWHILE; 
    解答

    【数据流图】 
    用SA方法画出下列问题的顶层和0层数据流图。 
    某运动会管理系统接受来自运动员的报名单、裁判的比赛项目及项目成绩,产生运动员号码单发送给运动员,项目参加者发送给裁判,单项名次、团体名次发送给发布台。该系统有两部分功能: 
    (1)登记报名单:接受报名单、比赛项目,产生运动员号码单、项目参加者,形成运动员名单及团体成绩表两种数据存储。 
    (2)统计成绩:接受项目成绩,查询运动员名单,产生单项名次,填写团体成绩,最后产生团体名次。 
    解答

    【面向对象方法较之结构化方法的优越性】 
    (1)面向对象方法更符合人的思维方式,更容易抓住问题的主干; 
    (2)所开发出的软件更符合“高内聚,低耦合”的软件设计原则,因此其模块的独立性更强; 
    (3)更适合于开发大型的软件,更适合于快速原型法开发方法,使软件生产率大大提高; 
    (4)使用面向对象技术开发出的软件,其可测试性和可维护性都较强; 
    (5)面向对象方法和技术能够贯彻软件开发的全过程,从分析、设计、编码到测试维护,采用面向对象的方法不存在语义断层,使人的思维保持连贯,减少各阶段之间的不相融性; 
    (6)使得软件的可重用性大幅度提高。

    展开全文
  • 软件工程》 中文版免费下载

    千次下载 热门讨论 2020-07-30 23:30:42
    会搜索这个的应该有简单了解这本书是干嘛的,上传的目的只是看到太多都是要积分的,有人可能没积分又比较需要, 可以方便点下载.
  • 什么是软件工程

    千次阅读 2018-05-17 11:48:39
    什么是软件工程? 从上世纪90年代初起,计算学科(Computing)的发展远远超越了计算机科学的边界,形成了计算机科学、计算机工程、软件工程、信息系统与信息技术等若干独立学科。计算机工程从电子工程学科中分离...

    什么是软件工程?

          从上世纪90年代初起,计算学科(Computing)的发展远远超越了计算机科学的边界,形成了计算机科学、计算机工程、软件工程、信息系统与信息技术等若干独立学科。计算机工程从电子工程学科中分离出来,旨在研究计算机硬件的相关工程问题,而软件工程从计算机科学中的一个学科方向发展成为与之并重的一门独立学科,重点研究如何以系统的、可控的、高效的方式开发和维护高质量软件的问题。

     

    1.软件工程的定义

         软件工程学科诞生后,人们为软件工程给出了不同的定义,例如最早的定义是由F.L. Bauer给出的,即“软件工程是为了经济地获得能够在实际机器上高效运行的、可靠的软件而建立和应用一系列坚实的软件工程原则”。而美国梅隆卡耐基大学软件工程研究所(SEI)给出的定义则是软件工程是以工程的形式应用计算机科学和数学原理,从而经济有效地解决软件问题。但目前普遍使用的软件工程定义是由IEEE给出的,即软件工程是将系统性的、规范化的、可定量的方法应用于软件的开发、运行和维护。

          软件工程概念实际存在两层含义,从狭义概念看,软件工程着重体现在软件过程中所采用的工程方法和管理体系,例如,引入成本核算、质量管理和项目管理等,即将软件产品开发看作是一项工程项目所需要的系统工程学和管理学。从广义概念看,软件工程涵盖了软件生命周期中所有的工程方法、技术和工具,包括需求工程、设计、编程、测试和维护的全部内容,即完成一个软件产品所必备的思想、理论、方法、技术和工具。

     

    2.软件工程的内涵

          软件工程学科包含为完成软件需求、设计、构建、测试和维护所需的知识、方法和工具。软件工程不局限在理论之上,更重要在实践上,能够帮助软件组织协调团队、运用有限的资源,遵守已定义的软件工程规范,通过一系列可复用的、有效的方法,在规定的时间内达到预先设定的目标。针对软件工程的实施,无论是采用什么样的方法和工具,先进的软件工程思想始终是最重要的。只有在正确的工程思想指导下,才能制定正确的技术路线,才能正确地运用方法和工具达到软件工程或项目管理的既定目标。

     

    3.软件工程是一门交叉性学科

          软件工程是一门交叉性的工程学科,它是将计算机科学、数学、工程学和管理学等基本原理应用于软件的开发与维护中,其重点在于大型软件的分析与评价、规格说明、设计和演化,同时涉及管理、质量、创新、标准、个人技能、团队协作和专业实践等。从这个意义上看,软件工程可以看作由下列3部分组成。

    • 计算机科学和数学用于构造软件的模型与算法;
    • 工程科学用于制定规范、设计范型、评估成本以及确定权衡等;
    • 管理科学用于计划、资源、质量、成本等管理。

          例如,计算机辅助软件工程(Computer Aided Software Engineering,CASE)是一组工具和方法的集合,可以辅助软件生命周期各阶段进行的软件开发活动。CASE吸收了CAD(计算机辅助设计)、软件工程、操作系统数据库、网络和许多其他计算机领域的原理和技术。这个例子也体现了这一点——软件工程是学科交叉的、集成和综合的领域。


     

    4.软件工程学科范围

          如果从知识领域看,软件工程学科是以软件方法和技术为核心,涉及计算机的硬件体系、系统基础平台等相关领域,同时还要涉及一些应用领域和通用的管理学科、组织行为学科。例如,通过应用领域的知识帮助我们理解用户的需求,从而可以根据需求来设计软件的功能。 在软件工程中必然要涉及组织中应用系统的部署和配置所面临的实际问题,同时又必须不断促进知识的更新和理论的创新。为了真正解决实际问题,需要在理论和应用上获得最佳平衡。


    原文(什么是软件工程?

    展开全文
  • 软件工程:概述

    2020-10-14 20:51:05
    1.1,软件危机 1.1.1,软件危机的介绍 软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。 包含问题:如何开发软件以满足对软件日益增长的需求和如何维护数量不断膨胀的已有软件。 典型问题...

    1.1,软件危机

    1.1.1,软件危机的介绍

    软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。

    包含问题:如何开发软件以满足对软件日益增长的需求如何维护数量不断膨胀的已有软件

    典型问题

    1. 对软件开发成本和进度的估计常常很不准确
    2. 用户对“已完成的”软件系统不满意的现象经常发生
    3. 软件产品的质量往往靠不住
    4. 软件常常是不可维护的
    5. 软件通常没有适当的文档资料
    6. 软件成本在计算机系统总成本中所占比例逐年上升
    7. 软件开发生产率提高的速度,远远跟不上计算机应用迅速普及及深入的趋势

    1.1.2,产生软件危机的原因

    自身特点

    1. 软件不同于硬件,它是计算机系统中的逻辑部件而不是物理部件。
    2. 软件在运行过程中不会因为使用时间过长而被“用坏”,如果运行中发现错误,很可能是遇到了一个在开发时期引入的在测试阶段没能监测出来的错误。
    3. 规模庞大,而且程序复杂性将随着程序规模的增加而呈现指数上升。
    4. 软件本身特点对开发和维护带来了一定的客观困难。

    软件开发和维护的方法不正确

    1. 错误的认识和做法主要表现为忽视软件需求分析的重要性
    2. 认为软件开发就是写程序并设法是之运行,轻视软件维护

    1.1.3,消除软件危机的途径

    既要有数据措施(方法和工具),又要有必要的组织管理措施

    1. 对计算机软件有一个正确的认识,软件配置=程序+文档+数据,软件=程序+文档+数据;
    2. 软件开发时一种组织良好,管理严密,各类人员协同配合,共同完成的工程项目。
    3. 应该推广使用在实践中总结出来的开发软件的成功的技术和方法,并且研究探索更好更有效的技术和方法。
    4. 应该开发和使用更好的软件工具。

    1.2,软件工程

    1.2.1,软件工程的介绍

    1. 定义:软件工程是指导计算机软件开发和维护的一门工程学科。
    2. NATO:软件工程就是为了经济地获得可靠的且能在实际机器上有效运行的软件,而建立和使用完善的工程原理。
    3. IEEE:软件工程是把系统的,规范的,可度量的途径应用于软件开发,运行和维护过程,也就是把工程应用于软件。

    本质特性

    1. 软件工程关注大型程序的构造
    2. 软件工程的中心课题是控制复杂性
    3. 软件经常变化
    4. 开发软件的效率非常重要
    5. 和谐地合作是开发软件的关键
    6. 软件必须幼小的支持它的用户
    7. 在软件工程领域通过由具有一种文化背景的人替具有另一种文化背景的人创造产品

    1.2.2,基本原理

    1. 用分阶段的生命周期计划严格管理
    2. 坚持进行阶段评审
    3. 实行严格的产品控制
    4. 采用现代程序设计技术
    5. 结果应能够清楚地审查
    6. 开发小组的人员应该少而精
    7. 承认不断改进软件工程实践的必要性

    1.2.3,软件工程方法学

    1.3,软件生命周期

    1.4,软件过程

    软件过程是为了获得高质量软件所需要完成的一系列任务的框架, 它规定了完成各项任务的工作步骤。

    1.4.1,瀑布模型-整体开发模型

    特点

    1,阶段间具有顺序性和依赖性,必须等到前一阶段的工作万抽才能开始后一阶段的任务,前一阶段的输出文档就是后一阶段的输出文档。

    2,推迟实现的观点,对于缺乏软件开发的软件开发人员来说,接到软件开发任务以后常常急于求成,但是最后开发所需的时间反而越长。

    3,质量保证的观点,每个阶段都必须又合格的文档,没有则是没有完成该阶段的任务,并且每个阶段都必须对文档进行评审,以便尽早的发现问题,改正错误。是一种文档驱动型模型。

    4,强迫开发人员采用规范的开发方法(结构化技术),严格地规定了每个阶段必须提交的文档,要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证。

    5,用户只能通过文档来了解产品是什么样的,很难全面正确的认识动态软件产品,最终导致开发出的软件产品不能满足用户需求。

    1.4.2,快速原型模型

    快速原型是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集。

    快速原型模型是不带反馈环的,这正是这种过程模型的主要优点,软件产品开发基本上是线性顺序进行的

    原因

    1,原型系统已经通过与用户交互而得到验证,据此说明规格说明文档是正确的描述了用户的需求。

    2,开发人员通过建立原型系统已经学到了(系统应该做什么,不应该做什么),设计和编码错误减少。

    特点

    快速原型的本质是“快速”,加速软件开发过程,节约软件开发成本,原型的用图是获取用户的真正需求,一旦确定了原型就会被抛弃。

    原型系统的内部结构不重要,重要的是必须迅速地构建原型然后根据用户意见迅速地修改原型。

    1.4.3,增量模型

    把软件产品看为一系列的增量构件来设计,编码,集成和测试。每个构件由多个相互作用的模块构成,并且能够完成特定功能,使用增量模型时,第一个增量构件往往实现软件的基本需求,提供最核心的功能。

    优点

    与瀑布模型相比提供的是部分工作的产品,不是文档。

    逐步增加产品功能可以使用户有充裕的时间学习和适应新产品,从而减少给用户一个全新软件的冲击。

    缺点

    软件的结构体系必须是开放的。

    增量模型是矛盾的,一方面要求把软件看出一个整体,另一方面要求看作构件序列。

    1.4.4,螺旋模型

    螺旋模型的思想是使用原型及其他方法来尽量降低风险,可以看作

    特点

    对可选方案和约束条件的强调有利于已有软件的重用,也有助于把软件质量作为软件开发的一个重要目标,减少过多测试或测试不足带来的风险。

    维护是模型的另一个周期,在维护和开发之间没有本质区别。

    适用于内部开发大规模软件项目。

    风险驱动型。

    1.4.5,喷泉模型

    瀑布模型——结构化技术,喷泉模型——面向对象技术

     

     

    展开全文
  • 软件工程的几个步骤

    万次阅读 2016-12-02 12:12:49
    软件工程一直以来都缺乏一个统一的定义,很多学者、组织机构都分别给出了自己的定义: Boehm:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料。  IEEE:软件工程...
  • 软件工程

    2020-02-13 16:02:52
    文章目录软件工程软件的定义软件的本质复杂性一致性可变性不可见性软件工程的产生和发展软件开发面临的挑战软件工程的基本概念什么是软件工程什么是好的软件软件工程的基本要素过程方法工具软件开发的基本策略 ...
  • 软件工程”到底学什么(一)

    万次阅读 2016-10-18 16:43:35
    我对软件工程的见解。
  • 软件工程毕业设计集合

    万次阅读 热门讨论 2019-04-10 14:57:32
    想学习分布式、微服务、JVM、多线程、架构、java、python的童鞋,千万不要扫码,否则后果自负~ 1.旅游社交系统 2.基于Web的学校教室租赁系统 3.学校在线二手交易平台 ...如果大家想要...
  • 软件工程 毕业设计题目

    万次阅读 多人点赞 2020-09-11 14:22:21
    软件工程毕业设计 题目汇总 【不断更新中】 1.微信小程序 校园表白墙微信小程序 2.房屋租赁管理系统 3.航空售票管理系统 4.高校会议室管理系统 5.高校就业管理系统 6.失物招领系统 7.图书销售系统 8.微信小程序 ...
  • 软件工程专业四个方向

    万次阅读 2019-02-27 11:30:25
  • 计算机科学与软件工程的区别

    万次阅读 2018-06-06 02:50:14
    自:本科专业“软件工程”和“计算机科学与技术”的区别是什么? - 周筠的回答 - 知乎https://www.zhihu.com/question/24292554/answer/38486618①计算机科学中理论研究部分大多可以从形式上证明,与数学、离散数学...
  • 软件工程(第四版)课后题答案

    万次阅读 多人点赞 2020-03-12 17:23:26
    软件工程 (第4版) 学习辅导与习题解析 ,张海藩编著 链接: https://pan.baidu.com/s/1NI_7SfDoPatogT13toL7RA 提取码: 3y4s
  • 软件工程——思维导图

    万次阅读 多人点赞 2019-05-29 11:30:27
    软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。 软件开发总览图 软件开发绪论 软件产生...
  • 实用软件工程——课后习题答案 软件工程(英语:Software Engineering[1])1968年秋季,NATO(北约)的科技委员会召集了近50名一流的编程人员、计算机科学家和工业界巨头,讨论和制定摆脱“软件危机”的对策。在那...
  • 软件工程国家标准

    万次阅读 2020-08-27 15:13:27
    1、标准化基础知识 1.1、标准的层次 国际标准 国家标准 行业标准 地方标准 企业标准 1.2、标准的类型 强制性标准 推荐性标准 1.3、标准的表示 ... 中华人民共和国国家标准化指导性技...
  • 不怕别人人肉,所以大胆地说出我是一名桂林理工大学在读软件工程专业的学生,更准确的来说我是一名从资源勘查工程转入软件工程的学生。鉴于地质行业最近几年的瓶颈期,难就业,义无反顾的选择了号称三年“绿牌”专业...
  • 软件工程大一至大四课程

    万次阅读 多人点赞 2017-12-24 21:55:27
    转载地址:http://blog.csdn.net/xiaowei_cqu近来看到些总结自己学编程的经历的文章,总觉得心里痒痒的,也很想在毕业季回顾一下自己在软件学院四年的学习情况。...一直还是觉着软件学院的课程安排很合理,注重数学
  • 大三软件工程小项目-小技术集合-大纲
1 2 3 4 5 ... 20
收藏数 735,183
精华内容 294,073
关键字:

软件工程