這是一場沒有硝煙的戰爭,兩名開發者在咖啡廳裡狹路相逢——一個是 neovim 信徒,另一個是 VS Code 忠實用戶。他們互相瞧不起,彼此的筆電、開發環境、甚至貼紙都充滿了敵意。

neovim 開發者:Arch Linux + ThinkPad
☕ 他坐在咖啡廳最角落,手中的 ThinkPad X1 Carbon(黑色無 Logo 銘牌,鍵帽微磨損) 散發著一股工程師的孤傲。他的筆電貼紙是一行簡單的 「I ❤️ Vim」,旁邊貼著一個 Tux 企鵝,還有一張寫著 「BTW, I use Arch」 的小標語。
💻 作業系統:Arch Linux(自動進入 TTY,黑底綠字,無 GUI)
🛠 開發工具:Neovim + Tmux + Alacritty,整個畫面就是純黑背景加上奇怪的快捷鍵組合。
📜 配置:.vimrc 轉移到 init.lua,還在研究怎麼讓 LSP 比 VS Code 快 0.1 秒。
他嘴角浮現一絲不屑的微笑,看著不遠處的 VS Code 開發者。「那傢伙還在用 GUI?真是浪費 RAM。」
VS Code 開發者:MacBook Pro + TypeScript
☕ 他坐在靠窗的位置,桌上擺著 最新款的 MacBook Pro 16 吋(M4 Max,貼紙滿滿),機身鋁殼反射著咖啡廳柔和的燈光。他的筆電貼紙上寫著 「Code. Eat. Sleep. Repeat.」,還有一張 「Powered by ChatGPT」 的小貼紙,旁邊還貼著 Notion 的 Logo。
💻 作業系統:永遠保持最新的版本 (目前是 macOS Sequoia)
🛠 開發工具:VS Code + Copilot + Prettier,每行程式碼都有 AI 幫他補完,根本不用自己敲鍵盤。
📜 配置:settings.json 裡全是自動格式化,甚至連 Debug Console 都開著。
他偷偷瞄了一眼 neovim 開發者,內心冷笑:「那傢伙寫個 function 可能還要手動對齊大括號吧?」
戰爭開打
VS Code 開發者不經意地 cmd + P,秒速打開檔案,補上幾行 Copilot 建議的 TypeScript 程式碼,然後輕鬆 cmd + S,不帶一絲猶豫。
neovim 開發者冷哼一聲,只見他手指飛舞,:w
一氣呵成,接著用 Tmux 分割視窗,開啟 lazygit,再用 fzf-telescope 搜索檔案,瀟灑地進行 Git 操作——全程沒有動滑鼠。
「GUI 只是軟弱者的幻想。」 neovim 開發者內心默念。
「CLI 只是折磨自己的方式。」 VS Code 開發者則在心裡反駁。
兩人對視了一眼,彼此心知肚明:
「你才是錯的那一方。」
第二回合:環境配置大戰
☕ 兩位開發者在咖啡廳再次交鋒。他們都不約而同地決定「設定開發環境」,但他們的方式卻截然不同。
neovim 開發者:DIY 之神
💾 新環境配置方式:從 0 開始,手動配置,連 .bashrc
都要親手寫。
- Git Clone 自己的 dotfiles,然後
stow neovim tmux zsh
,一切回到自己最熟悉的樣子。 - 手寫 init.lua,拒絕預設設定,每個插件都要「自己決定命運」。
- 安裝 Treesitter,啟用語法高亮,因為 「Neovim 也能變成 IDE。」
- 用
:PlugInstall
下載 20+ 個 Vim 插件,然後開始 Debug 為什麼 LSP 會壞掉。 - 「好,我的環境 100% 完美。」(事實上還有一些小問題沒修。)
⚠️ 這個過程花了 30 秒,而且他對著 nvim --version
測試了一下,覺得開啟時間還是慢了 0.03 秒,可能要重寫一部分配置。
VS Code 開發者:Extension 雲端狂魔
☁️ 新環境配置方式:登入 GitHub,開啟 VS Code,同步所有設定,五分鐘搞定。
- 打開 VS Code,登入 GitHub,所有設定自動同步。
- 裝 Copilot、Prettier、ESLint、Material Theme,確保畫面 「乾淨又有質感」。
- 開啟 Command Palette,搜尋「Install All Extensions」,一鍵安裝所有插件。
- 開啟設定檔
settings.json
,檢查 AI 自動補全有沒有開啟。 - 測試一下 Copilot 輸出的程式碼,滿意地點頭:「沒錯,我的環境 100% 完美。」
⚠️ 這個過程只花了 3 分鐘,但他有點懷疑自己是不是已經變成 Copilot 的附庸,因為他忘了上次手動寫程式碼是什麼時候。
第三回合:記憶體之戰
☕ 在工作 30 分鐘後,兩人的筆電都開始發熱,風扇聲此起彼落。他們不約而同地打開 htop
/ Activity Monitor
,檢查記憶體使用狀況。
🛠 neovim 開發者的 htop
:
neovim
使用 30MB RAM,還有一點 Tmux、ripgrep、fzf,總共不到 150MB。htop
只顯示幾個進程,CPU 使用率低得讓人懷疑這台電腦是不是在睡覺。- 內心自豪:「這才是高效能開發。」
💥 VS Code 開發者的 Activity Monitor:
Code Helper (Renderer)
:2.3GBCopilot Agent
:700MBChrome
(開了 20 個 Stack Overflow 分頁):5GBSlack
(沒關掉):1GBSpotify
(背景播放 Lo-Fi):500MB- 總共 10GB,還剩 6GB 可用(還好是 48GB RAM)
- neovim 開發者覺得 「這麼多記憶體,根本浪費」。
- VS Code 開發者覺得 「反正 Mac 有 Unified Memory,不用白不用」。
第四回合:Debug 方式
💻 兩位開發者開始 Debug 各自的程式碼,方式完全不同:
🧠 neovim 開發者:
:e main.c
→:set number
→:set relativenumber
→:Gdiffsplit
- 手動加
printf()
,慢慢檢查輸出,相信「簡單就是最好的 Debug 工具」。 - 用
gdb
+tmux split-window
,手動打斷點,觀察變數變化。 - 「IDE 內建 Debug 工具?那是給不會用 CLI 的人用的。」
⚡ VS Code 開發者:
- 開啟 Debug Console,點擊「Run & Debug」,加上
console.log()
直接檢查輸出。 - 在 Chrome DevTools 設斷點,檢查 React 組件的狀態。
- 用 Copilot 解釋錯誤訊息,基本上等於 AI 幫 Debug。
- 「手動
printf()
?你還活在 90 年代嗎?」
最終對決:誰先完成專案
💼 兩人最終都完成了專案,但方式依舊充滿敵意:
🏆 VS Code 開發者:
- Copilot 幾乎幫他寫了 80% 的程式碼,剩下的只要微調邏輯。
- AI 自動補全、Debug Console、Live Server 讓他效率飛快,短短 3 小時完成 MVP。
- 「AI 會寫程式,我只要負責決策。」
🏆 neovim 開發者:
- 每個函數都親手敲,確保沒有多餘的 Magic Code,乾淨、可維護。
- 測試時全程用
make
+tmux split-window
,確保最大效率。 - 「自己寫的程式碼,才是最可靠的。」
結論:互相瞧不起,但內心深處……
🧐 neovim 開發者偷偷想過:「其實 Copilot 還滿方便的……」
😏 VS Code 開發者默默覺得:「有時候 Vim 的快捷鍵真的很快……」
但沒關係,他們還是要繼續瞧不起對方。
「你才是錯的那一方。」(再次對視,轉頭繼續寫 Code。)
第五回合:寫程式的方式大對決
☕ 隨著時間推移,兩人都進入了 coding 狂熱狀態,手指在鍵盤上飛舞,但彼此的風格、思維模式、寫法卻完全不同。他們不只在「開發工具」上有天壤之別,就連「寫程式的習慣」也互相瞧不起。
第一戰:打開專案
💻 VS Code 開發者的流程:
code my_project
:秒開 VS Code,專案結構一覽無遺。- 開啟
src/components/App.tsx
,按下cmd + P
快速搜尋。 - Copilot 自動補全 import,不用擔心
import { useState } from 'react'
打錯。 - Prettier 自動格式化,整個世界井然有序。
- Live Server 一鍵預覽,程式變動 0.1 秒內 反映在瀏覽器。
🔥 內心 OS:「這種效率,我不信有人能贏。」
🛠 neovim 開發者的流程:
- 打開終端,輸入
cd ~/projects/my_project
。 - 用
nvim .
進入編輯模式,Telescope 開啟app.c
。 - 沒有 import 自動補全,純手寫
#include <stdio.h>
。 - LSP(語言伺服器)有時候壞掉,但
:w
總是可靠的。 - 沒有 Live Server,測試就是
make && ./app
,再tmux split
開 GDB 來 Debug。
🔥 內心 OS:「寫程式就該這樣,一切盡在掌握。」
第二戰:如何命名變數
📝 VS Code 開發者的風格(TypeScript / JavaScript):
- 命名清晰、符合 ESLint 規範:
function fetchUserData(userId: string): Promise<User> {
return api.get(`/users/${userId}`);
} - 如果懶得命名,Copilot 會幫忙:
const handleButtonClick = async () => {
const data = await fetchUserData(user.id);
setUserData(data);
}; - 有 TypeScript 提示,變數錯了 VS Code 直接報紅。
🔥 內心 OS:「為什麼還要想變數名稱?Copilot 早就幫你想好了。」
📝 neovim 開發者的風格(C / Rust):
- 程式碼短小精悍,因為鍵盤輸入很重要:
return (fd = open("data.txt", O_RDONLY)) == -1 ? (perror("open"), -1) : fd;
- 手寫
#define
macro,因為const
太慢:#define MAX_BUFFER 1024
- GDB Debug 時最常看的變數:
int *ptr = malloc(sizeof(int) * 10);
- 從來不依賴 IDE 提示,大腦就內建 Compile,每次編譯都一次過。
🔥 內心 OS:「寫程式就該簡潔高效,冗長的變數名是對性能的侮辱。」
第三戰:處理錯誤
💥 VS Code 開發者的方式:
- 用
try-catch
,錯誤訊息一定要完整:try {
const user = await fetchUserData(userId);
console.log("User data:", user);
} catch (error) {
console.error("Failed to fetch user data:", error);
} - 如果出錯,第一時間
console.log()
,第二時間 Google。 - ESLint 提示:「你這段程式碼沒處理 edge case。」
🔥 內心 OS:「程式要優雅,錯誤一定要 log 清楚。」
💥 neovim 開發者的方式:
- 用
errno
,錯了就perror()
,程式該死就得死:return (fd = open("data.txt", O_RDONLY)) == -1 ? (perror("open"), -1) : fd;
- 錯誤解法 1:
gdb ./app
,直接下斷點。 - 錯誤解法 2:用
strace
看系統呼叫。 - 錯誤解法 3:Google?不,我看
man errno
。
🔥 內心 OS:「寫程式要面對錯誤,而不是假裝它們不會發生。」
第四戰:如何提交 Git
📜 VS Code 開發者的方式:
- 按下
cmd + shift + P
,搜尋「Commit & Push」。 - AI 自動幫忙寫 commit message:
feat(user): add user authentication logic
- 一鍵推送,CI/CD 自動部署。
🔥 內心 OS:「寫 Commit Message 的時間,還不如寫更多程式碼。」
📜 neovim 開發者的方式:
- 打開終端,輸入
git add -p
,每個修改細節都要確認。 - 用 Vim 編輯 Commit Message,還有
.gitconfig
設定commit.verbose=true
。 - Commit message 總是像這樣:
Fix: 修正 malloc 錯誤,避免 Segmentation Fault
- 用
git rebase -i
來整理歷史紀錄,確保 Git Log 乾淨。
🔥 內心 OS:「Commit message 是紀錄歷史,不是隨便寫寫的 Slack 訊息。」
結局:互相瞧不起,卻又偷偷學習對方
💡 VS Code 開發者開始懷疑:「其實 CLI 操作 Git 好像真的比較強……」
💡 neovim 開發者有點動搖:「其實 Copilot 有時候真的幫得上忙……」
但不管怎樣,兩人還是要繼續瞧不起對方,因為這是屬於他們的尊嚴之戰。
「你才是錯的那一方。」(再次對視,然後繼續寫 Code。)
免責條款:純屬惡搞...