扫码打开虎嗅APP
本文来自微信公众号:爱范儿(ID:ifanr),作者:朱海,头图来自:视觉中国
“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展示的照明弹功能
还有,当我们在手机上输入了一些商品关键词被云同步或被app读取剪切板后,第二天在购物app显要位置就能看到相似商品,不知这个功能是谁写下的代码?
作为构建虚拟社会的工具,代码实际是现实社会人性的折射。编程语言一直在那里,怎么用,终究要看我们自己。
本文来自微信公众号:爱范儿(ID:ifanr),作者:朱海