软件工程-第一章 介绍

目标

本章目的主要是介绍软件工程和提供理解本书剩余部分的框架。阅读本章时将会:

  • 理解软件工程是什么以及为什么很重要
  • 理解不同类型软件系统的开发可能需要不同的软件工程技术
  • 理解一些对于软件工程师很重要的伦理和专业问题
  • 已被介绍的三种不同类型的系统,将作为案例在全书使用

内容


1. 专业软件开发
2. 软件工程伦理
3. 案例学习

没有软件,现实世界无法运转。国家基础设施和公共事业都是被基于计算机的系统控制,而且许多电子产品都有计算机或控制软件。工业生产和分布都是完全计算机化的,就像金融系统一样。娱乐,包括音乐产业、电脑游戏、电影和电视都是软件密集区。因此,软件工程是国家和国际社会的运行必不可少的。

软件系统是抽象和无形的。不被材料属性限制,不受物理规则或生产过程约束。这使得软件工程得以简化,因为软件的发展潜能不受自然的约束。然而,因为物理限制的缺失,软件系统会很快变得非常复杂,很难理解且不易改变。

有许多不同类型的软件系统,从简单的嵌入式系统到复杂的、宽泛的信息系统。为软件工程寻求统一的标记、方法或技术是没有意义的,因为不同类型的软件需要不同的方法。开发一套组织化信息系统是完全不同于开发一个针对科学仪器的控制器。这些系统与图形化密集的电脑游戏也无过多共同之处。所有的这些应用都需要软件工程,但是它们不需要相同的软件工程技术。

现在仍然有许多关于软件故障和软件失效的报告。软件工程因此被批,认为对于现代的软件开发是不够的。然而,在我看来,许多这些所谓的软件故障是两个因素的结果:

  1. 增长的需求:因为新的软件工程技术帮助我们构建更大、更复杂的系统,用户需求也不断随之变化。系统必须快速构建和交付;需要更大甚至更复杂的系统;系统要具备之前被认为不可能的能力。已存在的软件工程方法无法处理,新的软件工程技术必须被开发满足这些新的需求。
  2. 过低的期待:不使用软件工程方法和技术编写计算机程序是很容易的。许多公司因为软件和服务需要升级,已经在软件开发中随风漂泊了。他们在日常工作中没有使用软件工程方法。因此,他们的软件经常是更昂贵且更不可靠。我们需要更好的软件工程教育和培训处理这些问题。

软件工程可为其成绩而骄傲。当然,在开发复杂的软件时还有很多问题!但是,没有软件工程,我们无法探索太空,不可能有网络或现代的电话通信。所有形式的出行都将更加危险和昂贵。软件工程已经贡献了很多,而且我相信在21世纪它将做出更多的贡献!

软件工程的历史

软件工程的概念在1968年的一次讨论软件危机(Naur和Randell,1969)的会议上首次被提出。很明显,个人化的编程方法无法放大应用到更大和更复杂的软件系统中。这些系统不可靠,花费要比预期更高,而且交付更迟缓!

20世纪70年代到80年代间,大量新的软件工程技术和方法被开发,例如结构化编程、信息隐藏和面向对象开发。工具和标准概念都被开发而且现在都被广泛使用。

专业软件开发

许多人编写程序。业务人员编写电子制表程序简化他们的工作,科学家和工程师编写程序处理他们的实验数据,业余爱好者编写程序为了他们自己的爱好和乐趣。然而,绝大多数的软件开发都是专业活动,软件被开发用于特定的商业目的,用于植入到其他设备或作为软件产品如信息系统、CAD系统等。专业软件,被不同于开发者的其他用户使用,通常被团队而非个人开发。终身被维护和修改。

软件工程目的是支持专业软件开发,而非个人编程。包括支持程序说明、设计和进化的技术,这些技术与个人软件开发并无正常相关性。为了帮助你获得软件工程是关于什么的一个大概的理解,我总结了一些常被问及的问题在图1.1中。

软件工程-第一章 介绍_第1张图片

许多人简单地认为软件就是计算机软件的代名词。然而,当我们论及软件工程时,软件不仅是程序自身,也包括使这些程序正常运行的所有相关的文档和配置数据。一个专业地被开发的软件系统经常不只是一个单独的程序。系统通常由许多独立的程序和用于设置这些程序的配置文件组成。可能包括系统文档,描述了系统的结构;用户文档,解释了如何使用系统,以及用户下载最近的产品信息的网站。

这是专业和业余软件开发最重要的一点差异。如果你是为自己编写程序,没人将会使用而且你不用担心编写程序指南、记录程序设计等。然而,如果你是编写其他人将会使用而且其他工程师将会改变的软件,通常要提供额外的信息正如程序源码一样。

软件工程师关注于开发软件产品(如被卖给顾客的软件)。有两类软件产品:

  1. 一般产品:这是些被开发组织生产的独立系统而且在开放市场出售给任何能买得起的顾客。这类产品包括PC软件如数据库、文字处理软件、绘图软件和项目管理工具。也包括针对特定目的设计的所谓的垂直应用,比如库信息系统、账号系统或维护牙科病历的系统。
  2. 定制(或定做)产品:这些系统是受特殊的顾客委托。软件承包商专门为该顾客开发软件。这类软件包括电子设备的控制系统、支持特殊商务处理的系统和空中交通控制系统。

两类软件最重要的差异就是,对于一般产品,开发软件的组织控制软件说明。对于订制化产品,说明通常是被购买该软件的组织开发和控制。软件开发人员必须依照该说明办事。

然而,这些产品类型的差异逐渐变得模糊。越来越多的系统采用一般产品作为基础,然后被适配满足顾客的需求。企业资源规划(Enterprise Resource Planning:ERP)系统,例如SAP系统,是这种方式的最好例子。通过合并有关业务规则和流程,以及各种报表信息等,使得一个庞大和复杂的系统适用于一家公司。

当我们论及专业软件质量时,要考虑到软件是被开发人员之外的人使用和改变的。因此,质量不仅仅关注软件做什么。当然也包括软件执行时的行为和系统程序的结构与组织以及相关的文档。这反映在所谓的质量或非功能性软件属性中。这些属性的例子就是软件的用户请求响应时间以及程序代码的可理解性。

对于软件系统期望的属性集合明显依赖于它的应用。因此,银行系统必须安全,交互式游戏必须响应及时,电话交互系统必须可靠等等。这些属性可被概括到图表1.2展示的属性集合中,我相信这是专业软件系统基本的属性。

软件工程-第一章 介绍_第2张图片

软件工程

软件工程是一门工程学科,关注于软件产品从早期的系统说明阶段到投入使用后的维护阶段的方方面面。在定义中,有两个关键词:

  1. 工程学科:工程师应用相应的理论、方法和工具使得事物工作。然而,他们选择性地使用它们。甚至当没有可应用的理论和方法时,不断尝试发现问题的解决方案。工程师也认识到他们必须依照组织和经济的约束,以便在这些约束之内需求解决方案。
  2. 软件产品方方面面:软件工程不仅关注于软件开发的技术流程。也包括诸如软件项目管理和工具开发等活动,以及支持软件产品的方法和理论。

工程是关于在计划和预算内,获得要求的质量的结果。这经常需要妥协———工程师不能是完美主义者。然而,为自己写程序的人,在软件开发中可以如其所愿的花费时间。

一般而言,软件工程师在工作中采用系统和组织化的方法,因为这是生产高质量软件最有效的方式。然而,工程就是关于对于一系列情况选择最合适的方法,所以更具创造性、更少形式的方法对于开发在有些情况下可能非常高效。更少形式的开发尤其适用于基于Web的系统开发,它要求软件和图形设计技巧混合。

软件工程是非常重要的,原因有二:

  1. 越来越多的个人和设备依赖于先进的软件系统,我们需要能够经济而又快速地生产稳定可用的系统。
  2. 从长远来看,针对软件系统,使用软件工程方法和技术要比犹如个人程序一般编写程序更加划算。对于大部分的软件,主要的费用就是投入使用后修改软件的花费。

在软件工程中使用的系统的方式有时被称为软件过程。软件过程就是通向软件产品生产的一系列活动。对于所有的软件过程,有四种基础的活动。就是:

  1. 软件说明:顾客和工程师定义将被生产的软件和操作限制。
  2. 软件开发:软件被设计和编程。
  3. 软件有效性验证:软件被检查确保是用户要求的。
  4. 软件进化:软件被修改以反映变化的顾客和市场需求。

不同类型的系统需要不同的开发过程。例如,飞机上的实时软件在开发之前必须被完整地说明。在电子商务系统中,说明和程序通常一起被开发。因此,这些通用的活动可能会以不同的方式被组织和在不同详细水平上被描述,主要依赖于被开发的软件类型。我会在第2章更具体的描述软件过程。

软件工程和计算机科学和系统工程都是相关的:

  1. 计算机科学关注于构成计算机和软件系统基础的理论和方法,然而软件工程关注于软件生产的实践问题。有些计算机科学方面的知识对于软件工程是必不可少的,同样地有些物理知识对于电子工程也是必不可少的。然而,计算机科学理论经常最适用于相对较小的程序。计算机科学的雅正说不能总是应用到要求软件解决方案的庞大,复杂的问题上。
  2. 系统工程关注于复杂系统的开发和进化的所有方面。在该系统中软件扮演着主要角色。因此系统工程关注于硬件开发、政策和流程设计以及系统部署,也包括软件工程。系统工程师涉及定义系统和它的整体架构,然后集成不同的部分创建和完成系统。它们较少关注于系统组件(硬件、软件等)的工程问题。

正如我要在下节讨论的,有许多不同的软件类型。没有通用的软件工程方法或技术可应用到所有的软件中。然而,有三种通用的问题可能影响到不同的软件类型:

  1. 异质性:系统不断被要求如分布式系统一般基于网络操作,网络中包含不同类型的计算机和移动设备。有些软件不仅运行到通用计算机上,可能也会运行到移动手机上。你经常要把新的软件集成到使用不同编程语言编写的旧的系统中。挑战就是开发技术,构建可靠软件,充分灵活应对异质性。
  2. 业务和社会变化:业务和社会快速的变化犹如新兴经济之发展和新技术之可用。他们需要能够改变已存在的软件并快速地开发新的软件。许多传统的软件工程技术是很耗时的而且新的系统经常花费比预期更多的时间才能交付。他们需要进化以便减少用户要求的软件交付时间。
  3. 安全和信任:因为软件与我们的生活息息相关,软件可信是必要的。对于通过Web界面或Web服务接口被访问的远程软件系统尤是如此。要确保恶意用户无法攻击我们的软件而且保证信息安全。

当然,这些不是独立的问题。例如,快速地改变旧系统,使用web服务接口提供服务是必须的。为了处理这些挑战,我们需要新的工具和技术以及融合与使用现有的软件工程方法的创新举措。

软件工程多元化

软件工程是软件生产的系统化方式,考虑实际成本、时间表、可靠性等因素,以及客户和生产者的需求。系统化方式如何被实施依赖于开发软件的组织、软件类型和开发过程中涉及的人。没有通用的软件工程方法和技术适用于所有的系统和公司。而且,多元的软件工程方法和工具已经演化了超过50年。

决定哪些软件工程方法和技术是最重要的最主要的因素可能就是将被开发的应用的类型。有许多不同类型的应用,包括:

  1. 独立应用:这些是运行在本地计算机如PC上的应用系统。它们包含所有必须的功能,而且不需要联网。这种软件的例子就是PC上的办公软件、CAD程序、图片处理软件等。
  2. 以业务为基础的交互式应用:这些是运行在远程计算机而且可被用户通过PC或终端访问的应用。很明显,这些应用包括web应用如电子商务应用,可以与软件系统交互,购买商品和服务。也包括业务系统,业务通过web浏览器或专用客户端程序和基于云的服务访问系统,例如邮件和图片共享。交互式应用经常包含大量的数据存储,每次交易都要访问和更新。
  3. 嵌入式控制系统:这是些控制和管理设备的软件控制系统。单从数量上来说,嵌入式系统可能要比其他类型的系统更多。嵌入式系统的例子包括移动手机中的软件、汽车上的控制防抱死制动的软件以及微波炉中控制蒸煮过程的软件。
  4. 批处理系统:这是些被设计用于处理大批量数据的业务系统。它们处理大量的个性化的输入创建对应的输出。批处理系统的例子包括周期性计费系统,如电话计费系统和薪酬系统。
  5. 娱乐系统:这是些主要针对个人使用而且目的在于娱乐用户的系统。大部分都是一种或另一种的游戏。被提供的用户交互质量是娱乐系统最重要的明显特征。
  6. 建模与仿真系统:这是些被科学家和工程师开发用于建模物理过程或情境的系统,包括许多独立的、相互影响的对象。是计算密集型的,而且要求高性能并行系统才能运行。
  7. 数据收集系统:这是些使用一系列传感器从环境中读取数据并发送到其他系统处理的系统。该软件要与传感器打交道而且经常被安装到不利的环境如发动机里或边远地区。
  8. 集成系统:这是些由许多其他软件系统组合而成的系统。它们有些是一般的软件产品,如电子制表程序。有些是专门针对环境编写的。

当然,这些类型的系统之间的界限是很模糊的。如果开发个手机游戏,作为手机软件开发者要考虑相同的约束(电量、硬件交互)。批处理系统经常被用在基于web的系统上。例如,在公司中,差旅费报销可能通过web应用提交,但是由批应用处理以便按月支付。

对于每种类型的系统,要使用不同的软件工程技术,因为软件都有不同的特性。例如,汽车中的嵌入式控制系统对安全要求很严格,而且当被安装到车辆中时要烧进ROM中。因此改变起来非常昂贵。这样的系统需要非常昂贵的验证与确认,以便在汽车售出之后重新召回以修复软件问题的机会最低。用户交互很少(甚至可能不存在),所以不需要使用使用依赖于用户接口原型的开发过程。

对于基于web的系统,随着系统被可重用的组件组合,基于迭代开发和交付的方式可能就比较合适。然而,这样的方式对于集成系统可能就有些不切实际了。在集成系统中,系统交互的详细说明必须要提前制定以便每个系统都能独立地被开发。

话虽如此,还是有些软件工程基础原理能应用到所有类型的软件系统中:

  1. 它们应当使用被托管和充分理解的开发过程开发。软件开发组织应当计划开发过程并清楚地知道将生产什么东西以及什么时候完成。当然,不同的过程被应用于不同类型的软件。
  2. 对于所有类型的系统,可靠性和性能都是非常重要的。软件应当如预期一般工作,没有失败而且被用户使用时应当可用。它的操作应该很安全而且尽可能的保护软件免受外部攻击的威胁。系统应该高效地工作而且不浪费资源。
  3. 理解和管理软件说明和需求(这是软件应该做的)很重要。你要了解不同的系统客户和用户对系统的期望并对之管理,以便一个有用的系统能在预算和预期内交付。
  4. 应该尽可能高效的利用已存在的资源。这意味着你应该适当地重用已被开发的软件而非重写编写新的软件。

这些基础的过程概念,可靠性、需求、管理以及重用都是本书的中重要主题。不同的方法以不同的方式表达它们,但它们都是专业软件开发的基础。

你应该注意到了这些基础原理并不涉及实现和编程。在本书中我没有涉及到特定的编程技术因为不同类型的系统相距甚殊。例如,脚本语言如Ruby被用于基于web的系统编程但是完全不适用于嵌入式系统工程。

软件工程和Web

万维网的开发对我们的生活的各个方面都有深刻的影响。最初,Web主要是个普遍可访问信息仓库而且对软件系统影响很小。这些系统运行在本地计算机上而且仅可从组织内部访问。大约2000年左右,Web开始发展而且越来越多的功能被添加到浏览器上。这意味着基于web的系统可能会被开发,取代特殊用途的用户接口,这些系统可被使用web浏览器访问。这导致了大量提供创新服务、可通过web访问的新系统产品的开发。这些产品经常被展示在用户屏幕而不涉及直接从用户收费的广告提供资金支持。

与这些系统产品一样,可运行小程序和做些局部处理的web浏览器的开发促进了商业和组织软件的进化。代之编写软件和部署到用户的PC机上,这些软件被部署到web服务器上。这使得改变和升级软件更实惠,因为不需要安装软件到每台PC上。也减少了花费,因为用户接口开发是非常昂贵的。因此,无论什么环境都可以这样做,许多业务使用公司软件系统已经迁移到基于web的交互了。

基于web的系统的开发的下一阶段就是web服务的概念。web服务是实现特定、有用的功能而且可通过web访问的软件组件。应用是通过集成这些可被不同公司提供的web服务构建而成的。原则上,链接可以是动态的以便应用每次可以使用不同的要被执行的web服务。我在第19章提及到这个方法用于软件开发。

在最近几年,“软件即服务”的概念被开发。它提议软件一般将不会运行在本地计算机而是在可通过互联网访问的计算云上。。如果使用服务如基于web的邮箱,你就是在使用一个基于云的系统。一个计算云就是大量互相关联的被许多用户共享的计算机系统。用户并不购买软件而是根据他们的使用程度付费,或者免费访问作为观看展示在他们屏幕上的广告的回报。

因此,web的出现引起了商业软件组织化的显著变化。web出现之前,商业应用主要是庞大、单独的应用,运行在单独的计算机或计算机簇上。在组织之内,通信都是本地的。现在,软件是高度分布式的,有时可能跨越全世界。商业应用不是被随便编写而是包含了组件和程序的广泛的重用。

软件组织的巨变,很明显地导致了基于web的系统的改变就是设计。例如:

  1. 软件重用已经成为构建基于web的系统的明显方式。构建这些系统时,要思考如何能够从预存在的软件组件和系统中集成它们。
  2. 现在普遍地都意识到了对于这样的系统提前提出所有的需求示不切实际的。基于web的系统应该能够被增量地开发和交付。
  3. 用户接口被web浏览器的能力约束。虽然如AJAX等技术意味着丰富的接口可在浏览器内创建,但这些技术使用起来还是存在困难。使用本地脚本的web表单是更常用的。基于web的系统的应用接口经常要比PC系统产品上的特殊设计的用户接口更难得。

软件工程的基本思想,在之前的章节已讨论过,可以以应用到其他类型的软件系统中的方式应用到基于web的软件。在20世纪,大型系统开发经验还是与基于web的软件相关。

软件工程伦理

像其他工程学科一样,软件工程在社会和法律的框架内被实现,该框架限制了人在所处区域的行为的自由。作为一个软件工程师,你必须接受你的工作包含了更广泛的责任而非简单的技术能力的应用。你必须以一种伦理和道德的负责任的方式行为,如果你想作为一个专业的工程师被尊重的话。

不言而喻,你应该坚守诚实和正直的一般标准。不应以一种不诚实或会给软件工程专业带来不好名声的方式使用你的技术和能力。然而,在一些方面,可接受行为的标准不受法律而是而是更多的无力的专业责任的概念的约束。如下:

  1. 机密性:应该正常地尊重你的雇主或客户的机密,不管是否签署了保密协议。
  2. 能力胜任:不应歪曲自己的能力水平。不应故意接收能力范围之外的任务。
  3. 知识产权:应意识到本地法律支配着知识产权如专利和著作权。应仔细确保雇主和客户的知识产权收到保护。
  4. 计算机滥用:不应使用技术能力滥用他人的计算机。计算机滥用范围包括从相对不重要(在雇主计算机上玩游戏)到极度严重(病毒和其他恶意软件的传播)。

专业的团体和单位在设置伦理标准中扮演着重要的角色。组织如ACM、IEEE(Institute of Electrical and Electronic Engineers)和英国计算机协会发布了职业道德或道德规范的标准。这些组织的成员承诺遵守这些规范当他们注册会员身份时。这些道德规范一般关注于基本的伦理行为。

职业协会,尤其是ACM和IEEE,都曾经合作生成一套共同的道德规范和行业准则。规范以短与长两种形式存在,前者如表1.3所示,后者在短版本上添加了详情和内容。规范背后的基本原理在长形式的前两段被总结:

计算机在商业、工业、政府、医药、教育、娱乐及全社会中都扮演着核心和增长的角色。软件工程师就是通过直接参与或教学的方式贡致力于分析、说明、设计、开发、认证、维护和软件系统的测试。因为他们在软件系统开发中的角色,软件工程师有重要的机会做好事或导致危害,使得或影响他人做好事或导致危害。为了尽可能的确保他们的努力被用于做好事,软件工程师必须承诺使得软件工程成为一个有益的和受尊重的职业。依照承诺,软件工程师必须坚持遵守道德规范和职业准则。

规范包含八项与行为相关的准则和被专业软件工程师制定的决策。这些专业的软件工程师包括实践者、教育者、管理者、主管和决策者,以及该专业的实习生和学生。准则确定了个人、小组和组织参与的道德责任关系以及关系内部的主要义务。每项准则的条款都是包含了这些关系的义务的插图。这些义务存在于软件工程师的人性当中,

案例





你可能感兴趣的:(软件工程,软件工程)