為了運行十年前的代碼,程序員們甚至翻出了一台 1977 年的 Apple II
“Hello, World!”
46 年過去,這段被世人熟知的代碼仍散發着歷久彌新的魅力,和它一起登場的 C 語言,如今也成長為世界幾大通行編程語言之一,為互聯網世界乃至現實世界都編織着更美好的未來。
為了回顧和紀念編程史,GitHub 上的計算機神經科學家 Nicolas Rougier 和理論生物物理學家 Konrad Hinsen 共同發起了一項 Ten Years Reproducibility Challenge(十年代碼挑戰)活動,鼓勵大家找出自己十年前或更早的代碼,看看這些代碼現在還能不能運行,代碼相關的研究能不能復現。
目前,活動頁面上已經有幾十名參與者提交了十多年前的代碼,這些代碼在當年看來算得上高新前沿技術,但現在不少被當事人打上了「運行可能性低」的標籤。這在我們行外人看來很難理解,編程的字母和符號沒變,為什麼就不能運行了呢?
十多年,首先變的是編程語言和工具
之前流行一句玩笑話,説「寫 C 語言的看不起寫 C++ 的,寫 C++ 的看不起寫 Java 的,寫 Java 的看不起寫 C# 的,最後大家一起看不起寫 PHP 的」。
一句玩笑話,充分説明了編程語言的變化。
TIOBE(編程語言排行榜單)公佈了近 20 年的編程語言排行變化趨勢圖,總體來看,Java 和 C 語言仍然佔據老大老二的位置,Python 異軍突起,PHP、C++、C#持續走低,SQL「起死回生」,Swift 半路「殺出」。
▲ 2002 年到 2020 年編程語言趨勢圖. 圖片來自:TIOBE
工具的變化往往和編程語言的變化是同步的。
2009 年,Spring 需要若干 XML 配置和 Java 文件,而 2019 年只需要一個 Java/Kotlin 文件就可以。十年前前端只有 Plain Old Javascript、jQuery、ExtJS 可選,而如今就有二十多個選項。
▲ 工具的變化
▲ 可選性大大提升
「唯一沒大變的,可能就是算法了吧?」國外一位程序員小哥説,十年前的 Statistics(統計),到了十年後搖身一變成了 Machine Learning(機器學習),可是算法公式還是一樣的。
先問在不在,再問能不能「run」
▲ 全球最大的程序員「交友」及代碼託管平台,2008 年才上線
要想知道十年前的代碼還能不能「run」起來,首先必須能找到十年前的代碼 —— 這也是「十年代碼挑戰」雖然在圈內引起不少關注但截至目前參與者不多的原因之一。
知名的項目託管平台 GitHub 2008 年 4 月才上線,很多人更是在 2012 年後才開始使用它託管代碼,在此之前的代碼大多以論文、雜誌期刊等形式保存,因此遺失了不少。
例如,法國國家信息與自動化研究所的計算機科學家 Roberto DiCosmo 在 1998 年發佈了一篇論文,寫了一個名為「OcamlP3l」的並行編程系統,但找遍自己和合著者的硬盤以及備份,他也沒能找到代碼,最後機緣巧合才在一個代碼抓取網站找到當年的代碼。
還有一位參與活動的 Rougier ,他的代碼發表在 32 年前的雜誌《Tremplin Micro》上,這家雜誌出版商早已消失在歷史的長河中,如果沒有其它備份途徑又找不到當年的雜誌,這份代碼相當於在編程歷史上從未存在過。
很難想象,作為互聯網的產物,代碼也會因為新老時代存儲容器革新的問題而遺失,這是「十年代碼挑戰」給編程圈帶來的第一個現實意義,如何妥善保管之前的代碼是值得考慮的事情。
你「run」憑你「run」,沒當年的軟硬件也白搭
找到當年的代碼後,別高興得太早,第二個問題來了,相當一部分代碼是「run」在當年的軟硬件載體上,現在還能找得到這些軟硬件嗎?
前文提到的 Rougier 就遇到了這樣的問題,32 年前 1988 年他才 16 歲,給 Apple II 電腦(1977 年-1993 年)寫了一個圖像放大器的程序代碼,是截至目前「十年代碼挑戰」活動中最古老的代碼。
▲ Apple II
還好 Rougier 的同事在清理辦公室時搶救出了一台 Apple II ,這台「老古董」可不好「伺候」,它的老式磁盤無法和現在的計算機連接,代碼的運行也就成了大難題。最終 Rougier 在亞馬遜上淘到了 1993 年的老式磁盤,寫入了三次數據才「盤活」磁盤,有了運行代碼的必要硬件基礎。
遇到類似問題的人不少,比如活動的發起者 Hinsen 説,他在 90 年代寫的代碼都保存在軟盤裏,現在找不到讀取相應軟盤的的工具了。
▲ 系統也會影響老舊代碼的運行. 圖片來自:Sabino Maggi
另外,系統環境也很重要。
Sabino Maggi 是意大利的一名計算機物理學家,他在 1996 年用 Fortran 語言建模了一個超導裝置,並用 Microsoft Visual Basic 來處理結果。二十多年過去,「Visual Basic 是一門死掉的語言,早就被 Visual Basic.NET 取代」,Maggi 只能在自己的 Mac 電腦上做了一個十年前的 Windows 虛擬機來嘗試運行代碼。好巧不巧,Windows 在 96 年發佈的眾多系統版本不向前兼容,導致 Maggi 的代碼沒能成功運行。
人家 9 歲寫的代碼還能運行,9 歲的我卻在玩泥巴
▲ 十年代碼挑戰網頁第一個提交的代碼
「When I was 9 I tried to heal a trees broken branch with grass.」(當我 9 歲的時候,我試圖用草來治療一棵樹的斷枝。)
一位年輕的小哥在 YouTube 上説自己 9 歲寫的代碼還能運行,一位用户發佈了上面這樣的評論,獲得了 6363 個贊。
這次參與「十年代碼挑戰」的代碼都是什麼樣的呢?
愛範兒進入 GitHub 上的活動頁面,發現這些代碼和我們預想的不太一樣,相當一部分是和科學研究有關的,和大眾衣食住行的直接關聯性較低。
比如第一個參與人 John (EBo) David 提交的代碼,寫於 22 年前,名為「The behavior of landscape metrics commonly used in the study of habitat fragmentation」(常用於生境破碎化研究的景觀度量的行為)。
還有的代碼涉及物理和數學研究領域,像「fermions at unitarity(統一的費米子)」、「Poincaré dodecahedral space parameter estimates(龐加萊十二面體空間參數估計值)」等。
「Typographical features for scene text recognition(場景文字識別的印刷功能)」、「Effects of fire on regional evapotranspiration in the central Canadian boreal forest(火對加拿大中部北方森林中區域蒸散的影響)」算是和普通人關聯度比較高的了。
▲ 十五年前有關心血管疾病研究的代碼
能讓我們感覺到有一點「現代互聯網」的代碼也有一些,例如「Accuracy Study and Improvement of Network Simulation in the SimGrid Framework(SimGrid 框架中網絡仿真的準確性研究和改進)」讓我們聯想到了近幾年大火的「AI」,而這份代碼實際發佈於 2009 年。
基因學、神經學、計算機學、生物學、物理學、數學等都有涉及。
「十年代碼挑戰」頁面參與活動的代碼之所以和想象中「軟件開發」代碼有所不同,我們推測可能有兩個原因。
第一,得益於完善的論文制度,很多和論文相關或發佈了論文的代碼都得到了良好的保存,只有保存下來的代碼才有可能參與這次活動。第二,十多年前無論是電腦還是編程技術都不像現在那麼普及,電腦和代碼的運用更多集中在高精尖領域。
備註:以上翻譯均來自Google
代碼改變世界
不知不覺中,編程語言已經成為能影響世界發展軌跡的事物之一,和每個人的生活或多或少產生着各種關聯,甚至可以説我們「生不離編程,活不離編程,死不離編程」—— 接生嬰孩的醫療器械需要編程好操作軟件,從小到老的方方面面都需要編程參與(例如微信、外賣等),延緩我們死亡的醫療系統也需要編程製作各種軟件。
今年 3 月 25 日,不少用户發現用 iPhone 打開淘寶 app 時,會自動彈出一個對話框,提示用户 3 天后將無法使用淘寶 app,不少剁手黨都擔心以後不能愉快清空購物車了。事後,淘寶迅速發佈了新版本,修復了這一 BUG。
不妨想象一下,如果 3 天后淘寶真的不能用了,我們個人乃至整個社會將會受到怎樣的影響?如果某一天中午 12 點,所有的外賣 app 都不能使用了,又會出現什麼樣的局面?
代碼在改變世界的同時,也帶來了很多新的問題,最引人關注的就是個人數據和隱私問題。
前不久,小米的 MIUI 12 測試版上線,新推出了「照明彈」功能,許多 app「原形畢露」,原來在用户不知情的時候,有的 app 甚至每日悄悄讀取用户的隱私信息高達上千次,除了必要的關聯喚醒行為,app 那些不必要的「小動作」,究竟是什麼樣的代碼在背後驅動?護衞我們隱私的 MIUI 12 照明彈的代碼,又是誰替我們寫的?
▲ MIUI 12 展示的照明彈功能
9 月 3 日,蘇州「蘇城碼」app 上線「蘇城文明碼」功能,該功能旨在構築起文明積分信息識別體系,形成市民文明程度「個性畫像」,文明積分等級高的市民將會享受工作、生活、就業、學習、娛樂的優先和便利,引起了大眾的廣泛討論,不少人認為「文明」的標準不夠客觀,「不文明」的懲罰也容易被技術左右。新京報專門發表了點評 —— 是否遵循了程序正義,是否突破了依法行政的「紅線」。
還有,當我們在手機上輸入了一些商品關鍵詞被雲同步或被 app 讀取剪切板後,第二天在購物 app 顯要位置就能看到相似商品,不知這個功能是誰寫下的代碼?
作為構建虛擬社會的工具,代碼實際是現實社會人性的折射。編程語言一直在那裏,怎麼用,終究要看我們自己。
資料來源:愛範兒(ifanr)