前段時(shí)間,微軟退役老兵 Raymond Chen 在他的博客上翻出了一段舊事:
當(dāng)年微軟和 IBM 合作開(kāi)發(fā) OS/2 操作系統(tǒng)時(shí),兩邊因?yàn)橐粋€(gè)按鍵吵了起來(lái)。
在對(duì)話框里,用戶按哪個(gè)鍵從一個(gè)輸入框跳到下一個(gè)?微軟說(shuō)用 Tab,IBM 不同意,然后一級(jí)一級(jí)往上升級(jí),升了七層,一直升到副總裁,要求微軟也派同級(jí)別高管來(lái)確認(rèn)。

一個(gè)按鍵而已,能讓兩家巨頭公司鬧到高管對(duì)線。
但實(shí)際上,相比 "Tab 要不要用來(lái)切換字段 " 這種小打小鬧,圍繞它還有一場(chǎng)更大的戰(zhàn)爭(zhēng):寫(xiě)代碼的時(shí)候,縮進(jìn)到底該用 Tab,還是用空格?
這問(wèn)題聽(tīng)著跟 " 你吃飯用左手還是右手 " 一樣無(wú)聊。但就這么個(gè)破事兒,全世界最聰明的一幫人,為它撕了整整半個(gè)世紀(jì)。甚至比馮諾依曼派和圖靈派的吵吵還要早。

但到了計(jì)算機(jī)時(shí)代,存儲(chǔ)是按 KB 的。同樣縮進(jìn) 4 層,空格要 16 個(gè)字符,Tab 只要 4 個(gè),省出來(lái)的全是白花花的銀子。
所以早期終端直接把 Tab 定成 8 個(gè)字符寬。從 1969 年的 TOPS-10 到 1974 年的 VT52,Tab 永遠(yuǎn) 8 個(gè)字符寬。甚至在 ASCII 里, Tab 和 Space 也有著完全不同的定義,一個(gè)是控制字符,另一個(gè)是可打印字符,老祖宗定的規(guī)矩,沒(méi)的商量。
直到 1978 年,VT100 終端把 Tab 寬度第一次變成了可以自定義的,這下壞了。
因?yàn)榇蠹液芸炀桶l(fā)現(xiàn),我擦,你的 Tab 是 4 個(gè)字符寬,我的是 8 個(gè),他的是 2 個(gè)。你電腦上排好的代碼,到我屏幕上一開(kāi)就全亂了,那找誰(shuí)說(shuō)理去?

本來(lái)吧你樂(lè)意用 tab 就用,喜歡到哪兒都一樣就用空格,也沒(méi)人攔著。但真正把技術(shù)分歧升級(jí)成宗教戰(zhàn)爭(zhēng)的,是因?yàn)閮蓚€(gè)男人堂堂登場(chǎng)。
第一位上場(chǎng)的選手,就是鼎鼎大名的Linux 之父:萊納斯 · 托瓦茲。

" 制表符是 8 個(gè)字符,因此縮進(jìn)也是 8 個(gè)字符。有些異端運(yùn)動(dòng)試圖將縮進(jìn)設(shè)為 4 個(gè)甚至 2 個(gè)字符深,這無(wú)異于試圖將圓周率定義為 3。"
這尼瑪,敢情人家空格黨要有兩棟高樓,他得是恨不得親自開(kāi)飛機(jī)的那種。
但人家這倒也不是在耍流氓。他的邏輯是:8 字符縮進(jìn),一行 80 個(gè)字符就滿了,你最多嵌套 3 層,超過(guò) 3 層說(shuō)明代碼寫(xiě)爛了啊。你的代碼縮進(jìn)到第四層出了問(wèn)題,那不是 Tab 的問(wèn)題,是你的問(wèn)題。
所以有句名言至今流傳:" 如果你的代碼需要超過(guò) 3 層縮進(jìn),那你已經(jīng)完蛋了,去修你的程序吧。"

和 Linux 相比,這哥們就走了完全相反的路,Python 把縮進(jìn)變成了一種語(yǔ)法。
你不縮進(jìn),代碼就跑不了,因?yàn)榻忉屍骺繑?shù)你每行前面有幾個(gè)空白字符來(lái)判斷代碼結(jié)構(gòu),如果團(tuán)隊(duì)里有人用 Tab 有人用空格,那直接就報(bào)錯(cuò)了。

跟前面的終端問(wèn)題類似,由于不同編輯器對(duì) Tab 轉(zhuǎn)空格的默認(rèn)行為完全不一樣,你的代碼一跨平臺(tái)就直接炸了。
所以為了保全自己的戶口本不被社區(qū) Aoe,最終他決定:所有人全部用 4 個(gè)空格,不許混用!
緊接著他制定的 PEP 8 也成了 Python 憲法,空格也就成了 Python 黨的絕對(duì)信仰。

再加上兩方大佬站臺(tái),就跟封神榜似的。元始天尊通天教主都發(fā)話了,那還說(shuō)啥了。
于是從上世紀(jì)末到最近幾年,這 tab 黨和空格黨就跟闡教截教一樣,大家就互毆吧。
舉個(gè)例子,在 HBO 神劇《硅谷》里,男主發(fā)現(xiàn)女朋友用空格,當(dāng)場(chǎng)就崩潰了沖出家門(mén),破口大罵說(shuō) " 我絕不可能和一個(gè)用空格代替制表符的人在一起。"

還有在 2017 年,Stack Overflow 的數(shù)據(jù)科學(xué)家也是看熱鬧不嫌事大,直接拱火說(shuō)哥們分析幾十萬(wàn)份數(shù)據(jù)后發(fā)現(xiàn),用空格的程序員平均薪資比用 Tab 的高 8.6%,這事還上了 BBC。
你們空格黨怎么還薪資歧視啊喂!職場(chǎng)霸凌!

因?yàn)楦咝饺后w大多供職于工程規(guī)范嚴(yán)格的大廠,在幾百人協(xié)作的代碼庫(kù)里,空格的 " 絕對(duì)一致性 " 確實(shí)最省心。
說(shuō)白了,縮進(jìn)方式本質(zhì)上是個(gè)變量,代表的不是編程能力,而是你所處的工程環(huán)境有多成熟。

直接說(shuō)結(jié)論,雖然沒(méi)分出勝負(fù),但是 tab 黨在道德上占據(jù)了上風(fēng)。
這倒不是因?yàn)樗缂t,而是一群大家壓根沒(méi)想過(guò)的人:盲人程序員。
由于他們靠盲文顯示器寫(xiě)代碼,盲文面板通常只有 40 個(gè)字符格。4 空格縮進(jìn)嵌套 3 層就是 12 格,那么 30% 的物理空間就浪費(fèi)在空白上,手指摸一圈發(fā)現(xiàn)沒(méi)摸到多少代碼內(nèi)容。而 Tab 一層只占一格,3 層嵌套就 3 格。
所以這下,Tab 在道德層面就直接封神了,因?yàn)榭崭顸h追求的 " 一致性 ",本質(zhì)上假設(shè)每個(gè)人都有完美視力和標(biāo)準(zhǔn)顯示器,但世界上還有很多人不是這樣的。

同樣的,隨著 2017 年 EditorConfig、Prettier 這類格式化工具的出現(xiàn),這些手工敲代碼的爭(zhēng)論也被技術(shù)改進(jìn)逐漸平息。這些工具默認(rèn)不用 Tab,但也支持,并且會(huì)用 Tab 縮進(jìn)、空格對(duì)齊的 SmartTabs 思路。
所以空格還是 tab,越來(lái)越變成了一種文化上的身份認(rèn)同。

說(shuō)兩個(gè)群體越相似,越會(huì)對(duì)彼此一丁點(diǎn)不同的地方抓狂。所有程序員面對(duì)的壓力幾乎一樣:改不完的需求、查不盡的 Bug、半夜三點(diǎn)的報(bào)警,發(fā)際線曲線都高度重合。正因?yàn)樘窳?,才需要找一個(gè)微小差異來(lái)證明—— " 我跟你不一樣 "。
無(wú)論是簡(jiǎn)約頭像還是動(dòng)漫頭像,格子衫還是女裝,Tab 還是空格,這都早就不是工程決策了,本質(zhì)是極客世界里的部落圖騰。
這種古已有之的爭(zhēng)論,靠人類自己,是永遠(yuǎn)分不出勝負(fù)的。
但隨著 AI 時(shí)代的到來(lái),分不分其實(shí)也沒(méi)有什么意義。
2026 年,Claude Code 的創(chuàng)造者鮑里斯 · 切爾尼說(shuō):" 我們公司已經(jīng)沒(méi)有任何手寫(xiě)代碼了 ",并預(yù)言 " 軟件工程師 " 這個(gè)頭銜,2026 年就會(huì)開(kāi)始消失。 以后每個(gè)人都是會(huì)寫(xiě)需求的產(chǎn)品經(jīng)理,代碼的事兒交給 Agent。

隨便。反正不是人敲的。
這好比你費(fèi)了半天勁爭(zhēng)論毛筆該用羊毫還是狼毫,結(jié)果抬頭一看,大家都用打印機(jī)了。
也許再過(guò)二十年," 你用 Tab 還是空格 " 也會(huì)和 " 羊毫還是狼毫 " 一樣,成為古法編程時(shí)代的非遺談資。
老程序員們坐在一起喝酒,聊起當(dāng)年為了一個(gè)看不見(jiàn)的字符差點(diǎn)跟同事絕交,就像老木匠聊起刨子該推還是該拉吵得不可開(kāi)交。
手藝還是好手藝。只是用得上的人,越來(lái)越少了。
撰文:納西
編輯:江江 & 面線
美編:素描
圖片、資料來(lái)源:
the register,Github 等,部分圖源網(wǎng)絡(luò)


