有些提示和诀窍可应用于软件开发的所有层面,有些想法几乎是公理,有些过程实际上普遍适用。但是,人们几乎没有为这些途径建立这样的文档,你很可能会发现,它们作为零散的段落写在关于设计、项目管理或编码的讨论中。书中后面的章节就是对于这些通用法则的归纳总结,看完觉得自己还有很多需要学习的,所以在此挑选部分记录下来。
DRY – Don’t Repeat Yourself 不要重复你自己
重复是怎样发生的呢?我们所见到的大多数重复都可归入下列范畴:
l 强加的重复(imposed duplication)。开发者觉得他们无可选择——环境似乎要求重复。
l 无意的重复(inadvertent duplication)。开发者没有意识到他们在重复信息。
l 无耐性的重复(impatient duplication)。开发者偷懒,他们重复,因为那样似乎更容易。
l 开发者之间的重复(interdeveloper duplication)。同一团队(或不同团队)的几个人重复了同样的信息。
所以我们要让复用变得容易,我们所要做的是营造一种环境,在其中要找到并复用已有的东西,比自己编写更容易。如果不容易,大家就不会去复用。而如果不进行复用,你们就会有重复知识的风险。
【我的看法】:这其实很难做到,所以在《重构》里面有提到Rule of three,“三次原则”,也就是用到三次以上的地方再去想办法抽象,避免重复,同时也稍省事些。
正交性
“正交性”是从几何学中借来的术语。如果两条直线相交成直角,它们就是正交的,比如坐标轴。在计算技术中,该术语用于表示某种不相依赖性或是解耦性。如果两个或更多事物中的一个发生变化,不会影响其他事物,这些事物就是正交的。比如你可以改动界面,而不影响数据库;更换数据库,而不用改动界面。
【我的看法】:在软件中,最好是尽量往正交性靠拢,即使在大工程中不那么容易做到。我想要说的是在工作生活中,我们需要不停的跨部门,跨领域,需要极力避免这种不相交,因为人是复杂的,需要从不同角度来看问题。
可撤销性
有句话说“如果某个想法是你唯一的想法,再没有什么比这更危险的事情了。”
如果你严重依赖某一事实,你几乎可以确定它将会变化,因为需求始终是变化的。错误在于假定需求是浇铸在石头上的——同时还在于没有为可能出现的意外事件做准备。 所以要把需求视为是写在沙滩上的,而不要把它们刻在石头上。大浪随时可能到来,把它们抹去。
【我的看法】:赌徒总是会输,因为赌徒只有一条路。
领域语言
维特根斯坦发出过一个简单又惊人的事实,即“语言的界限就是一个人的世界的界限”。
计算机语言会影响你思考问题的方式,以及你看待交流的方式。每种语言都含有一系列特性——比如静态类型与动态类型,面向过程与面向对象等等——所有这些特性都在提示或遮蔽特定的解决方案。头脑里想着Lisp设计的解决方案将会产生与基于C风格的思考方式而设计的解决方案不同的结果,反之亦然。
【我的看法】:语言决定思维方式已经有很多研究验证了,我们是要小心我们的语言表述了。
估算
所有的估算都以问题的模型为基础。首先是理解提问内容,然后基于此建立系统框架,接着细分组件,再给每个组件指定值,最后就可以计算出答案。一个基本的估算诀窍,它总能给出好的答案:去问已经做过这件事情的人。那多准才算准确呢,其实选择能反映你想要传达的精确度的单位就可以表达了。比如,1~15天,按天估,3~8周,按周估,8~30周,按月估,30周以上的就需要再努力思考一下了。最重要的是要追踪记录,如果这次错了,不要只是耸耸肩走开,找出事情为何与你的猜想不同的原因。不管原因是什么,花一点时间揭开所发生的事情,下一次估算就会更好。
【我的看法】:第一次的时候会怕估算,因为工作量估多了会令人觉得自己能力差,估少了又怕不能按时完成,不必怕,去问老手。另外对于时间管理,这也是很好的方法。
工具
工具放大你的才干。你的工具越好,你越是能更好地掌握它们的用法,你的生产力就越高。
1. 命令操作
Windows上主要是图形操作,Linux强大的地方是命令操作,GUI的好处是所见即所得,缺点是所见即全部所得,习惯了图形操作的,强烈建议转到命令操作,命令操作的威力就在于自动化,这是图形操作无法比拟的。
2. 编辑器
最好是精通一种编辑器,并将其用于所有编辑任务:代码、文档、备忘录、系统管理,等等。如果不坚持使用一种编辑器,你就可能会面临现代的巴别塔大混乱。
好的编辑器特性:
l 可配置。编辑器的所有方面都应该能按你的偏好(preference)配置,包括字体、颜色、窗口尺寸以及键击绑定(什么键执行什么命令)。对于常见的编辑操作,与鼠标或菜单驱动的命令相比,只使用键击效率更高,因为你的手无须离开键盘。
l 可扩展。编辑器不应该只因为出现了新的编程语言就变得过时。它应该能集成你在使用的任何编译器环境。
l 可编程。你应该能对编辑器编程,让它执行复杂的、多步骤的任务。可以通过宏或内建的脚本编程语言(例如,Emacs使用了Lisp的一个变种)进行这样的编程。
3. 版本控制
进步远非由变化组成,而是取决于好记性。不能记住过去的人,被判重复过去。
总是使用版本控制器。
【我的看法】:学会了这三大利器,就可以看到效率的显著提升。
让 计 算 机 去 做 重 复 、 庸 常 的 事 情 一 一 它 会 做 得 比 我 们 更 好。我 们 有 更 重 要 、 更 困 难 的 事 情 要。
(完)