“如今,99.9% 以上的代碼都是垃圾!”(現(xiàn)在的代碼)
作者 | Cliff Harris
譯者 | 彎月
出品 | CSDN(ID:CSDNnews)
偶然的一次,我需要使用網(wǎng)盤(pán)服務(wù),就是把文件上傳到某個(gè)地方(具體是哪家服務(wù)就不說(shuō)了,反正都一樣)。這只一個(gè)非常簡(jiǎn)單的操作,首先將硬盤(pán)上某個(gè)文件夾里的文件復(fù)制到遠(yuǎn)程服務(wù)器,然后再執(zhí)行一些數(shù)據(jù)庫(kù)操作,給文件起個(gè)名字,然后提供給下載,僅此而已。
提供網(wǎng)盤(pán)服務(wù)的是一家大公司,規(guī)模很大,估計(jì)每天有不少黑客訪問(wèn),所以他們需要一些安全措施,上傳和下載的時(shí)候還得驗(yàn)證文件是否被篡改等等,這都沒(méi)問(wèn)題。
但是,最基本的功能只不過(guò)是列出文件、讀取文件、上傳文件,然后關(guān)閉連接,在日志里寫(xiě)上成功,或者出錯(cuò)的話在日志里寫(xiě)出錯(cuò)誤原因。這又不是火箭科技,實(shí)際上我自己用wininet API寫(xiě)這段代碼,服務(wù)器用PHP和MySQL,盡管達(dá)不到企業(yè)級(jí),但也能支持幾十萬(wàn)文件的上傳、下載和日志記錄——一個(gè)人寫(xiě)代碼大概也就是兩三周的工作量?
然而,我用的那個(gè)專用上傳工具的客戶端總共有230MB,包含2700多個(gè)文件。
是的,你沒(méi)看錯(cuò),2700多個(gè)文件,237MB的可執(zhí)行文件和各種垃圾,僅僅是為了把文件拷貝到服務(wù)器而已。這已經(jīng)不能叫膨脹了,更不是過(guò)度設(shè)計(jì),這完完全全到了不可理喻的地步。
實(shí)際上,不光是這個(gè)上傳工具,如今任何大型軟件公司的任何軟件都一樣。
電腦里 99.9% 以上的代碼都是毫無(wú)用處的垃圾
我知道怎么回事,我也見(jiàn)過(guò)其他程序員的實(shí)現(xiàn)方式。根本原因在于,程序員根本不懂怎樣通過(guò)高效率的底層代碼來(lái)實(shí)現(xiàn)目標(biāo),他們甚至從來(lái)沒(méi)見(jiàn)過(guò)底層的高效代碼。沒(méi)見(jiàn)過(guò)的東西怎么可能做得出來(lái),還要做得更好呢?
編寫(xiě)一個(gè)安全、快速上傳文件到服務(wù)器的軟件,最多需要二十分之一的代碼量。只需要一個(gè)文件,一個(gè)exe文件就夠了,根本不需要好幾百個(gè)DLL。這是完全可能的,而且會(huì)更容易、更可靠、效率更高,還很容易調(diào)試,甚至能更穩(wěn)定地工作。
代碼膨脹似乎是像我這種老家伙的碎碎念,畢竟我已經(jīng)上年紀(jì)了。但我們這幫老家伙們碎碎念的可不是代碼運(yùn)行減慢了50%、規(guī)模增大了50%。實(shí)際情況遠(yuǎn)不止于此。
我相信你電腦里99.9%以上的代碼都是毫無(wú)用處的垃圾,永遠(yuǎn)不會(huì)被運(yùn)行。但這些代碼都堆在那兒,堆在65個(gè)DLL文件里,這都是因?yàn)槌绦騿T想做一些不太重要的事情,比如保存一張圖片,但他們完全不懂得該怎么做,就干脆導(dǎo)入一大堆垃圾來(lái)實(shí)現(xiàn)。
我說(shuō)過(guò),看著年輕程序員這樣做我真不應(yīng)該生氣,畢竟他們學(xué)到的實(shí)現(xiàn)方式就是這樣的。他們根本不知道高性能開(kāi)發(fā)是什么樣子,也沒(méi)見(jiàn)過(guò)條件有限的軟件是什么樣子。你要是告訴他們,最初的Elite游戲能生成整個(gè)銀河系,有3D狗斗,有職業(yè)系統(tǒng),交易系統(tǒng),還能探索上千個(gè)星球,而這一切只有64KB,他們也能接受,但完全沒(méi)辦法理解這與現(xiàn)在的軟件之間有什么差距。
CPU和內(nèi)存都有限才是編程的黃金時(shí)代
為什么我關(guān)心這件事?原因有很多,最簡(jiǎn)單的就是當(dāng)你花費(fèi)兩千倍的時(shí)間來(lái)做一個(gè)東西,它就應(yīng)該能用。但更重要的是,我知道99.9%的CPU時(shí)間都浪費(fèi)在這些垃圾上。每秒執(zhí)行幾十萬(wàn)指令,結(jié)果毫無(wú)用處。本來(lái)我的電腦應(yīng)該處于極低功耗,風(fēng)扇都不應(yīng)該轉(zhuǎn),因?yàn)槲椰F(xiàn)在干的只不過(guò)是在wordpress里寫(xiě)字而已。
現(xiàn)在的電腦速度飛快,確實(shí)是魔法。你能想到的一切,都能在屏幕刷新一次的1/60秒內(nèi)完成。但是!當(dāng)我在Surface筆記本(幾乎是新的?。┥宵c(diǎn)擊硬盤(pán)圖標(biāo)時(shí),我能看到明顯的延遲,電腦在一點(diǎn)點(diǎn)畫(huà)出用戶界面。這需要很久,我估計(jì)至少有半秒鐘,對(duì)于CPU來(lái)說(shuō)這就像幾十億年那么長(zhǎng)。
如果我沒(méi)猜錯(cuò),因?yàn)殡娔X里有99%的垃圾,99%的電力都被浪費(fèi)了,這已經(jīng)不能用犯罪來(lái)形容了。這些浪費(fèi)的電力都干什么了?我不知道,但看看任務(wù)管理器就知道了:一大堆不知道是什么也不知道在干什么的東西。
我現(xiàn)在只不過(guò)寫(xiě)篇文章,Windows就要運(yùn)行102個(gè)后臺(tái)進(jìn)程。NVidia顯卡有6個(gè)進(jìn)程,一些甚至還有子進(jìn)程。干啥呢?我又沒(méi)玩游戲,對(duì)于顯卡來(lái)說(shuō)我現(xiàn)在干的事兒跟20年前沒(méi)什么區(qū)別,但就是要6個(gè)進(jìn)程。
微軟的Edge瀏覽器也有6個(gè)進(jìn)程,它的Web View還有6個(gè)。我甚至都沒(méi)打開(kāi)Edge??赡苁俏易蛱扉_(kāi)了一張SVG圖,這就出現(xiàn)了12個(gè)毫無(wú)用處的進(jìn)程在那兒浪費(fèi)內(nèi)存和CPU?這簡(jiǎn)直不可理喻。
這就是為什么一切都不能正常工作,為什么一切都很慢,為什么你每年都要買(mǎi)新手機(jī)和新電視,買(mǎi)新的只不過(guò)是為了運(yùn)行更多垃圾程序而已。
我悲觀地認(rèn)為,事情只會(huì)越來(lái)越糟,因?yàn)橄?span id="qsh1b7padf" class="candidate-entity-word" data-gid="13021065">Facebook、Twitter、Reddit這些笨頭笨腦的巨無(wú)霸公司正是現(xiàn)在的趨勢(shì)。每個(gè)公司都有好幾千位“程序員”,使用機(jī)器學(xué)習(xí)從GitHub復(fù)制粘貼這些毫無(wú)用處的垃圾代碼。兩個(gè)數(shù)相加就要使用32個(gè)DLL和16個(gè)Windows服務(wù)還有幾億行代碼。
Twitter有兩千個(gè)程序員。但Tweetdeck偶爾還是無(wú)法加載某個(gè)用戶的時(shí)間線。這個(gè)bug已經(jīng)有四年多了,我估計(jì)沒(méi)人知道為什么,背后的代碼只不過(guò)是一堆復(fù)制粘貼的垃圾。
再說(shuō)Reddit,從鏈接讀取標(biāo)題的功能無(wú)法正確處理&和分號(hào),這都2022年了。估計(jì)他們也有2000多個(gè)程序員,但甚至沒(méi)人會(huì)寫(xiě)文本分析器,所以他們拿錢(qián)是干什么的?
曾經(jīng)CPU和內(nèi)存都有限的那個(gè)時(shí)代,才是編程的黃金時(shí)代;而現(xiàn)在,我們生活在一堆毫無(wú)效率的垃圾里。嗚呼哀哉!