讀 代碼臃腫已成常態 文後心得

代码臃肿已成常态:99% 计算机资源都被浪费掉了

沒人主動提醒,的確很難想像「电脑文件中 99.9% 的代码都没用」。但仔細想想還真的沒錯。

我有一個老筆電,停在 Windows 7 無法升級。我偶爾還會開啟它,說真的執行速度非常快,還會讓久久沒用它的我眼目一新! 它當然不是 SSD,也沒升級過記憶體!

我正在用的桌機得要升級 SSD 與記憶體,否則真的很慢。即使升級後,不少操作還是比老筆電慢。正在用的新筆電更慢了,慢到單單 Windows 登入畫面就要等上五到十分鐘吧,還常常可能因為逾時而登入失敗,還得登第二次。當然它們一開始使用都還是可以的。隨著 Windows 升級,各軟體安裝,就越來越慢。

很多網路站都會附帶討厭的廣告、追蹤等等許多使用者不想要的功能,但我不太認為這些是最主要佔據空間的因素。瀏覽器給網頁執行的權限很有限,並不是下載越多程式就能取得越多的使用者隱私。我認為主因還是大公司,很多瑣碎的要求,很多人一起開發,然後又引用一堆第三方函式庫。開發時間久了,開發人員來來去去,疊床架屋的情況越來越嚴重。每一個環節都沒有太注意空間的耗用,最後累加而成如今的現況。

雖然硬體越來越快容量越大,但軟體越來越肥,速度沒有什麼提升甚至變慢,的確是很大的浪費。不過隨著軟體越來越肥,穩定性倒沒有明顯下降,甚至還有提升 (以前 Windows 經常死當,現在很少見到了)。我覺得有些浪費是有意義的,底下想了一些例子說明。

文中提到 Windows 裡非常多的 process,其中很多都是 Windows 服務。當然有很多用不到的都預設開啟,我是有儘量關閉沒用的。就我所知,以前的服務會有許多個服務合併在一個 process 裡跑的作法。改為拆開獨立服務好像也只是近五到十年才改的。我推測理由是合在一起時,若一個掛掉或被駭入,其他的服務一起會受影響。後來大家普遍記憶體多了,拆開就變得可行了。因此拆開的確是多浪費了記憶體,但卻增加了安全性與穩定性。

Edge 之類瀏覽器也是相同的理由。當然對於沒用它的人來說,綑綁強迫是無意義的浪費。以前 IE 時瀏覽器整個就是一個 process (即使多視窗也是)。若任一網站佔用 CPU 或被駭入,其他網站也會被影響。現在各瀏覽器的各頁籤以及最上層頁籤管理都變成各自拆開的 process 了。

我以前曾經自組 Pentium 電腦,為了額外增加記憶體加快速度,整組花到五萬塊。後來有一陣子 Windows 多年版本沒有越吃越兇,一萬不到的入門文書電腦就很好用,還能用很多年不用換。我記的那段時間因為許多人只買入門等級,也多年不用換,因此 PC 市場萎縮。硬體的研發若沒有龐大的需求支撐,最後進步一定會減慢。所以意思是說,如果沒有如今的浪費,現在電腦/手機等的發展一定會慢好多個世代,AI 相關高 CPU/GPU/空間 耗用的應用可能還沒辦法進入成熟階段。

我在用的程式語言 C#,要不預先安裝 190MB 的 .NET Runtime 安裝檔 (安裝完成後不知又佔多少),要不建立 self-contained 程式,是自帶 runtime 在內,每個程式大約也要幾十 MB。多下載幾個這種程式,重覆的檔案又更多了。除非換更高效的語言如 C/C++ 等,不然 runtime 的空間降不下來。當然自己的程式額外又引用一堆函式庫,裡面甚至包含一堆明顯從未用到的多國語系資源,我也沒刻意想辦法去排除它們。我學過的很多寫程式技巧,都沒有在關心空間耗用的結果。還有很多技巧,會導致耗用更多。

再舉縣市政府 APP 為例。一個 APP 通常包含了一個政府所有部門的功能,通常使用者只用其中少數幾個,其他功能就是白佔空間。但如果把各功能拆開成獨立 APP,這代表使用者要使用幾個功能就要下載幾個 APP,這裡面又有一堆的重覆檔案與程式,反而佔更多。

再舉例,現在 CPU/GPU 的電晶體都數以億計,每一代都翻倍成長。為什麼越來越多? 功能有增加相對的數量嗎? 就我的理解,很多是用空間換取時間,比如說各樣的運算,很多可以由耗時的逐步計算改為直接查表得知,就好像對數表就是事先算好的表,一查即得答案。表越做越大,速度就越提升,但空間使用率卻越低。在空間成本不斷降低的情況下 (電晶體間距越來越小,晶圓大小不變),用空間換取時間是合理的策略。

另外就我所知,為了支援多國語言的 Unicode,包括各類轉換比較規則,佔的空間也非常可觀。但若一開始以精簡考量,只需要支援英文,ASCII 就夠,之後要改 Unicode 其實相當麻煩。很多當年當紅的軟體卡在這兒轉不過去,最後就被新一代 Unicode 軟體取代了。但對只用英文的人,一半的文字空間浪費掉。若再用 UTF-8 之類編碼方案可以節省空間,但增加的轉換步驟又降低執行效率。

說實話,自己的程式要由浪費 99.9% 改進到 80%,可能不用花太多的代價就能達成。但在大家空間都夠用的情況下,我自己都覺得沒動力去做這種沒人會注意到的基礎改善措施。

因為空間成本不高,大家都還付得起,也就是每幾年就得要換電腦/手機。相同的價錢,速度與容量還能翻倍成長,然後再用肥大的軟體把這些成長都吃掉。因此 99.9% 浪費的現況,看來只會持續下去。

假設今天空間成本真的很高,大家一定要斤斤計較的話,不能用高階語言,只能用 C/C++,更極端只能寫組合語言,那開發應用的進度一定會減慢。如果還得要自己想辦法用最精簡的方式,從底層起理解並實作一切的細節,包括繪圖、網路、AI…等,這種人才更難找,開發成本又墊得更高,大家所能享受的應用程式一定會少得多。

現代軟體就是站在肥大巨人的肩膀上,才能達到如今的成果。雖然空間都被吃掉了,但我認為並不是回到原點,而是更多隱性的進步,比如多國語言/無障礙環境 (Accessibility)/安全性/穩定性/延展性/擴充性等。寫軟體的門檻降低,讓更多人能參與,以大量的軟體與服務 (雖然品質沒有高手寫的又快又好,但仍能) 走向吃下世界的目標。

如果想改善,比較有意義的環節我覺得在底層 OS/瀏覽器/語言/平台 層。如果這些底層提供高效又易於擴展的功能,那我可以減少依賴第三方函式庫,函式庫間彼此重覆造輪子的現象也會減輕。各應用之間的重覆大概很難避免了。


發表留言