本章目的主要是介绍软件工程和提供理解本书剩余部分的框架。阅读本章时将会:
1. 专业软件开发
2. 软件工程伦理
3. 案例学习
没有软件,现实世界无法运转。国家基础设施和公共事业都是被基于计算机的系统控制,而且许多电子产品都有计算机或控制软件。工业生产和分布都是完全计算机化的,就像金融系统一样。娱乐,包括音乐产业、电脑游戏、电影和电视都是软件密集区。因此,软件工程是国家和国际社会的运行必不可少的。
软件系统是抽象和无形的。不被材料属性限制,不受物理规则或生产过程约束。这使得软件工程得以简化,因为软件的发展潜能不受自然的约束。然而,因为物理限制的缺失,软件系统会很快变得非常复杂,很难理解且不易改变。
有许多不同类型的软件系统,从简单的嵌入式系统到复杂的、宽泛的信息系统。为软件工程寻求统一的标记、方法或技术是没有意义的,因为不同类型的软件需要不同的方法。开发一套组织化信息系统是完全不同于开发一个针对科学仪器的控制器。这些系统与图形化密集的电脑游戏也无过多共同之处。所有的这些应用都需要软件工程,但是它们不需要相同的软件工程技术。
现在仍然有许多关于软件故障和软件失效的报告。软件工程因此被批,认为对于现代的软件开发是不够的。然而,在我看来,许多这些所谓的软件故障是两个因素的结果:
软件工程可为其成绩而骄傲。当然,在开发复杂的软件时还有很多问题!但是,没有软件工程,我们无法探索太空,不可能有网络或现代的电话通信。所有形式的出行都将更加危险和昂贵。软件工程已经贡献了很多,而且我相信在21世纪它将做出更多的贡献!
软件工程的历史
软件工程的概念在1968年的一次讨论软件危机(Naur和Randell,1969)的会议上首次被提出。很明显,个人化的编程方法无法放大应用到更大和更复杂的软件系统中。这些系统不可靠,花费要比预期更高,而且交付更迟缓!
20世纪70年代到80年代间,大量新的软件工程技术和方法被开发,例如结构化编程、信息隐藏和面向对象开发。工具和标准概念都被开发而且现在都被广泛使用。
许多人编写程序。业务人员编写电子制表程序简化他们的工作,科学家和工程师编写程序处理他们的实验数据,业余爱好者编写程序为了他们自己的爱好和乐趣。然而,绝大多数的软件开发都是专业活动,软件被开发用于特定的商业目的,用于植入到其他设备或作为软件产品如信息系统、CAD系统等。专业软件,被不同于开发者的其他用户使用,通常被团队而非个人开发。终身被维护和修改。
软件工程目的是支持专业软件开发,而非个人编程。包括支持程序说明、设计和进化的技术,这些技术与个人软件开发并无正常相关性。为了帮助你获得软件工程是关于什么的一个大概的理解,我总结了一些常被问及的问题在图1.1中。
许多人简单地认为软件就是计算机软件的代名词。然而,当我们论及软件工程时,软件不仅是程序自身,也包括使这些程序正常运行的所有相关的文档和配置数据。一个专业地被开发的软件系统经常不只是一个单独的程序。系统通常由许多独立的程序和用于设置这些程序的配置文件组成。可能包括系统文档,描述了系统的结构;用户文档,解释了如何使用系统,以及用户下载最近的产品信息的网站。
这是专业和业余软件开发最重要的一点差异。如果你是为自己编写程序,没人将会使用而且你不用担心编写程序指南、记录程序设计等。然而,如果你是编写其他人将会使用而且其他工程师将会改变的软件,通常要提供额外的信息正如程序源码一样。
软件工程师关注于开发软件产品(如被卖给顾客的软件)。有两类软件产品:
两类软件最重要的差异就是,对于一般产品,开发软件的组织控制软件说明。对于订制化产品,说明通常是被购买该软件的组织开发和控制。软件开发人员必须依照该说明办事。
然而,这些产品类型的差异逐渐变得模糊。越来越多的系统采用一般产品作为基础,然后被适配满足顾客的需求。企业资源规划(Enterprise Resource Planning:ERP)系统,例如SAP系统,是这种方式的最好例子。通过合并有关业务规则和流程,以及各种报表信息等,使得一个庞大和复杂的系统适用于一家公司。
当我们论及专业软件质量时,要考虑到软件是被开发人员之外的人使用和改变的。因此,质量不仅仅关注软件做什么。当然也包括软件执行时的行为和系统程序的结构与组织以及相关的文档。这反映在所谓的质量或非功能性软件属性中。这些属性的例子就是软件的用户请求响应时间以及程序代码的可理解性。
对于软件系统期望的属性集合明显依赖于它的应用。因此,银行系统必须安全,交互式游戏必须响应及时,电话交互系统必须可靠等等。这些属性可被概括到图表1.2展示的属性集合中,我相信这是专业软件系统基本的属性。
软件工程是一门工程学科,关注于软件产品从早期的系统说明阶段到投入使用后的维护阶段的方方面面。在定义中,有两个关键词:
工程是关于在计划和预算内,获得要求的质量的结果。这经常需要妥协———工程师不能是完美主义者。然而,为自己写程序的人,在软件开发中可以如其所愿的花费时间。
一般而言,软件工程师在工作中采用系统和组织化的方法,因为这是生产高质量软件最有效的方式。然而,工程就是关于对于一系列情况选择最合适的方法,所以更具创造性、更少形式的方法对于开发在有些情况下可能非常高效。更少形式的开发尤其适用于基于Web的系统开发,它要求软件和图形设计技巧混合。
软件工程是非常重要的,原因有二:
在软件工程中使用的系统的方式有时被称为软件过程。软件过程就是通向软件产品生产的一系列活动。对于所有的软件过程,有四种基础的活动。就是:
不同类型的系统需要不同的开发过程。例如,飞机上的实时软件在开发之前必须被完整地说明。在电子商务系统中,说明和程序通常一起被开发。因此,这些通用的活动可能会以不同的方式被组织和在不同详细水平上被描述,主要依赖于被开发的软件类型。我会在第2章更具体的描述软件过程。
软件工程和计算机科学和系统工程都是相关的:
正如我要在下节讨论的,有许多不同的软件类型。没有通用的软件工程方法或技术可应用到所有的软件中。然而,有三种通用的问题可能影响到不同的软件类型:
当然,这些不是独立的问题。例如,快速地改变旧系统,使用web服务接口提供服务是必须的。为了处理这些挑战,我们需要新的工具和技术以及融合与使用现有的软件工程方法的创新举措。
软件工程是软件生产的系统化方式,考虑实际成本、时间表、可靠性等因素,以及客户和生产者的需求。系统化方式如何被实施依赖于开发软件的组织、软件类型和开发过程中涉及的人。没有通用的软件工程方法和技术适用于所有的系统和公司。而且,多元的软件工程方法和工具已经演化了超过50年。
决定哪些软件工程方法和技术是最重要的最主要的因素可能就是将被开发的应用的类型。有许多不同类型的应用,包括:
当然,这些类型的系统之间的界限是很模糊的。如果开发个手机游戏,作为手机软件开发者要考虑相同的约束(电量、硬件交互)。批处理系统经常被用在基于web的系统上。例如,在公司中,差旅费报销可能通过web应用提交,但是由批应用处理以便按月支付。
对于每种类型的系统,要使用不同的软件工程技术,因为软件都有不同的特性。例如,汽车中的嵌入式控制系统对安全要求很严格,而且当被安装到车辆中时要烧进ROM中。因此改变起来非常昂贵。这样的系统需要非常昂贵的验证与确认,以便在汽车售出之后重新召回以修复软件问题的机会最低。用户交互很少(甚至可能不存在),所以不需要使用使用依赖于用户接口原型的开发过程。
对于基于web的系统,随着系统被可重用的组件组合,基于迭代开发和交付的方式可能就比较合适。然而,这样的方式对于集成系统可能就有些不切实际了。在集成系统中,系统交互的详细说明必须要提前制定以便每个系统都能独立地被开发。
话虽如此,还是有些软件工程基础原理能应用到所有类型的软件系统中:
这些基础的过程概念,可靠性、需求、管理以及重用都是本书的中重要主题。不同的方法以不同的方式表达它们,但它们都是专业软件开发的基础。
你应该注意到了这些基础原理并不涉及实现和编程。在本书中我没有涉及到特定的编程技术因为不同类型的系统相距甚殊。例如,脚本语言如Ruby被用于基于web的系统编程但是完全不适用于嵌入式系统工程。
万维网的开发对我们的生活的各个方面都有深刻的影响。最初,Web主要是个普遍可访问信息仓库而且对软件系统影响很小。这些系统运行在本地计算机上而且仅可从组织内部访问。大约2000年左右,Web开始发展而且越来越多的功能被添加到浏览器上。这意味着基于web的系统可能会被开发,取代特殊用途的用户接口,这些系统可被使用web浏览器访问。这导致了大量提供创新服务、可通过web访问的新系统产品的开发。这些产品经常被展示在用户屏幕而不涉及直接从用户收费的广告提供资金支持。
与这些系统产品一样,可运行小程序和做些局部处理的web浏览器的开发促进了商业和组织软件的进化。代之编写软件和部署到用户的PC机上,这些软件被部署到web服务器上。这使得改变和升级软件更实惠,因为不需要安装软件到每台PC上。也减少了花费,因为用户接口开发是非常昂贵的。因此,无论什么环境都可以这样做,许多业务使用公司软件系统已经迁移到基于web的交互了。
基于web的系统的开发的下一阶段就是web服务的概念。web服务是实现特定、有用的功能而且可通过web访问的软件组件。应用是通过集成这些可被不同公司提供的web服务构建而成的。原则上,链接可以是动态的以便应用每次可以使用不同的要被执行的web服务。我在第19章提及到这个方法用于软件开发。
在最近几年,“软件即服务”的概念被开发。它提议软件一般将不会运行在本地计算机而是在可通过互联网访问的计算云上。。如果使用服务如基于web的邮箱,你就是在使用一个基于云的系统。一个计算云就是大量互相关联的被许多用户共享的计算机系统。用户并不购买软件而是根据他们的使用程度付费,或者免费访问作为观看展示在他们屏幕上的广告的回报。
因此,web的出现引起了商业软件组织化的显著变化。web出现之前,商业应用主要是庞大、单独的应用,运行在单独的计算机或计算机簇上。在组织之内,通信都是本地的。现在,软件是高度分布式的,有时可能跨越全世界。商业应用不是被随便编写而是包含了组件和程序的广泛的重用。
软件组织的巨变,很明显地导致了基于web的系统的改变就是设计。例如:
软件工程的基本思想,在之前的章节已讨论过,可以以应用到其他类型的软件系统中的方式应用到基于web的软件。在20世纪,大型系统开发经验还是与基于web的软件相关。
像其他工程学科一样,软件工程在社会和法律的框架内被实现,该框架限制了人在所处区域的行为的自由。作为一个软件工程师,你必须接受你的工作包含了更广泛的责任而非简单的技术能力的应用。你必须以一种伦理和道德的负责任的方式行为,如果你想作为一个专业的工程师被尊重的话。
不言而喻,你应该坚守诚实和正直的一般标准。不应以一种不诚实或会给软件工程专业带来不好名声的方式使用你的技术和能力。然而,在一些方面,可接受行为的标准不受法律而是而是更多的无力的专业责任的概念的约束。如下:
专业的团体和单位在设置伦理标准中扮演着重要的角色。组织如ACM、IEEE(Institute of Electrical and Electronic Engineers)和英国计算机协会发布了职业道德或道德规范的标准。这些组织的成员承诺遵守这些规范当他们注册会员身份时。这些道德规范一般关注于基本的伦理行为。
职业协会,尤其是ACM和IEEE,都曾经合作生成一套共同的道德规范和行业准则。规范以短与长两种形式存在,前者如表1.3所示,后者在短版本上添加了详情和内容。规范背后的基本原理在长形式的前两段被总结:
计算机在商业、工业、政府、医药、教育、娱乐及全社会中都扮演着核心和增长的角色。软件工程师就是通过直接参与或教学的方式贡致力于分析、说明、设计、开发、认证、维护和软件系统的测试。因为他们在软件系统开发中的角色,软件工程师有重要的机会做好事或导致危害,使得或影响他人做好事或导致危害。为了尽可能的确保他们的努力被用于做好事,软件工程师必须承诺使得软件工程成为一个有益的和受尊重的职业。依照承诺,软件工程师必须坚持遵守道德规范和职业准则。
规范包含八项与行为相关的准则和被专业软件工程师制定的决策。这些专业的软件工程师包括实践者、教育者、管理者、主管和决策者,以及该专业的实习生和学生。准则确定了个人、小组和组织参与的道德责任关系以及关系内部的主要义务。每项准则的条款都是包含了这些关系的义务的插图。这些义务存在于软件工程师的人性当中,