1 不管路走多远,错了就要重新返回。
2 开发要持续不断,切勿时断时续。
3 持续注入能量。
4 敏捷开发就是一个高度协作的环境中,不断地使用反馈进行自我调整和完善。
5 先难后易。
我们首先要解决困难的问题,把简单的问题留到最后。
6 选定了要走的路,就是选定了它通往的目的地。
7 指责不能修复bug。
把矛头对准问题的解决办法,而不是人。这是真正有用处的正面效应。
8 防微杜渐。
9 不要孤立地编码。
10 使用单元测试。
单元测试帮助你很自然地把代码分层,分成很多可管理的小块,这样就会得到设计更好、更清晰的代码。
11 不要坠入快速的简单修复之中。
要投入时间和精力保持代码的整洁、敞亮。
12 消极扼杀创新。
负面的评论和态度扼杀了创新。
13 有效的特殊技术:
设定最终期限。
逆向思维。
设立仲裁人。
支持已经做出的决定。
14 对事不对人。
让我们骄傲的应该是解决了问题,而不是比较出谁的主意更好。
15 做正确的事。
要诚实,要有勇气去说出实情。有时,这样做很困难,所以我们要有足够的勇气。
16 即使你已经在正确的轨道上,但如果只是停止不前,也仍然会被淘汰出局。
17 如何才能跟上技术的步伐呢?
迭代和增量式的学习。
了解最新行情。
参加本地的用户组活动。
参加研讨会议。
如饥似渴地阅读。
跟踪技术变化。
18 提供你和团队学习的更好平台。
通过午餐会议可以增进每个人的知识和技能,并帮助大家聚集一起进行沟通交流。
19 根深蒂固的习惯不可能轻易地就丢弃掉。
20 学习新的东西,丢弃旧的东西。
在学习一门新技术的时候,要丢弃会阻止你前进的旧习惯。毕竟,汽车要比马车车厢强得多。
21 不停地问为什么。
不能只满足于别人告诉你的表面现象。要不停地提问直到你明白问题的根源。
22 解决任务,在事情变得一团糟之前。
保持事件之间稳定重复的间隔,更容易解决常见的重复任务。
23 没有任何计划在遇敌后还能继续执行。
固守昨天的计划而无视环境的变化会带来灾难。
24 决定什么不该决定。
25 让你的客户做决定。
开发者、经理或者业务分析师不应该做业务方面的决定。用业务负责人能够理解的语言,向他们详细解释遇到的问题,并让他们做决定。
26 设计满足实现即可,不必过于详细。
27 如果你自己都不清楚所谈论的东西,就根本不可能精确地描述它。
28 战略设计与战术设计。
29 好设计是一张地图,它也会进化。好的设计应该是正确的,而不是精确的。
30 盲目地为项目选择技术框架,就好比是为了少交税而生孩子。
31 不要开发你能下载到的东西。
你的代码写的越少,需要维护的东西就越少。
32 新技术就应该像新的工具,可以帮助你更好地工作,它自己不应该成为你的工作。
33 已提交的代码应该随时可以行动。
任何时候只要你没有准备好,那就是敌人进攻你的最佳时机。
34 保持你的项目时刻可以发布。
保证你的系统随时可以编译、运行、测试并立即部署。
35 千万不能让系统既不可以发布,又不可以撤销。
36 绝不要做大爆炸式的集成。
37 提早集成,频繁集成。
代码集成是主要的风险来源。要想避免这个风险,只有提早集成,持续而又规律地进行集成。
38 质量保证人员应该测试部署过程。
39 一开始就实现自动化部署应用。
使用部署系统安装你的应用,在不同的机器上用不同的配置文件测试依赖的问题。质量保证人员要像测试应用一样测试部署。
40 需求就像是流动着的油墨。
41 给客户演示所完成功能的时间与得到客户需求的时间间隔越长,那么你就会离最初需求越来越远。
42 清晰可见的开发。在开发的时候,要保持应用可见。
每隔一周或者两周,邀请所有客户,给他们演示最新完成的功能,积极获得他们的反馈。
43 演示是用来让客户提出反馈的,有助于驾驭项目的方向。
如果缺少功能或者稳定性的时候,不应该拿来演示,那只能让人生气。
44 给我一份详细的长期计划,我就会给你一个注定完蛋的项目。
45 增量开发。
发布带有最小却可用功能块的产品。每个增量开发中,使用1~4周左右迭代周期。短迭代让人感觉非常专注且具效率。
46 固定的价格就是保证要背叛承诺。
软件项目天生就是变化无常的,不可重复。如果要提前给出一个固定的价格,就几乎肯定不能遵守开发上的承诺。
47 基于真实工作的评估。
让团队和客户一起,真正地在当前项目中工作,做具体实际的评估。由客户控制他们要的功能和预算。
48 一步行动,胜过千万专家的意见。
49 编写能产生反馈的代码。
50 单元测试的理由:
单元测试能及时提供反馈。
单元测试让你的代码更加强壮。
单元测试是有用的测试工具。
单元测试是让你自信的后台。
单元测试是解决问题时的探测器。
单元测试是可信的文档。
单元测试是学习工具。
51 使用自动化的单元测试。
好的单元测试能够为你的代码问题提供及时的警报。如果没有到位的单元测试,不要进行任何设计和代码修改。
52 编码之前,先写测试。
53 好的设计并不意味着需要更多的类。
54 先用它再实现它。
将TDD作为设计工具,它会为你带来更简单更有效的设计。
55 使用自动化会节省时间。
56 不同环境,就有不同问题。
使用持续集成工具,在每一种支持的平台和环境中运行单元测试。要积极地寻找问题,而不是等问题来找你。
57 为核心的业务逻辑创建测试。
让你的客户单独验证这些测试,要让它们像一般的测试一样可以自动运行。
58 专注于你的方向。
59 度量剩下的工作量。
不要用不恰当的度量来欺骗自己或者团队。要评估那些需要完成的待办事项。
60 每一个抱怨的背后都隐藏了一个事实。
找出真相,修复真正的问题。
61 没有愚蠢的用户。
只有愚蠢、自大的开发人员。
62 如果代码问题解决不了,也许可以考虑通过修改文档或者培训来弥补。
63 任何一个笨蛋都能够让事情变得越来越笨重、越来越复杂、越来越极端。
需要天才的指点以及许多的勇气,才能让事情向相反的方向发展。
64 设计软件有两种方式。
一种是设计得尽量简单,并且明显没有缺陷。另一种方式是设计得尽量复杂,并且没有明显的缺陷。
65 PIE原则:
代码必须明确说出你的意图,并且必须富有表达力。这样可以让代码更易于被别人阅读和理解。代码不让人迷惑,也就减少了发生潜在错误的可能。一言以蔽之,代码应意图清晰,表达明确。
66 要编写清晰的而不是讨巧的代码。
向代码阅读着明确表明你的意图。可读性差的代码一点都不聪明。
67 不要明日复明日。
如果现在不做的话,以后你也不会做的。
68 有意图的编程并不是意味着创建更多的类或者类型。这不是进行过分抽象的理由。
69 不要用注释包裹你的代码。
70 良好的命名可以向读者传递大量的正确信息。
要尽量避免使用神秘的变量名。
71 用注释沟通。
使用细心选择的、有意义的命名。用注释描述代码意图和约束。注释不能替代优秀的代码。
72 没有最佳的解决方案。
73 动态评估权衡。
考虑性能、便利性、生产力、成本和上市时间。
74 过早的优化是万恶之源。
75 要休息的话,就好好的休息。休息时请远离键盘。
76 简单不是简陋。
直觉不是魔术,它是经验和技能的厚积薄发之产物。
77 开发可以工作的、最简单的解决方案。
除非有不可辨驳的原因,否则不要使用模式、原则和高难度技术之类的东西。
78 简单、可读性高的代码。
79 让类的功能尽量集中,让组件尽量小。
要避免创建很大的类或组件,也不要创建无所不包的大杂烩类。
80 当你需要一只袜子的时候,一盒棉线不能带给你任何帮助。
81 将命令与查询分离开来。
82 告知,不要询问。
不要抢别的对象或是组件的工作。告诉它做什么,然后盯着你自己的职责就好了。
83 针对is-a关系使用集成;针对has-a或uses-a关系使用委托。
84 相对继承来说,委托更加灵活,适应力更强。
85 通过替换代码来扩展系统。
通过替换遵循接口契约的类,来添加并改进功能特性。要多使用委托而不是继承。
86 你也许会对木匠那毫无差错的工作印象深刻。
但我向你保证,事实不是这样的。真正的高手只是知道如何亡羊补牢。
87 不要在同一处跌倒两次。
88 维护一个问题及其解决方案的日志。
保留解决方案是修复问题过程的一部分,以后发生相同或类似的问题时,就可以很快找到并使用了。
89 警告就是错误。
将警告视为错误。签入带有警告的代码,就跟签入有错误或者没有通过测试的代码一样,都是极差的做法。签入构建工具中的代码不应该产生任何警告信息。
90 用原型进行分离。
91 对问题各个击破。
在解决问题时,要将问题域与其周边隔离开,特别是在大型应用中。
92 处理或是向上传播所有的异常。
不要将它们压制不管,就算是临时这样做也不行。在写代码时要估计到会发生的问题。
93 展示有用的错误信息。
提供更易于查找错误细节的方式。发生问题时,要展示出尽量多的支持细节,不过别让用户陷入其中。
94 使用立会。立会可以让团队达成共识。保证会议短小精悍不跑题。
95 不可能在PowerPoint幻灯片中进行编程。
96 教学相长。
成为指导者。分享自己的知识很有趣—付出的同时便有收获。还可以激励别人获得更好的成果,而且提升了整个团队的实力。
97 准备好后再共享代码。
绝不要提交尚未完成的代码。故意签入编译未通过或是没有通过单元测试的代码,对项目来说,应被视作玩忽职守的犯罪行为。
98 做代码复查。复查所有代码。
99 及时通报进展与问题。
100 一灯能除千年暗,一智能灭万年愚。