2009 年,Facebook 推出了一份改变世界的代码——点「赞」按钮。「赞」是包括 Leah Pearlman 和 Justin Rosenstein 在内的数名程序员和设计师的创意。他们认为 Facebook 用户经常太忙而无法在朋友的帖子上发表评论,但是如果有一个简单的按钮可以使用,那一定会大受欢迎。「朋友们可以更频繁、更轻松地相互点赞互动」,Pearlman 说。
这个按钮奏效了,甚至有点超乎想象。到 2012 年,「赞」这个按钮已经有了超过 1 万亿次的点击。但它也产生了副作用。我们发布一张照片后,会坐立不安地刷新页面,等待更多的「赞」。我们想知道为什么别人的赞越来越多。因此,我们开始在社交网络中「暗暗发力」:变得更有趣、更犀利、更迷人、更极端。
代码重构了我们的生活。正如风险资本家 Marc Andreessen 写的那样,「软件正在吞噬整个世界」,不过说软件正在消化这个世界可能更准确。
因此,美国 Slate 杂志做了这样一个调查。为了厘清改变世界的那些软件,编辑们对计算机科学家、软件开发人员、历史学家、政界人士和新闻工作者进行了民意调查。他们需要选择:哪些代码有巨大影响力?哪些改变了我们的生活?有 75 位人士提出了自己的想法,Slate 选择了其中 36 位(译文有删减)。这并不是一个完整的清单,因为有影响力的代码太多。该清单旨在激发思想——帮助我们重新思考代码如何影响我们的生活以及程序员的决策如何影响未来。
二进制穿孔卡片(1975 年) 第一种代码
二进制编程出现时间比计算机都早。Basile Bouchon 是第一个在纸上打孔并用它来控制机器的人:1725 年,他发明了一种织机,该织机根据所送入的穿孔纸编织出不同图案。打孔是「1」,没有打孔是「0」。此后机器发生了很多变化,但基本的代码组成并没有改变。——Elena Botella, Slate
执行的第一个现代代码(1948 年)
引领了计算机代码的使用和核灾难计算机模型的出现,为冷战时期的军备竞赛打下了基础。
电子数字积分计算机是第一台可编程电子计算机。它于 1945 年完成,通过在许多组件之间进行连接来为每个新问题进行配置。当一项任务(例如加法)完成时,一个脉冲会触发下一项任务。但是几年后,冯·诺依曼(Von Neumann)和 Los Alamos 的科学家 Nicholas Metropolis 改进了 ENIAC,运行了在计算机上执行的第一条现代代码:从可寻址的只读存储器(ENIAC 的功能表开关)执行数百条数字指令。他们使用蒙特卡洛技术模拟了在新墨西哥州的洛斯阿拉莫斯国家实验室提出的几种原子弹设计的爆炸过程,通过这种方法逐步模拟了复杂系统,绘制了可能结果的概率分布。冯·诺依曼和梅特罗波利斯向洛斯阿拉莫斯的核科学家发送了 20,000 多张卡片,通过引爆弹头追踪了模拟中子的过程。如今,此代码的后续版本仍在洛斯阿拉莫斯使用。——Thomas Haigh,《ENIAC in Action: Making and Remaking the Modern Computer》合著者。
GRACE HOPPER 的编译器(1952 年)
使计算机处理单词成为可能
Grace Hopper 在对一台早期计算机编程时,为了简化整个过程决定将编程语言植根于人类语言。霍珀(Hopper)在第二次世界大战期间加入了美国海军预备役。她知道,像她的军事上司一样,人们都在努力理解二进制代码。如果编程语言可以是基于英语的,那么这项工作就不会那么容易出错,并且对于那些不是数学博士的人来说也更容易理解。
一些人对此想法不以为然,但到了 1950 年代初,她设计了一个编译器,即一组指令,将一种更易懂的代码转换为机器直接处理的低级代码。她和她的实验室使用该工具开发了 FLOW-MATIC,这是第一种将英文单词融入该过程的编程语言。——Molly Olmstead, Slate。
太空战争!(1961 年)
第一个分布式视频游戏(Spacewar)
电子邮件的起源(1965 年)
Come on,电子邮件来了!
阿波罗 11 号登月舱救援代码(1969 年)
防止登月舱计算机在太空中空间耗尽的代码
Hello, World!(1972 年或更早)
引领一代又一代人打开编程大门的代码
当你坐下来学习一种新的编程语言时,教程要求你做的第一件事就是让计算机显示「Hello,world!」。也许最著名的早期示例来自贝尔实验室的「C—A 编程教程」。该教程写于 1974 年,尽管在 1972 年的手册中也发现了另一种更早的语言 B。
「Hello,world!」这是极好的教学方法。这是一项小的、可实现的任务,能够使学生有成就感。这是一个标准,有助于说明不同编程语言之间的差异。这也是高级程序员确保安装新环境后一切正常的一种快速简便的方法。(有时程序员使用「到'hello world'的时间」比较语言和环境的速度。)也许最重要的是,「Hello,world!」能帮你打开编程的大门,它告诉你这就是新世界。——Chris Noessel,IBM AI 设计主管。
以空字符结尾的字符串(1972 年)
计算史上最大的灾难性设计错误
1972 年,Dennis Ritchie 做出了一个重大决定:用一种名为「空字符结尾字符串」(null-terminated string)的新语言来表示文本。这个概念早就出现了,但是他把其写进了他称为 C 的新语言中,这个决定就一直影响我们到现在。
编程语言代表一段文本的主要方式有两种:一是具有固定、显式长度——「只包含 10 个字符,不能再多了」或者可以以空值结尾——「这里有一串字符,继续努力,直到看到零字节为止!」
C 代码中有一个非常常见的错误,在将一个长字符串复制到一个较短的字符串中时,会出现结尾溢出,即你破坏了刚好在附近的其他数据。就像在白板的边缘上乱涂乱画一样。
除了仅使程序出现故障外,还可以利用此类错误来改变程序行为,方法是使用经过精心设计的特定数据覆盖某些内容。这些就是缓冲区溢出攻击。你听说过的几乎所有安全漏洞都从 1988 年的 Morris Worm 开始。
你必须在 C 语言中仔细编码以避免此类错误,但是此类错误仍然容易发生。从路由器到「智能」灯泡,几乎每种现代语言都避开了空字符结尾字符串,但是 C 和 C++仍然在语言界有支配地位。因此,近 50 年后的现在,我们还在「饱受折磨」。——Jamie Zawinski,Netscape 开发人员、Mozilla.org 创始人
温哥华股票交易所的交易错误(1982 年)
不起眼的小数误差造成极大损失
1982 年初,温哥华证券交易所推出了一种电子股票指数,该指数最初定为 1000 点。在两年内,它跌了一半,这在 1980 年代初期的牛市中似乎匪夷所思。一项调查显示,使用 floor() 而非 round(),会造成对索引的计算错误。该命令意味着该值会被直接截止而不是四舍五 入到小数点后三位。(数字计算机必须具有有限的分辨率,因此需要四舍五入或直接截止。)因此,如果索引计算为 532.7528,则会被存储为 532.752,而不是四舍五入为 532.753。在每天数千次计算的过程中,这种看似很小的差异——每次必须四舍五入时未进行四舍五入——导致了巨大损失。这个编程错误最终在 1983 年 11 月得到解决,当时周五的收盘指数在 500 点左右。问题解决后,该股票于周一重新开盘,指数就超过了 1,000 美元,损失的价值得以恢复。——Lav Varshney,伊利诺伊大学香槟分校助理教授
THERAC-25(1985-1987 年)
过度自信是致命的
当真相浮出水面时,各大媒体的头版头条就对机器现代化发出了警告。《洛杉矶时报》宣称:「在这个复杂时代,软件漏洞变得致命。」一台用于治疗癌症的机器在几家医疗机构中对六名患者进行了大剂量过量辐射,造成至少三人死亡。
研究人员发现,Therac-25 的代码可能带来致命的错误。该机器提供低功率和高功率治疗,后者需要一个金属设备来过滤光束。但是由于软件中的错误,操作员可能会在没有金属设备的情况下意外触发高功率模式。
Therac-25 被设计为 Therac-20 的「改进」,设计时被认为是万无一失的,不需要外部安全检查。结果:几起死亡归咎于过度自信的工程师,他们没有考虑到失误的可能性。——Molly Olmstead
互联网中继聊天(1988 年)
最初的在线挂机
莫里斯蠕虫病毒(1988 年)
惊觉互联网已经如此庞大
罗伯特·莫里斯(Robert Morris)和互联网本身都还年轻。当时 23 岁的康奈尔大学研究生 Morris 发布了「莫里斯蠕虫病毒(Morris Worm)」,这是所谓的「互联网上的首次重大攻击」。近 60,000 台连接到互联网的计算机中有 10%遭到破坏,造成数百万美元的损失,该事件导致《纽约时报》首次刊登了「互联网」一词。即使是精通技术的人也会吃惊于蠕虫病毒的影响范围之广。Morris 说,他从未想过有如此大的损失,他成为根据《计算机欺诈和滥用法》被起诉的第一人。在被判处三年缓刑后,他成为著名的创业孵化器 Y Combinator 的共同创始人和麻省理工学院的计算机科学助理教授。——Elena Botella
只有一行代码的病毒(日期:90 年代)
单行代码的功能以及计算机惊人的脆弱
上图展示的是一种名为「fork 炸弹」的单行病毒。它需要一些特定的条件才能被触发(包括较旧、易受影响的 Unix 操作系统副本)。如果在 Bash 中键入此命令,它将一遍又一遍地复制自己,直到耗尽计算机中的所有可用内存并导致崩溃。
它之所以有名不是因为它相对于其大小所表现的危险性,而是它使用冒号作为函数名称。大多数函数(可重复使用的代码行)都以描述性方式命名,例如「Print」或「isThisEmailValid」,但并没有规定必须如此。在大多数计算语言中,不能使用冒号作为函数名称,但在 Bash 中可以。
2002 年,我在德国法兰克福的 Angewandte Kunst 博物馆第一次看到作为展品的这行代码。博物馆中没有展示多少代码。——Chris Noessel
HTML 超链接(1990 年)
连接一切的工具
JPEG(1992 年)
改变了我们与摄影的关系
Mosaic 浏览器(1993 年)
第一个获普遍使用且能够显示图片的网页浏览器
跟踪像素(1993 年)
现代数据收集始于这些看不见的图像。
通过跟踪像素下载,他们会了解了你的身份和位置,并触发一个 cookie 下载到你的浏览器中。该 cookie 使广告商可以在多个网站上跟踪你。
像素跟踪的成功直接导致了 Facebook 的点「赞」按钮出现,该按钮可在每个嵌入的网站上进行跟踪。大量的数据收集实现了高度定向,也使 Facebook 广告大获成功,最终 Facebook 从媒体公司口袋里赚到数十亿美元。
Robots.txt(1994 年)
一个对搜索及其他应用均具有重大意义的小工具
维基(1994 年)
为维基百科铺平了道路
第一个弹出广告(90 年代中期)
互联网的「害群之马」
Google 的 PageRank 算法(1996 年)
革新我们组织知识的方式
在 PageRank 之前,搜索引擎根据我们的查询词是否与文档中的词匹配来查找信息。但是对于 PageRank,拉里·佩奇和谢尔盖·布林提出了一个绝妙的主意:知识是社会性的,搜索也应该是。他们创建了一种算法,通过网络浩瀚的超链接关系来确定一个页面的等级。一个页面的 PageRank 是由所有链向它的页面的重要性经过递归算法得到的,一个有较多链入的页面会有较高的等级。正是两位这种独具慧眼的洞察力造就了 Google 的当今地位。——Clive Thompson
失联的火星气候轨道飞行器(1999 年)
因数学错误而失败的任务
1999 年 9 月 23 日,NASA 的科学家与耗资 1.25 亿美元的「火星气候轨道飞行器」失联。后来的调查确定了原因:承包商使用英制单位为轨道飞行器编写了程序,这在美国是标准的,但是 NASA 的软件使用了公制。两段代码之间一次简单的通讯错误使轨道飞行器飞向了未知的地方。
人们很容易把这种度量错误看做偶然,但这表明当下这个互联软件的世界多么脆弱。所有互联的技术(电话、航天器、机器人榨汁机等等)都依赖于定义与他人进行通信的方式的接口。极小的差异也会导致混乱。——Charles Duan
比特币(2008 年)
激发人们对某种货币的信心的代码
点赞按钮(2009 年)
它催化了监视经济。
Facebook 设计的点「赞」按钮,使我们可以向世界展示我们的喜欢《辛普森一家》或炸薯条。但实际上,它利用了我们的认知偏见和设计的力量,诱使我们分享更多的信息。它们利用上面提到的跟踪像素在互联网上跟踪我们,收集有关我们浏览习惯的数据。然后,Facebook 利用该信息,并将其行为定位算法卖给广告商。如果一家户外用品公司想要做广告,那么 Facebook 可以锁定那些「点赞」远足信息、访问露营网站以及有户外朋友的人。当这些用户给公司的广告点赞时,该信息就会反馈到定位算法中。因此,监视和商业操纵会形成循环。都是因为一个小小的蓝色竖起大拇指。——Ari Ezra Waldman,纽约法学院教授
波音 737 Max(2017 年)
软件错误加上公司贪婪,导致数百人丧生,大批飞机停飞
2018 年 10 月,狮航 610 航班起飞后不久就坠入海中。波音向公众保证飞机是安全的,并表示需要更多的飞行员训练和「软件升级」。但是仅仅四个月后,埃塞俄比亚航空又有一架飞机失事。飞行员努力将机头抬起 20 次,但飞机的自动系统却将机头往下拉。起飞后几分钟内,就机毁人亡。全球航空当局当即将飞机停飞。调查显示,坠机事故是由 737 Max 的设计引起的,尤其是那些鲜为人知的软件,可能迫使飞机不断俯冲。——Mar Hicks,技术史学家,
《Programmed Inequality(http://www.amazon.com/dp/0262535181/?tag=slatmaga-20)》作者。
原文链接:https://slate.com/technology/2019/10/consequential-computer-code-software-history.html
【本文是51CTO专栏机构“机器之心”的原创译文,微信公众号“机器之心( id: almosthuman2014)”】