新書推薦:
![法国小史](http://103.6.6.66/upload/mall/productImages/24/31/9787301352328.jpg)
《
法国小史
》
售價:HK$
110.4
![五凉王国的七张面孔](http://103.6.6.66/upload/mall/productImages/24/30/9787523402467.jpg)
《
五凉王国的七张面孔
》
售價:HK$
79.4
![掌控生活,从掌控时间开始](http://103.6.6.66/upload/mall/productImages/24/30/9787521765359.jpg)
《
掌控生活,从掌控时间开始
》
售價:HK$
55.2
![物理光学漫步——衍射计算理论及应用研究故事](http://103.6.6.66/upload/mall/productImages/24/31/9787122459954.jpg)
《
物理光学漫步——衍射计算理论及应用研究故事
》
售價:HK$
193.2
![人类起源简史:破译700万年人类进化的密码](http://103.6.6.66/upload/mall/productImages/24/30/9787505758957.jpg)
《
人类起源简史:破译700万年人类进化的密码
》
售價:HK$
78.2
![古典与现代 : 民国大学的潮与岸](http://103.6.6.66/upload/mall/productImages/24/30/9787523408568.jpg)
《
古典与现代 : 民国大学的潮与岸
》
售價:HK$
89.7
![浮华梦醒:民国实业家的创业之路](http://103.6.6.66/upload/mall/productImages/24/30/9787523406618.jpg)
《
浮华梦醒:民国实业家的创业之路
》
售價:HK$
64.4
![财之道丛书·后资本主义生活:财富的意义、经济的未来与货币的时间理论](http://103.6.6.66/upload/mall/productImages/24/31/9787213115288.jpg)
《
财之道丛书·后资本主义生活:财富的意义、经济的未来与货币的时间理论
》
售價:HK$
78.2
|
內容簡介: |
软件开发既需要理论和科学,也需要经验和技艺。可惜,一直以来许多图书都只关注前一部分,而忽略了后一部分。马克的这本书主要关注的就是经验和技艺的部分。本书既详细讲解了API设计、红绿重构等常用技术,也演示了如何撰写提交说明、如何修改单元测试,同时对故障定位、代码阅读、团队合作等传统上被认为“难以说清”的话题,也给出了实用且精当的建议。难能可贵的是,与其他图书提供的示例代码库不同,本书的示例代码库包含了完整的Git提交记录。也就是说,读者可以按照作者的道路,一步一个脚印地重温整个开发过程。如果你的经验还不够丰富,建议严格按照作者的讲解,认真读完全书,掌握软件工程的技巧。如果你已经有足够的开发经验,不妨略读全书,精读自己不熟悉但感兴趣的部分。对自己不认同的部分,也不妨花时间了解作者主张的前因后果,让自己对许多问题有更全面的认知。
|
關於作者: |
马克·西曼是一位平庸的经济学家,于是他改行当了程序员。从20世纪90年代末起,他一直在开发Web和企业应用。马克年轻的时候想成为摇滚明星,然而不幸的是他既没有音乐天赋,也没有摇滚明星的长相——结果,他成了Certi?ed Rockstar Developer。他写的一本关于依赖注入的书获得了Jolt大奖,做过100余场国际会议演讲,并给教育在线网站Pluralsight和Clean Coders录制过视频课程。马克·西曼是一位平庸的经济学家,于是他改行当了程序员。从20世纪90年代末起,他一直在开发Web和企业应用。马克年轻的时候想成为摇滚明星,然而不幸的是他既没有音乐天赋,也没有摇滚明星的长相——结果,他成了Certi?ed Rockstar Developer。他写的一本关于依赖注入的书获得了Jolt大奖,做过100余场国际会议演讲,并给教育在线网站Pluralsight和Clean Coders录制过视频课程。
|
目錄:
|
第1部分 由慢到快 第1章 是艺术,还是科学3 1.1 盖房子4 1.1.1 项目论之误4 1.1.2 阶段论之误5 1.1.3 依赖5 1.2 培育花园6 1.2.1 花园中的植物为何会生长6 1.3 工程7 1.3.1 作为手工制品的软件7 1.3.2 实用性8 1.3.3 软件工程的早期表述9 1.3.4 与软件工程共同进步10 1.4 结论12 第2章 检查清单13 2.1 助记工具13 2.2 针对新代码库的检查清单15 2.2.1 使用Git16 2.2.2 自动化构建17 2.2.3 显示所有错误消息21 2.3 为已有的代码库新增检查规则25 2.3.1 渐进式开发26 2.3.2 在组织中“便宜行事”27 2.4 结论28 第3章 控制复杂性 29 3.1 目标30 3.1.1 可持续性31 3.1.2 价值31 3.2 为何编程是困难的33 3.2.1 人脑类比33 3.2.2 读得多、写得少的代码35 3.2.3 可读性35 3.2.4 脑力劳动36 3.3 关于软件工程38 3.3.1 与计算机科学的关系38 3.3.2 人性化代码39 3.4 结论40 第4章 垂直切片 41 4.1 从能使用的软件开始 41 4.1.1 从数据入口到数据持久化 42 4.1.2 最小的垂直切片 43 4.2 活动骨架44 4.2.1 特征测试45 4.2.2 预备-执行-断言47 4.2.3 静态代码分析的合理尺度48 4.3 由外到内50 4.3.1 接收JSON52 4.3.2 提交预订请求54 4.3.3 单元测试58 4.3.4 DTO 和领域模型59 4.3.5 伪对象62 4.3.6 Repository接口63 4.3.7 Repository中的Create方法 64 4.3.8 配置依赖关系65 4.4 完成切片66 4.4.1 schema 67 4.4.2 SQL Repository 68 4.4.3 连接数据库的配置70 4.4.4 冒烟测试71 4.4.5 使用伪(Fake)数据库的边界测试72 4.5 结论73 第5章 封装75 5.1 保存数据75 5.1.1 代码改动优先级的原则76 5.1.2 参数化测试77 5.1.3 把DTO复制到领域模型中79 5.2 验证80 5.2.1 错误的日期81 5.2.2 红绿重构83 5.2.3 自然数86 5.2.4 Postel定律89 5.3 保护不变量92 5.3.1 恒常有效93 5.4 结论95 第6章 三角测量96 6.1 短期记忆与长期记忆96 6.1.1 遗留代码和记忆98 6.2 能力99 6.2.1 超订99 6.2.2 恶魔的辩词103 6.2.3 已有的预订记录105 6.2.4 恶魔的辩词与红绿重构107 6.2.5 多少测试才算够110 6.3 结论110 第7章 分解112 7.1 代码恶化112 7.1.1 阈值113 7.1.2 圈复杂度114 7.1.3 80/24 规则116 7.2 与思维合拍的代码117 7.2.1 六角花117 7.2.2 内聚120 7.2.3 依恋情结123 7.2.4 类型转换的代价124 7.2.5 解析,而不是验证125 7.2.6 分形架构129 7.2.7 清点变量132 7.3 结论133 第8章 API设计135 8.1 API设计原则135 8.1.1 预设用法136 8.1.2 防错设计138 8.1.3 写给读者看的代码139 8.1.4 比起注释,花更多精力在代码的命名上140 8.1.5 蒙住名字141 8.1.6 分离命令与查询143 8.1.7 交流的层次146 8.2 API设计实例146 8.2.1 领班147 8.2.2 与封装对象交互149 8.2.3 实现细节152 8.3 结论153 第9章 团队合作155 9.1 Git156 9.1.1 提交说明156 9.1.2 持续集成159 9.1.3 小步提交161 9.2 代码的集体所有权164 9.2.1 结对编程166 9.2.2 团伙编程167 9.2.3 代码审校的延迟168 9.2.4 拒绝某个变更集170 9.2.5 代码审校171 9.2.6 拉取请求172 9.3 结论173 第2部分 由快到稳 第10章 充实代码177 10.1 功能标识178 10.1.1 日历标识178 10.2 绞杀榕模式183 10.2.1 方法层面的绞杀榕184 10.2.2 类层面的绞杀榕187 10.3 版本管理191 10.3.1 事先警告192 10.4 结论192 第11章 修改单元测试194 11.1 重构单元测试194 11.1.1 修改安全网194 11.1.2 添加新测试代码195 11.1.3 分离对测试代码和对生产代码的重构198 11.2 见证测试失败204 11.3 结论204 第12章 故障排除205 12.1 理解205 12.1.1 科学方法206 12.1.2 简化207 12.1.3 橡皮鸭法208 12.2 缺陷209 12.2.1 像做测试那样重现问题209 12.2.2 慢速测试212 12.2.3 非确定性缺陷214 12.3 二分法218 12.3.1 用Git完成二分法219 12.4 结论222 第13章 关注点分离224 13.1 组合225 13.1.1 嵌套组合225 13.1.2 顺序组合228 13.1.3 引用透明性230 13.2 横切面关注点233 13.2.1 日志233 13.2.2 装饰器234 13.2.3 日志写什么238 13.3 结论240 第14章 节奏241 14.1 个人节奏242 14.1.1 时间段242 14.1.2 休息244 14.1.3 有意识地利用时间245 14.1.4 盲打246 14.2 团队节奏247 14.2.1 定期更新依赖项247 14.2.2 安排其他事务248 14.2.3 康威定律249 14.3 结论250 第15章 常见困惑251 15.1 性能252 15.1.1 历史负担252 15.1.2 可识别性254 15.2 安全256 15.2.1 STRIDE 256 15.2.2 欺骗257 15.2.3 篡改258 15.2.4 否认259 15.2.5 信息泄露259 15.2.6 拒绝服务261 15.2.7 提权262 15.3 其他技术263 15.3.1 基于属性的测试263 15.3.2 行为代码分析268 15.4 结论270 第16章 代码库导览272 16.1 导航272 16.1.1 看到全局图景273 16.1.2 文件组织276 16.1.3 寻找细节278 16.2 架构280 16.2.1 单体系统280 16.2.2 循环依赖281 16.3 使用方法285 16.3.1 从测试中学习285 16.3.2 用心聆听测试287 16.4 结论288 附录A 实践技巧列表290
|
|