具体描述
产品特色
编辑推荐
《软件工程》的八篇内容重构为四个部分,使教师讲授软件工程课程更加容易。每一章都有30%~40%的更新,增加了敏捷软件开发和嵌入式系统等新章,补充了模型驱动工程、开源开发、测试驱动开发、可依赖系统体系结构、静态分析和模型检查、COTS复用、服务作为软件以及敏
捷规划等新内容。着重讨论了开发可靠的分布式系统的相关主题以及敏捷方法和软件复用。反映敏捷方法先进性的同时,不忘强调传统的计划驱动软件工程的作用,阐述了两者结合构建优秀软件系统的重要性。以一个新的病人记录系统案例研究贯穿始终,系统、完整地讲解软件工程的各个方面。《软件工程》设计为“印刷/Web”相结合的方式,核心信息采用印刷版本,教辅材料及先前版本中的一些章节放在Web上,为读者提供丰富翔实的信息。
内容简介
《软件工程》是系统介绍软件工程理论的经典教材,自1982年初版以来,随着软件工程学科的不断发展,不断更新版本,影响了一代又一代软件工程人才,对学科本身也产生了重大影响。本版保留了上一版中的软件工程的基本材料,但对各章都进行了修改和更新,并增加了很多有关其他主题的新材料。
《软件工程》包含四个部分:第1部分是对软件工程的一般性介绍,包括软件工程过程和敏捷开发,以及面向对象的设计和设计模式的使用;第2部分介绍可依赖性和信息安全性问题;第3部分介绍高级软件工程;第四部分介绍软件管理,重点介绍技术管理问题。
作者简介
萨默维尔(Ian Sommerville),英国著名软件工程专家。曾任教于兰卡斯特大学,现为圣安德鲁斯大学软件工程学教授。他在软件工程的教学和科研方面有20多年的经验。他是IEEECS组织编撰“软件工程知识体系”(SWEBOK)的专家委员会成员之一。他的研究领域包括计算机系统工程、需求工程、系统可靠性以及软件进货。
精彩书评
在计算机科学的同一领域往往都有比肩齐声的佳作。软件工程类综述性的巨著也有两本:一本就是Roger Pressman所著的《软件工程:实践者的研究方法》,另一本就是lan Sommerville所著的本书。这两本名著都有多年历史(初版可追溯到20世纪80年代早期)。对于软件工程学科的形成和发展起到了重要作用。尤其是在教育界和学术界影响极大。相比Pressman的书,Sommerville的这本教材将全部内容划分为四个部分,每个部分可以单独使用或者是结合其他部分作为软件工程课程的基本内容,更加适合不同类型软件工程课程的教学需求,叙述也更趋清晰和简明。
——摘自业界专业人士的推荐
这本软件工程的经典教材不仅展现了软件工程的广阔视野。还着重阐述了在开发大型系统中一些广泛采用的技术。并辅以大量的例子和图解。作者将所有的话题控制在适度的篇幅,用简练到位的文字把重要的内容呈现给读者,并提供进一步阅读资料,供有兴趣的读者深入学习,使得本书更符合国内软件工程课程的教学需求。书中没有学院派布道式的说教,作者认为并不存在解决软件工程问题的灵丹妙药,而是强调读者需要学习和掌握更广泛的技术和工具以解决软件工程问题。从内容选材上,本书不落俗套,大胆舍弃了传统的软件工程内容和一些繁琐的软件工程理论。代之以简洁实用的软件工程新知识、新方法,增加了教材的实用性和可读性;从专题安排上,本书避虚就实,没有对软件工程技术泛泛而谈,而是针对那些大型系统开发技术进行分析,避免对个别产品中的技术进行过多阐述。
——刘艺,《计算机英语》作者
目录
出版者的话译者序前言第一部分 软件工程导论第1章 概述1.1 专业化软件开发1.1.1 软件工程1.1.2 软件工程的多样性1.1.3 软件工程和Web1.2 软件工程人员的职业道德1.3 案例研究1.3.1 胰岛素泵控制系统1.3.2 用于心理健康治疗的患者信息系统1.3.3 野外气象站要点进一步阅读材料练习参考书目第2章 软件过程2.1 软件过程模型2.1.1 瀑布模型2.1.2 增量式开发2.1.3 面向复用的软件工程2.2 过程活动2.2.1 软件描述2.2.2 软件设计和实现2.2.3 软件有效性验证2.2.4 软件进化2.3 应对变更2.3.1 原型构造2.3.2 增量式交付2.3.3 Boehm的螺旋模型2.4 Rational统一过程要点进一步阅读材料练习参考书目第3章 敏捷软件开发3.1 敏捷方法3.2 计划驱动开发和敏捷开发3.3 极限编程3.3.1 极限编程中的测试3.3.2 结对编程3.4 敏捷项目管理3.5 扩展的敏捷方法要点进一步阅读材料练习参考书目第4章 需求工程4.1 功能需求和非功能需求4.1.1 功能需求4.1.2 非功能需求4.2 软件需求文档4.3 需求描述4.3.1 自然语言描述4.3.2 结构化描述4.4 需求工程过程4.5 需求导出和分析4.5.1 需求发现4.5.2 采访4.5.3 脚本4.5.4 用例4.5.5 深入实际4.6 需求有效性验证4.7 需求管理4.7.1 需求管理规划4.7.2 需求变更管理要点进一步阅读材料练习参考书目第5章 系统建模5.1 上下文模型5.2 交互模型5.2.1 用例建模5.2.2 时序图5.3 结构模型5.3.1 类图5.3.2 泛化5.3.3 聚合5.4 行为模型5.4.1 数据驱动的建模5.4.2 事件驱动模型5.5 模型驱动工程5.5.1 模型驱动体系结构5.5.2 可执行UML要点进一步阅读材料练习参考书目第6章 体系结构设计6.1 体系结构设计决策6.2 体系结构视图6.3 体系结构模式6.3.1 分层体系结构6.3.2 容器体系结构6.3.3 客户机一服务器体系结构6.3.4 管道和过滤器体系结构6.4 应用体系结构6.4.1 事务处理系统6.4.2 信息系统6.4.3 语言处理系统要点进一步阅读材料练习参考书目第7章 设计与实现7.1 利用UML进行面向对象设计7.1.1 系统上下文与交互7.1.2 体系结构的设计7.1.3 对象类识别7.1.4 设计模型7.1.5 接口描述7.2 设计模式7.3 实现问题7.3.1 复用7.3.2 配置管理7.3.3 宿主机一目标机开发7.4 开源开发要点进一步阅读材料练习参考书目第8章 软件测试8.1 开发测试8.1.1 单元测试8.1.2 选择单元测试案例8.1.3 组件测试8.1.4 系统测试8.2 测试驱动开发8.3 发布测试8.3.1 基于需求的测试8.3.2 情景测试8.3.3 性能测试8.4 用户测试要点进一步阅读材料练习参考书目第9章 软件进化9.1 进化过程9.2 程序进化的动态特性9.3 软件维护9.3.1 维护预测9.3.2 软件再工程9.3.3 通过重构进行预防性维护9.4 遗留系统管理要点进一步阅读材料练习参考书目第二部分 可依赖性和信息安全性第三部分 高级软件工程第四部分 软件管理
精彩书摘
现代社会离不开软件。国家基础设施和公共建设都是由基于计算机的系统控制,大多数的电子产品都有计算机和控制软件。工业制造和分销已经完全计算机化了,金融系统也是这样。娱乐业,包括音乐产业、计算机游戏产业、电影和电视产业,也是一个软件密集型的产业。因此,软件工程对于一个国家和整个国际社会的运转都是必不可少的。 软件是抽象的、不可触摸的,它不受物质材料的限制,也不受物理定律或加工过程的制约,这一方面使软件工程得以简化,因为软件的潜能不受物理因素的限制;另一方面,由于缺乏自然约束,软件系统也就很容易变得极为复杂,理解它会很困难、改变它价格高昂。 从简单的嵌入式系统到复杂的全球信息系统,有很多不同类型的软件系统。正是由于不同的软件系统需要不同的技术,所以试图为软件工程寻求通用的符号系统、方法和技术是毫无意义的。开发一个机构信息系统和开发一个科学仪器的控制器是完全不同的。而这些系统都跟图形密集型的计算机游戏没有太多的共同点。所有这些应用都需要软件工程,但不是都需要相同的软件工程技术。 现在仍有许多有关软件项目出问题和“软件失败”的报道。软件工程因不能充分支持现代软件的开发而遭非议。然而,在我看来,这些所谓的软件失败源于以下两方面的原因: 1.不断增长的需求由于新的软件工程技术可以帮助我们构建更大更复杂的系统,用户的需要因而在发生改变。系统必须更快速地构建并交付;需要更大更复杂的系统;系统必须具备在以前看来不可能实现的功能。现有的软件工程方法已经不能应对新形势,而新的软件工程技术还有待于进一步发展。 ……
前言/序言
《软件工程(原书第9版)》图书简介 一、 软件工程的基石:从概念到实践的演进 本书深入探讨了软件工程这一多学科交叉领域的核心理念与前沿实践,旨在为读者构建一套系统、扎实且与时俱进的软件开发知识体系。我们将从软件工程的本质出发,追溯其发展历程,理解为何在信息技术飞速迭代的今天,规范化的软件工程方法论显得尤为重要。从最初对代码质量和效率的粗放式追求,到如今强调全生命周期管理、敏捷协作、风险控制和可维护性,软件工程早已超越了单纯的技术范畴,成为保障复杂软件系统成功交付的关键驱动力。 核心内容梳理: 软件工程的定义与目标: 软件工程并非仅仅是编写代码,而是涵盖了从需求获取、设计、实现、测试、部署到维护的全过程。其核心目标是“以工程化的方法来开发和维护软件”,确保软件产品在规定的时间、成本和质量要求下完成。这包括提高软件的可靠性、可维护性、可重用性、效率以及满足用户需求。 软件生命周期模型: 本书详细剖析了各种经典的软件生命周期模型,如瀑布模型、迭代模型(包括螺旋模型)、原型模型以及面向对象模型。每种模型都有其适用的场景和局限性,理解它们的内在逻辑有助于开发者根据项目特点选择最合适的开发流程。例如,瀑布模型强调线性顺序,适合需求明确的项目;而迭代模型则允许在开发过程中不断完善和修正,更契合需求模糊或易变的项目。 软件开发流程与活动: 软件开发是一个复杂而有序的流程,本书将细致讲解其中的关键活动: 可行性研究: 在项目启动阶段,评估技术、经济、法律和操作上的可行性,为决策提供依据。 需求工程: 这是整个软件开发流程的基石。我们将深入探讨需求获取(访谈、问卷、场景分析等)、需求分析(建模、冲突检测)、需求规格说明(清晰、无歧义、完整、一致)以及需求验证。理解用户真实的需求是避免后期返工、降低项目风险的关键。 软件设计: 设计是将需求转化为具体蓝图的过程。本书将涵盖结构化设计(自顶向下分解、模块化)和面向对象设计(类、对象、继承、多态、封装)的原则和方法。我们会探讨架构设计(全局结构、模块划分)和详细设计(数据结构、算法、接口)。 软件实现: 编码阶段是设计的具体落地。我们将关注编码规范、代码风格、可读性、可维护性以及如何利用集成开发环境(IDE)提高效率。 软件测试: 测试是保证软件质量的重要环节。本书将全面介绍各种测试策略和技术,包括单元测试、集成测试、系统测试、验收测试,以及黑盒测试、白盒测试、灰盒测试等。我们将强调测试的系统性、计划性以及自动化测试的重要性。 软件维护: 软件交付并非终点,维护是软件生命周期中最耗时、成本最高的阶段。本书将分析不同类型的维护活动(纠错性、适应性、完善性、预防性),并探讨如何通过良好的设计和文档来降低维护成本,提高软件的长期价值。 二、 软件工程方法论与实践:构建高质量软件的基石 软件工程的价值体现在其所倡导的各种方法论和技术,这些工具和框架帮助团队更有效地协作、更精准地解决问题。本书将全面介绍当前业界广泛应用且经久考验的软件工程方法论。 核心内容梳理: 结构化方法: 尽管面向对象方法已成为主流,但结构化方法所强调的逻辑清晰、模块化和数据流分析等思想仍然具有重要的参考价值。本书将简要回顾结构化分析(SA)和结构化设计(SD)的核心概念。 面向对象方法(OOM): 面向对象思想是现代软件工程的基石。我们将深入讲解面向对象分析(OOA)和面向对象设计(OOD)的关键原则,包括封装、继承、多态、抽象等,以及如何利用UML(统一建模语言)进行建模,如类图、序列图、用例图等,将复杂的系统逻辑可视化。 敏捷开发方法: 敏捷方法论的兴起是软件工程领域的一场革命。本书将详细介绍敏捷开发的核心价值观(个体与交互、工作的软件、客户合作、响应变化)和原则,并重点讲解Scrum、XP(极限编程)等主流敏捷框架。我们将探讨敏捷开发中的角色(如Scrum Master, Product Owner, Development Team)、活动(如Sprint Planning, Daily Scrum, Sprint Review, Sprint Retrospective)以及工件(如Product Backlog, Sprint Backlog, Increment)。敏捷方法论强调快速迭代、持续交付、频繁反馈和团队协作,极大地提高了软件开发的响应速度和适应性。 DevOps文化与实践: DevOps作为一种文化理念和实践集合,将开发(Dev)和运维(Ops)紧密结合,旨在缩短系统开发生命周期,同时提供高质量的软件交付。本书将介绍DevOps的核心理念,如自动化(CI/CD)、持续集成、持续交付、持续部署、基础设施即代码、监控与反馈等,以及它们如何在软件工程实践中发挥关键作用,打破开发与运维之间的壁垒。 软件项目管理: 软件工程离不开有效的项目管理。本书将覆盖项目启动、规划、执行、监控和收尾等阶段的关键活动。我们将探讨项目范围管理、进度管理、成本管理、质量管理、风险管理、沟通管理和资源管理等。熟悉这些管理原则,有助于确保项目按时、按预算、高质量地完成。 软件度量与过程改进: “度量才能改进”是软件工程的核心思想之一。本书将介绍各种软件度量指标,如代码行数(LOC)、圈复杂度、缺陷密度、客户满意度等,以及如何利用这些指标来评估软件质量、预测项目风险、识别过程瓶颈,并指导过程改进活动,如CMMI(能力成熟度模型集成)和ISO标准。 三、 关键技术与支撑:构建现代软件系统的工具箱 除了理论和方法论,掌握相关的技术和工具也是软件工程实践不可或缺的一部分。本书将探讨支撑现代软件开发的一系列关键技术。 核心内容梳理: 需求工程技术: 深入讲解用例建模、用户故事(User Stories)的编写与管理,以及如何进行需求优先级排序。 建模与设计工具: 介绍UML(统一建模语言)的各种图示(类图、对象图、用例图、序列图、协作图、状态图、活动图、组件图、部署图),以及如何使用建模工具(如Enterprise Architect, Visio, Lucidchart等)辅助设计过程。 版本控制系统: 强调Git等分布式版本控制系统在团队协作、代码管理、分支策略、合并冲突解决等方面的重要性。 自动化构建与部署(CI/CD): 详细介绍Jenkins, GitLab CI/CD, GitHub Actions等CI/CD工具的原理与应用,如何实现代码提交后的自动化构建、测试和部署,缩短发布周期,提高交付效率。 软件测试自动化: 探讨单元测试框架(如JUnit, NUnit, Pytest)、集成测试框架、端到端测试框架(如Selenium, Cypress)的应用,以及测试驱动开发(TDD)和行为驱动开发(BDD)的实践。 质量保证(QA)与代码审查: 讲解静态代码分析工具(如SonarQube)的使用,以及代码审查(Code Review)在发现潜在问题、知识共享和团队协作中的价值。 软件架构模式: 介绍常见的软件架构风格,如分层架构、客户端-服务器架构、微服务架构、事件驱动架构等,理解不同架构模式的优缺点及其适用场景。 可维护性与重用性设计: 强调模块化、低耦合、高内聚的设计原则,以及如何设计可重用的组件和库,降低维护成本,提高开发效率。 软件安全工程: 随着网络安全威胁的日益严峻,本书也将涵盖软件安全的基本原则,如最小权限原则、安全编码实践、常见的安全漏洞(如SQL注入、XSS攻击)及其防御方法。 软件度量工具与技术: 介绍如何使用各种工具收集软件度量数据,并对数据进行分析,从而指导过程改进。 四、 行业趋势与未来展望:引领软件工程的发展方向 软件工程领域正以前所未有的速度演进,本书将目光投向行业前沿,探讨未来的发展趋势,帮助读者保持敏锐的洞察力。 核心内容梳理: 人工智能与机器学习在软件工程中的应用: 探讨AI在代码生成、缺陷检测、自动化测试、需求预测、项目管理等方面的潜力,以及如何利用ML技术优化软件开发过程。 低代码/无代码平台: 分析低代码/无代码平台如何改变软件开发模式,降低开发门槛,加速应用交付,以及它们对传统软件工程的挑战与机遇。 云原生与容器化技术: 深入理解Kubernetes、Docker等云原生技术在构建弹性、可伸缩、高可用的现代应用系统中的核心作用,以及它们对软件架构和部署的影响。 微服务架构的演进与挑战: 探讨微服务架构的优势(独立部署、技术多样性、弹性伸缩)与挑战(分布式事务、服务治理、监控复杂性),以及应对策略。 区块链技术在软件工程中的潜在应用: 探讨区块链在代码溯源、版本管理、安全审计、去中心化应用开发等方面的可能应用。 可持续软件工程: 关注软件开发过程对环境的影响,以及如何通过设计和实践实现更节能、更环保的软件系统。 人机协作与开发者体验: 探讨如何通过更好的工具、更友好的开发环境和更有效的协作方式,提升开发者的生产力和幸福感。 软件工程的伦理与社会责任: 随着软件在社会中的影响日益加深,本书也将引导读者思考软件工程的伦理问题,如数据隐私、算法偏见、技术公平性等,以及开发者应承担的社会责任。 结论: 《软件工程(原书第9版)》是一本全面、深入且紧跟时代步伐的著作。它不仅为初学者构建了扎实的理论基础,也为经验丰富的开发者提供了前沿的实践指导。通过学习本书,读者将能够深刻理解软件工程的核心价值,掌握先进的开发方法与技术,从而更自信、更有效地设计、开发、部署和维护高质量的软件系统,应对快速变化的数字时代带来的挑战与机遇。本书的目标是培养具备工程素养、能够独立解决复杂软件问题、并持续学习和适应新技术的优秀软件工程师。