2019年/11月/16日
干翻历史代码
作者30年软件开发经验总结,揭示高质量软件的秘密,阐述真正的敏捷开发之道 本书不仅仅是关于如何构建更好的软件,更是关于如何构建更好的软件产业,书中囊括了我身为专业开发者三十年所学的精华。最近的十年间,对我以及其他我认识的开始尝试极限编程 Extreme Programming. 同一个问题的不同解决方式之间有着巨大的效率差别,也许你也有灵光一闪之后,问题化繁为简的故事。效率极高的开发者和一般开发者之间的差别可以非常的大
遗留代码的危机
良好的单元测试的前提是你有优秀的,可测试的代码,但对遗留代码来说经常并非如此,所以你必须清理代码,使其处于更好的状态,对于遗留代码,没有简单的答案,没有快速的修复方式 为什么瀑布模型不管用呢?现实事物和虚拟事物之间有区别,先部分后整体的方式在虚拟世界并不奏效,不同于建筑学,向软件中加入新功能是一个非常频繁的需求。软件开发有许多禁忌,在一种场景下正确对方法在另一个场景却会失败
让人们参与到某件事情中的最有效的方法可以总结一个词:尊重
现代管理技术的发展乃是工业革命的结果,早起的管理者们拿着秒表在工厂里面溜达,为做着不同任务的工人们计算时间,然后给出一个简单的命令:快点。但是软件开发中,“快点”不适用,每个任务都是不同的,需要不停的学习新东西
我们必须认清软件开发本质上是一个创造过程。
软件产业被称为外行人的产业,不幸的是,这句话在很多层面都是正确的,关于软件开发者应该具备什么样的知识体系没有广泛的共识,掌握一门编程语言并不能让你成为软件开发者,正如掌握一门自然语言,必不能让你成为作家。
我认识的最优秀的程序员都是自己独立解决问题的,软件行业中重复发明轮子的事情有很多,软件产业是一个年轻的产业,软件工程尚未创建其核心原则。
逃出混乱
报告统计,大概全球只有37%的项目是成功的,不仅仅是创业公司会失败,大公司以及具备充足预算的组织也面临这个问题,三个导致低成功率的因素
- 代码变更
- bug修复
- 复杂度控制
软件必须变化,所以需求变更导致代码变更,开发者编写的代码无法修改非常常见
我们的产业距离有效和高效还有很长的路要走,我们没有对可维护性给与足够的重视
走进敏捷
丰田公司发展处“精益”理念,敏捷编程的核心:通过持续不断的及早交付有价值的软件使客户满意。小即是好,敏捷有助于建立一个发现式过程,团队持续受到反馈并从中学习,对话主题从如何去做变为做什么和为什么这么做。
软件不遵循物理法则,时常难以体会,对其难有正真详尽的认识,软件是世界上最脆弱的事物,软件开发是非常反直觉的,我们在工业革命时期学到的东西在软件上毫无意义,软件是完全不同的生物。
开发软件需要许多的技能和能力,也就是技艺,但无论学到多少技能都没办法解决所有的问题,软件开发是为数不多的同时使用左脑和右脑的领域之一,编程不仅仅是算法,需要创造力和想象力才能编写出出色的代码。
9个实践
我惊奇的发现,我认识的最优秀的开发者也是最整洁的程序员。
守:基本架势,基础知识
破:不仅仅明白理论,必须付诸实践
离:实践和理论相互融合
只有通过不间断的学习才能达到真正的大师级境界,一万小时理论。
首要原则:
单一职责原则
开闭原则
压力对于构建更好的产品毫无帮助,我们多数人并不能预知未来。 如果软件有人用,那么它便不需要修改,所以必须编写出可修改的软件
实践1,在问如何做之前先问做什么,为什么做,给谁做
软件开发不再是告诉计算机去干这个干那个,而是创建一个计算机根据一组相关对象的交互行为的世界
抽象东西具象化,具象东西抽象化
需要一个产品负责人:成为领域专家,开发过程中探索,帮助开发者理解为什么和为了谁
编写用户故事:关注什么,知道为什么会有一个功能需求,开始时简单,日后再加强,
实践2,小批次构建
人类无法度量
软件行业中的顶尖团队秘密之一是他们都非常小
通过小批次构建,我们寻求的是验证而非假设
越小越好的四个基本原因:
- 更容易理解
- 更容易预估
- 更容易实现
- 更容易测试
复杂型
复合型
把未知变为已知
把未知进行封装
更短的反馈回路,我认识的一些顶尖的软件开发者在编码的时候每二十秒就执行一遍测试
提高构建速度
木匠的工具箱里有许多工具,优秀的木匠知道何时,如何,为什么使用每一件工具,软件开发者和手艺人,学者,艺术家一样,需要知道自己有哪些工具以及它们各自的适用范围。
精益创业运动为了探索市场的真正需求而生。
我们都是凡人
和薛定谔的猫相似,它既是活的又是死的,我们的软件既能正常工作又不能正常工作
最小化依赖,保持目的单一,保持故事的可测试性
实践3 持续集成
处理痛苦的方式由两种:避免痛苦,或者学着享受
编写出优秀的单元测试,并且仅仅测试那些需要测试的代码
告诉你的开发者,每天至少集成一次
一个健康的构建版本是一个健康项目的核心,开始是成功的一半
龟兔赛跑的故事:缓慢且稳定,会在比赛中取胜
用版本库管理一切
及时修复失败的构建
实践4 协作
我们拥有最宝贵的资源是彼此
管理者需要牢记,一线开发者最清楚情况,而没有投身于软件开发的人往往无法真正理解软件开发
软件开发是一项社会活动
遵循优秀的开发实践可以让开发者互相学习,互相支持
开发者在流式工作环境下的效果要好上一个数量级
软件开发者是研究者也是创造者
团队中那些乐于分享知识的人更有价值
诲人不倦且不耻下问
实践5 编写整洁的代码
五种特质,它们是优秀软件的基础
- Cohesive 内聚
- Loosely Coupled 松散耦合
- Encapsulated 封装
- Assertive 自主
- Nonredundat 没有冗余
不要有上帝对象
一个类应该只有一个目的
我们通过语言理解世界,而编程归根结底是一种语言性行为
定义事物的不是名字,而是行为
有意耦合
意外耦合
封装良好的软件是由外而内的
默认封装,必要时再暴露
对象应该控制自身的状态
今天代码质量的提高会为将来带来速度的提升
快速的工作就是整洁的工作
放弃完美主义,构建刚好所需的功能
想要成为优秀的作家需要大量的阅读和大量的写作,练习,练习,再练习
实践6 测试先行
测试是标准,测试定义行为
验收测试 = 客户测试
单元测试 = 开发者测试
其他测试= 质量保证测试
一个单元代表的是一个行为,如果行为不变,测试也不应该变化
一组优秀的单元测试可以防止系统衰退,为开发者重构代码提供安全的保障
时间7,用测试描述行为
红条,绿条,重构
测试先行是一种设计方法
bug是缺失的测试
实践8 最后实现设计
优秀代码的特点是容易修改
阻碍修改的设计:
- 缺乏封装
- 滥用继承
- 僵化的实现
- 内联代码
- 依赖
软件被阅读的次数比编写次数多
软件开发是一个需要千锤百炼的行当
将创建和使用分离
演化式设计
实践9 重构遗留代码
我们是软件开发者,利用现有工具尽我们所能开发最好的软件
没有编写优秀软件的现成配方,以后也不会有
只有一些可以遵循的指导方针,可以采纳的技术,可以学习(然年打破)的规则,以及可以使用的实践。
我们现在构建软件的方式大体上和半个世纪之前没有什么两样
在软件当中,没有人能告诉我们什么是正确的,我们必须自己搞清楚
工业革命带来了大规模的制造业,统一而持续,我们正在步入信息革命,需要一个崭新的方式,革命就在我们身边,要求我们从根本上改变原来的思考方式,信息革命要求的不是统一和持续,而是个体和创新。