程序员修炼之道——第三章 基本工具

基本工具

  1. 纯文本的威力:文本比二进制好
  2. shell游戏: 学好shell 和linux 命令行的使用必不可少。
  3. 强力编辑:选一款好的编辑器,减少用鼠标的时间。
  4. 源码控制
  5. 调试
  6. 文本操纵
  7. 代码生成器

纯文本的威力

作为注重实效的程序员,我们基本材料不是木头,不是铁,而是知识,我们搜集需求,将其变为知识,随后在我们的设计、实现、测试、以及文档中表达这些知识而我们相信,持久地存储知识的最佳格式是纯文本,通过纯文本,我们给予了自己既能以手工方式,也能以程序方式操纵知识的能力——实际上可以随意使用每一个工具

什么是纯文本

纯文本由可打印字符组成,人可以直接阅读和理解其形式。例如,尽管下面的片段由可打印字符组成,但是它却是无意义的:
Field19456498abe
阅读者不知道467abe的含义是什么更好的选择是:
DrawingType=UMLActivityDrawing
纯文本并非意味着文本是无结构的;XML,HTML都是有良好定义的结构的纯文本的好例子。通过纯文本,你可以做你通过某种二进制格式所能做的某件事情,其中包括版本管理。
与直接的二进制编码相比,纯文本所处的层面往往更高;前者通常直接源自实现假定你想要存储叫做uses_menus的属性,其值可能是TRUE,也可能是FALSE。使用纯文本,你可以表示为:
myprop.uses_menus=FALSE
把他与0010010101110101 对比一下。大多数二进制人看不懂。

缺点

使用纯文本有两个主要的缺点:1.与压缩的二进制相比,存储纯文本所需空间更多,2. 要解释及处理纯文本文件,计算上的代价可能更昂贵。
取决于你的应用,这两种情况下,用纯文本存储关于原始数据的元数据也可能是可以接受的。
有些开发者会担心,用纯文本存储元数据,是在把这些数据暴漏给系统的用户,这种担心放错了地方
与纯文本项比,二进制数据也许更晦涩难懂,但却并非更安全。如果你担心用户看到密码,就进行了加密,如果你不想让他们改变配置参数,就在文件中包含所有参数值得安全哈希值作为校验和。

文本的威力

既然更大和更慢不是用户最想要的特征,为什么还要使用纯文本?好处是什么?

  • 保证不过时
  • 杠杆作用
  • 更易于测试

保证不过时
人能够阅读的数据形式,以及自描述的数据,将比所有其他的数据形式和创建他们的应用都活得更长久。只要数据还在,你就有机会使用它——也许是在原来创建它的应用已经不存在很久以后,只需要部分的了解整个格式的所有细节。
考虑一个来自某遗留系统的数据文件,关于原来创建它的应用已经不存在很久以后,只需要部分的了解其格式,你必须了解整个格式的所有细节。
杠杆作用
实际上,计算世界中的每一样工具,从源码管理系统到编译器环境,再到编辑器及独立的过滤器,都能在纯文本上进行操作。
例如,假定你要对一个大型应用进行部署产品,该应用具有复杂的针对具体现场的配置文件。如果该文件是纯文本的,你可以把它置于源码控制系统的管理之下,这样你就可以自动保存所有改动的历史。像diff和fc这样的文件比较工具允许你查看做了哪些改动,而sum允许生成校验和,用以监视文件是否受到了偶然的修改。
更易于测试
如果你用纯文本创建用于驱动系统测试的合成数据,那么新增、更新、或是修改测试数据就是一件简单的事,而且无需为此创建任何特殊的工具。

最小公分母

即使在未来,基于XML的智能代理已能自治地穿越混乱、危险的Internet、自行协商数据交换,无处不在的纯文本也仍然会存在。事实上,在异种环境中,纯文本的优点比其他所有缺点都重要。你需要确保所有各方能够使用公共标准进行通信。纯文本就是那个标准。

shell 游戏

每个木匠都需要好用、坚固、可靠的工作台,用以在加工工件时把工工件时把工件放置在方便的高度上。工作台成为木工房的中心,随着工件的成形,木匠会一次次的回到工作台的近旁。
对于操纵文本文件的程序员,工作台就是命令shell。在shell提示下,你可以调用你的全套工具,并使用管道、以及这些工具原来的开发者从未想过的方式把它们组合在一起。在shell下,你可以启动应用、调试器、浏览器、编辑器以及各种应用程序。你可以搜索文件、查询系统状态、过滤输出。通过对shell进行编程,你可以构建复杂的宏命令,用来完成你经常进行的活动。
对于在GUI界面和集成开发环境(IDE)上成长起来的程序员。这似乎显得很极端。毕竟用鼠标指指点点,你同样可以把这些事情做好吗?
简单的回答:”不能“。GUI界面很奇妙,对于某些简单的操作,它们也可能更快、更方便。但是你使用GUI完成所有的工作,你就会错过你的环境某些能力,你将无法使用常见任务自动化,或是利用各种可能的工具的全部力量。同时你也将无法组合你的各种工具,创建定制的宏工具。GUI的好处是WYSIWYG——所见即所得。缺点是WYSIAYG——所见即全部所得。
作为注重实效的程序员,你不断地想要执行特别的操作——GUI可能不支持的操作。当你想要快速地组合一些命令,以完成一次查询或某种其他任务时,命令行要更为适宜。

shell实用程序与Windows系统

尽管随着Windows系统提供的命令shell在逐步改进,Windows命令行实用程序仍然不如对应的Unix实用程序。但是,并非一切都无可挽回。

强力编辑

先前说过,工具是手的延伸。噢,与任何其他软件工具相比,这都更适合用于编辑器。你需要能尽可能不费力气地操纵文本,因为文本是编程的基本原材料。让我们来看些能帮助你最大限度地利用编辑环境的一些常见特性和功能。

一种编辑器

我们认为你最好是精通一种编辑器,并将其用于所有编辑任务:代码、文档、备忘录、系统管理,等等。如果不坚持使用一种编辑器,你就可能会面临现代的巴别塔大混乱。你可能必须使用某种语言的IDE内建的编辑器进行编码,用”all-in-one“办公软件编辑文档,或是用另一种内建的编辑器发送电子邮件。甚至你用于在shell中编辑命令行的键击都有可能不同。如果你在某种环境中有不同的编辑约定和命令,要精通这些环境中的任何一种都会很困难。
你需要的是精通。只是依次输入,并使用鼠标进行剪贴是不够的。那样,在你的手中有了一个强大的编辑器,你却无法发挥出它的效能。敲击十次后退键,没有一次快捷键来的高效。
选择一种编辑器,彻底了解它,并将其用于所有的编辑任务。如果你用一种编辑器(或一组键绑定)进行所有的文本编辑活动,你就不必停下来思考怎样完成文本操作:必需的键击将成为本能反应。编辑器将成为你双手的延伸;键会在滑过文本和思想时歌唱起来,这就是我们的目标。
确保你选择的编辑器能在你使用的所有平台使用。Emacs、vi、vim 等可以在多个平台使用。

编辑器特性

除了你认为特别有用、使用时特别舒适的特性之外,还有一些基本能力,我们认为每个像样的编辑器都应该具备。

  • 可配置。编辑器的所有方面都应该能按你的偏好配置,包括字体、颜色、窗口尺寸以及键击绑定相比,只有用键击的效率最高,因为你的手无需离开键盘。
  • 可扩展。编辑器不应该只是因为出现了新的编程语言就变得过时。它应该能集成在你在使用的任何编译环境。你应该能把任何新语言或者文本格式等各种细微差别教给它
  • 可编程。你应该对编辑器编程,让它执行复杂的、多步骤的任务。可以通过宏或者内建的脚本编程语言进行这样的编程。
  • 此外编辑器应该支持特定编程语言的特性,比如:
  • 语法凸显
  • 自动完成
  • 自动缩进
  • 初始代码或文档样板
  • 与帮助系统挂接
  • 类IDE特性 编译、调试、等等。

生产率

我们遇到的用Windows notepad 编辑源码的人数量惊人。这就像是把茶匙当作铁锹——只是敲键和使用基本的基于鼠标的剪贴是不够的
有什么样的事情需要你做,你却无法以这样的方式做到呢?
嗯,让我们以光标移动的例子作为开始。与重复击键、一个字符一个字符或者一行移动相比,按一次键、就以词、行、块或函数为单位移动光标,效率要更高。
有些编辑器能帮助你使常用操作流水线化。例如当你创建特定语言的新文件时,编辑器可以为你提供模板。其中也包括:

  • 填好的类名或者模板
  • 你的姓名和版权
  • 该语言中的各种构造体的骨架
    自动缩进是另一种有用的特性。你不必使用空格或tab进行手工缩进,编辑器会自动在适当的时候缩进。

源码控制

代码生成器

被动代码生成器

被动代码生成器减少敲键次数。它本质上是参数化模板,根据一组数输入生成给定的输出形式。结果一经产生,就变成了项目中有充分资格的源文件;它将像任何其他文件一样被编辑、编译、置于源码控制之下。其来源将被忘记。
被动代码生成器有许多用途:

  • 创建新的源文件。被动代码生成器可以生成模板、源码控制指示、版本说明以及项目中每个新文件的标准
  • 注释块。我们设置我们的编辑器。让它在我们每次创建新文件时做出这样的工作:编辑新的Java程序,新的编辑器缓冲区将自动包含注释块、包指示以及已经填好的类声明。
  • 在编辑语言之间进行一次性切换。
  • 生成查找表以及其他在运行时计算很昂贵的资源。

主动代码生成器

被动代码生成器只是一种便利手段,如果你想遵循DRY原则,它们的“表亲”主动代码生成器却是必需品。通过主动代码生成器,你可以取某项知识的一种表示形式,将其转换为你的应用需要的所有形式。这不是重复,因为衍生出的形式可以用过就扔,并且是由代码生成的。
无论何时你发现自己设法让两种完全不同的环境一起工作,你都应该考虑使用主动代码生成器。
或许你在开发数据库应用。这里,你在处理两种环境——数据库和你用来访问它的编程语言。你有一个schema,你需要定义低级的结构,反映特定的数据库表的布局。你当然可以直接对其进行编码,但这违反了DRY原则:schema的知识就会在两个地方表示。当schema变化时,你需要记住改变相应的代码。如果某一列从表中被移走,而你的代码库没有改变,甚至有可能连编译错误也没有。只有等你的测试开始失败时(或是用户打电话过来),你才会发现。
另一种办法是使用主动代码生成器,读取schema,使用它生成结构的源码。现在,无论何时schema发生变化,用于访问它的代码也会自动变化。如果某一列被移走,那么它在结构中相应的字段也会消失,任何使用该列的更高级的代码将无法通过编译。
你在编译时就能抓住错误,不用等投入实际运行时。当然,只有在你让代码生成成为构建过程自身的一部分情况下,这个方案才能工作。

代码生成器不一定要很复杂

所有这些关于“主动这个”和“被动那个”的谈论可能给你留下这样的印象:带啊生成器是复杂的东西。它们不一定要很复杂。最复杂的部分通常是负责分析输入文件的解析器。让输入格式保持简单,代码生成器就会变得很简单。实际的代码生成基本上是print语句。

代码生成器不一定要生成代码

你可以用代码生成器生成任何东西:HTML、XML、纯文本——可能成为你的项目中别处输入的任何文本。

发布了144 篇原创文章 · 获赞 3 · 访问量 9513

猜你喜欢

转载自blog.csdn.net/NumberOneStudent/article/details/103827588