在2014年4月10日,在华盛顿州的全部人口没有911服务的晚上这里是六个小时。呼救的人得到了一个忙碌的信号。一名西雅图女子至少37次拨打911,而一名陌生人试图闯入她的房子。当他终于从窗户爬进她的起居室时,她拿起一把菜刀。那个男人逃走了。
在有史以来最大的报道中,911中断被追溯到科罗拉多州恩格尔伍德的服务器上运行的软件。由一个名为Intrado的系统提供商运营,该服务器保持了一个运行计数器,它已经向全国各地的911调度员发送了多少呼叫。Intrado程序员已经设定了计数器可以达到的高度的阈值。他们选择了数百万的数字。
在4月10日午夜前不久,柜台超过了这个数字,导致混乱。由于计数器用于为每个呼叫生成唯一标识符,因此拒绝新呼叫。而且由于程序员没有预料到这个问题,他们没有创建警报来引起注意。没有人知道发生了什么。华盛顿州,加利福尼亚州,佛罗里达州,卡罗来纳州和明尼苏达州的调度中心为1100万美国人提供服务,他们很难理解有关呼叫者忙碌信号的报道。直到早上才意识到恩格尔伍德的Intrado软件是负责任的,并且修复是为了改变一个数字。
不久前,紧急呼叫在当地处理。停电很小,很容易诊断和修复。手机的兴起和新功能的承诺 - 如果你能发短信911怎么办?或发送视频给调度员? - 推动了依赖互联网的更复杂系统的发展。这是第一次出现国家911停电这样的事情。现在已经有四年了。
据说软件“正在吞噬世界。”越来越多的机械或人员控制的关键系统将依赖于代码。这可能永远不会比2015年夏天更加清晰,因为在一天之内,由于其离港管理系统存在问题,联合航空公司将其机队停飞; 升级后,交易在纽约证券交易所暂停; 华尔街日报网站的头版崩溃了; 西雅图的911系统再次出现故障,这次是因为另一台路由器出现故障。这么多软件系统的同时失败首先是在协调的网络攻击中闻到的。几乎更可怕的是,当天晚些时候认识到,这只是一个巧合。
“当我们有机电系统时,我们过去常常能够对它们进行详尽的测试“麻省理工学院航空航天学教授Nancy Leveson说,他一直在研究软件安全35年。她因有关Therac-25的报告而闻名,该放射治疗机由于软件错误导致六名病人死亡。“我们曾经能够思考它可以做的所有事情,它可以进入的所有状态。”例如,控制铁路交叉口列车运动的机电联锁只有很多配置; 几张纸可以描述整个系统,你可以针对每个配置运行物理列车,看看它的行为方式。一旦你构建并测试它,你就知道你正在处理什么。
软件不同。只需在某处编辑文件中的文本,相同的硅片就可以成为自动驾驶仪或库存控制系统。这种灵活性是软件的奇迹,也是它的诅咒。因为它可以廉价地改变,软件会不断变化; 因为它不受任何物理攻击 - 一个比另一个更复杂的程序占用相同的实际空间 - 它往往会无限制地增长。“这个问题,”Leveson在一本书中写道,“我们正试图构建超出我们智力管理能力的系统。”
我们用于思考工程故障的标准框架(例如,在医疗设备法规中得到反映)是在第二次世界大战后不久,软件出现之前为机电系统开发的。我们的想法是,通过使其部件可靠(例如,您构建发动机以承受40,000次起飞和着陆循环)并通过计划这些部件的故障(您有两个发动机)来制造可靠的东西。但软件并没有破解。Intrado的故障阈值不像导致客机坠毁的故障铆钉。该软件完全按照它所做的去做。事实上它完美地做到了。失败的原因是它被告知要做错事。软件失败是理解和想象的失败。Intrado实际上有一个备份路由器,如果它已经自动切换,几乎可以立即恢复911服务。但是,正如联邦通信委员会的一份报告中所描述的那样,“情况发生在应用程序逻辑中的一个点上,该点并非旨在执行任何自动纠正措施。”
这是用代码制作东西的麻烦,而不是物理的东西。正如Leveson所说,“复杂性”是“看不见的”。
[图片上传失败...(image-9c7141-1565709376163)]
[图片上传失败...(image-551527-1565709376163)]
Ť他试图现在正在进行改变我们如何使软件似乎都与同一个前提:代码是太难思考的问题。在尝试理解这些尝试本身之前,值得理解为什么这可能是:代码使它对思想如此陌生,以及与之前的任何东西不同。
技术进步曾经改变了世界的样子 - 你可以看到铺好的道路; 你可以看到天际线上升。今天你几乎无法分辨什么东西被重制,因为它经常被代码重新制作。例如,当你用脚踩下汽车的加速器时,你就不再直接控制任何东西; 从踏板到油门没有机械连接。相反,您正在向一个软件发出命令,该软件决定给发动机提供多少空气。这辆车是你可以坐在里面的电脑。方向盘和踏板也可能是键盘键。
与其他所有产品一样,该车已经过计算机化以实现新功能。当一个程序负责油门和制动时,当你离另一辆车太近时它可以减慢你的速度,或者精确地控制燃油喷射以帮助你节省燃气。当它控制转向时,它可以让您在开始漂移时保持在您的车道上,或引导您进入停车位。没有代码,您无法构建这些功能。如果你试过,一辆汽车可能重达40,000磅,这是一支不可移动的发条。
软件使我们能够制造出迄今为止最复杂的机器。然而,我们几乎没有注意到,因为所有这些复杂性都被包含在微小的硅芯片中,成千上万行代码。但仅仅因为我们看不到复杂性并不意味着它已经消失了。
这位程序员,着名的荷兰计算机科学家埃德斯·迪克斯特拉(Edsger Dijkstra)在1988年写道,“必须能够思考比以前需要面对的单一思想更深刻的概念层次。”Dijkstra将此视为警告。随着程序员急切地将软件倾注到关键系统中,他们越来越成为建筑世界的关键 - 而Dijkstra认为他们可能已经高估了自己。
使编程如此困难的原因是它需要你像计算机一样思考。在计算的早期阶段,当代码采用文字和零的形式时,它的陌生感在某种意义上更加生动。任何看过程序员肩膀的人都会看到程序员与他们试图解决的实际问题有多么疏远,因为他们会像“100001010011”和“000010011110”一样仔细思考。我们无法判断他们是在试图计算炮兵轨迹还是模拟一个井字游戏。引入类似于英语的Fortran和C等编程语言,以及称为“集成开发环境”的工具,或称为帮助纠正简单错误的工具(如Microsoft Word的语法检查程序,但代码),模糊不清,
“问题是,软件工程师不懂的问题,他们正在试图解决,并不在乎,” Leveson,麻省理工学院软件安全专家说。原因是它们太过于无法让代码工作。“软件工程师喜欢提供各种工具和编码错误的东西,”她说,指的是IDE。“软件发生的严重问题与需求有关,而不是编码错误。”例如,当您编写控制汽车油门的代码时,重要的是关于何时,如何以及打开多少的规则它。但是这些系统变得如此复杂,以至于几乎没有人能够将它们直接放在脑中。“现在汽车中有1亿行代码,”Leveson说。“你无法预料到所有这些事情。”
2007年9月,当加速器似乎被卡住时,Jean Bookout和她最好的朋友在丰田凯美瑞一起驾驶高速公路。当她从踏板上踩下脚时,车子没有减速。她试过刹车但似乎失去了力量。当她转向一个每小时50英里的匝道时,她拉紧急刹车。这辆车在跑到路边的路堤之前留下了150英尺长的防滑标记。这名乘客遇难。一个月后,预约在医院醒来。
这项事件是近十年来对丰田汽车所谓的意外加速声称的调查中的众多事件之一。丰田将事故归咎于设计不良的地板垫,“粘性”踏板和驾驶员错误,但外界怀疑有缺陷的软件可能是负责任的。美国国家公路交通安全管理局邀请美国宇航局的软件专家对丰田的代码进行深入审查。在将近10个月后,NASA团队没有找到证据证明软件是原因 - 但他们说不能证明它不是。
正是在Bookout事故的诉讼中,有人终于找到了令人信服的联系。原告的专家证人迈克尔·巴尔(Michael Barr)有一个软件专家团队用丰田代码花了18个月的时间,在美国宇航局停止工作的地方。Barr描述了他们发现的“意大利面条代码”,程序员语言的软件已成为一个混乱的混乱。代码变成了意大利面条,当它累积多年时,功能堆叠在上面,并编织在周围,已经存在的东西; 最终代码变得无法遵循,更不用说彻底检查缺陷了。
Barr的团队使用与事故中涉及的凯美瑞相同的模型,证明车载计算机实际上有超过1000万种方式会导致意外加速。他们表明,只需一个位翻转 - 计算机内存中的一个变为零或反之亦然 - 可能会使汽车失控。丰田实施的故障安全代码还不足以阻止它。“你有软件看软件,”巴尔作证说。“如果软件发生故障并且同一个程序或同一个崩溃的应用程序应该可以节省一天的时间,那么它就无法保存,因为它无法正常工作。”
Barr的证词为原告提起诉讼,导致Bookout和她朋友的家人损失300万美元。据“纽约时报”报道,这是针对丰田的许多类似案件中第一起引发电子节气门控制系统试验问题的案例,也是丰田首次因涉及意外加速的事故而被陪审团负责。双方决定解决案件,然后才能判给惩罚性赔偿金。总而言之,丰田召回了超过900万辆汽车,并支付了近30亿美元的定居费和与意外加速相关的罚款。
[图片上传失败...(image-d1b6a1-1565709376163)]
[图片上传失败...(image-b5d33b-1565709376163)]
Ť这里会更坏天软件。重要的是我们要做得更好,因为如果我们不这样做,并且随着软件变得更加复杂和连接 - 因为它控制了更多关键功能 - 那些日子可能会变得更糟。
问题是程序员很难跟上他们自己的创作。自20世纪80年代以来,程序员的工作方式和他们使用的工具变化非常小。有一个小但不断增长的合唱,担心现状是不可持续的。“即使是非常优秀的程序员也在努力理解他们正在使用的系统,”作为微软Visual Studio工作的软件开发人员Chris Granger说道,这个IDE每年花费1199美元,几乎被使用三分之一的专业程序员。他告诉我,当他在微软时,他安排了Visual Studio的端到端研究,这是迄今为止唯一的研究。在一个半月的时间里,当人们编写代码时,他在单向镜子后面观看。“他们如何使用工具?他们怎么想?“他说。“他们怎么样?坐在电脑前,他们触摸鼠标,不触摸鼠标吗?所有这些我们都有教条的事情,我们实际上并没有凭经验进行测试。“
调查结果令他惊讶。“Visual Studio是世界上最大的软件之一,”他说。“这是超过5500万行代码。我在这项研究中发现的其中一件事超过98%完全无关紧要。所有这些工作都已付诸实践,但它错过了人们面临的根本问题。我从中拿走的最大的一个就是人们正在脑子里玩电脑。“程序员就像是试图用眼罩玩耍的国际象棋选手 - 他们的大部分心理能量都花在试图描绘出来的地方是否几乎没有任何遗留下来考虑游戏本身。
John Resig在他的学生中注意到了同样的事情。Resig是一位着名的JavaScript程序员 - 他在所有网站中占据了一半以上的软件 - 以及在线教育网站Khan Academy的技术主管。2012年初,他一直在努力学习该网站的计算机科学课程。为什么学习编程这么难?基本问题似乎是代码是如此抽象。编写软件并不像用冰棍棒制作桥梁,在那里你可以看到木棍并触摸胶水。要“制作”一个程序,你输入单词。当你想改变程序的行为时,无论是游戏,网站,还是物理模拟,你实际改变的是文本。因此,表现良好的学生 - 实际上是唯一幸存下来的学生 - 是那些能够一步一步地通过该文本的人,思考计算机的方式,试图跟踪每个中间计算。像格兰杰一样,雷吉格开始怀疑它是否必须如此。在过去的40年中,计算机每18个月的功率增加一倍。为什么没有改变编程?
事实上,他们两个同时以同样的方式思考同一个问题并不是巧合。他们刚刚在蒙特利尔一家名为Bret Victor的计算机研究人员那里,向一群软件工程学生发表了同样精彩的演讲。谈话在2012年2月在网上发布时传播开来,似乎有两个大胆的主张。首先,我们制作软件的方式从根本上被打破了。第二个是Victor知道如何解决它。
[图片上传失败...(image-ac7b10-1565709376163)]
[图片上传失败...(image-f11e73-1565709376163)]
Bret victor不喜欢编写代码。“听起来很奇怪,”他说。“当我想做一件事,特别是当我想用软件创造一些东西时,我必须要完成这个最初的厌恶层,在那里我不会操纵我想做的东西,我正在写一堆文字进入文本编辑器。“
“有一种非常强烈的信念,认为这是错误的做事方式。”
维克多拥有大卫·福斯特·华莱士(David Foster Wallace)的风采,闪电般的智慧萦绕在一片羞涩的羞涩之下。他今年40岁,身上留着灰色的痕迹,还有一丝瘦弱的胡须。他的声音很温柔,几乎是悲伤的,但是他想要分享他脑袋里的东西,当他开始滚动时,他似乎会跳过音节,仿佛超越了他自己的声乐机器。
虽然他经营着一个研究计算未来的实验室,但他似乎对技术本身的兴趣不如对使用它的人的头脑感兴趣。像任何优秀的工具制造商一样,他有办法看待技术和人性相等的世界。他毕业于加州理工学院电气工程专业,并在加州大学伯克利分校毕业后继续在一家开发音乐合成器的公司工作。这是一个与他的双重人格完美匹配的问题:他可以花多少时间思考表演者用键盘制作音乐的方式 - 它成为他们手的延伸的方式 - 因为他可以考虑数字信号处理的数学。
当他给出了他的名字的演讲时,就像Resig和Granger在2012年初看到的那样,Victor终于找到了似乎贯穿他所有工作的原则。(他实际上称之为“发明原则”。)原则是:“创作者需要立即与他们正在创造的东西联系起来。”编程的问题在于它违反了原则。这就是为什么软件系统如此难以思考,以及如此充满错误的原因:程序员,盯着一页文本,从他们实际制作的任何内容中抽象出来。
“我们目前关于计算机程序的概念,”他说,“直接来自Fortran和ALGOL,在50年代后期。这些语言是专为打卡而设计的。“该代码现在采用C或Java(Fortran和ALGOL的衍生物)等语言在屏幕上的字母形式,而不是一堆带孔的卡片,而不是它不会死,也不会间接的。
有一个类似于文字处理。过去,您在编写文档的程序中看到的只是文本本身,要更改布局或字体或边距,您必须编写特殊的“控制代码”或命令,告诉计算机,例如,“文本的这一部分应该用斜体字表示。”问题是,在打印文档之前,您无法看到这些代码的效果。很难预测你会得到什么。您必须想象计算机将如何解释代码 - 也就是说,您必须在脑中玩电脑。
然后WYSIWYG(发音为“wizzywig”)出现了。它代表“所见即所得”。当你用一条斜体标记一段时,字母就会在屏幕上倾斜。如果要更改边距,可以在屏幕顶部拖动标尺 - 并查看该更改的效果。因此,该文件变得像真实的东西,你可以戳戳和刺激的东西。只是通过观察你可以判断你是否做错了什么。任何可以在页面上点击的人都可以访问复杂系统的控制 - 文档的布局和格式化引擎。
Victor的观点是编程本身应该是这样的。对他来说,通过盯着文本编辑器,人们正在做重要工作的想法,比如设计自适应巡航控制系统或试图了解癌症,这是令人震惊的。程序员的正确工作是确保有一天他们不必这样做。
有先例足以表明这不是一个疯狂的想法。例如,Photoshop将强大的图像处理算法交给那些可能甚至不知道算法是什么的人。这是一个复杂的软件,但复杂的合成器很复杂,用户可以像仪器一样学习旋钮,按钮和滑块。Squarespace是一家以播客广告而闻名的公司,它提供了一种工具,可以让用户通过指向和点击来构建网站,而不是通过在HTML和CSS中编写代码。它足够强大,可以完成曾经由专业网页设计师完成的工作。
但这些只是少数几个例子。压倒性的现实是,当有人想用计算机做一些有趣的事情时,他们不得不编写代码。维克多是一个理想主义者,他认为这不仅仅是一个机会,而是一个程序员的道德失败。他的讲话是对武器的呼唤。
其中的核心是一系列演示,试图展示可用工具对各种问题的原始性 - 电路设计,计算机动画,调试算法 - 以及更好的工具。他的演示是精湛的。讽刺的是,那个俘获每个人想象力的那个人,其表面上最琐碎的是那个。它显示了一个分屏,其中一侧的游戏看起来像马里奥,而另一侧则是控制它的代码。随着维克多改变了代码,游戏世界中的事物发生了变化:他减少了一个数字,引力的强度,以及马里奥角色的浮动; 他增加了另一个,球员的速度,马里奥在屏幕上比赛。
假设你想设计一个水平,马里奥,跳跃反弹乌龟的,将只是使之成为一个小通道。游戏程序员习惯于分两个阶段来解决这类问题:首先,你盯着你的代码 - 控制马里奥跳得多高的代码,他跑得多快,乌龟的背部有多么弹性 - 并在你的代码中做了一些修改文本编辑器,用你的想象力来预测它们会产生什么样的影响。然后,你重播游戏,看看究竟发生了什么。
CUSEC / Vimeo
维克多想要更直接的东西。“如果你有一个及时的过程,”他说,指的是马里奥穿过关卡的路径,“你想立即看到变化,你必须把时间映射到太空。”他按了一个按钮,显示的不仅仅是马里奥的位置现在,但他将来会在未来的每个时刻:一个影子Marios的曲线延伸到远处。更重要的是,这个投射路径是被动的:当Victor改变游戏的参数时,现在通过快速拖动鼠标来控制,路径的形状发生了变化。这就像是对游戏有一个神奇的看法。整个问题已经减少到使用不同的参数,就好像调整立体声接收器上的水平,直到你让马里奥穿针。使用正确的界面,几乎就像你根本不使用代码一样;
当观众第一次看到这一点时,他们真的喘不过气来。他们知道他们不是在看孩子的游戏,而是他们的行业未来。大多数软件涉及的行为随着时间的推移以复杂的方式展开,而且Victor已经表明,如果你有足够的想象力,你可以开发出看待这种行为并改变它的方法,就像在你手中玩它一样。一位看过这个演讲的程序员后来写道:“突然之间,我的所有工具都过时了。”
[图片上传失败...(image-80f0c6-1565709376163)]
[图片上传失败...(image-eb21ce-1565709376163)]
当John Resig看到“发明原则”的谈话时,他取消了他对可汗学院编程课程的计划。他希望网站的编程练习能像Victor的演示一样工作。在左侧,你有代码,右边是正在运行的程序:图片或游戏或模拟。如果您更改了代码,它会立即更改图片。“在一个真正响应的环境中,”Resig写道,“你可以彻底改变学生如何学习的模型...... [他们]现在可以立即看到结果并直观地了解底层系统如何在没有明确遵循的情况下工作“可汗学院已成为世界上最大的计算机编程课程,平均每个月有100万学生积极使用该计划。
曾在微软Visual Studio工作过的Chris Granger同样受到启发。在看到Victor的演讲视频后的几天内,他在2012年1月建立了一个新编程环境的原型。它的关键功能是它可以为您提供有关您的程序行为的即时反馈。您可以在控制它的代码旁边看到您的系统正在做什么。这就像脱掉眼罩一样。格兰杰称这个项目为“光桌”。
2012年4月,他在Kickstarter上寻求Light Table的资金。在编程界,这是一种感觉。在一个月内,该项目筹集了超过20万美元。思想传播开来。活跃的概念,即能够立即看到流经您程序的数据,已经成为Google和Apple提供的旗舰编程工具。制作新的iPhone和Mac应用程序的默认语言,称为Swift,由Apple开发,以支持一个名为Playgrounds的环境,该环境直接受Light Table的启发。
但看到他的谈话最终产生的影响,布雷特维克多失望了。“很多事情似乎都是对我所说的错误解释,”他后来说道。当人们开始邀请他参加会议讨论编程工具时,他知道出了什么问题。“每个人都认为我对编程环境很感兴趣,”他说。他真的对人们如何看待和理解系统感兴趣 - 正如他所说的那样,在“动态行为的可视化表示”中。虽然代码越来越成为创建动态行为的首选工具,但它仍然是理解最糟糕的工具之一。它。“基于原理的发明”的观点是,通过在系统的行为与其代码之间立即建立连接,可以缓解这个问题。
在一对后来的谈话中,“停止绘制死鱼”和“绘制动态可视化”,维克多进一步说。他演示了他构建的两个程序 - 第一个用于动画师的程序,第二个用于科学家试图可视化他们的数据 - 每个程序都采用了一个过程,过去曾经涉及编写大量自定义代码并将其缩小为在WYSIWYG界面中玩游戏。Victor建议,对于今天编写代码的几乎所有问题,都可以采用相同的技巧。“我不确定编程必须存在,”他告诉我。“或者至少是软件开发人员。”在他看来,软件开发人员的正确角色是创建工具,消除对软件开发人员的需求。只有这样,具有最紧急计算问题的人才能够直接掌握这些问题,而不需要中间代码。
当然,要做到这一点,你必须让程序员自己参与进来。在最近的一篇文章中,维克托恳求专业软件开发人员停止将他们的才能投入到构建Snapchat和Uber等应用程序的工具中。“日常生活的不便不是重大问题,”他写道。相反,他们应该把重点放在科学家和工程师身上 - 正如他向我所说的那样,“这些人正在做的工作实际上很重要,而且非常重要,并且使用真正非常糟糕的工具。”这类令人兴奋的工作,特别是他写道,“基于模型的设计”的工具类已经在进行中,并且已经存在多年,但大多数程序员对此一无所知。
[图片上传失败...(image-23dfb1-1565709376163)]
[图片上传失败...(image-8e5d95-1565709376163)]
“你真的很看重你所拥有的所有工业产品,你正在使用的,公司正在使用的产品,你所拥有的唯一非工业产品是代码。”EricBantégnie是Esterel Technologies(现为ANSYS所有)的创始人,这是一家法国公司,生产用于构建安全关键软件的工具。像Victor一样,Bantégnie并不认为工程师应该通过在IDE中键入数百万行代码来开发大型系统。“没有人会手工制造汽车,”他说。“在许多地方,守则仍然是手工艺品。当您手动编写10,000行代码时,这没关系。但是你的系统拥有3000万行代码,比如空中客车,或者有1亿行代码,比如你的特斯拉或高端汽车 - 这些都变得非常非常复杂。
Bantégnie的公司是基于模型设计的工业应用的先驱之一,您不再直接编写代码。相反,您创建了一种描述程序应遵循的规则(“模型”)的流程图,并且计算机根据这些规则为您生成代码。例如,如果您正在为电梯制作控制系统,一条规则可能是当门打开时,有人按下大厅按钮时,您应关闭门并开始移动汽车。在基于模型的设计工具中,您可以用一个小图表示这个规则,就像在白板上绘制逻辑一样,由表示不同状态的框组成 - 如“门打开”,“移动”和“门”关闭“ - 以及定义如何从一个州到另一个州的行。图表使系统的规则变得明显:
这不是Photoshop。当然,Photoshop的美妙之处在于,您在屏幕上操作的图片是最终产品。相比之下,在基于模型的设计中,屏幕上的图片更像是蓝图。尽管如此,以这种方式制作软件在质量上与传统节目不同。在传统编程中,您的任务是采用复杂的规则并将其转换为代码; 你的大部分精力花在翻译上,而不是考虑规则本身。在基于模型的方法中,您拥有的就是规则。这就是你花时间思考的问题。这是一种不太关注机器的方式,更多的是关注你试图解决它的问题。
“通常软件编码的主要问题 - 我自己也是编码器,”Bantégnie说,“这不是编码员的技能。人们知道如何编码。问题是如何编码。因为大多数要求都是一种自然语言,含糊不清,而且要求从来都不是非常精确,所以应该对那些应该编码的人有不同的理解。“
根据这种观点,因为用于描述软件什么媒体软件变得不守规矩应该对话,文字描述,图纸上的一张纸- -从描述什么软件媒体太不一样了做不会做的,即代码本身。从一个到另一个失去了太多。基于模型的设计背后的想法是缩小差距。系统设计人员使用相同的模型来表达他们想要的内容,并通过计算机自动生成代码。
当然,要使这种方法取得成功,大部分工作必须在项目开始之前完成。首先,有人必须构建一个工具来开发对人们来说很自然的模型 - 感觉就像他们自己制作的笔记和绘图一样 - 同时仍然足以让计算机理解。他们必须制作一个程序,将这些模型转化为真实的代码。最后,他们必须证明生成的代码将始终按照预期执行。“幸运的是,我们已经从20年的初期背景工作中受益,”Bantégnie说道。
Esterel Technologies于2012年被ANSYS收购,源于法国核能和航空航天业在20世纪80年代开始的研究,他们担心随着安全关键代码的复杂性不断增加,越来越难以保持其自由。错误。“我从1988年开始,”法国战斗机和商用飞机制造商达索航空公司科学研究负责人Emmanuel Ledinot说。“那时,我正在研究军事航空电子系统。负责集成系统和调试它们的人已经注意到错误的数量正在增加。“80年代,飞机上的机载计算机数量激增。现在有几十个,而不是单个飞行计算机,每个都负责与控制,导航和通信相关的高度专业化的任务。当传感器输入数据并且飞行员输入命令时,协调这些系统飞行飞机需要一个完美定时反应的交响乐。“在正确的时间以正确的顺序处理这些数百甚至数千个可能发生的事件,”Ledinot说,“被诊断为导致臭虫膨胀的主要原因。”
Ledinot决定手工编写这样复杂的代码不再具有可持续性。很难理解它在做什么,几乎不可能验证它能否正常工作。他去寻找新的东西。“你必须明白,在这样的过程中改变工具是非常昂贵的,”他在一次谈话中说。“除非你的背靠墙,否则你不会采取这种决定。”
他开始与法国计算机研究中心INRIA的计算机科学家Gerard Berry合作开发一个名为Esterel的工具 - 一个法语的“实时”.Eteterel背后的想法是,传统的编程语言可能是适合描述以预定顺序发生的简单程序 - 比如食谱 - 如果你试图在几乎任何时候都可能发生很多事件的系统中使用它们,几乎任何顺序 - 比如飞机的驾驶舱 - 你不可避免地弄得一团糟 而控制软件的混乱是危险的。在一篇论文中,Berry甚至预测“低级编程技术不会被大型安全关键程序所接受,因为它们使行为理解和分析几乎不可行。”
Esterel旨在让计算机为您处理这种复杂性。这就是基于模型的方法的承诺:您不是编写正常的编程代码,而是创建了系统行为的模型 - 在这种情况下,模型侧重于如何处理单个事件,如何确定事件的优先级,依赖于哪些事件其他人,等等。该模型成为计算机用于进行实际编程的详细蓝图。
Ledinot和Berry工作了将近10年,以使Esterel达到可以用于生产的程度。“在2002年,我们拥有了第一个具有自动代码生成功能的操作软件建模环境,”Ledinot告诉我,“并且是阵风飞机中的第一个嵌入式模块。”今天,ANSYS SCADE产品系列(用于“安全”) - 关键应用程序开发环境“)用于生成航空航天和国防工业,核电站,运输系统,重工业和医疗设备中的公司的代码。“我最初的梦想是在世界各个平面上都有SCADE生成的代码,”Esterel Technologies的创始人Bantégnie表示,“我们离这个目标并不太远。”几乎所有的安全关键代码都在空中客车A380,包括控制飞机飞行表面的系统,
对于客户,尤其是航空客户而言,部分吸引力在于尽管可以手工构建高度可靠的软件,但这可能是一项艰巨的任务。Meggitt PLC集团软件工程副总裁Ravi Shivappa是ANSYS客户,负责制造飞机部件,如发动机气动火灾探测器,他解释说,传统项目以英文版的大量需求文件开头,该文件规定了软件应该做的所有事情。(要求可能类似于,“当本节中的压力超过阈值时,打开安全阀,除非手动超控开关打开。”)以这种方式描述要求的问题在于,当您实施时他们在代码中,你必须煞费苦心地检查每个人是否满意。当客户改变要求时,
严格的监管标准加剧了成本。美国联邦航空局对软件安全感到狂热。该机构要求对安全关键软件的每个要求都可追溯到实现它的代码行,反之亦然。因此,每当一行代码发生变化时,必须将其回溯到设计文档中的相应要求,并且您必须能够证明代码实际满足要求。这个想法是,如果出现问题,你就能弄明白为什么; 这种做法为大型代码库带来了秩序和责任。但是,Shivappa说,“这是一个非常劳动密集型的过程。”他估计,在使用基于模型的设计之前,在一个为期两年的项目中,只花了两到三个月的时间来编写代码 - 剩下的就花在了文件。
正如Bantégnie所解释的那样,让计算机将你的需求转化为代码而不是人类的美妙之处在于你可以确定 - 实际上你可以在数学上证明 - 生成的代码实际上满足了这些要求。基于模型的方法的许多好处来自于能够动态添加需求,同时仍然确保满足现有需求; 每次更改,计算机都可以验证您的程序是否仍然有效。您可以自由地调整您的蓝图,而不必担心会引入新的错误。按照美国联邦航空局的说法,您的代码“通过施工来纠正”。
尽管如此,大多数软件,即使是在安全痴迷的航空世界中,都是以老式的方式制作,工程师在散文中编写他们的要求,程序员用像C这样的编程语言对它们进行编码。正如Bret Victor在他的论文中明确指出的那样。 ,基于模型的设计相对不常见。“美国联邦航空局的许多人认为代码生成是神奇的,因此需要更严格的审查,”Shivappa告诉我。
大多数程序员都有同感。他们喜欢代码。至少他们理解它。使用“有限状态机”和“循环系统”的数学方法为您编写代码并验证其正确性的工具听起来很深奥且难以使用,如果不是太好而不是真的。
这是一种以前发挥过的模式。只要编程与文字和零的写入相差甚远,最大的反对意见就来自程序员。玛格丽特·汉密尔顿是阿波罗任务中着名的软件工程师 - 实际上是“软件工程”这个词的内容 - 告诉我,在1964年她在麻省理工学院德雷珀实验室的第一年,她记得有一个派系在一起战斗另一个是关于从“一些非常低的机器语言”过渡到尽可能接近的零和“汇编语言”。“最低级别的人们正在努力保持它。这些论点非常相似:“我们怎么知道汇编语言会做得对吗?”
“一边说,他们的脸变红了,他们开始尖叫,”她说。她说她“惊讶于他们有多情绪化”。
达索航空公司的埃马纽埃尔·莱迪诺特指出,当汇编语言本身被逐步淘汰以支持今天仍然流行的编程语言时,就像C一样,这次汇编程序员对此持怀疑态度。他说,难怪“人们不是那么容易过渡到基于模型的软件开发:他们认为这是失去控制的另一个机会,甚至比他们已经更多。”
基于模型的设计(有时称为模型驱动的工程或MDE)的偏见实际上是根深蒂固的,根据最近的一篇论文,“有人甚至认为,调查人们对MDE的看法比研究更有必要新的MDE技术。“
这听起来几乎像个笑话,但对于基于模型的方法的支持者来说,重要的一点是:我们已经知道如何使复杂的软件可靠,但在很多地方,我们选择不这样做。为什么?
[图片上传失败...(image-89219e-1565709376163)]
[图片上传失败...(image-286f33-1565709376163)]
在2011年,克里斯·纽科姆曾在亚马逊工作了近七年,并已跃升为首席工程师。他曾参与过该公司一些最关键的系统,包括零售产品目录和管理世界上每个Kindle设备的基础设施。他是高度珍视的亚马逊网络服务团队的领导者,该团队为网络上一些最大的资产维护云服务器,如Netflix,Pinterest和Reddit。在亚马逊之前,他帮助建立了世界上最大的在线游戏服务公司Steam的骨干网。他是那些悄悄地保持互联网运行的工程师之一。他所研究的产品被认为是巨大的成功。但他所能想到的是,那些深藏在这些系统设计中的灾难是等待发生的灾难。
他在一篇论文中写道:“人类的直觉很难估计在每秒数百万次请求操作的系统中,所谓的”非常罕见“事件组合的真实概率。“人类的易犯错误意味着一些更微妙,更危险的错误变成了设计上的错误; 代码忠实地实现了预期的设计,但设计无法正确处理特定的“罕见”场景。“
Newcombe确信真正关键系统背后的算法 - 例如,存储大量网络数据的系统 - 应该不仅仅是好的,而是完美的。一个微妙的错误可能是灾难性的。但他知道如何找到更难的bug,特别是当算法变得越来越复杂时。你可以做你想要的所有测试,但你永远都找不到它们。
这就是为什么他如此感兴趣,因为在他正在阅读的一篇论文的附录中,他遇到了一种奇怪的数学和代码混合 - 或者看起来像代码的东西 - 它描述了一种叫做“TLA +”的算法。令人惊讶的是,这种描述被认为在数学上是精确的:用TLA +编写的算法原则上可以证明是正确的。在实践中,它允许您创建一个真实的问题模型,并不仅彻底,而且详尽地测试它。这正是他一直在寻找的东西:一种用于编写完美算法的语言。
TLA +,代表“行动的时间逻辑”,在精神上类似于基于模型的设计:它是一种用于写下要求的语言 - TLA +称它们为“规范” - 计算机程序。然后,计算机可以完全验证这些规范。也就是说,在你编写任何代码之前,你要编写一个简洁的程序逻辑大纲,以及你需要满足的约束(比如说,如果你是在编程ATM,一个限制可能是你永远不能撤回同样的钱两次从您的支票帐户)。然后,TLA +会详尽地检查您的逻辑是否确实满足了这些约束。如果没有,它会告诉你如何违反它们。
该语言由图灵奖获奖计算机科学家Leslie Lamport发明。凭借大大的白胡子和邋white的白发,以及大眼镜后面的善良眼睛,Lamport看起来可能是美国霍格沃茨的友好教授之一。现在在微软研究院,他被称为“分布式系统”理论的先驱之一,它描述了由多个部分组成的任何计算机系统,它们相互通信。Lamport的工作为许多支持现代网络的系统奠定了基础。
对于Lamport来说,今天软件充满漏洞的一个主要原因是程序员直接编写代码。他在一篇文章中写道:“建筑师在铺设砖块或锤钉之前会制定详细的计划。” “但是很少有程序员甚至在开始编码之前写下他们的程序将会做什么的粗略草图。”程序员被编程的细节所吸引,因为代码是使程序运行的原因; 花时间在其他任何事情上似乎都会分散注意力。并且通过迷惑代码的微观机制,可以获得耐心的快乐,一种冥想的满足感。但Lamport认为,代码从来就不是一种思想媒介。“当你用编程语言思考时,它确实限制了你思考的能力,”他说。代码让你错过树林:它将您的注意力集中在各个部分的工作上,而不是更深入地了解您的程序如何组合在一起,或者它应该做什么 - 以及它是否真正按照您的想法行事。这就是Lamport创造TLA +的原因。与基于模型的设计一样,TLA +将您的注意力集中在系统的高级结构,即其基本逻辑,而不是实现它的代码。
Newcombe和他在亚马逊的同事将继续使用TLA +在主要系统中发现微妙的关键错误,包括S3背后的核心算法中的错误,被认为可能是世界上最可靠的存储引擎。它现在在公司广泛使用。在曾经使用过TLA +的微小人群中,他们的成功并不那么罕见。微软的一名实习生使用TLA +来捕捉一个可能导致世界上每个Xbox在使用四个小时后崩溃的错误。欧洲航天局的工程师使用它来重写码,操作系统是第一个在彗星上轻轻降落的探测器,其编码少了10倍。英特尔定期使用它来验证其芯片。
但是TLA +只占据主流的一个小角落,如果它可以说占据了那里的任何空间。即使对于像Newcombe这样经验丰富的工程师来说,这种语言最初也是一种奇异而神秘的东西 - 一个象征动物园。对于Lamport来说,这是教育的失败。虽然编程诞生于数学,但它已经基本上脱离了它。大多数程序员都不太熟悉数学 - 逻辑和集合理论 - 大多数 - 你需要使用TLA +。“很少有程序员 - 包括很少的编程老师 - 了解最基本的概念以及它们在实践中的应用方式。他们似乎认为他们所需要的只是代码,“Lamport说。“这个想法比你需要能够准确思考的代码有更高的级别,并且数学实际上允许你精确地思考它,只是完全是外来的。因为他们从未学过它。“
Lamport认为,未能在数学上思考他们正在做什么作为现代软件开发的问题,简而言之:风险不断增加,但程序员并没有加强 - 他们还没有开发出处理日益复杂的问题所需的印章。“在15世纪,”他说,“人们习惯于在不知道微积分的情况下建造大教堂,而现在我认为你不允许任何人在不知道微积分的情况下建造大教堂。我希望经过一段相当长的一段时间后,如果他们不理解这些简单的事情,就不会允许人们编写程序。“
Newcombe并不确定这是程序员的责任。“我从Leslie那里听说他认为程序员害怕数学。我发现程序员不知道 - 或者不相信 - 数学可以帮助他们处理复杂性。复杂性是程序员面临的最大挑战。“他说,让人们使用TLA +的真正问题是让他们相信这不会浪费他们的时间。程序员作为一个物种,是无情务实的。像TLA +象牙塔一样的工具。当程序员遇到“正式方法”(所谓的因为它们涉及数学,“正式”精确的程序描述)时,他们根深蒂固的本能就是反冲。
大多数在大学学习计算机科学的程序员都曾短暂地遇到过正式方法。通常它们会在一些微不足道的东西上展示出来,就像一个从零开始计算的程序; 学生的工作是在数学上证明该程序确实从零开始计算。
“我需要改变人们对正式方法的看法,”Newcombe告诉我。甚至Lamport本人似乎也没有完全掌握这一点:正式方法存在图像问题。修复它的方法不是要求程序员改变 - 改变自己。Newcombe意识到要将TLA +等工具带入编程主流,你必须开始讲他们的语言。
一方面,他说,当他向亚马逊的同事介绍TLA +时,他会避免告诉他们它代表什么,因为他害怕这个名字让它看起来不必要地禁止:“行动的时间逻辑”恰恰就是那种高调的在学术界发挥得很好,但推迟了大多数练习程序员。他还试图不使用“正式”,“验证”或“证明”这两个术语,这些术语提醒程序员进行繁琐的课堂练习。相反,他将TLA +作为一种新的“伪代码”,一种真实代码的踏脚石,让你能够详尽地测试你的算法 - 这让你在设计过程中尽早思考。“工程师在调试方面考虑而不是'验证',”他写道,所以他将这个主题的内部谈话称为亚马逊工程师“调试设计”。“而不是哀叹程序员用代码看世界的事实,Newcombe接受了它。他知道他会失去他们。“我有一群人说,'现在我明白了,'”Newcombe说。
此后他离开亚马逊去甲骨文,在那里他能够说服他的新同事尝试TLA +。对他来说,使用这些工具现在是一个责任问题。“我们需要在这方面做得更好,”他说。
“我是自学成才,从九岁开始编码,所以我的直觉就是开始编码。这是我的唯一 - 这是我的思维方式:你会画一些东西,尝试一些东西,你会有机地进化它。“在他看来,这就是今天许多程序员仍在做的事情。“他们谷歌,他们看看Stack Overflow”(一个流行的网站,程序员回答彼此的技术问题)“他们得到了代码片段,以解决他们在这个小功能中的战术问题,并将它们粘合在一起,并进行迭代。”
“在你遇到真正的问题之前,这一切都很好。”
[图片上传失败...(image-115f54-1565709376163)]
[图片上传失败...(image-5187e-1565709376163)]
在2015年夏天,一对美国安全研究人员Charlie Miller和Chris Valasek确信汽车制造商没有严重控制软件缺陷,证明2014年的Jeep Cherokee可以被黑客远程控制。他们充分利用了汽车的娱乐系统,它具有蜂窝连接(例如,你可以用你的iPhone开车),它连接到更多的中央系统,比如控制挡风玻璃刮水器的系统,转向,加速和制动(例如,您可以在后视屏幕上看到在转动车轮时响应的指南)。作为他们在夜晚和周末发展的攻击的证据,当记者在高速公路上驾驶它时,他们侵入了米勒的车,并使其变得混乱; 记者,
虽然他们实际上没有创建一个,但他们表明可以编写一个聪明的软件,一个“车辆蠕虫”,它将使用被黑客入侵的吉普切诺基的车载计算机来扫描和攻击他人; 如果他们想要的话,他们本可以同时进入全国范围内的弱势汽车和SUV车队。(至少有五辆菲亚特克莱斯勒车型受到影响,其中包括Jeep Cherokee。)有一天,他们可以告诉他们所有人,例如,突然向左转或高速切断发动机。
“我们需要以不同的方式思考软件,”Valasek告诉我。汽车公司长期以来由数百家不同供应商生产的零件组装成品。但是,这些部件曾经是纯机械的,现在,它们通常会带有数百万行代码。虽然这些代码中的一些 - 用于自适应巡航控制,用于自动制动和车道辅助 - 确实使汽车更安全(“我的吉普车的安全功能已经无数次拯救了我,”米勒说),它也创造了一个级别复杂性是全新的。它使一种新的失败成为可能。
“车内有很多漏洞,”Esterel背后的法国研究员Gerard Berry在一次谈话中说道。“这不像航空电子设备 - 在航空电子设备中,它非常重视。而且它承认软件与机制不同。“汽车行业可能是尚未意识到它们实际上属于软件业务的行业之一。
“我们不会在汽车制造业中拥有一个知道它正在做什么的软件安全监管机构,”在丰田案中作证的软件专家迈克尔巴尔说。他说,NHTSA“只有有限的软件专业知识。他们是从机械历史中得出的结论。“使基于模型的设计和代码生成对航空业具有吸引力的相同监管压力对汽车制造来说变得越来越慢。达索航空公司(Dassault Aviation)的埃马纽埃尔·莱迪诺特(Emmanuel Ledinot)推测,这种差异可能还有经济原因。汽车制造商根本不能将零部件的价格提高几美分,因为它增加了数百万倍; 因此,嵌入汽车中的计算机必须精简到最低限度,几乎没有空间来运行未经过手动调整的代码。
人们怀疑激励机制正在发生变化。“我认为自动驾驶汽车可能会推动它们,”Ledinot告诉我 - “ISO 26262和自动驾驶汽车可能会慢慢推动他们对关键部件采用这种方法。”(ISO 26262是2011年发布的汽车安全标准。巴尔说了同样的话:在自动驾驶汽车的世界里,软件不能成为事后的想法。它不能像今天的航空公司预订系统或911系统或股票交易系统那样建造。代码将负责数亿人的生活,并且必须工作。这不是一项小任务。
“计算基本上是看不见的,”Gerard Berry在他的演讲中说。“当你的轮胎是平的时,你会看到你的轮胎,它们是平的。当你的软件坏了,你看你的软件,什么也看不见。“
“所以这是个大问题。”