随着计算机与互联网在经济与日常生活中的渗透,各种形态的软件层出不穷,如传统的桌面软件、浏览器-服务器结构的Web应用、软件和服务SaaS及移动应用程序APP等,国家和社会对各类软件的需求不断增加。特别是移动APP的出现,再次凸显了小型软件开发的重要性。
传统计算机学科的课程体系涵盖了大量软件开发的知识,如高级语言程序设计、数据结构与算法、数据库、计算机网络、操作系统、编译原理、软件工程等,传授方式理论化、知识碎片化。设置和讲授这些课程的主要目的,甚至有些课程的唯一目的不是提升编程解决问题的能力,而是理解和研制计算机及系统软件。软件工程课程的核心作用是培养软件开发的需求分析、软件建模及团队协作、项目管理等实际工作需要的综合能力,但其基本前提是要求学生具备软件构造能力,即通过设计、编码、单元测试、集成测试和调试的组合,创建有用的软件。现代软件开发方法包括极限编程、测试驱动开发等敏捷方法,突出特点是每个程序员都具有高超的软件开发能力。他们不仅熟练掌握多种类型的编程语言、框架与中间件、设计模式、软件设计和测试技术及数据处理、用户交互等方面的知识,还要熟悉开发流程,具备把实际问题转换成软件的分析、设计和构造能力。
本书旨在以案例为引导,通过集成化解决软件知识的碎片化,提升个人的软件构造能力,加快从程序编写到软件开发的转变,在孤立的基础课程与软件工程课程之间搭建桥梁。目标是把学生培养成能独立地综合运用技术、开发可用产品的高级程序员,再通过后续课程(如软件工程、综合课程设计和实习实训)培养成软件工程师。
主要内容与结构
本书内容涵盖IEEE计算机学会最新颁布的“软件工程知识体系”中“软件构造”知识域的95%以上,以及软件设计、软件测试和敏捷开发的最佳实践,主要包括:
? 软件构造的一般原理:模块化,信息隐藏,逐步求精,面向对象原则,增量迭代,软件复用,软件质量。
? 软件构造的常用技巧:表驱动编程,防御式编程,按意图编程,事件驱动编程,代码重构,框架与程序包,测试驱动开发。
? 软件设计:软件建模及其语言UML,E-R图,控制流图,状态图,设计原则,设计模式,契约式设计,面向对象,用户交互,数据库的设计与实现。
? 软件知识:软件过程,敏捷开发,最佳实践,面向对象编程,数据结构与算法的实现,数据库编程,软件复用。
? 软件构造的工作要素:编码及其规范,构造工具如IDE、Ant、JUnit。
? 软件构造的活动:设计,编码,调试,集成,测试(单元测试、回归测试、集成测试、静态测试)。
不同于传统软件教材按照开发活动或知识域的编写方式,本书以一个案例的演变,模拟不断变化的用户需求,以增量迭代的开发模式,编排这些教学内容。每章完成之后都有可用的、实现了用户要求功能或特性的程序。每章以案例故事引出构造问题,通过例子及设计和代码,讨论解决问题的基本原理、方法、技术等最佳实践,给出一个可操作的构造方案,问题的可选设计、扩展则作为提升或留作练习。
全书共9章。第1章概述软件与软件开发的基本概念,说明软件构造的含义及其在整个软件开发过程中的地位和作用,引入本书案例。第2~9章以增量迭代方式,将功能开发、用户交互及数据处理等知识,与软件开发的原理、技术和工具融合到设计、编码、调试及测试的构造过程。第2章说明模块化概念及其软件的构造技术。第3章描述面向对象的设计原则及其软件的构造技术。第4章学习容器类数据结构与文件的使用和构造。第5章学习用户界面与软件集成的基础,说明非图形菜单式用户交互的设计与实现。第6章学习重构技术、自动化的软件打包与交付。第7章深入学习图形用户界面软件的构造。第8章学习数据库的设计并在应用程序中使用数据库。第9章学习软件复用,使用框架和程序包构造软件。
作者借鉴了国内外计算机科学与软件工程领域的研究与教学成果。首先是主编在德国斯图加特大学计算机系进修期间,其导师路德维希教授于20世纪末在德国大学开创性地设立了“软件工程”示范专业。其次是最近10多年我国软件工程领域教育先行者的大胆探索和实践。最后,在学科和专业技术方面对本书产生巨大影响的是“个体软件过程PSP”、软件复用、敏捷开发方法及软件测试。在此对这些研究者和教育者表示崇高敬意和衷心感谢!
李劲华设计了本书的结构、内容及风格,编写了第1~6章、第9章内容及程序,审阅、校对了全书。周强编写了第7章内容及程序,陈宇编写了第8章内容及程序。
本书在编写过程中得到了学校、学院和电子工业出版社的大力支持,在此表示感谢!
本书谨代表作者们对软件构造的理解与探索。由于认识有限,加之时间仓促,难免存在疏漏和谬误,欢迎读者批评指正。可反馈给出版社(wangxq@phei.com.cn)或作者(E-mail:qduli@126.com,QQ:1487220149)。
使用建议
本书试图将软件构造的原理、原则、方法、技术、流程和技能整合,通过案例的展开由浅及深地学习。对知识的引入遵循足够、按需和渐进的原则。很多方面的知识(如调试、测试、设计、复用)分布在若干章节。读者最好把书中的知识通过案例串连起来,根据需要,可以跳过某个章节、提前看某个章节、需要时回过头来再看前面章节的内容或者查阅相关资料。建议读者一边思考案例问题,一边学习,一边动手实践。
就作者所知,目前国内外的课程体系中缺乏《软件构造》及相应的教材。本书可作为“软件构造”、“Java面向对象课程设计”的教材,也可以选作部分专业面向实用的“软件工程”的参考书。用于“软件工程课程设计”、“软件工程综合实训”等课程时,需补充软件建模、项目管理、团队合作、应用领域等方面的知识。
受篇幅限制,书中对介绍的最佳实践仅给出了关键的实现代码,建议授课教师根据课时选择性采纳或改写。本书提供配套电子课件、案例源程序、例子代码、教学参考方案等,请登录华信教育资源网(http: //www.hxedu.com.cn)注册下载或联系本书编辑(wangxq@phei.com.cn)索取。
本书面向计算机学科的本科学生,也适合学习软件开发的其他学生及爱好者。建议在第4~6学期使用。要求读者具备程序设计和面向对象编程基础。有些内容可在需要时适当补充。对软件工程专业,后续课程可以是:软件工程、软件设计、软件测试、软件项目管理等。对计算机及其他应用程序设计技术的专业,建议选修“软件工程”或概论/导论,学习团队开发大型软件的技术和方法。
关于案例
案例的目的是模仿实际工作,传授软件构造的基本知识、主要活动、技术与工具的综合运用能力。案例不宜太难,需求简单明了,使没有多少经验的学生容易理解,把重点放在软件的设计与构造,在一个学期就完成一个可运行的、有意义的程序。设计的案例产生3000行左右的代码,计划持续3个月、60人时的工作量。案例开发不指定某种具体编辑语言和软件过程。
案例是开发一个“50道100以内的加减法口算习题”的程序。具体要求模拟现实生活,在用户使用程序的过程中,不断提出新的要求和功能。
案例看似简单,却可以有多种理解方式及扩展。例如,100以内的运算数可包含100或0;可将运算数值扩大到500、1000;算式可以是至多包含两个运算符的加减法算术运算,还可以是至多包含4个运算符的四则算术运算。每章的提升与课后练习对案例提出了一些变化、延伸及构造,满足不同层次的教学要求。
本书程序主要采用Java语言。除个别情况外,书中不提供完整代码,意在培养学生独立解决问题的能力,构造不同的、可运行的软件。
教学方案
本书面向普通高校本科学生,提供3种教学参考方案,任课教师可更根据需要调整。例如,如果面向对象程序设计的基础较弱,可减少第2章学时;如果仅用GUI界面的用户交互,可减少第5章学时;如果学生程序设计能力较强,可减少第5章之前的实验,增加第9章学时。
(1)基本教学方案(方案1),72学时(18学时×5周),讲课38学时,实验34学时。
章 节 基 本 内 容 讲课 实验内容 实验
1 掌握1.3节、1.5节和1.6节,理解1.1节、1.2节和1.4节,阅读案例1.7节 掌握程序与软件的异同、影响软件开发的因素、典型的软件开发过程、软件构造,理解软件的相关概念、软件生存周期和敏捷开发,阅读案例 3
2 掌握2.2~2.4节、2.7.3节、2.7.4节,理解2.1节、2.5节、2.7.1节,阅读与实践2.6节,其余了解 掌握模块化设计、数据结构与算法的选择、测试设计、编码风格,理解模块化概念、测试概念、调试概念,阅读案例,其余了解 4 构造1、2 4
3 掌握3.2~3.5节,理解3.1节、3.7.2节、3.7.3节,阅读与实践3.6节,其余了解 掌握基本的面向对象设计技术、调试技术、测试框架,理解抽象、封装、ADT、面向对象的概念、设计模式、设计原则,阅读案例,其余了解 5 构造3 4
4 掌握4.2~4.4节、4.5.2节、4.6节、4.7.1~4.7.3节,理解4.1节、4.5.1节、4.7.4节,阅读与实践4.8节,其余了解 掌握文件/输入/输出流的编程、防御性编程、正则表达式、表驱动编程、白盒测试设计、JUnit其他测试,理解数据持久性、算式基及测试断言,阅读案例,其余了解 5 构造4、5、6 6
5 掌握5.1.4节、5.3节、5.4.3节、5.5节、5.7.1节、5.7.2节,理解5.1节其他、5.2节、5.4节,阅读与实践5.6节,其他了解 掌握菜单式用户交互的设计与编程、原型法、代码走查、静态分析工具、软件集成与测试、基于状态图的测试,理解用户交互的原则和开发过程、回归测试、静态测试,阅读案例,其余了解 5 构造7 4
6 掌握6.1.1节、6.2.2节、6.2.3节,理解6.1.2节、6.2.1节,阅读与实践6.3节、6.4.2节,其余了解 掌握基本的重构技术和过程、Java程序打包/交付,理解代码重构、软件交付,阅读案例和TDD,其余了解 4