效率是一个合格程序员逃不过去的话题。最近一周我被开发环境所累,所以痛下决心解决这个问题。粗略的估计了一下环境问题可以占用到一半的工作时间,这是十分低效的,浪费了青春而且消磨了耐心。

解决效率问题的关键就是工具。使用既有的工具和创造合适的工具。很多人忽视工具的力量,尤其是一些"勤快"的人,他们不厌其烦的做一些重复的操作,过着"充实"的生活,用加班和努力来振奋自己。唉。。我毕竟还是个懒人。在做前端开发时,对工具的需求不强烈,还没有到影响效率的程度:一个好用顺手的IDE,一个不错的notebook,That's all。然而,最近接触的后台开发,尤其是一些运维的工作(坑爹的自运维!)让我认识到是时候鸟枪换炮。

终端配置

后台开发最最频繁的操作就是:打开终端,ssh,输入密码,传文件,断网,重新连接,again。更可能需要打开N个终端同时操作,于是整个过程重复N次。更可恶的是,由于公司的安全机制,期间要输入N个密码(先连接relay,在登录开发机),这些密码还有动态Pin,需要1分钟一更新。。。于是,不小心断个网,痛苦开始了。

配置SSH复用

第一步是纠结打开多个终端,需要重新连接多次的问题。没想到有这种黑科技:SHH会话复用。简单的原理是,第一次连接ssh时会自动生成一个本地socket文件(位于~/.ssh目录下),下次ssh连接同样的地址时(有时间限制,好像是4个小时),直接使用这个socket,复用之前的ssh连接。成功解决打开多个终端要重复输入多次pin码问题

配置,修改.ssh/config文件

host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
ControlPersist yes

终端工具iTerm2

终端工具,我一直使用的是iterm,这个是Mac上比较成熟的方案,然而并没有认真配置过。很多时候我们从中继relay连接开发机,需要输入静态密码,这种情况下,我们往往会不厌其烦,尤其是有多台开发机时,往往很麻烦。在公司内网看到SecureCRT有类似的配置,可以实现

于是有同学把它配置成自动连接中继,再自动连接开发机,自动输入密码。于是我开始寻求Iterm上面的方案,得知了Iterm的Profile,以及它的Triggers的功能。我们可以给每个开发机配置对应的Profile并设置快捷键。于是我们只要按下快捷键,iterm会自动调用相应的profile打开终端,按照我们的配置一步步连接服务器。参考下图的配置

同时,iTerm的选择复制特性和一些常用快捷键对于开发效率的提升也有很大帮助。如:光标快速移动,清除单行等。

选择Shell:ZSH

这个zsh,是很久以前被池老师安利的,用来代替shell。由于zsh本身的配置十分复杂,因此结合最佳实践oh-my-zsh这个项目来提供一个默认的配置。它的命令行自动补全用起来很爽,还支持强大插件功能。由于它没有成为我的瓶颈,整体的认识还很肤浅,还没想去折腾它。当然它还有一些坑,比如:通配符*的处理问题。可以说ZSH是终端用户的标配。

神器:Tmux

久闻Tmux大名,遗憾的是以前一直没有场景使用它。现在终于有了用武之地:终端分屏后台会话保持。让我们来体验一下没有Tmux的场景:

Tmux可以用很优雅的解决上面提到的来两个基本问题:

Tmux的具体使用可以参考网络上很多优秀文章(详解参考文章),学习曲线的难点在于熟练使用它定义的快捷键和形成自己的使用习惯。Tmux的配置也有很大的学问(类似于Vim,ZSH之流),同样建议使用Tmux的配置的最佳实践:oh my tmux,漂亮的主题与良好的配置是居家旅行必备。这里提几个注意点:

Vim Tmux iTerm2 剪贴板互通

由于Vim、Tmux与外部iTerm2(操作系统的剪贴板)有各自的/at剪贴板Buffer。我们实际使用中有大量的复制粘贴操作。他们之间的互通就很有必要。

代码片段管理

代码片段管理是知识管理的一个分支,他们的基本思想相同,但是,写代码作为工作的主要内容,值得把它拿出来单独一说。代码碎片化是我在后台运维开发中遇到问题之一。在前端开发中往往忽视代码片段的管理,理由很简单:当我们需要一个功能时,往往能回忆起来在某个界面中用到相关的逻辑,于是按图索骥便能很快定位,最多需要在多个工程中切换寻找。然而在后台开发中很多代码是分散在各个角落中的,例如:在某个维护的脚本中使用了数据遍历的功能,在某个工程中也使用。由于没有很强的场景感,下次使用时往往很难回忆出什么时候用过。

代码片段管理的目的是常用功能形成积累,以后可以快速复用之前的成果。它需要两个东西:习惯工具。务虚上,习惯要求我们对常用的代码有收集与整理的意识,这似乎是最艰难的一步。首先是收集,将常用的代码放置到一个固定的地方(比如Note或者Stickies上)。然后最重要的是整理,把这些片段抽象成一个具有逻辑的关系,方便以后使用。谨记:代码片段管理的核心目的是复用,收而不用毫无意义。在实际的执行中,我一直在寻找一款好用的工具,在Mac端我找到了**SnippetLab**这个软件。它是一个类似Quiver的知识管理软件,加上了代码片段特殊的功能,如代码高亮,快速查询,快捷复制粘贴。基本满足代码片段管理的需求。

知识管理

知识管理本质上是一种抽象的能力。这方面我一直在路上,简单谈谈我对知识管理的几个阶段。

开发工具

开发工具上,不得不提文本编辑器与IDE。毕竟,我们80%的时间是和他们渡过的😂。他们是最基本的工具,大家应该都知道,可以直接跳过。

文本编辑器

Vim

神之编辑器,完美地在终端环境中使用,可以配置成IDE(结合各种插件和Tmux,很久以前折腾过)。但是我这边只是把它当做最简单的终端文本编辑器使用,通过简单的配置支持代码高亮。方便在终端上临时修改代码。基本要求是熟练使用常用的几个Mode和快捷键。其他高级功能我是作为瞻仰用的。

Sublime Text

这个是在UI环境中使用最多的编辑器。作为神器之一,同样支持各种插件、代码高亮基本功能。通过这些插件满足一些常见的需求:如代码格式化,Json美化等。作为工具,我还是按需使用的,当某种功能影响到效率时,会寻求插件来解决,不会刻意追求酷炫。

IDE

Eclipse

已经放弃,放入回收站。曾经的主力编辑器,现在被intellij idea全面代替。

Jetbrains 全家桶(Intellij家族)

强烈建议直接使用这个系列的产品(看到很多同学还在用Eclipse),包括Intellij Idea、PyCharm、Android Studio、WebStrom。他们具有相同的快捷键和逻辑方式,最智能的代码补全,极大的提高生产率。其中intellij idea可以安装各种插件满足(相对)小众需求(如Node插件,Scala插件),依然能良好的工作。当然,它们都具有强大的Plugin商店,满足各种奇葩需求。总之。。。没有他,感觉没法写代码了。几个要点提一下:

其他

数据传输工具

如果没有,请创造工具

创造工具是对问题的抽象。当我们遇到那些重复性或例行性工作,尝试着把问题总结提炼,找到共性,创造工具,把自己从机械性的工作中解放出来。即使是抢个月饼,会创造并使用工具的人如同在降维攻击--你们这些凡人。于是,务必熟练掌握至少一种自己创造工具的方法(我选择了Python),在不断尝试中磨砺自己创造的技能。

工具栈

由思到行,我们会形成自己的工具栈。找出那些顺手的工具,形成一直习惯,渐渐养成一种思维方式,甚至是直觉。把那些好用的东西放入自己的工具箱,并不限于计算机中的程序。推而广之,它可能是一个思维的定式,一套分析问题的方法论,也有可能是一个好用的算法(像机器学习)亦或是对一类问题的最佳实践。我们不断尝试用工具解决问题,与此同时,迭代升级自己的工具栈,这似乎是一种无法轻易复制的资本。

参考文章