微信号:infoqchina

介绍:有内容的技术社区媒体

程序员的工具

2014-03-12 18:25 InfoQ

 编码工具

编码本质上来说是一种以键盘输入操作为主的工作。因此,输入代码速度的快慢很大程度上影响了一名程序员的效率。我是通过以下手段来提高输入代码速度的。

 

键盘布局

很多程序员都不知道我们使用的键盘布局(就是指字母键,数字键和符号键的所处的位置)并非只有一种。绝大部分人使用的是标准键盘布局,也被称为QWERT键盘。但是很遗憾,这种布局的设计初衷其实并不是为了提高打字速度的。

 

我大概从一年多前开始学习使用一种叫做“Dvorak”的键盘布局。使用这种布局输入同样一段文字时,手指在键盘上的移动距离要比标准布局减少至少50%。在转到Dvorak布局之前,我使用QWERT键盘有20多年了,但是我实际只花了大概一个多月的时间来完成键盘布局的切换。当然,在这一个多月的时间里,我每晚都坚持练习打字一小时左右。

 

代码编辑方式

相信很多程序员都听说过“Vi”这种文本编辑方式吧。可以说“Vi”就是为了编码而设计的,比起使用记事本那样的编辑方式要高效很多。我在所有的开发环境中(如Intelliji和Sublime)都会安装Vim(Vi improved)的插件。Vim可以快速定位,查找和修改代码,另外还有很多非常强大的编辑功能。

 

开发环境和快捷键

编码时,我会尽可能使用快捷键,尽量不用鼠标。

 

常用的开发环境一般对快捷键的支持都不错,除了预定义的快捷键之外,还可以自定义快捷键。另外,在Eclipse和Intelliji中有如mousefeed和key promoter这样的插件,他们会在程序员没有使用快捷键的时候给出提示。

 

我鼓励程序员根据习惯来设置自己顺手的快捷键,不要拘泥于开发环境预定义的那些。

 

敏捷工程实践相关的工具

上面提到的编码工具对效率的提升都很直接。下面我将要提到的工具,和程序员如何来写代码和设计代码有关。

 

单元测试框架

测试驱动开发(TDD)是我推崇的编程和设计方法,可以帮助程序员写出简洁和设计合理的代码。而TDD中产生的单元测试,通常是用某个单元测试框架(UT框架)来运行的。UT框架这个工具并不是TDD所必须的,因为编写和运行测试本身并不复杂。不过使用了UT框架之后,可以简化单元测试编写,运行和组织,对于测试的维护和管理还是有帮助的。

 

我使用的UT框架包括JUnit(Java),Scala-test(Scala),RSpec(Ruby)等等。有些UT框架提供了一些强大的功能,在使用这些功能时要小心,因为用得不好可能会影响单元测试的可读性。

 

重构工具

重构指的是在不改变代码行为的前提下改善代码的设计,它是测试驱动开发中的重要一环。以Java为例,Eclipse和Intelliji都提供了很好的重构工具支持,可以大大减少重构的工作量。不过,在使用重构工具之前,程序员应该很清楚为什么要做某个重构(如发现了代码臭味),以及要使用哪种重构方法。我建议每个初学重构的程序员一开始不要使用工具重构,而是手工重构代码。

 

由于代码的复杂性,有时即使是看上去很安全的重构(如重命名),因为重构工具还不够智能(不同开发环境的表现也不同),还是可能出现修改之后的代码发生了行为上的变化。因此,即使使用工具来重构,也需要有测试来确保代码原有的行为没有发生变化。切不可因为使用了重构工具,就在不写测试的情况下面对代码进行修改。

 

Mock框架

Mock框架指的是在单元测试中使用的那些用来隔离被测代码依赖的工具。还是以Java为例,Mock框架其实很多,如EasyMock,JMock,Mockito等等。和UT框架及重构工具类似,使用Mock框架可以简化在单元测试中隔离依赖的工作,避免手工写隔离代码的麻烦。同样和重构工具类似,我建议初学Mock的程序员先不要使用这类框架,而是手工来隔离被测代码的依赖并做相应的验证。

 

有些Mock框架(如PowerMock)过于强大(比如可以隔离一些静态或final方法),我并不推荐使用。

 

自动运行单元测试的工具

我最早是不用这种工具的,因为通过手动运行单元测试(使用快捷键)体验到测试驱动开发中的测试失败和通过,是实践和练习TDD非常重要的一步。后来习惯TDD之后,我尝试了一个叫infinitest的工具(Eclipse插件),可以在保存代码的时候自动运行受影响的单元测试。一开始感觉不错,但是我试用了一段时间之后,发现这个工具运行测试不太稳定,经常莫名其妙的出问题,而且有时还会运行很多不相关的测试。

 

其实,在Eclipse和Intelliji中可以定义一个重复运行上一次单元测试的快捷键。只要恰当的设置,也可以做到一键保存代码并运行测试的效果。

小结

首先,使用这些工具前要明白相应实践的目的和原理。其次,即便工具可以提高效率,以手工的方式来实现代码仍然是一种很好的学习方法。最后,现在很多工具都存在过度开发的问题,通常是因为忽略了它们自身所服务领域实践或原则的本质目标。

 

编程语言

最后,我想说“编程语言”对程序员来说也是一种“工具”。我觉得讨论编程语言的孰优孰劣没有任何意义。程序员为什么只能学一门语言呢?如果你不会一门编程语言,你就无法理解那种语言解决问题的思维模式。我觉得一个程序员至少要学一门面向对象语言,一门函数式语言,以及一门动态语言。可惜的是,我看到过很多程序员都只会一门编程语言,更有甚者还会鄙视或者拒绝学习其他语言。对于这样程序员,我只想说“虽然你手上有一把榔头,但这不表示世界上所有的东西就都成钉子了”。

 

时至今日,很多语言都在相互学习和渗透。.Net、C++和Java陆续支持Lambda表达式就是一个很好的例子。另外,尝试一下多语言编程,是件非常有趣的事情。说到底,项目或产品开发时,哪种语言解决问题最有效就应该用哪个。

 

总结

程序员的工具远远不止我上面提到的这些。很多开源的技术框架和工具软件,我觉得都应该算进来。好的程序员其实都很“懒”,因为他们总是想着把复杂繁琐的事情变得简单快捷,可以花更少的时间达到同样的效果,所以他们选择了一些“工具”来提高效率。同时,好的程序员也很清楚使用这些工具背后的原因,只会根据需要来选择合适的“工具”,不会“为了工具而工具”。

更多精彩内容,请点击阅读原文。


***********************************
本文来自InfoQ微信公众账号:infoqchina
1、回复“今日新闻”,查看今天更新的新闻;
2、回复“今日英文”,查看今天英文站的更新;
3、回复“文章 +关键词”,搜索关键词相关内容;
4、回复“QCon”,了解QCon大会相关信息;
5、回复“活动”,了解最近InfoQ组织的线下沙龙;
6、回复“架构师”,获取《架构师》下载地址;
7、回复“投稿”,了解投稿和加入编辑团队的流程。
***********************************

 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 2015年过半| 世界那么大,你凭什么去看看? 如何进行前端自动化测试? Ruby链接及操作Hbase 技术奠基人丨JavaScript 基础工具清单 数据你能不能不这么逗逼?