这不是一篇鸡汤文,因为我并没有在使用 Linux 一万小时后成为 Linux 达人,甚至在很多方面,我连新手都算不上。我走的这些弯路能篇成一本很有参考价值的反面教材,下面,我来讲讲我用 Linux 都折腾了啥。
Gentoo
在 Ubuntu 还没有出生的年代,各种发行版百花齐放。以包管理机制区分的话,可以分为两派:直接安装二进制可执行文件的和下载源码自行编译的,Gentoo 算是后者中一个比较知名的项目。为了使硬件发挥出更好的性能,Gentoo 的 emerge 命令提供了不少编译参数让用户调教。从内核到日常用的所有工具,都需要用包管理工具自动下载源码后编译,这对于像我这样的 Linux 新人来说的确能学少不少东西。而且每次编译满屏幕日志飞滚非常酷,改用绿色文字就有种黑客帝国的即视感。
不过,这个机制有个显而易见的缺点,有时候做一些很小的事情都需要花上好长时间编译大量的依赖包。而像我这样的强迫症,总觉得下一次编译换一个参数也许可以使程序运行得更快,以至于很多常用工具我都编译了不下三遍。另外编译内核和格式化硬盘重装 Gentoo 的事真是数也数不清了。最惨的是,有次同事让我帮忙装一台 1U,他用 Debian 可以分分钟把 LAMP 搞定上架,而我硬是想用 Gentoo 压榨性能。我编译了一个下午,反复编译内核浪费了大量时间没能把两块网卡搞定,最后无奈的让他上了 Debian。
Gentoo 给我的教训是,大量零散的编译调优时间累积在一起会消耗很多宝贵的青春和电费,它们带来的收益微乎其微,不如直接买更好的硬件。选一个有成熟包管理机制,社区活跃的发行版能节省大把精力把真正要做的事做好。这也是后来我只用 Debian 的一个主要原因。
桌面美化,WM
曾经每天看 DistroWatch.com,除了了解各种发行版的动向,还希望看到一个界面更加美观的发行版,因为感觉大部分发行版的开发者审美太非主流。我用了很长时间尚且还看得过去的 XFCE 和 FVWM-Crystal,也用过臃肿浮夸的 KDE 和 Gnome。试了不少布局和配置,下载过很多 GTK 皮肤和图标库,玩过酷炫的 Compiz,调教过中文字体的显示效果。但不管怎么改都感觉哪儿不完美,直到后来接触到同事 Apple iBook G4 上的 Mac 系统,便掉进了在 Linux 上模仿 Mac 系统界面的深渊。这个 Flickr 相册 里有不少那些年的痕迹。
这同样是一件没有什么收益的事情,2006 年后我放弃治疗,改用 Mac 系统。
wine
周围的人问我为什么不用 Windows 这种主流的操作系统,倒喜欢用小众的操作系统的时候,我都只是一笑而过,后来我用 Mac 的时候也常常遇到这样的问题。有意思的是,现在这个问题在大部分互联网公司里变成了:『为什么你不用 Mac?』
我一开始用 Linux 作为开发主力机的确发现有诸多不便。比如同事给我发个 Microsoft Office 生成的文件;比如做网页要在 Internet Explorer 里调试;比如要上 QQ。不过我并没有感觉到 Linux 不主流,有很多在线论坛有大量热心的 Linux 用户能帮你解决各种技术问题。而同一时期那些 Windows 相关的社区全在共享盗版软件。
在还没有虚拟机技术的时候,很长一段时间里我是用 GRUB 启动多系统的。后来渐渐地用 wine 这个工具跑起了大部分 Windows 下的程序,接着完全干掉 Windows,再后来因为要流畅地跑魔兽世界内测不得不装回 Windows。
生产工具海选
对于开发人员来说,一个非常费神的事情是开发工具,尤其是文本编辑器。我用遍了市面上几乎所有收费或免费的编辑器,都没有找到一款像 Windows 下的 EditPlus 那样好用的产品。主流的推荐是 Vim 和 Emacs,我试着去学好 Vim,但当时并没有多少好用的插件,加上自己不熟悉各种快捷键,文本编辑效率并不高。幸好后来改用 Mac,很长一段时间被 TextMate 拯救了。
在我的 title 还是前端开发工程师和 Flash 开发工程师的日子里,在 Linux 下绘图也不是一件轻松的差事,我一直用不惯 GIMP 和 InkScape。有试着用 wine 跑过 Flash 的 IDE 和 Macromedia Fireworks。为了能在 Linux 下愉快地开发 Flash 程序,我还把整个项目改用 MTASC 编译。我很后悔没有早点明白,在 Linux 下绘图这件事就是自讨苦吃,同一时期在 Windows 下的各种绘图体验会愉快很多。
运维
因为会使用 Linux,所以在开发过程中时不时地会承担一些简单的运维任务。为什么只是简单的,因为更复杂的任务会由那些有 RedHat 证书的专业运维负责。在我这些年的工作经历中,我曾跑过十多次机房,管理过一些 1U 服务器,但都只停留在装系统和配置服务环境的阶段,并没有机会接触那些需要大量服务器携同工作的任务。而这些安装和配置的任务,在 Debian 下又过份地简单,apt-get install 装好的东西一般不用再多折腾就能很好地使用。所以我没能在运维这一块更加深入,只是变成一个初级熟练工而已。
前几年因为虚拟币的泡沫,我开始有动力自学配置管理工具,学了一点点 Chef 和 Puppet,感觉略复杂个人用不上,所以学了相对简单好用且不需要 master 服务器的 Ansible。有一段时间我控制近 50 台虚拟机挖虚拟币,最高的一个月有 6000 元的收入。
随后我试着把一些日常开发中经常需要反复做的事写成 Ansible Playbook,于是便有了ios-dev-playbook。期间为了和墙做斗争,从 V**-deploy-playbook 这个仓库中也学到不少实用技能。但是,很多线上服务其实比某些开源的程序做得好,有时候自己运维往往省不下几个钱。举个例子,Git 仓库,我曾经很喜欢自己在 Linode 虚拟器上搭建 GitLab 或者 Gogs,但是后来发现 GitHub 无论是在社区工具链集成度以及易用性上都甩开其它竞品好几条街。
另外,这几年,为了满足各种创业公司对高生产效率和低成本的需求,IaaS、PaaS、SaaS 以及 Docker 开始流行,创业公司不再需要专职的运维,开发人员写几个配置文件,在网页里点几下鼠标就能把一个完整的系统弄上线。
所以,我掌握的这些简单的 Linux 运维的技能,几乎已经被淘汰完了。
我试着去学 Goolge Kubernetes 和 AWS Lambda,但感觉业余精力不够,也没有项目可以实践。
总结
如果我晚十年出生,或者早点用上 Mac OS,或者考了一张 RedHat 证书,应该就不会这么折腾了。