当前位置: 首页 > 科技观察

写代码也是一项危及生命的工作:盘点那些改变世界的代码

时间:2023-03-21 21:30:21 科技观察

2009年,Facebook推出了一款改变世界的代码——点“赞”按钮。Like是几位程序员和设计师的心血结晶,其中包括LeahPearlman和JustinRosenstein。他们争辩说,Facebook用户通常太忙而无暇评论朋友的帖子,但如果有一个简单的按钮可以做到这一点,那将会很受欢迎。“朋友们可以更频繁、更容易地喜欢彼此,”珀尔曼说。按钮起作用了,甚至有点超乎想象。到2012年,“赞”按钮的点击次数已超过1万亿次。但它也有副作用。发布照片后,我们坐立不安并刷新页面,等待更多的“赞”。我们想知道为什么别人的点赞越来越多。于是,我们开始在社交网络中“暗暗发力”:变得更有趣、更犀利、更迷人、更极致。代码重构了我们的生活。正如风险投资家马克·安德森所写,“软件正在吞噬世界”,尽管说软件正在消化世界可能更准确。因此,美国《板岩》杂志进行了这样的调查。为了确定改变世界的软件,编辑们对计算机科学家、软件开发人员、历史学家、政治家和记者进行了调查。他们有一个选择:哪些代码产生了巨大的影响?哪些改变了我们的生活?Slate从75位贡献想法的人中选择了36位。这不是一个完整的列表,因为有太多有影响力的代码。这份清单旨在激发思考——帮助我们重新思考代码如何影响我们的生活以及程序员的决定如何影响未来。二进制穿孔卡片(1975)第一个代码二进制编程早于计算机。BasileBouchon是第一个在纸上打孔并用它来控制机器的人:1725年,他发明了一种织机,可以根据送入的穿孔纸织出不同的图案。打孔为“1”,不打孔为“0”。从那时起机器发生了很大变化,但基本的代码组成没有变化。—ElenaBotella,Slate的第一个现代代码实现(1948年)开创了计算机代码的使用和核灾难计算机模型的出现,为冷战期间的军备竞赛奠定了基础。电子数字积分计算机是第一台可编程电子计算机。它于1945年完工,通过在许多组件之间建立连接来针对每个新问题进行配置。当一个任务(例如加法)完成时,一个脉冲触发下一个任务。但几年后,冯·诺伊曼和洛斯阿拉莫斯的科学家尼古拉斯·梅特波利斯改进了ENIAC,使其能够运行第一个在计算机上执行的现代代码:表开关)来执行数百条数字指令。他们使用蒙特卡洛技术模拟了新墨西哥州洛斯阿拉莫斯国家实验室提出的几种原子弹设计的引爆,这种方法逐步模拟复杂系统,绘制可能结果的概率分布。冯诺依曼和大都会向洛斯阿拉莫斯的核科学家发送了20,000多张卡片,通过弹头的引爆跟踪模拟中子的进展。此代码的后续版本今天仍在洛斯阿拉莫斯使用。——ThomasHaigh,《ENIAC in Action: Making and Remaking the Modern Computer》的合著者。GRACEHOPPER的编译器(1952)使计算机处理文字成为可能在为早期计算机编程时,GraceHopper决定通过将他的编程语言植根于人类语言来简化过程。第二次世界大战期间,霍珀加入了美国海军预备役。她知道,就像她的军事上司一样,人们很难理解二进制代码。如果编程语言可以是基于英语的,那么对于不是数学博士的人来说,这项工作就不会那么容易出错并且更容易理解。有些人驳回了这个想法,但到1950年代初,她设计了一个编译器,这是一组指令,可以将更易理解的代码转换为机器可以直接处理的低级代码。使用该工具,她和她的实验室开发了FLOW-MATIC,这是第一种将英语单词纳入流程的编程语言。-莫莉奥姆斯特德,石板。宇宙大战!(1961)第一个分布式视频游戏(太空大战)的起源电子邮件(1965)加油,电子邮件来了!阿波罗11号登月舱救援代码(1969)防止登月舱计算机在太空中耗尽空间代码Hello,World!(1972年或更早)引领几代人并打开编程之门的代码当你坐下来学习一门新的编程语言时,教程要求你做的第一件事就是让计算机显示“你好,世界!”。也许最著名的早期示例来自贝尔实验室的“C—A编程教程”。该教程写于1974年,尽管在1972年的手册中也可以找到另一种更早的语言B。“你好世界!”这是一种极好的教学方法。这是一个小的、可完成的任务,让学生有成就感。这是一个有助于说明不同编程语言之间差异的标准。对于高级程序员来说,这也是一种快速简便的方法,可以确保在安装新环境后一切正常。(有时程序员使用“timeto'helloworld'”来比较语言和环境的速度。)也许最重要的是,“Hello,world!”可以帮你打开编程之门,它告诉你这是新世界。—ChrisNoessel,IBMAI设计主管。Null-terminatedstrings(1972)计算史上最大的灾难性设计错误1972年,DennisRitchie做出了一个重大决定:使用一种名为“null-terminatedstring”(空终止字符串)的新语言来表示文本。这个概念已经存在很长时间了,但他把它写成一种他称之为C的新语言,这个决定一直坚持到今天。编程语言可以通过两种主要方式来表示一段文本:一种具有固定的显式长度——“仅包含10个字符,不能再多了”,或者可以以null结尾——“这是一串字符,继续尝试,直到你看到一个零字节!”C代码中一个非常常见的错误是,当将一个长字符串复制到一个较短的字符串中时,会出现尾随溢出,从而破坏其他数据。这就像在白板的边缘涂鸦。除了使程序出现故障之外,还可以利用此类错误通过用特定的、精心制作的数据覆盖某些内容来改变程序的行为。这些是缓冲区溢出攻击。您听说过的几乎所有安全漏洞都始于1988年的Morris蠕虫病毒。您必须小心地用C编写代码以避免此类错误,但它们仍然很容易发生。从路由器到“智能”灯泡,几乎所有现代语言都避开了以null结尾的字符串,但C和C++仍然主导着语言世界。所以现在,将近50年后,我们仍在“受苦”。—JamieZawinski,Netscape开发人员,Mozilla.org创始人温哥华证券交易所的交易错误(1982)微不足道的小数错误造成了巨大损失1982年初,温哥华证券交易所推出了电子股票指数,该指数最初设定为1000点.两年之内,它减半了,这在80年代初的牛市中似乎是不可想象的。一项调查表明,使用floor()而不是round()会导致索引计算错误。此命令意味着该值将被直接截断,而不是四舍五入到小数点后三位。(数字计算机必须具有有限的分辨率,因此需要四舍五入或直接关闭。)因此,如果索引计算为532.7528,则它存储为532.752,而不是四舍五入为532.753。在每天数以千计的计算过程中,这个看似很小的差异——每次都必须四舍五入却没有四舍五入——造成了巨大的损失。程序错误最终在1983年11月得到修复,当时该指数周五收于500点左右。一旦问题得到解决,该股于周一重新开盘,指数突破1,000美元,收复了损失的价值。--LavVarshney,助理教授,伊利诺伊大学厄巴纳-香槟分校THERAC-25(1985-1987)过度自信是致命的当真相浮出水面时,头条新闻警告机器现代化。《洛杉矶时报》宣称:“在这个复杂的时代,软件错误是致命的。”一台用于治疗癌症的机器对几家医疗机构的六名患者进行了大量过量辐射,导致至少三人死亡。研究人员发现Therac-25的代码可能会引入致命错误。该机器提供低功率和高功率治疗,后者需要金属装置来过滤光束。但由于软件的一个错误,操作员可能会在没有金属设备的情况下意外触发高功率模式。Therac-25被设计为Therac-20的“改进”,设计为万无一失,不需要外部安全检查。结果:数起死亡事故归咎于过于自信的工程师,他们没有考虑到可能出现的错误。—MollyOlmsteadInternetRelayChat(1988)最初的在线挂断TheMorrisWorm(1988)令人惊讶的是,Internet已经成长为RobertMorris,而Internet本身还很年轻。当时23岁的康奈尔大学研究生莫里斯发布了“莫里斯蠕虫”,他称之为“互联网上的第一次重大攻击”。连接到Internet的近60,000台计算机中有10%遭到破坏,造成数百万美元的损失,并导致“Internet”一词首次出现。即使精通技术的人也对蠕虫的影响范围感到惊讶。莫里斯表示,他从未想过会有这么大的损失,他成为了《计算机欺诈和滥用法》下第一个被起诉的人。在被判三年缓刑后,他成为著名创业孵化器YCombinator的联合创始人和麻省理工学院计算机科学助理教授。–ElenaBotellaTheOne-LineVirus(日期:1990年代)它需要触发某些特定条件(包括Unix操作系统的较旧、易受影响的副本)。如果您在Bash中键入此命令,它会一遍又一遍地自我复制,直到它用完计算机中的所有可用内存并崩溃。它之所以出名,不是因为它相对于它的大小而言是危险的,而是因为它使用冒号作为函数名。大多数功能(可重复使用的代码行)都以描述性方式命名,例如“Print”或“isThisEmailValid”,但没有要求必须如此。在大多数计算语言中,您不能使用冒号作为函数名,但在Bash中可以。第一次看到这行代码是2002年在德国法兰克福AngewandteKunst博物馆的一个展品,博物馆里展示的代码不多。--ChrisNoesselHTMLHyperlinks(1990)ThetoolthatconnectseverythingJPEG(1992)ChangedourrelationshipwithphotographyTheMosaicbrowser(1993)第一个普遍使用的能够显示图像的网络浏览器跟踪像素(1993)现代数据收集始于这些看不见的图像。通过下载跟踪像素,他们了解您是谁以及您在哪里,并触发将cookie下载到您的浏览器。此cookie使广告商能够跨多个网站跟踪您。像素跟踪的成功直接导致了Facebook的“赞”按钮,可以在每个嵌入式网站上对其进行跟踪。海量数据的收集使得具有高度针对性的定位成为可能,Facebook广告取得了成功,最终让媒体公司赚了数十亿美元。Robots.txt(1994)一个小工具,对搜索和维基百科(1994)有很大影响,为维基百科铺平了道路第一个弹出式广告(90年代中期)互联网的“害群之马”Google的PageRank算法(1996)革命性的我们组织知识的方式在PageRank之前,搜索引擎根据我们的查询词是否与文档中的词相匹配来查找信息。但是对于PageRank,拉里佩奇和谢尔盖布林有一个绝妙的想法:知识是社会性的,搜索也应该如此。他们创建了一种算法,通过网络庞大的超链接网络确定页面的排名。一个页面的PageRank是根据链接到它的所有页面的重要性通过递归算法得到的,链接越多的页面排名越高。正是这两种独特的见解造就了今天的谷歌。—CliveThompson失去火星气候轨道器(1999)由于数学错误任务失败1999年9月23日,NASA科学家与造价1.25亿美元的火星气候轨道器失去联系。后来的调查确定了原因:承包商以英制单位对轨道飞行器进行了编程,这是美国的标准,但NASA的软件使用的是公制。两段代码之间的一个简单通信错误会将轨道飞行器送入未知世界。很容易将这种测量错误视为偶然,但它表明当今互联软件世界是多么脆弱。所有连接的技术(电话、航天器、机器人榨汁机等)都依赖于定义与他人通信方式的接口。即使是微小的差异也会导致混淆。–CharlesDuan比特币(2008)激发人们对货币信心的代码点赞按钮(2009)它催化了监控经济。Facebook设计了“赞”按钮,让我们可以向世界展示我们喜欢的《辛普森一家》或炸薯条。但实际上,它利用我们的认知偏见和设计的力量来诱骗我们分享更多信息。他们使用上面提到的跟踪像素在互联网上跟踪我们,收集有关我们浏览习惯的数据。Facebook然后使用该信息并将其行为定位算法出售给广告商。如果一家户外用品公司想要做广告,Facebook可以定位那些“喜欢”远足帖子、参观露营地和有户外朋友的人。当这些用户喜欢一家公司的广告时,该信息就会被输入定位算法。监控和商业操纵就这样形成了一个循环。都是因为一个小小的蓝色竖起大拇指。—AriEzraWaldman,纽约法学院教授波音737Max(2017年)软件错误加上公司的贪婪导致数百人死亡,大量飞机停飞狮航610航班于2018年10月起飞后不久坠入海中。波音公司向公众保证飞机是安全的,并表示需要更多的飞行员培训和“软件升级”。但仅仅四个月后,另一架埃塞俄比亚航空公司的飞机坠毁。飞行员尝试将机头抬高20次,但飞机的自动系统将机头拉下。起飞几分钟后,飞机坠毁了。世界各地的航空当局立即将飞机停飞。调查显示,坠机事故是由737Max的设计引起的,尤其是鲜为人知的软件可能迫使飞机继续俯冲。—MarHicks,技术历史学家和《Programmed Inequality(http://www.amazon.com/dp/0262535181/?tag=slatmaga-20)》的作者。原文链接:https://slate.com/technology/2019/10/consequential-computer-code-software-history.html(id:almosthuman2014)》】点此阅读作者更多好文