《敏捷软件开发》是Robert C. Martin,也就是大家常说的Bob大叔的经典著作,也是敏捷开发领域的必读书。这本书出版于2002年,到现在已经快20年了,但里面的很多思想和原则,至今仍然适用,被无数开发者奉为圭臬。
我买这本书是在两年前,当时刚工作不久。对软件开发的理解还停留在"写代码实现功能"的层面,对敏捷开发、项目管理、团队协作这些东西一知半解。买了之后翻了几页。觉得太理论化,看不下去,就放在书架上吃灰了。
直到今年,公司开始推行敏捷开发。搞Scrum,开站会。做迭代,我才发现自己对敏捷的理解太肤浅了。很多概念都搞不清楚,团队里也因为对敏捷的理解不一致。出现了很多问题。这时候我想起了这本书,把它从书架上拿下来,认认真真地读了一遍。
这一读,就是一个月。我每天晚上读一章。边读边做笔记,边读边思考。结合自己工作中的实际情况,慢慢理解了敏捷开发的本质。读完之后。我收获很大,很多之前困惑的问题都想通了。但也有一些不同的看法,觉得书里有些内容在今天看来已经不太适用了。
本文从普通开发者的角度,客观评价这本书的优缺点。分享我的读书心得和思考,聊聊敏捷开发到底是什么。为什么很多团队学敏捷却越学越乱,以及这本书对我们今天的工作有什么启发。
先说明一下,我不是敏捷专家。也不是项目管理专业人士,只是一个普通的开发者。读了这本书,有一些自己的理解和思考。可能不够专业。也可能有偏差,仅供参考。
一、这本书讲了什么
在评价这本书之前,先简单介绍一下这本书的内容,让没读过的朋友有个大概了解。
《敏捷软件开发》的全名是《敏捷软件开发:原则、模式与实践》,从书名就能看出来,这本书分为三个部分:原则、模式、实践。
第一部分是原则,主要讲敏捷开发的基本原则和价值观。包括敏捷宣言、极限编程(XP)的12个实践、面向对象设计的SOLID原则、包设计原则等。这部分是全书的理论基础,也是最重要的部分。
第二部分是模式,主要讲设计模式和敏捷建模。包括常用的设计模式、UML建模、敏捷设计等。这部分内容比较技术化,适合有一定开发经验的读者。
第三部分是实践,主要讲敏捷开发在实际项目中的应用。包括迭代开发、测试驱动开发(TDD)、重构、持续集成、结对编程等。这部分内容比较实用,有很多具体的例子和案例。
全书的核心思想,用一句话概括就是:软件开发是一门手艺。不是流水线生产;开发者是手艺人。不是工人;要以人为本,拥抱变化,持续交付,不断改进。
Bob大叔在书里反复强调,软件开发的本质是人的活动。不是技术的活动。技术很重要。但人更重要。一个团队,如果人不行,再好的技术和流程也没用;如果人行,即使技术和流程不完美,也能做出好的产品。
这个思想,贯穿了全书,也是敏捷开发的核心价值观。
二、这本书的优点:为什么值得读
读完这本书,我觉得它有很多优点,这也是它能成为经典,畅销近20年的原因。
1. 思想深刻,直击本质
这本书最大的优点,就是思想深刻,直击软件开发的本质。
很多讲敏捷开发的书,都在讲流程、讲方法、讲工具。比如怎么开站会。怎么写用户故事,怎么用Jira。怎么算速度。但这本书不一样,它不讲这些表面的东西。而是讲敏捷开发背后的原则和价值观,讲为什么要这么做,而不是怎么做。
比如,很多人以为敏捷开发就是快。就是加班,就是快速迭代。但Bob大叔在书里说。敏捷开发不是快,而是灵活。是能够快速响应变化,是能够持续交付价值。快只是结果。不是目的。
再比如,很多人以为Scrum就是敏捷。开站会、做迭代、开回顾会就是敏捷。但Bob大叔说,Scrum只是敏捷的一种框架。不是敏捷本身。敏捷是一种价值观。一种思维方式,一种工作态度。如果没有理解敏捷的价值观。只是照搬Scrum的流程,那不是真正的敏捷,只是形式主义。
这些观点,在20年前是深刻的。在今天依然深刻。很多团队学敏捷,只学了形式。没学本质,结果越学越乱。越学越累,就是因为没有理解敏捷开发的本质。
这本书,能帮你理解敏捷开发的本质,而不是只学一些表面的流程和工具。
2. 理论扎实,逻辑清晰
这本书的理论非常扎实,逻辑非常清晰,每一个观点都有充分的论证,每一个原则都有详细的解释。
比如,讲面向对象设计的SOLID原则。Bob大叔不是简单地列出这五个原则,而是一个一个详细解释。每个原则是什么,为什么重要。怎么应用,有什么好处。违反了会有什么问题,都讲得清清楚楚,还有具体的代码例子。
再比如,讲包设计原则。Bob大叔从软件的依赖关系、变更频率、复用性等角度,推导出了六个包设计原则。逻辑非常严密,让人信服。
这本书不是一本鸡汤书,也不是一本经验分享书。而是一本严肃的技术著作,有理论。有逻辑,有论证。有例子。读这本书,你能感受到Bob大叔深厚的技术功底和严谨的思维方式。
3. 内容丰富,覆盖面广
这本书的内容非常丰富,覆盖面非常广,几乎涵盖了软件开发的方方面面。
从敏捷价值观,到极限编程。到面向对象设计,到设计模式。到UML建模,到迭代开发。到测试驱动开发,到重构。到持续集成,到结对编程。到项目管理,到团队协作。几乎你能想到的软件开发相关的话题,这本书都有涉及。
而且,每个话题都讲得很深入。不是泛泛而谈。而是有理论,有例子。有实践。一本书,能覆盖这么多话题。还能讲得这么深入,非常难得。
对于开发者来说,这本书就像一本百科全书。不管你是刚入门的新手,还是有多年经验的老手。都能从中学到东西。新手可以建立对软件开发的整体认知,老手可以深化对某些概念的理解。
4. 语言生动,通俗易懂
虽然这本书的内容很理论化,很技术化。但Bob大叔的语言非常生动,通俗易懂,读起来不枯燥。
Bob大叔很擅长用比喻和故事来解释复杂的概念。比如,用餐厅的比喻来解释面向对象设计,用医生的比喻来解释测试驱动开发,用建筑师的比喻来解释软件架构。这些比喻,让抽象的概念变得具体,让复杂的理论变得简单。
而且,Bob大叔的语言很幽默。经常在书里讲一些笑话,吐槽一些行业现象,读起来很有趣。不会觉得枯燥。
比如,他吐槽那些不写测试的开发者。说他们就像不系安全带的司机,觉得自己技术好。不会出事。但一旦出事。就是大事。他吐槽那些不重构的代码,说它们就像不打扫的房间。越住越乱,最后根本没法住。
这些幽默的语言,让这本书读起来很轻松,不像很多技术书那样晦涩难懂。
5. 经典永不过时
这本书出版于2002年,到现在已经快20年了。20年。在软件开发这个行业,已经是很长的时间了,很多技术和框架都已经过时了。甚至被淘汰了。
但这本书,直到今天。依然被很多开发者推荐,依然是很多公司的必读书。依然在不断再版,不断印刷。这说明。这本书的内容是经典的,是永不过时的。
为什么?因为这本书讲的不是具体的技术和框架,而是软件开发的原则和思想。技术会过时,框架会淘汰,但原则和思想是永恒的。只要软件开发还是人的活动,只要软件还需要维护和演进,这本书里的原则和思想就依然适用。
比如,SOLID原则。提出了20多年了,今天依然是面向对象设计的黄金法则。测试驱动开发。提出了20多年了,今天依然被很多团队推崇。持续集成。提出了20多年了,今天已经成为了软件开发的标配。
这些东西。不会因为时间的流逝而过时,反而会随着时间的推移,越来越显示出它们的价值。
这就是经典的力量。
三、这本书的缺点:不是完美的
当然,这本书也不是完美的,它也有一些缺点和不足。读完之后,我觉得有几个地方。可能不太适合今天的读者。
1. 部分内容已经过时
虽然这本书的核心思想是经典的,但书里的一些具体内容,在今天看来已经过时了。
比如,书里讲的很多技术和工具,比如某些设计模式的具体实现、UML建模的详细用法、某些Java语言的特性,在今天看来已经不太适用了,甚至有些已经被淘汰了。
再比如,书里讲的极限编程(XP)的12个实践,有些在今天已经不太流行了。比如结对编程,虽然还有团队在用。但已经不像20年前那么火了。还有些实践,已经被新的实践取代了。比如持续集成,今天已经发展成了持续交付、持续部署,比书里讲的更先进。
当然,这些过时的内容,不影响书的核心价值。但对于今天的读者来说。可能会觉得有些内容有点老,有点跟不上时代。
2. 过于理想化,脱离实际
这本书里描述的敏捷开发,是一种理想化的状态。比如开发者都很专业。都很自律,都很热爱编程。团队氛围很好,客户很配合。需求很清晰。但在实际工作中,这样的理想状态很少见。
现实中的软件开发,往往是混乱的。复杂的,充满了各种问题。开发者水平参差不齐。有的很专业,有的很水;团队氛围时好时坏。有时候团结,有时候内斗;客户经常变需求。有时候甚至不知道自己想要什么;项目经常延期,预算经常超支;加班是常态,996是福报。
在这样的现实环境下,书里讲的很多敏捷实践。很难完全落地。比如测试驱动开发,要求先写测试再写代码。但在实际工作中。需求经常变,时间经常紧。根本没有时间写测试。再比如结对编程,要求两个人一起写代码。但在实际工作中。人力成本很高,老板根本不会同意两个人做一个人的工作。
Bob大叔在书里,对这些现实问题谈得比较少。更多的是在讲理想状态下应该怎么做。这可能会让一些读者觉得,这本书太理想化了。脱离实际,看了也用不上。
当然,我觉得这不是书的问题,而是现实的问题。书里讲的是"应该怎么做",而不是"在糟糕的环境下怎么妥协"。我们不能因为现实糟糕,就否定理想的价值。理想就像灯塔,虽然我们不一定能到达。但它能指引我们前进的方向。
但作为读者,我们要认识到理想和现实的差距。不要照搬书里的做法,而要结合自己的实际情况,灵活应用。
3. 有些观点比较极端
Bob大叔是一个很有个性的人,他的很多观点都比较极端。甚至有些偏激。
比如,他非常推崇测试驱动开发。认为不写测试的代码都是垃圾,不写测试的开发者都是不专业的。他甚至说。如果你不写测试,你就不是一个真正的程序员。
再比如,他非常推崇面向对象设计,认为函数式编程、过程式编程都是不好的,只有面向对象才是正确的编程范式。他对其他编程范式,有一些偏见和误解。
还有,他对软件架构的看法。也比较极端,认为所有的软件都应该有清晰的架构。都应该遵循SOLID原则,都应该分层分模块。否则就是烂代码。
这些观点,虽然有一定的道理。但确实比较极端,不够客观。软件开发是一门实践的学科。没有绝对的对错,只有适合不适合。不同的项目,不同的团队,不同的场景。应该用不同的方法和技术。不能一刀切。
比如,测试驱动开发确实很好。但不是所有项目都适合。如果是一个快速验证的原型项目,需求还不确定,这时候先写测试就是浪费时间。如果是一个性能要求很高的底层系统,测试很难写,这时候强行TDD也不现实。
再比如,面向对象确实很好。但不是所有场景都适合。如果是数据处理、科学计算,函数式编程可能更合适。如果是简单的脚本,过程式编程可能更高效。
所以,读这本书的时候。要批判性地读。不要全盘接受,要结合自己的实际情况,有选择地吸收。
4. 例子偏Java,对其他语言读者不够友好
这本书里的代码例子,大部分都是用Java写的。因为Bob大叔本身是Java社区的领袖,这本书出版的时候,Java也是最流行的编程语言。
对于Java开发者来说,这些例子很亲切,很容易理解。但对于其他语言的开发者,比如Python、JavaScript、Go、C++的开发者来说,可能会觉得有些例子不太好理解,或者不太适用。
当然,书里讲的原则和思想是语言无关的。不管你用什么语言,都能从中受益。但具体的代码例子,确实对非Java开发者不够友好。
如果这本书能多用几种语言写例子。或者用伪代码写例子。可能会更好。
四、我的读书心得:敏捷到底是什么
读完这本书,我最大的收获。不是学会了多少技术和方法,而是对敏捷开发有了更深刻的理解。
以前,我以为敏捷开发就是快。就是加班,就是快速迭代。就是开站会、做迭代、开回顾会。我以为只要照搬Scrum的流程,就是敏捷了。
但读完这本书,我才明白。敏捷不是快。不是加班。不是流程。不是工具。敏捷是一种价值观,一种思维方式,一种工作态度。
敏捷的核心,用敏捷宣言里的四句话概括就是:
个体和互动,高于流程和工具。 可工作的软件,高于详尽的文档。 客户合作,高于合同谈判。 响应变化,高于遵循计划。
这四句话,看起来简单。但真正理解并做到,非常难。
很多团队学敏捷,只学了流程和工具。开站会、用Jira、做迭代、算速度。但没有理解敏捷的价值观。结果,站会变成了汇报会。Jira变成了监控工具,迭代变成了固定的周期。速度变成了KPI。这样的敏捷。不是真正的敏捷,只是形式主义。只会让团队更累,更痛苦。
真正的敏捷。应该是以人为本,尊重开发者。信任开发者,让开发者有自主权。有创造力。应该是拥抱变化,不害怕需求变更。能够快速响应变化。持续交付价值。应该是团队协作,开发者之间、开发者和客户之间。充分沟通,密切合作。共同把产品做好。应该是持续改进,不断反思。不断优化,让团队越来越强,让产品越来越好。
敏捷不是目的,而是手段。敏捷的目的。是为了更好地交付价值,更好地满足客户需求。更好地让团队成长。如果为了敏捷而敏捷,照搬流程。不考虑实际情况,那就是本末倒置了。
这是我读完这本书,最大的心得。
五、为什么很多团队学敏捷越学越乱
读完这本书,我也想明白了一个问题:为什么很多团队学敏捷,越学越乱,越学越累?
我觉得,主要有几个原因。
1. 只学形式,不学本质
这是最常见的原因。很多团队学敏捷,只学了Scrum的流程,开站会、做迭代、开回顾会、用故事点、算速度,但没有理解敏捷背后的价值观和原则。
结果,站会变成了每天15分钟的汇报。每个人说一下昨天做了什么,今天要做什么。有什么阻碍,说完就散。没有真正的沟通和协作。迭代变成了固定的两周一个周期。不管需求大小,不管项目阶段。都强行塞进两周,结果要么加班赶工。要么质量下降。回顾会变成了走过场,每次都说一些不痛不痒的问题。提一些不切实际的改进,最后什么都没改变。
这样的敏捷,只是形式主义。不是真正的敏捷,只会让团队更累,更痛苦。
2. 管理层不支持,甚至抵触
敏捷开发。需要管理层的支持和配合。因为敏捷要求授权给团队,信任团队。让团队自主决策,自主管理。但很多管理层。不愿意放权,不信任团队。还是喜欢指挥,喜欢控制,喜欢微管理。
结果,团队名义上是敏捷团队。实际上还是被管理层指挥着做这做那。没有自主权。没有决策权。站会上,团队说的是一套。管理层要求做的是另一套。迭代计划,团队做了。但管理层随时可以插需求,改优先级。
这样的敏捷,只是表面上的敏捷。实际上还是传统的命令式管理,团队不会有积极性。也不会有创造力,敏捷的好处根本体现不出来。
3. 开发者能力不够
敏捷开发,对开发者的能力要求很高。因为敏捷要求开发者能够快速响应变化。能够持续交付高质量的代码。能够自我管理,自我组织。这就要求开发者有扎实的技术功底,有良好的编码习惯,有较强的沟通能力,有自我驱动的意识。
但很多团队的开发者,能力不够。技术不扎实,代码写得烂。没有测试。没有文档。沟通能力差,自我管理能力弱。在这种情况下。强行推行敏捷,只会让团队更乱,质量更差。
比如,测试驱动开发。要求开发者会写测试,能写好测试。如果开发者连单元测试都不会写。怎么TDD?再比如,持续集成。要求开发者有良好的编码习惯,经常提交代码。提交前跑测试。如果开发者提交代码不跑测试,经常提交有问题的代码,持续集成就是摆设。
所以,敏捷不是银弹。不能解决所有问题。在推行敏捷之前,先要提升开发者的能力,打好技术基础。否则就是空中楼阁。
4. 不结合实际情况,照搬照抄
每个团队的情况都不一样,项目类型不一样。团队规模不一样,人员构成不一样。客户需求不一样。适合A团队的敏捷方法,不一定适合B团队。
但很多团队学敏捷,不结合自己的实际情况。照搬照抄,别人怎么做我就怎么做。别人用Scrum。我也用Scrum;别人搞结对编程,我也搞结对编程;别人做TDD。我也做TDD。完全不考虑自己的项目适不适合,团队能不能接受。
结果,水土不服。越学越乱。比如,一个只有3个人的小团队。非要搞完整的Scrum,开站会、做迭代、开回顾会、算速度。结果流程比开发还复杂,效率反而更低。再比如。一个需求非常稳定的维护项目,非要搞快速迭代。频繁变更,结果越改越乱,质量越来越差。
所以,学敏捷。要结合自己的实际情况,灵活应用。不要照搬照抄。适合自己的,才是最好的。
六、这本书适合谁读
最后,聊聊这本书适合谁读,不适合谁读。
适合读的人:
- 对敏捷开发感兴趣,想系统了解敏捷开发的开发者。这本书是敏捷开发的经典著作,能帮你建立对敏捷的整体认知,理解敏捷的本质。
- 有一定开发经验,想提升自己的设计能力和编码质量的开发者。书里的SOLID原则、设计模式、测试驱动开发、重构等内容,能帮你提升技术能力。
- 技术负责人、项目经理、团队Leader。书里讲的项目管理、团队协作、迭代开发等内容,能帮你更好地管理团队,管理项目。
- 对软件开发有热情,想深入理解软件开发本质的人。这本书不只是讲技术,更是讲思想,讲哲学,能让你对软件开发有更深刻的理解。
不适合读的人:
- 刚入门的新手,连基本的编程都还没掌握。这本书有一定的深度,需要有一定的开发经验才能理解,新手读起来会比较吃力。
- 只想学具体工具和流程的人。这本书不讲具体的工具怎么用,不讲Jira怎么操作,不讲站会怎么开,它讲的是原则和思想,如果你只想学工具,这本书不适合你。
- 不喜欢理论,只喜欢看代码的人。这本书有很多理论和思想的内容,代码例子相对较少,如果你只喜欢看代码,不喜欢读理论,可能会觉得枯燥。
- 追求速成,想看完就能用的人。这本书的内容需要慢慢消化,慢慢体会,结合实际工作去实践,不是看完就能立刻用上的。如果你想速成,这本书不适合你。
七、写在最后
《敏捷软件开发》是一本经典著作,也是一本值得反复读的书。我这次读了一遍。收获很大。但我知道,我只理解了其中的一部分。还有很多内容需要在以后的工作中慢慢体会,慢慢实践。
这本书出版快20年了,技术在变。框架在变,行业在变。但软件开发的本质没有变。敏捷的价值观没有变。只要我们还在做软件,还在和人协作。还在应对变化,这本书里的原则和思想就依然有价值。
当然,这本书也不是完美的。它有一些缺点和不足,有些内容已经过时。有些观点比较极端,有些地方过于理想化。但这些都不影响它成为一本经典,一本值得每个开发者读的书。
最后,我想说。读书不是目的,实践才是。读了这本书。理解了敏捷的原则和思想,还要在实际工作中去应用。去实践,去改进。只有这样。才能真正从这本书中受益,才能真正提升自己的能力。提升团队的效率,提升产品的质量。
敏捷不是终点,而是一个持续改进的过程。愿我们都能在敏捷的道路上,越走越远,越走越好。
希望这篇文章能给你一些启发,也推荐大家读一读《敏捷软件开发》这本书,虽然有点老。但真的值得。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录