為什么我仍堅持用 Vim 開發,是因為守舊嗎?
之前有人問過我,現在 VSCode、Goland 這類編程 IDE 功能這么強大、體驗這么好,甚至很多 IDE 還集成了 AI 編程的能力。老師,你為什么還堅持用 Vim 來開發 Go 項目?在工作中,還有 1 ~ 2 次,被同事提醒,要善于接受新事物。今天,我就來分享下,我為什么要堅持使用 Vim 開發軟件。
其實,我并不是一個老古董,也不是那種不會、不愿接受新事物、新工具的人。我用 Vim 開發其實有點,醉翁之意不在酒的意思。
VSCode、Goland 相較于 Vim IDE 的優勢
VSCode、Goland 之前嘗試用過一段時間,但用的并不深入。所以,基于這些有限的使用經驗,來對比下 Vim 和這類編程 IDE 的一些劣勢。去年,用過 一周時間的 Goland IDE,當時也折騰了蠻久,最終放棄了,因為我發現用 Goland 并不能提升多少工作效率。
Vim 相較于 Goland 的最大劣勢是對圖形界面的支持。在 Goland 中,你可以打開多個標簽頁,并通過鼠標快速切換。另外,所有的代碼編輯均集中在一個 Goland 界面中,便于查看、切換。雖然在 Vim 中也能實現多標簽、多窗口。但是整體的展現、切換并沒有 Goland 那么方便、流暢(如果你熟練了各種切換操作,那效率另說)。
Vim 相較于 Goland 的另外一個劣勢是對于鼠標操作的支持。在 Linux 系統下使用 Vim,雖然可以使用鼠標,但是對于鼠標的支持,并沒有 Goland 的支持那么好(例如,鼠標點擊 Vim 標簽頁,總感覺有延時)。這是 Vim 其中的一個差異劣勢。但是,我日常開發基本都是用快捷鍵(跳轉、切換等),所以這個劣勢對我來說影響不大。反而,我覺得用快捷鍵,會比鼠標更加快捷一些。
Vim IDE 相較于圖形化的界面,配置相對來說更復雜和 Hack。如果想配置好一個易用的 Vim 開發環境,往往需要對 Vim 的插件系統、配置機制有比較好的理解。如果使用的是圖形化 IDE,配置就非常便捷,通過界面和鼠標操作,很容易就完成了插件的配置。
像很多圖形化 IDE 集成了很多 AI 編程的能力,這些能力被集成的很好,使用體驗也很好。但是 Vim IDE 目前還不能很好的集成這些能力。有一些相關的插件,但使用體驗并沒有圖形界面 IDE 的順暢。
還有使用界面 IDE,鼠標操作很方便,比如,我可以直接用鼠標選擇一個范圍的代碼進行刪除,縮進等。但是用 Vim,滾動、區塊選擇,效率并沒有使用鼠標高。但是,如果快捷鍵用熟了,效率其實差別也不大。因為區塊選擇的操作,在日常開發中,用的也并不頻繁,很多時候 Vim 的 dd、ndd、:1,2d這些只能,也能實現相同的效果,而且效率也不差。
上面進行了一些對比,這些對比是我感受比較深的地方。每個開發者也都會基于自己的使用體驗、關注點,有自己的對比,上述對比僅供參考,也歡迎大家在評論區留言、討論。
為什么使用 Vim 來開發 Go 項目?
上面,我對比了 Vim IDE 和 Goland 這類界面 IDE 的劣勢。其中的很多劣勢集中在界面、鼠標、操作性這些方面。
但是,在我看來,隨著對 Vim IDE 的配置機制、插件系統的深度掌握,對 Vim 中各類插件的配置和熟練使用、對 Vim 編輯器操作命令及機制的深度掌握,我發現從開發效率上來說,會比界面 IDE 更高效一些,或者很多。
使用一個編輯器,開發 Go 項目的核心訴求無外乎以下幾類:
- 基本的編碼操作:「字符/單詞/行」的「插入/刪除/修改/查找」、光標、窗口的移動等基本操作;
- 位置跳轉: 跳轉到編輯器的不同位置,例如:行首、行位、單詞開頭、單詞結尾、文章開頭、文章結尾、第幾行等;
- 窗口操作: 水平/垂直切分窗口、關閉窗口、跳轉窗口等;
- 緩存操作: 編輯器打開文件的緩存管理,例如:查找、刪除等;
- Go 相關的操作: 跳轉到定義、跳轉到引用、跳轉到實現、代碼填充(例如 if err != nil)、結構體填充、結構體標簽填充、變量重命名等;
- 查找操作: 基于字符串的文件級、項目級查找。查找最近打開的文件、查找歷史、查找當前面目錄的文件等;
當然,還有其他類別的操作,也歡迎你在評論區分分享。
在 Goland 這類圖形化 IDE 中,很多時候可以通過鼠標來操作。但是在 Vim IDE 中,我基本都是通過快捷鍵來操作的。當你快捷鍵用的很熟悉之后,操作時,會通過肌肉記憶來將操作項映射到快捷鍵,整個過程的速度會比鼠標點擊要快很多。
所以,我喜歡使用 Vim IDE,其中一個重要原因是,使用快捷鍵操作,要比鼠標操作效率高很多。這些快捷的操作,可以極大的提高我的開發效率和開發體驗。
除了,上述操作效率提升外,我使用 Vim IDE 還有其他一些核心原因:
- 保持一套開發環境;
- 深度利用 Linux 操作系統能力;
- 復用 Linux 系統中的各種工具;
- 定制開發各種提效工具。
保持一套開發環境
在軟件開發中,有一個很重要的開發理念,就是盡可能復用已有的能力。這種理念,同樣適用于開發環境的維護。
部署和配置一個易用的開發環境,是需要一些時間的,另外開發環境中各種緩存的 Go 包等,下載也需要花費一些時間。所以,最好的方式是,一套開發環境能夠在任何地方訪問并使用。
我目前的方式是購買一個云服務器,只要有公網(沒有公網,我直接連自己的手機熱點)就可以訪問這臺云服務器。然后,將這臺云服務器配置為 Go 開發學習機。云服務器可以分為 Windows、Linux,但是如果通過網絡訪問,并在其上進行開發操作,流暢度、體驗最好的是 Linux 服務器。如果是 Linux 服務器,可選的編輯器并不多,例如:Emacs、Vim。我選擇了 Vim 作為自己的開發編輯器。
我自己的開發環境是有深度定制的,比如:Bash 環境(深度定制 .bashrc文件)、$HOME/bin目錄下安裝了很多提效工具和腳本、開發環境的目錄結構(目錄結構、軟連接等)、操作系統部署了一些代理服務等。
所以,不太想,去同時維護幾套符合自己使用習慣的開發環境。成本不高,但也還是有的。
深度利用 Linux 操作系統能力
在 Linux 操作系統上開發軟件,開發完成之后,其實可以直接復用 Linux 的能力進行各類操作的。比如:直接在 Linux 服務器上啟動編譯后的二進制文件,并訪問 Linux 上部署的 MySQL、Redis、Kafka 等中間件或者其他服務,而不用擔心網絡連通性。
如果在 Mac、Windows 上編譯出二進制文件,通常還需要上傳到 Linux 服務器再進行部署。所以,直接在 Linux 上開發,會提高部署、調試效率。
另外,編程環境的配置、編譯器的配置、編譯命令的執行、軟件的部署等,都依賴于操作系統,因為我本身對 Linux 很熟悉,所以,在軟件開發環境的安裝和配置上,也能做到駕輕就熟,根據需要隨意配置和定制。對整個開發環境有完全的掌控。我喜歡這種掌控感,對于 Windows、Mac,我不熟悉,也并不能像 Linux 那樣可以完全掌控。
復用 Linux 系統中的各種工具
Linux 操作系統中內置了很多瑞士軍刀工具,這些工具輕量、易用,功能強大,可以極大的提高日常的開發效率。例如:cd、find、du、grep、sed、awk、mkdir、ls等,每個命令又有很多命令行參數來提供各種靈活、強大的功能。例如,在日常開發中,我就經常用 grep來進行字符串查找,使用 sed來進行字符串替換,使用 awk來進行復雜的文本處理操作。上述這些 Linux 工具,能夠讓我根據需要進行各種各樣靈活的操作,這些操作,可以極大的提高我的研發效率。
我經常會開發 Web 服務,開發 Web 服務時,我一般是基于 onex[1] 或者 miniblog[2] 項目進行魔改,所以,我會執行以下命令,快速創建出新項目的模版倉庫:
$ cp -a miniblog newweb
$ sed -i 's/github.com\/onexstack\/miniblog/github.com\/onexstack\/newweb' `grep -Rl github.com/onexstack/miniblog *`
可以看到,短短 2 行命令,就能基于一個已有項目,創建一個新的項目模版。這里,請你設想下,如果實在 Windows 操作系統,該如何基于一個已有項目,快速創建一個新的項目?
Shell/Makefile 腳本
在開發 Go 項目的過程中,為了提高開發想效率,需要將很多操作封裝成可以自動化執行的腳本。輕量級的操作,直接封裝到 Makefile 腳本中。復雜點的操作需要封裝在 Shell 腳本中。例如:生成 CA 證書的自動化生成腳本、測試服務的一鍵啟動腳本等。如果有需要我們甚至還可以編寫 AWK 腳本、Sed 腳本等。進一步應對各種復雜的自動化需求。
通過 Linux 系統下各種腳本封裝,可以極大的提高我的開發效率。這也是,我為什么堅持用 Vim IDE 的一個核心原因。因為,我希望能夠完全掌控我的開發,從開發環境配置、從各種自動化提效工具的開發等方面。這就需要我基于 Linux 操作系統來進行軟件開發。但是 Linux 操作系統的可選優秀編輯器并不多,有 Emacs 和 Vim。而,我選擇了 Vim。
另外,大家如果熟悉 Kubernetes 源碼,其實也能夠發現,Kubernetes 源碼倉庫的 hack 目錄下,封裝了很多 Bash 腳本。這些 Base 腳本可以直接在 Linux 操作系統下運行,而且幾乎不會出現任何兼容性、環境問題。如果你是基于 Windows 系統開發,那么要想編譯 Kubernetes,那你還需要部署一套 Linux 開發環境。這樣,你就有 2 套開發環境了。
我在日常開發中,喜歡最大化提高自己的開發效率,所以,具備維護一套開發環境的方案和條件時,我是不愿意同時維護 2 套開發環境的。
Vim IDE 集成的 AI 能力很弱,如何借助 AI 提高編程效率?
當前 Cursor、Trae 等 IDE 集成了很強的 AI 編程能力,我覺得這是界面版 IDE 很強的一個優勢。
在 Linux 系統上,運行的 Vim IDE 也可以安裝 AI 類插件,實現編程的 AI 化賦能。但是體驗還比較差。這算是 Vim 的一個劣勢。
但,我個人對 AI 編程能力的依賴其實并不多。核心原因是,我去年寫了一套課程:「從零開發企業級 Go 應用」。在寫這套課程的過程中,我對 AI 編程有以下的感受:
- LLM 項目理解能力偏弱: LLM 當前還不能很好的理解整個項目,也無法系統化的給出整個項目的設計和實現;
- LLM 設計能力偏弱: 當前 LLM 還不能很好的從更上層視角去設計軟件架構、功能實現方式等。在使用 LLM 的過程中,LLM 會給出一些設計和實現方法,但這些設計和實現方式很多是網上現有的實現,在我看來,并不是最優解。所謂的最優解,應該是基于現在,進一步升華,LLM 當前缺乏思考、升華能力;
- LLM 生成代碼偏低中階: 在我看來 LLM 能夠給出一些不錯的代碼實現,但在使用過程中,發現很多實現屬于初級、中級階段的實現方式,如果想達到更高級的實現方法,需要一個有經驗的人進一步引導 LLM 如何去實現。
- LLM 是一個好的執行者: 在使用 LLM 的過程中, 感覺 LLM 是一個很好的執行者。只要你能把你的設計友好的表達給 LLM,它便可以很快的生成需要的代碼,而且生成的代碼很規范、細節考慮到位。但是,在生成的過程中,需要你不斷引導 LLM 以生成預期的代碼(相當于你是一個代碼架構師)。當然了,最大的好處是,你不用去一行一行的擼代碼了,大大提高了開發效率。
總結一下借助 LLM 編程的感受:LLM 是一個好的執行者,但不是一個好的設計者。LLM 具備設計能力,但設計能力偏向于初級、中級階段,對于一些高階的設計,甚至創意性的設計,LLM 目前能力還很弱,不能滿足需求。
所以,在實際編程開發中,我更希望,先基于過去自己對 Go 項目開發的積累、思考,有自己的初步實現架構。然后再去跟 AI 工具以交流的方式,看看 AI 給出的代碼實現,結合自己的需求、對技術實現的理解和 AI 的輸出,給出一個綜合最優實現,這個過程可能會涉及到多輪交流。不太會直接一條指令讓 AI 給出代碼實現,并使用之。
當我將 AI 作為一個具備很強代碼實現能力的開發者,進行交流溝通時,我完全可以使用本地的 AI 工具,來交流溝通,并將結果選擇性的應用在項目中。所以,從這個角度來看,我并不是很依賴于 Vim IDE 中是否集成了 AI 能力。
總結
Vim 對新手不友好,如果用的不熟練,確實效率沒有 Goland、VSCode 們高效。但如果對 Vim 及其中的插件,能夠熟練使用,并形成肌肉記憶,開發效率,我個人覺得會比界面 IDE 高很多。
另外,如果對 Linux 系統及其工具,熟練 Makefile 編程、Shell 編程。那么,在 Linux 系統上,使用 Vim IDE 進行 Go 項目開發,帶來的開發效率提升是巨大的。