生产力机制

加速法则

加速你与计算机的交互,去除计算机繁文缛节
  • 键盘输入总比导航快

使用启动器来启动应用程序,mac上可以考虑 Alfred

  • 花时间学习你手边所有隐藏的快捷键

  • 环境切换会消耗时间

使用多重剪贴板

  • 记住历史

忘记历史意味着你得再输入一遍

  • shell中使用方向键查看近期历史命令

  • 开发加速器

安装按键提示器插件,每次使用菜单时会提醒你用快捷键

  • 在上下文中学习IDE快捷键,而不要去背长长的列表

  • 通读一遍快捷键,把对你确实有用但不知道的快捷键找出并设法记住,联通“可以这样做”与“如何去做”

  • 使用代码模板 - 当你第二次输入一个复杂结构时将它做成模板

  • 代码资源查找采用搜索而非导航

如果要对多行文本做同样操作,应该找出其中模式,并把它记录为一个宏

  • 不用总是重复输入相同的命令,使用宏记录器简化重复的工作

  • 每天花一点点时间来使每一天都更高效

    总结:多用键盘输入,少切换环境,记住输入历史,在IDE中多用快捷键、代码模板、搜索等,使用宏搞定重复的事情

专注法则

集中注意力,去除低效率和不必要的干扰
  • 精力越集中,思维越缜密

  • 隔离策略

阻止听觉打扰:戴上耳机

  • 阻止视觉打扰:关闭电子邮件客户端,关掉桌面通知

  • 创造安静时间

  • 搜索优于导航

草堆越大,从中找到一根针就越难

  • 不用文件树,要搜索

  • 使用正则表达式找出难找的目标

  • 使用多显示器

一个显示器写代码一个调试

  • 一个放文档一个写代码

  • 用虚拟桌面拆分工作空间

设置“交流”、“文档”、“开发”桌面,让工作环境不再混乱

改变环境减少打扰,减少来自电脑的打扰,借助工具保持专注

自动法则

不用浪费时间动手去做可以被自动化的事情
  • 计算机原本就该从事简单重复的工作

  • 图形化环境是用来帮助新手的

  • 不要重复发明轮子,使用现有的工具进行自动化构建、持续集成和文档

  • 建立本地缓存,离线文档

  • 使用Rss源交互

  • 在构建之外使用ant

  • 使用应该自动化的关键在于投资回报率和缓解风险

  • 牢记你到底要做什么,不要把时间浪费在做与目标偏离太远的事情上

    把重复工作自动化,抽身出来做更有价值的事

规范性法则

规范性指的是消除重复
  • DRY版本控制

尽早、尽可能频繁地提交文件到版本控制中鼓励你进行小步改动,减少合并冲突

  • 把公共库和二进制文件放入版本控制,只保存一份副本

  • 用持续集成服务器作为单独的构建机器,阻止一些难以察觉的工具依赖影响你的构建过程

  • 间接机制

使用间接机制确保项目里每个人使用完全相同的一组插件

  • 使用间接机制来保持文件同步

  • 通过复制粘贴来复用是邪恶的,不管你复制粘贴的是什么

  • 编写脚本周期性的保存规范的配置

  • 利用虚拟机使项目依赖标准化

  • 不要让对象关系映射违反规范原则

  • DRY文档

过时文档比没有文档更糟糕,因为它会主动误导你

  • 阻止文档过时的最好方法是尽可能自动生成它

  • 白板+数码相机强过任何CASE工具

    重复是软件开发中最大的阻力,DRY是写出良好代码的根本原则

实践

测试驱动设计

  • 单元测试是一项提升代码质量的最佳实践

  • TDD改进代码设计

养成更好的代码消费意识

  • 促使你去模拟被依赖的对象,考虑对象间交互

  • 永远保持把测试作为构建过程的一部分

  • 有了测试的保证,完全可以放心大胆的去修改代码

  • 把注释重构成方法

TDD下开发的代码。其方法名描述的就是一个原子操作,更快的发现错误的根源

静态分析

  • 静态分析工具提供了便宜实惠的验证手段

  • 字节码分析

FindBugs

  • 源代码分析

PMD

  • 代码风格检查 CheckStyle

当个好公民

  • 不用盲目地去创建set/get方法,只有在需要才创建它

  • 使用有意义的构造函数,而不是把默认构造函数当做一个创建对象的机制

  • 静态方法的一个好处是,可以作为一个黑箱式的独立、无状态的方法

  • 不要创建全局变量,即使是对象层次的全局变量

  • 单例模式的邪恶地方在于它内藏的状态使它不能被测试,它是面向对象版本的全局变量

  • 使用简单的对象加一个工厂替代单例模式,工厂负责监管实例,简单对象只管理关于配置的信息和行为

YAGNI - 不要过度开发

  • 只开发当下需要的东西

  • 不要沉溺于预想开发,预想开发会造就框架

  • 如无必要,勿增复杂度

  • 最好的框架不是出自于那些坐在象牙塔里揣测程序员需求的设计师,而是从真实的代码中抽取出来的

  • 把没用的代码从代码库中剔除,在修改功能代码时就不会那么费力

古代哲人

  • 分清楚软件开发中的本质性质和附属性质,致力于本质复杂性,去除附属复杂性

  • 如果对于一个现象有多种解释,那么最简单的解释往往是最正确的 - 奥卡姆剃刀原理

  • 任何对象都不需要知道与之交互的那些对象的任何内部细节 - 迪米特法则,它应该只能调用该对象本身、作为参数传进来的对象、在方法内创建的对象

质疑权威

  • 驼峰命名法未必适合所有情况

  • 使用build模式给对象动态增加属性

  • 反转计算的前因和后因

元编程

  • 编写“会写程序”的程序

  • java中使用反射

  • 使用Groovy测试java

组合方法和SLAP(单一抽象层次原则)

  • 重构成组合方法能暴露出隐藏的可复用代码

  • TDD实践推动组合方法模式

  • SLPA强调每个方法中所有代码都处于同一级抽象层次

  • 把所有实现细节封装在公共方法之外

多语言编程

  • 计算机语言就像鲨鱼,要是保持静止就会死

  • 多语言编程是指除了一种通用语言之外,还使用一种或多种专用语言来构造应用程序

  • 程序员的生产率比计算机的时钟周期更重要,而且摩尔定律自然会解决这种问题

  • 用一种静态语言作为可靠的基础,用一种彰显开发效率的语言来完成日常编程任务,用多种领域特定语言让我们的代码更贴近业务和需求

寻找完美工具

  • 寻找属于你的完美编辑器,并从里到外去了解它

  • 完美编辑器特性

宏记录器

  • 可以从命令行调用

  • 正则表达式的查找与替换

  • 增强的剪切和复制命令

  • 将行为保留在代码中,通过配置实现延迟绑定

  • 命令行的有勇指出在于得到执行结果后你能做什么