New Zealand
Tagalog
ibahagi

人类历史上最重要的36个代码片段(一)

转载May-akda: 神译局
人类历史上最重要的36个代码片段(一)
Buod神译局是旗下编译团队,关注科技、商业、职场、生活等领域,重点介绍国外的新技术、新观点、新风……

编者按:Marc Andreessen十年前说的“软件蚕食世界”不仅完全正确,而且似乎不仅如此:软件正在重塑世界。人类世界的运转已经无法离开软件。在浩如烟海的软件代码当中,哪些对我们起到了关键作用呢?Slate网站邀请了各方人士对那些改变了一切的代码进行评选,这里筛选出36个代码片段。如果你有更好的选项,不妨在评论区留下你的意见。原文作者是Future Tense,标题是:The Lines of Code That Changed Everything。鉴于篇幅太长,我们将分三部分刊出,此为第一部分。

hougarden

早在2009年,Facebook推出了改变世界的代码段——点“赞”按钮。“赞”是几名程序员和设计师的创意,其中包括Leah Pearlman和Justin Rosenstein在内。他们推测,Facebook用户常常因为太忙而没时间到朋友的帖子上发表评论,所以想如果有一个简单的按钮可以按一下的话,也许互动就会爆发:这可以释放出大量令人兴奋的肯定。就像Pearlman 后来所说那样:“朋友们可以通过这种频繁的多、容易得多的互动手段来相互验证。”

这个点子奏效了,也许有点太好了。通过把“赞”做成一个零阻力的手势,到了2012年,大家的点赞次数已经超过1万亿次,并且的确释放出了大量的验证。但是它的副作用也令人不安。我们发布了一张照之后片,就会坐在那里焦急地不断刷新页面,等待点赞数的增加。我们想知道为什么别人拿到的点赞数会比自己的多。于是我们开始给自己日常的在线行为放大功率:想变得更有趣、更刻薄、更迷人、更极端。

代码塑造了我们的生活。就像风投家Marc Andreessen所写那样:“ 软件蚕食整个世界”,尽管此刻说软件正在消化世界可能会更准确些。

从文化角度上来讲,代码是比较下层的存在。我们可以感觉到它对我们日常现实的神秘影响,但是却很少能看到它,而且对于非初学者来说有点高深莫测。(硅谷的人喜欢这样这有助于他们自我神话为巫师。)我们给电影、游戏和电视都立了十大排行榜,让那些塑造了我们灵魂的作品扬名立万。但是,即便代码跟这些类型的作品一样反映了时代思潮,我们却未曾坐下来汇编过世界上最重要的代码清单。

所以Slate杂志决定自己来做这件事。为了弄清楚有哪些让世界为之倾斜的软件,杂志编辑对计算机科学家、软件开发人员、历史学家、政策制定者以及新闻工作者进行了民意调查。这些人需要做出以下选择:哪些代码段影响巨大?哪些代码改变了我们的生活?约有75位受访者提出了各种各样的想法,Slate从中选择了36位。鉴于写成的有影响的代码如汗牛充栋,这里的清单并不完整,也不可能完整。(我很喜欢的一个并没有人选:快速排序算法!或者Ada Lovelace的伯努利算法也许也算一个。)就像所有的榜单一样,它的目的是启发,去帮助我们重新思考代码是如何影响我们的生活,以及程序员所做的决策是如何影响未来的。

里面的有些代码你可能已经听说过,比如HTML什么的。有的代码功能强大(比如用来对概率建模的蒙特卡洛模拟),但一般人完全不知道是什么。有的则包含了致命错误,比方说波音737 Max的缺陷。还有一些令人毛骨悚然,比方说让营销人员知道你是否已打开电子邮件的像素跟踪。

有一个趋势是很明显的:最重要的代码往往会通过消除阻力来塑造新行为。当软件让做某件事情变得更容易时,这种事情我们就会做得更多。1988年编写的代码第一次建立起“Internet Relay Chat(IRC,多人在线交谈系统)”,这使得早期的网民彼此可以实时进行文字聊天。现在,实时文字聊天已经无处不在,从令人应接不暇的Slack职场闲聊吹水,到Twitch直播的钓鱼和反钓鱼之战,不一而足。

某些代码什么时候具备了划时代意义未必总是很清晰。一开始它只是个怪异的尝试,一个实验气球。《Spacewar !》是第一个获得病毒式流行的视频游戏。可是在1961年的时候,用价值12万美元(相当于2019年的100万美元)的机柜式计算机万游戏被视为一种相当无聊的使用方式。但是它独创了很多帮助计算机进入主流的概念:用图标表示数据,让用户用手持控制器操作这些图标。

代码的影响可能会让所有人感到惊讶,包括写代码的人在内。—Clive Thompson,《程序员: 新部落的形成和世界的重塑(Coders: The Making of a New Tribe and the Remaking of the World)》作者

1、二进制穿孔卡片

年代:1725

二进制编程早在计算机诞生之前就有了。大家认为Basile Bouchon 是第一个给纸片打孔并用来控制机器的人:1725年,他发明了一种织布机,这种机器可以根据送入的穿孔卡片的指令编织图案。打孔的是“1”,没有打孔是“0”。尽管此后东西发生了很大的变化,但代码的基本构建块并没有改变。— Elena Botella ,Slate

2、执行的第一段现代代码

年代:1948

ENIAC(电子数字积分计算机)是第一台可编程的电子计算机。机器于1945年建成,每解决一个新问题都要靠重新连线许多部件来完成。当一项任务(比如加法)完成时,会用一个脉冲来触发下一项任务。但是几年后,克拉拉· 丹·冯·诺依曼和洛斯阿拉莫斯的科学家Nicholas Metropolis对ENIAC重新进行了接线,让这台机器跑出来有史以来在任何计算机上执行的第一段现代代码:从可寻址只读存储器(ENIAC的函数表开关)执行数百条数字指令。他们模拟了新墨西哥州洛斯阿拉莫斯国家实验室正在评估的几种原子弹设计的爆炸情况,用蒙特卡洛技术来模拟一个复杂系统,几乎是一步步地把可能结果的概率分布呈现出来。冯·诺依曼和Metropolis)向洛斯阿拉莫斯的核科学家发送了20000多张卡片,跟踪弹头引爆后模拟中子的变化情况。知道今天,这段代码的子孙后代还在洛斯阿拉莫斯那里发挥作用。—Thomas Haigh ,《ENIAC in Action: Making and Remaking the Modern Computer(ENIAC实战:现代计算机的制造和改造)》合著者

3、Grace Hopper的编译器

年代:1952

来自维基百科

当Grace Hopper决定通过以人类语言为基础来简化整个过程时,她正在对一台早期计算机进行编程。二战期间,Hopper加入了美国海军预备队,她知道,像她在部队的上司一样,大家都在努力去理解二进制代码。而如果编程语言是基于英语的话,那么这项工作就不会那么容易出错,并且对于那些没有数学博士学位的人来说也更加平易近人了。

一些人对这种想法嗤之以鼻,但1950年代初时,她设计出了一种编译器,也就是一组可以将更容易理解的代码转化为由机器处理的较低级代码的指令。通过这一工具,她和她的实验室开发出了FLOW-MATIC,这是第一种将英语纳入该过程的编程语言。——Molly Olmstead,Slate

4、星际飞行(Spacewar)!

年代:1961年

Steve Russell,收集自Bitsavers.org

1961年末,一群年轻的MIT雇员、学生和同事(其中很多是Tech Model Railroad俱乐部的成员)拿到了最近别人捐赠的DEC PDP-1计算机的深夜使用权。属于非军事计算前沿技术的PDP-1售价为12万美元(按今天计算将超过100万美元),字长达18位,程序存储用的是纸带。这帮程序员用五个月的时间开发了一个游戏,里面是两名玩家控制着飞船(针和楔形物)进行一对一的太空战,同时还要避开位于屏幕中心的恒星的引力。

很快,星际飞行!就在早期的“黑客”社区中传播开来。后来DEC把它预装进了每一台PDP-1里面,并预装到核心内存里面,准备在安装时进行演示。这个程序对1960年代规模还很小的编码社区产生了重大影响,并启发了后面数代的视频游戏创作者。现在它还从模拟者那里找到自己的存在,并且在计算机历史博物馆的最后一台可操作PDP-1上还在定期演示。2018年,游戏的首席开发者Steve Russell在史密森尼学会上说:“它已有50多年的历史。没有未解决的用户投诉。没有崩溃报告。而且支持依旧提供。”——Arthur Daemmrich ,导演,勒梅森发明与创新研究中心

5、电子邮件的起源

年代: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 程序员MAIL手册页

1961年,麻省理工学院的黑客开发了一个系统,这个可以让多个用户登录到同一台计算机上,然后他们开始互相给对方简短留言。1965年,一群编码人员决定开发一个正式的命令系统来发送、接收和显示这些数字化的信函。对于“MAIL”这个命令一开始上级是拒绝的,觉得有点轻率,但它的使用却大行其道,以至于到1971年,麻省理工学院甚至出现了第一条垃圾邮件:一条反越战的信息。——Clive Thompson

6、警察巡逻算法

年代:1968

1965年,当林登·约翰逊总统组建总统执法与司法委员会时,他下令该委员会研究如何利用计算机来帮助解决美国的的“犯罪问题”,他和该委员会对这个问题的定性是“城市问题”和“黑人问题”。这个问题的答案是“警察巡逻算法(Police Beat Algorithm,PBA)”,该算法旨在解决规划问题,比方说在城市的特定区域需要安排多少名警察巡逻之类的问题。通过将PBA与犯罪数据库相结合,警方可以在犯罪实施之前根据种族人口统计数据自动生成嫌犯档案,并相应部署资源(警察,武器和其他装备)。今天的预测警务对黑人和棕色人种监视并定罪的情况相对不成比例。就像PBA的故事提醒我们那样,这种情况并不是不可预见的技术故障的结果:相反,这是这项技术50年设计的完美体现。——Charlton McIlwain,《黑人软件(Black Software: The Internet & Racial Justice, From the Afronet to Black Lives Matter)》作者

7、阿波罗11号登月舱的紧急救助代码

年代:1969

POODOO INHINT CA Q TS ALMCADR TC BANKCALL CADR VAC5STOR # STORE ERASABLES FOR DEBUGGING PURPOSES. INDEX ALMCADR CAF 0ABORT2 TC BORTENTOCT77770 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

数字化:Virtual AGC与MIT Museum

阿波罗制导系统计算机(AGC)是一个奇迹:就像计算阿波罗重返地球轨迹的Poppy Northcutt告诉我那样,AGC的计算能力还比不上今天记录个人信息的贺卡。但是,它却做到了该做的。

有限的计算能力和存储空间意味着必须细致地管理好任务,因此AGC始终聚焦在最重要的工作上。如果它没有足够的空间来执行任务,那就不可能完成任务。AGC软件团队知道,总有些事情是自己计划不到的。因此,他们开发了BAILOUT。当计算机有空间用完(或“溢出”)的风险时,AGC会触发BAILOUT把不太重要的数据和操作调走,从而让重要的数据和操作保持正常运行。

当Eagle着陆器准备降落到月球表面时,大概在30000英尺高空处,AGC 发出了“1202”的警报,尼尔·阿姆斯特朗和休斯敦的飞控都没有马上意识到这一点。但是在不到30秒的时间内,指挥中心的计算机专家表示,AGC软件正在按预期的方式运行:放弃了低优先级的工作并重新开始重要的工作(这个过程很快,以至于大家都无法察觉)。阿姆斯特朗和Buzz Aldrin可以继续从AGC那里得到他们绝对需要的东西,好继续安全着陆。

在阿姆斯特朗说出“鹰已降落”之前,溢出警报还会再响三声,但永远是因为事情按预期进行才会响。“救助”一词通常表示任务以失败结束,但在这里却让人类的最高成就成为现实。— 史密森尼国家航空航天博物馆主任Ellen Stofan

8、Hello, World!程序

日期:1972年或更早

当你坐下来学习一门新的编程语言时,教程要你做的第一件事就是让计算机显示出 “Hello,world!”这句话。也许早期最著名的例子来自贝尔实验室备忘录,《C语言编程教程》。 这本书写于1974年,尽管有人发现在1972年的B语言手册里面也发现了它,而且可能时间比这还要早。

Hello, World!是一个很美丽的教材。这是一项很小的、可完成的任务,可以让人早早获得成就感。这已成为了标准,有助于说明不同编程语言之间的差异。对于高级程序员来说,这也是一个快速简便的方法,可确保在安装新环境后一切正常。(有时候程序员会用“实现'hello world'的时间'作为比较语言和环境的速度测试。)也许最重要的是,“Hello,world!”天真、友善,而且有助于说明新程序员的代码可产生的影响范围。那就是全世界。——IBM AI设计主管Chris Noessel 。

9、空终止串——Null

年代:1972

GNU C参考手册

1972年,丹尼斯·里奇(Dennis Ritchie)做出了一个重大决定:自己的新语言要用一种所谓的“空终止串”来表示文本。这个概念其实早就出现了,但是他在自己的新语言,C语言里面把它奉若神明,而这一决定的遗产从此就一直缠住了我们。

编程语言表示一段文本的主要有两种方式:它可以是内在的固定长度的——“我就包含10个字符,就这么多。”也可以用过空值(null)结尾——这里有一堆的字符,你尽管看下下去,直到最后到达零字节为止,祝你好运!”

C代码中一个极其常见的错误是把一个长字符串复制到一个较短的字符串,造成结尾处溢出,这意味着你破坏了刚好在附近的其他数据。就像在白板边上写东西一样。

除了只是导致程序发生故障外,此类错误还可以用来说服程序用经过精心设计的特定数据去覆盖某些内容,从而改变程序的行为。这就是缓冲区溢出攻击。但凡你听说过的安全漏洞几乎都是从这里开始的,其始作俑者就是1988年的莫里斯蠕虫病毒(Morris Worm)。

仔细写代码可以避免在C语言中出现此类错误,但是这种语言的特点导致此类错误产生容易检测难。几乎所有的现代语言都避开了以null终止的字符串,但是从路由器到“智能”灯泡,C和C ++仍然在世界的基础处运行着。因此,在将近50年后,我们仍跟这类bug在玩打地鼠的游戏。——Jamie Zawinski,Netscape开发者,Mozilla.org创始人,DNA Lounge老板

10、Telenet远程网

年代:1975

互联网的前身是ARPANET,这是一个供高级研究计划局(现为DARPA)研究人员机器之间交换数据的计算机网络。随着ARPANET在政府内部的扩张,网络搭建者意识到这项技术可能对普通大众也很有价值,以及参与到其中可以催生多少的商机。1975年8月,ARPANET的商业版本Telenet 在七个城市上线,该网络可让最早期的客户(主要是计算机或数据库公司)用电话拨号方式上传下载(如电子邮件原型消息)或远程访问存储在中央计算机上的代码。虽然ARPANET通常被认为是现代Internet的鼻祖,但实际上为公众消费而设计的Telenet才是Web的前身。实际上,1980年代Telenet的最大客户之一就是Quantum Link,后者后来成为AOL。——Jane C. Hu,Future Tense contributor

11、温哥华证券交易所的舍入误差

年代:1982

- return floor(value)+ return round(value)

温哥华证券交易所使用的代码大概是这样的。

1982年初,温哥华证券交易所推出了一种一开始锚定基点为1000点的电子股票指数。但是推出后在两年的时间之内,它就跌到了原始价值的一半,这种走势在牛气冲天的1980年代初期是一个令人困惑的反例。一项调查显示,对指数的计算在一个地方出了问题,那就是用floor()而不是round()。用floor意味着指数被舍入而不是取整到小数点后三位。(数字计算机必须要有有限的精度,因此需要四舍五入或截断。)因此,如果指数计算值为532.7528的话,计算机保存下来的值是532.752,而不是四舍五入为532.753。这一点点的差异本来关系不大,但由于每天都要对指数进行数千次计算,这种看似很小的差异(基本上每次都进行不进位舍入)导致指数值出现急剧下降。这个编程错误最后在1983年11月被修正,当时的某个周五收盘时指数已经降到500左右了。到了下周一指数以超过1000点开盘,损失掉的价值被恢复回来了。——伊利诺伊大学香槟分校助理教授Lav Varshney

12、Therac-25代码

年代:1985–1987年

当真相显现时,头条新闻就现代化发出了警告。《洛杉矶时报》宣称:“复杂时代的软件故障会死人。” 一种本来用于治疗癌症的机器由于在几家医疗机构对六名患者进行了过大剂量的放射,造成了至少三人死亡。

研究人员经过调查发现,Therac-25的程序允许致命错误的出现。本来这台机器提供的是低功率和高功率两种类型的治疗,而后者需要金属设备来过滤光束。但是由于软件存在的错误,操作员可以在没有合适的金属设备就绪的情况下意外触发高功率模式。

在设计上,Therac-25是Therac-20的“改进”版,而且这种软件被认为已经万无一失,因此不需要外部的安全检查。结果:重大死亡的责任要归咎于过度自信的工程师,因为他们没有对错误发生的可能性做出解释。——Molly Olmstead

未完待续。

译者:boxi。


转载声明转载声明:本文系后花园转载发布,仅代表原作者或原平台态度,不代表我方观点。后花园仅提供信息发布平台,文章或有适当删改。对转载有异议和删稿要求的原著方,可联络[email protected]