【书摘】卓有成效的程序员

关注本质,而非形式。


生产率是指在一定的时间内所完成的有效工作量。本书包含两部分。第一部分讨论生产率的机制,以及一些能使你在软件开发过程中变得更加高效的工具。第二部分讨论一些提高生产率的实践,以及如何利用你的知识和他人的知识来更快更好地开发软件。

VI 和 Emacs 都支持一个非常重要的加速器:永远不要将你的双手从字符按键上移开。即使是下移到键盘上的箭头按钮都会使你慢下来,因为你必须再次回到主排键来输入字符。真正有用的编辑器会使你的手保持在最佳位置,同时进行输入和导航。

使用多显示器,你可以在一个显示器上写代码在另一个显示器上调试,或是在编程的同时始终把文档放在旁边。不过多显示器只是第一步,因为你还可以利用虚拟桌面把这两个工作空间各自变成一组具有特定功能的视图。

现代社会让我们很难保持专注。但为了充分发挥潜力,你必须根据周围的情况创造出一个能让自己专心工作的空间和环境来,这将极大地提高你的生产率。

当你打算把某个任务自动化时,项目经理可能会担心你的工作失控。要控制这种风险,最好的办法就是『时间盒(timebox)』:首先订好一段时间和探索和了解情况,时间一到就客观地评估是否值得去做这件事。使用时间盒是为了掌握更多信息,以便作出切合实际的决策。时间和到期以后,如果掌握的信息不够,你也可以再增加一个时间盒,以便找出更多信息。

单元测试是一项提升代码质量的极佳实践。经过测试的代码能更好地保证编码意图和实际结果相符。

框架并非十恶不赦之物。恰好相反,框架已成为最受喜爱的一种抽象方式。面向对象开发和组件潮流中许诺的代码重用大多是靠框架来兑现的。但要是框架的功能远超出你的需要,它就会对项目造成伤害,因为框架必然增加复杂度。

古代哲学家们所创立的一些在现在看来显而易见的思想,在当时却需要非凡的才智和莫大的勇气。

SLAP(Single Level of Abstraction Principle, 单一抽象层次原则)强调每个方法中的所有代码都处于同一级抽象层级。换句话说,你不应该在一个方法中既处理底层的数据库连接,又包含高层的业务代码,甚至还包含对 Web 服务的处理。

提示部分

  • 一个应用程序列表的有用程度与它的长度成反比
  • 华而不实的东子中看不中用
  • 键盘输入总比导航快
  • 首选键盘而非鼠标
  • 花点时间来学习你手边所有隐藏的快捷键
  • 环境切换会消耗时间
  • 成批复制要比反复多次复制粘贴快
  • 忘记历史就意味着你得再输入一遍
  • 嵌入图形化工具的命令提示符让你鱼与熊掌兼得
  • 在资源管理器中嵌入命令提示符使环境切换更容易
  • 编程时始终有限使用键盘而非鼠标
  • 在上下文中学习 IDE 快捷键,而不要去背长长的列表
  • 当你第二次输入一个复杂结构时,将它做成模板
  • 如果要对多行文本做同样的操作,就应该找出其中的模式,并把它记录为一个宏
  • 在一段文本上执行某个特定操作的次数越多,就越有可能会再次重复它
  • 不要总是重复输入相同的命令
  • 每天花一点点时间来使每一天都更高效
  • 经历越集中,思维越缜密
  • 草堆越大,从中找到一根针就越难
  • 不要文件树,要搜索
  • 在诉诸高级搜索之前,先尝试简单的搜索
  • 有根视图把资源管理器变成了项目管理工具
  • 充分利用内建的机制(例如颜色)来帮助你集中注意力
  • 用链接来创建虚拟的项目管理目录
  • 虚拟桌面可以让原本杂乱无章的一大堆窗口变得整洁
  • 做简单重复的事实在浪费注意力
  • 以创造性的方式解决问题,有助于在将来解决类似的问题
  • 是否应该自动化的关键在于投资回报率和缓解风险
  • 研究性的工作应该放在时间盒里做
  • 对于任何你不自己去构建的东西,只在版本控制中保存一份副本
  • 使用间接机制创建友善的工作空间(workspace)
  • 使用间接机制来保持文件同步
  • 通过复制粘贴来复用是邪恶的,不论你复制粘贴的是什么
  • 利用虚拟平台使项目依赖标准化
  • 不要让对象 - 关系映射工具(O/R 映射器)违反规范原则
  • 通过扩展。开放类(open class),或者部分类(partial class)来为生成的代码增加行为
  • 使用迁移为数据库结构的改动创建可重复的快照
  • 过时的文档比没有文档更糟,因为它会主动误导你
  • 对管理者来说,文档意味着缓解风险
  • 始终保持『活』的文档
  • 任何需要费劲创造的东西,都让它的创造者欲罢不能
  • 白板 + 数码相机强过任何 CASE 工具
  • 尽量生成所有技术文档
  • 永远不要为同一份信息保存两份拷贝(比如代码和描述它的图)
  • 重复是软件开发中最大的阻力
  • 测试代表着软件开发行为中工程式的严谨部分
  • 把注释重构成方法
  • 静态分析工具提供了便宜实惠的验证手段
  • 不要创建全局变量,即使是对象层次的全局变量
  • 如无必要,勿增加复杂度
  • 软件开发首先是一场沟通博弈
  • 致力本质复杂度,去除附属复杂性
  • 关注那些『古老的』软件技术学说
  • 元编程改变了你的语法辞典,给你提供了更多表达自己的方式
  • 重构成组合方法能暴露出隐藏的可复用代码
  • TDD 实践推动组合放方法模式
  • 把所有的实现细节封装在公共方法之外
  • 寻找属于你的完美编辑器,并从里到外去了解它
  • 你可以使用宏来记录所有重复的文本操作
  • 掌握好正则表达式将为我们节省大量经历
  • 如果能批处理,就不要来回做重复的工作
  • 将行为保留在(可测试的)代码中
  • 关注每个小工具的演化
  • 尽量少交复杂税