這不是一篇雞湯文,因為我並沒有在使用 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。期間為了和牆做斗爭,從 vpn-deploy-playbook 這個倉庫中也學到不少實用技能。但是,很多線上服務其實比某些開源的程序做得好,有時候自己運維往往省不下幾個錢。舉個例子,Git 倉庫,我曾經很喜歡自己在 Linode 虛擬器上搭建 GitLab 或者 Gogs,但是後來發現 GitHub 無論是在社區工具鏈集成度以及易用性上都甩開其它競品好幾條街。
另外,這幾年,為了滿足各種創業公司對高生產效率和低成本的需求,IaaS、PaaS、SaaS 以及 Docker 開始流行,創業公司不再需要專職的運維,開發人員寫幾個配置文件,在網頁裡點幾下鼠標就能把一個完整的系統弄上線。
所以,我掌握的這些簡單的 Linux 運維的技能,幾乎已經被淘汰完了。
我試著去學 Goolge Kubernetes 和 AWS Lambda,但感覺業余精力不夠,也沒有項目可以實踐。
總結
如果我晚十年出生,或者早點用上 Mac OS,或者考了一張 RedHat 證書,應該就不會這麼折騰了。