0%

工具与效率

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

解决效率问题的关键就是工具。使用既有的工具和创造合适的工具。很多人忽视工具的力量,尤其是一些”勤快”的人,他们不厌其烦的做一些重复的操作,过着”充实”的生活,用加班和努力来振奋自己。唉。。我毕竟还是个懒人。在做前端开发时,对工具的需求不强烈,还没有到影响效率的程度:一个好用顺手的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文件

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

终端工具iTerm2

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

  • 打开终端时,自动SSH某个地址。
  • 终端出现某个字符时(Expect),自动输入一些内容。

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

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

选择Shell:ZSH

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

神器:Tmux

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

  • 终端分屏:其实这个问题还好,iTerm自带分屏的功能(支持左右,上下,保存分屏),但是它的本质是打开多个终端,连接多个ssh。如果配置了上面的SSH复用,维持多个连接还不是很麻烦。
  • 后台会话保持:这个功能对于本地开发而言意义不大,但是对于连接远程服务器却很重要。我们经常遇到在远程服务器上运行一个cmd需要很长时间,此时如果连接断开/终端关闭,命令则自动的终止。下次执行又得从头开始。我们自然而然会思考这个问题:Server依然在运行,为什么终端执行的任务会因为终端断开而自动结束呢?其实本质上是job收到了hangup信号而结束了。因此常用的解决方案是:nohup cmd & 来吧命令放后台并且忽略hangup信号(当然也有其他方案)。由此一个痛点是,这样子太麻烦的,我们还经常忘记使用nohup,多么希望他是shell的默认设置。

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

  • 终端复用分屏:正如Tmux的名字的含义 terminal multiplexer。它是一个终端的复用分屏工具。所谓复用是指在一个终端中(常常是一个ssh连接)打开多个可输入的shell。并且支持多种粒度的分屏(Session、Window、Panel)。此外,我们还可以配合快捷键使用,大大提高了操作的效率。
  • 会话自动保持:Tmux本质上是一个Linux后台服务,运行在远程主机上。因此在Tmux中启动的所有job,即使终端退出也不会有任何问题。同时下次重新登录Tmux可以attach所有你在运行的job的标准输出到屏幕上,实现会话的完美恢复。此外,Tmux会记住每个Session中你打开的Window和Panel,实现他们的自动恢复。真正地做到了一个命令恢复所有现场的特性。

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

  • tmux有自己的剪切板缓冲区,因此需要一些配置才能实现剪切板互通,oh my tmux中有方案。
  • tmux支持鼠标操作:鼠标选择复制(与iTerm的选择复制冲突,一个小技巧是按下option键再拖动鼠标是使用iTerm的选择复制功能)。此外,还可以用鼠标调整Panel的大小、切换Window。注意:oh my tmux中默认没有开启此配置
  • tmux默认的绑定前缀是C+b,oh my tmux加入了C+a,与iTerm的光标移动冲突,可以根据自己的需求调整。
  • oh my tmux 的炫酷主题需要终端(本地,不是远程主机)安装字体并在配置文件中开启。请根据需求考虑(强烈推荐!)。

Vim Tmux iTerm2 剪贴板互通

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

  • 参考这篇文章,可以简单地实现Tmux与iTerm(Mac)剪贴板的互通。使用的是iTerm2的最新特性。足以解决大部分需求。
  • 远程服务器的Vim的剪贴板与似乎无法直接与本地剪切板互通。可能也有办法实现
  • 远程服务器vim与tmux之间的剪贴板怎么互通呢?似乎没有简单方案,知道的同学,希望告诉我。

代码片段管理

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

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

知识管理

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

  • 初级阶段:知识收集。最简单的表现是浏览器的收藏夹,对不错的文章保存下来,对遇到的,学习的知识一股脑地放入笔记软件(如为知笔记)。
  • 反思阶段:大量的收集本质上没有提高知识连接与运用能力,这种收集停留在简单粗暴的收藏与浏览。这个阶段加强了对知识的整理,特点是形成各种笔记。对某个方面的只是形成一些笔记,记录学习过程。
  • 当前阶段:各种笔记的特点是质量不高,作为自己学习的副产物,甚至在记录后很少去看一下。这让我思考记录的目的是什么?提高自己,温故而知新。于是我开始写博客,作为一种总结的手段,希望能每一篇言之有物,不是自己学习的简单记录,而是在总结的过程中发现新的知识,有提升,以后细细品来会有改进的想法。而以前笔记的功能用思维导图(推荐MindNode)代替,往往会附在博客中。
  • 以后:遵循知识管理的目的提高知识连接与运用能力,希望改进一些方式。第一步使用类似Pocket的软件作为ReaderAfter工具,做初步收藏,避免藏而不读的窘境。第二步对阅读记录,使用Diigo做网页笔记,用简洁的笔记软件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商店,满足各种奇葩需求。总之。。。没有他,感觉没法写代码了。几个要点提一下:

  • 熟练掌握快捷键,形成肌肉记忆。可以统计自己最常用的操作,尤其是代码补全,代码快速查找定位,重构相关快捷键。
  • 了解强大的Live Template功能,有事半功倍的效果。
  • 善用重构功能,提升代码质量
  • 使用插件提高效率

其他

数据传输工具

  • samba:这个是最常用的文件夹共享方式,可以远程访问/挂载文件夹,以非常直观的方式共享文件。缺点是在网络环境不好的情况下,速度较慢,同步是一件很痛苦的事情。
  • rsync:文件夹同步工具,使用rsync算法比较diff,减少数据传输,推荐用来同步代码目录
  • http服务器:使用python -m SimpleHTTPServer 来启动一个http服务器,是远程传输文件最简单的方式。接收方使用wget addr:port/file 来获取文件。如果要传输目录,加上一些参数wget -r -nH -np -R index.html* addr:port/dir,避免产生index.html文件。
  • ftp服务器:最传统,也是最常用的方案。需要搭建ftp服务器,然后使用wget获取文件。

如果没有,请创造工具

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

工具栈

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

参考文章

欢迎关注我的其它发布渠道