认识软件与软件工程--软件工程学习之路2

来源:互联网 发布:视频播放插件video.js 编辑:程序博客网 时间:2024/05/22 04:58

软件工程第二节课,主要内容是认识软件和工程,那么问题来了:

什么是软件?

首先要确定的是,软件不仅仅是程序。

软件(Software):一组对象或项目所形成的一个“配置”,由程序、文档和数据等部分构成。
– 程序(program):可被计算机硬件理解并执行的一组指令,提供期望的功能和性能;
– 数据(data structure):程序能正常操纵信息的数据结构;
– 文档(document):与程序开发、维护和使用有关的图文材料

    我认为:从本质上讲,软件就是程序的集合体,但软件远远高于程序这个“个体”的价值,以树为例说明,他们的关系就如同树和树叶
软件的目标是解决用户的问题,他的基础就是用户,用户就是树下的泥土。没有用户就没有软件。只有当用户出现了并提出了要求(种子),软件顺势而出。即,用户是基础。要成为成熟的软件,必须要不断满足用户的需求和并逐渐完善程序。在编程这个过程中,一方面,必须以用户的需求为准,这就相当于树的枝干,遵守YAGNI(you ain’t gonna need it)原则,没必要的功能不需要增加。(想想脱离树干的树叶的最终结果吧= =);另一方面,软件必须要可理解。无论你是编完软件就走还是要一直维护这个软件,你想要他持续有用就必须添加必要的注释和文档,这就相当于树叶的叶柄,它是连接树叶与树叶,树叶与树干的必要结构。
扯远了,总的来说软件就是:用户提出的,以实现某个(人力不好或不易实现的)需求为目标的程序的集合体。

软件的特征

复杂性(complexity)
– 软件要解决的现实问题通常很复杂,数据、状态、逻辑关系的可能组合导致了软件本身的复杂性;
– 软件无法以“ 制造” 的方式被生产,只能采用手工开发方式, 这是一种人为、抽象化的智能活动(智力密集型),与人的水平密切相关,人类思维的不确定性导致了开发过程的复杂性;
不可见性(invisibility)
– 尚未完成的软件是看不见的,无法像产品一样充分呈现其结构,使得人们在沟通上面临极大的困难,难以精确的刻画和度量。
易变性(changeability)
– 软件所应用的环境由人群、法规、硬件设备、应用领域等因素汇集而成,而这些因素皆会频繁快速的变化。
一致性(conformity)
– 各子系统的接口必须协同一致,而随着时间和环境的演变,要维持这样的一致性通常十分困难。

由上可看出,软件的特征使软件很难有一个类似于数理化的结构化的问题解决方式。因为:

  1. 软件没有一种特定的结果。无论用户的需求如何相似,软件的实现方式永远无穷无尽。
  2. 对程序员来说,未成形的软件是无法完全的去刻画的,他永远不知道用户使用时会出现什么bug。
  3. 用户是人,这就使得软件一定需要不断改变(毕竟“唯一不变的就是改变”)。人在改变,需求在改变,显然程序(软件)必须不断改变才可以。
  4. 软件并不是一种可以单独使用的东西,他必须借助硬件(电脑,手机等),软件(操作系统,编程语言,其他软件等)才可以使用,这就要求他必须提供各种各样的接口来完成用户的需求。而且这些也可能会改变。

这也就是我们学习软件工程的理由和软件工程的魅力所在。

软件工程

1968年NATO的科学委员会在德国召开的一次计算机软件国际会议上,对软件开发的方法、 技术进行了广泛的讨论,首次提出了“软件工程”的概念。
– 软件工程是为了经济的获得能够在实际机器上高效运行的可靠软件而建立和使用的一系列工程化原则;
(IEEE) 软件工程是:
– 将系统性的、规范化的、可定量的方法应用于软件的开发、运行和维护,即将工程化应用到软件上;
(国务院学位委员会) 软件工程是:
– 应用计算机科学理论和技术以及工程管理原则和方法, 按预算和进度实现满足用户要求的软件产品的定义、开发、发布和维护的工程,或以之为研究对象的学科。

mmp这都什么鬼。-_-||
我认为软件工程就是:以实现完善的,用户较为满意的软件为目标而设计的,较为通用的软件编程实现历程。在这个历程中需要使用各种工具,方法和技术就是软件工程研究的内容。当然,重点在于对程序员来说如何实现一个像样的软件。
但是用户较为满意应该如何判断呢?这就是所谓软件工程关注的目标。它分为两类:

一、功能性需求(Functional Requirements): 软件所实现的功能达到它的 设计规范和满足用户需求的程度
– 完备性: 软件能够支持用户所需求的全部功能的能力;
– 健壮性: 在异常情况下,软件能够正常运行的能力
– 可靠性:在给定的时间和条件下,软件能够正常维持其工作而不发生故障的 能力。

二、非功能性需求(Non-Functional Requirements): 系统能够完成所期望 的工作的性能与质量
– 效率:软件实现其功能所需要的计算机资源的大小,“时间-空间”;
– 可维护性: 软件适应“变化”的能力,系统很容易被修改从而适应新的需求 或采用新的算法、数据结构的能力;
– 可移植性:软件不经修改或稍加修改就可以运行于不同软硬件环境(CPU、 OS和编译器)的能力;
– 清晰性:易读、易理解,可以提高团队开发效率,降低维护代价;
– 兼容性:不同产品相互交换信息的能力;
– 商业质量:上市时间、成本/受益、目标市场、与老系统的集成、生命周期 长短等。

显然功能性需求是基础,但是非功能性需求却决定了用户的满意程度。用我以前网站的知识来说,软件就有了两种实现方式:从下往上从上往下的编程方法。
从下往上:首先实现功能性需求,然后对完成的代码进行重构和优化,逐渐实现非功能性需求,这样的好处是可以最快的看到自己的成果,方便程序员自己和用户查看第一阶段的成就。缺点显然是第一阶段的结果必然是糟糕的,必须耗费大量的心力进行重构。唔,重构是痛苦的,以我自身的经验来看。
从上往下:首先确定所有的功能,然后挨个实现功能。在实现每个功能是时候都进行优化和完善,达到最优化的方式。这样的优点是你的功能是优秀的,但是可能要花大量的时间完成,且无法看到自己的成果。而且若出现问题必然又要花费大量时间重新实现功能。
但这仅是以我现在的经验的结论,或许之后学习软件工程的测试会改变我的想法。
或许折中是一个好的解决方案。第一期实现用户可以使用的功能性需求和用户可接受的非功能性需求,若用户不满意可以再次对特定代码进行优化和重构。

最后粘一下邹欣著的《现代软件工程 构建之法(第二版)》中介绍的学习软件工程的目标:

1、研发出符合用户需求的软件
2、通过一定的软件流程,在预计时间内发布“足够好的”软件
3、能证明所开发的软件是可以维护和继续发展的

而我的目标是:
学会整个软件的开发历程,并在学期结束前完成一个能称得上软件的程序。