《卓有成效的程序员》读书笔记

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强调每个方法中所有代码都处于同一级抽象层次
  • 把所有实现细节封装在公共方法之外

多语言编程

  • 计算机语言就像鲨鱼,要是保持静止就会死
  • 多语言编程是指除了一种通用语言之外,还使用一种或多种专用语言来构造应用程序
  • 程序员的生产率比计算机的时钟周期更重要,而且摩尔定律自然会解决这种问题
  • 用一种静态语言作为可靠的基础,用一种彰显开发效率的语言来完成日常编程任务,用多种领域特定语言让我们的代码更贴近业务和需求

寻找完美工具

  • 寻找属于你的完美编辑器,并从里到外去了解它
  • 完美编辑器特性
    • 宏记录器
    • 可以从命令行调用
    • 正则表达式的查找与替换
    • 增强的剪切和复制命令
  • 将行为保留在代码中,通过配置实现延迟绑定
  • 命令行的有勇指出在于得到执行结果后你能做什么
Comments
Write a Comment