《卓有成效的程序员》读书笔记
2016-09-03
生产力机制
加速法则
加速你与计算机的交互,去除计算机繁文缛节
- 键盘输入总比导航快
- 使用启动器来启动应用程序,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强调每个方法中所有代码都处于同一级抽象层次
- 把所有实现细节封装在公共方法之外
多语言编程
- 计算机语言就像鲨鱼,要是保持静止就会死
- 多语言编程是指除了一种通用语言之外,还使用一种或多种专用语言来构造应用程序
- 程序员的生产率比计算机的时钟周期更重要,而且摩尔定律自然会解决这种问题
- 用一种静态语言作为可靠的基础,用一种彰显开发效率的语言来完成日常编程任务,用多种领域特定语言让我们的代码更贴近业务和需求
寻找完美工具
- 寻找属于你的完美编辑器,并从里到外去了解它
- 完美编辑器特性
- 宏记录器
- 可以从命令行调用
- 正则表达式的查找与替换
- 增强的剪切和复制命令
- 将行为保留在代码中,通过配置实现延迟绑定
- 命令行的有勇指出在于得到执行结果后你能做什么
Post TOC
Comments