「修改软件的艺术」 读书笔记

date: 2017-10-13 17:59:11
title: 「修改软件的艺术」 读书笔记

百度脑图 - 修改软件的艺术: http://naotu.baidu.com/file/3300eebf1014c10fd4d1a96ad6cf65ac?token=ff8bec2d896c0c61
图灵社区 - 修改软件的艺术: http://www.ituring.com.cn/book/1749

修改软件的艺术:构建易维护代码的9条最佳实践

将理解具象化
优秀软件是具象化的理解

敏捷 vs 瀑布

遗产 vs 遗留
奏效: 受雇的开发者必须意识到,仅仅言听计从是不够的,他们有义务让交付的软件持续产生价值
开发者有三种状态: 已完成 / 未开始 / 快完事了
评估未知
一个充满外行人的产业
导致低成功率的核心因素: (1) 代码变更 (2) bug修复 (3) 复杂度控制

顺流直下: 瀑布模型是从制造业和建筑行业借鉴而来
需求分析 设计 实现 集成 测试 安装 维护
为什么瀑布模型不管用
虚拟世界并不奏效
让我们建造出来的东西难以改变
开发和测试分离
出错误并非我的工作;创造错误才是
当“流程”变成“体力劳动”
流程无法支配创造力

敏捷: 希望软件能拥有即刻适应需求变化的能力
敏捷 Scrum 极限编程(Extreme Programming,XP)
敏捷流程核心: 通过持续不断地及早交付有价值的软件使客户满意
小即是好
并不是急于求成而是循序渐进
艺术与技能的平衡: 开发软件需要许多的技能和能力,也就是技艺,但是无论学到多少技能都没办法解决所有问题。
追求技术卓越

遵循实践(消毒某一特殊器械的行为)和遵循原则(对所有器械进行消毒的理由)的差别
如果想降低软件持有者的开销,我们必须关注软件的构建过程。
守、破、离
单一职责原则
开闭原则:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
原则帮助我们把某件事情通用化,有助于梳理知识体系。
实践必须: 在多数情况下产生价值; 容易学习且容易传授; 简单易行——简单到无需思考。
原则指导实践
压力对于构建更好的产品毫无帮助

要有一个产品负责人

用户故事: 做什么、为什么做、给谁做
为验收测试设立明确标准 / 自动化验收标准

产品负责人的7个策略:

  • 成为特定领域专家
  • 在开发过程中探索
  • 帮助开发者理解为什么和为了谁
  • 描述你想要什么,而不是怎么做
  • 及时回答问题
  • 消除依赖
  • 支持重构

编写出更好用户故事的7个策略:

  • 它当作一个占位符
  • 关注“什么”
  • 把“谁”人格化
  • 知道为什么会有一个功能需求
  • 开始时简单,日后再加强
  • 心系边界情况
  • 使用验收标准

小批次构建

工作单元应该可以展现出可度量的结果
大小适中,而不仅仅是“小”而已

做出调整

人类无法度量
关键路径的重要性:“怀孕生子需要九个月,无论有多少妇女参与其中。”
范围、时间、资源(scope,time,resource,STR)

控制发布节奏

越小越好有四个基本原因:更容易理解;更容易预估;更容易实现;更容易测试。

分而治之
之所以会很繁重,是因为两个原因:要么是复杂型的,要么是复合型的。
探索未知事物的时候需要做两件事: 未知变为已知,未知进行封装

更短的反馈回路

提高构建速度

对反馈做出响应

建立待办列表
讨论待办列表的顺序而非优先级

把用户故事拆分为任务

跳出时间盒子思考
Scrum并不是一个“全有或全无”的提议。
要么有风险,要么没有风险。当你有风险的时候,则充满未知。未知即是风险。

范围控制
降低风险的唯一方式是把用户故事进行到底,这意味着我们需要对什么是“完成”有明确的定义。
迭代”真正的目的是让团队消除以发布为单位的构建习惯。
看板。

度量软件开发的7个策略:

  • 度量产生价值的时间
  • 度量编码时间
  • 度量缺陷密度
  • 度量发现缺陷的时间
  • 度量功能的客户价值
  • 度量未交付功能的损失
  • 度量反馈回路的效率

分割用户故事的7个策略:

  • 把复合的故事拆分为组件
  • 复杂的故事分割为已知的和未知的
  • 对未知持续迭代直至完全理解
  • 根据验收标准分割故事
  • 最小化依赖
  • 保持目的单一
  • 保持故事可测试性

持续集成

处理痛苦的方式有两种:避免痛苦,或者学着承受。

建立项目的心跳

实践持续部署

自动化构建

尽早集成,频繁集成
告诉你的开发者每天至少集成一次。
测试驱动开发(Test Driven Development,TDD)

软件应该从第一天起就具备发布条件

构建敏捷设施的7个策略:

  • 用版本库管理一切
  • 一次点击全部构建
  • 持续集成
  • 为任务定义验收标准
  • 编写可测试的代码
  • 保证必要的测试覆盖率
  • 即时修复失败的构建

消除风险的7个策略:

  • 持续集成
  • 避免分支
  • 自动化测试上下功夫
  • 识别风险区域
  • 征服未知
  • 构建可以体现价值的最小部分
  • 频繁验证

协作

极限编程
开放性的思想
沟通与协作
结对编程
伙伴编程

穿刺,群战,围攻

在时间盒子中对未知进行调研

定期代码审查和回顾会议

加强学习和知识分享

诲人不倦且不耻下问

结对编程的7个策略:

  • 尝试一下,你会喜欢的
  • 驾驶员和领航员都要参与其中
  • 频繁交换角色
  • 充实工作一天
  • 尝试各种配置
  • 让团队决定细节
  • 跟踪进度

高效回顾会议的7个策略:

  • 找寻小的改进
  • 责怪流程而不是人
  • 5个为什么
  • 解决根源问题
  • 倾听每个人的声音
  • 给予支持
  • 度量进度

编写整洁的代码

CLEAN: Cohesive 内聚 / Loosely Coupled 松散耦合 / Encapsulated 封装 / Assertive 自主 / Nonredundant 没有冗余

高质量的代码是内聚的
单一的职责。

高质量的代码是封装良好的
由外而内编程 vs 由内而外编程
只暴露解决问题所必需的

高质量的代码是自主的

高质量的代码是没有冗余的
DRY Don't Repeat Yourself

提高代码质量的7个策略:

  • 明确代码质量的定义
  • 对基本的实践达成一致
  • 放弃完美主义
  • 理解取舍
  • 用“什么”来隐藏“怎么”
  • 良好的命名
  • 保持代码的可测试性

编写可维护代码的7个策略:

  • 确立代码的集体所有权
  • 积极重构
  • 坚持结对编程
  • 频繁的代码审查
  • 学习其他开发者的风格
  • 不断学习软件开发
  • 读代码,写代码,练习编码

测试先行

测试是标准,测试定义行为。

验收测试 = 客户测试
单元测试 = 开发者测试
其他测试 = 质量保证测试

质量保证(Quality Assurance,QA):

  • “组件测试”体现各个组成单元之间的配合情况。
  • “功能测试”体现所有组成单元在一起完成整个端到端的行为。
  • “场景测试”体现用户和系统的交互行为。
  • “性能测试”验证这些情形:“这个系统能承受很大的负载吗?我们进行过独立测试,但是如果百万级用户进行并发请求会怎么样?”
  • “安全测试”验证代码的脆弱程度。

以行为作为单元
TDD可以提供迅速的反馈
TDD可以为重构提供支持
编写可测试的代码

进行优质验收测试的7个策略:

  • 明确构建目标所产出的价值
  • 理解为谁而做以及他们为什么需要
  • 将验收测试自动化
  • 定义边界用例、异常、次要路径
  • 用实例来充实细节和展示不一致
  • 用验收标准来拆分行为
  • 保持每个测试的唯一性

进行优秀单元测试的7个策略:

  • 从调用者的角度出发
  • 用测试定义行为
  • 仅仅编写能体现区别的测试
  • 仅仅编写可以让测试通过的代码
  • 用测试来构建行为
  • 对代码进行重构
  • 对测试进行重构

用测试描述行为

测试就是标准
测试需要完整
bug是缺失的测试

工作流测试用所谓的模拟对象(mock)进行测试

使用测试作为标准的7个策略:

  • 将测试仪表化
  • 使用见名知意helper方法
  • 突出重点
  • 测试行为,而不是实现
  • 用模拟对象测试工作流
  • 避免过度描述
  • 利用真实的例子

修复bug的7个策略:

  • 一开始就避免写出bug
  • 尽早发现bug
  • 通过设计让bug更容易找到
  • 问对问题
  • 把bug当作失败的测试
  • 利用发现的缺陷修正流程
  • 从错误中学习

最后实现设计

可变性的阻碍
缺乏封装
滥用继承
僵化的实现
内联代码
依赖

可持续性开发
删除死代码
保持名称更新
集中决策
抽象
对类进行组织

编码与清理
软件被阅读的次数比编写次数多
意图导向编程
降低圈复杂度
演化式设计

进行演化式设计的7个策略:

  • 理解面向对象设计
  • 理解设计模式
  • 理解测试驱动开发
  • 理解重构
  • 关注代码质量
  • 要冷酷无情
  • 培养优秀的开发习惯

清理代码的7个策略:

  • 让代码自我表达
  • 为添加测试创造间隙
  • 让方法更内聚
  • 让类更内聚
  • 集中决策
  • 引入多态
  • 封装构建过程

重构遗留代码

重构能降低以下四个方面的成本:

  • 日后对代码的理解
  • 添加单元测试
  • 容纳新功能
  • 日后的重构

技术债和财务债一样:利息会把你拖垮

通过重构糟糕代码来培养良好习惯
推迟那些不可避免的

图钉测试
依赖注入
系统扼杀
抽象分支

以支持修改为目的重构
以开闭原则为目的重构
以提高可修改性为目的重构

第二次做好

助你正确重构代码的7个策略:

  • 从已有系统中学习
  • 循序渐进
  • 遗留代码中添加测试
  • 始终进行重构
  • 有更好的理解后对一个实现进行重新设计
  • 继续其他工作前进行清理
  • 重构以避免误入歧途

决定何时进行重构的7个策略:

  • 关键代码维护不善的时候
  • 当唯一理解代码的人没空的时候
  • 有信息可以揭示更好的设计的时候
  • 修复bug的时候
  • 需要添加新功能的时候
  • 当需要为遗留代码写文档的时候
  • 当重构比重写容易的时候

在不需要的事情上花钱

我们是软件开发者,利用现有工具尽我们所能开发最好的软件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,062评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • 其实,很多事真的没你想象的那么难。 “社交恐惧症”这个词最近看到很多次,对于这个词其实挺有感触的,因为曾经的我也是...
    月落April阅读 228评论 2 0
  • 夕阳下的古战场 衰草掩盖了沧桑 青石板上的蹄痕 是岁月遗留的伤 远去的金戈铁马 在时空尽头浮现 那些涂炭与杀伐 藏...
    清净菩提阅读 118评论 0 0
  • 百词斩,相信现在很多大学生都会在用,包括我本人在内。百词斩以“背单词App”切入在线教育市场,并以“图背单词”为主...
    TD_Wang阅读 9,230评论 2 35