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