本书从软件工程理论、软件开发实验、编程心理学等多个方面,深入剖析了极限编程的原理和实质。全书以分析对极限编程的种种误解为主线,以编程实验数据为基础,用科学的方法阐述了极限编程的内涵,以解破幻象,还极限编程以真面目。全书分为三大部分,共10章。本书不仅对极限编程做了客观而深刻的剖析,而且其实验方法和分析方法具有极大的借鉴价值。作者通过融会各种学科的知识,旁征博引地对开发软件开发方法和实践进行了深入的研讨,这是值得读者精读本书的另一大特色。
本书适合各类软件开发人员、编程爱好者和高等院校计算机相关专业的师生阅读
第一部分 软件和模型
第1章 软件和模型
1.1 冒险的成功
1.1.1 瀑布模型的特点
1.1.2 可接受的失败
1.1.3 与工程项目的比较
1.1.4 项目失败的实例
1.2 能力成熟度模型
1.2.1 第一级——初始级
1.2.2 第二级——可重复级
1.2.3 第三级——定义级
1.2.4 第四级——管理级
1.2.5 第五级——优化级
1.2.6 关键过程域
1.3 即时上市达成即时上市的方法
1.4 足够好的软件
1.5 优秀的程序员
1.5.1 程序员的差异
1.5.2 魔术数字28
1.5.3 真正的才能
1.6 编程心理学
1.6.1 不同的诠释
1.6.2 编码不等于软件项目
1.7 不要从经验学习
1.7.1 信念
1.7.2 从经验中学习
1.7.3 经验与实验
1.8 总结
思考与练习
参考文献
第2章 极限编程
2.1 极限编程的诞生
2.2 快速改变的软件需求
2.3 角色
2.3.1 权利和责任
2.3.2 单元测试和验收测试
2.3.3 客户
2.3.4 程序员
2.4 价值
2.5 原则
2.6 活动
2.7 12个实践
2.7.1 小版本
2.7.2 规划游戏
2.7.3 现场客户
2.7.4 隐喻
2.7.5 简单设计
2.7.6 重构
2.7.7 测试驱动开发
2.7.8 持续集成
2.7.9 结对编程
2.7.10 代码共有
2.7.11 编码标准
2.7.12 每周40小时工作制
2.8 极限编程实践的追溯
2.9 软件过程改进
2.10 总结
思考与练习
参考文献
第3章
3.1 敏捷软件开发
3.1.1 敏捷宣言
3.1.2 敏捷开发的原则
3.2 软件方法
3.2.1 控制元素
3.2.2 方法的设计
3.2.3 轻量级和重量级方法
3.3 Scrum
3.3.1 橄榄球的团队精神
3.3.2 简史
3.3.3 Scrum的开发方式
3.3.4 Scrum实践
3.4 极限编程和Scrum
3.4.1 极限编程和Scrum的比较
3.4.2 xP@Scrum
3.5 总结
思考与练习
参考文献
第二部分 幻象和真实
第4章 结对编程
4.1 科学和艺术
4.1.1 结对编程的方法
4.1.2 经济上的争议
4.1.3 管理上的疑问
4.2 无工资世界和真实世界
4.2.1 无工资世界
4.2.2 真实世界
4.3 结对编程的效率
4.3.1 Nosek的实验
4.3.2 Williams的实验
4.3.3 Nawrocki的实验
4.3.4 结对编程效率的矛盾
4.4 结对编程的普查
4.4.1 百分比分析
4.4.2 比例问题
4.4.3 开放式评论
4.5 结对编程的扩展
4.5.1 结对学习
4.5.2 结对程序员的组合
4.5.3 分布式结对编程
4.5.4 三结编程
4.6 总结
思考与练习
参考文献
第5章 群动力
5.1 群体动力学与结对编程
5.2 群体的特性
5.2.1 互动
5.2.2 结构
5.2.3 凝聚力
5.2.4 社会认同
5.2.5 目标
5.3 群体的生命周期
5.4 群体动力学
5.4.1 系统理论
5.5 工作性质
5.5.1 累积性工作
5.5.2 补偿性工作
5.5.3 分离性工作
5.5.4 联合性工作
5.5.5 自由决定性工作
5.6 两个脑袋
5.7 群体生产力下降
5.7.1 评价忧虑
5.7.2 社会两难
5.7.3 生产力假象
5.8 头脑风暴
5.9 总结
思考与练习
参考文献
第6章 重复编程
6.1 结对编程的争议
6.1.1 不可重复的实验
6.1.2 三结编程、四结编程、五结编程,等等
6.1.3 编程不是什么大不了的工作
6.2 经济和生产力
6.3 重复编程
6.3.1 重复的编写程序
6.3.2 效率差异
6.3.3 挑战
6.3.4 一加一等于三
6.3.5 三结编程的效率
6.4 程序算法
6.4.1 不想输的实验
6.4.2 实验结果
6.5 生命游戏
6.5.1 轮转式的实验
6.5.2 先输后赢的结果
6.6 编程认知模型
6.6.1 “定义”
6.6.2 “表示”
6.6.3 “模型”
6.6.4 “模式”
6.6.5 “算法”
6.6.6 “编码”
6.6.7 认知模型的运用
6.6.8 演绎和算法
6.7 总结
思考与练习
参考文献
第7章 重构
7.1 重做和重构
7.1.1 优化
7.1.2 修改
7.2 重构理论
7.2.1 重构和极限编程
7.2.2 可读性和可维护性
7.3 坏气味
7.3.1 重复
7.3.2 过大
7.3.3 功能
7.3.4 依赖
7.3.5 设计
7.3.6 注释
7.4 重构技巧
7.4.1 提取
7.4.2 内联化
7.4.3 重命名
7.4.4 移动
7.4.5 替换算法
7.5 总结
思考与练习
参考文献
第8章 测试驱动开发
8.1 逆流瀑布
8.1.1 设计-编码-测试
8.1.2 测试-编码-设计
8.2 测试和编码
8.2.1 测试
8.2.2 编码
8.2.3 测试驱动开发
8.2.4 测试驱动开发和其他极限编程实践
8.2.5 科学方法
8.3 测试驱动开发的工具
8.3.1 XUnit系列
8.3.2 代码覆盖
8.3.3 Jester
8.3.4 模仿对象
8.3.5 重构浏览器
8.3.6 测试数据
8.4 软件缺陷评估
8.4.1 传统方法
8.4.2 减少缺陷
8.5 测试驱动开发在中国软件业中的应用
8.5.1 对缺乏经验的编程组的TDD指引
8.5.2 项目计划
8.5.3 项目进度跟踪
8.5.4 质量保证
8.5.5 纪律
8.5.6 回溯
8.5.7 推销员问题
8.6 极限编程和测试驱动开发
8.6.1 极限编程成熟度模型
8.6.2 测试驱动开发演化模型
思考与练习
参考文献
第三部分 旅程结束、回到工作
第9章 极限编程的实施
9.1 环境和工序
9.1.1 工效学
9.1.2 每天的工作程序
9.1.3 标准
9.2 实施
9.2.1 故事卡
9.2.2 探棒
9.2.3 故事的优先次序
9.2.4 分开故事
9.2.5 选取结队伙伴
9.2.6 迭代
9.2.7 编程
9.2.8 集成
9.3 模板应用实例
9.3.1 迭代准备
9.3.2 第一迭代
9.3.3 第二迭代
9.3.4 第三迭代和第一次发布
9.4 总结
思考与练习
参考文献
第10章 极限编程的评语
10.1 不愉快的经验
10.1.1 假结对编程
10.1.2 硬性极限编程
10.1.3 梦想里的现场客户
10.1.4 曲解失败为成功
10.1.5 现实中的极限编程
10.2 Humphrey的评估
10.3 反极限编程
10.3.1 大型软件开发
10.3.2 做和道
10.3.3 小教派
10.4 解破幻象
10.4.1 格列佛游记
10.4.2 主观和客观
10.4.3 太极软件开发
10.5 总结
思考与练习
参考文献
附录A 测试驱动开发的形式化描述
附录B JUnit及BubbleSort实例
附录C 重构浏览器RefactorlT概览
附录D 重构实例
附录E Jester安装和应用
附录F Jcoverage安装和应用
附录G Jester和Jcoverage实例比较
附录H 参考答案
极限编程(extremeProgramming,简称XP)在全球掀起了热潮,不管是工业界,还是学术圈,都在谈论着极限编程。在这么短的时间内有如此大的影响力,这在软件工程的发展历程中是罕见的。事实上,极限编程的概念早已伸展到其他领域,如极限设计、极限管理,还有栅艮行销,等等。有人认为极限编程可能是现今最好的软件模型,它超越了传统的软件开发,甚至把从20世纪60年代到90年代所建立的软件开发的方法,完全地倒转过来;但同时也有人严厉地抨击极限编程。软件工程一向以实验和数学为理论基础,但为什么对极限编程会有这么多的争论呢?其实,我们不难明白其中的原因。
在极限编程里,最受争议的一项可算是结对编程——两个程序员坐在同一台计算机前去设计、编码和测试。在1999年,便有研究指出结对编程比两个独立程序员各自编程更有效率;但在2001年,另有研究却指出结对编程是浪费资源的。至今,学者们还在争论结对编程的效益。
传统的软件模型,强调先要完成系统设计和相关文档,才开始编码和测试,即“设计一编码一测试”,并且以文件作为进程的依据。但极限编程把整个过程倒转过来,先测试,然后编码和设计(重构),即“测试一编码一重构”,在此过程里,强调的是测试用例,而不是文件。
那么,到底极限编程的理论是正确的还是错误的呢?它对中小型软件团队是否有帮助呢?这是本书探讨的主题。在2003年5月,我们在意大利和KentBeck闲聊时,大家都谈到发展中国家对于软件工程人才培养的不足,所以这些国家很需要以软件工程实务为基础的实践型书籍。当讨论到现在的极限编程书藉是否适合像中国和南非这样的国家的时候,Kent指出,在他的极限编程书中,所指的程序员是他所熟悉的美国硅谷的程序员(也就是说,经过翻译后的中文极限编程书籍,其内容还是面向硅谷的程序员的),他们的教育背景和文化背景等与其他国家比较,特别是与发展中国家比较,有时有很大不同。因此Kent鼓励我们根据中国的情况,编写中文的极限编程书籍。当然,对国内读者真正有帮助的书籍,不仅要用中文来编写,还要基于国内的软件技术水平和实际的项目经验来编写。
于是,从那以后,我们就开始着手编写本书。
在本书的写作中,主要突出了以下几个写作特色:
(1)全面性。介绍极限编程的概念、实验、理论、应用、影响和评价等。
(2)趣味性。书中收集了很多有趣的开发实例、图片和奇闻轶事。
(3)客观性。中肯地讨论软件开发中有争议的问题。
(4)独立性。各章均为一个完整单元,读者可根据兴趣有选择地阅读。
(5)系统性。本书内容的安排完全考虑到了不具备完整的软件工程背景知识的读者。
(6)可实践性。介绍作者自行开发的极限编程实施模板,帮助建立极限编程队伍。
(7)供自习。每一章都提供了练习题,部分题目还附有答案。
(8)供研究。部分练习题是研究课题,供具有相关经验的读者参考。
在本书的写作过程中,有很多人给予了大力支持,尽管他们对软件项目、杰出的程序员和极限编程的看法不尽相同,但这却使我们反复思量某些概念,并且启发我们从不同的角度去看问题。首先,由衷地感谢电子工业出版社给予的全力的支持,谢谢郭立和张毅给予文字和图片上的意见。衷心感谢梁咏欣、潘永亨、张劲、詹振飞、高爱章、李政、尹汉权、王卉、郑雅杉、向新蓉、张瑞华为本书第一稿的排版和校阅所做的工作。感谢袁峰和万长林评审第二稿。感谢王青教授给予有关人名翻译的意见。感谢赵欣培有关“有形”和“无形”的太极的看法。衷心感谢中国科学院软件研究所的武占春博士和他的一组博士研究生:陈烨、董斐、肖俊超、袁荣、张晖为全书做最后的评审和校正。最后,感谢Kent对我们在结对编程和测试驱动开发上的研究所给予的支持和鼓励。
尽管国内软件开发的能力和技术与欧美国家相比还有一段距离,但我们深信中国人杰地灵,也是卧虎藏龙之地,国内的软件开发水平一定会有大的飞跃。限于作者水平,书中一定存在不少疏漏之处,希望读者看过本书后,多多指教。