這篇文章并不是一篇勵志文,因為我在使用 linux 一萬小時后并沒有成為 linux 達人,甚至在很多方面,我連新手都算不上。我走過的這些彎路可以寫成一本很有參考價值的反面教材。接下來,我將分享我在使用 Linux 時的各種嘗試和經歷。
在 Ubuntu 誕生之前,各種 Linux 發行版百花齊放。以包管理機制區分,可以分為兩派:直接安裝二進制可執行文件的和下載源碼自行編譯的,Gentoo 屬于后者中的一個知名項目。為了讓硬件性能發揮到極致,Gentoo 的 emerge 命令提供了許多編譯參數供用戶調整。從內核到日常使用的工具,都需要通過包管理工具自動下載源碼并編譯,這對于像我這樣的 Linux 新手來說的確能學到不少東西。而且每次編譯時,滿屏幕的日志滾動非常酷,改用綠色文字就像在體驗《黑客帝國》。
然而,這個機制有一個明顯的缺點,有時做一些小事情都需要花很長時間編譯大量的依賴包。而像我這樣的強迫癥患者,總覺得下一次編譯換一個參數也許能讓程序運行得更快,結果導致很多常用工具我都編譯了不下三遍。另外,編譯內核和格式化硬盤重裝 Gentoo 的事情數也數不清。最糟糕的一次是,同事讓我幫忙安裝一臺 1U 服務器,他用 Debian 可以很快把 LAMP 環境搭建好,而我執意用 Gentoo 壓榨性能,結果編譯了一個下午,反復調整內核浪費了大量時間,最終還是沒能配置好兩塊網卡,無奈之下只能讓他用 Debian。
Gentoo 給我的教訓是,大量零散的編譯調優時間累積起來會消耗很多寶貴的青春和電費,而帶來的收益卻微乎其微,不如直接購買更好的硬件。選擇一個包管理機制成熟、社區活躍的發行版可以節省很多精力,把真正要做的事情做好。這也是我后來只用 Debian 的主要原因之一。
桌面美化和窗口管理器曾經每天瀏覽 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 拯救了。
在我還是前端開發工程師和 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 運維技能,幾乎已經被淘汰了。
我嘗試學習 Google kubernetes 和 AWS Lambda,但感覺業余時間不夠,也沒有項目可以實踐。
總結如果我晚十年出生,或者早點用上 Mac OS,或者考了一張 RedHat 證書,可能就不會這么折騰了。