幽默:軟體工業的吐槽和醒悟 - tonsky.me

banq發表於2020-01-02

我已經程式設計了15年了。最近,我們行業對效率,簡單性和卓越性的缺乏開始真正引起我的注意,以至於我對自己的職業和IT感到沮喪。
(banq注:有一個笑話,一位高血壓三高患者複診,內科醫生問他一天喝幾兩酒?他說八兩,內科醫生驚訝:我不是讓只喝二兩嗎?患者回答:你說二兩,外科醫生也說二兩,口腔醫生說二兩,肛腸科說二兩,一共八兩。這個笑話說明科學細分發展的今天,作為終端使用者需要有自己的哲學保護自己利益,小孩的家庭作業也是,在大喊減負的今天,數學老師佈置一小時作業,語文也是,最後四五門課合起來讓孩子作業做到凌晨零點,誰來捍衛自己孩子和自己身體?只有我們自己吧)

橫向類比看:現代汽車的工作效率是當前發動機設計實際可實現的98%。現代建築僅使用足夠的材料來履行其職能,並在指定的一些條件下保持安全。所有平面都收斂到最佳尺寸/形式/負載,並且看起來基本相同。
僅在軟體中,如果程式以可能的效能的1%甚至0.01%執行,這就可以了?每個人似乎都同意。人們常常為效率低下而感到驕傲,例如“為什麼我們要擔心計算機速度足夠快”:

@tveastman:每天執行的Python程式需要1.5秒。我花了六個小時將其重寫為Rust,現在花費了0.06秒。效率的提高意味著我將把時間花在41年24天:-)

您可能已經聽過這個口頭禪:“程式設計師的時間比計算機的時間更昂貴。”這基本上意味著我們正在以前所未有的規模浪費計算機。如果每100公里消耗100升汽車,您會購買嗎?1000升怎麼樣?對於計算機,我們一直都在這樣做。

一切都太慢了
環顧四周:我們的行動式計算機比將人類登上月球的計算機強大數千倍。但是,其他所有網頁都難以在最新的頂級MacBook Pro上保持60fps的流暢滾動。我可以舒適地玩遊戲,觀看4K影片,但不能滾動網頁嗎?那怎麼樣?
由Google編寫的網路應用程式Google Inbox(也在Google的Chrome瀏覽器中執行)需要13秒才能開啟中等大小的電子郵件
Windows 10 更新需要30分鐘。這麼長時間可能會做什麼?足夠的時間足以完全格式化我的SSD驅動器,下載一個新的版本並連續安裝5次。
現代的文字編輯器比42歲的Emacs具有更高的延遲。文字編輯器!有什麼更簡單的?在每次擊鍵時,您要做的就是更新一個很小的矩形區域,現代文字編輯器無法在16ms內完成。會花費很多時間。3D遊戲可以在同一16ms內用數十萬個多邊形填充整個螢幕,還可以處理輸入,重新計算並動態載入/解除安裝資源,這些是怎麼來的?
通常,我們不會獲得具有更多功能的更快的軟體。我們正在獲得速度更快的硬體,而執行速度較慢的軟體具有相同的功能。一切工作都在可能的速度之下。有沒有想過為什麼您的手機需要30到60秒才能啟動?為什麼它不能在一秒鐘內啟動?沒有任意物理限制。我很樂意看到這一點。

一切都是巨大
如果您只是阻止所有廣告,則網路應用的開啟速度最多可以提高10倍。Google懇求大家停止使用AMP計劃,這是一種無需任何技術的技術解決方案,只需一點常識即可。如果刪除膨脹,網路將很快變得瘋狂。您必須多麼聰明才能理解這一點?
沒有應用程式的Android系統將佔用近6 GB的空間。只需想一想這個數字有多大。那裡有什麼高畫質電影?我猜基本上是程式碼:核心,驅動程式。
Windows 95為30MB。今天,我們的網頁比這還要重!Windows 10為4GB,是133倍大。但這是它的133倍嗎?我的意思是,它們在功能上基本相同。是的,我們有Cortana,但我懷疑它需要3970 MB。
安卓中Google的鍵盤應用程式通常會佔用150 MB的空間。在螢幕上繪製30個按鍵的應用程式真的比整個Windows 95複雜五倍嗎?Google應用基本上是Google Web搜尋的一個軟體包,它的大小為350 MB!Google Play服務,我不使用(我不在從中買書,音樂或影片)— 300 MB,只能乾瞪眼,無法刪除。
安裝所有基本(社交,聊天,地圖,計程車,銀行等)應用程式後,所有可用於照片的空間大約為1 GB。那就是沒有遊戲,也沒有音樂!還記得作業系統,應用程式和所有資料都可以放在軟盤上的時候嗎?

一切都爛
3年前,一部16GB的Android手機還不錯。如今,在使用Android 8.1的情況下,它幾乎無法使用,因為每個應用程式的大小至少增加了兩倍,而沒有明顯的原因。沒有其他功能。它們沒有更快或更最佳化。他們看起來沒什麼不同。他們只是…成長?
iPhone 4s是與iOS 5一起釋出的,但幾乎不能執行iOS9。這並不是因為iOS 9如此出色-基本上是相同的。但是他們的新硬體更快,因此他們使軟體變慢。不用擔心,您獲得了令人興奮的新功能,例如……以相同的速度執行相同的應用程式!我不知道。
iOS 11放棄了對32位應用程式的支援。這意味著如果開發人員在iOS 11發行之時不在身邊,或者不願意回去更新一次完美的應用程式,那麼您很可能不會再看到他們的應用程式。

越差越好
我擁有的每臺裝置都會定期以一種或另一種方式發生故障。我的Dell顯示器不時需要硬重啟,因為其中裝有軟體。

定期復位是最好的辦法
Linux 透過設計殺死隨機程式。但是,它是最受歡迎的伺服器端作業系統。
而且我甚至沒有接觸物聯網。到目前為止,我還不確定要新增什麼,這已經超出了笑點。
我想為自己的工作感到自豪。我要交付穩定的工作。為此,我們需要了解我們正在構建和構建的內容,而在內容膨脹中、設計過度的系統中進行這種瞭解是不可能的。

程式設計是一團糟
似乎沒有人對構建高質量,快速,高效,持久,基礎的東西感興趣。即使有效的解決方案已久負盛名,我們仍然面臨著同樣的問題:程式包管理,構建系統,編譯器,語言設計,IDE。
幾乎所有的編譯器,前處理器和後處理器都會為您的構建增加大量的,有時是災難性的時間負擔,而沒有提供相應的實質性收益。
您可能希望程式設計師做出大多數理性的決定,但有時他們做的恰恰相反。例如,即使選擇Hadoop 的速度比在單個桌面上執行相同任務的速度慢,也要選擇Hadoop 。
機器學習和“ AI”在大多數計算機甚至還不夠可靠的時候就將軟體推向了猜測。

@rakhim:當一個應用程式或服務被描述為“基於AI的驅動”或“基於ML”時,我將其理解為“不可靠,不可預測且無法推理行為”。我嘗試避免使用“ AI”,因為我希望計算機與之相反:可靠,可預測,合理。

我們將虛擬機器放入Linux中,然後將Docker放入虛擬機器中,這僅僅是因為沒有人能夠清理大多數程式,語言及其環境所產生的混亂。我們用毯子蓋住狗屎只是為了不對付它。例如,“單一二進位制”仍然是Go的巨大賣點。沒有混亂==成功。
人們可以輕鬆新增過度設計的“完整解決方案”來解決最簡單的問題,而無需考慮成本。這些依賴帶來了其他依賴。
如果沒有重新啟動,程式將無法執行多年。有時甚至連幾天都支撐不了。隨機的事情都可能發生,沒人知道為什麼。
更糟糕的是,沒有人有時間停下來弄清楚發生了什麼。
這些都不是工程。那只是懶惰的程式設計。工程學是對效能,結構,構建極限的深刻理解。將寫得不好的東西與寫得更差的東西結合起來嚴格地反對這一點。要取得進步,我們需要了解我們在做什麼和為什麼做。

我們堅持下去
因此,所有內容只是在先前編寫的幾乎無法工作的程式碼之上新增的一堆幾乎無法工作的程式碼。它的規模和複雜性不斷增長,從而減少了進行更改的機會。
要擁有一個健康的生態系統,您需要返回並重新訪問。您需要偶爾扔掉一些東西,並用更好的東西代替它。
但是誰有時間呢?25年來,我們還沒有看到新的OS核心?因為太簡單了無法重寫?到目前為止,瀏覽器充滿了極端情況和歷史先例,以至於沒有人敢於從頭開始編寫佈局引擎。

當今對開發的定義要麼為火上澆油,要麼:

@sahrizv:
2014年-我們必須採用#microservices來解決所有與巨石有關的問題。
2016年-我們必須採用docker解決微服務的所有問題。
2018年-我們必須採用#kubernetes解決docker的所有問題


或重新發明輪子:

@ dr_c0d3:
2000年:編寫100行XML以“宣告式”配置您的servlet和EJB。
2018年:編寫數百行YAML以“宣告式”配置您的微服務。
至少XML具有模式…


我們被束之高閣,沒有人能拯救我們。

業務不在乎
使用者也不在乎,他們只是期望我們能提供什麼。我們(工程師)說每個Android應用佔用350 MB嗎?好吧,他們會忍受的。我們說我們不能讓他們流暢地滾動嗎?好的,他們將與斷斷續續的手機一起生活。我們說“如果不起作用,請重新啟動”?他們將重新啟動。畢竟,他們別無選擇。
也沒有競爭。每個人都在構建相同的緩慢、不可靠的產品。偶爾的質量提升確實會帶來競爭優勢(iPhone / iOS與其他智慧手機,Chrome與其他瀏覽器),並迫使每個人重新組合,但時間不長。
因此,作為工程師的使命是向全世界展示當今計算機在效能,可靠性,質量,可用性方面的可能,我們工程師必須學習,因為除了我們,沒有其他人向他們展示這是很有可能的。

並不全是壞事
有一些亮點表明,改進最新技術並非不可能。

馬丁·湯普森一直是這樣做(LMAX DisruptorSBEAeron),這些產品令人印象深刻,令人耳目一新的簡單和高效
Raph Levien撰寫的Xi編輯似乎是在牢記正確的原則。

喬納森·布洛(Jonathan Blow)自己開發一種語言,可以在膝上型電腦上每秒編譯50萬行。那是冷編譯,沒有中間快取,沒有增量構建。
您不必天才就可以編寫快速的程式。沒有魔術。唯一需要做的就是不要建立在現代工具鏈上的一堆正確的廢話之上。

更好的世界宣言
我希望提高軟體工程的最新水平,而不僅僅是停滯不前。我不想一遍又一遍地重新發明同樣的東西,每次表現都更差,而且更腫。我希望可以有一個值得相信的目標,一個有價值的最終目標,一個比我們今天擁有的更好的未來,並且我希望有一個擁有相同願景的工程師社群。
 

相關文章