软件工程理论与实践(一)

什么是软件危机,结合软件危机的现象进行阐述

软件危机是计算机软件在它的开发和维护过程中所遇到的一系列严重问题。概括地说,主要包含两方面的问题:如何开发软件,怎样满足对软件日益增长的需求;如何维护数量不断膨胀的已有软件。

软件危机的主要表现:

  1. 对软件开发成本和进度的估计常常很不准确。 实际成本比估计成本有可能高出一个数量级,实际进度比预期进度拖延几个月甚至几年的现象并不罕见。这种现象降低了开发组织的信誉。为赶进度和节约成本所采取的权宜之计往往又损害了软件产品的质量,从而不可避免地引起用户的不满。
  2. 用户对「已完成的」软件系统不满意的现象经常发生。 软件开发人员常常在对用户需求只有模糊的了解,甚至对所要解决的问题还没有确切认识的情况下,就仓促上阵匆忙着手编写程序。软件开发人员和用户之间的交流往往很不充分,「闭门造车」必然导致最终产品不符合用户实际需要。
  3. 软件产品的质量常常靠不住。 软件可靠性和质量保证的确切定量概念刚刚出现,软件质量保证技术(审查、复审和测试)还没有坚持不懈地应用到软件开发的全过程中,这些都会导致软件产品发生质量问题。
  4. 软件常常是不可维护的。 程序中的错误很难改正,实际上不可能使这些程序适应新的硬件环境,也不能根据用户的需求在原有程序中增加新的功能。
  5. 软件通常没有适当的文档资料。 软件不仅是程序,还应该有一整套文档资料。这些文档资料是在软件开发过程中产生出来的,而且应该是「最新的」(与代码完全一致)。缺乏文档必然给软件的开发和维护带来许多严重的困难和问题。
  6. 软件成本在计算机系统总成本中所占比例逐年上升。 随着微电子技术的进步和生产自动化程度的提高,硬件成本逐年下降,然而软件开发需要大量的人力,软件成本随着通货膨胀以及软件规模和数量的不断扩大而逐年上升。美国在 1995 年的调查表明,软件成本大约已占计算机系统总成本的 90%。 软件危机的出现,使得人们去寻找产生危机的内在原因,发现其原因可归纳为两方面,一方面是由软件生产本身存在着复杂性,另一方面却是与软件开发所使用的方法和技术有关。 软件工程正是为克服软件危机而提出的一种概念,并在实践中不断地探索它的原理,技术和方法。在此过程中,人们研究和借鉴了工程学的某些原理和方法,并形成了一门新的学科—软件工程学,但可惜的是时至今日人们并没有完全克服软件危机。
  7. 软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势

简述并分析软件危机产生的原因

  • 与软件本身特点相关
    1. 软件不同于硬件,它是计算机系统的逻辑部件而不是物理部件。在写出程序代码并在计算机上试运行之前,软件开发过程的进展情况较难衡量。很难检验开发的正确性且软件开发的质量也较难评价。因此,控制软件开发过程相当困难。
    2. 此外,在软件运行过程中发现错误,很可能是遇到了一个在开发期间引入的、但在测试阶段没有能够检测出来的错误,所以软件维护常常意味着修改原来的设计。这样,维护的费用十分惊人,客观上使得软件较难维护。
    3. 软件规模庞大,而且程序复杂性将随着程序规模的增加而成指数上升。
    4. 对用户要求没有完整准确的认识就匆忙着手编写程序是许多软件开发工程失败的主要原因之一。
    5. 软件开发的过程是多人分工合作,分阶段完成的过程,参与人员之间的沟通和配合十分重要。但是,相当多的软件开发人员对软件的开发和维护存在不少错误的观念,在实践的过程中没有采用工程化的方法,或多或少采用了一些错误的方法和技术,这是造成软件危机的主要原因。
    6. 错误的认识和做法主要表现为忽视软件需求分析的重要性,认为软件开发就是写程序并设法使之运行,轻视软件维护等。
  • 软件开发与维护的方法不正确有关
    1. 只重视程序而忽视软件配置其余成分的糊涂观念。
    2. 在定义时期没有正确全面地理解用户需求,直到测试阶段或软件交付使用后才发现「已完成的」软件完全不符合用户需要。
    3. 严重的问题是在软件开发的不同阶段进行修改需要付出的代价是很不相同的

何为软件工程,并稍深入讨论你对此概念的理解

软件工程就是为了经济地获得可靠的且能在实际机器上有效地运行的软件,而建立和使用完善的工程原理。 ——1968 年在第一届 NATO 会议上曾经给出了软件工程的一个早期定义

软件工程是:① 把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,也就是把工程应用于软件;② 研究 ① 中提到的途径。 ——1993 年 IEEE 进一步给出了一个更全面更具体的定义

软件工程是运用工程的、数学的、计算机等科学概念、方法和原理来指导软件开发和管理和维护的一门学科。

谈谈你对本课程的内容(讲什么)、目标(课程要求)的理解

该课程讲授如何系统化、工程化、可量化的分析、设计、实现软件系统,旨在运用工程、数学、计算机等科学概念、方法和原理指导软件的实现和管理过程。课程以工程化模式(项目)驱动,每个学生都实质性的参与软件项目的分析、设计、编码、测试和维护。以提升学生的分析与设计能力、工程素养、团队协作精神、以及编程能力目标,此课程为后续的《系统分析与设计》、《本科毕业论文》重要的前序课程,此外,其将为成为一名合格的软件工程师奠定扎实的理论、技术及 IT 工程项目基础。 ——教务系统上的课程内容简介

我的理解是,软件工程这门课将会以理论和实践相结合的方式,引导我们科学地实现软件开发的流程,课程要求我们能够了解并熟练运用课程中学到的知识到实际的软件开发中,成为一名合格的软件工程师。

何为 UML

The UML is the standard language for visualizing, specifying, constructing, and documenting the artifacts of a software-intensive system.

UML 是面向对象软件工程使用的统一建模语言,是一种图形化的语言,主要以图形方式表示。是一种开放的标准。

结合一个例子分析建模生物四项基本原则

假设要建立一个企业职工信息管理系统。

  1. 选择合适的模型:在需求分析时使用用例图可以更加快速地表达出要求
  2. 模型的精度对不同的对象是不一样:程序员使用的模型比对客户展示的模型更加复杂
  3. 模型与现实相一致:建立的模型需要完全贴合要求
  4. 同时建立多个模型:在需求分析、数据库建立中都会有不同的模型