译注:ZeroMQ是一个在2009年末发布的网络编程通信库。经过多年的发展,如今的它是一个集套接字通信、消息队列、异步编程的网络开发框架。
在其官方文档的第一章,有这样一段引人启发的的一节《Fixing the world (Pieter Hintjens)》,这也是笔者在进入技术行业以来受影响最深的一段文字。在文中,作者指出了一种思想,一切代码都是互相连接的,它们最终连接人类的大脑,并提到一些网络、异步等的编程难题,都可以通过“连接”来更容易的解决。笔者经过翻译整理,带大家感受ZeroMQ作者的构想。
在多年以后今天、迈入人工智能时代的今天,理解作者的这些思路,能带给我们对人工智能的未来全新的认识。
怎样解释ZeroMQ是什么?我们可能会说出所有它能展现的美好功能:它就像打了鸡血的Socket套接字、就像会路由分发邮箱,它的性能卓越!一些人可能尝试分享他们愉悦的使用感受:编程变得更简单了,复杂性消失了,它打开了我们的心灵。一些人会尝试跟以往作比较:它更小,更简单了,但是,又有点似曾相识。就我个人而言,我也希望解释起我们最初为什么要开发ZeroMQ,因为,这是身为读者的你也很想知道的问题。
编程是一门伪装成艺术的科学,因为我们中的大多数压根不明白软件的本质;即使学过这方面的知识的话,也学的很少。
软件的本质,不是算法、数据结构、编程语言和抽象形态。这些只是我们制造的工具,我们用完就忽略掉的工具。软件的真实本质,其实就是人类的本质——具体来说就是,当事情变的复杂的时候,一个人的能力有限,我们会通过协作,来把大的问题分成小的问题来处理。这才是编程科学:人们将制作好的一块块的容易理解、使用的小构件,把它们砌在一起来解决大问题。
我们身处一个互联的世界,现代软件必须要畅游这个世界。因此为未来设计的的这些超大型软件里的小构件,都是互相连接并且是大规模并行的。“健壮、沉默”的代码是远远不够的。代码之间必须要会交流。代码之间必须是善于交际的。代码的运行必须像人类的脑袋一样,数以万亿计的神经元互相传递消息,一个大规模并行的去中心化的网络,没有单点故障,还能解决重大困难问题。毫无疑问,未来的代码就像人脑一样,一定程度来说,网络发展的最终连接点,就是连接人们的大脑。
如果你做过线程,协议或者网络相关的工作,你会意识到要做好它们是相当不容易的一件事情。即使通过很少的Socket(套接字)去连接少量的程序,你也要在日常生活工作中面对各种令人厌烦的问题。想连接更多的,数以亿计的程序? 这个成本根本令人不敢想象——那是一个遥不可及的梦想。连接计算机是如此的困难,这造就了软件服务业这样一个数以几十亿美元的产业。
目前我们所在的世界里,网络布线能力比我们能够使用它的能力更加超前。而在20世纪80年代,我们遇到一个软件危机,Fred Brooks等卓越的软件工程师认为再没有“银弹”可以让“任何一项技术或方法可使软件工程的生产力在十年内提高十倍。”
译注:所谓的没有银弹是指没有任何一项技术或方法可使软件工程的生产力在十年内提高十倍。
Brooks错过了免费和开源软件时代,它们解决了这场危机,使我们能更加有效的分享知识。今天我们面临着另一个软件危机,一个我们还没有讨论广泛的问题。只有最大最富有的公司才有能力去创建互相连接的应用程序。尽管有云计算的出现,但是它是企业专有的。我们的数据、我们的知识正在从我们的个人电脑里消失,并转移到我们无法访问和与之抗衡的计算云中。谁拥有我们的社交网络?这就像大型计算机革命的反转剧情。
译注:当年计算机革命,追求个人更大的空间更好的性能,在云计算时代,剧情完全反过来了,空间、性能和越来越多的软件服务的已经转移到了云上,个人电脑被弱化
这些政治哲学的东西我们就留给其它书来讨论吧。关键的一点,虽然互联网为大规模代码连接提供可能性,但现实是要实现它,对我们多数人来说还是遥不可及的。大量引人关注的问题(在健康,教育,经济,交通等领域)依然没有解决,因为没有办法把代码连接起来,因为没有办法连接所有的这些大脑使其可以协同工作来解决这些问题。
人们做过很多的尝试去解决代码连接连接的问题。制定过的上千的IETF规范,每一个都在尝试解决部分难题。(译注:IEFT,互联网工程任务组,是全球互联网最具权威的技术标准化组织)对于应用开发者而言,HTTP可能是一个足够简单的工作解决方案,但是它也可能使问题更糟糕——因为它鼓励开发者和架构师们以超大型服务器和瘦小愚蠢的客户端的角度来考虑问题。
所以今天人们仍然使用UDP、TCP、专有定制协议、HTTP和Websockets来连接应用程序。这是痛苦的、低效的、难以扩展的,并且是中央化的。分布式P2P架构主要用于娱乐,而不是工作。你有见过应用程序使用Skype(P2P 语音通讯软件)和Bittorrent(P2P下载软件)来交换数据的吗?
这让我们重新回归编程科学。为了修复这个世界,我们需要做两件事。一,解决“怎样让任何代码在任何地方互相连接”这种普遍性问题。二,封装尽可能最简单的构件来让人们理解和简单的使用。
这听起来简单得荒谬,但也许其实就是这么的简单。
译注:ZeroMQ目前是一个应用广泛的网络编程库,常见的应用场景用于多个服务器、多个进程节点之间的网络通信,也就是作者所倡导的“互相连接的代码”的应用。此外,官方更强调其是一个可取代多线程异步编程的异步编程框架。
查看原文:Fixing the World