《敏捷软件开发:原则、模式与实践》是Robert C. Martin(鲍勃大叔)的经典著作,也是敏捷开发领域的必读书。这本书不只是讲敏捷方法论,更是讲如何成为一个更好的软件工程师。本文分享我读完这本书的感悟,聊聊马丁大叔想告诉我们的核心思想:敏捷的本质、设计原则、代码质量,以及专业主义。
一、为什么读这本书
我是在工作第三年的时候读的这本书。那时候我已经写了几年代码,能完成业务需求,但总觉得自己写的代码不够好:耦合严重、难以维护、改一个地方要动很多地方。我也接触过敏捷开发,但只是停留在"每日站会、迭代开发"的表面,没有理解敏捷的本质。
有同事推荐了这本书,说这是每个软件工程师都应该读的书。我买来之后,断断续续读了两个月,做了大量笔记,读完之后有一种醍醐灌顶的感觉。很多以前模糊的概念变清晰了,很多写代码时的困惑有了答案。
这本书的作者Robert C. Martin,大家都叫他鲍勃大叔(Uncle Bob),是软件开发领域的传奇人物,敏捷宣言的签署者之一,SOLID原则的提出者。他在这本书里,把几十年的软件开发经验浓缩成了原则、模式和实践,值得每个程序员认真阅读。
二、敏捷的本质是什么
很多人对敏捷的理解停留在流程层面:Scrum、看板、每日站会、迭代开发、用户故事。但马丁大叔在书里告诉我们,这些只是敏捷的表象,不是本质。
1. 敏捷的核心是拥抱变化
传统的瀑布模型认为,需求可以在一开始就确定,然后按计划一步步执行。但现实是,需求总是在变,市场在变,用户在变,技术在变。敏捷的核心就是承认变化是不可避免的,并且拥抱变化,而不是试图控制变化。
敏捷开发通过短迭代、频繁交付、持续反馈,让团队能够快速响应变化。每个迭代都交付可用的软件,从用户那里得到反馈,然后根据反馈调整方向。这样做出来的软件,才是用户真正需要的。
2. 敏捷是一种态度,不是一套流程
马丁大叔强调,敏捷不是一套固定的流程,而是一种态度和价值观。敏捷宣言的四句话:
- 个体和互动高于流程和工具
- 工作的软件高于详尽的文档
- 客户合作高于合同谈判
- 响应变化高于遵循计划
注意,敏捷宣言不是说右边的东西不重要,而是说左边的更重要。流程、文档、合同、计划都需要,但不能让它们凌驾于人、软件、客户和变化之上。
很多团队学敏捷,只学了形式(站会、迭代、看板),没有学到精神。如果团队没有拥抱变化的态度、没有协作的文化、没有对质量的追求,再完美的敏捷流程也没用。
3. 敏捷的目标是交付价值
敏捷的最终目的不是"快",而是持续交付价值。快只是手段,价值才是目的。如果为了快而牺牲了质量,那不是敏捷,是敏捷的反面。
马丁大叔说,敏捷团队的速度来自于高质量,而不是加班和赶工。代码质量好,技术债少,修改和添加功能就快;代码质量差,技术债多,越往后越慢。所以,敏捷团队必须重视代码质量和技术实践,这是敏捷的基础。
三、SOLID设计原则
这本书的核心内容之一是SOLID设计原则,这是马丁大叔对面向对象设计的总结,也是每个程序员都应该掌握的基础知识。
1. 单一职责原则(SRP)
一个类应该只有一个引起它变化的原因,也就是一个类只做一件事。
这个原则看起来简单,但做起来很难。很多人写代码,喜欢把所有功能都塞到一个类里,导致这个类又大又复杂,改任何需求都要动它。单一职责原则要求我们把不同的职责分开,每个类专注于一件事,这样修改一个功能不会影响其他功能。
判断的标准是:这个类有多少个变化的原因?如果有多个原因会导致这个类修改,那它就违反了单一职责原则。
2. 开闭原则(OCP)
软件实体应该对扩展开放,对修改关闭。
也就是说,添加新功能的时候,应该通过扩展(添加新代码)来实现,而不是修改已有代码。因为修改已有代码可能会引入bug,影响已有功能。
实现开闭原则的关键是抽象和多态。定义稳定的抽象接口,新功能通过实现新的接口来添加,不需要修改已有代码。比如策略模式,就是开闭原则的典型应用。
3. 里氏替换原则(LSP)
子类必须能够替换掉它们的父类,而不影响程序的正确性。
也就是说,继承关系中,子类不能破坏父类的行为约定。如果子类重写了父类的方法,但改变了方法的行为,那使用父类的地方换成子类就会出问题。
这个原则提醒我们,继承不是代码复用的万能工具,使用继承要谨慎。如果子类不能完全替换父类,那就不应该用继承,而应该用组合。
4. 接口隔离原则(ISP)
客户端不应该依赖它不需要的接口。
也就是说,接口要小而专,不要大而全。如果一个接口有很多方法,而实现类只需要其中几个,那实现类就被迫实现了不需要的方法,这就是接口污染。
接口隔离原则要求我们把大接口拆分成小接口,每个接口只包含客户端需要的方法。这样实现类只需要实现自己需要的接口,耦合更低,更灵活。
5. 依赖倒置原则(DIP)
高层模块不应该依赖低层模块,两者都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象。
也就是说,要面向接口编程,而不是面向实现编程。高层模块(业务逻辑)不应该直接依赖低层模块(具体实现),而应该依赖抽象接口。这样,更换具体实现不会影响高层模块。
依赖倒置原则是很多设计模式的基础,也是解耦的关键。在实际开发中,我们应该尽量依赖接口而不是具体类,通过依赖注入来管理对象的创建和依赖关系。
SOLID原则的意义
这五个原则不是教条,而是指导我们写出好代码的思想。它们的共同目标是:降低耦合、提高内聚、让代码更容易维护和扩展。
当然,原则不是死的,要根据实际情况灵活运用。有时候为了简单,适当违反原则也没关系,但你要知道自己在做什么,以及为什么这么做。
四、代码质量和技术债
马丁大叔在书里反复强调代码质量的重要性。他认为,代码质量不是锦上添花,而是软件开发的生命线。
1. 代码质量决定开发速度
很多人觉得,为了赶进度,可以先写烂代码,以后再重构。但马丁大叔说,这是一种幻觉。烂代码只会让你越来越慢,因为每加一个新功能,都要先理解混乱的代码,还要小心不破坏已有功能,时间都花在理解和修bug上了。
而高质量的代码,虽然写的时候多花了一点时间,但后续维护和添加功能的速度会快很多。长期来看,高质量的代码才是最快的。
2. 技术债要及时还
技术债就像金融债务,借的时候很爽,但要还利息。如果不及时还,利息会越来越多,最后压得你喘不过气。
马丁大叔建议,技术债要及时还,不要积累。每次写代码的时候,顺便重构一下附近的烂代码;每次修bug的时候,顺便改善一下相关的设计。这样技术债就不会积累,代码质量会越来越好。
当然,不是所有技术债都要立刻还,要分优先级。影响核心功能、经常修改的部分的技术债要优先还;不怎么动的、稳定的部分,可以暂时放一放。
3. 测试是质量的保障
马丁大叔是测试驱动开发(TDD)的坚定支持者。他认为,测试不是写完代码之后的补充,而是写代码的一部分。先写测试,再写代码,能保证代码的正确性,也能让你更放心地重构。
有了测试,重构就有了安全网。改代码的时候,跑一遍测试,没问题就说明重构没有破坏功能。没有测试,重构就是赌博,没人敢轻易改代码,代码就会越来越烂。
4. 代码整洁是基本功
马丁大叔后来还写了《代码整洁之道》,但在这本书里已经强调了代码整洁的重要性。变量命名要有意义,函数要短小,注释要写有价值的,代码格式要统一。这些看起来是小事,但日积月累,会显著影响代码的可读性和可维护性。
代码是写给人看的,不是写给机器看的。机器只关心能不能运行,而人需要理解和修改代码。整洁的代码,能让后来的维护者(包括几个月后的你自己)节省大量时间。
五、专业主义
这本书让我感触最深的,是马丁大叔对"专业主义"的强调。他认为,软件工程师不只是写代码的工人,而是专业人士,应该有专业的态度和操守。
1. 对代码负责
专业的软件工程师,对自己写的代码负责。不只是能运行就行,还要保证质量、可维护、可扩展。写完代码不是结束,而是开始,要持续维护和改进。
不要说"这代码能跑就行",这是不专业的表现。专业人士会追求卓越,即使没人监督,也会写出高质量的代码。
2. 对进度诚实
很多程序员在被问进度的时候,喜欢说"差不多了""快完了",但实际上还差很远。马丁大叔说,专业人士要对进度诚实,做了多少就是多少,遇到困难要及时说,不要等到截止日期才说做不完。
估算也是专业能力的一部分。好的估算不是拍脑袋,而是基于经验和数据,给出合理的范围和风险。做不到的事情不要轻易承诺,承诺了就要尽力做到。
3. 持续学习
软件行业变化很快,新技术、新框架、新方法层出不穷。专业的软件工程师要持续学习,保持对技术的热情和敏感。不要满足于会用几个框架,要理解原理,拓宽视野。
马丁大叔自己就是持续学习的典范,写了几十年代码,还在不断学习和输出。他说,如果你停止学习,你的职业生涯就开始走下坡路了。
4. 团队合作
软件开发不是一个人的战斗,而是团队的协作。专业的软件工程师要善于沟通、乐于分享、尊重队友。代码不只是你一个人的,是团队的共同财产,要写别人能看懂的代码,要接受别人的review和建议。
六、我的感悟和改变
读完这本书,我在工作中做了很多改变。
1. 开始重视设计
以前写代码,拿到需求就开始写,想到哪写到哪。现在会先思考一下设计:这个功能怎么拆分?类和接口怎么设计?有没有违反SOLID原则?花十几分钟思考,能省掉后面几个小时的重构。
2. 开始写测试
以前觉得写测试浪费时间,现在重要的功能都会写单元测试。有了测试之后,改代码更有底气了,重构也更放心了。虽然写测试花了时间,但bug少了,调试时间少了,整体效率反而提高了。
3. 开始重构
以前不敢改老代码,怕改出问题。现在有了测试和设计原则的指导,会在添加新功能的时候顺便重构附近的烂代码。代码质量在慢慢提升,技术债在慢慢减少。
4. 心态变了
以前觉得写代码就是完成需求,现在觉得写代码是一种手艺,要追求质量和优雅。看到烂代码会不舒服,会想办法改进。这种心态的改变,让我对工作更有热情了。
七、这本书的不足
客观地说,这本书也有一些不足。
- 出版时间较早:这本书是2002年出版的,有些内容(比如UML、C++代码示例)现在看起来有点过时了。但核心思想(敏捷、设计原则、专业主义)是不过时的。
- 偏面向对象:书里的例子大多是面向对象的,对于函数式编程、前端开发等领域,需要自己迁移理解。
- 有些观点比较激进:比如对TDD的强调,有些人可能不完全认同。但即使不完全认同,了解一下也有好处。
这些不足不影响这本书的价值,它的核心思想是永恒的。
八、写在最后
《敏捷软件开发:原则、模式与实践》是一本值得每个软件工程师认真阅读的书。它不只是教你怎么写代码,更是教你怎么成为一个专业的软件工程师。
在这个追求快、追求新框架的时代,马丁大叔告诉我们,有些东西是不变的:好的设计、高质量的代码、专业的态度。这些才是软件工程师的立身之本,比掌握多少个框架都重要。
如果你是一个工作了几年的程序员,遇到了瓶颈,觉得自己写的代码总是不够好,推荐你读这本书。它会帮你打开一扇新的窗户,让你看到软件设计的美,让你对"什么是好代码"有新的认识。
最后,用马丁大叔的一句话结尾:"真正的专业人士,会写出即使在最混乱的环境中也能保持优雅的代码。"愿我们都能成为这样的专业人士。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录