阻止文明的坍塌:看懂技術的「自我退步」規律_風聞
你相信光吗-爱比丽屋2019-06-16 19:38
來源:機核網 原題:阻止文明倒塌:Jonathan Blow 在莫斯科 DevGAMM 上的演講
在2019年5月17號,莫斯科的 DevGAMM上,Jonathan Blow發表了一個題為『阻止文明倒塌』的長達一小時的奇怪演講。以下為演講的文字整理:
阻止文明倒塌
喬納森布洛,2019年5月在莫斯科
演講從1957年蘇聯發射 Sputnik 上天引發的美蘇太空爭霸談起,回顧了首次衞星發射、首次宇航員上天,以及首次登月的過程。在1962年9月肯尼迪總統在一次國會演講中宣稱我們要在這個十年結束之前實現登月。結果1969年阿波羅11號實現了這個目標。Blow 的要點在於:人類(這裏指美國)從一無所知,到實現登月只用了12年。然而從那時之後,人類的載人航天事業很大程度上停滯,甚至出現了倒退。這是不是很令人遺憾?
Blow 播放了一段後來解密的阿波羅11號現場紀錄片片段,那種震撼的感覺難以名狀,只有看的人能瞭解其中直觀的『退步感』。
然後 Blow 播放了一段 Elon Musk 的 TED 訪談,其中 Elon 指出:我們一定要意識到:不同於可持續能源的未來是必然的,Spacefare civilization(多星球文明)絕對不是必然會發生的(它需要巨大的努力)。1969年人類可以登月,然後人類只能用航天飛機把人送到近地軌道。然後航天飛機退役,近地軌道也沒法送上去了——連起來看,趨勢是向着0倒退。這和人們對於“科技當然顯然必然自動地向前進步”這樣的信念相違背。
Elon 認為,正好相反,科技在不付出巨大努力的情況下,是逐漸倒退的。
從古埃及的後人忘記金字塔,到古羅馬人忘記如何建造羅馬水道。
Elon 的火箭創業公司則非常成功,他們的目標是2024年重新實現載人登月。Blow 接下來給出了幾個科技倒退的實例:
第一個是 Lycurgus Cup,公元300年。從正面看它的反光是青色的,透光來看,則呈現為紅色。原因是其銀和金的顆粒體積非常小,小到50-70納米,如此之小以至於物理放大鏡看不見它們,想觀測需要用電子顯微鏡。然後西羅馬帝國覆滅,後人忘記了這個工藝。
很多人認為這就是扯淡,當時的人並不知道其任何原理只是誤打誤撞做出了這些東西。Blow 則認為有如此觀點的人顯然沒有用心親手打磨過任何東西,否則他們一定會明白,達到這樣水平的結果,是不可能通過偶然和運氣的,對於工藝的掌握必然在不斷迭代過程中達到了非常高的水平,它才有任何可能出現。比如這個圖案中人的身體的肉紅色,肯定是費勁千辛萬苦不斷改進實現出來的。這就是一種材料科學。
然後 Blow 提到了拜占庭的噴火筒。拜占庭的戰船上安裝了這種金屬噴管,噴出某種成分的“水撲不滅”的有機物燃燒導致的火焰,焚燬敵人船隻。這是拜占庭帝國的國家機密,它在帝國滅亡之前就被遺忘,原因不明,具體實現方式已經不可考證。
第三個例子是機械日曆,一種安提凱希拉裝置(Antikythera Mechanism),1901年於希臘安提凱特拉島上的一艘古船殘骸中被發現的隨船沉沒2100餘年的鐘形裝置。這個機械日曆的實際模型被複原為一段動畫(自己看視頻,語言無法描述),它的精密程度是高檔機械手錶的範疇。它的存在意味着背後多麼複雜的一整套製造能力呢?
這樣的例子還有很多,就不説了,Blow 這時候放了地動儀的圖片。要點是:在人類歷史上,傑出的科技被完全遺忘,這件事經常發生。當代也一樣。
然後 Blow 給出的例子是 Bob Colwell,早期英特爾的首席芯片架構師,在計算機發展初期的時候接受採訪的片段內容,背景是他們發現合作的零部件製造商TI(德州儀器公司)送來的產品不能穩定使用,質量殘次。
Bob 去找 TI 質詢,本來以為對方會説“那是你們不知道怎麼使用,我們的產品是好的”,實際對方的答覆是:“是,我們知道,我看看你的清單。哦,我們還有更多你們不知道的(不好使的產品)。”實際情況是,TI 沒有比任何其他競爭對手更差,摩托羅拉、Fairchild 也一樣。這些硅製品讓英特爾的芯片研發停滯不前,為何會如此?TI的人回答道:“第一代 TTL(邏輯門電路)是那幫鬍子花白的老頭子做的,他們知道其中的道理;現在的工程師都是毛頭小子,學校畢業過來搞生產,他們不知道內部組裝的改變,會導致感應峯(inductive spikes)。”這裏的spike就是指每一個點的電壓變化時,都會產生磁場,而磁場變化的相互干擾,沒有被設計者納入考慮,因為他們不理解。
這就是科技退步的原因。代際之間的交流和傳承需要巨大的努力,這過程中有損失。如果代際的傳承失敗,文明就滅亡。
接下來 Blow 給出了歷史中文明滅亡的實例,來自於 Eric Clive 的一個演講,題目是《公元前1700年的文明滅亡》,具體來説是青銅器時代晚期,愛琴海,古埃及,塞浦路斯,邁錫尼,赫梯,古巴比倫等。這一圈圍繞在美索不達米亞平原和地中海一帶的文明曾經形成了一個非常複雜的貿易網絡。在下圖中,每個節點是一個文明,不是每一個都能和每一個貿易,但通過中間節點,所有貿易都達到非常優化的效率。
這一點非常重要,因為青銅作為國防和生產的重要資料,非常難以製造。你需要用錫和銅一起生產。銅產地比較少,比如塞浦路斯島。而錫則更難找,而且離銅產地非常遠,比如阿富汗。而這些文明需要把它們運到一起以生產青銅。
而這些文明的滅亡至今沒有確切原因,有人説是自然環境惡化導致互相攻擊,貿易變成戰爭。它們滅亡到什麼程度呢,不僅是國家不存在了,城市也消失了,語言和文化也消失了。刻在石碑上的文字大多數至今我們不能翻譯。
Blow 的要點是:軟件正在倒退,而人類空前依賴軟件。儘管,這和我們置身其中的人的觀感是相反的。波音飛機掉下來的主要原因就是軟件問題(編者不能同意)。文明衰退的速度如果很慢,我們能意識到這個衰退麼?
這裏 Blow 給出了他對於“軟件明顯在蓬勃發展”之直觀感受的解釋:軟件正在享受硬件能力提升的紅利,它只是“看上去”蓬勃發展而已。
機器學習是最明顯的例子。一方面,它在二十年前不能存在主要是因為硬件性能無法支持而已。另一方面,它只是人類依賴着的軟件世界中極小極小的部分。屬於軟件的進步已經很長時間停滯。比如,我們使用軟件給自己AI換臉成明星的樣子,或者配上豬耳朵,這個有趣的部分,只佔這個app極小極小的部分,而這個部分非常簡單,另外的極大部分卻極度複雜,包括把你的臉加載到屏幕上,以及處理你的點擊,等等。出問題的是這些部分。人工智能的局部成就,沒法和軟件世界整體的退化的巨大慣性抗衡。
最明顯的跡象,就是“我們已經不指望軟件能長期穩定工作了。”我們的標準一降再降,還能降到多低?降低到哪裏會出大問題?
接下來 Blow 瘋狂吐槽了十分鐘,關於電腦上一切軟件都經常 bug,以至於用户對於一切軟件“重啓試試”成為不假思索的操作。包括 Emacs 的問題、Visual Studio 不能處理最最簡單的指令,只能連續報錯,微軟 Word 的字符換行 bug 二十年後仍然沒有消滅,像幽靈一樣此起彼伏;於是他為了緩解自己的憤怒想打遊戲,打開 Epic Store 和 Steam 又連續遇到 bug;於是他關掉遊戲客户端去看 CS 直播,發現 CS 直播電競比賽裏全程有一個多餘的名為“未定義”的 bug 玩家出現在地圖裏,直到比賽結束;然後他進入俄羅斯簽證申請頁面,被死活不能通過,且不能刷新的手機號驗證腳本逼得只能刷新整個頁面重新填寫申請;然後他來到莫斯科住進酒店,他的房間的座機有5%的概率會空調開關觸發響鈴……等等。編者這裏就不贅述了。
這讓90年代電腦銷售的一個常見推銷語“五個9”(指,本設備可以99.999%時間穩定運行)成為今日的諷刺。Blow的電腦連兩個9都沒有。
對於這個問題,軟件行業的普遍答案是:市場不會為更好的穩定性買單。Blow則認為:對於一個從未提供出足夠穩健的產品的行業,為什麼會有人會相信它『能』?
接下來,Blow 從正面描述了軟件的結構:抽象層次的序列。機器語言、彙編語言、Fortran/C/C++、C#/Haskell/Javascript……在這個序列裏,絕大多數工程師在最高抽象層次進行工作,因為這是“聰明、省力、高效率的”。在這個抽象從低到高的序列裏的某些位置,問題就出在這裏。Blow 認為,全行業的高抽象層次工作,多數人的“高效率”的另一面,是失去(或者從未擁有過)能力。考慮 Facebook 作為一個軟件的功能增加,和它要多僱傭的成千上萬的工程師,二者相除得到的平均每人的價值創造是趨近於零的。這和“抽象層次越高效率越高”明顯矛盾。
Blow 給出的對比,是 UNIX 發明者 Ken Thompson 的一個演講片段。他回憶道他趁老婆孩子出去度假,用了三個禮拜寫了三個東西(編輯器、編譯器、軟硬件交互層或者叫操作系統),做出了 UNIX。現場爆發笑聲和掌聲——當今程序員可沒有這種效率。而 Blow 認為這是個悲劇,它並不好笑。今天軟件顯沒有在進步,它的魯棒性和生產力都在衰退。
Blow 從圖形計算的角度給出了一些“最最基本的,你不能直接做的事情”,其中一個編者能聽懂的例子是,把一個程序拷貝到另一個設備(安裝是個複雜過程)——而這並不是因為 CPU,CPU 不能背鍋因為今天各類設備的 CPU 一致性已經相當好。安裝程序不是為了對接 CPU,而是為了解決操作系統層面不可思議之多的兼容問題,其絕大部分是我們不想打交道的。操作系統本來是給 CPU 賦予能力,但同時你也可以説它防止着 CPU 具備很多能力。在編程過程中,你絕大多數時間在處理那些,你很難理解、也不可能預料到的各種和你的設計思路沒有關係的問題。
更可怕的是,你不能直接編寫一個獨立程序進行編譯和 linking。微軟為了能讓人這麼做,專門設計了一個 vswhere 的軟件。
現在有一種叫做LSP的東西,開源的語言服務器協定。在Blow看來它基本上是一種更復雜、更費勁的編寫和調用庫的方式,而其滿足的需求都是非常基本的操作,比如在你的編輯器裏臨時起意,查看一個變量的特徵或者類型,LSP給你提供一個工具條,或者鼠標點擊直接查詢的功能。為了實現這個,你需要一個標準化服務跑在服務器上,好讓你的編輯器和服務器用socket交互——為了使用方便,你把本地的、單一的編程工作置於分佈式的系統之中。
這樣的做法推而廣之,你依賴了越來越多的庫,庫又依賴了越來越多的庫,關鍵是這些庫/服務本身可能是在變化的、並且沒有被中心化地存儲和管理,這樣一來我們就陷入了無窮無盡的debug的、重啓服務的、互相同步的……我們自身所不能掌握的問題海洋之中。
現在大家竟然在積極主動建設着這樣一個東西。程序員們忙着把簡單事情複雜化的同時……
電腦遊戲卻變得連最基本的事情都很難實現了。比如遊戲現在很難保持全屏, 經常跳出為窗口。再比如,辛辛苦苦做的遊戲,很難穩定在一個幀數上跑,無論你多努力也不行。Allen(全稱聽不清楚)在GDC上介紹了他的一篇論文講述了這個簡單的能力我們現在無法具備的原因。
複雜性的提高,加速了知識的丟失:
1、知識總量更多,我們就讓每個人知道的比例變得更小來應對。
每個人對全局的把握一弱再弱,既難以傳承知識,也難以做好自己的工作。
2、『深知識』被『瑣碎信息』替代。
典型的深知識,如理解Cache Coherency(緩存一致性,指保留在高速緩存中的共享資源,保持數據一致性的機制),可以讓人優化程序在多個處理器上跑得更快。典型的瑣碎信息,如『這個Unity裏的小圖標不知道為啥不顯示了,請教老師傅得知,是某個深藏不露的菜單裏看似沒有關聯的一個開關關閉了導致的,打開就好了,過了一陣子它不知道為何又關閉了,總之,編譯之前一定要記得檢查那開關打開沒有』。後者作為知識,往往幾個月後隨着Unity版本更新就完全作廢,作為程序員要花很多腦力學習這種速朽的所謂知識,這件事情非常缺(offensive)。
3、好信息被噪音淹沒。
症狀是谷歌越來越難用,你的問題越複雜,網上搜來搜去看到的答案就越大概率是錯的,或者只是浪費你的時間。
Blow認為,顯而易見的是,複雜性越高,我們承受災難,或者體制性腐化(參考上文東羅馬帝國),的能力就越差。而現在大家似乎相信,我們能承擔的複雜性上限,是無限的。想象現在大公司裏那種極少數能夠透徹理解整個系統的工程師離退休之後後繼無人、且很難把整套知識傳遞給年輕員工的情況,答案已經很明顯了。
這一切和遊戲有什麼關係呢?
曾經的遊戲,是關於如何榨乾性能,將機器的潛力推至極限的。推至極限,要求我們透徹理解機器本身,這就自然導致我們傾向於做出非常魯棒的程序。
今天整個行業轉向Unity和Unreal。自己寫引擎的人越來越少。一整代程序員從學習到工作,一直在寫支離破碎的C#片段,放在Unity的這裏那裏,從來沒寫過系統性的,或者底層的程序。這本身倒沒什麼,它縮短開發時間,提高個人效率,縮短遊戲開發時間。但這意味着放棄,對其他能力的放棄,對整體性知識的放棄。
Blow説,割裂性的分工沒問題,但是如果所有人都這樣分工,那麼沒有任何人會做這之外的事情了。Unity和Unreal又是怎麼來的呢?它們生長於這樣一個環境:所有的遊戲公司都在自己寫引擎,專門的引擎公司就從這些遊戲公司裏僱人過來,做出瞭如今的壟斷性引擎。現在沒有這樣的環境,徹底沒有那種人了的話,Unity去哪裏僱人?首先的結果,是他們徹底斷絕了新引擎作為競爭對手的湧現可能。然後,這幾個大引擎怎麼繼續維護和發展,也成了問題,自身開始衰退,也是很有可能的。
遊戲開發者社羣的情況很像阿西莫夫的《基地》:我們有一羣人知道怎麼用電腦編程、也有一羣人精通嵌入式系統/高性能計算這些事。當很多程序敗壞、丟失、難以維護的時候,我們這羣人的知識可以重建它們——但我(Blow)真的不確定,我們是否有足夠多的底層人才,以及對底層充分了解的高層人才,能做好系統底層的工作。也許,我們需要一個新的『基地』(foundation,也有基礎的意思)。不好意思,劇透了。
説回到青銅時代的文明失落,無數歷史顯示了一種現象:當只有精英階層可以讀和寫的時候,很多能力無法普及,文明變得脆弱——普通人也主觀上不想學習那些。今天的我們,幾乎沒有人能理解自己的程序跑着的時候,CPU里正在發生什麼。這就是脆弱。
如果青銅器時代那個程度的知識都會失落,那面對我們現在如此複雜的系統,我們怎麼能相信它的存續和發展?各種各樣的生存壓力隨時可能爆發,考驗我們的軟件世界。比如氣候變遷。比如國際爭端,比如一些國家切斷國際互聯網了,比如中國不給我們加工芯片了。別笑,現在有些國家的程序員連上stackoverflow複製粘貼代碼都費勁。這些事情單獨來看肯定都不至於傷害我們的文明,系統複雜到今天程度,抗折騰能力會很差。
正如Elon Musk所言,技術會自然地退步。我們要警惕,要對抗,就一定要在每一個層級上簡化:硬件、操作系統、庫、應用層面的代碼、網絡、編譯、debug、內容分發、人機交互。而這一切又完全可以如此簡單,因為它們的現狀如此荒謬!
我們需要的只是『意願』(will)和『品位』(taste)而已!
大家都充分認識到複雜之荒謬,簡單之美——簡化可以讓事情變得更好。
退一萬步講,也許你認為軟件不會讓文明倒塌。沒關係,咱們就只從自身利益出發——所有程序員都每天氣呼呼的工作着,因為他們知道自己大量的時間精力用在沒有意義的荒唐事上,而不是真正有趣的,創造性的事上。如果我們不改變做事的方式,未來的程序員工作會更加庸俗不堪,就跟沒有SpaceX時候的美國航天事業一樣。
再退一步,假設你只是獨立遊戲開發者,你可能覺得,自己無力改變任何事情,只要忍幾個月,把遊戲做完就好了,畢竟重構、重寫需要大量的時間——我想告訴你這種想法永遠是錯誤的,因為我們永遠低估了自己做遊戲需要的時間,你以為的五個月,大概率實際是幾年。糟糕的工作方式讓你付出的代價,比你以為的,要大得多,長得多。也許那拖延的幾年時間,就是拜覆雜系統所賜。反過來,如果你積極應戰,簡化架構和代碼,興許很值得。聽起來像是又基礎又無聊的建議,但我要大膽斷言——我們大多數人甚至都不太知道怎麼做這件事了。
最後Blow給大家提供了三個補充閲讀/觀看的資料,更新網友搬運的地址:
Casey Muratori,『三千萬行代碼難題』。鏈接在此
Samo Burja,『文明:體制、知識與未來』。鏈接在此
Eric Cline,『公元前1177:文明倒塌時』鏈接在此
本演講的視頻:鏈接在此


















