• 媒体品牌
    爱范儿
    关注明日产品的数字潮牌
    APPSO
    先进工具,先知先行,AIGC 的灵感指南
    董车会
    造车新时代,明日出行家
    玩物志
    探索城市新生活方式,做你的明日生活指南
  • 知晓云
  • 制糖工厂
    扫描小程序码,了解更多

为了运行十年前的代码,程序员们甚至翻出了一台 1977 年的 Apple II

软件

2020-09-10 09:20

“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 年。

基因学、神经学、计算机学、生物学、物理学、数学等都有涉及。

「十年代码挑战」页面参与活动的代码之所以和想象中「软件开发」代码有所不同,我们推测可能有两个原因。

第一,得益于完善的论文制度,很多和论文相关或发布了论文的代码都得到了良好的保存,只有保存下来的代码才有可能参与这次活动。第二,十多年前无论是电脑还是编程技术都不像现在那么普及,电脑和代码的运用更多集中在高精尖领域。

备注:以上翻译均来自谷歌

代码改变世界

不知不觉中,编程语言已经成为能影响世界发展轨迹的事物之一,和每个人的生活或多或少产生着各种关联,甚至可以说我们「生不离编程,活不离编程,死不离编程」—— 接生婴孩的医疗器械需要编程好操作软件,从小到老的方方面面都需要编程参与(例如微信、外卖等),延缓我们死亡的医疗系统也需要编程制作各种软件。

今年 3 月 25 日,不少用户发现用 iPhone 打开淘宝 app 时,会自动弹出一个对话框,提示用户 3 天后将无法使用淘宝 app,不少剁手党都担心以后不能愉快清空购物车了。事后,淘宝迅速发布了新版本,修复了这一 BUG。

不妨想象一下,如果 3 天后淘宝真的不能用了,我们个人乃至整个社会将会受到怎样的影响?如果某一天中午 12 点,所有的外卖 app 都不能使用了,又会出现什么样的局面?

代码在改变世界的同时,也带来了很多新的问题,最引人关注的就是个人数据和隐私问题。

前不久,小米的 MIUI 12 测试版上线,新推出了「照明弹」功能,许多 app「原形毕露」,原来在用户不知情的时候,有的 app 甚至每日悄悄读取用户的隐私信息高达上千次,除了必要的关联唤醒行为,app 那些不必要的「小动作」,究竟是什么样的代码在背后驱动?护卫我们隐私的 MIUI 12 照明弹的代码,又是谁替我们写的?

▲ MIUI 12 展示的照明弹功能

9 月 3 日,苏州「苏城码」app 上线「苏城文明码」功能,该功能旨在构筑起文明积分信息识别体系,形成市民文明程度「个性画像」,文明积分等级高的市民将会享受工作、生活、就业、学习、娱乐的优先和便利,引起了大众的广泛讨论,不少人认为「文明」的标准不够客观,「不文明」的惩罚也容易被技术左右。新京报专门发表了点评 —— 是否遵循了程序正义,是否突破了依法行政的「红线」。

还有,当我们在手机上输入了一些商品关键词被云同步或被 app 读取剪切板后,第二天在购物 app 显要位置就能看到相似商品,不知这个功能是谁写下的代码?

作为构建虚拟社会的工具,代码实际是现实社会人性的折射。编程语言一直在那里,怎么用,终究要看我们自己。

登录,参与讨论前请先登录

评论在审核通过后将对所有人可见

正在加载中