标题：软件工程
简介
软件工程一直以来都缺乏一个统一的定义，很多学者、组织机构都分别给出了自己的定义：　
BarryBoehm：运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料。
IEEE：在软件工程术语汇编中的定义：软件工程是：1.将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护，即将工程化应用于软件；2.在1中所述方法的研究
FritzBauer：在NATO会议上给出的定义：建立并使用完善的工程化原则，以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。[1]
《计算机科学技术百科全书》：软件工程是应  软件工程用计算机科学、数学、逻辑学及管理科学等原理，开发软件的工程。软件工程借鉴传统工程的原则、方法，以提高质量、降低成本和改进算法。其中，计算机科学、数学用于构建模型与算法，工程科学用于制定规范、设计范型(paradigm)、评估成本及确定权衡，管理科学用于计划、资源、质量、成本等管理。[2]
比较认可的一种定义认为：软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件，以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。[3]
培养原则
软件工程领域（管理信息化方向）工程硕士应掌握从事本工程领域坚实的基础理论和宽广的专业知识，了解当代信息管理技术发展前沿、应用前景和最新发展动态，能熟练地阅读本领域的外文资料，掌握解决信息管理问题的先进技术方法和现代技术手段；具有创新意识和独立承担软件工程技术管理或信息系统管理工作的能力。
发展过程
软件是由计算机程序和程序设计的概念发展演化而来的，是在程序和程序设计发展到一定规模并且逐步商品化的过程中形成的。软件开发经历了程序设计阶段、软件设计阶段和软件工程阶段的演变过程。
程序设计阶段
程序设计阶段出现在1946年～1955年。此阶段的特点是：尚无软件的概念，程序设计主要围绕硬件进行开发，规模很小，工具简单，无明确分工（开发者和用户），程序设计追求节省空间和编程技巧，无文档资料（除程序清单外），主要用于科学计算。
软件设[4]计阶段
软件设计阶段出现在1956年～1970年。此阶段的特点是：硬件环境相对稳定，出现了“软件作坊”的开发组  软件工程织形式。开始广泛使用产品软件（可购买），从而建立了软件的概念。随着计算机技术的发展和计算机应用的日益普及，软件系统的规模越来越庞大，高级编程语言层出不穷，应用领域不断拓宽，开发者和用户有了明确的分工，社会对软件的需求量剧增。但软件开发技术没有重大突破，软件产品的质量不高，生产效率低下，从而导致了“软件危机”的产生。
软件工程阶段
自1970年起，软件开发进入了软件工程阶段。由于“软件危机”的产生，迫使人们不得不研究、改变软件开发的技术手段和管理方法。从此软件产生进入了软件工程时代。此阶段的特定是：硬件已向巨型化、微型化、网络化和智能化四个方向发展，数据库技术已成熟并广泛应用，第三代、第四代语言出现；第一代软件技术：结构化程序设计在数值计算领域取得优异成绩；第二代软件技术：软件测试技术、方法、原理用于软件生产过程；第三代软件技术：处理需求定义技术用于软件需求分析和描述。[5]
（关于软件危机的详细介绍可以阅读参考资料：[5]）
基本目标
软件工程的目标是：在给定成本、进度的前提下，开发出具有适用性、有效性、可修改性、可靠性、可理解性、可维护性、可重用性、可移植性、可追踪性  软件工程、可互操作性和满足用户需求的软件产品。追求这些目标有助于提高软件产品的质量和开发效率，减少维护的困难。
（1）适用性：软件在不同的系统约束条件下，使用户需求得到满足的难易程度。
（2）有效性：软件系统能最有效的利用计算机的时间和空间资源。各种软件无不把系统的时/空开销作为衡量软件质量的一项重要技术指标。很多场合，在追求时间有效性和空间有效性时会发生矛盾，这时不得不牺牲时间有效性换取空间有效性或牺牲空间有效性换取时间有效性。时/空折衷是经常采用的技巧。
（3）可修改性：允许对系统进行修改而不增加原系统的复杂性。它支持软件的调试和维护，是一个难以达到的目标。
（4）可靠性：能防止因概念、设计和结构等方面的不完善造成的软件系统失效，具有挽回因操作不当造成软件系统失效的能力。
（5）可理解性：系统具有清晰的结构，能直接反映问题的需求。可理解性有助于控制系统软件复杂性，并支持软件的维护、移植或重用。
（6）可维护性：软件交付使用后，能够对它进行修改，以改正潜伏的错误，改进性能和其它属性，使软件产品适应环境的变化等。软件维护费用在软件开发费用中占有很大的比重。可维护性是软件工程中一项十分重要的目标。
（7）可重用性：把概念或功能相对独立的一个或一组相关模块定义为一个软部件。可组装在系统的任何位置，降低工作量。
（8）可移植性：软件从一个计算机系统或环境搬到另一个计算机系统或环境的难易程度。
（9）可追踪性：根据软件需求对软件设计、程序进行正向追踪，或根据软件设计、程序对软件需求的逆向追踪的能力。
（10）可互操作性：多个软件元素相互通信并协同完成任务的能力。[6]
开发过程
生产一个最终能满足需求且达到工程目标的软件产品所需要的步骤。软件工程过程主要包括开发过程、运作过程、维护过程。它们覆盖了需求、设计、实现、确认以及维护等活动。需求活动包括问题分析和需求分析。问题分析获取需求定义，又称软件需求规约。需求分析生成功能规约。设计活动一般包括概要设计和详细设计。概要设计建立整个软件系统结构，包括子系统、模块以及相关层次的说明、每一模块的接口定义。详细设计产生程序员可用的模块说明，包括每一模块中数据结构说明及加工描述。实现活动把设计结果转换为可执行的程序代码。确认活动贯穿于整个开发过程，实现完成后的确认，保证最终产品满足用户的要求。维护活动包括使用过程中的扩充、修改与完善。伴随以上过程，还有管理过程、支持过程、培训过程等。[7]
开发原则
软件工程的原则是指围绕工程设计、工程支持以及工程管理在软件开发过程中必须遵循的原则。[7]
软件工程的原则有以下四项  软件工程师基本原则：
选取适宜开发范型
该原则与系统设计有关。在系统设计中，软件需求、硬件需求以及其他因素之间是相互制约、相互影响的，经常需要权衡。因此，必须认识需求定义的易变性，采用适宜的开发范型予以控制，以保证软件产品满足用户的要求。
采用合适的设计方法
在软件设计中，通常要考虑软件的模块化、抽象与信息隐蔽、局部化、一致性以及适应性等特征。合适的设计方法有助于这些特征的实现，以达到软件工程的目标。
提供高质量的工程支持
“工欲善其事，必先利其器”。
在软件工程中，软件工具与环境对软件过程的支持颇为重要。软件工程项目的质量与开销直接取决于对软件工程所提供的支撑质量和效用。
重视开发过程的管理
软件工程的管理，直接影响可用资源的有效利用，生产满足目标的软件产品，提高软件组织的生产能力等问题。因此，仅当软件过程得以有效管理时，才能实现有效的软件工程。
这一软件工程框架告诉我们，软件工程的目标是可用性、正确性和合算性；实施一个软件工程要选取适宜的开发范型，要采用合适的设计方法，要提供高质量的工程支撑，要实行开发过程的有效管理；软件工程活动主要包括需求、设计、实现、确认和支持等活动，每一活动可根据特定的软件工程，采用合适的开发范型、设计方法、支持过程以及过程管理。根据软件工程这一框架，软件工程学科的研究内容主要包括：软件开发范型、软件开发方法、软件过程、软件工具、软件开发环境、计算机辅助软件工程(CASE) 及软件经济学等。[8]
软件工程研究
[9]软件工程与应用 Software Engineering and Applications 是一本关注计算机领域最新进展的国际中文期刊，由汉斯出版社发行。本刊支持思想创新、学术创新，倡导科学，繁荣学术，集学术性、思想性为一体，旨在为了给世界范围内的科学家、学者、科研人员提供一个传播、分享和讨论计算机领域内不同方向问题与发展的交流平台。
研究领域：  软件工程研究
软件架构
软件设计方法
软件领域建模
软件工程决策支持
软件工程教育
软件测试技术
自动化的软件设计和合成
基于组件的软件工程
计算机支持的协同工作
编程语言和软件工程
计算机网络
信息与通信安全
计算机图形学与人机交互
多媒体技术应用
人工智能与识别
嵌入式软件与应用
自动控制
分布式计算与网格计算
云计算技术
存储技术
数据库技术研究
计算机辅助设计与应用技术
软件工程过程
定义ISO 9000对软件工程过程的定义是：软件工程过程是输入转化为输出的一组彼此相关的资源和活动。[10]内涵一，软件工程过程是指为获得软件产品，在软件工具的支持下由软件工程师完成的一系列软件工程活动，包括以下四个方面：
1，P（Plan）：——软件规格说明。规定软件的功能及其运行时的限制。
2，D（DO）——软件开发。开发出满足规格说明的软件。
3，C（Check)——软件确认。确认开发的软件能够满足用户的需求。
4，A（Action)——软件演进。软件在运行过程中不断改进一满足客户新的需求。[10]
二，从软件开发的观点看，它就是使用适当的资源（包括人员，软硬件资源，时间等），未开发软件进行的一组开发活动，在活动结束时输入（即用户的需求）转化为输出（最终符合用户需求的软件产品）。[10]三个阶段定义阶段：可行性研究初步项目计划、需求分析
开发阶段:概要设计、详细设计、实现、测试
运行和维护阶段：运行、维护、废弃[10]原则1，抽象
2，信息隐蔽
3，模块化
4，局部化
5，确定性
6，一致性
7，完备性
8，可验证性[10]
原理
自从1968年提出“软件工程”这一术语以来，研究软件工程的专家学者们陆续提出了100多条关于软件工程的准则或信条。美国著名的软件工程专家巴利·玻姆（Barry Boehm）综合这些专家的意见，并总结了美国天合公司（TRW）多年的开发软件的经验，于1983年提出了软件工程的七条基本原理。
玻姆认为，这七条原理是确保软件产品质量和开发效率的原理的最小集合。它们是相互独立的，是缺一不可的最小集合；同时，它们又是相当完备的。  人们当然不能用数学方法严格证明它们是一个完备的集合，但是可以证明，在此之前已经提出的100多条软件工程准则都可以有这七条原理的任意组合蕴含或派生。[8]
下面简要介绍软件工程的七条原理：
用分阶段的生命周期计划严格管理
这一条是吸取前人的教训而提出来的。统计表明，50%以上的失败项目是由于计划不周而造成的。在软件开发与维护的漫长生命周期中，需要完成许多性质各异的工作。这条原理意味着，应该把软件生命周期分成若干阶段，并相应制定出切实可行的计划，然后严格按照计划对软件的开发和维护进行管理。
玻姆认为，在整个软件生命周期中应指定并严格执行6类计划：
项目概要计划、
里程碑计划、
项目控制计划、
产品控制计划、
验证计划、
运行维护计划。[8]
坚持进行阶段评审
统计结果显示：大部分错误是在编码之前造成的，大约占63%错误发现的越晚，改正它要付出的代价就越大，要差2到3个数量级。 因此，软件的质量保证工作不能等到编码结束之后再进行，应坚持进行严格的阶段评审，以便尽早发现错误。
实行严格的产品控制
开发人员最痛恨的事情之一就是改动需求。但是实践告诉我们，需求的改动往往是不可避免的。这就要求我们要采用科学的产品控制技术来顺应这种要求。也就是要采用变动控制，又叫基准配置管理。当需求变动时，其它各个阶段的文档或代码随之相应变动，以保证软件的一致性。[8]
采纳现代程序设计技术
从六、七十年代的结构化软件开发技术，到最近的面向对象技术，从第一、第二代语言，到第四代语言，人们已经充分认识到：方法大似气力。采用先进的技术即可以提高软件开发的效率，又可以减少软件维护的成本。
结果应能清楚地审查
软件是一种看不见、摸不着的逻辑产品。软件开发小组的工作进展情况可见性差，难于评价和管理。为更好地进行管理，应根据软件开发的总目标及完成期限，尽量明确地规定开发小组的责任和产品标准，从而使所得到的标准能清楚地审查。
开发小组的人员应少而精
开发人员的素质和数量是影响软件质量和开发效率的重要因素，应该少而精。　这一条基于两点原因：高素质开发人员的效率比低素质开发人员的效率要高几倍到几十倍，开发工作中犯的错误也要少的多；当开发小组为N人时，可能的通讯信道为N(N-1)/2, 可见随着人数N的增大，通讯开销将急剧增大。
承认不断改进软件工程实践的必要性
遵从上述六条基本原理，就能够较好地实现软件的工程化生产。但是，它们只是对现有的经验的总结和归纳，并不能保证赶上技术不断前进发展的步伐。因此，玻姆提出应把承认不断改进软件工程实践的必要性作为软件工程的第七条原理。根据这条原理，不仅要积极采纳新的软件开发技术，还要注意不断总结经验，收集进度和消耗等数据，进行出错类型和问题报告统计。这些数据既可以用来评估新的软件技术的效果，也可以用来指明必须着重注意的问题和应该优先进行研究的工具和技术。[11]
体系结构
软件体系结构表示了一个软件系统的高层结构，主要特点有：1）软件系统结构是  软件工程师一个高层次上的抽象，它并不涉及具体的系统结构（比如B/S还是C/S），也不关心具体的实现。2）软件体系结构必须支持系统所要求的功能，在设计软件体系结构的时候，必须考虑系统的动态行为。3）在设计软件体系结构的时候，必须考虑有现有系统的兼容性、安全性和可靠性。同时还要考虑系统以后的扩展性和伸缩性。所以有时候必须在多个不同方向的目标中进行决策。
当前已经有一些关于规范化软件体系结构，比如：ISO的开放系统互联模型、X Window系统等等。软件系统的结构通常被定义为两个部分：一个是计算部件。另一个就是部件之间的交互。如果把软件系统看成一幅图的话，计算部件就是其中的节点，而部件之间的交互就是节点之间的弧线。部件之间的连接可以被认为是一种连接器，比如过程调用、事件广播、数据库查询等等。正确的体系结构设计是软件系统成功的关键。[12]
软件工程 - 方法学
软体工程的方法有很多方面的意义。包括专案管理，分析，设计，程序的编写，测试和质量控制。 
软体设计方法可以区别为重量级的方法和轻量级的方法。重量级的方法中产生大量的正式文档。
著名的重量级开发方法包括ISO9000，CMM，和统一软体开发过程（RUP）。
轻量级的开发过过程没有对大量正式文档的要求。着名的轻量级开发方法包括极限编程（XP）和敏捷流程（AgileProcesses）。
根据《新方法学》这篇文章的说法，重量级方法呈现的是一种防御型的姿态。在应用重量级方法的软体组织中，由于软体项目经理不参与或者很少参与程序设计，无法从细节上把握项目进度，因而会对项目产生恐惧感，不得不要求程式设计师不断撰写很多“软体开发文档”。而轻量级方法则呈现“进攻型”的姿态，这一点从XP方法特别强调的四个准则—“沟通、简单、反馈和勇气上有所体现。目前有一些人认为，重量级方法合于大型的软体团队（数十人以上）使用，而“轻量级方法”适合小型的软体团队（几人、十几人）使用。当然，关于重量级方法和轻量级方法的优劣存在很多争论，而各种方法也在不断进化中。
一些方法论者认为人们在开发中应当严格遵循并且实施这些方法。但是一些人并不具有实施这些方法的条件。实际上，采用何种方法开发软体取决于很多因素，同时受到环境的制约
开发方法
国外大的软件公司和机构一直在研究软件开发方法这个概念性的东西，而且也提出了很多实际的开发方法，比如：生命周期法、原型化方法、面向对象方法等等。下面介绍几种流行的开发方法：
结构化方法
结构化开发方法是由E.Yourdon 和 L.L.Constantine 提出的，即所谓的SASD 方 法， 也可称为面向功能的软件开发方法或面向数据流的软件开发方法。
Yourdon方法是80年代 使用最广泛的软件开发方法。它首先用结构化分析（SA）对软件进行需求分析，然后用结构化设计（SD）方法进行总体设计，最后是结构化编程（SP）。它给出了两类典型的软件结构（变换型和事务型）使软件开发的成功率大大提高。
面向数据结构的软件开发方法
Jackson方法是最典型的面向数据结构的软件开发方法，Jackson方法把问题分解为可由三种基本结构形式表示的各部分的层次结构。三种基本的结构形式就是顺序、选择和重复。三种数据结构可以进行组合，形成复杂的结构体系。这一方法从目标系统的输入、输出数据结构入手，导出程序框架结构，再  补充其它细节，就可得到完整的程序结构图。这一方法对输入、输出数据结构明确的中小型系统特别有效，如商业应用中的文件表格处理。该方法也可与其它方法结合，用于模块的详细设计。
面向问题的分析法
PAM（Problem Analysis Method）是80年代末由日立公司提出的一种软件开发方法。 它的基本思想是考虑到输入、输出数据结构，指导系统的分解，在系统分析指导下逐步综 合。这一方法的具体步骤是：从输入、输出数据结构导出基本处理框；分析这些处理框之间的先后关系；按先后关系逐步综合处理框，直到画出整个系统的PAD图。这一方法本质上是综合的自底向上的方法，但在逐步综合之前已进行了有目的的分解，这个目的就是充分考虑系统的输入、输出数据结构。PAM方法的另一个优点是使用PAD图。这是一种二维树形结构图，是到目前为止最好的详细设计表示方法之一。当然由于在输入、输出数据结构与整个系统之间同样存在着鸿沟，这一方法仍只适用于中小型问题。
原型化方法
产生原型化方法的原因很多，主要随着我们系统开发经验的增多，我们也发  软件工程需求分析现并非所有的需求都能够预先定义而且反复修改是不可避免的。当然能够采用原型化方法是因为开发工具的快速发展，比如用VB，DELPHI等工具我们可以迅速的开发出一个可以让用户看的见、摸的着的系统框架，这样，对于计算机不是很熟悉的用户就可以根据这个样板提出自己的需求。 [12]
软件需求
软件[13]需求包括 3 个不同的层次――业务需求、用户需求和功能需求。 
除此之外，每个系统还有各种非功能需求。 
业务需求（ Business requirement ） 表示组织或客户高层次的目标。业务需求通常来自项目投资人、购买产品的客户、实际用户的管理者、市场营销部门或产品策划部门。业务需求描述了组织为什么要开发一个系统，即组织希望达到的目标。使用前景和范围（ vision and scope ）文档来记录业务需求，这份文档有时也被称作项目轮廓图或市场需求（ project charter 或 market requirement ）文档。 
用户需求（ user requirement ） 描述的是用户的目标，或用户要求系统必须能完成的任务。用例、场景描述和事件――响应表都是表达用户需求的有效途径。也就是说用户需求描述了用户能使用系统来做些什么。 
功能需求（ functional requirement ） 规定开发人员必须在产品中实现的软件功能，用户利用这些功能来完成任务，满足业务需求。功能需求有时也被称作行为需求（ behavioral requirement ），因为习惯上总是用“应该”对其进行描述：“系统应该发送电子邮件来通知用户已接受其预定”。功能需求描述是开发人员需要实现什么。 
系统需求（ system requirement ） 用于描述包含多个子系统的产品（即系统）的顶级需求。系统可以只包含软件系统，也可以既包含软件又包含硬件子系统。人也可以是系统的一部分，因此某些系统功能可能要由人来承担。 
业务规则 包括企业方针、政府条例、工业标准、会计准则和计算方法等。业务规划本身并非软件需求，因为它们不属于任何特定软件系统的范围。然而，业务规则常常会限制谁能够执行某些特定用例，或者规定系统为符合相关规则必须实现某些特定功能。有时，功能中特定的质量属性（通过功能实现）也源于业务规则。所以，对某些功能需求进行追溯时，会发现其来源正是一条特定的业务规则。 
功能需求 记录在软件需求规格说明（ SRS ）中。 SRS 完整地描述了软件系统的预期特性。 SRS 我们一般把它当作文档，其实， SRS 还可以是包含需求信息的数据库或电子表格；或者是存储在商业需求管理工具中的信息；而对于小型项目，甚至可能是一叠索引卡片。开发、测试、质量保证、项目管理和其他相关的项目功能都要用到 SRS 。 
除了功能需求外， SRS 中还包含非功能需求，包括性能指标和对质量属性的描述。 
质量属性（ quality attribute ） 对产品的功能描述作了补充，它从不同方面描述了产品的各种特性。这些特性包括可用性、可移植性、完整性、效率和健壮性，它们对用户或开发人员都很重要。其他的非功能需求包括系统与外部世界的外部界面，以及对设计与实现的约束。 
约束（ constraint ） 限制了开发人员设计和构建系统时的选择范围。 [14]
软件工程学科

中文版
书名：软件工程（原书第9版）  原书名：Software Engineering, Ninth Edition
作者：（英）Ian Sommerville 著
译者：程成等译
丛书名：计算机科学丛书
ISBN：978-7-111-33498-9
定价：75.00
出版日期：2011年5月
出版社：机械工业出版社
英文版
书名：软件工程（英文版·第9版）原书名：Software Engineering Ninth Edition 
丛书名：经典原版书库
作者：（英）Ian Sommerville著
页数：792
ISBN 978-7-111-34825-2 
定价：99.00元
出版日期：2011年7月
出版社：机械工业出版社
内容简介
本书是系统介绍软件工程理论的经典教材，自1982年初版以来，随着软件工程学科的发展不断更新版本，影响了一代又一代软件工程人才，对学科的发展建设也产生了积极影响。全书分四部分完整讨论了软件工程的各级段内容，是软件工程和系统工程专业本科和研究生的优秀教材，也是软件工程师必备的参考书籍。
本书特点  ●涵盖了对所有开发过程都很基础的重要主题，包括了软件工程理论与实践的最新进展。
● 将本书第8版中的八篇内容重构为四个部分，使教师讲授软件工程课程更加容易。
●每一章都有30%～40%的更新，增加了敏捷软件开发和嵌入式系统等新章，补充了模型驱动工程、开源开发、测试驱动开发、可依赖系统体系结构、静态分析和模型检查、COTS复用、服务作为软件以及敏捷规划等新内容。
●着重讨论了开发可靠的分布式系统的相关主题以及敏捷方法和软件复用。
●反映敏捷方法先进性的同时，不忘强调传统的计划驱动软件工程的作用，阐述了两者结合构建优秀软件系统的重要性。
● 以一个新的病人记录系统案例研究贯穿始终，系统、完整地讲解软件工程的各个方面。
●将本书设计为“印刷/Web”相结合的方式，核心信息采用印刷版本，教辅材料及先前版本中的一些章节放在Web上，为读者提供丰富翔实的信息。
作者简介
Ian Sommerville英国著名软件工程专家，曾任教于兰卡斯特大学，现为圣安德鲁斯大学软件工程学教授。他在软件工程的教学和科研方面有20多年的经验。他是IEEE CS组织编撰“软件工程知识体系”（SWEBOK）的专家委员会成员之一。他的研究领域包括计算机系统工程、需求工程、系统可靠性以及软件进货。
媒体推荐
计算机专业图书在不同领域都有双峰峙立的情形，软件工程类综述性的巨著也有两本：第一本就是Roger Pressman所著的《软件工程：实践者的研究方法》，另一本就是Ian Sommerville所著的本书。这两本书名著都有多年历史（初版可追溯到20世纪80年代早期），对于软件工程学科的形成，尤其是在教育界和学术界影响极大。相比Pressman的书，Sommerville的这本教材将全部内容划分为四个部分，每个部分可以单独使用或者是结合其他部分作为软件工程课程的基本内容，更加适合不同类型软件工程课程的教学需求，叙述也更趋清晰和简明。 
——摘自业界专业人士的推荐
这本软件工程的经典教材不仅展现了软件工程的广阔视野，还着重阐述了在开发大型系统中一些广泛采用的技术，并辅以大量的例子和图解；而且作者将所有的话题控制在适度的篇幅，用简练到位的文字把最重要的内容呈现给读者，并提供进一步阅读资料，供有兴趣的读者深入学习，使得本书更符合国内软件工程课程的教学需求。书中没有学院派布道式的说教，作者认为并不存在解决软件工程问题的灵丹妙药，而是强调读者需要学习和掌握更广泛的技术和工具以解决软件工程问题。从内容选材上，本书不落俗套，大胆舍弃了传统的软件工程内容和一些繁琐的软件工程理论，代之以简洁实用的软件工程新知识、新方法，增加了教材的实用性和可读性；从专题安排上，本书避虚就实，没有对软件工程的技术泛泛而谈，而是针对那些大型系统开发技术进行分析，避免了对个别产品中的技术进行过多阐述。
——刘艺，《计算机英语》作者
目录
中文版
出版者的话
译者序
前言
第一部分软件工程导论
第1章概述
11专业化软件开发
111软件工程
112软件工程的多样性
113软件工程和Web
12软件工程人员的职业道德
13案例研究
131胰岛素泵控制系统
132用于心理健康治疗的患者信息系统
133野外气象站
要点
进一步阅读材料
练习
参考书目
第2章软件过程
21软件过程模型
211瀑布模型
212增量式开发
213面向复用的软件工程
22过程活动
221软件描述
222软件设计和实现
223软件有效性验证
224软件进化
23应对变更
231原型构造
232增量式交付
233Boehm的螺旋模型
24Rational统一过程
要点
进一步阅读材料
练习
参考书目
第3章敏捷软件开发
31敏捷方法
32计划驱动开发和敏捷开发
33极限编程
331极限编程中的测试
332结对编程
34敏捷项目管理
35可扩展的敏捷方法
要点
进一步阅读材料
练习
参考书目
第4章需求工程
41功能需求和非功能需求
411功能需求
412非功能需求
42软件需求文档
43需求描述
431自然语言描述
432结构化描述
44需求工程过程
45需求导出和分析
451需求发现
452采访
453脚本
454用例
455深入实际
46需求有效性验证
47需求管理
471需求管理规划
472需求变更管理
要点
进一步阅读材料
练习
参考书目
第5章系统建模
51上下文模型
52交互模型
521用例建模
522时序图
53结构模型
531类图
532泛化
533聚合
54行为模型
541数据驱动的建模
542事件驱动模型
55模型驱动工程
551模型驱动体系结构
552可执行UML 
要点
进一步阅读材料
练习
参考书目
第6章体系结构设计
61体系结构设计决策
62体系结构视图
63体系结构模式
631分层体系结构
632容器体系结构
633客户机-服务器体系结构
634管道和过滤器体系结构
64应用体系结构
641事务处理系统
642信息系统
643语言处理系统
要点
进一步阅读材料
练习
参考书目
第7章设计与实现
71利用UML进行面向对象设计
711系统上下文与交互
712体系结构的设计
713对象类识别
714设计模型
715接口描述
72设计模式
73实现问题
731复用
732配置管理
733宿主机-目标机开发
74开源开发
要点
进一步阅读材料
练习
参考书目
第8章软件测试
81开发测试
811单元测试
812选择单元测试案例
813组件测试
814系统测试
82测试驱动开发
83发布测试
831基于需求的测试
832情景测试
833性能测试
84用户测试
要点
进一步阅读材料
练习
参考书目
第9章软件进化
91进化过程
92程序进化的动态特性
93软件维护
931维护预测
932软件再工程
933通过重构进行预防性维护
94遗留系统管理
要点
进一步阅读材料
练习
参考书目
第二部分可依赖性和信息安全性
第10章社会技术系统
101复杂系统
1011系统总体特性
1012系统非确定性
1013成功标准
102系统工程
103系统采购
104系统开发
105系统运行
1051人为错误
1052系统进化
要点
进一步阅读材料
练习
参考书目
第11章可依赖性与信息安全性
111可依赖性特征
112可用性和可靠性
113安全性
114信息安全性
要点
进一步阅读材料
练习
参考书目
第12章可依赖性与信息安全性描述
121风险驱动的需求描述
122安全性描述
1221危险识别
1222危险评估
1223危险分析
1224风险降低
123可靠性描述
1231可靠性度量
1232非功能性的可靠性需求
1233功能可靠性描述
124信息安全性描述
125形式化描述
要点
进一步阅读材料
练习
参考书目
第13章可依赖性工程
131冗余性和多样性
132可依赖的过程
133可依赖的系统体系结构
1331保护性系统
1332自监控系统体系结构
1333N-版本编程
1334软件多样性
134可依赖的编程
要点
进一步阅读材料
练习
参考书目
第14章信息安全工程
141信息安全风险管理
1411生存期风险评估
1412运行风险评估
142面向信息安全的设计
1421体系结构设计
1422设计准则
1423部署设计
143系统生存能力
要点
进一步阅读材料
练习
参考书目
第15章可依赖性与信息安全保证
151静态分析
1511检验和形式化方法
1512模型检测
1513自动静态分析 
152可靠性测试
153信息安全性测试
154过程保证
155安全性和可依赖性案例
1551结构化论证
1552结构化的安全性论证
要点
进一步阅读材料
练习
参考书目
第三部分高级软件工程
第16章软件复用
161复用概览
162应用框架
163软件产品线
164COTS产品的复用
1641COTS解决方案系统
1642COTS集成系统
要点
进一步阅读材料
练习
参考书目
第17章基于组件的软件工程
171组件和组件模型
172CBSE过程
1721面向复用的CBSE
1722基于复用的CBSE
173组件合成
要点
进一步阅读材料
练习
参考书目
第18章分布式软件工程
181分布式系统的问题
1811交互模型
1812中间件
182客户机-服务器计算
183分布式系统的体系结构模式
1831主从体系结构
1832两层客户机-服务器结构
1833多层客户机-服务器结构
1834分布式组件体系结构
1835对等体系结构
184软件作为服务
要点
进一步阅读材料
练习
参考书目
第19章面向服务的体系结构
191服务作为可复用的组件
192服务工程
1921可选服务的识别
1922服务接口设计
1923服务实现和部署
1924遗留系统服务
193使用服务的软件开发
1931工作流设计和实现
1932服务测试
要点
进一步阅读材料
练习
参考书目
第20章嵌入式软件
201嵌入式系统设计
2011实时系统建模
2012实时编程
202体系结构模式
2021观察和反应 
2022环境控制
2023处理管道
203时序分析
204实时操作系统
要点
进一步阅读材料
练习
参考书目
第21章面向方面的软件工程
211关注点分离
212方面、连接点和切入点
213采用方面的软件工程
2131面向关注点的需求工程
2132面向方面的设计和编程
2133检验和有效性验证
要点
进一步阅读材料
练习
参考书目
第四部分软件 管理
第22章项目管理
221风险管理
2211风险识别
2212风险分析
2213风险规划
2214风险监控
222人员管理
223团队协作
2231成员挑选
2232小组的结构
2233小组的沟通
要点
进一步阅读材料
练习
参考书目
第23章项目规划
231软件报价
232计划驱动的开发
2321项目计划
2322规划过程
233项目进度安排
234敏捷规划
235估算技术
2351算法成本建模
2352COCOMO Ⅱ模型
2353项目的工期和人员配备
要点
进一步阅读材料
练习
参考书目
第24章质量管理
241软件质量
242软件标准
243复查与审查
2431复查过程
2432程序审查
244软件度量和量度
2441产品量度
2442软件组件分析
2443度量歧义
要点
进一步阅读材料
练习
参考书目
第25章配置管理
251变更管理
252版本管理
253系统构建
254发布版本管理
要点
进一步阅读材料
练习
参考书目
第26章过程改善
261过程改善过程
262过程度量
263过程分析
264过程变更
265CMMI过程改善框架
2651分阶段的CMMI模型
2652连续CMMI模型
要点
进一步阅读材料
练习
参考书目
术语表
英文版
CONTENTS 
Preface v 
Part 1 Introduction to Software Engineering 1 
Chapter 1 Introduction 3 
1．1 Professional software development 5 
1．2 Software engineering ethics 14 
1．3 Case studies 17 
Chapter 2 Software processes 27 
2．1 Software process models 29 
2.2 Process activities 36 
2．3 Coping with change 43 
2．4 The rational unified process 50 
Chapter 3 Agile software development 56 
3．1 Agile methods 58 
3．2 Plan-driven and agile development 62 
3．3 Extreme programming 64 
3．4 Agile project management 72 
3．5 Scaling agile methods 74 
Chapter 4 Requirements engineering 82 
4．1 Functional and non-functional requirements 84 
4．2 The software requirements document 91 
4．3 Requirements specification 94 
4．4 Requirements engineering processes 99 
4．5 Requirements elicitation and analysis 100 
4．6 Requirements validation 110 
4．7 Requirements management 111 
Chapter 5 System modeling 118 
5．1 Context models 121 
5．2 Interaction models 124 
5．3 Structural models 129 
5．4 Behavioral models 133 
5．5 Model-driven engineering 138 
Chapter 6 Architectural design 147 
6．1 Architectural design decisions 151 
6．2 Architectural views 153 
6．3 Architectural patterns 155 
6．4 Application architectures 164 
Chapter 7 Design and implementation 176 
7．1 Object-oriented design using the UML 178 
7．2 Design patterns 189 
7．3 Implementation issues 193 
7．4 Open source development 198 
Chapter 8 Software testing 205 
8．1 Development testing 210 
8．2 Test-driven development 221 
8．3 Release testing 224 
8．4 User testing 228 
Chapter 9 Software evolution 234 
9．1 Evolution processes 237 
9．2 Program evolution dynamics 240 
9．3 Software maintenance 242 
9．4 Legacy system management 252 
Part 2 Dependability and Security 261 
Chapter 10 Sociotechnical systems 263 
10．1 Complex systems 266 
10．2 Systems engineering 273 
10．3 System procurement 275 
10．4 System development 278 
10．5 System operation 281 
Chapter 11 Dependability and security 289 
11．1 Dependability properties 291 
11．2 Availability and reliability 295 
11．3 Safety 299 
11．4 Security 302 
Chapter 12 Dependability and security specification 309 
12．1 Risk-driven requirements specification 311 
12．2 Safety specification 313 
12．3 Reliability specification 320 
12．4 Security specification 329 
12．5 Formal specification 333 
Chapter 13 Dependability engineering 341 
13．1 Redundancy and diversity 343 
13．2 Dependable processes 345 
13．3 Dependable system architectures 348 
13．4 Dependable programming 355 
Chapter 14 Security engineering 366 
14．1 Security risk management 369 
14．2 Design for security 375 
14．3 System survivability 386 
Chapter 15 Dependability and security assurance 393 
15．1 Static analysis 395 
15．2 Reliability testing 401 
15．3 Security testing 404 
15．4 Process assurance 406 
15．5 Safety and dependability cases 410 
Part 3 Advanced Software Engineering 423 
Chapter 16 Software reuse 425 
16．1 The reuse landscape 428 
16．2 Application frameworks 431 
16．3 Software product lines 434 
16．4 COTS product reuse 440 
Chapter 17 Component-based software engineering 452 
17．1 Components and component models 455 
17．2 CBSE processes 461 
17．3 Component composition 468 
Chapter 18 Distributed software engineering 479 
18．1 Distributed systems issues 481 
18．2 Client–server computing 488 
18．3 Architectural patterns for distributed systems 490 
18．4 Software as a service 501 
Chapter 19 Service-oriented architecture 508 
19．1 Services as reusable components 514 
19．2 Service engineering 518 
19．3 Software development with services 527 
Chapter 20 Embedded software 537 
20．1 Embedded systems design 540 
20．2 Architectural patterns 547 
20．3 Timing analysis 554 
20．4 Real-time operating systems 558 
Chapter 21 Aspect-oriented software engineering 565 
21．1 The separation of concerns 567 
21．2 Aspects, join points and pointcuts 571 
21．3 Software engineering with aspects 576 
Part 4 Software Management 591 
Chapter 22 Project management 593 
22．1 Risk management 595 
22．2 Managing people 602 
22．3 Teamwork 607 
Chapter 23 Project planning 618 
23．1 Software pricing 621 
23．2 Plan-driven development 623 
23．3 Project scheduling 626 
23．4 Agile planning 631 
23．5 Estimation techniques 633 
Chapter 24 Quality management 651 
24．1 Software quality 655 
24．2 Software standards 657 
24．3 Reviews and inspections 663 
24．4 Software measurement and metrics 668 
Chapter 25 Configuration management 681 
25．1 Change management 685 
25．2 Version management 690 
25．3 System building 693 
25．4 Release management 699 
Chapter 26 Process improvement 705 
26．1 The process improvement process 708 
26．2 Process measurement 711 
26．3 Process analysis 715 
26．4 Process change 718 
26．5 The CMMI process improvement framework 721 
Glossary 733 
Subject Index 749 
Author Index 767　　

基本信息
书名：  软件工程软件工程
书号：7-113-12391
作者：陈明
定价：35.00元
出版日期：2011年4月
版次：1版1次　
开本：16开　
页码：356页
策划编辑：严晓舟 杨勇
责任编辑：秦绪好
适用专业：计算机专业
适合层次：高等院校
课程类别：软件工程
出版单位：中国铁道出版社
内容简介
本书是计算机专业核心课程软件工程的教材，主要内容包括：软件工程概述、软件项目分析、需求分析、概要设计、详细设计、面向对象的分析与设计方法、用户界面设计、编码、软件质量与质量保证、项目计划与管理、软件维护、软件开发工具与环境概述、软件建模等。
本教材的主要特点体现在其内容系统、语言精练、概念准确。本书适合作为高等学校软件工程课程的教材，也可作为从事软件工程人员的参考书。[1]
图书目录
第1章  软件工程概述 1
1.1  软件 1
1.1.1  软件的发展 2
1.1.2  软件的定义 3
1.1.3  软件的特点 3
1.1.4  软件的分类 5
1.2  软件工程的内容与方法 7
1.2.1  软件危机与软件工程的定义 7
1.2.2  软件工程的基本内容与目标 9
1.2.3  软件的基本开发方法 10
1.2.4  软件工程的基本原则 10
1.2.5  软件工具与环境 11
1.3  软件生存周期与软件开发模型 11
1.3.1  软件生存周期 11
1.3.2  软件开发模型 13
1.4  软件工程学的知识体系 21
小结 22
习题 22
第2章  软件项目分析 23
2.1  可行性研究的任务 23
2.2  可行性研究的步骤 24
2.3  可行性研究的要素 26
2.3.1  经济可行性 26
2.3.2  技术可行性 26
2.3.3  社会环境 27
2.4  系统流程图 27
2.5  成本-效益分析 29
2.5.1  成本估计 29
2.5.2  费用估算 30
2.5.3  度量效益的方法 31
小结 32
习题 32
第3章  软件需求工程 33
3.1  概述 34
3.1.1  软件需求分类 35
3.1.2  需求规格说明 36
3.1.3  需求工程概念 37
3.1.4  需求工程过程 37
3.2  需求获取方法 38
3.3  需求分析的任务与原则 40
3.3.1  需求分析的任务 40
3.3.2  需求分析的原则 41
3.4  需求建模方法 41
3.4.1  结构化需求建模方法 42
3.4.2  数据流图 44
3.4.3  数据字典 51
3.5  需求分析图形工具 55
3.5.1  层次方框图 56
3.5.2  Warnier图 56
3.5.3  IPO图 57
3.6  需求验证 57
3.6.1  目的与任务 57
3.6.2  内容与方法 58
3.6.3  需求评审 59
3.7  需求管理 60
3.7.1  需求管理的目标 60
3.7.2  需求管理的原则 60
3.7.3  需求开发的管理 61
3.7.4  需求管理活动 62
小结 64
习题 64
第4章  概要设计 65
4.1  软件体系结构 66
4.1.1  概述 66
4.1.2  系统构成 68
4.1.3  控制模型 71
4.1.4  模块化分解 74
4.1.5  领域相关的体系结构 76
4.2  概要设计任务与步骤 78
4.2.1  概要设计任务 78
4.2.2  概要设计过程 79
4.3  软件设计的基本概念 80
4.3.1  模块化与模块独立性 80
4.3.2  抽象 85
4.3.3  结构设计原则 87
4.3.4  软件复用 90
4.3.5  设计模式 93
4.4  面向数据流的设计方法 95
4.4.1  基本概念 95
4.4.2  系统结构图的组成 96
4.4.3  变换分析 98
4.4.4  事务分析 102
4.4.5  设计优化 103
4.5  面向数据结构的分析设计方法 104
4.5.1  Jackson系统开发方法 104
4.5.2  Warnier方法 113
4.6  概要设计文档评审 114
小结 115
习题 115
第5章  详细设计 116
5.1  详细设计的任务与原则 117
5.1.1  详细设计的任务 117
5.1.2  详细设计的原则 117
5.2  详细设计工具 118
5.2.1  程序流程图 118
5.2.2  N-S图 119
5.2.3  PAD图 121
5.2.4  PDL 122
5.2.5  HIPO图 124
5.2.6  详细设计工具的选择 125
5.3  详细设计规格说明与复审 126
5.3.1  详细设计说明书 126
5.3.2  设计复审 127
小结 127
习题 128
第6章  面向对象设计 129
6.1  面向对象方法 130
6.1.1  面向对象方法概述 130
6.1.2  面向对象软件工程 131
6.1.3  面向对象的基本概念和特征 135
6.2  面向对象分析 142
6.2.1  面向对象分析过程与原则 142
6.2.2  确定对象与类 146
6.2.3  确定属性 149
6.2.4  定义服务 149
6.2.5  对象间通信 153
6.3  面向对象设计的概念和方法 158
6.3.1  面向对象设计的概念 159
6.3.2  面向对象设计的方法 160
小结 163
习题 163
第7章  用户界面设计 164
7.1  用户界面的主要特征 165
7.1.1  用户界面的质量特征 165
7.1.2  用户界面的图形特征 165
7.1.3  用户界面的优点 166
7.2  设计原则 166
7.3  用户交互 168
7.3.1  用户交互类型 168
7.3.2  交互类型的比较 168
7.4  信息表示 169
7.4.1  用户界面的信息表示方法 169
7.4.2  用户界面的信息表示形式 170
7.5  帮助系统 171
7.6  界面设计 173
7.6.1  数据输入界面设计 173
7.6.2  数据显示界面设计 174
7.6.3  控制界面设计 174
7.7  界面设计评价 174
7.7.1  界面设计评价指标 174
7.7.2  界面设计评价方法 175
小结 176
习题 176
第8章  编码 177
8.1  程序设计语言 178
8.1.1  程序设计语言的分类 178
8.1.2  程序设计语言的特点 180
8.1.3  程序设计语言的选择 182
8.2  编码风格 184
8.2.1  源程序文档化 184
8.2.2  数据说明 186
8.2.3  语句结构 186
8.2.4  输入/输出 189
8.3  程序效率 189
8.3.1  程序效率准则 190
8.3.2  算法对效率的影响 190
8.3.3  影响存储器效率的因素 190
8.3.4  影响输入/输出效率的因素 190
8.4  编程安全 191
8.4.1  冗余程序设计 191
8.4.2  防错程序设计 192
8.5  面向对象程序设计步骤 193
8.6  编码优化 193
8.6.1  优化的内容与原则 193
8.6.2  程序结构优化 194
8.6.3  程序代码优化 195
小结 195
习题 195
第9章  软件质量与软件测试 196
9.1  软件质量 197
9.1.1  软件质量定义 197
9.1.2  影响软件质量的因素 197
9.1.3  软件质量保证策略 198
9.1.4  软件质量保证活动 199
9.1.5  软件质量保证标准 200
9.2  软件评审 201
9.2.1  设计质量评审内容 202
9.2.2  程序质量评审内容 206
9.3  结构化程序测试 208
9.3.1  软件测试目的 209
9.3.2  软件测试原则 209
9.3.3  软件测试对象 210
9.3.4  软件测试过程 210
9.3.5  软件测试技术 211
9.3.6  设计测试方案 212
9.3.7  软件测试步骤 214
9.3.8  软件纠错技术 219
9.4  面向对象软件测试 220
9.4.1  面向对象分析和设计模型测试 220
9.4.2  面向对象测试策略 222
9.4.3  面向对象软件测试集设计 223
9.5  测试计划与测试分析报告 225
小结 227
习题 227
第10章  软件交付与维护 228
10.1  软件发布与部署 228
10.1.1  软件产品发布 229
10.1.2  软件产品实施 229
10.2  软件演化的特征 230
10.2.1  大型程序演化的动态特征 230
10.2.2  软件体系结构的进化 231
10.3  软件维护 231
10.3.1  软件维护分类与特点 232
10.3.2  软件维护步骤 234
10.3.3  软件的可维护性 237
10.3.4  软件维护的副作用 238
10.4  逆向工程和再生工程 239
小结 240
习题 240
第11章  项目计划与管理 242
11.1  软件项目特点及软件管理功能 243
11.1.1  软件项目的特点 243
11.1.2  软件管理的功能 243
11.1.3  软件项目的工作范围 244
11.2  软件项目的资源 244
11.2.1  人力资源 244
11.2.2  硬件资源 245
11.2.3  软件资源 245
11.3  人员的计划和组织 246
11.4  成本估计及控制 247
11.4.1  软件开发成本估计方法 247
11.4.2  专家估算法 247
11.4.3  成本估算模型 248
11.5  进度计划 251
11.5.1  各阶段工作量的分配 251
11.5.2  制定开发进度计划 251
11.6  软件配置管理 252
11.6.1  基线 252
11.6.2  软件配置项 253
11.6.3  软件配置管理过程 255
11.7  软件管理方案 258
11.8  软件能力成熟度模型 259
11.8.1  软件过程评估的必要性 259
11.8.2  能力成熟度模型的主要用途 260
11.8.3  能力成熟度模型中的概念 261
11.8.4  软件能力成熟度的等级 263
11.8.5  能力成熟度模型的内部结构 266
11.8.6  能力成熟度模型的应用 268
小结 270
习题 270
第12章  软件建模及其工具 271
12.1  模型概述 271
12.1.1  模型的定义 271
12.1.2  模型的分类 272
12.2  软件建模中最常用的模型 272
12.2.1  业务模型 272
12.2.2  功能模型 272
12.2.3  数据模型 273
12.3  需求建模 273
12.4  统一建模语言（UML） 274
12.4.1  UML概述 274
12.4.2  UML表示法 280
12.4.3  UML软件开发过程概述 291
小结 294
习题 294
第13章  软件开发工具与环境 295
13.1  软件开发工具概述 295
13.2  软件开发工具的功能 296
13.3  软件开发工具的特性 297
13.4  软件开发工具的分类 298
13.5  软件开发环境 300
13.6  常用开发环境 301
13.6.1  Windows开发环境 301
13.6.2  Linux开发环境 305
13.6.3  UNIX开发环境 309
13.7  软件开发工具的发展 313
13.8  CASE技术 314
小结 316
习题 316
附录A  可行性研究报告规范 317
附录B  项目开发计划规范 322
附录C  需求规格说明书规范 325
附录D  概要设计说明书规范 330
附录E  详细设计说明书规范 333
附录F  测试计划 336
附录G  测试分析报告 339
附录H  项目开发总结报告规范 341
参考文献 343

基本信息
书名：  软件工程软件工程
书号：7-113-10807
作者：张林 等
定价：35.00元
出版日期：2009年12月
出版单位：中国铁道出版社
内容简介
全书共分为四篇，分别讲解了如下知识点：软件工程与需求分析，软件设计方法与技术，软件编码、测试与维护，软件工程项目管理等基本理论和相关技术。本书是按照教育部高等学校计算机科学与技术专业教学指导分委员会颁布的《高等学校计算机科学与技术专业发展战略研究报告暨专业规范（试行）》中“软件工程”课程教学大纲的要求编写而成的，适合作为高等学校计算机和相关专业软件工程课程的教材，也可作为软件开发人员与软件项目管理人员的学习参考书。
目录
第一篇  软件工程与需求分析
第1章  软件工程概述
第2章  软件项目可行性分析
第3章  软件需求分析
第4章  软件开发工具与环境
第二篇  软件设计的方法与技术
第5章  软件设计方法概述
第6章  软件的总体设计与详细设计
第7章  结构化开发方法
第8章  面向对象的开发方法
第9章  人机交互界面设计
第10章  软件重用技术
第三篇  软件编码、测试与维护
第11章  软件编码
第12章  软件测试
第13章  软件维护
第四篇  软件工程项目管理
第14章  软件项目组织与人力资源管理
第15章  软件项目计划与进度控制
第16章  软件质量管理
第17章  软件配置管理
第18章  软件项目风险管理
参考文献