如果你可以编写出合格的代码,但是想更进一步、创作出组织良好而且易于理解的代码,并希望成为一名真正的编程专家或提高现有的职业技能,那么《编程匠艺——编写卓越的代码》都会为你给出答案。本书的内容遍及编程的各个要素,如代码风格、变量命名、错误处理和安全性等。此外,本书还对一些更广泛的编程问题进行了探讨,如有效的团队合作、开发过程和文档编写,等等。本书各章的末尾均提供一些思考问题,这些问题回顾了各章中的一些关键概念,可以促使你像专家一样思考,从而使本书成为那些渴望作为团队的一分子,职业并高效地编程的新手们的一本绝佳的参考书。
第Ⅰ篇 代码表面第一部分
第1章 善于防守——健壮代码的防御性编程技巧
1.1 向优秀的代码前进
1.2 设想:最坏的选择
1.3 什么是防御性编程
1.4 又大又坏的世界
1.5 防御性编程技巧
1.5.1 使用好的编码风格和合理的设计
1.5.2 不要仓促地编写代码
1.5.3 不要相信任何人
1.5.4 编码的目标是清晰,而不是简洁
1.5.5 不要让任何人做他们不该做的修补工作
1.5.6 编译时打开所有警告开关
1.5.7 使用静态分析工具
1.5.8 使用安全的数据结构
1.5.9 检查所有的返回值
1.5.10 审慎地处理内存(和其他宝贵的资源)
1.5.11 在声明位置初始化所有变量
1.5.12 尽可能推迟一些声明变量
1.5.13 使用标准语言工具
1.5.14 使用好的诊断信息日志工具
1.5.15 审慎地进行强制转换
1.5.16 细则
1.6 约束
1.6.1 约束的内容
1.6.2 移除约束
1.7 总结
1.8 另请参见
1.9 思考
1.9.1 深入思考
1.9.2 结合自己
第2章 精心布局——源代码的版面和样式
2.1 什么是关键
2.2 了解你的读者
2.3 什么是好的样式
2.4 使用括号
2.4.1 K&R括号风格
2.4.2 悬挂式的括号风格
2.4.3 缩进的括号风格
2.4.4 其他的括号风格
2.5 主宰一切的风格
2.6 内部风格(以及在哪里使用它们)
2.7 设立标准
2.8 正义的战争
2.9 总结
2.10 另请参见
2.11 思考
2.11.1 深入思考
2.11.2 结合自己
第3章 名正言顺——为有意义的事物起有意义的名称
3.1 为什么我们应该恰当地命名呢
3.2 我们对什么进行命名
3.3 名字游戏
3.3.1 描述性
3.3.2 技术上正确
3.3.3 符合语言习惯
3.3.4 恰当
3.4 具体细节
3.4.1 命名变量
3.4.2 命名函数
3.4.3 命名类型
3.4.4 命名名字空间
3.4.5 命名宏
3.4.6 命名文件
3.5 玫瑰不叫玫瑰
3.5.1 保持前后一致
3.5.2 利用上下文
3.5.3 使用对你有利的名称
3.6 总结
3.7 另请参见
3.8 思考
3.8.1 深入思考
3.8.2 结合自己
第4章 不言自明——编写“自文档化”代码的技巧
4.1 自文档化的代码
4.2 编写自文档化代码的技术
4.2.1 使用好的样式编写简单的代码
4.2.2 选择有意义的名称
4.2.3 分解为原子函数
4.2.4 选择描述性的类型
4.2.5 命名常量
4.2.6 强调重要的代码
4.2.7 分组相关信息
4.2.8 提供文件头
4.2.9 恰当地处理错误
4.2.10 编写有意义的注释
4.3 实用的自文档化方法
4.3.1 文学性编程
4.3.2 文档化工具
4.4 总结
4.5 另请参见
4.6 思考
4.6.1 深入思考
4.6.2 结合自己
第5章 随篇注释——如何编写代码注释
5.1 什么是代码注释
5.2 注释看上去是什么样的
5.3 多少注释是恰当的
5.4 注释中应该有些什么
5.4.1 解释为什么,而不是怎么样
5.4.2 不要描述代码
5.4.3 不要取代代码
5.4.4 确保注释有用
5.4.5 避免分心
5.5 实践
5.6 从审美的角度看注释
5.6.1 一致性
5.6.2 清晰的块注释
5.6.3 缩进的注释
5.6.4 行尾注释
5.6.5 帮助你阅读代码
5.6.6 选择一种维护成本较低的风格
5.6.7 分隔板
5.6.8 标志
5.6.9 文件头注释
5.7 使用注释
5.7.1 帮助你编写例行程序
5.7.2 错误修正通告
5.7.3 注释过时
5.7.4 维护和空洞无物的注释
5.8 总结
5.9 另请参见
5.10 思考
5.10.1 深入思考
5.10.2 结合自己
第6章 人非圣贤——处理不可避免的情况——代码中的错误情形
6.1 从何而来
6.2 错误报告机制
6.2.1 不报告
6.2.2 返回值
6.2.3 错误状态变量
6.2.4 异常
6.2.5 信号
6.3 检测错误
6.4 处理错误
6.4.1 何时处理错误
6.4.2 可能的反应
6.4.3 代码示例
6.5 使地狱浮现
6.6 管理错误
6.7 总结
6.8 另请参见
6.9 思考
6.9.1 深入思考
6.9.2 结合自己
第Ⅱ篇 代码的神秘生命
第7章 欲善其事,先利其器——使用工具构建软件
7.1 什么是软件工具
7.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 总结
7.6 另请参见
7.7 思考
7.7.1 深入思考
7.7.2 结合自己
第8章 测试时代——测试代码的魔术
8.1 反思现实
8.2 谁、是什么、何时以及为什么
8.2.1 我们为什么要测试
8.2.2 谁来进行测试
8.2.3 测试的内容有些什么
8.2.4 何时进行测试
8.3 测试并不难……
8.4 测试的类型
8.5 选择单元测试用例
8.6 为测试而设计
8.7 看!不要用手!
8.8 面对故障该怎么办
8.9 你能管理它吗
8.9.1 缺陷跟踪系统
8.9.2 bug审查
8.10 总结
8.11 另请参见
8.12 思考
8.12.1 深入思考
8.12.2 结合自己
第9章 寻找缺陷——调试:当事情进展得不顺利时该怎么办
9.1 生活的真相
9.2 bug的种类
9.2.1 从远处看
9.2.2 从近处看
9.2.3 从更近处看
9.3 消灭害虫
9.3.1 地下之路
9.3.2 地上之路
9.4 搜寻bug
9.4.1 编译时错误
9.4.2 运行时错误
9.5 如何修正缺陷
9.6 预防
9.7 除蜂剂、驱虫剂、捕蝇纸
9.7.1 调试器
9.7.2 内存访问校验器
9.7.3 系统调用跟踪
9.7.4 内核转储
9.7.5 日志
9.8 总结
9.9 另请参见
9.10 思考
9.10.1 深入思考
9.10.2 结合自己
第10章 代码构建——将源代码转换为可执行代码的过程
10.1 语言障碍
10.1.1 解释型语言
10.1.2 编译型语言
10.1.3 字节编译型语言
10.2 小题大做
10.3 构建软件版本
10.4 怎样才算是一个优秀的构建系统
10.4.1 简洁
10.4.2 一致
10.4.3 可重复和可靠
10.4.4 原子性
10.4.5 能够应付错误
10.5 技术细节
10.5.1 目标的选择
10.5.2 内务处理
10.5.3 依赖关系
10.5.4 自动构建
10.5.5 构建配置
10.5.6 递归地使用make
10.6 请发布我吧
10.7 构建大师是全能的吗
10.8 总结
10.9 另请参见
10.10 思考
10.10.1 深入思考
10.10.2 结合自己
第11章 追求速度——优化程序和编写高效的代码
11.1 优化是什么
11.2 是什么使代码不尽如人意
11.3 为什么不进行优化呢
备选方案
11.4 为什么要进行优化
11.5 优化的具体细节
11.5.1 证明你需要进行优化
11.5.2 找出运行得最慢的代码
11.5.3 测试代码
11.5.4 优化代码
11.5.5 优化之后
11.6 优化的技术
11.6.1 设计更改
11.6.2 代码更改
11.7 编写高效的代码
11.8 总结
11.9 另请参见
11.10 思考
11.10.1 深入思考
11.10.2 结合自己
第12章 不安全感综合症——编写安全的程序
12.1 危险
12.2 敌人
12.3 借口,都是借口
12.4 感到很脆弱
12.4.1 不安全的设计和体系结构
12.4.2 缓冲溢出
12.4.3 嵌入的查询字符串
12.4.4 竞争状况
12.4.5 整数溢出
12.5 防范措施
12.5.1 系统安装技术
12.5.2 软件设计技术
12.5.3 代码实现技术
12.5.4 规程技术
12.6 总结
12.7 另请参见
12.8 思考
12.8.1 深入思考
12.8.2 结合自己
第Ⅲ篇 代码的形成过程
第13章 崇尚设计——如何创作出优秀的软件设计
13.1 边设计边编程
13.2 我们要设计什么
13.3 为什么这么忙乱
13.4 良好的软件设计
13.4.1 简洁
13.4.2 优雅
13.4.3 模块化
13.4.4 良好的接口
13.4.5 可扩展性
13.4.6 避免重复
13.4.7 可移植性
13.4.8 符合语言习惯
13.4.9 良好地文档化
13.5 如何设计代码
13.5.1 设计方法和过程
13.5.2 设计工具
13.6 总结
13.7 另请参见
13.8 思考
13.8.1 深入思考
13.8.2 结合自己
第14章 软件体系结构——奠定软件设计的基础
14.1 什么是软件体系结构
14.1.1 软件蓝图
14.1.2 视图
14.1.3 在何时和何处进行体系结构设计
14.1.4 用体系结构来做什么
14.1.5 关于组件和连接
14.2 什么是良好的体系结构
14.3 体系结构风格
14.3.1 没有体系结构
14.3.2 分层的体系结构
14.3.3 管道和过滤器体系结构
14.3.4 客户端/服务器体系结构
14.3.5 基于组件的体系结构
14.3.6 框架
14.4 总结
14.5 另请参见
14.6 思考
14.6.1 深入思考
14.6.2 结合自己
第15章 改良与革命——代码是如何成长的
15.1 软件腐烂
15.2 警告信号
15.3 代码是如何成长的
15.4 相信不可能之事
15.5 对此我们可以做些什么
15.5.1 编写新代码
15.5.2 维护现有代码
15.6 总结
15.7 另请参见
15.8 思考
15.8.1 深入思考
15.8.2 结合自己
第Ⅳ篇 “一群”程序员第一部分
第16章 代码猴子——培养正确的编程态度和方法
16.1 各种各样的猴子
16.1.1 卖力工作的程序员
16.1.2 代码猴子
16.1.3 权威
16.1.4 半权威
16.1.5 傲慢的天才
16.1.6 牛仔
16.1.7 规划者
16.1.8 老前辈
16.1.9 狂热者
16.1.10 单线条程序员
16.1.11 拖沓者
16.1.12 勉强的团队领导
16.1.13 你
16.2 理想的程序员
16.3 那么该怎么办
16.4 最愚蠢的人
16.5 总结
16.6 另请参见
16.7 行为表格
16.8 思考
16.8.1 深入思考
16.8.2 结合自己
第17章 团结就是力量——团队合作与个人程序员
17.1 我们的团队——概览
17.2 团队组织
17.2.1 管理方法
17.2.2 责任划分
17.2.3 组织和代码结构
17.3 团队合作工具
17.4 团队疾病
17.4.1 巴别塔
17.4.2 独裁制
17.4.3 民主制
17.4.4 卫星站
17.4.5 大峡谷
17.4.6 流沙
17.4.7 旅鼠
17.5 良好团队合作的个人技巧和特点
17.5.1 沟通
17.5.2 谦虚
17.5.3 处理冲突
17.5.4 学习和适应能力
17.5.5 了解你的不足之处
17.6 团队合作原则
17.6.1 集体代码所有制
17.6.2 尊重别人的代码
17.6.3 编码准则
17.6.4 定义成功
17.6.5 定义责任
17.6.6 避免倦怠
17.7 团队的生命周期
17.7.1 团队的创建
17.7.2 团队的成长
17.7.3 团队合作
17.7.4 团队结束
17.8 总结
17.9 另请参见
17.10 行为表格
17.11 思考
17.11.1 深入思考
17.11.2 结合自己
第18章 安全措施——源代码控制与自我控制
18.1 我们的责任
18.2 源代码控制
18.2.1 修订控制
18.2.2 访问控制
18.2.3 处理代码库
18.2.4 在代码树上创建分支
18.2.5 源代码控制简史
18.3 配置管理
18.4 备份
18.5 发布源代码
18.6 应该将源代码放在哪里
18.7 总结
18.8 另请参见
18.9 思考
18.9.1 深入思考
18.9.2 结合自己
第Ⅴ篇 开发过程的组成部分第一部分
第19章 注意细节——编写软件规范
19.1 规范到底是什么
19.2 规范的类型
19.2.1 需求规范
19.2.2 功能规范
19.2.3 系统体系结构规范
19.2.4 用户界面规范
19.2.5 设计规范
19.2.6 测试规范
19.3 规范应当包含哪些内容
19.4 规范编写过程
19.5 我们为什么会不编写规范
19.6 总结
19.7 另请参见
19.8 思考
19.8.1 深入思考
19.8.2 结合自己
第20章 代码审查——执行代码审查
20.1 什么是代码审查
20.2 何时进行审查
20.2.1 是否要进行审查
20.2.2 审查哪些代码
20.3 执行代码审查
20.3.1 代码审查会议
20.3.2 集成审查
20.4 审查你的态度
20.4.1 作者的态度
20.4.2 审查人员的态度
20.5 完美的代码
20.6 代码审查之外
20.7 总结
20.8 另请参见
20.9 清单
20.10 思考
20.10.1 深入思考
20.10.2 结合自己
第21章 时间估计——软件时间范围估计的魔术
21.1 在黑暗中摸索
21.2 为什么估计这么困难?
21.3 压力之下
21.4 实用的估计方法
21.5 计划游戏
21.6 坚持!
21.7 总结
21.8 另请参见
21.9 思考
21.9.1 深入思考
21.9.2 结合自己
第Ⅵ篇 从高处鸟瞰
第22章 程序秘方——代码开发的方法和过程
22.1 编程风格
22.1.1 结构化编程
22.1.2 面向对象的程序设计
22.1.3 函数式编程
22.1.4 逻辑编程
22.2 烹饪方法:做什么与怎样做
22.3 开发过程
22.3.1 混乱
22.3.2 瀑布模型
22.2.3 SSADM和PRINCE
22.3.4 V模型
22.3.5 原型设计
22.3.6 迭代和增量开发
22.3.7 螺旋模型
22.3.8 敏捷的方法
22.3.9 其他开发过程
22.4 已经够了!
22.5 选择一种过程
22.6 总结
22.7 另请参见
22.8 思考
22.8.1 深入思考
22.8.2 结合自己
第23章 编程领域大观——不同的编程分支
23.1 应用程序编程
23.1.1 塑装软件
23.1.2 定制应用程序
23.2 游戏编程
23.3 系统编程
23.4 嵌入式编程
23.5 分布式编程
23.6 网络应用程序编程
23.7 企业编程
23.8 数字编程
23.9 那又怎样
23.10 总结
23.11 另请参见
23.12 思考
23.12.1 深入思考
23.12.2 结合自己
第24章 下一步呢——结果好就一切都好
但下一步该做什么呢?
答案和讨论
参考书目
索引
SolidWorks 2016机械设计从入门到精通-中文版-(附光盘) 本书特色 solidworks是世界上首套专门基于windows系统开发的三维cad软件...
《新妈妈的育儿经》内容简介:本书共分九章,内容从优孕优生、饮食营养、生活照顾、疾病预防与护理、智力开拓、行为培养、心理健康
计算机监控技术与系统开发 内容简介 计算机监控系统广泛应用于众多领域。本书以快速语言Visual Basic 6.0和TC2.0作为工具,详细阐述了计算机监控系...
《STM32开发实战:LabVIEW卷》内容简介:作为学习LabVIEW与32位微处理器STM32的入门级教材,本书从LabVIEWforARM嵌入式软件架构入...
《孟子讲座》内容简介:孟子是孔子之后的儒学大师,在战国中期继承孔子思想学说并把儒学发展到新的阶段,被奉为“亚圣”。本书是作
《帝国首辅:张居正》内容简介:23岁初入官场,张居正是一个刚正不阿的理想主义者,却在亲历腥风血雨的内阁斗争后,痛悟了什么是政
开放式知识网络与高技术服务模式创新-构建体系.动态耦合及网络效应 本书特色 本书既为高技术开放式知识网络体竞争优势的完善、强化与发展提供有力的理论支撑与战略依据...
这本书从历史的角度解读了印刷字体,从形制、体制到印制的演进过程,以及对中国文化、经济、科技和人们生活产生的影响。还可以了
《过瘾湘菜800例》内容简介:湘菜即湖南菜,至今已有2000多年的历史。1974年在长沙马王堆出土的一套西汉随葬竹简菜谱上,已记载了1
《所思不远》内容简介:本书为知·趣丛书之一种。作者选取朱彝尊、陈维崧、纳兰容若、王昙、金礼赢、黄仲则、龚自珍、谭嗣同、吴保
KenAulettahaswrittenthe"AnnalsofCommunications"columnforTheNewYorkersince1992.He...
《禅宗写作传统研究》内容简介:禅宗写作传统是指禅宗文学中具有相对固定的写作形态且世代相传的文学样式。禅宗写作传统种类繁多,
此刻呈现在你面前的是这样一本书:它专为非设计专业的你准备,无需任何设计基础即可阅读;它既能让你的PPT倍儿有面子,又能为你的
《群体的思维:如何利用群体智慧解决工作、生活难题》无论我们是要做金融方面的决策、换个工作还是找到我们的另一半,众包都不失
《设计思维:建筑设计过程解析(原书第3版)》第二版于1990年出版,之后第三版就一直在不停的改写当中。布莱恩·劳森一直在努力了解
《中国神话密码》内容简介:本书通过五个方面梳理中国神话体系:《山海经》探秘、上古时代的神界领袖、日常生活中的诸神、动植物与
《论语新解》内容简介:《论语》为儒家经典著作,自西汉以来,为中国识字人一部人人必读之书。历代对《论语》解读注释之书,浩如烟
《情绪自控》内容简介:10个经典又各具风采的女性,10种常见又容易失控的情绪 《情商是什么》作者李筱懿多年沉淀,用心理学知识教你
《通信企业市场营销》结合作者多年来从事电信企业市场营销理论研究的成果,以及我国电信企业的市场营销活动和实践,论述了市场营
《普通高等教育"十一五"国家规划教材·通信网理论与应用》系统地介绍了通信网的相关理论和技术,主要内容包括通信网的基本概念及