第一章 敏捷--高效软件开发之道
不管路走了多远,错了就要重新返回
---土耳其言语
敏捷意味着可以快速地适应变化。
敏捷开发宣言
个体和交互胜过过程和工具
可工作的软件胜过面面俱到的文档
客户协作胜过合同谈判
响应变化胜过遵循计划
轻量型软件开发过程
只关注真正重要的事情,少关注那些占用大量时间而无甚裨益的不重要的事情
敏捷开发宣言:一种把以人为本、团队合作、快速响应变化和可工作的软件作为宗旨的开发方法
敏捷方法可以快速地响应变化,它强调团队合作,人们专注于具体可行的目标(实现真正可以工作的软件),这就是敏捷的精神。它打破了那种基于计划的瀑布式软件开发方法,将软件开发的实际重点转移到一种更自然和可持续的开发方式上。
它要求团队中的每个人(包括团队合作的人)都具备职业精神,并积极地期望项目能够获得成功。它并不要求所有人都是有经验的专业人员,但必须具有专业的工作态度--每个人都希望尽最大可能做好自己的工作。
开发需持续不断,切勿时续时断
continuous development,not episodic
持续前进的开发思想根植于敏捷方法中
inject energy
持续注入能量
防微杜渐,把问题解决在萌芽状态,要探索未知领域,在大量成本投入之前先确定其可行性
敏捷开发就是在一个高度协作的环境中,不断地使用反馈进行自我调整和完善
先难后易,首先要解决困难的问题,把简单的问题留到最后
第二章
态度决定一切
选定了要走的路,就是选定了它通往的目的地
--Harry Emerson Fosdick(美国基督教现代主义神学家)
敏捷方法只需要一个角色:软件开发者,任务就是和紧密客户协作,一起开发软件。敏捷依赖人,而不是依赖于项目的甘特图和里程表
集中精力,你是为做事而工作
在时间压力下,欲速则不达
对事不对人会让工作更加有效
反馈是敏捷的基础
1、做事
最高优先级是解决问题
指责不能修复bug
Blame doesn't fix bugs
把矛头对准问题的解决办法,而不是人。这是真正有用处的正面效应
切身感受
勇于承认自己不知道答案,这会让人感觉放心,一个重大的错误应该被当做是一次学习而不是指责他人的机会。团队成员们在一起工作,应互相帮助,而不是互相指责。
平衡的艺术
“这不是我的错”,这句话不对。“这都是你的错”,这句话更不对
如果你没有犯过任何错误,就说明你可能没有努力去工作
开发者和质量工程师(QA)争论某个问题是系统本身的缺陷还是系统增强功能导致的,通常没有多大意义。与其如此,不如赶紧去修复它
如果一个团队成员误解了一个需求,一个API调用,或者最近一次会议做的决策,那么,也许就意味着团队的其他成员也有相同的误解。要确保整个团队尽快消除误解。
如果一个团队成员的行为一再伤害了团队,则他表现得很不职业。那么,他就不是在帮助团队向解决问题的方向前几。这种情况下,我们必须要求他离开这个团队
如果大部分团队成员(特别是开发领导者)的行为都不职业,并且他们对团队目标都不感兴趣,你就应该主动从这个团队中离开,寻找更适合自己发展的团队(这是一个有远见的想法,没必要眼睁睁看着自己陷入一个“死亡之旅”的项目中)。
2、欲速则不达
防微杜渐
Beware of land mines
要理解开发过程
尽管我们在谈论理解代码,特别是在修改代码之前一定要很好地理解它,然而同样道理,你也需要了解团队的开发方法或者开发过程
你必须要理解团队采用的开发方法,你必须理解如何恰如其分地使用这种方法,为何它们是这样的,以及如何成为这样的。
只有理解了这些问题,你次啊能进行有效的改变
不要孤立地编码
Don't code in isolation
实行代码复审,不仅有助于代码更好理解,而且是发现bug最有效的方法之一
使用单元测试
use unit tests
不要坠入快速的简单修复之中。要投入时间和精力保持代码的整洁、敞亮。
平衡的艺术
你必须要理解一块代码是如何工作的,但是不一定需要成为一位专家。只要你能使用它进行有效的工作就足够了,不需要把它当做毕生事业
如果有一位团队成员宣布,有一块代码其他人都很难看懂,这就意味着任何人(包括原作者)都很难维护它。请让它变得简单些
不要急于修复一段没能真正理解的代码,这种+1/-1的病症始于无形,但是很快就会让代码一团糟。要解决真正的问题,不要治标不治本
所有的大型系统都非常复杂,因此没有一个人能完全明白所有的代码。除了深入了解你正在开发的那部分代码之外,你还需要从更高的层面来了解大部分代码的功能,这样就可以理解系统各个功能块之间时如何交互的.
3、对事不对人
举例:当Lee先生在做一个新方案介绍的时候,下面有人会说:“那样很蠢!(这也就暗示着Lee先生也很蠢)”如果把这句话推敲一下,也许会好一点:“那样很蠢,你忘记考虑它要线程安全。”事实上最适合并且最有效的表达方式应该是:“谢谢,Lee先生。当我想知道,如果两个用户同时登陆会发生什么情况?”
看出其中不同了吧!
否定个人能力
指出明显的缺点,并否定其观点
询问你的队友,并提出你的顾虑
引导性的提出一个疑问,让他们自己意识到问题
消极扼杀创新
Negativity kills innovation
你不需要很出色才能起步,但是你必须起步才能变得很出色---Les Brown(莱斯 布朗 全球领军励志演讲家和作家)
如果你是一个有远见的人,就一定要特别尊重别人的意见。你是一个掌舵者,一定要把握方向,深思熟虑,吸取各方的意见。
能容纳自己并不接受的想法,表明你的头脑足够有学识--亚里士多德
下面是一些有效的特殊技术
设定最终期限
没有最好的答案,只有更适合的方案
逆向思维
意识到权衡的必要性
一种客观对待问题的办法是:先积极地看到它的正面,然后再努力地从反面去认识它。目的是要找出优点最多缺点最少的那个方案,而这个好办法可以尽可能地发现其优缺点。这也有助于少带个人感情
设立仲裁人
支持已经做出的决定
设计充满了妥协(生活本身也是如此),成功属于意识到这一点的团队
对事不对人 让我们骄傲的应该是解决了问题,而不是比较出谁的主意更好
平衡的艺术
...
四、排除万难,奋勇前进
谁去给猫系铃铛(who will bell the cat)
当发现问题时,不要试图掩盖这些问题。而要有勇气站起来,说:“我现在知道了,我过去使用的方法不对。我想到了一些办法,可以解决这个问题--如果你有更好的想法,我也很乐意听一听--但可能会花多些时间”
要诚实,要有勇气去说出实情。有时,这样做很困难,所以我们要有足够的勇气。
平衡的艺术
如果你在压力下要对代码质量做出妥协,你可以指出,作为一名开发者,你没有职权毁坏公司的资产(所有的代码)