潘愛民:計(jì)算機(jī)程序的演進(jìn)——我的程序人生三十年(計(jì)算機(jī)程序發(fā)展史)
【CSDN 編者按】大神潘愛民,編程三十余年,從學(xué)生時(shí)代興趣出發(fā)進(jìn)入計(jì)算機(jī)世界,經(jīng)歷過北大教學(xué)科研、微軟亞研系統(tǒng)研究,盛大、阿里的工業(yè)研發(fā),走上創(chuàng)業(yè)之路,創(chuàng)立指令集進(jìn)行系統(tǒng)軟件的研發(fā)及落地場景應(yīng)用?!缎鲁绦騿T004》,一起走進(jìn)潘愛民的程序人生,從中可以一窺過去三十年計(jì)算機(jī)程序的演進(jìn),也可以通過他的視角,看透未來十年的發(fā)展。面向未來,潘愛民說,在中國寫代碼的人數(shù)將在兩到三年后達(dá)到高峰,更將誕生基于中文的編程語言。
作者 | 潘愛民 責(zé)編 | 唐小引
出品 | 《新程序員》編輯部
我在 1985 年第一次接觸到計(jì)算機(jī)程序,盡管那只是娃娃機(jī)上的一些作業(yè)型的 BASIC 程序,但我依然感受到了編程的樂趣,并且樂此不疲地編寫各種花樣程序。三十多年過去,計(jì)算機(jī)程序于我而言已經(jīng)成為一種思考方式,無論是應(yīng)用層的功能,還是系統(tǒng)層的能力,或者是背后的數(shù)據(jù)處理邏輯,都轉(zhuǎn)化成了機(jī)器的指令。
我有幸完整地經(jīng)歷了從 PC 時(shí)代,到互聯(lián)網(wǎng)的興起與發(fā)展,再到移動(dòng)互聯(lián)網(wǎng),又到萬物互聯(lián)時(shí)代和產(chǎn)業(yè)數(shù)字化的發(fā)展歷程。這三十多年,既是軟件技術(shù)和產(chǎn)業(yè)的發(fā)展期,也是我個(gè)人的職業(yè)生涯和程序人生。本文介紹我認(rèn)知中的計(jì)算機(jī)程序的演進(jìn),正好是程序人生三十年的一篇小結(jié)。
潘愛民(攝于 1999 年北大工作期間)
軟件棧 —— 從源代碼到機(jī)器指令
通常而言,計(jì)算機(jī)程序是指軟件中的代碼部分。軟件涵蓋的內(nèi)容要多得多,比如還包括數(shù)據(jù)、文檔,甚至有硬件(比如加密狗),還可能有相應(yīng)的服務(wù)等。計(jì)算機(jī)程序則是指一組指示計(jì)算機(jī)或其他具有信息處理能力的裝置執(zhí)行各種動(dòng)作的指令。計(jì)算機(jī)程序既可以是機(jī)器指令的形式(由二進(jìn)制數(shù) 0 和 1 構(gòu)成的序列,人難以解讀),也可以是人編寫的原始代碼的形式(通常由程序員來解讀和維護(hù))。
過去三十多年軟件技術(shù)的發(fā)展,可以從程序編寫方式和運(yùn)行方式來看待其中的變化。典型的有以下一些方式:
1. 代碼直譯執(zhí)行
早期的程序編寫方式是,程序員按照機(jī)器執(zhí)行指令的思路來控制一臺(tái)機(jī)器。最典型的是用 C 語言來編寫程序,幾乎每一行代碼都可以對應(yīng)到一個(gè)指令序列,甚至可以在 C 語言源代碼中直接嵌入匯編指令(機(jī)器指令的字符描述方式)。
2. 代碼解釋執(zhí)行
原始的代碼被解釋成一種中間抽象語言描述,再進(jìn)一步轉(zhuǎn)換成機(jī)器語言被執(zhí)行。以 Java 語言的哲學(xué)思想“一次編寫,到處運(yùn)行(Write once, run anywhere.)”為基礎(chǔ),用 Java 語言編寫的程序天然具有跨平臺(tái)特性。程序員面對的是一個(gè)抽象的計(jì)算環(huán)境,所編寫的 Java 代碼是如何被執(zhí)行的,這中間有一個(gè)間接層。
3. 虛擬機(jī)和容器化
程序員編寫的代碼最終由機(jī)器上的 CPU 來執(zhí)行,隨著計(jì)算機(jī)硬件能力越來越強(qiáng),一臺(tái)機(jī)器可以被虛擬成多臺(tái)計(jì)算機(jī)。源代碼被編譯或者解釋出來的機(jī)器代碼,又進(jìn)一步被映射成一個(gè)指令序列。云計(jì)算的發(fā)展和普及讓這種程序運(yùn)行方式變成了主流。容器是虛擬機(jī)的一種輕量形式,其思想本質(zhì)上是一致的。
4. 前后端分離
數(shù)據(jù)顯示用 Web 技術(shù)來完成,后端處理用合適的編程語言來完成,兩者之間通過符合 Web 標(biāo)準(zhǔn)的 API 進(jìn)行通信。將可視化和用戶交互部分單獨(dú)劃出來,而不是跟業(yè)務(wù)邏輯耦合在一起,這是前后端分離的核心思想。
以上四種方式,前三種側(cè)重于計(jì)算機(jī)程序在同一臺(tái)機(jī)器上被引入了一個(gè)或者多個(gè)中間層,導(dǎo)致源代碼被多次解釋或映射才到達(dá)物理 CPU;第四種方式則是從橫向跨機(jī)器的角度將可視化和用戶交互部分與業(yè)務(wù)邏輯(特別是數(shù)據(jù)處理)解耦。這些變化與軟件產(chǎn)業(yè)的發(fā)展息息相關(guān)。下面幾點(diǎn)值得一提。
-
從源代碼到對應(yīng)的機(jī)器指令,路徑越來越不清晰。在物理機(jī)器環(huán)境下,源代碼與 CPU 之間隔了一層或多層;在云計(jì)算環(huán)境下,程序員甚至完全不知道物理上代碼是如何被執(zhí)行的。這種變化趨勢導(dǎo)致了程序調(diào)試和性能優(yōu)化變得更加復(fù)雜和困難。
當(dāng)程序運(yùn)行時(shí),業(yè)務(wù)功能的代碼路徑變長,甚至分布到不同的計(jì)算環(huán)境中。一個(gè)業(yè)務(wù)邏輯被觸發(fā)的地點(diǎn),與它被處理的地點(diǎn),之間可能跨了執(zhí)行環(huán)境,甚至跨了網(wǎng)絡(luò)。這對于程序員的復(fù)合能力要求更高,單一技術(shù)棧的程序員將面臨很大的挑戰(zhàn)。
這些編程方式是融合的,有各自的適應(yīng)場景。隨著互聯(lián)網(wǎng)絡(luò)的不斷發(fā)展,并深入到各個(gè)產(chǎn)業(yè)中,混合編程方式已經(jīng)成為軟件行業(yè)的主流。對于軟件開發(fā)人員,我們需要在深度和廣度上并進(jìn):所謂深度,是指對源代碼往下一層遞進(jìn)執(zhí)行的理解;所謂廣度,是指對執(zhí)行鏈從一個(gè)執(zhí)行環(huán)境到另一個(gè)執(zhí)行環(huán)境遷移過程的理解。
技術(shù)的進(jìn)步是產(chǎn)業(yè)發(fā)展的內(nèi)在動(dòng)力,云計(jì)算得益于硬件的極大進(jìn)步以及虛擬化技術(shù)的成熟。反過來,產(chǎn)業(yè)的發(fā)展又帶動(dòng)了軟件從業(yè)人員的大規(guī)模擴(kuò)大。中國的程序員有數(shù)百萬,甚至按有的統(tǒng)計(jì)途徑達(dá)到了上千萬。這些編程方式的發(fā)展與軟件產(chǎn)業(yè)的效率有極大的關(guān)系。新的軟件技術(shù)進(jìn)步,有可能成倍地提高產(chǎn)業(yè)效率,進(jìn)而又可能導(dǎo)致大量的從業(yè)人員需要進(jìn)行技術(shù)變遷。
我始終認(rèn)為,程序員寫代碼是一種創(chuàng)造活動(dòng),這是程序員職業(yè)的神圣之處。理想的情況是,程序員所寫的代碼都是創(chuàng)造性的,并且是高價(jià)值的,是機(jī)器人和人工智能所無法企及的。否則的話,這些工作遲早會(huì)被技術(shù)的革新取代。如果程序員編寫的代碼只是一些定式化的重復(fù),或者可以用相對簡單的形式化來描述,那么按如今的技術(shù)演進(jìn),這些代碼可以不用人來編寫了。這是目前很多低代碼或零代碼開發(fā)平臺(tái)正在努力的目標(biāo),也導(dǎo)致了這樣一個(gè)趨勢:寫工具是非常有價(jià)值的,而不依賴于工具來寫大量邏輯的工作是價(jià)值有限的。
研究生期間在宿舍寫代碼
在我職業(yè)生涯的前半段,我一直信奉“用二進(jìn)制的方式來理解程序或系統(tǒng)”,為每一個(gè)功能或任務(wù)都揣摩底層的指令序列。隨著程序或系統(tǒng)的復(fù)雜性增加、云計(jì)算及前后端分離模式的普及,我們越來越無法做到精細(xì)化地用二進(jìn)制方式來理解它們了。在這種情況下,對軟件架構(gòu)的把握變得越來越重要,機(jī)緣巧合之下我實(shí)現(xiàn)了從系統(tǒng)程序員到軟件架構(gòu)師的升級。
網(wǎng)絡(luò) —— 無處不在的連接
網(wǎng)絡(luò)的發(fā)展改變了我們的生活,這是過去將近三十年人類社會(huì)最大的變化之一。網(wǎng)絡(luò)也同樣改變了計(jì)算機(jī)程序的運(yùn)行方式,甚至改變了編程的思想。我們首先看一下網(wǎng)絡(luò)本身的演變:
-
初期的網(wǎng)絡(luò)是在機(jī)房環(huán)境或者辦公環(huán)境中使用的,網(wǎng)絡(luò)的物理形態(tài)非常直觀,因?yàn)榇蠖鄶?shù)情況下每臺(tái)機(jī)器都拖著一根線。常用的網(wǎng)絡(luò)功能都通過專門的應(yīng)用程序來完成,比如電子郵件程序、瀏覽器、文件傳輸工具等。網(wǎng)絡(luò)功能的程序編寫屬于高級編程技術(shù)。
網(wǎng)絡(luò)開始普及,家庭和很多公共場所都有了網(wǎng)絡(luò),連接的方式可以是一根線,也可以是 Wi-Fi 無線。在這樣的條件下,越來越多的程序加上了網(wǎng)絡(luò)的能力,網(wǎng)絡(luò)編程逐漸普及,但仍然屬于高級編程技術(shù)。不過,通過很多中間件,編程門檻已經(jīng)降低。
移動(dòng)數(shù)據(jù)網(wǎng)絡(luò)的普及。網(wǎng)絡(luò)的進(jìn)步是全面的,包括硬件基礎(chǔ)設(shè)施和軟件棧。移動(dòng)數(shù)據(jù)網(wǎng)絡(luò)相對不穩(wěn)定,這對于軟件編程是一個(gè)挑戰(zhàn),其復(fù)雜性來自于兩個(gè)方面:對網(wǎng)絡(luò)異常的處理,以及網(wǎng)絡(luò)連接涉及到兩方協(xié)同。然而,得益于移動(dòng)操作系統(tǒng)原生提供的網(wǎng)絡(luò)基礎(chǔ)功能,網(wǎng)絡(luò)編程的門檻被大大降低。
其次,網(wǎng)絡(luò)的思想與操作系統(tǒng)密不可分,兩者的演進(jìn)更是緊密關(guān)聯(lián)。網(wǎng)絡(luò)的核心哲學(xué)思想是協(xié)議分層,每一層的功能實(shí)現(xiàn)只依賴于下一層提供的語義,同時(shí)也為上一層提供標(biāo)準(zhǔn)或約定的語義。操作系統(tǒng)也有類似的分層結(jié)構(gòu),層次越往上,離硬件越遠(yuǎn);越往上,編程的門檻越低。網(wǎng)絡(luò)的軟件棧大部分位于操作系統(tǒng)中,相對應(yīng)地,因網(wǎng)絡(luò)帶來的復(fù)雜性大部分由操作系統(tǒng)消化掉了,因此應(yīng)用程序的編寫并不顯著地變得更加困難。譬如,移動(dòng)數(shù)據(jù)網(wǎng)絡(luò)帶來的復(fù)雜性,絕大部分由移動(dòng)操作系統(tǒng)處理了,它對上面提供的應(yīng)用開發(fā)框架中并沒有暴露出移動(dòng)數(shù)據(jù)網(wǎng)絡(luò)環(huán)境的復(fù)雜性。
然而,網(wǎng)絡(luò)本身對于應(yīng)用程序的編寫還是有極大影響的,從軟件設(shè)計(jì)到代碼編寫都有深遠(yuǎn)的影響,以下是一些顯著的變化點(diǎn)。
-
網(wǎng)絡(luò)編程最基礎(chǔ)的模式是異步編程,以及對異常的處理和恢復(fù)。TCP 和 UDP 不僅是兩個(gè)傳輸協(xié)議,更是兩種編程思想。它們指導(dǎo)我們?nèi)绾卧O(shè)計(jì)和編寫服務(wù)器程序和客戶程序。
對于在網(wǎng)絡(luò)環(huán)境下運(yùn)行的程序,我們編寫的可能只是半個(gè)程序。另外半個(gè)程序可能在完全不熟識的人手里進(jìn)行開發(fā),可能在地球的另一側(cè),甚至不在地球上。我們需要遵守網(wǎng)絡(luò)雙方的約定、遵守對方的規(guī)范,或者要有足夠的靈活性來應(yīng)對可能的意外。
網(wǎng)絡(luò)功能容易遭受性能和體驗(yàn)的問題。網(wǎng)絡(luò)往往是一個(gè)共享資源,所以它的不穩(wěn)定通常是可以預(yù)料的,編寫網(wǎng)絡(luò)功能的時(shí)候若處理得好,就有可能化解掉不穩(wěn)定的因素;若處理不恰當(dāng),就會(huì)造成性能極差,乃至體驗(yàn)極差,甚至進(jìn)程死鎖或崩潰等。從這個(gè)角度而言,網(wǎng)絡(luò)編程總是有優(yōu)化改進(jìn)的空間。
網(wǎng)絡(luò)的不穩(wěn)定帶來了不確定性,導(dǎo)致網(wǎng)絡(luò)程序的診斷變得困難。一方面,程序的網(wǎng)絡(luò)環(huán)境可能會(huì)有抖動(dòng),導(dǎo)致網(wǎng)絡(luò)行為可能無法重現(xiàn),從而增加了診斷難度;另一方面,網(wǎng)絡(luò)程序可能運(yùn)行在物理上不可達(dá)的環(huán)境(比如云主機(jī))中,這要求程序員對網(wǎng)絡(luò)環(huán)境的理解要更加全面,否則難以從現(xiàn)象或錯(cuò)誤代碼來分析問題的根源。
計(jì)算機(jī)網(wǎng)絡(luò)經(jīng)歷了大量的技術(shù)擇優(yōu)和淘汰,今天我們享受到的穩(wěn)定網(wǎng)絡(luò)和良好的網(wǎng)絡(luò)應(yīng)用程序是歷史沉淀的結(jié)果。硬件上,我們的網(wǎng)絡(luò)越來越穩(wěn)定,無線網(wǎng)絡(luò)的基站(或訪問點(diǎn))之間可以做到無縫切換;軟件上,操作系統(tǒng)解決了大量的網(wǎng)絡(luò)復(fù)雜性問題,留給應(yīng)用程序的是相對容易實(shí)現(xiàn)的處理邏輯,比如方便處理的 HTTP 協(xié)議、無狀態(tài)的遠(yuǎn)程請求、自動(dòng)的離線緩存等等。在移動(dòng)數(shù)據(jù)網(wǎng)絡(luò)的早期,很多應(yīng)用程序一遇到網(wǎng)絡(luò)不穩(wěn)定,就出現(xiàn)白屏、不響應(yīng),為了改善用戶體驗(yàn),應(yīng)用開發(fā)人員需要編寫大量的代碼。隨著移動(dòng)數(shù)據(jù)網(wǎng)絡(luò)的普及和穩(wěn)定,以及移動(dòng)操作系統(tǒng)的成熟,這一類應(yīng)用代碼已經(jīng)大大減少了。
隨著移動(dòng)互聯(lián)網(wǎng)的發(fā)展,我們又邁進(jìn)了萬物互聯(lián)時(shí)代,產(chǎn)業(yè)數(shù)字化如火如荼地進(jìn)行。網(wǎng)絡(luò)上連接的已經(jīng)不再限于計(jì)算機(jī)或者個(gè)人設(shè)備,越來越多各種各樣的設(shè)備都連接到互聯(lián)網(wǎng)上。網(wǎng)絡(luò)技術(shù)和操作系統(tǒng)都面臨一次升級,從概念到功能外延都在發(fā)生變化。我有幸在從業(yè)這么多年以后又趕上一次技術(shù)浪潮。在這一輪技術(shù)大升級中,面向設(shè)備連接的操作系統(tǒng)應(yīng)運(yùn)而生,因而我在 2018 年創(chuàng)立了指令集公司,專門從事物聯(lián)網(wǎng)操作系統(tǒng)的研發(fā)和商業(yè)化。
人工智能 —— 從模擬智能到超越人類智能
人工智能的發(fā)展代表了人類使用計(jì)算的一種追求。計(jì)算是一種能力,可以做很多事情,包括科學(xué)計(jì)算和事務(wù)型的任務(wù)等;其中人工智能的任務(wù)是指,讓機(jī)器通過計(jì)算,可以像人類一樣擁有智能。自從計(jì)算機(jī)誕生以來,人工智能的發(fā)展經(jīng)歷了起起落落,但過去三十年間,人工智能學(xué)科總體上一直是在向前發(fā)展的,下面是人工智能領(lǐng)域的一些典型事件:
-
深藍(lán)計(jì)算機(jī)(IBM 制造),1997 年,深藍(lán)擊敗人類象棋冠軍卡斯帕羅夫。
仿生機(jī)器人“大狗”(波士頓動(dòng)力學(xué)工程公司研制),2005 年,可以四條腿行走。
阿爾法圍棋(AlphaGo,Google 研發(fā)),2016 年,擊敗人類圍棋冠軍李世石。
人臉識別技術(shù)應(yīng)用于移動(dòng) App,例如,2015 年馬云在 CeBIT(德國)展會(huì)上演示了刷臉支付。
AlphaFold/AlphaFold2(Google 研發(fā)),2020/2021 年,基本上攻克了困擾人類科學(xué)家已經(jīng)很久的預(yù)測蛋白質(zhì)折疊結(jié)構(gòu)的問題。
此外,最近 10 年來,大多數(shù)汽車制造企業(yè)(無論是傳統(tǒng)車企,還是新勢力造車企業(yè))以及一些互聯(lián)網(wǎng)科技公司都在研究自動(dòng)駕駛汽車,并且陸續(xù)有一些自動(dòng)駕駛汽車上市。從以上這些事件我們可以看出,人工智能應(yīng)用有很多種探索路徑:
-
模擬智能
將人類的思考過程,利用計(jì)算能力進(jìn)行模擬。比較典型的是象棋和圍棋這一類規(guī)則化的智力活動(dòng),人類的思考過程可以恰當(dāng)?shù)靥釤挸鰜怼R虼?,只要有足夠的存?chǔ)和算力支撐,以及人類的經(jīng)驗(yàn)?zāi)P?,就有機(jī)會(huì)做得比人類還好。
-
利用算法實(shí)現(xiàn)智能任務(wù)
在許多應(yīng)用場景中,可利用人工智能算法(主要是深度學(xué)習(xí)算法)來完成一些明確定義的任務(wù),比如人臉識別、車牌識別、語音識別等等。這一類人工智能應(yīng)用需要具備兩個(gè)條件:足夠多的樣本和足夠強(qiáng)的算力。在過去十年中,移動(dòng)互聯(lián)網(wǎng)的蓬勃發(fā)展使得很多業(yè)務(wù)場景匯聚了足夠多的樣本數(shù)據(jù),再結(jié)合云計(jì)算的發(fā)展,因而這一類人工智能應(yīng)用發(fā)展迅速。
-
綜合替代人類,達(dá)到人類智能
比較典型的是自動(dòng)駕駛汽車,以及各種具有復(fù)雜決策能力的機(jī)器人。自動(dòng)駕駛汽車可以將人從駕駛?cè)蝿?wù)中解放出來,機(jī)器人可以代替人類進(jìn)入到復(fù)雜場景中執(zhí)行任務(wù)。這一類人工智能應(yīng)用需要綜合各種軟硬件技術(shù),近幾年在產(chǎn)業(yè)界是一個(gè)科創(chuàng)熱點(diǎn)。
-
超越人類智能
探索未知領(lǐng)域,造福人類。比較典型的是在一些科研領(lǐng)域,結(jié)合了人工智能的技術(shù)以后獲得了革命性的突破,例如上文提到的 AlphaFold2 使蛋白質(zhì)折疊結(jié)構(gòu)預(yù)測問題得到了突破,達(dá)到了原本人類通過實(shí)驗(yàn)無法做到的結(jié)果。
人工智能的核心三要素是數(shù)據(jù)、算力和算法。算力是計(jì)算的物理基礎(chǔ),數(shù)據(jù)是計(jì)算的原料,算法是計(jì)算的邏輯,其最終形式即軟件代碼。人工智能的發(fā)展催生了大量的數(shù)據(jù)工程師和算法工程師崗位。數(shù)據(jù)工程師負(fù)責(zé)采集數(shù)據(jù),對它們進(jìn)行各種處理,歸集起來以供算法使用;算法工程師負(fù)責(zé)實(shí)現(xiàn)各種算法,或者調(diào)用一些通用的算法來完成特定的任務(wù)。經(jīng)過多年的發(fā)展,目前有很多算法庫已經(jīng)沉淀下來,有不少以開源的方式供業(yè)界使用,例如 TensorFlow、PyTorch、Ray 和 SparkML 等。
算法的編程尤其要關(guān)注性能,以確保算法的性能足夠優(yōu),這不是一項(xiàng)簡單的任務(wù),它需要扎實(shí)的底層系統(tǒng)知識,甚至要理解硬件架構(gòu)。一方面,數(shù)據(jù)的傳遞和分布對于一個(gè)大計(jì)算量的算法是非常重要的;另一方面,在眾多計(jì)算節(jié)點(diǎn)中,要避免出現(xiàn)單點(diǎn)性能瓶頸。有很多的領(lǐng)域?qū)<以谑褂萌斯ぶ悄芩惴〞r(shí),并不洞悉底層計(jì)算平臺(tái)的配置要求,或者未能正確地使用計(jì)算庫,從而造成資源浪費(fèi)或者計(jì)算時(shí)間過長,這在實(shí)踐中較為常見。
我有機(jī)會(huì)在之江實(shí)驗(yàn)室建設(shè)一個(gè)大計(jì)算裝置,稱為智能計(jì)算數(shù)字反應(yīng)堆,其旨在搭建一個(gè)大計(jì)算平臺(tái)。該數(shù)字反應(yīng)堆可以聚合多種異構(gòu)算力資源,并通過一些計(jì)算框架或者算法庫,為各種應(yīng)用(包括科學(xué)發(fā)現(xiàn)、數(shù)字經(jīng)濟(jì)、工業(yè)仿真等,稱為應(yīng)用反應(yīng)堆)提供統(tǒng)一的計(jì)算平臺(tái)??梢韵胂螅坏┯辛诉@樣的計(jì)算設(shè)施,將人工智能算法與各個(gè)領(lǐng)域模型結(jié)合起來,在局部領(lǐng)域超越人類智能將會(huì)成為一種發(fā)展模式。
可視化和用戶交互 —— 從 GUI 到數(shù)字孿生
在應(yīng)用軟件開發(fā)工程中,可視化和用戶交互部分往往會(huì)占據(jù)相當(dāng)大的比例。寫這部分程序邏輯的工程師往往比較受歡迎,因?yàn)樗麄兛梢钥焖俅罱ǔ鲆恍┛吹靡娦Ч某绦颉T诋?dāng)前如火如荼的產(chǎn)業(yè)數(shù)字化形勢下,除了數(shù)據(jù)工程師,可能最受歡迎的就是做可視化和用戶交互開發(fā)的工程師了。在過去三十年中,主流的用戶交互和可視化軟件技術(shù)有過幾次變遷:
-
原生的 GUI(來自于操作系統(tǒng)的支持)
在 1990 年代早期,編寫用戶界面往往要直接面對操作系統(tǒng)提供的 API。為了做出好看又整齊有美感的圖形界面,程序員不僅要熟悉操作系統(tǒng)的窗口管理和圖形 API,還要精通計(jì)算機(jī)圖形學(xué),甚至還需要懂色彩美學(xué)。更要緊的是,程序的交互界面部分的代碼量極大,并且這些代碼對于硬件顯示器和操作系統(tǒng)版本的兼容性非常不友好。
-
應(yīng)用編程框架中的 GUI
通過應(yīng)用編程框架來實(shí)現(xiàn)圖形用戶界面,可以有效地解決直接在原生 GUI 基礎(chǔ)上編寫交互界面邏輯的不足,因此從 1990 年代中后期開始誕生了很多應(yīng)用編程框架,最為經(jīng)典的當(dāng)屬微軟的 MFC 應(yīng)用編程框架,以及跨平臺(tái)支持的 Qt。Java 環(huán)境提供了用戶交互和可視化支持,.NET 也提供了強(qiáng)大的圖形用戶界面開發(fā)功能。
-
圖形界面交互引擎
對于用戶界面動(dòng)態(tài)性要求高的應(yīng)用程序,譬如它們的數(shù)據(jù)是動(dòng)態(tài)的,或者表單是動(dòng)態(tài)可配置的,它們傾向于內(nèi)置一個(gè)圖形界面交互引擎,從而將可視化界面的渲染效果和交互事件的處理流程控制在自己的程序內(nèi)部。比較典型的渲染和交互引擎是 Apple 支持的 WebKit 引擎(其前身是 KHTML)、Adobe 的 Flash 引擎,以及 Google 的 Chromium 瀏覽器引擎(源自 WebKit 和 V8 引擎)。當(dāng) Adobe Flash 還在如日中天(2010 年)的時(shí)候,業(yè)界曾經(jīng)引發(fā)過 Flash 和 HTML5 哪個(gè)是未來的爭論。
-
B/S 架構(gòu)
經(jīng)過多年的發(fā)展,可視化和用戶交互逐漸趨向于標(biāo)準(zhǔn)化——HTML CSS JavaScript,這正是前文提到的前后端分離的基礎(chǔ)。前提是每個(gè)前端環(huán)境都有 Web 瀏覽器(Browser),前端邏輯運(yùn)行在瀏覽器中,它們通過 HTTP 或 HTTPS 協(xié)議與后端(Server)進(jìn)行通信。這種架構(gòu)與云計(jì)算的服務(wù)器虛擬化完美地切合起來。應(yīng)用程序可以部署在云上,用戶只需通過一個(gè)瀏覽器,就可以在任何聯(lián)網(wǎng)的地方看到程序運(yùn)行的結(jié)果,并且進(jìn)行交互。
圖形用戶界面的技術(shù)演進(jìn)經(jīng)歷了“單機(jī)圖形顯示優(yōu)化——圖形用戶界面標(biāo)準(zhǔn)化——圖形用戶界面前后端分離”這一過程,主流的可視化交互界面開發(fā)形式在往高效率方向發(fā)展,架構(gòu)也趨向合理。然而,這些開發(fā)方式并非簡單的替代關(guān)系,每一種方式在今天的產(chǎn)業(yè)環(huán)境中,也仍然有它適用的軟硬件環(huán)境。
在 PC 互聯(lián)網(wǎng)時(shí)期,可視化和用戶交互技術(shù)側(cè)重于渲染性能和響應(yīng)及時(shí)性的不斷提升;在移動(dòng)互聯(lián)網(wǎng)時(shí)期,除了性能要求以外,動(dòng)態(tài)性是一項(xiàng)更為側(cè)重的需求,很多應(yīng)用程序中的頁面內(nèi)容和交互邏輯需要方便地定制;而到了產(chǎn)業(yè)互聯(lián)網(wǎng)時(shí)期,可視化和用戶交互又有了新的需求和趨勢,以下兩方面的發(fā)展值得特別提一下:
1. 低代碼開發(fā)平臺(tái)
顧名思義,低代碼開發(fā)平臺(tái)是指只需少量的代碼,甚至無需編寫代碼,就可以完成應(yīng)用程序的開發(fā)。這是在云計(jì)算虛擬化成熟以后,發(fā)生在應(yīng)用層軟件開發(fā)的一種新模式。在產(chǎn)業(yè)數(shù)字化場景中存在大量動(dòng)態(tài)的數(shù)據(jù)可視化需求,這就催生出了各種頁面定制工具,進(jìn)一步擴(kuò)展就形成了低代碼開發(fā)平臺(tái)。低代碼開發(fā)平臺(tái)的優(yōu)勢在于:低門檻準(zhǔn)入、生成頁面快捷,以及頁面測試流程短等。
2. 數(shù)字孿生
數(shù)字孿生首先在工業(yè)領(lǐng)域中被提出并發(fā)展起來,后來被應(yīng)用于建筑和城市數(shù)字化,進(jìn)而被各行各業(yè)所采用。數(shù)字孿生將物理世界與數(shù)字空間連接起來進(jìn)行映射,并形成反饋。數(shù)字孿生涉及到的技術(shù)很廣泛,主要包括物聯(lián)網(wǎng)技術(shù)(用于物理世界數(shù)字化以及從數(shù)字空間反饋回物理世界)、數(shù)據(jù)建模(構(gòu)建數(shù)字空間中的孿生體)、3D 可視化(將數(shù)字空間中的孿生體呈現(xiàn)出來)、GIS 和 BIM(在數(shù)字空間中建立起一致的坐標(biāo)系)等。
過去三十年間,可視化和用戶交互技術(shù),從初期要解決最基本的渲染效果、性能以及可用性等問題,到逐漸形成系統(tǒng)性的、高生產(chǎn)效率的解決方案和平臺(tái)工具,這使得軟件開發(fā)工程可以花越來越少的人力在可視化和用戶交互方面,而更多關(guān)注在軟件業(yè)務(wù)本身。得益于圖形界面交互引擎的不斷發(fā)展,以及人工智能技術(shù)的進(jìn)步,未來越來越多的可視化和用戶交互工作將由機(jī)器來完成,最終做到零代碼開發(fā)。
在我近幾年的實(shí)踐中,我們團(tuán)隊(duì)充分利用了可視化和用戶交互技術(shù)的進(jìn)步,在指令集物聯(lián)網(wǎng)操作系統(tǒng)中內(nèi)置了孿生模型和低代碼開發(fā)平臺(tái)。這樣做的一個(gè)直接好處是,對于每個(gè)用戶場景,只要設(shè)備接入進(jìn)來,它就自然成為了孿生模型的一部分,參與到業(yè)務(wù)模型中,并且能夠在可視化界面中顯現(xiàn)出來。這種做法可以極大地提高物聯(lián)場景的數(shù)字化效率。
對程序技術(shù)進(jìn)步的預(yù)測
前面回顧了過去三十年重要的程序技術(shù)進(jìn)步,最后我們也展望一下未來。我按照接下來十年可能發(fā)生的事情來描述:
-
操作系統(tǒng)的發(fā)展路線將進(jìn)入一個(gè)新的軌道——行業(yè)操作系統(tǒng)。
行業(yè)操作系統(tǒng)的本質(zhì)是抓住行業(yè)的共性部分,形成一個(gè)軟件系統(tǒng),可復(fù)制到該行業(yè)中具有顯著共性的硬件計(jì)算環(huán)境中。典型的例子是汽車操作系統(tǒng)和智慧建筑操作系統(tǒng)。只有可抽象出硬件計(jì)算環(huán)境和共性需求的行業(yè)場景,才能形成行業(yè)操作系統(tǒng)。
圖源:CSDN 下載自東方 IC
-
人工智能將會(huì)有重大突破,這些突破對人類的生產(chǎn)、生活的改變將是深遠(yuǎn)的。
這一輪推動(dòng)人工智能發(fā)展的契機(jī)是,各個(gè)基礎(chǔ)研究領(lǐng)域在使用計(jì)算能力上有了長足的進(jìn)步。包括生物、醫(yī)藥、材料、天文、地理等領(lǐng)域中的研究人員,更加深刻地理解了可以用算力和算法來做什么。AlphaFold 是一個(gè)例子,該模式可以擴(kuò)展到其他領(lǐng)域。
-
公共的數(shù)字孿生空間。
很多公共設(shè)施設(shè)備在數(shù)字孿生空間中是開放的,可以被公開網(wǎng)絡(luò)通過一個(gè) URI 訪問到,它們構(gòu)成了一個(gè)公共的數(shù)字孿生空間。在十年以后設(shè)備接入非常方便,若本地網(wǎng)絡(luò)的防火墻對一個(gè)設(shè)備不加限制的話,則該設(shè)備接入以后就成為公共數(shù)字孿生空間中的一個(gè)節(jié)點(diǎn)。基于這一公共的數(shù)字孿生空間,也會(huì)誕生一些應(yīng)用和服務(wù)。與公共的數(shù)字孿生空間相對應(yīng)的是各個(gè)組織的私有數(shù)字孿生空間。
-
在中國,寫代碼的人數(shù)在 2-3 年后達(dá)到高峰,10 年后降低一個(gè)數(shù)量級。
這兩年產(chǎn)業(yè)數(shù)字化全面推進(jìn),并且都從應(yīng)用需求做起,勢必造成大量的人員去做應(yīng)用功能,包括各種數(shù)據(jù)工程和可視化等。隨著系統(tǒng)工具的完善以及數(shù)字化建設(shè)回歸理性,寫代碼人員的機(jī)會(huì)減少。好工具的誕生并普及,將會(huì)削減大量的工作崗位。當(dāng)然,數(shù)字化的深入也會(huì)帶來新的代碼機(jī)會(huì),這就看哪些人的再學(xué)習(xí)能力強(qiáng)了。
-
誕生基于中文的編程語言,用于應(yīng)用層邏輯定義。
這個(gè)編程語言從某一個(gè)行業(yè)中誕生,也適用于更多行業(yè)。結(jié)合 NLP 和其他人工智能技術(shù),我們國家的全民編程有望實(shí)現(xiàn)。
以上這些預(yù)測是一個(gè)程序員的思考,部分也承載著我個(gè)人的愿望,甚至是我當(dāng)前已經(jīng)在做的工作的延續(xù),或期待要達(dá)成的目標(biāo)。從這個(gè)角度來看,這些預(yù)測太現(xiàn)實(shí),不夠離譜。
結(jié)語
最后,我提一下在計(jì)算機(jī)程序和編程技術(shù)發(fā)展背后的兩個(gè)基礎(chǔ)原則:
-
隨著計(jì)算機(jī)程序的使用場景和范圍越來越廣,適應(yīng)這種廣度擴(kuò)展的基本手段是分層,即增加層次;
在計(jì)算機(jī)系統(tǒng)的層次結(jié)構(gòu)中,越是下面的層次,越是提供共性的能力,反之,越往上越個(gè)性化。
隨著產(chǎn)業(yè)數(shù)字化的廣泛推動(dòng),行業(yè)操作系統(tǒng)就是一個(gè)新的層次,而在行業(yè)操作系統(tǒng)下面還有一個(gè)更加抽象的技術(shù)操作系統(tǒng)。所謂計(jì)算機(jī)程序技術(shù)的進(jìn)步,就是按照這樣的原則使得層次和分工趨向合理。
本文分別從軟件棧、網(wǎng)絡(luò)、人工智能以及可視化與用戶交互的角度回顧了過去三十年計(jì)算機(jī)程序的演進(jìn),正好對應(yīng)了我的程序生涯三十年經(jīng)歷中的一些感悟。期待未來十年計(jì)算機(jī)程序技術(shù)繼續(xù)進(jìn)步,為人類開啟更加美好的生活和體驗(yàn)。
作者簡介:潘愛民,指令集創(chuàng)始人兼董事長、之江實(shí)驗(yàn)室智能計(jì)算數(shù)字反應(yīng)堆首席架構(gòu)師。長期從事軟件和系統(tǒng)技術(shù)的研究與開發(fā)工作,撰寫了大量軟件技術(shù)文章,著譯了多部經(jīng)典計(jì)算機(jī)圖書,在國內(nèi)外學(xué)術(shù)刊物上發(fā)表了 30 多篇論文。曾經(jīng)任教于北京大學(xué)和清華大學(xué)(兼職),后進(jìn)入工業(yè)界,先后任職于微軟亞洲研究院、盛大網(wǎng)絡(luò)和阿里巴巴。主要研究興趣包括移動(dòng)操作系統(tǒng)、信息安全、大數(shù)據(jù)、移動(dòng)互聯(lián)網(wǎng)、物聯(lián)網(wǎng)和智慧城市。
本文為《新程序員004》內(nèi)容,二十年前,《程序員》創(chuàng)刊時(shí),我們要全面關(guān)注軟件人的成長。今天,我們依然初心不變:在一行行代碼的背后,是一顆顆鮮活的開發(fā)者想要改變世界的雄心壯志。因此,《新程序員 004》從潘愛民到 MySQL 之父、MariaDB 創(chuàng)始人 Michael “Monty” Widenius,PostgreSQL 全球開發(fā)組聯(lián)合創(chuàng)始人 Bruce Momjian,阿里巴巴副總裁賈揚(yáng)清,著名科技作者吳軍,Vue.js 作者尤雨溪……共談我們的程序人生,我們的技術(shù)時(shí)代?!缎鲁绦騿T004》即將上市,敬請期待。
速度是 macOS 的兩倍?首個(gè)支持 M1 Mac 的 Linux 發(fā)行版終于出現(xiàn)!
成就一億技術(shù)人