作者 | 徐杰承
51CTO讀者成長計(jì)劃社群招募,咨詢小助手(微信號(hào):CTOjishuzhan)
“如今流行的許多關(guān)于干凈代碼的‘最佳實(shí)踐’是引發(fā)程序性能災(zāi)難的直接原因?!边@是西雅圖資深游戲開發(fā)專家凱西·穆拉托里在其個(gè)人網(wǎng)站所發(fā)表文章中的一段言論,而他的這個(gè)觀點(diǎn)在過去一個(gè)多月中引發(fā)了各大開發(fā)者社區(qū)的激烈爭(zhēng)論。
部分人贊同了穆拉托里的理念,也有部分人站了出來為干凈代碼發(fā)聲,這其中便包括《代碼整潔之道》一書的作者——世界級(jí)編程大師Bob大叔(Robert C. Martin)。在二者于Twitter上進(jìn)行了一場(chǎng)難分勝負(fù)的辯論后,還嫌不過癮的穆拉托里近期又通過New Stack的采訪再次針對(duì)干凈代碼的性能缺陷進(jìn)行了無情輸出。
1、一篇文章引發(fā)的海嘯
說起這場(chǎng)曠日持久的“戰(zhàn)爭(zhēng)”,就不得不提到穆拉托里上個(gè)月所發(fā)表的一篇名為《“干凈”的代碼,糟糕的性能》的文章了。文中,穆拉托里通過近10項(xiàng)代碼測(cè)試驗(yàn)證了干凈代碼與程序性能間的沖突,并提出了“干凈”編程規(guī)則根本不靠譜的觀點(diǎn)。
在文章發(fā)布后不久,各大技術(shù)社區(qū)中的開發(fā)者便快速自發(fā)的分成了兩大派系,支持者認(rèn)為過分關(guān)注代碼的“干凈”將使程序損失大量性能,這有悖于程序開發(fā)的初衷,而反對(duì)者則認(rèn)為干凈代碼更易于維護(hù)和改進(jìn),一點(diǎn)點(diǎn)的性能損耗對(duì)如今的絕大部分程序來說都無傷大雅。
就在兩邊勢(shì)力爭(zhēng)論不下之際,雙方各自的老大穆拉托里與Bob大叔決定通過一場(chǎng)辯論決一勝負(fù)。然而即便兩人在Twitter上從編程語言聊到開發(fā)工具,又從開發(fā)工具聊到程序需求,最后直到硬件性能為止。但在經(jīng)歷了5輪對(duì)峙后,各執(zhí)一詞的穆拉托里與Bob大叔最終都沒能成功說服對(duì)方。
2、穆拉托里的最新回應(yīng)
然而正當(dāng)人們以為兩位大佬不分勝負(fù)的battle將為這場(chǎng)對(duì)峙暫時(shí)畫上一個(gè)不完美的句號(hào)時(shí),穆拉托里卻再次現(xiàn)身接受了New Stack的采訪,并總結(jié)了自己所發(fā)現(xiàn)的“干凈代碼”的缺陷。
穆拉托里表示,對(duì)于干凈的代碼而言,開發(fā)者經(jīng)常被要求避免列出代碼中可能出現(xiàn)的分支,例如C語言中的switch語句。但我曾親自做過測(cè)試,利用干凈代碼所倡導(dǎo)的方式和switch語句創(chuàng)建不同的圖形面積計(jì)算函數(shù),結(jié)果是switch語句函數(shù)的性能要比干凈代碼版提高了1.44倍。
當(dāng)你把問題弄得越復(fù)雜時(shí),這些想法會(huì)對(duì)你程序產(chǎn)生的傷害就越大。有時(shí),放棄干凈代碼不僅會(huì)讓你的程序變得更快,也能讓它們的語義變得更好理解??傆腥苏f使用數(shù)百萬個(gè)包含小函數(shù)的類會(huì)使程序變得更易讀、更靈活,但在實(shí)踐中情況并不一定如此,它只會(huì)給CPU帶來更大壓力。
或許有人認(rèn)為代碼的合理性只能通過對(duì)代碼的高度優(yōu)化來實(shí)現(xiàn),但這其實(shí)并不是一個(gè)正確的觀點(diǎn),只要你所寫的代碼具有合理性,那么無論他們是否被干凈原則所修改過,它都是易讀和靈活的。顯然一些技術(shù)基礎(chǔ)較差的開發(fā)者沒有寫出或是接觸過這樣的代碼。
除此之外,穆拉托里還提到了非常關(guān)鍵的一點(diǎn),他認(rèn)為很多干凈代碼的倡導(dǎo)者并沒有真正理解CPU的工作模式。“這并不僅僅是一個(gè)學(xué)術(shù)問題,如果你的代碼運(yùn)行在云服務(wù)器上,那么你每月所收到的賬單與程序性能是成正比的。如此以來你的軟件越慢,你需要購買的服務(wù)就會(huì)越貴。”
3、干凈與性能,你會(huì)如何選擇
顯然,穆拉托里的這番話再次一石激起千層浪,采訪文章發(fā)布后不久便收到了超過900條評(píng)論。
游戲開發(fā)者Daniel Kvick表示穆拉托里對(duì)于CPU的觀點(diǎn)太過古老頑固。而游戲開發(fā)商Jonathan Dickinson則反駁了他的這一觀點(diǎn)“如果給你一個(gè)10年前的代碼庫,你就不會(huì)再這么說了。”
軟件工程師Joshua Rumbut則表示了對(duì)穆拉托里的贊同,“很多時(shí)候?qū)τ陂_發(fā)者來說嚴(yán)格的干凈代碼約束的確很令人厭煩,尤其是在涉及到程序性能的部分,取消這些約束是一個(gè)非常明智的選擇,并且我也沒見過哪些按照干凈代碼原則的代碼庫更易于維護(hù)和開發(fā)。”
對(duì)于網(wǎng)絡(luò)上的留言,穆拉托里也在后續(xù)的回訪中向記者表述了自己的觀點(diǎn),“一些回應(yīng)令人感到擔(dān)憂,許多反對(duì)意見似乎是基于對(duì)事實(shí)判斷的錯(cuò)誤。但總的來說,我收到了令人感到驚訝的大量不喜歡干凈代碼并希望為此做點(diǎn)什么的人的鼓勵(lì),這對(duì)未來的軟件發(fā)展而言興許是個(gè)好兆頭?!?/p>
歸根結(jié)底,雖然穆拉托里對(duì)于干凈代碼的抨擊顯得有些偏激,但這也不得不讓我們開始思考干凈代碼與程序性能間的關(guān)系。理想與現(xiàn)實(shí)總會(huì)存在一定差距,那么當(dāng)更整潔的代碼與更高的性能無法兼得時(shí),你又會(huì)如何作出選擇呢?
參考鏈接:
https://www.computerenhance.com/p/response-to-a-reporter-regarding
https://www.computerenhance.com/p/clean-code-horrible-performance
https://github.com/unclebob/cmuratori-discussion/blob/main/cleancodeqa.md