- 关心你的技艺 如果你不在乎能否漂亮的开发出软件,你又为何要耗费生命去开发软件?
- 思考!你的工作 不断批评和评估你的工作
- 提供各种选择,不要找蹩脚的借口 不要说事情做不到,说明能够做什么
- 不要容忍破窗户 当看到糟糕的设计、错误的决策和糟糕的代码时,修正他们
- 做变化的催化剂 不能强迫改变,而是展示或者想象未来可能会怎样,然后参与对未来的创造
- 记住大图景 不要太过专注于细节,以致于忘了查看周围正在发生什么
- 使质量成为需求问题 让用户参与确定项目真正的质量需求
- 定期为你的知识资产投资 让学习成为习惯
- 批判地分析你读到的和听到的 不要被其他所左右,要依照你自己的看法和你的项目的情况去对信息进行分析
- 你说什么和你怎么说同样重要 如果你不能有效的和他人传达你的思想,那么这个思想就毫无用处
- 不要重复你自己 (DRY Don’t Repeat Yourself) 系统中的每一项知识都必须具有单一、无歧义、权威的表示
- 让复用变得容易 如果复用很容易,人们就会去复用。创造一个支持复用的环境
- 消除无关事务之间的影响 设计自足、独立、并具有单一、良好定义的目的的组件
- 不存在最终决策 为变化做好计划
- 用曳光弹找到目标 曳光弹能通过试验各种事物并检查它们离目标有多远来让你追踪目标
- 为了学习而制作原型 原型制作是一种学习经验。其价值并不在于所产生的代码,而在于所学到的经验教训
- 靠近问题领域编程 用你的用户的语言进行设计和编码
- 估算,以避免发生意外 在着手之前先进性估算。你将提前发现潜在的问题
- 通过代码对进度表进行迭代 用你在进行实现时获得的经验提炼项目的时间标度
- 用纯文本保存知识 纯文本不会过时,它能够帮助你有效利用你的工作,并简化调试和测试
- 利用命令shell的力量 当图形用户界面无能为力时使用shell
- 用好一种编辑器 编辑器应该是你的手的延伸,确保你的编辑器是可配置、可扩展和可编程的
- 总是使用源码控制 源码控制是你的时间机器–你能够回到过去
- 要修正问题,而不是发出指责 bug是你的过错还是别人的错,并不是真的有关系–它仍然是你的问题,它仍然需要修正
- 不要恐慌 做一次深呼吸,思考什么可能是bug的原因、
- “select"没有问题 在OS或编辑器、甚或是第三方产品或库中很少发现bug,bug很可能在应用中
- 不要假定,要证明 在实际环境中,使用真正的数据和边界条件,证明你的假定
- 学习一种文本操纵语言 你用每天的很大一部分时间处理文本,为什么不让计算机替你完成部分工作?
- 编写能编写代码的代码 代码生成器能提高你的生产率,并有助于避免重复
- 你不可能写出完美软件 软件不可能完美,保护你的代码和用户,使他们免于能够预见的错误
- 通过合约进行设计 使用合约建立文档,并检验代码所做的事情正好是它声明要做的
- 早崩溃 死程序造成的危害通常比有问题的程序要小得多
- 用断言避免不可能发生的事情 断言验证你的各种假定,在一个不确定的世界里,用断言保护你的代码
- 将异常用于异常的问题 异常可能会遭受经典的意大利面条式代码的所有可读性和可维护性问题的折磨,将异常保留给异常的事务
- 要有始有终 只要可能,分配给某资源的例程或对象也应该负责解除其分配
- 使模块之间的耦合减至最少 通过编写”羞怯的“代码并应用法则来避免耦合
- 要配置,不要集合 要将应用的各种技术选择实现为配置选项,而不是通过集成或工程方法实现
- 将抽象放进代码,细节放进元数据 为一般情况编程,将细节放在被编译的代码库之外
- 分析工作流,以改善并发性 利用你的用户的工作流中的并发性
- 用服务进行设计 根据服务–独立的、在良好定义的、一致的接口之后的并发对象–进行设计
- 总是为并发进行设计 容许并发,你将会设计出更整洁、具有更少假定的接口
- 使视图与模型分离 要根据模型和视图设计你的应用,从而以低廉的代码获取灵活性
- 用黑板协调工作流 用黑板协调完全不同的事实和因素,同时又使各参与方保持独立和隔离
- 不要靠巧合编程 只依靠可靠的事务,注意偶发的复杂性,不要把幸运的巧合与有目的的计划混为一谈
- 估算你的算法的阶 在你编写代码之前,先大致估算事情需要多长时间
- 测试你的估算 对算法的数学分析并不会告诉你每一件事,在你的代码的目标环境中测定它的速度
- 早重构,常重构 在需要时要对你的代码进行重写、重做和重新架构,要铲除问题的根源
- 为测试而设计 在你还没有编写代码时就开始思考测试问题
- 测试你的软件,否则你的用户就得测试 无情地测试,不要让你的用户为你查找bug
- 不要使用你不理解的向导代码 向导可以生成大量代码,在你把它们合并进你的项目之前,确保你理解全部这些代码
- 不要搜集需求–挖掘他们 需求很少存在于表面,它们深深地埋藏在层层假定、误解和政治手段的下面
- 与用户一同工作,以像用户一样思考 要了解系统实际上将如何被使用,这就是最好的办法
- 抽象比细节活得更久 投资于抽象,而不是实际,抽象能在来自不同的实现和新技术的变化的攻击下存活下去
- 使用项目词汇表 创建并维护项目中使用的专用术语和词汇的单一信息源
- 不要在盒子外面思考–要找到盒子 在遇到不可能解决的问题时,要确定真正的约束,问问你自己:”它必须以这种方式完成吗?它真的必须完成吗?
- 等你准备好再开始 你的一生都在积累经验,不要忽视反复出现的疑虑
- 对有些事情做胜于描述 不要掉进规范的螺旋–在某个时刻,你需要开始编码
- 不要做形式方法的奴隶 如果你没有把某项技术放进你的开发实践和能力的语境中,不要盲目地采用它
- 昂贵的工具不一定能制作出更好的设计 根据工具的价值判定他们
- 围绕功能组织团队 不要把设计师与编码员分开,也不要把测试员与数据建模员分开,按照你构建代码的方式构建团队
- 不要使用手工流程 shell脚本或批文件会一次次地以同一顺序执行同样的指令
- 早测试,常测试,自动测试 与呆在书架上的测试计划相比,每次构建时运行的测试要有效得多
- 要到通过全部测试,编码才算完成
- 通过“蓄意破坏”测试你的测试 在单独的软件副本上故意引入bug,以检验测试能够抓住它们
- 测试状态覆盖,而不是代码覆盖 确定并测试重要的程序状态,只是测试代码还是不够的
- 一个bug只抓一次 一旦测试员找到一个bug,这应该是测试员最后一次找到它,此后自动测试应该对其进行检查
- 英语就是一种编程语言 像你编写程序一样编写文档,遵守DRY原则,使用元数据、MVC、自动生成、等等
- 把文档建在里面,不要栓在外面 与代码分离的文档不太可能被修正和更新
- 温和地超出用户的期望 要理解你的用户的期望,然后给他们的东西要多那么一点
- 在你的作品上签名
The Pragmatic Programmer: From Journeyman to Master Tip集合

