新工作

自打周四到新公司(http://www.61games.cn/)以来就发现几乎所有的服务端同事都要比我厉害,我得很坦诚的承认自己对 Lua/C 没有 Java 那么熟练。从服务器的实现、构建、测试和部署整一个流程就和原来不一样了。虽说 Lua/C 中确实缺乏常用到的自动化构建工具,它确实缺少以至于同事写了大量脚本来完成测试、打包部署工作,但它更加灵活、定制性极高。若是 Java 则仅仅需要若干 Maven 描述文件即可,因为在 Java 中大量的过程都是标准化的,就连目录结构是所有人一致的,这既带来统一的方便之处和学习成本的降低,不过弊病在于一切都像拜佛或者仪式一般要求每一步都一致。所以孟岩对 Java 和 C 语言做了如下总结,非常之有道理。

“Java在意识形态上是要面向企业应用软件的开发,所以特别强调架构,强调设计模式,强调标准,强调规规矩矩,强调高姿态,强调一种华贵的宫廷气质。在C中,你吃饭就是吃饭,捧起碗来喝酒,放下筷子骂娘,甩开膀子抓肉,撸起袖子抹油。而在Java中,你经常为了要干某件事,先new一个对象,然后以这个对象为参数new另一个对象,如此这般重复n遍,得到真正需要的对象,最后就是为了调用那个对象的一个方法,就好比吃饭时焚香洗面,漱口净手,战战兢兢,毕恭毕敬。”

这便是我在转语言方向时遇到的最大的问题,不管是 Lua 还是 C 中都没有一种常规的书写方式,没有那么多 Controller、Action、Demain、Service 等等在 Java 中必备的划分。加上毕竟对于 C/Lua 还停留在书本理解的阶段,所以写起来没有那么灵活,还没有达到“深入一种语言去编程”形成自己的一套编码约定、标准和改进措施。

除去上面在语言方面的转变之外,还在于对相应的编程工具了解的缺乏。之前我都是完全基于 Windows 或者 OSX 或者 Ubuntu 来开发的,它们各有各自的好处和缺点,这次结合了 Windows 和 Centos 来做开发环境。遇到的第一个问题便是在哪一端开发,若是在 Windows 上开发可以选择 Intellij IDEA + Lua 插件来作为 IDE,用 Samba 将写好的代码同步到 Linux 文件系统中,从而可以方便在其上运行调试。好处是容易开发,坏处则是 IDE 很重且 Samba 写入比较慢,对乌龟 svn 也不友好。另外一种方法是直接在 Centos 下使用 Vim 作为集成开发环境,但难度更大,因为需要自己去构建,好在 spf13 帮助解决了大量问题。而 Vim 除了基本命令之外还有许多东西值得学习,有大量的文档需要看。这种方法的好处是充分利用编辑神器 Vim 和 Linux 命令行,也省去了同步的工作,坏处则是学习成本较高。好在这两种方式都有同事去使用,因而都可以认为是经过检验为可用的方案。最终我决定使用第二种,理由很简单:为了学习更多的东西。不仅仅如此,我还有一个更大的目标就是尽可能脱离鼠标,将绝大部分的工作都在主键盘上完成。恰好 Chrome 中有一个 vimium 插件可以帮助完全用命令就可以完成浏览器操作。

以下是一些简单的命令:

  • j/k 页面向下/上滑动
  • J/K 向左/右切换标签
  • gi 将光标定位到输入框
  • t 打开新标签页
  • x 关闭当前标签页
  • X 回复关闭的标签页
  • H/L 回退/前进历史页面
  • / 查找字符
  • B 搜索书签并在新的标签打开
  • ? 显示命令列表

这个插件是 Vim 命令在 Chrome 上的衍生物,利用这些简单的命令可以完成大部分浏览器操作,减少了双手在键盘和鼠标之间移动的时间,提高工作效率。可能有人会觉得这是吹毛求疵,但对于一个一天 12 甚至 16 小时都与计算机打交道的程序员来说不算过分。

在 Shell 中还专门有一类命令用于协助完成命令输入的命令,它们都在主键盘上。

  • <C-A> 移动光标到行首
  • <C-E> 移动光标到行尾
  • <C-F> 光标在输入的命令字符串中向后移动一位
  • <C-B> 光标在输入的命令字符串中向前移动一位
  • <C-D> 向后删除一个字符
  • <C-H> 向前删除一个字符
  • <C-R> 在历史命令中按照指定的字符串进行匹配
  • <C-P> 在历史命令中取出当前命令的上一条命令
  • <C-N> 在历史命令中取出当前命令的下一条命令

这些命令产生时计算机还没有鼠标,它们存在的益处也在于减少键盘与鼠标之间移动花费的时间。据说键盘神器 HHKB 就是照着如此概念去设计的,将 Ctrl 键替换到了 Caps Lock 键的位置,而 Caps Lock 键直接被取消了,同时取消掉的还有方向键,仅仅保留了主键盘,用意就在于此。正打算最近入手一枚。

对于我来说还有许许多多需要学习的地方,公司的服务端的同事在 Lua 脚本语言,Vim 使用方式以及 Linux 编程方面都会比我更强,这些令我感到十分兴奋,乐于向他们请教。这份工作给我带来的好处之一就是能够更加一心一意去研究一些开源的 C 库,比如 Lua 、Redis、Memcached、Nginx、LevelDB、libevent、lapis 这些优秀的库。当然对于 TCP/IP/UDP 以及很多常用的 Linux 环境下常用的 API 以及概念都很模糊,不过这都不要紧,我有的是时间来折腾这些东西。而且有 6 位同事能够给我提供帮助。

在切换到 Linux/Vim 开发环境下之后,我重新开启了 Linode 来作为反向链接内网主机的跳板,既然 Eclipse 和 Intellij 都不用了,那就不需要在通过 TeamViwer 来链接办公室的电脑了,直接用 ssh 链接进去更加符合程序员的性格。跳转的方式仅需要在内网机器上执行如下命令:ssh -CfNg -R 2222:127.0.0.1:22 user@LinodeHost 就可以将其 22 映射为 LinodeHost 的 2222 端口。这样在 Linode 上直接 ssh -p 222 chunlong@localhost 其实就是连接到了内网机器。打开 vim,就可以跟在公司一样进行开发,是不是很方便。为了保持 ssh 断开后能够重连,我使用 autossh 来代替 ssh 本身。

另一个转变就是经过了长时间的权衡,我没有重新购置一台台式机器,而是购置了 DELL U2412M 屏幕,有了这个屏幕对我来说确实方便了不少,加上 Mac 本身的屏幕组合成双屏。工作空间的变大让我可以在一边打开完整的 Vim 或者 Ubuntu 虚拟系统,在另外一边查资料、打开文档或者听音乐。充分利用手上的资源做最好的整合得到最佳的结果,这不就是一个程序员每天写代码想要达到的效果吗?

写了挺多的,说明最近状态还蛮好的,值得鼓励。