软件是计算机系统中与硬件相互依存的另一部分,它是包括程序、数据及其相关文档的完整集合。其中,程序是按事先设计的功能和性能要求执行的指令序列;数据是使程序能正常操纵信息的数据结构;文档是与程序开发、维护和使用有关的图文资料。
软件是逻辑部件,相对传统的工业产品,具有其独特性,主要表现在以下方面:
(1)软件是一种逻辑实体,而不是具体的物理实体。因而它具有抽象性。这个特点使它和计算机硬件或其他工程对象有明显的差别。人们可以把它记录在介质上,但却无法看到软件的形态,必须通过观察、分析、思考、判断,去了解它的功能、性能及其他特性。
(2)软件的生产与硬件不同,它没有明显的制造过程。也不象硬件那样,一旦研制成功,可以重复制造,并在制造过程中进行质量控制,以保证产品的质量。而软件是通过人们的智力活动,把知识与技术转化成信息的一种产品。一旦某一软件项目研制成功,就可以大量地复制同一内容的副本。所以控制软件的质量,必须着重在软件开发方面下功夫。
(3)在软件的运行和使用期间,没有硬件那样的机械磨损和老化问题。在软件研制成功后,为了改正软件中的错误和弥补缺陷、提升软件功能和性能、适应环境变化,需要持续对软件进行改进和完善,所以软件的维护比硬件的维护要复杂得多,与硬件的维修有着本质的差别。
(4)软件的开发和运行常常受计算机系统的限制,它对计算机系统有着不同程度的依赖。软件不能完全摆脱硬件单独活动,在软件的开发和运行中必须以硬件提供的条件为依据。有的软件依赖于某个操作系统,为了消除这种依赖性,软件开发人员在软件开发中提出了软件移植的问题,并且把软件的可移植性作为衡量软件质量的因素之一。
(5)软件的开发至今尚未完全摆脱手工艺的开发方式。由于传统的手工艺开发方式仍然占据统治地位,开发的效率自然受到很大的限制。为此,人们在软件技术方面做了许多卓有成效的工作,提出了许多新的开发方法,如充分利用现成软件的复用技术、自动生成技术,也研制了一些有效的软件开发工具或软件开发环境。
(6)软件本身是复杂的。软件的复杂性可能来自它所反映的实际问题的复杂性,也可能来自程序逻辑结构的复杂性。软件开发,特别是应用软件的开发常常涉及其他领域的专业知识,这对软件开发人员提出了很高的要求。
(7)软件成本昂贵。软件的研制工作需要投入大量的、复杂的、高强度的脑力劳动,它的成本比较高。而且,也并非在所有的软件开发都能成功。
(8)许多软件工作涉及社会因素。许多软件的开发和运行涉及机构、体制及管理方式等问题,甚至涉及人们的传统观念和心理问题,这些问题直接影响项目的成败。