您的位置:首页 > 编程语言

改变世界的代码行

2019-11-04 18:01 1151 查看

作者丨slate

译者丨核子可乐

策划丨Tina

代码塑造着我们的生活。正如风险投资家 Marc Andreessen 所言,“软件正在吞噬整个世界。”或者结合当下实际,说软件正在消化整个世界也许更为准确。

从文化层面讲,代码处于底层区域。我们虽然能够感受到代码对我们日常现实产生的不可思议的影响,但却很少实际接触到代码,其运作原理也很难为外行人所理解。我们总会整理出最杰出的电影、游戏以及电视剧集榜单,认为这些作品塑造了我们的灵魂。但即使是向来以大胆激进著称的《时代》杂志,也从来没有发布过什么影响整个世界的软件代码榜单。

但没有不代表不需要,我们就打算尝试一下。为了选择对世界影响力最大的软件成果,我们对计算机科学家、软件开发人员、历史学家、政策制定者以及新闻工作者展开了广泛的民意调查。

他们需要回答的问题包括:哪些代码段拥有巨大的影响?哪些代码改变了我们的生活?入选的软件成果共有 75 项,我们最终选择了其中 36 项。当然,这份榜单并不完整,事实上也不可能真正完整。与其他榜单一样,这份清单是为了激发大家的奇思妙想,帮助我们重新考量代码对日常生活的影响,以及程序员们如何做出关于未来的种种决定。

有些代码的知名度比较高,例如 HTML。也有些代码虽然强大(例如用于模拟概率的蒙特卡洛模拟),但在普通民众中却毫无存在感。也有一些代表着致命的错误,例如波音 737 Max 中的软件缺陷。还有一些则让人不寒而慄,例如通知营销人员收件人是否已经打开邮件的跟踪机制。

但无论如何,重要的代码都有一种共性:通过消除摩擦创造出新的行为模式。当软件能够降低某种行为的执行难度时,我们就会更多执行这类行为。1988 年首次出现的“互联网聊天”代码,使得互联网上的早期居民们得以实时进行文本交互。如今,实时文本早已无处不在——从令人眼花缭乱的 Slack 协作平台,到 Twitch 上的网络暴民互喷,皆属此列。

另外,我们也很难在一开始就断定哪些代码能够带来划时代的影响。一般来说,这些软件项目往往始于某种奇怪的实验,就像是那种探测气球。1961 年,第一款广受欢迎的电子游戏《Spacewar!》诞生于一台价格高达 12 万美元(根据购买力计算,相当于 2019 年的超过 100 万美元)的中型机上,这样的背景本身就相当令人难以理解。但它的出现仍然开创了目前早已成为主流的诸多概念,包括将数据表示为图标形式,以及允许用户利用手持控制器操作这些图标等。

代码的影响力可能远超所有人(包括编程人员)的预料之外。

——Clive Thompson,《程序员:新族群的诞生与世界的重构( Coders: The Making of a New Tribe and the Remaking of the World )》

二进制打孔卡
年份:1725 年
第一批代码

二进制编程的诞生甚至比计算机本身更早。人们认为 Basile Bouchon 是第一个在纸上打孔并借此控制机器的人:1725 年,他发明了一种纺织设备,能够根据送入的打孔纸调整纺织图案。有孔代表“1”,无孔代表“0”。虽然在此之后发生过无数变化,但这种基本的代码构建单元从未改变。—Elena Botella

第一段实际执行的现代代码
年份: 1948
随着能够运行计算机代码与核毁灭模型的计算设备的出现,冷战军备竞赛也正式拉开帷幕

“电子数字积分器与计算机(ENIAC)”是第一台可编程的电子计算机。其诞生于 1945 年,通过在组件之间配置不同的接线以实现对具体问题的处理。当一项任务(例如加法)完成之后,将有新的脉冲触发下一项操作。几年之后,冯·诺依曼与洛斯阿拉莫斯国家实验室科学家 Nicholas Metropolis 接手 ENIAC,并在计算机上执行了第一条现代代码:在可寻址只读存储器(ENIAC 中的功能表开关)中执行数百条数字指令。他们利用蒙特卡洛技术模拟了新墨西哥州洛斯阿拉莫斯国家实验室正在评估的几种原子弹设计方案,并通过这种方式逐步模拟出一套复杂系统,从而反复规划可能的概率分布结果。冯·诺依曼和 Metropolis 向该实验室的核科学家们发送了 2 万多张打孔卡,上面记录着通过引爆弹头追踪模拟出的中子运动结果。

如今,这批代码的“子子孙孙”仍然运行在洛斯阿拉莫斯国家实验室的计算机当中。——Thomas Haigh,《ENIAC 在行动:现代计算机的诞生与重生(  ENIAC in Action: Making and Remaking the Modern Computer )》合著者

Grace Hopper 编译器
年份: 1952
让计算机获得处理单词的能力
IF END OF DATA GO TO OPERATION 14 .

( Wikipedia )

Grace Hopper 当时打算对一台早期计算机进行编程,并决定利用人类语言元素简化编程流程。Hopper 曾在第二次世界大战期间加入美国海军预备队,因此非常清楚军事机构的工作人员都在努力……或者说挣扎着学习理解二进制代码。但如果能够在编程语言中引入英语元素,那么这项工作的难度将大大降低、出错的可能性更小,从而让那些没有数学博士学位的工作人员也能更快上手。

有些人对这一想法嗤之以鼻,但到 1950 年初,她设计出第一款编译器。这是一组指令,能够将人类更易懂的代码形式转换为可供机器直接处理的低级代码。她和她的实验室利用该工具开发出 FLOW-MASTIC,第一种利用这一过程使用英语单词的编程语言。—Molly Olmstead

《Spacewar!》
年份: 1961
第一款正式发行的电子游戏
/ this routine handles a non-colliding ship invisibly/ in hyperspace
hp1, dap hp2 count i ma1, hp2 law hp3 / next step dac i ml1 law 7 dac i mb1 random scr 9s sir 9s xct hr1 add i mx1 dac i mx1 swap add i my1 dac i my1 random scr 9s sir 9s xct hr2 dac i mdy dio i mdx setup .hpt,3 lac ran dac i mthhp4, lac i mth sma sub (311040 spa add (311040 dac i mth count .hpt,hp4 xct hd2 dac i ma1hp2,  jmp .

(Steve Russell via Bitsavers.org )

1961 年末,一群年轻的麻省理工学院教员、学生及助理人员(其中不少人是当时 Tech Model Railraod 俱乐部的成员)夜以继日地围坐在一台捐赠而来的 DEC PDP-1 计算机面前。PDP-1 计算机代表着非军事计算技术的最高水平,单台售价高达 12 万美元(换算成目前的金额超过 100 万美元),能够支持 18 位字长并使用纸带存储程序。在五个月时间中,这些程序员开发出一款游戏,允许两名玩家控制飞船(其实就是屏幕上的简陋线图)一边躲避屏幕中央恒星的引力干扰,一边展开激烈的太空炮战。

《Spacewar!》在早期“黑客”社区当中迅速传播开来,随后以 DEC PDP-1 计算机上内置程序的身份预加载至核心内存当中,以供演示之用。该项目极大鼓舞了上世纪六十年代的编码社区,并启发了一代又一代电子游戏创作者。时至今日,这款游戏仍然以模拟的形式在计算机历史博物馆中定期展览。这款游戏的首席开发者 Steve Russell 在 2018 年史密森尼学会的小组会议上表示,“这款游戏已经有 50 多年历史了。从来没有用户投诉,也从来没有崩溃报告,且时至今日仍在正常运行。”——Arthur Daemmrich,勒梅尔森发明与创新研究中心主任

元初电子邮件
年份: 1965
来吧,这可是电子邮件。
WHENEVER A(1).E.FENCE.OR.A(2).E.FENCE.OR.A(3).E.FENCEPRFULL.($'R'1INSTRUCTIONS:$)PRFULL.($ '4MAIL NAME1 NAME2 PROB1 PROG1 PROB2 PROG2 ...$)PRFULL.($ WHERE '=NAME1 NAME2'= IS THE FILE TO BE MAILED,$)PRFULL.($ AND '=PROBN PROGN'= ARE DIRECTORIES TO WHICH '8$,1  $IT IS TO BE SENT.'B$)CHNCOM.(0)END OF CONDITIONAL

(CTSS Programmer’s Manual Page for MAIL )

1961 年,麻省理工学院的黑客们创建一套系统,允许多位用户登录至同一台计算机,并相互传递非常有限的消息。1965 年,一群编程人员决定开发一套正式的命令系统,用于发阔达、接收以及显示这些短小的数字消息。虽然当时的“高端人士”拒绝使用 MAIL 这条看似草率的命令,但其用法却大行其道。到 1971 年,麻省理工学院甚至收到历史上第一条垃圾邮件:一段反越战信息。—Clive Thompson

警察执法算法
年份: 1968
标志着现代警务预测与种族特征计算机化的开端

1965 年,时任美国总统的 Lyndon Johnson 组建总统执法与司法委员会,并要求该委员会研究如何利用计算机解决美国国内的“犯罪问题”。他和该委员会为这个问题设定了两个关键词,其一是“都市”、其二是“黑人”,计算机给出的答案即为“警察执法算法”。该算法旨在解决规划问题,例如在城市特定区域内应部署多少名巡逻警员。通过将该算法与犯罪数据库相结合,警务人员即可根据种族人口统计数据自动生成嫌疑人档案,并在发生犯罪活动之前部署对应资源(包括警员、武器以及其他装备)。时至今日,预测性警务方案仍然将黑人及棕色人种定为重点监控对象与犯罪高发群体。从执法算法的故事来看,这并不是什么不可预见的技术偏见,而是计算机技术 50 年来完美设计的直接体现。——Charlton Mcllwain,《黑色软件:互联网与种族正义对非洲及非裔群体的重要意义( Black Software: The Internet & Racial Justice, From the Afronet to Black Lives Matter )》一书作者

阿波罗 11 号登月计划 BAILOUT 代码
年份: 1969
这段代码用于防止登月舱计算机耗尽自身资源
POODOO    INHINT    CA  Q    TS  ALMCADR
TC BANKCALL CADR VAC5STOR # STORE ERASABLES FOR DEBUGGING PURPOSES.
INDEX ALMCADR CAF 0ABORT2 TC BORTENT
OCT77770 OCT 77770 # DONT MOVE CA V37FLBIT # IS AVERAGE G ON MASK FLAGWRD7 CCS A TC WHIMPER -1 # YES. DONT DO POODOO. DO BAILOUT.
TC DOWNFLAG ADRES STATEFLG
TC DOWNFLAG ADRES REINTFLG
TC DOWNFLAG ADRES NODOFLAG
TC BANKCALL CADR MR.KLEAN    TC  WHIMPER

阿波罗制导计算机(AGC)堪称人类科技发展史上的奇迹。根据阿波罗计划返回地球轨道规划负责人 Poppy Northcutt 的介绍,这台古老计算机的计算能力甚至不及一张能够记录祝福消息的电子贺卡。然而,它还是成功完成了任务。

有限的计算容量与存储空间,要求其必须认真管理每一项任务,因此 AGC 必须始终专注于最重要的工作内容。一旦计算量超出承载能力,整个登月计划都将因此失败。为此,项目成员开发出 BAILOUT。当计算机遭遇空间耗尽(或者说「溢出」)风险时,AGC 会触发 BAILOUT 以丢弃重要度相对较低的数据与运算,从而确保核心数据与运算保持正常运行。

当鹰号着陆器接近月球表面时,AGC 在距离月面 3 万英尺处发出了“1202”警报,遗憾的是阿姆斯特朗以及身处休斯顿宇航中心的控制员们并没有马上察觉。不到 30 秒之后,控制中心的计算机专家们得出结论:AGC 软件仍在按预期方式运行,即放弃低优先级工作并集中资源处理核心负载(整个切换过程很快,因此机组人员无法察觉)。阿姆斯特朗与奥尔德林继续使用由 AGC 提供的宝贵数据,引导登月舱一步步完成着陆。

在阿姆斯特朗上报“鹰号成功着陆”之前,溢出警报总共响了三次,但一切仍然按照预期方式运行。“Bailout”一词原本是指任务未能完成,可在阿波罗 11 项目中却成了人类最高成就的代名词。—Ellen Stofan,史密森尼国家航空航天博物馆主任

Hello, World!
年份: 1972 或更早
这句短语首次出现在代码当中
main( ) { printf("hello, world\n"); }

当我们集中注意力学习一种新的编程语言时,教程上的第一个案例就是如何在计算机屏幕上显示短语“Hello,world!”也许这条短语最知名的来源是贝尔实验室的备忘录《C 语言编程——一份教程》。这份材料编写于 1974 年。不过在编写于 1972 年的 B 语言教程中,我们同样看到了这条短语的身影。

Hello, World! 是一种伟大的教学方法。这是一项能够轻松完成的小任务,同时也代表着一种标准,体现出不同编程语言之间的重要差异。此外,这也是高级程序员在安装新环境测试一切是否正常的快速简便方法。(有时候,程序员们也会使用「hello world」运行时间来比较不同语言与环境的速度水平。)也许更重要的是,“Hello, world!”具有一种温暖而柔和的力量,对编程新人有着一种莫名的亲和力。代码拥有无穷威力,而新的世界已经向你张开怀抱。—Chris Noessel,IBM 公司 AI 设计负责人

空终止字符串
年份:1972
计算技术发展史上最严重的设计错误
char yellow[26] = {'y', 'e', 'l', 'l', 'o', 'w', '\0'};

( The GNU C reference manual )

1972 年,Dennis Ritchie 做出一个重大决定:在新语言中用一种名为“空终止字符串”表示文本。这个概念早已出现,但他决定将其引入自己的新成果 C 语言当中——而这个决定,给无数编程后继者带来了深远的影响。

编程语言表示一段文本的主要方式有两种:其一是提供固定的显式长度,相当于声明“我只包含 10 个字符,且无法容纳更多字符”;其二是采用空终止结尾——“我包含很多字符,直到出现零字节结尾。”

C 代码中的一类常见错误,就是把一条长字符串复制到某个较短字符串内并导致结尾处溢出,如此一来其邻近数据就会受到破坏。打个比方,这就像是本应在白板上作画,却把颜料涂到了板后的墙面上。

除了导致程序故障之外,攻击者还能够主动通过这类 bug 诱导程序利用经过精心设计的特定数据覆盖某些内容,进而改变程序行为。而这,就是经典的缓冲区溢出攻击。大家听说过的几乎所有安全漏洞,都有着一位共同的“老祖宗”——1988 年的 Morris 蠕虫。

虽然可以在 C 语言中通过认真编码避免此类 bug,但这种语言的设计特性使得此类 bug 极易出现且难以检测。从路由器到“智能”灯泡,虽然几乎每一种现代语言都会刻意避免空终止字符串问题,但 C 与 C++ 仍然统治着整个世界。因此,直到近 30 年之后,我们仍然无法彻底摆脱这个 bug。—Jamie Zawinski,Netscape 开发人者、Mozilla.org 创始人、DNA Lounge 负责人。

Telenet
年份:1975
第一个基于数据包交换机制的公共数据网络,当今互联网的主干

在互联网诞生之前,ARPANET 首先出现。这是一套计算机网络,主要供高级研究计划局(DARPA)的研究人员在机器之间进行数据交换。随着 ARPANET 在政府内部的快速扩张,其创造者意识到这项技术可能对普通大众也拥有重要价值,甚至有望带来巨大的财富收入。1975 年 8 月,ARPANET 的商业版本 Telenet 在七座城市首批上线,允许早期客户(主要是计算机或数据库企业)利用电话拨号实现数据上传与下载——相关用例包括原始电子邮件服务,以及远程访问存储在中央计算机上的代码。尽管 ARPANET 被普遍视为现代互联网的最早版本,但更准确地讲,为公众消费而设计的 Telenet 才是真正的互联网鼻祖。上世纪八十年代,Telenet 最大的客户之一正是 Quantum Link,也就是后来的 AOL 美国在线。——Jane C. Hu,Future Tense 贡献者

温哥华证券交易所的四舍五入错误
年份:1982
由小数点后取舍引发的“一场血案”
- return floor(value)+ return round(value)

温哥华证券交易所当初本应使用以上代码求取近似值。

1982 年初,温哥华证券交易所发布一项电子股票指数,基准定为 1000 点。在两年之内,其跌到了原始值的一半,但当时股票市场的涨幅相当强劲,因此人们感到大惑不解。一项调查显示,相关代码使用了 floor() 而非 round(),并导致命令中的指数计算存在错误。这条命令执行的是四舍五入运算,而没有按设计预期原样保留三位小数。(当时的数字计算机处理能力有限,因此必须使用四舍五入或者直接舍去等方法。)这意味着如果指数计算结果为 532.7528,那么正确的舍去结果应该是 532.752,而非四舍五入后的 532.753。虽然这种差异看似微小,但经过每天成千上万次计算之后,股指开始出现急剧下跌。最终,这一 bug 在 1983 年 11 月得到解决:在上周末收盘于 500 点左右之后,周一重新开放时公布的指数终于正确超过 1000 点。——Lav Varshney,伊利诺伊大学香槟分校副教授

Therac-25
年份:1985–1987
事实证明,过度自信是会死人的

头条新闻第一次发布由技术发展导致的事故。《洛杉矶时报》宣称,“过于复杂的现代软件正引发故障率的急剧提升。”一种被多家医疗机构中用于治疗癌症的机器在运行过程中发生爆炸,共波及六名患者,其中至少三人死亡。

调查人员事后发现,这台 Therac-25 设备在编程中存在致命错误。该机器提供低功率与高功率两种照射模式,而高功率模式需要利用金属设备过滤光束。但由于存在软件 bug,在未匹配适当金属设备时,操作人员同样可能意外触发高功率模式。

Therac-25 机型实际上是 Therac-20 的“改进”版本,当时人们认为其软件万无一失,因此不需要额外的安全检查。结果就是,工程师的过度自信引发了惨痛的伤亡事故。—Molly Olmstead

互联网中继聊天
年份:1988
最早的网络续聊技术
/join #cats

互联网中继聊天(简称 IRC)甚至在大多数人听说“互联网”这个字眼之前就已经存在。这是一种通过小组频道与他人进行实时聊天的流行技术方案。早期用户能够通过登录共享新闻内容——包括 1991 年媒体集体噤声时,用户借此传播苏联解体的爆炸性消息。当然,这种聊天方式本身也以代码的形式实现:要加入频道,需要输入“/join #[频道名称]”。(如今的 Slack 达人对此应该比较熟悉。)如果用户希望表达一些与自己相关的消息,也可以输入“/ 我太累了”,或者用 * 加“太累了”直接显示自己的名称与“太累了”字段。总而言之,虽然功能非常基础,但对大多数人来说,在线聊天成为他们接触互联网的第一站,也成为后世无数在线会话应用的基础雏形。—April Glaser

Morris 蠕虫
年份:1988
一场噩梦,让人们意识到互联网已经发展得如此庞大
checkother()          /* 0x57d0 */{    int s, l8, l12, l16, optval;    struct sockaddr_in sin;      /* 16 bytes */
optval = 1; if ((random() % 7) == 3) return; /* 612 */
s = socket(AF_INET, SOCK_STREAM, 0); if (s < 0)      return;

Morris 蠕虫代码中一条关键函数的内容摘录。

那时候,Robert Morris 自己乃至互联网都还非常年轻。时年 23 岁的康奈尔大学研究生 Morris 发布了 Morris 蠕虫,并造成“互联网上的首次大规模攻击。”在全球接入互联网的约 6 万台计算机中,有 10% 左右遭到破坏,引发数百万美元损失,并导致《纽约时报》首次在纸媒上登出“互联网”一词。即使是精通技术的从业者,也无法想象这股蠕虫攻势居然带来如此广泛的影响。Morris 表示,他从没想过要造成如此重大的损害,但严重后果使其成为因《计算机欺诈与滥用法》遭到起诉的第一人。在被判处三年缓刑之后,他成为著名创业孵化器项目 Y Combinator 联合创始人兼麻省理工学院计算机科学副教授。—Elena Botella

单行病毒
年份:上世纪九十年代
单行代码的威力首次显现,不断发展的计算机暴露致命弱点
: ( ) { : | : & } ; : 

请勿在自己的计算机上尝试。

上面这行代码,实际上是一种被称为“叉路炸弹”的单行病毒。其需要一些特定条件才能起效(例如使用较为陈旧且易受感染的 Unix 操作系统版本)。但只要满足这些条件,我们就可以在 Bash 中键入此命令,它会一遍又一遍自我复制,直到耗尽计算机的全部可用内存并导致系统崩溃。

之所以如此著名,不单单是因为它既体形小巧又威力巨大,同时也因为它使用了冒号作为函数名称。大多数函数(一种可重复使用的代码行)都会以描述性方式命名,例如“Print”或者“isThisEmailValid”,但这只是一种习惯而并非强制要求。虽然在大多数计算语言中,我们无法使用冒号作为函数名称,但 Bash 是个例外。

我在 2002 年参观德国法兰克福 Angewandte Kunst 博物馆时,第一次看到这行代码。很明显,没有多少代码值得在博物馆这样的地方展出。—Chris Noessel

HTML 超链接
年份:1990
这款以难以想象的方式帮助我们将一切串连了起来
<a href = "https://www.slate.com">Slate</a>

Tim Berners-Lee 创造的超链接概念,改变了整个世界。链接信息的概念并不算特别新颖,但超链接的新特性在于能够将计算机系统规则中的标点符号拼凑起来,从而建立起:// 这一标准 URL 格式。这种格式可以用于命名一切现在条目。虽然 Berners-Lee 一直很关注向下兼容问题,但事实证明超链接基本概念的强大使得这一设计思路永远不会过时。Berners-Lee 提出的超链接如今转化成了立即购买、点赞以及转发等多种形式。这些当初根本无法想象的用例告诉我们,当一波技术浪潮达成顶峰时,接下来又会有新的成果迅速跟上。—Charles Duan, R Street 技术与创新总监

JPEG 的诞生
年份:1992
永远改变了我们与图像间的关系
double *NaiveDct_transform(double vector[], size_t len) {  if (SIZE_MAX / sizeof(double) < len)    return NULL;  double *result = malloc(len * sizeof(double));  if (result == NULL)    return NULL;
double factor = M_PI / len; for (size_t i = 0; i < len; i++) { double sum = 0; for (size_t j = 0; j < len; j++) sum += vector[j] * cos((j + 0.5) * i * factor); result[i] = sum; } return result;}

以上代码代表离散余弦变换,也就是 JPEG 文件格式背后的基本思路。

Project Nayuki 。

时至今日,我们已经习惯于在相机里面塞满大量照片。但是,过去的图像数据需要占用巨大的存储空间。1992 年,联合摄影专家组发布了 JPEG 规范,旨在缩小图像文件的体积。虽然当时也出现了其他一些压缩格式,但 JPEG 之所以能够最终成为全球标准,凭借的就是其免版税许可制度。JPEG 运用的是有损压缩方法,这种处理过程会破坏某些人眼无法察觉的内容,例如颜色的细微变化。事实上,有损压缩思路还影响到 1992 年诞生的另外一项重大技术成果:mp3。这种音频文件格式,同样是通过丢弃人耳无法听到的数据比特帮助音频成功实现瘦身。—Aaron Mak

Mosaic 浏览器
年份:1993
我们所熟知的 Web 由此诞生
MakeImage(dsp, data, width, height, depth, img_info, clip)  Display *dsp;  unsigned char *data;  int width, height;  int depth;  ImageInfo *img_info;  int clip;{  int linepad, shiftnum;  int shiftstart, shiftstop, shiftinc;  int bytesperline,bpp;  int temp;  int w, h;  XImage *newimage;  unsigned char *bit_data, *bitp, *datap;  Visual *theVisual;  int bmap_order;  unsigned long c;  int rshift, gshift, bshift;
#ifdef NEW switch(bpp=bits_per_pixel(dsp,depth))#else  switch(depth)

以上为 2.7 版本中的部分代码。

此前的浏览器往往非常笨重,虽然能够很好地渲染文本,但却强迫用户在单独的窗口中查看图像。由 Marc Andreessen 带领的 Mosaic 技术团队希望打造一款能够同时显示图像与文本的浏览器。他们计划让 Web 看起来更类似于传统的杂志或者报纸。这一举措同时令 HTML 标准得到快速普及,并推动全球各地的网站管理员们积极利用更多标签让自己的站点看起来更酷。(事实上,当时的框体显示构图已经成为一种经典的视觉符号。) —Clive Thompson

像素跟踪
年份:1993
现代数据收集,始于这些看不见的图像
<img height="1" width="1" style="display:none"src="https://www.facebook.com/tr?id=166975463695820&amp;ev=PageView&amp;noscript=1"/>

Facebook 的 PageView 像素跟踪。

这些小小的 HTML 片段看起来不多,但却是当今数字广告的实现基石,同时也导致了监控、媒体整合甚至是误导性信息等现代问题的出现。

早在上世纪九十年代,网页设计师就利用透明的单像素图像调整页面布局。但是,那时候计算机必须下载网页上的每一张图片,包括其中的每一个像素。1993 年,企业开始利用这一机制,从而通过对像素下载活动的跟踪了解访问者是谁、身在哪里,并在用户的浏览器中触发某条已下载 cookie。通过这条 cookie,广告商即可在多个网站上跟踪到特定用户。

像素跟踪的成功,直接催生出 Facebook 的“点赞”按钮,其能够嵌入到每一个网站并对用户展开跟踪。规模如此庞大的数据收集体系,使得 Facebook 成为一家极为成功的广告商,每年从传统媒体企业手中夺取数十亿美元收入。随着传统新闻业的衰败,有针对性的误导信息开始大量涌现,以监控为基础的商业模式亦层出不穷。——Sara Wachter-Boettcher,《技术性错误:性别歧视应用、偏见算法以及其他有害技术( Technically Wrong: Sexist Apps, Biased Algorithms, and Other Toxic Tech )》一书作者

Robots.txt
年份:1994
一款小小的工具,却给搜索等众多领域带来巨大影响
User-agent: Mediapartners-GoogleDisallow:
User-agent: TruliaBotDisallow: /
User-agent: *Disallow: /search.html
User-agent: *Disallow: /comments/*
User-agent: Mediapartners-Google*Disallow:

我们自己的 robots.txt 文件。

如果大家使用过谷歌搜索,应该碰到过这样的情况:页面提示“由于此网站的 robots.txt,相关结果描述不可用。”毕竟并不是每个人都希望自己的网站内容被搜索引擎直接列出,因此我们可以在网站上添加一个 robots.txt 文件,要求负责 web 内容归类的机器人(或者说爬虫)绕过该网站而非直接显示其内容。这种强大的网站内容隐藏能力,也使得 robots.txt 成为最具争议的代码片段之一,先后引发大量与版权、黑客、非法入侵以及侵权法相关的案件。2009 年,第九巡回法院首席法官 Alex Kozinski 甚至还因此接受过司法不当行为调查。—Amanda Levendowski,乔治敦法学院知识产权与信息政策系主任

维    基
年份:1994
为维基百科的诞生铺平了道路
sub AsLink {   local($num) = (@_);   local($ref) = $old{"r$num"};   defined $ref        ? ($ref =~ /\.(?:gif|jpg|jpeg|png)$/i             ? "<img src=\"$ref\">"             : "<a href=\"$ref\">[$num]<\/a>")        : "[$num]";}

2000 年 6 月 13 日进行最后一次编辑的 WikiWikiWeb WikiBase。

Ward Cunningham 首先通过自己的网站 WikiWikiWeb 发明了维基,在他看来 WikiWikiWeb 代表着最简单的信息共享方式。他使用了一种基本的标记语言,其中包含括号,能够将单词以不留空格的方式直接串连在一起,并在文本周围加上大括号,以表示可进行编辑更新及组织的跨页面链接信息——时至今日,各类维基网站(包括 2001 年推出的维基百科)仍然广泛应用这套系统。这种可访问格式,使得维基成为众多重要在线活动的首选协作工具,从跟踪安全漏洞到发布在线笔记皆在此列。但与其他在线可编辑内容一样,维基系统也极易受到影响,用户往往对于应该及不应该发布哪些内容而爆发激烈的争论。正因为如此,维基百科才决定添加关于如何管理与编辑会话页面、以及如何添加新信息的明确规则。—April Glaser

第一个弹窗广告
年份:上世纪九十年代中期
互联网的祸害由此而起
window.open('https://www.slate.com/')

以上代码会打开带有特定 url 的新窗口。

对于弹窗广告,很多朋友应该都很熟悉了,毕竟“屠龙宝刀,点击就送”这类内容几乎已经成为我们网络生活的固定组成部分。

二十多年之前,我曾编写过一段代码,能够在打开用户请求的页面时开启另一个小小的网络浏览器窗口。这个新窗口,代表的正是如今令人们头痛不已的弹窗广告。在接下来几年中,我惊恐地发现弹窗广告开始在网络上迅猛传播,并成为互联网领域最糟糕、最具侵入性的广告宣传途径。

当时开发弹窗广告的原因非常简单:我所在的公司 Tripod 允许人们将自己需要的任意内容发布在免费的主页上。为了补贴这项服务,我们开始进行广告招商,但问题是广告商并不太喜欢我们在主页面中给出的展示内容。于是,我们决定把广告内容与用户内容分开,这就是弹窗广告的来历。

我知道弹窗广告不是什么好语音,第一次尝试时我就很清楚。但这是条贼船,上去了就很难下来。所以我们只能眼睁睁看着这一切发生,然后随波逐流。

自从这只诞生自我手的猛兽出世以来,我还出过书、办过企业、在大学当过老师。但最终,让我被人记住的永远只有弹窗广告。直到现在,我还经常收到谩骂邮件。—Ethan Zuckerman, 麻省理工学院公共媒体系主任

一段代码,让 T 恤衫成为非法商品
年份:1995 左右
语言:Perl,最早的代码激进主义行为之一
#!/bin/perl -s-- -export-a-crypto-system-sig -RSA-3-lines-PERL$m=unpack(H.$w,$m."\0"x$w),$_=`echo "16do$w 2+4Oi0$d*-^1[d2%Sa 2/d0<X+d*La1=z\U$n%0]SX$k"[$m*]\EszlXx++p|dc`,s/^.|\W//g,print pack('H*',$_)while read(STDIN,$m,($w=2*$d-1+length($n)&~1)/2)

( Munitions T-Shirt Homepage )

衬衫上写有“警告:这件衬衫属于军火类商品,不得从美国出口或向外国公民展示。”

有一段时间,美国政府曾经把强大的加密技术视为如同地对空导弹般的武器,认为其极度危险因此绝对不可落入美国敌人的手中。当初,加密技术只能运行在笨重且昂贵的设备当中,因此这样的想法似乎也有那么点道理。但到上世纪九十年代,当密码学研究人员接触到互联网之后,美国国务院提出的此类要求已经完全沦为一纸空谈。如今,RSA 加密算法早已成为现代密码学的基础。这种算法非常优雅,只需要四行密集的 perl 代码就能写完——这样的长度,使其完全可以被打印在一件 T 恤衫上。最早的一批 T 恤衫早已成为收藏品;而出口管制虽然没有完全取消,但也早已大幅放宽。—James Grimmelmann,康奈尔理工大学法学院法学教授

谷歌的 PageRank 算法
年份:1996
革新我们对知识内容的组织方式
import numpy as np
def pagerank(M, num_iterations=100, d=0.85): N = M.shape[1] v = np.random.rand(N, 1) v = v / np.linalg.norm(v, 1) iteration = 0 while iteration < num_iterations: iteration += 1 v = d * np.matmul(M, v) + (1 - d) / N    return v

在 PageRank 诞生之前,搜索引擎会根据我们的查询词与文档内容的匹配情况进行信息查找。但在 PageRank 中,Larry Page 与 Sergey Brin 注入了绝妙的新思路:知识即社交——搜索也应如此。他们开发出一种算法,能够根据在线链接至某一页面的其他页面数量,对该页面的重要度进行估算并形成结果排序。凭借着这一点,谷歌才逐步建立起如今无可匹敌的强大力量。—Clive Thompson

GeoCities 鼠标轨迹
年份:九十年代中期
它使网站上最平凡的元素也爆发出耀眼的光辉
JSFX.FireSpark.prototype.changeColour = function(){  var colour="";
r2= Math.random()*255; g2= r2; b2= 0;
if(!(r2 | g2 | b2)) { r2=255; g2=255; b2=0; }
colour = "#" + dec2hex(r2) + dec2hex(g2) + dec2hex(b2); this.setBgColor(colour);}

( Roy Whittle )

Douglas Englebart 与 Bill English 在上世纪六十年代发明的鼠标,彻底改变了我们与计算机交互的方式。虽然鼠标的使用方式非常直观,但当时的显示技术却往往跟不上鼠标的快速移动功能。为此,操作系统开发人员添加了鼠标轨迹,旨在显示光标原先所在位置的瞬间阴影图像,从而帮助用户更轻松地跟踪并查找当前光标位置。

九十年代中期,GeoCities 是第一家允许用户免费且轻松创建自有 Web 内容的服务厂商。GeoCities 的 WYSIWYG 编辑器允许用户轻松拖放内容,并添加自定义代码片段,其中就包括对访问者观看到的鼠标轨迹进行自定义的代码。在 GeoCities 页面中,我们的光标可以显示出七彩魔尘、小泡泡或者万圣节小蝙蝠等丰富多彩的轨迹。这些光彩夺目的像素引发了一场网络狂欢,让我们能够在“网络空间”当中第一次体会到彰显个性的感觉。—Nikki Stevens, 亚利桑那州立大学博士生

  RSS   
年份:1999
让人们一次读遍《纽约时报》、每周热点以及其他最新资讯
<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0">  <channel>    <title>RSS Title</title>    <description>This is an example of an RSS feed</description>    <link>http://www.example.com/main.html</link>    <lastBuildDate>Mon, 06 Sep 2010 00:01:00 +0000 </lastBuildDate>    <pubDate>Sun, 06 Sep 2009 16:20:00 +0000</pubDate>    <ttl>1800</ttl>
<item> <title>Example entry</title> <description>Here is some text containing an interesting description.</description> <link>http://www.example.com/blog/post/1</link> <guid isPermaLink="false">7bd204c6-1655-4c27-aeee-53f933c5395f</guid> <pubDate>Sun, 06 Sep 2009 16:20:00 +0000</pubDate> </item>
</channel></rss>

通过将新闻报告、博客、帖子、播客以及其他各种形式的发布内容转换为统一的标准格式,rss(全称为富站点摘要,也有人将其解释为极简联合)代码允许我们以一种简单且高效的方式整合来自各种来源的发布信息。从 2005 年诞生的 Google Reader,到 2013 年 RSS 1.0 核心开发者、互联网自由活动家 Aaron Wartz 不幸逝世,RSS 在其巅峰时期几乎垄断了整个互联网上的信息发布渠道。尽管如今 Google Reader 早已不复存在,RSS 仍然在互联网中占据着前沿位置,并影响着从新闻整合器到播客应用的各类发布平台。—David S. Levine, 埃隆大学法学院副教授

失落的火星气候轨道器
年份:1999
因数学错误而失败的太空探索项目

1999 年 9 月 23 日,NASA 的科学家们发现价值 1.25 亿美元的火星气候轨道飞行器与控制中心彻底失去联系。后来的一项调查确定了失败原因:某位承包商为轨道飞行器编写了一款采用英制单位的程序,问题是虽然美国国内使用英制单位,但 NASA 的软件却使用公制单位。正是代码中的单位错误,导致轨道飞行器前进至计划外的未知位置。

这当然可以说是个不小心造成的失误,但同时也让我们意识到如今的软件世界有多么脆弱。一切连接技术,包括电话、宇宙飞船、智能榨汁机,都需要特定的接口来定义其实际通信方式。而即使是最小的误差,也可能引发巨大的灾难。—Charles Duan

一段代码让无人机变身导弹发射平台
年份:2000–2001 左右
无人机战争由此正式打响。

早期“捕食者”无人机的武器化,不仅代表着技术史上的一个标志性时刻,同时也成为军事与政治史中的一大里程碑。无人机系统如今在战场上大量涌现,改变了士兵的作战甚至思维方式。另外,捕食者无人机的武器化也推动美国进入了“无人机战争”新时代。而考虑到 AI 技术支持下的机器人正获得越来越强大的自主能力与武装水平,我们无疑正处于这一新时代的起步阶段。换言之,一款简单的程序可能已经打开了这个装有合法性、伦理性乃至存在性矛盾的潘多拉魔盒。——P.W. Singer,《战争连线:二十一世纪的机器人革命与冲突( Wired for War: The Robotics Revolution and Conflict in the 21st Century )》一书作者

Roomba 导航系统
年份:2002
为技术与现实世界的对接建立起新的通道
(define-behavior (bounce        :start-when (or (bump?)                      bounce-trigger? )        :abort-when (bump-edge?)        :onetime? t      ))

(iRobot)

大家肯定还记得第一次看见 Roomba 的情景:我是在 17 年前在朋友家第一次见到。这台扫地机器人在屋里转来转去,我则在沙发上开怀大笑。但就是这台略显笨拙的小设备,却代表着一场机器人技术革命的新曙光。(就在这台机器人为无数家庭清扫家居环境的同时,与其具有相同基因的兄弟机型则在战场上清除残留炸弹,这着实令人震惊。)自那之后,我们很久没有见到同样令人印象深刻的成就了。Roomba 证明,虽然我们的注意力很容易被波士顿动力那些会开门、采用反关节设计的狗型机器人所吸引,但无法全面普及的产品永远登不上时代的巅峰。Roomba 之所以形成了自己的小众市场,并不是因为它能够带来多理想的清扫效果,而是因为它能够提供非常强大的室内导航功能。我们喜爱 Roomba 的根本心理,与喜爱小猫基本一致——我们会一直盯着它在屋里转悠、撞上桌腿、换个方向、再继续前进,同时获得巨大的心理满足感。—Lowen Liu, Slate

无线网络的等比例公平调度
年份:2003 左右
这一解决方案,让手机蜂窝网络成为可能
[~, b_user] = max(drc(i, :)/_avg_thruput(i, :));avg_thruput(i+1, :) = (i/(i+1))*avg_thruput(i, :);avg_thruput(i+1, b_user) = (i/(i+1))*avg_thruput(i, b_user)+drc(i, b_user)/(i+1);

2002 年 9 月 10 日,美国专利号 6449490,“定向发射器、多接收器系统采用路径分集机制,最大限度提高了数据吞吐量。”

无论何时、无论何地,基站信号覆盖范围内的手机数量都相当可观。如果不进行调度,所有传输通道都将相互干扰,并阻止其他设备以可靠方式接收信息。因此,基站必须优先实现一项基本要求:确保所有用户都能够完成通话。考虑到噪音较大位置的用户需要利用更多的资源才能获得相同的服务质量,解决方案必须在个体用户需求与整体网络性能之间进行折衷。等比例公平调度机制确保所有用户至少享有同样的最低服务水平,同时最大限度提升总体网络吞吐量。这一目标的实现离不开对用户资源需求优先级的调整。区区三行代码,让全世界所有 3g 与 4g 蜂窝网络全面运作了起来。—Lav Varshney

比特币
年份:2008
代码,成就了一种前所未有的新型货币形式
double AttackerSuccessProbability(double q, int z){    double p = 1.0 - q;    double lambda = z * (q / p);    double sum = 1.0;    int i, k;    for (k = 0; k <= z; k++)    {        double poisson = exp(-lambda);        for (i = 1; i <= k; i++)            poisson *= lambda / i;        sum -= poisson * (1 - pow(q / p, z - k));    }    return sum;}

无论你是比特币的支持者、质疑者还是旁观者,至少应该对该项目的巨大影响持肯定态度。比特币本身已经积累起数千亿美元的直接投资,但更重要的是,从保障民主选举到结束非感官性接触,其背后的基础技术区块链似乎拥有着无穷无尽的可行应用方向。

一切始于 2008 年,当时自称为“中本聪”的比特币缔造者发布白皮书,这也标志着这种全新货币的正式诞生。比特币项目中的代码,决定了攻击者几乎不可能接管比特币区块链体系。强大的数学原理让全世界相信,这样一套由互不相识的人们建立起的系统完全值得信任。以此为开端,后续总计出现了至少 2777 种其他加密货币。—Elena Botella

Conficker 蠕虫
年份:2008 年 10 月至 2009 年
将受感染的计算机设备转化为一支恶意肉鸡大军
; BOOL __cdecl HasUkrainianLocale()                push    ebx                mov     ebx, ds:GetKeyboardLayoutList                push    ebp                push    esi                xor     ebp, ebp                push    ebp                push    ebp                call    ebx                mov     esi, eax                cmp     esi, ebp                jz      short loc_37680A

安全研究人员 Tillmann Werner 与 Felix Leder 共同编写了这段代码,并在对抗 Conficker 蠕虫的过程中证明了其功能等价性。

十年之前,多达 1500 万台计算机感染了 Conficker 病毒。这种病毒利用的,正是 Windows 操作系统中的固有安全漏洞。这种病毒令人恐惧,但其中先进的设计理念也让其背后的操纵者备受尊敬:该并不比会将每台计算机转化为超大规模肉鸡集群的一部分,等待命令,并阻止受感染计算机打开安全程序或者下载任何能够清除该病毒的补丁程序。其最早版本还拥有一项有趣的特性:它会在任何使用乌克兰语键盘布局或者乌克兰 IP 地址的系统中自毁。几年之后,对该病毒进行逆向工程的权威机构及研究人员得出结论,表示 Conficker 的几位创造者确实是乌克兰人,他们设计出的这一特性也是为了避免触犯国内法律。幸运的是,黑客们从未利用 Conficker 建立起真正的僵尸网络。截至 2018 年,估计仍有 35 万台电脑中感染有该病毒,这也再次提醒我们高水平程序员完全有能力轻松发动跨国攻击,并有针对性地对特定用户群体造成严重破坏。—Jane C. Hu

点赞按钮
年份:2009
它促进了监控经济的出现与发展
{"__typename":"PageLikeAction","action_type":"LIKE","label":{"text":"Like"}

2019 年 9 月的 Facebook.com 网站

Facebook 公司通过“点赞”按钮,帮助用户获得了一种向全世界表达个人喜好的方式。但实际上,它同时也在利用我们的认知偏见与设计之力,引导我们分享更多信息。正如之前提到的像素跟踪技术会不断收集关于用户浏览习惯的数据,点赞按钮实际上也在我们的网络生活中长伴身旁。接下来,Facebook 公司会将这些信息卖给广告商。如果某家户外产品公司想做做宣传,Facebook 很清楚这类内容应该被优先推送给那些曾给徒步旅行、露营网站以及户外运动等话题点赞的用户。如果这些用户又给广告本身点了赞,那么信息又会进一步反馈到目标定位算法当中。整个监控与商业操纵循环不断持续,而其根源正是这个小小的蓝色拇指图形。—Ari Ezra Waldman,纽约法学院教授

HTTP STRICT TRANSPORT SECURITY
年份:约 2009
通过为网站默认设置安全通道,我们得以轻松实现数据保护
Strict-Transport-Security: max-age=31536000; includeSubDomains

当我们通过简单而又陈旧的 HTTP 向某网站发送信息时,内容实际上已经外泄,可能被他人所截获,夺取您的信用卡信息、病历记录甚至是伴侣与宠物姓名。HTTPS 的出现很好地解决了这个问题,但在很长一段时间内,这种更先进的协议一直以可选方案的形式存在。这时,我们可以输入 http strict transport security(HSTS)。这是一种能够确保自始至终加密一切发出与收入消息的 Web 通信解决方案。如果您尝试访问 http://google.com,它会自动引导您访问 https://google.com。是的,HSTS 就负责这一项工作,而且完成得很好。

HSTS 目前仍然不太普及:只有 11.1% 的网站在实际使用。但重要的转折发生在 2015 年春季,当时美国联邦政府与各行业合作伙伴在 19 个政府域名中引入了 HSTS,其中包括 whiteouse.gov 、 aids.gov 以及 donotcall.gov 。不久之后,所有联邦机构都接到通知,要求必须采用该标准。——Rusty D. Pickens,奥巴马政府前白宫新媒体代理主任

Heartbleed
年份:编写于 2012 年,发现于 2014 年
计算科技史上影响范围最广、危害最严重的安全漏洞之一
buffer = OPENSSL_malloc(1 + 2 + payload + padding);bp = buffer;
/* Enter response type, length and copy payload */*bp++ = TLS1_HB_RESPONSE;s2n(payload, bp);memcpy(bp, pl, payload);bp += payload;/* Random padding */RAND_pseudo_bytes(bp, padding);

( Naked Security )

2014 年,安全研究人员发现了 OpenSSL 中的一项安全漏洞。OpenSSL 是一套非常流行的开源库,约有三分之二的网站(包括 dropbox、twitter、yahoo 以及 github 等)利用它实现两台计算机之间的在线通信。Heartbleed 允许恶意攻击者利用数百万设备中的缓冲区过度读取漏洞窃取未经加密的受保护信息,包括登录凭证与加密密钥。它的出现,让人们注意到利用开源软件实现关键安全功能所带来的巨大风险,以及从代码中发现漏洞是何等艰难(这些包含漏洞的代码已经完美运行了多年)。但好消息是,Heartbleed 也很快引发一波全球反应,包括世界范围内的协调、宣传与补救工作,这让我们对未来的安全形势又有了一些信心。—Josephine Wolff, 塔夫茨大学副教授

波音 737 Max
年份:发布于 2017 年
一个软件错误,加上企业的贪婪,最终导致数百人死亡以及整个机型的停飞

2018 年 10 月,泰国狮子航空的 610 次航班在出发后不久即坠入大海。这起事故虽然看似反常,但波音公司向公众保证该机型绝对安全,并表示只是需要进一步加强飞行员培训以及“软件升级”工作。但就在 4 个月之后,埃塞俄比亚航空公司的一位飞行员发现飞机的自动驾驶系统试图将机头向下推。他连续 20 次尝试将机头拉起,但几分钟之内,全机乘客仍然不幸遇难。作为回应,世界各地的航空公司立即决定停飞这一机型。调查显示,坠机事故源自 737 Max 的设计问题,特别是一些难以察觉的软件故障。这些软件可能引导飞机反复俯冲。——Mar Hicks,科技史学家、《程序不平等问题( Programmed Inequality )》作者

原文链接:

https://slate.com/technology/2019/10/consequential-computer-code-software-history.html

大会推荐

以数仓体系为基础,通过 BI 平台支撑 7W 多张图表,也可通过数据服务支撑 60 多个业务系统和 600 多个模型。网易严选具体如何实现数据中台建设?可点击【阅读原文】了解一下。

最后一波折扣期,限时立减 880 元,团购更优惠!)可点击【阅读原文】了解一下。

今日荐文

架构的过程中,经常会遇到一致性的问题。尤其是在微服务架构下,每个微服务都有自己的数据库,导致微服务架构的系统不能简单地满足 ACID,我们就需要寻找微服务架构下的数据一致性解决方案。

微服务架构下一致性最佳实践



点个在看少个 bug 👇

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: