精华内容
下载资源
问答
  • 哈希图 vs 区块链,记账的快与慢

    千次阅读 2018-05-08 10:51:45
    可如果你认为用钱就能摆平,那就太小看专利发明人Leemon Baird教授了,因为他还规定:开发者不能自行修改代码,他的公司会追踪下载代码的人。“一经发现法庭上见”,这是Leemon在接受采访时挂在嘴边的话。 Leemon是...

    自古会计第一准则:碰钱不管账,碰账不管钱。

    用一人的余额比对另一人的流水,同时管住操作失误和道德风险,一箭双雕,集中记账的风险顿时蒸发,掌柜省心。

    账钱分离,是人类历史上第一次正儿八经的分布式记账。

    管钱者和记账者分布在掌柜两侧,相互牵制、却常常相安无事。后来银行专职管钱,每月交出对账单,掌柜以此核对自家账目,继续相安无事。

    直到有人怀疑银行内部有事,会默默增发大家不知道的币,这人一气之下发明出一种新的记账技术——区块链:人手一本账,大家一起记,谁也别蒙谁。

    很多人以为区块链就是分布式记账,可分布式的账不一定非得用区块链来记,还有一种方法:哈希图。

    一、什么是哈希图?

    哈希图(Hash Graph)是一种分布式记账技术,最耀眼的特点是快和准,能在电光火石间记清全网的账。

    快和准源自于哈希图的流言协议(Gossip Protocol):所有节点把自己的交易信息告诉左邻右舍,又把左邻右舍的交易消息传给其他节点。于是流言就像核裂变,射向全网。

    可光让全网知道是不够的,知道后如何达成一致才最关键。所以,除了交易信息和数字签名之外,信息包上还贴着两个哈希值(戳此复习概念:哈希值),千万别小看它们,机关全在里面。

    这两个哈希值分别是节点自己上一笔交易的哈希和要传递交易的哈希,节点把这些信息打包成“事件”,发给周边任意节点。

    图1 哈希图的事件结构

    当所有节点收到你事件的下一刻,账就已经记完了,这是为什么?

    因为你知道“别人都知道这件事”,同时别人也都知道“你知道别人知道这件事”,绕晕了吧?但知道这种链条可以无限延伸下去,最终形成全网共识。整个过程很神奇:大家没有围坐一起举手表决,居然就公认这一事件。

    在哈希图里,把这一过程称为虚拟投票(Virtual Voting)。“虚拟”是指没有投票箱或计票员,但大家都能一声不吭算出共识,而且准确无误。

    这一切都要膜拜哈希值的特性:简明且不可仿冒。在此基础上搭配流言协议和虚拟投票,最终让哈希图快马加鞭到一骑绝尘。

    让我们来把玩一个哈希图的最简模型: 


    图2 哈希图的事件在节点间的关联

    ABCDE五根竖线分别代表五个计算机节点,当A收到B随机传来的事件时,A创建一个事件(红点)。

    该事件包括:B的交易时间、交易记录和两个事件的哈希值:A自己最新事件的哈希(深蓝)和B传来事件的哈希(浅蓝)。

    数字签名(戳此复习)后,A把红色事件随机告诉其他人,其他人也以同样的方式传播。

    电光火石的意思是:当红色事件扩散完毕时,账就已记完,而且不会有错。因为只要网络通畅,每个节点最终能共享同样的哈希图(图3)。


    图3 节点A内存里的哈希图

    所有节点都可以通过沿途事件(中间赤红色),把最新事件(顶部黄色)关联到自己早前的事件(底部橙色),以此确认交易。

    如图3,A可以推知:BCDE四节点都会认可顶部的黄色事件,因为他们各自起始时刻的事件(底部橙色)都至少有四条路可以通到顶部事件,这四条路又经过4个节点,而4又是大多数(全网共5个节点),于是确定全网已达成一致。

    这就是为什么事件中不仅要包括别人事件的哈希,而且要包括自己事件的哈希。关键在这里,这是为让全网知道前后事件的关联,最终让所有节点完成虚拟投票。

    如果你读不明白这段也没关系,哈希图白皮书中的解释文字比这篇文章都长,其实只要换成一个我们熟悉的场景就能理解:

    当你转发文章时,顺便告诉别人:“此文是4月14日18:30由作者本人发给我的”,同时附上文章的哈希和你的签名。如果大家都这么做,用不了多久,全网都会知道作者姓名、文章内容和发布时间,并且准确无误。

    而哈希图规则加了一条要求:转发文章前,你必须再加上自己最新文章的哈希值,因为这是要便于全网其他节点追踪传播路径,更可靠地达成共识,否则流言就容易变成谣言。

    把节点数从5个扩大到500个,也是同样的道理,只是哈希图会复杂到肉眼看不清,只有用程序才能算清,不过计算过程仅在眨眼之间。

    你一定看出来了,哈希图隐含一个前提:诚实节点超过节点总数的2/3,这是所有拜占庭容错算法的根本假设。

    哈希图用的也是拜占庭容错算法,细分类别属于完全异步的拜占庭容错(aBFT),名字听着很唬人,但译成白话文却很简单:不对信息传播速度的快慢作任何假设,这样就能应对通信故障和拒绝服务攻击的影响。

    当然完全异步算法的缺点也很明显:等不到2/3多数点头,所有节点就都算不出共识,因为大家都在彼此等待。

    关键问题是:当恶意节点超过1/3时,该怎么办?

    答案是没法办。 

    二、哈希图的局限

    只要不良节点低于总节点数的1/3,拜占庭容错算法能保证共识无误,可如果不良节点超标,哈希图就会精神错乱。

    这是由于全网并没有牢不可破的共识机制,既然所有信息都是用耳朵听来的,那么谁嗓门大就谁就有发言权,如果好人撕破喉咙喊,坏人举着喇叭叫,那这本账就一定记歪掉。

    可是你不用担心,哈希图的确见不得大场面,但却不影响她在小圈子里的能歌善舞。我们专栏2月10日一文中曾抛出一个小概念——许可链:节点需要获批才能入围。

    既然软肋无法消除,那就确保不被戳到。通过选秀让网络节点纯洁起来是使用哈希图技术的前提。许可链的范围界限就是哈希图的能力边界,这是局限之一。

    第二个局限让开发者很无奈:哈希图是专利技术,不付费不能用,而且付完费还得省着用,因为后面追着节点广播费、消息存储费和交易手续费……

    可如果你认为用钱就能摆平,那就太小看专利发明人Leemon Baird教授了,因为他还规定:开发者不能自行修改代码,他的公司会追踪下载代码的人。“一经发现法庭上见”,这是Leemon在接受采访时挂在嘴边的话。

    Leemon是计算机科学博士,是Swirlds公司的创始人兼CTO,Swirlds公司早些年用保密的哈希图技术开拓大企业间的快速交易市场。

    2016年Leemon进军加密货币行业,成立Hedera公司。为了解决网络开放后的不良节点问题,Hedera引入DPOS共识算法(戳此复习),邀请39家大企业共建交易环境,同时历史性地公开了哈希图技术源码。

    但“公开”的意思是给你看看,任何改动都必须遵从Hedera公司的要求:你可以有自己的想法,但必须拿到我的牌照。没有开发者愿意接受教鞭的调教,所以在社区建设方面,哈希图的进展几乎为零。

    但Leemon并不在意社区的想法,因为他有重量级的客户群,比如Credit Unions(信用行业联盟)和CULedger(美国信用合作社),他很清楚自己的目标客户是小众精英创建的大型企业,所以哈希图不像区块链那样,为大众耳熟能详。

    可如果有人告诉你:哈希图会取代区块链,成为下一代分布式记账的主流技术。那你就应该启动逻辑链条,开始独立思考:

    三、哈希图vs.区块链:一山不容二虎?

    官方白皮书提到哈希图的另一项优势:公平。即,每笔交易都能按照它实际发生的时间记账,而不必像比特币这种区块链技术,实际交易时间经常和账本记载时间对不上。

    这是因为比特币矿工收到交易广播时,通常先要打量一番,如果发现一笔交易的优先级不够高(戳此复习概念:交易优先级)或者手续费不性感,矿工就会把它压到抽屉底下,先打包其他交易,左看看右等等,最终账簿上的登记时间就会晚于实际交易时间。

    但哈希图治下,交易时间都与实际一致,因为交易发生的一瞬间就已传遍全网,获得公认。你可别小看这种高效,现实中有很多创新应用,最著名的就是防止证券业内的抢先交易。

    比如:

    你委托我以市场价格买入5000万股腾讯股票,我作为经纪人,收到你的指令后先按下不发,转身自己买好100万元,然后公开你的买单,腾讯被你的大单刺激,大涨10%,我却转身卖出,仅凭消息就坐收十万。

    全球监管机构常把抢先交易视作违法行为,多年严防死守,花式道德教育,但技术上只能依靠事后监督,而且取证需要监听嫌疑人,所以往往不了了之。

    如果把哈希图用在证券交易系统中,就能杜绝抢先交易,因为用户在发布交易指令的瞬间,“何人何时以何价买何股”这一事件就无可争议地散向全网,“高效”二字当之无愧。

    但是,高效不是白给的,付出的代价轻易看不见。哈希图通过预筛的方式维护网络平静,但它本身无法抵抗恶意泛滥,所以一旦涌进陌生节点,就会戳中哈希图的死穴:安全。

    如果哈希图是轻功+六脉神剑,那区块链就是金钟罩+铁布衫。在安全方面,区块链的优势更像珠穆朗玛峰,直冲九天。这两位分布式记账派的同门师兄弟并不是要决出你死我活,而是要各自下山,以己之长摆平问题,这才是他们的使命。

    中国人民银行陈一稀提出,当前技术存在“不可能三角”,即无法同时达到分布式、高效和安全,三者最多满足其二。

    在分布式记账之路上,哈希图向左走,打磨高效;而区块链向右走,修炼安全。

    以比特币为例,它用工作量证明(POW,戳此复习)共识算法守护账本,记每一页账都像在烧一块砖,放进窑里让全世界矿工烧10分钟,出炉后封装进区块。每个区块指向上一个区块,块块相连,连了九年。

    很多人都说,比特币不仅费电、又费时间,浪费钱又耽误事,但他们也许并没有注意到,打破这种级别的安全所需要的能量要烧掉几只太阳,这种内力足以此抵抗所有潜在恶意。

    天下武功唯快不破,哈希图用速度解决它场景里的效率问题,而区块链不是为解决效率问题,而是为解决问题。

    结语

    哈希图的工作原理说明它能用低成本记快账,但回到问题本源,想想开篇“账钱分管“的会计准则,分布式记账要解决的是安全准确,并且长期安全准确。

    所以记账快慢不是问题本身,能在多种场景下始终牢不可破,才是一本账真正的价值所在。

    当然,世界需要多样性,我们更需要用足各种技术的天然优势,衡量成本,解决工作生活中的实际问题。

    区块链善于在陌生和凶险的环境中记账,那个世界节点自由出入,善恶难辨,为此不得不多做很多工作,维持共识稳定。而哈希图是在熟人环境里记账,通过严选节点,打造许可链,效率始终优先。

    这就好像社会治安一定需要警察出面,查身份证或透视行李,大家都得配合,为了安全,所有节点必须付出成本。而私家花园里的晚宴,并不需要保安时时搜身,基于信任,我们就能享受便捷。

    如果你有心,把同等规模区块链和哈希图的运营成本相减,除了发现一个天文数字外,你一定能够看出,这是人与人之间信任的真实标价。

    展开全文
  • 外面一片叫好声那是因为他们不是视频网站的开发者和运营者,换位思考一下,如果用户觉得电脑管家扫描病毒太了,修补漏洞太了,有个厂商说我出了一个“管家保姆”,提升扫描病毒的速度,然后把一系列关键 ...

    遨游浏览器“广告快进”产品思考和技术初探

     

     

     

    作者:magictong

     

    前言

    这个功能个人觉得在产品侧的创新要大于在技术侧创新,因此花了较大篇幅来讲解该对该功能的产品体验和产品思考,而把技术分析放在了最后面。

     

    背景

    视频网站播放视频时,前面长达30秒,甚至60秒的视频广告一直是用户的痛点,这个在我们做广告过滤功能时多次听到用户反馈过,其实我们自己也挺烦的,但是我们之前的拦截方案是强技术的,直接拦截视频广告资源链接,干扰视频播放器的行为,更改用户的hosts信息等等方式,这种拦截方式有很大的法律风险(参考[1])。另外,腾讯视频那边也多次找到我们协商去掉对腾讯视频广告的拦截,迫于一些法律风险,视频广告频繁的对抗,造成拦截难度越来越高,因此后来我们的广告拦截逐步去掉了视频网站播放前广告的拦截。

    而最近(2014/2/24)遨游浏览器推出了一款“广告快进”版本,为了推广该功能,广告是铺天盖地,连万利达一楼的电视广告上面都放了遨游的广告快进广告。

     

    产品体验

    第一时间装上了遨游的这个广告快进版本进行体验,发现确实可以快进优酷,爱奇艺,凤凰网等主流视频网站的广告,甚至连视频内容本身都可以快进。

     

    然而主流视频网站的反制跟进也非常迅速(参考[2]),首先是25号早晨(可能更早)优酷发现如果广告被快进了,直接提示“本网站不支持您所使用的浏览器”。牛逼轰轰的,有点感觉是做了一个艰难的决定^_^

     

    到了25号晚上,优酷做了技术上面的反制,优酷的广告无法快进了,但是视频内容本身还可以快进。同样是25号晚上,遨游浏览器做了升级,把首页宣传广告快进的视频样例换成了爱奇艺的(不换不行了,快进不了优酷了嘛)。

    目前还没有看到其它的视频网站做出反制措施,可能还在观望,毕竟目前傲游浏览器的市场份额少得有那么一点可怜(CNZZ数据:2%左右)。也许遨游这次的出风头是为了找下一家也不一定。

     

    产品思考

    遨游的这种方式可以认为是一个产品上面的创新,既可以给到用户一个满意的体验,60秒的广告,可能5秒就快进完了,又不会显得暴力,我没有拦截你的广告呀,我只是给了用户一个快进的入口,有点打擦边球的感觉。但是你想过视频网站的感受没?!外面一片叫好声那是因为他们不是视频网站的开发者和运营者,换位思考一下,如果用户觉得电脑管家扫描病毒太慢了,修补漏洞太慢了,有个厂商说我出了一个“管家保姆”,提升扫描病毒的速度,然后把一系列关键API给挂钩了,让管家跳着扫描,速度果然快了,管家能接受了吗?!例子不太合适,但是我想优酷,爱奇异目前的心情应该是类似的^_^

    另外视频网站可以做的反制措施是很多的,再说你把广告快进了会影响视频网站收入吗?!当然会影响的!因此反制会是强烈的吗?!当然是强烈的!这简直就是红果的“羞辱”视频网站的播放器技术嘛,如果我是优酷视频播放器的开发者,你觉得我会不会死命的反制呢?!

    另外一点是像遨游这种首创,虽然可能很快就被反制了,但是广告效应是有了,对它们也是有利的,投入产出比相当低,而我们再跟进一个类似功能,意义可能不大。遨游可能开发这个功能花了一个月,视频网站可能几个小时就反制了。我们再去开发,一个月可能是搞不定的,毕竟管家没有自己的浏览器,后面的技术部分会讲到为什么这个地方没有浏览器是难点。

    有没有什么其它的方案?也有一些童鞋提到过,我们可以在视频放广告的时候,提醒用户去干别的事情,然后在广告播完之后,弹一个轻Tips告诉用户,广告放完啦,可以看视频了,也许是一种方法,重点是让用户觉得没有浪费时间,又没有错过视频的观看。

    建议我们可以先观察一下视频网站和遨游的战况情况吧。

     

    技术初探

    其实像swf这种视频的快进是很容易实现的,因为flash是支持js脚本调用它的导出接口的,而播放swf的默认播放器导出了很多视频播放控制接口(参考[3]),可以写一个小例子来看一下。

    <html>

    <head>

    <title>flash快进</title>

    </head>

    <body>

    <script type="text/javascript">

    // Get Flash Object

    functiongetFlashMovieObject(movieName)

    {

            if (window.document[movieName])

            {

                      returnwindow.document[movieName];

            }

            else if (navigator.appName.indexOf("Microsoft")==-1)

            {

                      if (document.embeds &&document.embeds[movieName])

                               returndocument.embeds[movieName];

            }

            else

            {

                      returndocument.getElementById(movieName);

            }

    }

    </script>

     

    <p>

    Game(swf)<br/>

    <object id="GameFlashObj2"classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"width="550" height="400">

    <param name="movie"value="1.swf">

    <param name="quality"value="high">

    <param name="play"value="false">

    <embed id="GameFlashObj2"src="1.swf"play="false" quality="high"pluginspage="http://www.macromedia.com/go/getflashplayer"type="application/x-shockwave-flash" width="550"height="400"></embed>

    </object>

    </p>

    <input type="button" value="播放SWF"id="playSWF">&nbsp;<inputtype="button" value="停止SWF" id="stopSWF"><br/>

    <input type="button" value="快进SWF(+100)"id="fastSWF">

    <script type="text/javascript">

            varbtnplay= document.getElementById("playSWF");

            btnplay.onclick =function()

            {

                      getFlashMovieObject("GameFlashObj2").Play();

            }

            varbtnfast= document.getElementById("fastSWF");

            btnfast.onclick =function()

            {

                      varobjFlash= getFlashMovieObject("GameFlashObj2");

                      if (objFlash &&objFlash.IsPlaying())

                      {

                               objFlash.GotoFrame(objFlash.CurrentFrame() + 100);// 4097Frame

                               objFlash.Play();

                    }

            }

            varbtnstop= document.getElementById("stopSWF");

            btnstop.onclick =function()

            {

                      getFlashMovieObject("GameFlashObj2").StopPlay();

            }

    </script>

    </body>

    </html>

     

    这个例子非常简单,用来控制swf文件的播放是完全没有问题的,而且控制代码可以跨浏览器跨平台。想快进的话简单调用swf播放器的跳帧接口就实现了。

     

    事情如此简单吗?!显然不是,那是因为视频网站播放的根本不是swf文件,而主要是f4v文件,这其实也是Adobe弄出来的一种高清视频格式,需要使用flash来播放,但是默认的flash播放器是胜任不了的,因此就需要使用flash来写一些专用的播放器,这些专用播放器也算的上是各大视频网站在客户端上运行的唯一有点技术含量的东了,因此内部的复杂性也就可想而知,优酷有自己的播放器,爱奇异也有自己的播放器,大家都是不一样的。像下面这段爱奇异视频的播放HTML代码(截取自ChromeIE下面可能会有微小差异),Play.swf这个玩意就是爱奇异自己的视频播放器,你可以下下来反编译一下,至于真正播放的视频的地址和广告地址等等都在flahsVars参数里面。

     

    最开始我的想法是,遨游可能是脚本层面控制了这些视频播放器,但是找遍了也没有看到类似的控制脚本,而至于去反编译一款视频网站的播放器来研究,看起来则是一个不太可能完成的任务,像下面这个爱奇异的播放器反编译结果,里面类都有上千,勿论去看每个类的代码了。何况视频网站这么多,每个都分析一遍,一个月是不可能完成的。

    因此,遨游通过直接控制各种播放器的方式来快进的方式应该是不太可能的,虽然这样对于浏览器的兼容性可能会更好。

    我实际编写了一些JS脚本去试图控制这些视频网站的播放,也都失败了。

     

    另外一种可能的技术方案是控制flash的视频流,毕竟你的播放器要通过浏览器去下载视频的资源,在这个过程中,如果能够做一些手脚,控制视频的播放速度是有可能的。但是这里有几个问题存在。

    1、不同版本的flash插件处理音频流和视频流是有差别的,有些甚至差别还很大,尤其是IE下面,N版本。

    2、浏览器内核有很多,在不同的内核下面,flash的插件肯定是不一样的。像IE下面flash插件是一个ocx控件,而chrome下面flash的插件就是一个npapi插件。

    3、不同热度的视频资源,视频网站使用了不同的广告投放技术方案,热度更高的视频,相对来说广告不容易屏蔽。

     

    这是最主要的难点,也是我在上面说到为什么管家不容易做的原因,因为管家自己是插件注入到形形色色的浏览器里面,各种浏览器内核,各种flash控件\插件版本,要解决这些兼容性问题就是一个无穷无尽的事情。而如果有自己的浏览器,那事情就简单多了,在研究遨游的过程中,发现遨游巧妙的解决了这个问题,遨游本身是双核浏览器,但是它在用户观看视频网站时,锁定为Chrome内核,用户无法切换内核。

    另外就是打包了一个固定版本的flash.dll文件(Adobe公司,改名成NPSWF*.dll)。

     

    这样它只需要处理这一个版本的flash插件即可,就解决了不同的flash版本之间的音视频解码的差异问题。

    但是目前还是不清楚,遨游具体使用了什么技术方案,貌似也没有什么分析头绪,只好拿着遨游的老版本和新版本对比,查看各种可能的技术方案,网上查找各种控制视频流的技术方案,此处省略5000字……

    最后发现新版本遨游自己挂钩了几个时间相关的API,时间!而进行InlineHook的那个dll是遨游自己MxVodCtrl.dll,嗯,从这个名字上面来看,好像是那么回事。

     

    验证一下。把这几个钩子恢复一下,遨游的快进功能真的完蛋了。原来如些!

    剩下的任务是枯燥的逆向这几个API钩子都干了些什么事情,但是可以大概的想象一下,它既然是Hook的时间相关的API,那么就说明那些视频播放器里面也调用了这些API,它们调用这些API的目的不外乎控制目前的播放进度和播放时间,当然最主要的事情可能还是计算需要读多长的视频缓存呢?嗯,发挥小伙伴的想象力吧!

    至于网站反制显然也很容易,它只要使用其它的方法来统计广告的总共播放时间,甚至做timestamp校验,就能绕过这个“广告快进”。这也是为什么遨游辛辛苦苦几个月,优酷分分钟就反制了的原因。你的技术方案依赖人家的技术实现嘛。

    因为目前我们暂时是观望态度,没有对这个技术做更深入的分析(如果需要的话,估计需要几天的时间来逆向那些APIHOOK函数,另外最好是有在WEB视频播放这块比较熟悉的开发介绍一下视频播放的过程,对逆向会更有利)。

     

    参考资料

    [1] 金山优酷陷官司纠纷互诉不正当竞争各胜一场http://tech.qq.com/a/20131227/016573.htm

     

    [2] 遨游声音太大,视频网站反弹http://info.broadcast.hc360.com/2014/02/260952592240.shtml

     

    [3] JS控制网页中Flash影片的播放(附带各参数)http://blog.csdn.net/lzkkevin/article/details/6789593

     

    [4] JS传值给flashhttp://blog.csdn.net/lulu_jiang/article/details/6233493

     

    [5] flv f4v 格式web 网页嵌入 源代码http://blog.163.com/w_jingli/blog/static/3825536920100445944690/

     

    [6] JavascriptFlash通信全解析https://www.imququ.com/post/39.html

     

    [7] js调用flash中定义的方法http://www.phpvar.com/archives/2769.html

     

    [8] ActionScriptjavascript相互调用http://blog.csdn.net/u010150082/article/details/14446087

    展开全文
  • 前言: 每看一次《模仿游戏》这...看完电影,想看一下他的论文,竟很难找到,找到的也大多都是付费下载,最后终于找到了一篇,跟大家分享一下。 图灵三篇论文有: 1.1936 - On Computable Numbers, with an Applicati...

    前言: 每看一次《模仿游戏》这个电影都异常激动,也更加对艾伦·图灵 (Alan Turing )崇拜,他不愧为人工智能之父。2019年7月15日,艾伦·图灵登上英国50英镑新钞。

    看完电影,想看一下他的论文,竟很难找到,找到的也大多都是付费下载,最后终于找到了一篇,跟大家分享一下。
    图灵三篇论文有:
    1.1936 - On Computable Numbers, with an Application to the Entscheidungsproblem(论可计算数在判定问题中的应用)
    2. 1950 - Computing Machinery and Intelligence(计算机器与智能,也译作:机器能思考么?)
    3. 1951 - Intelligent Machinery, A Heretical Theory(智能机器,被视为异端的理论)

    下面两个链接都是第2篇:1950 - Computing Machinery and Intelligence
    英文原版高清pdf
    链接:https://pan.baidu.com/s/1-AIugNfqHp91ir6DGmbTmQ
    提取码:gmxa
    中文版word
    链接:https://pan.baidu.com/s/1Aw8IxakmBuxI-hwyPaAAZg
    提取码:0ksw

    在线阅读艾伦·图灵论文

    【原题】COMPUTING MACHINERY AND INTELLIGENCE
    【译题】计算机器和智能
    【作者】艾伦·图灵

    1. 模仿游戏(The Imitation Game)
      我提出来考虑个问题“计算机可以思考么?”这个句子需要对“机器”和“思考”的意义作出定义。这种定义可能受到了框制以反映出到目前为止一般意义上的使用之或然性(The definitions might be framed so as to reflect so far as possible the normal use of the words),但是这种态度是危险的,如果“机器”和“思考”这些单词的意义是通过“检测它们一般是被怎么使用的(examining how they are commonly used)”来找到话,“计算机可以思考么?”这个问题的意义和答案就很难逃出这样的结论:需要从一种统计意义上的审视去寻找,例如一次盖洛普民意测验(a Gallup poll)。不过这很荒唐。代替这样一种定义的尝试,我要把问题作另一个替换,其和问题很接近,而且是可以以相对不含糊的单词来表达。
      问题的新形式可以用术语“一个游戏”来表示,即我们称之为“模仿游戏”。这个游戏是三个人玩的,一个男人(A),一个女人(B),一个询问者(C),其性别男女不限。该询问者在一个和另外两个人隔开的房间里待着。对于询问者,游戏的对象就是去决定另外两个人的性别。询问者是通过标签X和Y来认识他/她们的,而且在游戏结束的时候他要么说“X 是 A,且 Y 是 B”,或者“X 是 B,且 Y 是 A”。询问者被允许对A和B提问,因此:
      C: X愿意告诉我他或她自己头发的长度么?
      现在假设X实际上是A,然后A必需回答。现在游戏中A就要试图去使C作出错误的鉴定。他的答案因此可能是:
      “我是短发,最长的一根大约九英寸长。”
      为了使发声的音调不会有助于询问者,答案应当被写下来,或者更好是打印出来。理想的安排是在两个屋子里放置电传打印机。问题和答案可以由一个中间人作出传递。对第三个游戏者(B)来说,游戏的对象是帮助询问者。她最好的策略很可能就是给出为真的答案。她可以对她的答案追加一些,比如“我是一个女人,不要听他的!”,但是于事无补,因为哪个男人可以作出相同论述(remarks)。
      我们现在来问,“如果一台机器在这个游戏中扮演了A的角色,会发生什么?”询问者还会如同“当游戏像‘当游戏在一个男人和一个女人之间时他的所作所为’这么玩的时候”一样错误决策么?这些问题替换了我们最初的问题“计算机可以思考么”?
    2. 对新问题的评论( Critique of the New Problem)
      就如当问起“对此新式问题答案为何?”,某人可能会问“这个新问题值得花精力去讨论么?”我们关注的这后一个问题不会有进一步的讨论(without further ado),因此打断了无限的回退(thereby cutting short an infinite regress)(译注:图灵认为是值得去讨论的)。
      这个新问题有一个优势,即在介于物理的和人类的智能容量上花上一条相当清晰的线。没有工程师或者化学家宣称能够生产一种物质,其不能区分出是否是人类皮肤。这在未来的什么时候是可能的,但即便假设这种发明是可得的,我们应当感到在试图通过用这种人工皮肤打扮“思考机器”使得其更像人时,存在着一个收敛点(It is possible that at some time this might be done, but even supposing this invention available we should feel there was little point in trying to make a “thinking machine” more human by dressing it up in such artificial flesh. )。我们对该问题设下的形式是对在“阻止询问者去看到或者接触到其它的竞争对手,或是听到竞争对手的声音”条件中的事实之反映。 该提议标准的其它一些优势可以由样本问题和回答来显示(Some other advantages of the proposed criterion may be shown up by specimen questions and answers)。因此:
      Q:請给我写一个主题是福斯桥的十四行诗。
      A:这个我就算了。我从不会写诗。
      Q:34957加上70764。
      A:(停顿了30秒然后给出答案)105621。
      Q:你往国际象棋么?
      A:玩的。
      Q:我在K1有K,没有其它了棋了。你只有K6的K 和 R1的R。现在是你走了,你怎么玩?
      A:(停了15秒)R到R8。
      上述问答看上去对我们期望去总结的是合适的:几乎是对人类努力领域中的任何事物的引介(introducing almost any one of the fields of human endeavour that we wish to include)。我们不会由于计算机对在选美比赛中作炫耀无能为力而去惩罚它,也不会惩罚一个在和飞机竞赛中败下阵来的人。我们游戏的条件使得这些障碍不相关(make these disabilities irrelevant)。“证人们”可以就他们所认为可取的“如他们的魅力力量和勇气一样”作吹嘘,但是询问者不能要求实际的展示。
      这个游戏可能受到由于“可能性的权重过于反对机器(the odds are weighted too heavily against the machine)”的批评,如果这个男人试图去冒充机器,很明显他会演砸(If the man were to try and pretend to be the machine he would clearly make a very poor showing)。他由于在做算术时不精确而且慢,立刻就会放弃。机器就不可以执行某些应当被描述为思考,但是又非常不同于人所作的那种思考么(May not machines carry out something which ought to be described as thinking but which is very different from what a man does)?这个对象是非常强的一个,但至少我们可以说如果,话说回来,能够构建出一个可以玩这个模仿游戏的机器,我们就不需要被这个对象所困。(译注:图灵提到的对象是指不同于人思考的一种机器思考形式?)
      可能会有建议说,当玩“模仿游戏”时,机器最好的策略是某个“异于对人的行为作模仿的”东西(the best strategy for the machine may possibly be something other than imitation of the behaviour of a man.)。这可能是,但我认为不大可能会在这种类型里有什么大的影响。在任何情形下都没有打算去对该游戏的理论下一番功夫,而且将假定最好的策略是试图提供自然情况下人会给出的那种答案(In any case there is no intention to investigate here the theory of the game, and it will be assumed that the best strategy is to try to provide answers that would naturally be given by a man.)。
    3. 游戏相关的机器(The Machines Concerned in the Game )
      我们在第一节中提到的那个问题,直到对我们说单词“机器”时指的是什么作规定之前,不是非常的清晰。很自然的我们应当希望允许所有种类的工程技术用到我们的机器中来(It is natural that we should wish to permit every kind of engineering technique to be used in our machines. )。我们同样希望允许该可能性比之可以构建一台可以工作的机器的一个工程师或工程师团队,但其操作者不能满意于通过其构建而得的描述,这是因为他们(译注:指操作者)已经应用了一种在很大程度上是实验性的方法(We also wish to allow the possibility than an engineer or team of engineers may construct a machine which works, but whose manner of operation cannot be satisfactorily described by its constructors because they have applied a method which is largely experimental. )。最后,我们希望在通常方式下排除这种人造机器(we wish to exclude from the machines men born in the usual manner)。难以对满足这三个条件的定义作出框制。某人可能立即坚持说工程师团队工程师团队应当是一种性别,但这不是真的会被满足的,因为,从一个人的皮肤中的单一细胞(比如说)中培养一个完全的个人,这是很有可能的(for it is probably possible to rear a complete individual from a single cell of the skin (say) of a man)。这样做会是值得非常高度颂扬的生物技术壮举,不过我们不会倾向于视其为“构建一台思考的机器(constructing a thinking machine)”的一个例子。这提示我们丢弃这样的需求:所有类型的技术都是值得而为的(every kind of technique should be permitted)。考虑到事实是当前在“思考机器”的兴趣由一特定种类的机器,通常叫做“电子计算机(electronic computer)”或“数字计算机(digital computer)”,所环绕,遵循这个建议,我们之允许数字计算机参与到我们的游戏中来。
      这种限制初次一瞥会觉非常强的(a very drastic one)。我会试图显示这种显示实际上不是这样的。这样做需要这些机器的属性和特征的一个短期账户(To do this necessitates a short account of the nature and properties of these computers)。
      也有这样的声音:这种用数字计算机来作出的机器识别,比如对我们关于“思考”的准则,只会是不令人满意的,如果(和我的信念相反)结果是数字计算机在这个游戏中不能够上演一场好戏的话。
      已经有许多台数字计算机正常运转了,可能会被问到,“为什么不马上试一下这个实验?满足游戏的条件很容易嘛。有多个询问者可用,而且统计出来可显示有多少次作出了正确的识别。”短的回答就是“我们不是在问是否所有的数字计算机都会在这个游戏中有上佳表现,也不是在问当前可得的计算机可以有较好的表现,而是在问是否有可以想象的有上佳表现的计算机(whether there are imaginable computers which would do well)”。但这只是短的回答。我们稍后会以一个不同的角度去看这个问题。
    4. 数字计算机(Digital Computers)
      在数字计算机背后的观念可能可以通过“这些机器被意图用来执行任何可以由人类计算机来完成的操作(these machines are intended to carry out any operations which could be done by a human computer)”来解释。人类计算机被假设为遵循固定的规则;他没有权在任何细节上不遵从这些规则(The human computer is supposed to be following fixed rules; he has no authority to deviate from them in any detail. )。我们可以假设这些规则在一本书中作出,这些规则会在“无论何时人放置于一个新的工作时”作出改变。他也有一个不受限的纸张供应,可以在其上做他的计算(He has also an unlimited supply of paper on which he does his calculations)。他可能也可以在一台“桌面机器(desk machine)”上做他的乘法和加法,但这无关紧要。
      如果我们使用上述的解释作为一个定义,我们就有处于“循环争论(circularity of argument)”之虞。我们通过给出一个该意义的“通过期望的效果被达到了的”轮廓来避免该循环论证之虞。一台数字计算机可通常的被视为由三部分组成:
      存储(Store)
      执行单元(Executive unit)
      控制(Control)
      存储(The store),即是一信息的存储,对应于人类计算机的纸张,无论这是他在其上做运算的纸张或是于其上打印他的规则书的纸张。在到目前为止的人类计算机做运算中,一部分的存储将会对应于他的记忆。
      执行单元(The executive unit),是“执行涉及到一次运算的各异独立操作(which carries out the various individual operations involved in a calculation)”的部分。这些独立操作为何,就因机器而异了。通常可以做相当长的操作,比如“以7076345687去 乘3540675445 ”,但是在某些机器中只有非常简单的如“写下零”的形式是可能的。
      我们已经提到过提供给计算机的“规则书(book of rules)”在机器中是用存储来替换的(is replaced in the machine by a part of the store)。它然后就被叫做是“指令表(table of instructions)”。控制(the control)的责任就是去看“这些指令是以对的顺序被正确的遵循了(these instructions are obeyed correctly and in the right order. )”。控制是这样被构建的,这必然会发生(The control is so constructed that this necessarily happens)。
      在存储内的信息一般被裂解为适当小的块(broken up into packets of moderately small size)。在一台机器中,例如,一个块可能由十位数位组成(a packet might consist of ten decimal digits)。数字以某种系统化手段(systematic manner)被赋予到存储“其中存储有各异的信息块”的这部分(Numbers are assigned to the parts of the store in which the various packets of information are stored),一个典型的指令可能会说 ——
      “把存储在位置6809 的数字加到存储在4302的数字,且把结果返回到后一个存储位置”。不消说它不会发生在用英语表达的机器中。这更加可能是在如 6809430217 这样的形式中被编码(It would more likely be coded in a form such as 6809430217)。这里17是指在这两个数字之上的各种可能操作。在上面所述的操作例子中,即“加上一个数字 . . . ”。将会注意到该指令“注意到了10个位,并因此很方便的形成了信息的一个包(takes up 10 digits and so forms one packet of information, very conveniently. )”,控制(The control)使指令“以诸指令被存储的位置顺序”得到遵循(take the instructions to be obeyed in the order of the positions in which they are stored),但偶尔一个指令例如
      “现在遵循存储在位置5606的指令,而且从那里开始”
      可能会被遇到,或又如
      “如果位置4505 包含零,就遵循存储在6707的指令,否则就直接继续。”后一种类型的指令非常重要,因为这种指令使得“直到某些条件被满足前,有一个能够被几次三番替换的操作序列(for a sequence of operations to be replaced over and over again until some condition is fulfilled)”成为可能,但是在服从这样做之中,每次反复中没有新的指令,而是一次又一次的同一个指令(but in doing so to obey, not fresh instructions on each repetition, but the same ones over and over again)。做一个家庭对比。假设妈妈要汤米在他每天去学校的路上联系鞋匠看看是否她的鞋子做完了,她可以在每个早上都问一下他(she can ask him afresh every morning.)。她也可以在墙上一劳永逸的贴一个通知(stick up a notice once and for all),他会在去学校前看到这墙上的帖子告诉他就鞋子去联系下,而且在他和鞋子一起回来时撕了那帖子。
      读者必需接纳其为一事实,数字计算机是可以构造的(digital computers can be constructed),而且实际上也已经构造了,遵循了我们已经描述过的规则,并且数字计算机实际上可以很接近的模仿一人类计算机的行为。
      “我们描述过我们人类计算机在使用时的规则书”当然就是通俗小说(The book of rules which we have described our human computer as using is of course a convenient fiction. )。实际上的人类计算机真实的会记住“他们所需做的是什么(what they have got to do)”。如果希望制造一台机器能模仿人类计算机在某些复杂操作中的行为,就需要问问他它是怎么完成的,然后把答案转换为指令表的形式。构建指令表通常被描述为“编程(programming)”。说“对一台机器编程以执行操作A(programme a machine to carry out the operation A)”是在说“把合宜的指令表放入到机器中,从而机器会去做A(to put the appropriate instruction table into the machine so that it will do A)”。
      在数字计算机上的一个有趣的不同观点就是一台数字计算机是一个“有随机元素的数字计算机(digital computer with a random element)。”这些指令涉及到掷骰子或等价的电子过程;这种指令的一个可能例子是“掷骰子并将结果的值放到1000中(Throw the die and put the-resulting number into store 1000)”。有时候这种机器被描述为有自由意志(虽然我自己不会用这个词汇),一般是不可能从观察一台机器来决定其是否有一个随机元素,因为当基于十进制数所在的位做选择时的一个类似的效果是可以由这种设备产出的(It is not normally possible to determine from observing a machine whether it has a random element, for a similar effect can be produced by such devices as making the choices depend on the digits of the decimal for .)。
      大多数实际的数字计算机仅有一个有限的存储。在有无限存储的一台计算机的观念上没有什么理论性困难。当然只有一个有限的部分是可以在任何一次被使用的(Of course only a finite part can have been used at any one time)。同样的,只有一个有限的量可以被构建起来,但我们可以想象随着需要有越来越多会添加进来。这种计算机有特别的理论兴趣,而且将其叫做无限容量计算机(infinitive capacity computers)。
      数字计算机的理念很早就有了。Charles Babbage,在1828年到1839年是剑桥大学的卢卡斯教授( Lucasian Professor of Mathematics at Cambridge),规划了这么一台机器,叫做“分析引擎(the Analytical Engine)”,但是其从没被完成过。虽然 Babbage 据有所有的基本观念,他的机器在那时不是那么的非常吸引人。其将会得到的肯定快于人类计算机的速度,但是看上去要比“现代机器中的较慢的一个,存储是使用纯粹机械的轮子和卡片”的曼彻斯特机器( the Manchester machine)慢100倍。
      Babbage 的分析引擎完全是机械的这一事实将帮助我们去掉自己身上的迷信。现代计算机是有关电的这一事实是重要的,同样重要的是神经系统也是有关电的(Importance is often attached to the fact that modern digital computers are electrical, and that the nervous system also is electrical)。由于Babbage的机器不是电子的,而且由于所有数字计算机在某种意义上是等价的,我们就看到对电流的使用在理论上并不重要(Since Babbage’s machine was not electrical, and since all digital computers are in a sense equivalent, we see that this use of electricity cannot be of theoretical importance)。当然电流通常在关注快速信号传输的地方出现,所以并不奇怪在这些联系中能发现它。在神经系统中化学现象至少和电一样的重要。在某些计算机总存储系统主要是听觉的(In certain computers the storage system is mainly acoustic)。使用电流的特性因此就被看作是只有非常肤浅的相似点(The feature of using electricity is thus seen to be only a very superficial similarity)。(译注:指电流快速的特性和需要快速讯号传输的特性只是在表面上相似非常而已。 )如果我们希望找出这样的相似性,我们应当采取功能的数学类比(If we wish to find such similarities we should took rather for mathematical analogies of function)。
      5.通用数字计算机(Universality of Digital Computers)
      在上一节中考察的数字计算机可能应该归于“离散状态机(discrete-state machines)”。这些机器是通过突然的跳跃来移动的,或者是从一个很确定的状态点击到了另一个状态(These are the machines which move by sudden jumps or clicks from one quite definite state to another)。这些状态由于“介于它们之间被忽视了的可能混淆”而完全的不同(These states are sufficiently different for the possibility of confusion between them to be ignored)。严格说来,没有这样的机器。万事万物实际的移动是连续的。但是确实有许多种类的机器,其可有益的来想成是离散状态机。考虑切换一个照明系统的例子,每次切换必需被明确的定义为开或关,其是一个合宜的小说(it is a convenient fiction that each switch must be definitely on or definitely off)。必须有其媒介作用的位置,但对大多数目的我们可以忘记那些位置。作为一个离散状态机的例子我们可以考虑一个咔咔转动的轮子一秒转120(a wheel which clicks round through 120 once a second),但可能由于一个从外部进行操纵的控制杆而停止;而且一次照射会照亮该轮子的位置中的一个(in addition a lamp is to light in one of the positions of the wheel)。这台机器可以作如下抽象描述。机器的内部状态(由轮子的内部位置去描述)可以是 q1, q2 or q3 。有一个输入信号i0 或 i1 (杠杆的位置)。任意时刻的内部状态是由最后状态和根据该表的输入信号决定的
      (表略)
      输出信号,唯一外部可见的有关内部状态(光)的指示由下表所描述
      状态 q1 q2 q3
      输出 o0 o0 o1
      这个例子是典型的离散状态机。它们可以由这种表来描述,前提就是它们的可能状态只有有限个数字。
      将会看到给出了该机器的初始状态和输入信号,预测所有未来状态就总是可能的。(译注:该机器只有有限个状态,预测所有未来状态才是可能的)。这是对 Laplace 观点“从在某一时刻中的宇宙的完全状态,通过对所有例子的位置和速度之描述,预测所有的未来状态就是可能的”的回忆。然而我们所考虑的预测是,比Laplace的考虑更接近于实用性。“作为一个整体的宇宙(universe as a whole)”这个系统是这样的,初始阶段非常小的错误可以在后来的时间中有压倒性的影响。在某一时刻用一公分的十亿分之一去替换一个单独电子,就可能制造“一个人殒难于一场发生于一年以后的雪崩,或是逃离”这种差异。其是我们称之为“离散状态机(discrete-state machines)”的机械系统之基本属性——这种现象(译注:指类似失之毫厘,差之千里的现象)不会发生(It is an eassential property of the mechanicl systems which we have called “discrete-state machines” that this phenomenon does not occur. )。甚至当我们在考察代替理想化机器的实际物理机器时,在某一刻对状态的合理准确知识会衍生有关任何数字的后步骤的合理准确知识(Even when we consider the actual physical machines instead of the idealised machines, reasonably accurate knowledge of the state at one moment yields reasonably accurate knowledge any number of steps later)。
      我们已经提到过,数字计算机属于离散状态机类别。但这样一台机器所能有的状态的数量不是一般的大。比如,现在在Manchester 工作的那台机器的状态数大约 2 165,000 ,即,10 50,000。把这个和我们那个只有三个状态的滴答转动的齿轮例子相比较。不难看出为何状态为何应当如此之巨。包含一个存储的计算机就相应于被一个人类计算机使用的纸张。能写到纸张上的符号之任一组合必需能写到存储里。为了简单起见,假设只把从0到9的数字作为符号。手写体被忽略。假设计算机允许有100张纸头,每张都有50行,每行可写30个数字。然后状态的数字就是 10 100x50x30 就是,10 150,000。这大约是三台Manchester 机器加起来的状态数。底为2的状态数的对数通常就叫这机器的“存储容量”。因此Manchester 机的存储容量大约是165,000,我们齿轮机器的例子是1.6。如果两台机器加在一起,它们的容量必需加到结果机器的容量上去(If two machines are put together their capacities must be added to obtain the capacity of the resultant machine)。这就导致了可能的陈述,比如“Manchester 机器包含了64个磁性轨道,每个容量是2560,8个电子管容量是1280。 混合存储总计约300达到了174380 (The Manchester machine contains 64 magnetic tracks each with a capacity of 2560, eight electronic tubes with a capacity of 1280. Miscellaneous storage amounts to about 300 making a total of 174,380.)”。
      给出相应于一离散状态机的表,就能预测这台离散状态机会做什么。为什么这个计算应当通过一台数字计算机作出,没有什么理由。假如计算能被足够快的作出,数字计算机就能够模仿任何离散状态机的行为。那时模仿游戏就可以由问题机器(作为B)以及仿效数字计算机(作为A)来玩,询问者不可能在它们之间作出区分。当然数字计算机必需有足够的强大的容量从而能工作的足够快速。还有,必需对被希望去模仿的各个新机器重新编程。
      数字计算机的这种特殊属性,即它们可以模仿任何离散状态机,就是用所谓的“通用机(universal machines)”去描绘这种特殊属性。有这种属性的机器存在的重要结果是,除开不考虑速度(considerations of speed apart),没有必要去设计各异的新机器去做各异的计算处理(it is unnecessary to design various new machines to do various computing processes)。它们是可以在一台机器中做完的,对每种情形有合适的编程。将会看到作为这个的一个后果就是“所有数字计算机在一种意义上是等价的(all digital computers are in a sense equivalent)”。
      我们现在愿意来再次考虑节3尾部浮现的点(译注:节3尾,稍后会以一个不同的角度去看“为什么不马上试一下这个实验?”)。有暂时性的建议说问题“机器可以思考么(Can machines think)?”应当被替换为“想象的数字计算机是能够在模仿游戏中有上佳表现的么(Are there imaginable digital computers which would do well in the imitation game)?”如果我们愿意我们可以把这个表面的问题弄得更一般并问“这些离散状态机中是可以有表现上佳的么(Are there discrete-state machines which would do well)?”但从一般性属性(the universality property )的观点我们看到,这些问题都和这个等价“让我们把我们的关注聚集于一个特定的数字计算机C。通过把这台计算机修改到有足够的存储,合宜的增加其行动速度,提供给它适当的程序,可以做出那种在模仿游戏中叫人满意的扮演了A角色的 C, B的角色由一个人扮演,这是可能的么(Let us fix our attention on one particular digital computer C. Is it true that by modifying this computer to have an adequate storage, suitably increasing its speed of action, and providing it with an appropriate programme, C can be made to play satisfactorily the part of A in the imitation game, the part of B being taken by a man)?”
    5. 相异的观点和主要的问题(Contrary Views on the Main Question)
      我们愿意现在考虑说背景已经清晰了,我们准备好继续下去进入有关我们问题的辩论。“机器可以思考么?”,这个问题的变种在上一节尾给出了。我们不能完全丢弃该问题的原初形式,因为当适当替换时意见也会有差异(for opinions will differ as to the appropriateness of the substitution),而且我们至少应当听听在这种上下文中会说什么。
      如果我首先解释我自己在这事上的信念,会对读者把这事简化一点。首先考虑该问题的更精确形式。我相信大约50年后其对编程计算机就是可能的,其存储容量大约是109,可以让它们很好的玩模仿游戏以至于询问者在问了五分钟后平均不会有多于70%的机会作出正确的识别。原初的问题就是“机器能够思考么?”我认为在太没有意义不值得讨论(I believe to be too meaningless to deserve discussion)。话虽如此,我相信在本世纪末对单词的使用和一般受过教育的意见将会转变如此之大以至于某人可以说机器思考而不会受到反驳(at the end of the century the use of words and general educated opinion will have altered so much that one will be able to speak of machines thinking without expecting to be contradicted)。我进一步还相信隐藏这些信念是没有什么要为其服务的有用目的(no useful purpose is served by concealing these beliefs)。流行观点是“科学家冷酷的从已确立的事实前进到已确立的事实(scientists proceed inexorably from well-established fact to well-established fact),从不会受到任何改进的推测的影响”,这是非常错误的。假设在何为猜想何为证明后的结果是很很清晰的话(which are proved facts and which are conjectures),没有什么结果会坏处。猜想有巨大重要性,应为它们显示了研究中有用的线条。
      我现在前进到的是反对我的那些观点(I now proceed to consider opinions opposed to my own)。
      (1)神学异议( The Theological Objection)
      思考是人不朽灵魂的一个侧面(Thinking is a function of man’s immortal soul. )。上帝给每个男人和女人一个不朽的灵魂,但没有给任何其它动物或者机器。因此没有动物或者机器可以思考。
      我不能接受这个的任何一部分,但会试图回应神学术语。如果动物包括了人,我会发现论据更充份了,因为在我头脑中介于典型的生命和非生命有一个较之“人和其它动物之间”大的多的差异。如果我们考虑其对待一个其它宗教团体成员会如何表现时,神学观念的武断特点变得愈发清晰。基督徒是如何看待待穆斯林关于女人是没有灵魂的观点的?不过让我们把这点抛在一边并回到主要的论争。对我来说上述的论争意味“对上帝的一个严格限制(a serious restriction of the omnipotence of the Almighty)”。确实有上帝所不能为之的事情,比如让1等于2,但我们不应当相信说,如果上帝看待合适的话,会让一个灵魂投胎到大象中么?我们可以期待说它仅会在和一个“假设大象有一个合适发展了的大脑,让牧师得以合适于这种类型的”变异相联系时才运用这种能力(would only exercise this power in conjunction with a mutation which provided the elephant with an appropriately improved brain to minister to the needs of this sort )。对机器的例子来说亦如此(An argument of exactly similar form may be made for the case of machines)。看上去可能不同,因为它更难以下咽。但这确实只意味“上帝会考虑适合给予一个灵魂的那个环境(He would consider the circumstances suitable for conferring a soul)”不太可能。尚有争议的那个环境在本论文的剩余部分得到讨论。在试图构建这样的机器时,我们不应当不逊的篡夺上帝在生成灵魂时的大能,仅仅在我们生孩子时:在所有情形下都我们都是上帝意志为其灵魂提供的住宅工具。
      不过,这只是推测。我对神学论据,无论它们用来支持什么,不是非常印象深刻。这样的常常在过去被发现论据是不能令人满意的。在伽利略的时代,据说文本“而且太阳仍在那里 . . .在一整天里头没有急着要下起(And the sun stood still . . . and hasted not to go down about a whole day)”(约书亚书 x.13)和“他定下了地球的基础,而且永不再变(He laid the foundations of the earth, that it should not move at any time)”(圣歌 cv. 5)是对哥白尼理论的充份反驳(an adequate refutation of the Copernican theory)。以我们现在的知识这种论据显的没什么用处。当知识不可得时这种论据的影响就非同小可了(When that knowledge was not available it made a quite different impression)。
      (2)“头在沙子里”异议( The “Heads in the Sand” Objection )
      “机器能思考的后果太可怕了。让我们希望并相信它们不能够这样做吧。”
      这种论调很少像上述前一种一样公开表达。但这种论调影响了我们大多人去思考这件事情(But it affects most of us who think about it at all)。我们喜欢相信说人在某种微妙的方式上要高于其它的造物。如果能显示给他说超然的必要最好不过了,因为这样他就不会失去居高临下的位置了(It is best if he can be shown to be necessarily superior, for then there is no danger of him losing his commanding position)。神学论据的流行很明显和这种感觉有关系。在聪明人里面这种感觉尤其强烈,由于他们对思考的价值作了比别人更高的评估,也更加倾向于把他们的信念建基于人在这种能力上的超然。
      我不认为这种论据对需要反驳是足以重要的。安慰将会更加的合适:可能这会在寻求灵魂的轮回中找到。
      (3)数学异议( The Mathematical Objection)
      有很多数学逻辑结果可以被用来显示“离散状态机能力的限制(there are limitations to the powers of discrete-state machines)”。这些结果中最著名的就是哥德尔理论(Godel’s theorem 1931),而且显示说在任何状态可以被形式化的足够有力的逻辑系统中,那些状态既不可被证明,亦不可被证否,除非这个系统本身可能不一致。有其他的在某些角度是类似的来自于Church(1936),Kleene (1935), Rosser, 和图灵机(1937)结果(译注:?)。后一个结果最适合考虑,因为其直接指向了机器,与此同时,其它只可以在一个比较不直接的论证中使用:比如如果将要使用哥德尔理论的话,我们还需要加上一些从逻辑系统角度去描述机器的手段,再加上一些从机器方面去描述逻辑系统的手段(if Godel’s theorem is to be used we need in addition to have some means of describing logical systems in terms of machines, and machines in terms of logical systems)。问题中的结果指向了一类机器,其本质是一台有限容量的数字计算机。结果宣称肯定有某些事情是这样一台机器所不能为的。如果要草草的给出 “如模仿游戏”问题的答案,就会有些问题“ 对这个游戏既可能给出错误的答案,或者无论允许多久才回复都完全给不出答案”。当然可能有许多这样的问题,且不可能由某一台机器来回答的那些问题可能由另外的机器来作出令人满意的回答。我们目前当然要假设问题是那种回答属于是或否的类型,而不是类似“你觉得毕加索(Picasso)怎么样?”这样的问题。我们知道机器肯定会失效的那些问题是这样的类型“考虑机器定义如下. . . .这台机器会对任何问题回答‘是’么?(Consider the machine specified as follows. . . . Will this machine ever answer ‘Yes’ to any question?)”点号将由处于一标准形式的某机器的一个描述来替换,可以是像节5中使用的那种。当描述的机器据有一特定相对询问的机器而言较为简单的关系时(When the machine described bears a certain comparatively simple relation to the machine which is under interrogation),就可以显示结果要么是错的,要么不是即将来临的。这是数学结果:据说能够证明机器有不能及于人类智能的缺陷(it is argued that it proves a disability of machines to which the human intellect is not subject)。
      此论据的答案是尽管“如果任何特定的机器,其有所限制的能力只是被陈述,没有任何种类的证明”是成立的,但是对人类智能就没有这样的限制 (it is established that there are limitations to the Powers If any particular machine, it has only been stated, without any sort of proof, that no such limitations apply to the human intellect)。但我不以为这个观点可以这么容易就被摒弃掉。无论何时这些机器中的一个被问到适当关键的问题并给出了一个确定的答案时,我们知道这个答案肯定是错的,这给了我们一种超然于上的感觉。这种感觉只是幻象?毫无疑问当然是真实的,但是我不认为在这上头没有太多重要性。我们太经常给出对我们自己提问的错误答案,以至有充分理由从这种机器的不可靠性证据中得到极大安慰(We too often give wrong answers to questions ourselves to be justified in being very pleased at such evidence of fallibility on the part of the machines)。进一步,我们的优越性仅仅可以从一种“我们相对于一个机器取得了小胜(in relation to the one machine over which we have scored our petty triumph)” 的场合中才能感到。同时胜过所有机器是没有什么问题的(There would be no question of triumphing simultaneously over all machines)。简言之,然后,可能有人比任何给出的机器都要聪明,但之后可能有其它机器更聪明,诸如此类。
      那些把握数学论据的人,我认为最愿意接受模仿游戏作为讨论的基础。那些相信前两个异议的人很可能不会对任何标准有所兴趣。
      (4)来自知觉的论据( The Argument from Consciousness)
      这个论据非常好的表达了Jefferson教授在1949年的Lister演讲,我从中摘出来一些。“除非因为思想和情绪感觉,一个机器得以可以写下一首十四行诗或者作一首曲子,而且除非偶然机会下失去了符号,我们会认同说那个机器相当于人脑,就是说,不只是写下它,而且还知道它写下的是什么。没有机器在其成功时会感到(而且不仅仅只是人工信号,一个容易的发明)喜悦,当其价值消融时感到悲伤,被恭维话所温暖,由于其错误而感到痛苦,被性所陶醉,当其不能得到其想要的而愤怒或失望”。
      这个论据表现出对我们测试的有效性之拒绝。根据这种观点最极端的形式,某人就机器思考可以确定的唯一方式就是“成为机器并感觉自己在思考(to be the machine and to feel oneself thinking)”。某人然后就可以对世界描述这些感觉,但是当然没人有理由要引起任何的注意。同样的根据这种观点,知道一个人在思考的唯一方式就是那个成为那个人(the only way to know that a man thinks is to be that particular man)。其实际上是唯我论者(solipsist)的观点。其可能是最把握了逻辑的观点,但是其让观念的交流成了难题(It may be the most logical view to hold but it makes communication of ideas difficult)。A倾向于相信“A认为但B不认为”,于此同时B相信“B认为但A不认为”,取代在“人同此心,心同此理(it is usual to have the polite convention that everyone thinks)”这点上的持续争辩。
      我却性Jefferson 教授不愿意采纳极端的和唯我论者的观点。很可能他愿意接受模拟游戏作为一个测试。这个游戏(去掉了游戏者B)常常用在“在口试名义下(under the name of viva voce)”的实际中,去发现是否真有人理解了某物,或者只是在“鹦鹉学舌(learnt it parrot fashion)”。让我们听这样一个口试(a viva voce):
      询问者:在你读的十四行诗歌的第一行“我应当把你比作夏季里的一天”里,难道用“春季里的一天”不是更好么?
      目击者:它不能标出格律。
      询问者:“一个冬天的日子”怎么样?格律都正确了。
      目击者:使得,不过没人愿意和一个冬日比较。
      询问者:你会说Pickwick 先生提醒了你圣诞节么?
      目击者:以一种方式。
      询问者:但圣诞节是一个冬日阿,而且我不认为Pickwick 先生会介意这种比较。
      目击者:我不认为你是认真的。当说一个冬日某人是在指一个典型的冬日,而不是像圣诞节这么特殊的一天。
      诸如此类,如果写十四行诗的机器能够像这样在口试中回答,Jefferson 教授会说什么呢?我不知道他是否会把这样的机器视为其答案“仅仅是人工信号”,但如果答案又如上述篇章一样满意和持久的,我不认为他会把其描述为“一个很容易的发明”。这个短语,我认为,意图覆盖这样的“包含了一个记录某人阅读一首十四行诗的,且不时可随意切换的机器”设备。
      简言之其后,我认为大多数“从知觉上支持这个论据”的人会被劝说舍弃该论据而不是认同唯我论的位置。他/她们然后就会愿意接受我们的实验了。
      我不愿意给人以“我觉得知觉没有什么神秘的”感觉。存在有,比方说,一个某种悖论是和任何试图去集中(localise)相联系的。但我不认为这些神秘必然的需要去解决,在我们可以回答这篇论文关心的问题之前。
      (5) 来自各种缺陷的论据(Arguments from Various Disabilities)
      这些论据形如“我同意你说你可以造出能做你所提到的所有事情的机器,但是你永远也不能造出一台能做 X 的机器。”各种特性 X是在我提供了一个选择的联系中:
      和善,机智,美丽,有爱,有创新精神,有幽默感,能区分出何错何对,会犯错,坠入情网,喜欢草莓和冰激凌,让某人喜欢上它,从经验中学习, 适当的使用单词,其自己思想的主宰,像一个人一样有许多各异的行为,做某些全新的事。
      对这些陈述通常没有支持。我相信它们大多建基于科学归纳原则(the principle of scientific induction)。一个人在其一生中已经见到了数以千计的机器。从他所见机器中他总结了若干一般结论。它们很丑陋,每个都为了一个非常有限的目标来设计,当需要一个精密差异的目标时它们就没用了,它们中的任何一个的行为差异是非常小的,诸如此类。自然的他会总结说这些是一般机器中必要的属性。许多这些限制是和大多数机器非常小的存储容量相联系的。(我在假设存储容量的观念以某种方式扩展到不同于离散状态机的诸机器。精确的定义无关紧要,因为在目前的讨论中没有数学精确性的要求)没几年前,当还很少听说数字计算机的时候,引起对数字计算机非常强烈的怀疑是可能的,如果某人提到了它们的性质但没有描述它们的构造。那大概是因为科学归纳原理的一个相似应用。该原理的这些应用当然主要是无意识的。当一个烧伤过的儿童通过避开火显示他害怕火,f 要说他在应用科学归纳法(译注:?)。(我当然也可以描述他在其它许多方面的行为。)人类的工作与习俗看上去对应用科学归纳法来说不是非常适合的材料。空间/时间 的一个非常大的部分必需要加以调研,如果要获得可信的结果。不若此我们就可能(就像许多英格兰儿童所为)觉得说所有人都说英语,而且学习法语很蠢。
      然而对“许多提到的缺陷”有特殊的评论。不能享受草莓和冰激凌可能让读者觉得无趣。一台能享受这种美味的机器是可能可以做出来的,但是任何使人这么做的试图都是愚蠢的(Possibly a machine might be made to enjoy this delicious dish, but any attempt to make one do so would be idiotic)。关于这种缺陷重要的是其有助于某些其它缺陷(What is important about this disability is that it contributes to some of the other disabilities),比如,对发生在人和机器之间的相同类型亲切的困难,一如发生在白人和白人之间,或黑人和黑人之间。
      “机器不会出错(machines cannot make mistakes)”的论调看来是神奇的。某人冒险反驳到“机器有比不出错更糟糕的情况么(Are they any the worse for that)?”但是让我们采取一个更有同情的态度,试试看实际意味着什么。我认为这种批评可以用模拟游戏的术语来解释。已经说过询问者可以通过设置若干简单的算术问题把机器从人中区分出来。该机器由于其致命的精确性而不会掩饰。对这个的回答是简单的。该机器(为玩这个游戏编了程)不会试图去(would not attempt to)对算术问题给出正确的答案。它会故意引入错误的计算方式去混淆询问者(It would deliberately introduce mistakes in a manner calculated to confuse the interrogator)。一个机械故障可能会通过一个不合适的决定,在算术中作出某种错误时,去显示自身(A mechanical fault would probably show itself through an unsuitable decision as to what sort of a mistake to make in the arithmetic)。即便是对批评的这种解释都不是足够有同情的。但是空间所限我们不能对此多论。对我而言这个批评是由于混淆了两类错误,我们可以把它们叫做“功能错误(errors of functioning)”和“结论错误(errors of conclusion)”。功能错误是由于某些“引起机器不似其设计而行事”的机械或者有关电的故障。在哲学讨论中某人会倾向于忽视这种错误的可能性;因此某人就是在讨论“抽象机器(abstract machines)”。这些抽象机器是数学杜撰而非物理对象。通过定义它们不能有功能错误(incapable of errors of functioning)。在这种意义上我们能可靠的说“机器可以永不犯错(machines can never make mistakes)”。结论错误仅仅在“当某些意义附加到来自机器的输出信号时(when some meaning is attached to the output signals from the machine)”会浮现。机器可能,比如说,打印出数学等式,或是英语句子。当答应了一个错误的命题时,我们说机器犯了一个结论错误(the machine has committed an error of conclusion)。很明显没有任何理由去说一台机器不能犯这种类型的错误。它可能什么也不做,只是打印“ 0 = 1 ”。来用一个不那么不正当的例子,机器可能有一些方法来通过科学归纳下结论。我们肯定会望见这样的一个方法偶尔会导致错误的结果(We must expect such a method to lead occasionally to erroneous results)。
      “ 一机器不能是其自己思想的主宰”这个论调可以当然仅仅在“如果可以显示机器在某些主题事件上有某些思维时(if it can be shown that the machine has some thought with some subject matter)”得到回答。话虽如此,“一台机器运算的主题事件(the subject matter of a machine’s operations)”确实看上去意指某些东西,至少对应对它的人来说是如此。如果,比如说,机器试着去发现方程式 x2 - 40x - 11 = 0 的一个解,某人就应当把这个方程式描述为该时刻该机器运算的主题事件。在这种意义上一台机器毋庸置疑的可以是其自己的主题事件(be its own subject matter)。这可用于帮助构建其自己的程序,或是预测其自身结构改变后的效应。通过对结果的观察,其可以修正自己的程序从而能够更有效的达到某些目的。这些在近的未来是可能的,远非乌托梦想。
      “一台机器不能有许多各异行为”的批评只是说“其不能有许多存储容量(it cannot have much storage capacity)”的一种方式。直到相当近期,一个即使是有一千位的存储容量也非常少见。
      我们这里考虑的批评通常是来自意识论据的掩饰形式(disguised forms of the argument from consciousness)。通常如果某人主张说一台机器可以做这些事中的一件,并且描述了机器可以使用的方法种类,就不会留下很深的印象了(Usually if one maintains that a machine can do one of these things, and describes the kind of method that the machine could use, one will not make much of an impression)。人们认为瓦片方法(tile method)(无论其会是什么方法,对其必需是机械的)是非常基本的。比较Jefferson在摘录的圆括号中的陈述 (译注:指 不仅仅是人工信号,是一个容易的发明)。
      (6) Lovelace夫人的异议(Lady Lovelace’s Objection)
      我们关于Babbage的分析引擎最详细的信息是来自Lovelace夫人在1842年 的回忆录。在回忆录里她写到“分析引擎没有主张去产生任何事(The Analytical Engine has no pretensions to originate anything)。它只可以做 我们知道如何为之的任何事物(whatever we know how to order it)”(她的斜体)。这段陈述是 Hartree 在1949年 摘录的,他追加了:“这没有暗示说不可能构建其能够‘思考自己(think for itself)’的电子设备,或者是用生物学术语说,某人可以构建一个条件反射(conditioned reflex),其对作为学习的基础作出服务。无论这在原理上是可行与否,都是一个某些最近的进展所提出的激励和激动的问题。但是现在构建或者规划起来的计算机还看不到这种属性。”(“This does not imply that it may not be possible to construct electronic equipment which will ‘think for itself,’ or in which, in biological terms, one could set up a conditioned reflex, which would serve as a basis for ‘learning.’ Whether this is possible in principle or not is a stimulating and exciting question, suggested by some of these recent developments But it did not seem that the machines constructed or projected at the time had this property.”)
      在这点上我完全同意 Hartree 。将会注意到他没有宣称问题中的机器并没有取得这种性质,而恰恰是Lovelace 夫人可得的证据并没有激励她去相信它们有这种属性。问题中的机器很有可能在某种意义上拥有这种属性(译注:指离散状态机的本质属性)。因为假设了某些离散状态机有这个属性。分析引擎是一台通用数字计算机,所以,如果它的存储容量和速度都是足够的,它就可以适当的编程以模仿问题中的机器了。女伯爵或是 Babbage那里可能没有发生这个论据。在任何情况下他/她们没有什么义务去宣称“所有那些是可求的(all that could be claimed)”。
      这整个问题将在学习机器(learning machines)的标题下面再次被考虑。
      对 Lovelace夫人的异议的一个不同陈述就是一台机器可以“永不做任何新的事(never do anything really new)”。这暂时可以用谚语来踢掉“太阳底下没有新鲜事(There is nothing new under the sun)”。谁可以确定他所做的“初始工作(original work)”不会就是在他教育所植下的种子的成长,或接下来众所周知的普通原则的效应。该异议的一个更好的不同陈述是一台机器永不“使我们惊讶(take us by surprise)”。这种陈述是一个更加直接的挑战而且可以直接就遇到。机器以巨大频率使我感到惊讶(Machines take me by surprise with great frequency)。这主要是因为在决定期望它们做什么上面我没有做充份的计算,更是因为,虽然我做过一个计算,我是在一个草草不整的有风险的样子下做的。可能我对自己说“我认为这里的电压应该和那里一样:总之,让我假设就是这样的吧。”自然的我常常犯错,而且结果让我吃惊, 因为当实验完成了的时候这些假设也被忘记了。这些承认把我公开的放在主题为我的重口味方式的演讲上,但当我证实了我所经历的惊讶时,并没有对我的可信性抛出任何怀疑。
      我不期望回应是叫我的评论安静下来。他将可能说那种惊奇是由于在我身上的创造性的精神行为,这在机器里没有什么返现。这就把我们带回到来自知觉的论争,远离了这个惊奇的观念。这是一条我们必需考虑画完的有关论据的线(It is a line of argument we must consider closed),但可能值得评论说“带着惊奇去欣赏某些东西是需要许多‘创造性的精神行为’的,无论这种惊奇事件是源自于一个人,一本书,一台机器或是任何其它东西(the appreciation of something as surprising requires as much of a “creative mental act” whether the surprising event originates from a man, a book, a machine or anything else)”。
      机器不能给出惊奇的观点是由于,我相信,是一种“哲学家和数学家特别容易陷入的”谬误 (The view that machines cannot give rise to surprises is due, I believe, to a fallacy to which philosophers and mathematicians are particularly subject)。这是一种假设,说一旦一个事实呈现到一个大脑,所有关于那个事实的结果就和该事实一起涌入了大脑。在许多情况下这是一个非常有用的假设,但太容易忘记其是一个错误。这样做的一个自然结果就是其人在之后会假设,在对“仅仅来自数据和一般原则的”结果的规划中,没有什么美德(A natural consequence of doing so is that one then assumes that there is no virtue in the mere working out of consequences from data and general principles)。(译注:图灵认为美德是可以通过对仅来自于数据和一般原则的结果之规划而得到的)
      (7)来自神经科学的连续性论据( Argument from Continuity in the Nervous System )
      神经系统一定不是一个离散状态机。 关于一个撞击一神经元的神经脉冲的大小信息的一个小错误,可能会对输出脉冲规模造成一个大的差异(A small error in the information about the size of a nervous impulse impinging on a neuron, may make a large difference to the size of the outgoing impulse.)。可能会认为,正是因为如此,故某物不能够用一个离散状态机去模仿神经系统的行为(It may be argued that, this being so, one cannot expect to be able to mimic the behaviour of the nervous system with a discrete-state system)。
      一台离散状态机必需和一台连续机有所差异,这是真的。但如果我们坚持模仿游戏的条件,询问者将不能够取得这个差异上的任何优势。这种状况可以搞的更清晰些,如果我们考虑声音的或者其它连续机器。一个有差异的分析者会做的非常好。(一个有差异的分析者是一特定类型的机器,对某些种类的运算不采用离散状态类型)这些中的某些以一个打印的形式提供了它们的答案,而且所以也适合参加这个游戏。一台数字计算机不大可能精确的预测有差异的分析者对一个问题会给出何种答案(It would not be possible for a digital computer to predict exactly what answers the differential analyser would give to a problem),但它对给出合适的答案非常在行。比如说,如果被问及给出 π 的值(实际上是3.14156 ),其会随机的介于值 3.12, 3.13, 3.14, 3.15, 3.16 以概率(比如说)0.05, 0.15, 0.55, 0.19, 0.06 去 合理的进行选择。在这些环境下,询问者要从数字计算机中区分差异分析者就非常困难了。
      (8) 来自信息行为的论据 (The Argument from Informality of Behaviour )
      不太可能产生意图去描述“在所有可以想象的环境集合中中的一个人会去做什么( what a man should do in every conceivable set of circumstances)”的一个规则集。某人可能比方说有一个规则,当某人看到一个红色交通灯时须要停下,如果看到了绿灯就走,但如果由于某些故障两者一起出现了怎么办?某人可能决定说最安全的就是不动。但是某些进一步的困难可能会从这个决策后浮现出来。试图提供指导规则以覆盖任何可能性(eventuality),即便是那些来自交通灯的可能性,看上去是不可能的。这我完全同意(With all this I agree)。
      从这点中有人认为我们不可能是机器。我将尽力再现该论据,但我担心我很难公正的来这么做。看上去有时候是像这么运行的。“如果每个人有一个由‘他的生命被其规定了的’指导的确定规则集,他不会比一台机器更好。“但是没有这样的规则,所以人不能是机器。(“if each man had a definite set of rules of conduct by which he regulated his life , he would be no better than a machine. But there are no such rules, so men cannot be machines.” )”这还没有分散的中间部分正在闪闪发光 (The undistributed middle is glaring)。我不认为曾经像这样设置该论据,但是我相信这却是使用过的论据(I do not think the argument is ever put quite like this, but I believe this is the argument used nevertheless)。然而在“指导规则(rules of conduct)”和“行为规则(laws of behaviour)”之间可能有特定的混淆遮蔽了该议题(cloud the issue)。说“指导规则(rules of conduct)”我指“如果你看到红灯就停下”这样的概念,一辆汽车可据以行事, 而且一辆汽车可对之有意(on which one can act, and of which one can be conscious)。说“行为规则(laws of behaviour)”我指应用于一个人体的自然规律(laws of nature ),例如“如果你勒索他,他会告发你(if you pinch him he will squeak)”。如果我们用“通过指导规则他调节了自己的生活(laws of conduct by which he regulates his life)” 去替换摘出论据中的“调节他生活的行为规则(laws of behaviour which regulate his life)”,没有分散的中间部分(the undistributed middle) 就不再是无敌的了。因为我们相信,“被行为规则所调节暗示其成为了某种机器(being regulated by laws of behaviour implies being some sort of machine)”不仅仅是正确的(虽然不必是一台离散状态机),而且相反的成为这样的一台机器暗示了会被这样的规则所调节。然而,相较于完全指导规则,我们不是这么容易说服自己相信完全行为规则的匮乏(the absence of complete laws of behaviour) 。为了找到这样的规则,我们所知的唯一方法是科学观察(scientific observation),而且我们肯定知道没有什么环境下我们会说“我们找的够多了,没有这样的规则(We have searched enough. There are no such laws.)”。
      我们可以更有说服力的来显示说,任何这样的陈述是不公平的。假定我们可以确定找到这样的规则,如果它们存在。然后给出一个离散状态机,其就必定可能会通过对其充份的观察去发觉,以预测其未来的行为,而且这在一个合理的时间内,比如说一千年(Then given a discrete-state machine it should certainly be possible to discover by observation sufficient about it to predict its future behaviour, and this within a reasonable time, say a thousand years. )。但看上去这并不如此。我在Manchester 计算机上建立起了一个小的程序,仅仅使用了1000单位的存储, 据此该机器以一个十六位数字作为供应,并在两秒内用另一个十六位数字作为回应(whereby the machine supplied with one sixteen-figure number replies with another within two seconds)。我敢说任何人都能从这些关于程序的充份的回复中学习,以能够预测对没有尝试过的价值的任何回复(I would defy anyone to learn from these replies sufficient about the programme to be able to predict any replies to untried values)。
      (9) 来自超感知觉的论据 (The Argument from Extrasensory Perception )
      我假设读者熟悉超感知觉的观念(the idea of extrasensory perception),以及其四个项的意义,即,心灵感应(telepathy)、透视力(clairvoyance)、先知(precognition )和 小宇宙(psychokinesis)。这些分散的现象看上去拒绝了所有我们通常的科学观念。我们是多么愿意丢弃它们!不幸证据不足,至少对心灵感应而言,其势不可挡(Unfortunately the statistical evidence, at least for telepathy, is overwhelming)。重布人的观念以把这些新的事实嵌入进去,是非常困难的(It is very difficult to rearrange one’s ideas so as to fit these new facts in)。一旦某人接受了它们,看上去相信灵魂和鬼魅就不是一大步了。我们的躯体简单的通过已知物理规律移动的这个观念,和一些其它但尚未发现的但多少有些类似的规律一起,将会是先行之一(would be one of the first to go)。
      该论据在我的头脑中是非常强的一个。 尽管和超感知觉相冲突 ,许多科学理论看上去在实践中切实可行,某人可以对此回复说:如果忘记了科学理论,实际上照样可以过的很好(in fact one can get along very nicely if one forgets about it)。这是相当冰冷的安慰,而且有人相信思考就是其中超感知觉可能特别相关的这类现象(This is rather cold comfort, and one fears that thinking is just the kind of phenomenon where ESP may be especially relevant)。
      给予超感知觉的一个更加特别的论据可能是像下面这样子的:“让我们来玩模拟游戏,用一个是很好的心灵感应接受者的人作为目击者,以及一台数字计算机。询问者可以问这样的问题‘我右边的卡属于哪一组(What suit does the card in my right hand belong to)?’。那个通过心灵感应或是透视眼的人在400张卡片里给出了130次的正确答案 。机器只能随机去猜,可能猜对了104次,所以询问者可以作出正确的识别。” 这里开启了一个有趣的可能性。假设数字计算机包含了一个随机数字生成器。然后就自然会用这个去决定该给出什么答案。但是之后该随机数字生成器将会屈服于询问者的心灵感应能力。可能这个心灵感应会引起机器去更多的猜测右边,而非期望的一个或然率计算,从而询问者可能仍旧不能作出正确识别。另一方面,询问者在没有任何询问下就可能会猜对,通过透视眼。有超感知觉,什么都是可能的。
      如果承认心灵感应,就必需把我们的测试束紧(tighten our test up)。该状况可以被认为是类似于“如果询问者自说自话,且竞争者中的一个在用他的耳朵贴着墙听(which would occur if the interrogator were talking to himself and one of the competitors was listening with his ear to the wall)”。把竞争者放到一个“防止心灵感应的房间(telepathy-proof room)”会满足所有的需求。
    6. 学习机器(Learning Machines)
      读者会期待,我没有非常有说服力的正面论据去支持我的观点。如果我有的话我就不会花这么大的力气去指出相异观点的错误了。如果有这样的证据我将现在就给出。
      让我们暂时回到 Lovelace 夫人的异议,其宣称机器只可以做我们让其做的事情(the machine can only do what we tell it to do)。有人会说一个人可以把一个观念“注入(inject)”某机器,且该机器将会在一特定程度上作出回应,而且然后归于寂静(drop into quiescence),就像被锤子锤了一下的一个钢琴弦(a piano string struck by a hammer)。另外的直喻会是一个小于临界大小的原子堆积:一个被注入的观念是相应于一个中子从外面进入该堆(a neutron entering the pile from without)。每个这样的中子将会引发一特定的干扰,其终将褪去(Each such neutron will cause a certain disturbance which eventually dies away)。如果,然而,堆的大小增加的足够时,由这样的一个输入中子引起的这种干扰将很可能会继续增加下去,直至堆被破坏掉为止。对大脑有相应的现象么?而且对机器有这样的现象么?确实能够在人脑中看到这样的现象。它们中的大多数看来是“次临界的(subcritical)”,即,和次临界大小堆的类比相一致(to correspond in this analogy to piles of subcritical size)。给这样的一个大脑提供一个观念将平均说来引发的回馈是少于一个观念的(An idea presented to such a mind will on average give rise to less than one idea in reply)。一个略小的部分是超临界的(supercritical)。给这样一个大脑提供一个观念可能引起整一个“学说(theory)”由二级、三级或更远的观念所组成。动物的大脑看上去非常清楚的是次临界的。附加了这种类比,我们问到“可以构建一台是超临界的机器么(Can a machine be made to be supercritical)?”
      “一个洋葱皮(skin-of-an-onion)”的类比也有所助益。在考虑头脑或大脑(the mind or the brain)的功能时,我们发现了特定的操作,其可以用纯数学术语去解释。我们这样说并不和真实的头脑相一致:如果我们想要找到真的头脑,这只是一种我们必需去剥除的表皮(it is a sort of skin which we must strip off if we are to find the real mind)。但是其后在所剩下之中我们发现了一个深一层的有待剥去的皮肤,诸如此类。在这种方式处理中,我们究竟会到达“真的”头脑么?或者我们最终到达了其中什么也没有的那个皮肤 ?在后一种情况下整个头脑就是机械的(mechanical)。(虽然它不必是一个离散状态机。我们已经讨论过这一点。)
      最近的这两端并没有宣称是有说服力的论据。它们更应当被描述为是“背诵倾向于产生信念(recitations tending to produce belief)”。
      唯一真正令人满意的可以对此观点给出的支持,在节6的开始得到表述(译注:图灵指用一种类似排除法的方式去证明其观点),将会等到本世纪末给出,然后可以做描述的这个实验(will be that provided by waiting for the end of the century and then doing the experiment described)。但在当前我们能说什么呢?如果要让该实验成真,现在应该采取什么步骤呢?
      就像我已经解释过的,这主要的是一个编程问题。工程学的发展也会使之成真,但看上去不大可能说,这些对需求是不足够的(these will not be adequate for the requirements)。大脑存储容量的估计有从1010 到 1015 的二进制位数差异。我倾向于较低的那个值,而且相信就高级类型的思考而言,只有一个非常小的部分被用到了。它的大多数可能是用来保留视觉观感(visual impressions),如果需要多于109 去令人满意的玩模仿游戏,我应当会惊讶的,无论如何都不是一个盲人(I should be surprised if more than 109 was required for satisfactory playing of the imitation game, at any rate against a blind man)。(注:不列颠百科全书的容量,第11版,是 2 X 109)一有107 的存储容量将会是一个非常实际的可能性,甚至是在当前可用的技术下。大可不必增加机器的操作速度(It is probably not necessary to increase the speed of operations of the machines at all)。现代机器的可以被视为是对神经细胞的类比的那部分,其工作速度大约是后者的一千倍。这应当提供一个“边际安全(margin of safety)”,其会以许多方式去覆盖损失的速度。我们的问题其后就是找出如何对这些机器编程(how to programme these machines )以为玩这个游戏。以我目前的工作速度,我一天能产生大约有一千个数位的的程序,所以大约60个工人,持续工作上50年可能会完成该作业,如果没有什么要进到废纸篓。一些更加迅捷的方式看来是值得而为的。
      在试图模拟一个成人大脑的过程中,我们肯定会对“何者将大脑带到了状态大脑的状态(which has brought it to the state that it is in)”过程有很多思考。我们可能注意到了三个组件。
      (a) 初始状态的大脑,说是,出生,
      (b) 大脑受到教育的影响,
      © 使得大脑受到影响的其它不能用教育来描绘的经历。
      取代“试图产生一个程序去模拟成人的大脑”,为何不宁可试试“产生一个模拟儿童的大脑的程序”呢?如果是这样,那么受到合适教育课程影响的人将会获得一个成人的大脑(subjected to an appropriate course of education one would obtain the adult brain)。大概儿童的大脑是对“当某人从文具店买来的”一个笔记本的某种类似。相当少的机械装置,而且有很多空白页。(来自于我们观点的机械装置和写作几乎同义。)我们的希望是,在儿童的大脑里有如此少的机械装置以至于类似这样的大脑的东西可以容易的编程 (there is so little mechanism in the child brain that something like it can be easily programmed)。教育当中的工作量我们可以假定,作为第一次近似,和对人类儿童的教育工作量大致相当。
      我们因此就把我们的问题一切为二。儿童程序(The child programme )和教育过程 (the education process)。余下的这两个紧密相联。我们不能期望在第一次尝试时就去发现一个好的儿童计算机。必需带着教授这样的机器去作实验,并看看其学的有多好。然后可以试另外一个,并看看其是否更好或更坏。介于这个过程和评估之间有明显的联系,通过识别
      儿童机器的结构 = 遗传材料
      儿童机器的变化 = 突变
      自然选择 = 实验者的裁决
      虽然有人可能希望这个过程将要比进化迅速的多。适者生存对衡量优势来说是一个慢的方法。经由智力锻炼,实验者应当能使其加速。同等重要的事实就是,他没有受到随机变异的约束(is not restricted to random mutations)。如果他可以跟踪一个有弱点的原因,他就可以适当的思考何者引起了该种变异(If he can trace a cause for some weakness he can probably think of the kind of mutation which will improve it)。
      不太可能对机器去精确的应用相同的教授过程就像对一个正常的小孩有教无类。将不会,比如说,提供了腿,从而其不能被要求出去并填煤筐。很可能它没有眼睛。但无论这些缺陷可能被聪明的工程学所克服,不可以把这个造物送到“没有其它儿童会对它过份开玩笑的(without the other children making excessive fun of it)”学校。它必需付一些学费。我们不必太在意腿,眼睛,等等。Helen Keller 小姐的例子显示了教育是可以进行的,条件是介于教师和小学生之间的双向交流是可以通过这种或那种手段发生的(communication in both directions between teacher and pupil can take place by some means or other)。
      我们一般是把惩罚和奖赏与教授过程相联系的。一些简单的儿童机器可以被以这种原则构造出来,或被编程出来的。“先于一个惩罚信号出现前,会有短暂事件(events which shortly preceded the occurrence of a punishment signal)”如此构造出来的机器不大可能重复,于此同时,一个奖励信号增加了“导致其发生的事件”重复的可能性。这些定义并没有预先假定机器的任何感觉。我就对这样的儿童计算机做了一些实验,而且成功的教了它少数的事物,但是教授的方法过于“对将该实验认为是真正的成功”不正统。
      对惩罚和奖赏的使用最多只是教授过程的一部分(The use of punishments and rewards can at best be a part of the teaching process)。粗粗道来,如果教师没有其它的方法可以和该小学生沟通了,可以达到他的信息量是不会超过“应用了惩罚与教育”总量的(the amount of information which can reach him does not exceed the total number of rewards and punishments applied.)。在一个儿童学会了反复“Casabianca”之前,他很可能会感觉非常的痛苦(By the time a child has learnt to repeat “Casabianca” he would probably feel very sore indeed),如果这个文本仅可以通过“二十个问题”的技术被发现,那么每一个“不”都是一击的一种形式(taking the form of a blow)。因此就必需有其它的“不动感情的(unemotional)”通讯频道。如果这些频道是可得的,某些语言中通过给出“通过惩罚和奖赏去服从命令”,比如用一门符号语言,去教授一机器就是可能的(If these are available it is possible to teach a machine by punishments and rewards to obey orders given in some language, e.g., a symbolic language)。这些命令需要通过“不动感情”的频道进行转换。该语言的使用将极大减小所需惩罚和奖励的数量。
      诸多主张关于何种复杂性适用于儿童机器可能有差异。可能会使它尽量简单,保持和通用原则相一致。另一个替换可能是有一个“内置(built in)”推理的逻辑完全系统。在后一种情形下,存储主要的是被“定义和命题(definitions and propositions)”所占。命题可能有各种类型的状态(status),如,已确立的事实,猜想,数学可证定理,有官方给出的陈述,表达式有不带信念值的命题逻辑形式。特定命题可以被描述为是“祈使句(imperatives)”。机器应当是这样被构建出来的,从而一旦一祈使句被归类为“得到确认的(well established)”合适的行为就自动的会发生。为了说明这一点,假设教师对这机器说“现在做你的家庭作业”。这可能会导致“教师说‘现在做你的家庭作业’”被包含于得到确认的事实。另一个这样的事实可能是“那位教师说的所有事都是对的”。这些的合成可能最终会导致“现在做你的家庭作业”祈使句被包含在得到确认的事实之间,而且这,通过机器对之构建(by the construction of the machine),将指实际开始做家庭作业,但是效果非常满意。该机器使用的推理过程不必是类似必需满足最精确的逻辑学家的那种。比方说那里可能没有层级类型。但这不必意指会发生类型错误,一点也不比“我们一定会绊倒在没有防守的峭壁上(we are bound to fall over unfenced cliffs)”来的多。合适的祈使句(在该系统内表达,不形成系统的规则部分)类似于“不要使用一个课程,除非其是一个教师提点过的课程之子类(Do not use a class unless it is a subclass of one which has been mentioned by teacher)”可以和“不要靠边上太近(Do not go too near the edge)”有类似的效果。
      一台没有四肢的机器可以遵循的祈使句(The imperatives that can be obeyed by a machine that has no limbs)一定会有一个相当理智的特性,就像上面给出的例子(做家庭作业)一样。寓于这样的祈使句中之重要性将会是,其调节了一种命令,该命令中关心逻辑系统的规则将要被应用 (ones which regulate the order in which the rules of the logical system concerned are to be applied)。对当某人使用一个逻辑系统的每个阶段,都有一个非常大数字的替代步骤,其任一都是被允许使用,目前只关心那种“服从规则的”逻辑系统。这些选择使一杰出的和一无足轻重的形成了差异,而不是在一个声音和一个错误之间形成了差异(These choices make the difference between a brilliant and a footling reasoner, not the difference between a sound and a fallacious one)。导致这种类型祈使句的建议可能是“当提到了苏格拉底,就用第一格式的三段论(When Socrates is mentioned, use the syllogism in Barbara)”或是“如果一个方法被证明是比另一个为快,就不要用那个慢的(If one method has been proved to be quicker than another, do not use the slower method)”。这些中的一些可能是“由当局给出的”,但其它的可能是由机器自己产生的,如,科学归纳法(scientific induction)。
      一个学习机器的观念可能对某些读者表现出矛盾(paradoxical)。机器操作的规则如何可以改变呢?他/她们应该描述完全, 无论其历史如何,无论其作出了何种改变,机器会如何反应(how the machine will react whatever its history might be, whatever changes it might undergo)。规则从而是在时间上相当的不变(The rules are thus quite time-invariant)。这时非常真的。对该矛盾的解释是,在学习过程中被改变了的规则,是相当少炫耀的那种,宣称只是一个短暂有效性(the rules which get changed in the learning process are of a rather less pretentious kind, claiming only an ephemeral validity)。读者可能和美国宪法做一个并行描绘。
      一学习机器的一个重要特性就是,其教师将常常会对里面会发生什么非常不知其所以然,虽然他可能仍旧能够在某种程度上预测他的小学生的行为(its teacher will often be very largely ignorant of quite what is going on inside, although he may still be able to some extent to predict his pupil’s behavior)。这点主要当是应用到从一经过多次磨练设计的(或编程的)儿童机器而来的一机器之后期教育上去。这和“当某人使用一台机器去作计算”一般过程能很清晰的对比,某人的目标然后就是有关于该机器的状态的,一副清晰的“处于该计算中的各个状态之”精神图像(one’s object is then to have a clear mental picture of the state of the machine at each moment in the computation)。这个目标只可以通过努力来达到。面的这个目标,“机器只可以做我们知道如何命令它去做的事(the machine can only do what we know how to order it to do)”观点显得有点奇怪。大多数我们可以放到机器中的程序将会导致其做一些我们完全不能讲得通的,或是我们认为完全随机的行为。智能行为大概存在于和 “涉及到计算的完全受训行为”的分离中,但是一个“不会引起随机行为或者不得要领的反复循环”的微渺(but a rather slight one, which does not give rise to random behaviour, or to pointless repetitive loops)。通过教与学过程去准备我们的机器去在模拟游戏中扮演它的部分的另外一个重要结果是, “人的不可靠(human fallibility)”很可能以一种相当自然的方式被忽略掉,即,没有特别的“指导(coaching)”。(读者应当能对带有来自23、24页观点的这一点和解)(译注:指 Lovelace夫人的异议观点 ) 学习过的那些过程不会产生百分百的必然结果;如果它们产生了它们不会是未学习的(Processes that are learnt do not produce a hundred percent certainty of result; if they did they could not be unlearnt)。
      可能对一个学习机器加入一随机元素会更加聪明。当我们搜索某些问题的一个解决方案时,一个随机元素相当有用 。假如比方说我们要找到介于50和200之间的一个数字,和其自身的数位之和的平方是相等的,我们可以从51开始然后试试52并继续下去,直到我们找到了一个这样的数字。另外我们可以随机的选择一个数字直到我们找到一个这样的数字。这种方法有个优势,不必跟踪已经试过了的值,但是劣势就是可能同一个数字被试了两次,但是这不是非常重要,如果有多个解决方案。系统化方法有劣势是,可能存在非常大量的块,在该首先关注的范围内不带任何解决方案。现在学习过程可以被认为是对一种行为形式的一个搜索(a search for a form of behaviour),其会让教师满足(或者其它什么准则)。既然可能有一个非常庞大数目的令人满意的解决方案,随机方法看上去来的比系统化方法好。应当注意到,这应用在有关进化的类似过程中。但那里系统化方法是不可能的。怎么去追踪已经被试过了的不同的遗传组合,从而避免再次去尝试那些组合?
      我们期望机器将最终在所有纯智力领域中何人类并驾齐驱。但何为一个好的开头呢?即便这个都是一个困难的决定。许多人认为一个非常抽象的活动,像是下国际象棋,将会是个好的开头。也可以被认为是,最好提供给这个机器用钱可以买到的最好的感觉器官,并然后教授它去理解和说英语。这是可以遵循教一个儿童的过程。事物可以被指出和命名等等。再一次的我不知道正确的答案是什么,但是我像两种方式都应当去试试看。
      我们只可以见到前处的一点距离,但是我们可以看到那里有许多需要去做(We can only see a short distance ahead, but we can see plenty there that needs to be done)。
      (完)
    展开全文
  • 我对云原生软件架构的观察与思考

    千次阅读 2020-11-13 14:53:20
    简介:云原生应用架构的目标是构建松耦合、具备弹性、韧性的分布式应用软件架构,可以更好地应对业务需求的变化和发展,保障系统稳定性,本文将分享一下在这个领域的观察和思考。作者 | 易立  阿里云资深技术...
    简介:云原生应用架构的目标是构建松耦合、具备弹性、韧性的分布式应用软件架构,可以更好地应对业务需求的变化和发展,保障系统稳定性,本文将分享一下在这个领域的观察和思考。

    1.png

    作者 | 易立  阿里云资深技术专家

    本系列文章:

    前言

    《解读云原生基础设施》一文中,我们谈到了云原生计算包含三个维度的内容:云原生基础设施,软件架构和交付与运维体系,本文将聚焦于软件架构层面。

    “Software architecture refers to the fundamental structures of a software system and the discipline of creating such structures and systems. ” 
    - 维基百科

    个人理解,软件架构主要目标是解决下列挑战:

    • 控制复杂性:由于业务的复杂性,需要我们用更好的手段帮助研发组织克服认知障碍,更好的分工协作。分而治之,关注点分离等手段皆是如此。
    • 应对不确定性:业务在快速发展,需求在不断变化。即使再完美的软件架构,然而随着时间的推移,团队的变化,软件架构的调整不可避免。读《设计模式》,《微服务设计》等书字里行间写的都是“解耦”两字,让我们关注架构中确定性和不确定性的分离,提升架构的稳定性和应变能力。
    • 管理系统性风险:管理系统中的确定性以及不确定性风险,规避已知陷阱,对未知的风险做好准备。

    云原生应用架构的目标是构建松耦合、具备弹性、韧性的分布式应用软件架构,可以更好地应对业务需求的变化和发展,保障系统稳定性,本文将分享一下在这个领域的观察和思考。

    缘起 - 12 要素应用

    2012 年,Heroku 创始人 Adam Wiggins 发布十二要素应用宣言。它为构建一个优雅的互联网应用,定义了需要遵循的一些基本原则和方法论,也广泛影响了众多的微服务应用架构。十二要素重点关注:应用程序的健康成长,开发者之间的有效的协作,以及避免软件架构腐化的影响。其内容在今天也值得每个同学认真体会。

    2.png
    图片来源:https://12factor.net/zh_cn/

    12 要素应用为我们提供了很好的架构指导,帮助我们:

    • 构建水平伸缩的弹性应用架构,更好支撑互联网规模应用。
    • 提升研发流程的标准化、自动化水平,提升研发效率。
    • 减少开发环境和生产环境的差异,并使用持续交付实施敏捷开发。
    • 提升应用的可移植性,适合云化部署,降低资源成本和管理复杂性。

    松耦合架构设计

    微服务的核心理念是,系统中的各个服务可被独立开发、独立部署,独立升级,各个服务之间是松耦合的。云原生应用架构理念是进一步强调架构的松耦合,降低服务之间相互依赖的程度。

    1. API 优先的应用架构设计

    在面向对象的软件架构中,最重要的是定义对象以及对象的接口契约。SOLID 原则是最被人广为熟知的设计原则:

    • Single responsibility principle - 单一职责原则
    • Open/closed principle - 开放/封闭原则
    • Liskov substitution principle - 里氏替换原则
    • Interface segregation principle - 接口隔离原则
    • Dependency inversion principle - 依赖翻转原则

    将以上五个原则的英文首字母拼在一起就是 SOLID 原则,这也是帮助我们构建高内聚,低耦合、具备柔性的应用架构。在分布式微服务应用架构中,API 优先是契约优先(Contract First)的自然拓展。

    API 应该是被优先设计的:我们知道用户需求是复杂多变的,比如从桌面到移动端,应用的展现方式和操作流程都有可能不同;然而业务逻辑的概念模型和服务交互是相对稳定的。相对而言,API 的接口是更加稳定的,而具体的实现是可以迭代实现和持续变化的。定义良好的 API 可以更好保障应用系统的质量。

    API 应该是声明式,可描述/自描述的:通过规范化的描述,API 易于沟通、易于理解、易于验证,简化开发协同。支持服务的消费者和提供者并行开发,加速开发周期。支持不同的技术栈的实现,比如对于同一个 API 接口,其服务实现采用 Java 。前端应用可以使用 JavaScript ,而服务器端应用可以使用 Golang 进行服务调用等等。这样可以让开发组织可以根据自己的技能栈和系统要求灵活选择合适的技术。

    API 应该具备 SLA:API 作为服务间的集成界面,与系统的稳定性息息相关。SLA 应该作为 API 设计的一部分,而不是部署后再考虑。在分布式系统中,稳定性风险无处不在,通过 API 优先的设计模式,我们对独立的服务进行稳定性架构设计、容量规划;我们还可以对独立的 API 进行故障注入、稳定性演练,来消除系统性的稳定性风险。

    在 API 领域,最重要的趋势是标准化技术的崛起。gRPC 是 Google 开源的的高性能、通用的、平台无关的 RPC 框架。它采用分层设计,其数据交换格式基于 Protobuf  (Protocol Buffers) 协议开发,具备优秀的序列化/反序列化效率,也支持众多开发语言。在传输层协议, gRPC 选择了 HTTP/2,相较于 HTTP/1.1,其传输效率有了很大提升。此外 HTTP/2 作为一个成熟的开放标准,具备丰富的安全、流控等能力,同时拥有良好的互操作性。gRPC 不仅可以用于 Server 端服务调用,也可以支持浏览器、移动 App 和 IoT 设备与后端服务的交互。gRPC 在功能上已经具备完整的 RPC 能力,也提供了扩展机制来支持新的功能。

    在 Cloud Native 的潮流下,跨平台、跨厂商、跨环境的系统间互操作性的需求必然会催生基于开放标准的 RPC 技术,而 gRPC 顺应了历史趋势,得到了越来越广泛地应用。在微服务领域, Dubbo 3.0 宣布了对 gRPC 协议的支持,未来我们也会看到更多的微服务架构基于 gRPC 协议开发,并提供良好的多语言支持。此外,在数据服务领域,gPRC 也成为一个优秀的选择,大家可以参考 Alluxio 的文章

    此外在 API 领域 Swagger (OpenAPI 规范),GraphQL 都是大家值得关注的开放标准。大家根据自己的业务诉求灵活选用,本文不再赘述。

    2. Event Driven Architecture 的崛起

    谈事件驱动架构 (EDA - Event Driven Architecture),我们首先来解释一下什么是事件。事件是指对已经发生的事情、状态变化等的记录。它们是不可变的(无法更改或删除),并且按其创建顺序排序。相关各方可以通过订阅已发布的事件来获取有关这些状态变化的通知,然后使用所选择的业务逻辑根据这些信息采取操作。

    事件驱动架构是一种构建松耦合的微服务系统的架构方式,微服务之间通过异步事件通信来进行交互。

    事件驱动架构实现了事件的生产者和消费者的彻底解耦。生产者无需关注事件如何被消费,同时消费者无需关注事件的生产方式;我们可以动态添加更多消费者而不影响生产者,可以增加消息中间件对事件进行动态路由和转换。这还意味着事件的生产者和消费者没有时序上的依赖,即使由于应用宕机无法及时处理消息,在重新恢复后,程序可以继续从消息队列中获取这些事件继续执行。这样的松耦合架构,为软件架构提供更高的敏捷性、灵活性和健壮性。

    事件驱动架构的另一个重要优点是提升了系统的可伸缩性。事件生产者在等待事件消费时不会被阻塞,并且可以采用 Pub/Sub 方式,让多个消费者并行处理事件。

    事件驱动架构还可以完美地与 Function as a Service (FaaS) 相整合。事件触发函数执行业务逻辑,在函数中也可以编写集成多个服务的“胶水代码”,简单、高效地构建事件驱动架构的应用。

    但是 EDA 架构依然存在很多挑战:

    • 分布式的松耦合架构大大增加了应用基础设施的复杂性。基于云的部署交付方式和云服务(消息队列、函数计算服务等)可以使得该架构的稳定性,性能和成本效益进一步提高。
    • 与传统同步处理方式相比,异步事件处理存在与事件排序、幂等性、回调和异常处理相关的要求,整体设计难度更大一些。
    • 在大多数情况下,由于缺乏跨多个系统的分布式事务支持,维护数据一致性是非常具有挑战性的。开发者可能需要权衡可用性和一致性之间的关系。比如通过 Event Sourcing(事件溯源)实现最终一致性,查看详情
    • 互操作性。在现实世界中,事件无处不在,然而不同生产者对事件的描述却不尽相同。开发者希望无论事件是从哪里发出,都能够以一致的方式构建事件驱动的应用程序。CloudEvents 是一种以通用、一致的方式描述事件数据的规范,由 CNCF Severless 工作组提出,提升了事件驱动应用的可移植性。目前,阿里云 EventBridge、Azure Event Grid 等事件处理中间件,以及 Knative Eventing,阿里云函数计算等 FaaS 技术已经提供了对 CloudEnvents 的支持。

    由于 EDA 自身架构的优点,在互联网应用架构,业务数据化和智能化、IoT 等场景有非常广阔的前景。关于 EDA 的架构讨论,不在此继续展开。

    面向交付的应用架构

    在云原生软件架构中,我们在设计阶段不只是关注软件如何被构建,也需要以终为始。关注如何合理设计和实现软件,才可以被更好地交付和运维。

    1. 应用和运行环境解耦

    在 12 要素应用中,应用和运行环境解耦就已经被提出。而 Docker 容器的出现则进一步加强了这个理念。容器是一种轻量化的应用虚拟化技术,容器之间共享操作系统内核,支持秒级启动,Docker 容器镜像是一个自包含的应用打包格式,将应用和其依赖(如系统库、配置文件)等打包在一起,在不同环境保持部署一致性。

    容器可以作为 Immutable Infrastructure (不可变基础设施)的基础,提升应用交付的稳定性。不可变基础设施是由 Chad Fowler 于 2013 年提出的构想:在这种模式中,任何基础设施的实例(包括服务器、容器等各种软硬件)一旦创建之后便成为一种只读状态,不可对其进行任何更改。如果需要修改或升级某些实例,就是创建一批新的实例进行替换。这种模式的可以减少了配置管理工作的负担,保障系统配置变更和升级可以可靠地重复执行,避免令人头疼的配置漂移问题;易于解决部署环境间的差异,让持续集成与持续部署过程变得更流畅;支持更好的版本管理,在部署出错时可进行快速回滚。

    3.gif

    Kubernetes 作为容器的分布式编排调度系统,进一步提升了容器应用的可移植性。K8s 通过一系列抽象如 Loadbalance Service / Ingress / CNI / CSI,帮助业务应用可以屏蔽底层基础设施的实现差异,灵活迁移。通过这样的能力,我们可以实现工作负载在数据中心、边缘计算和云环境的动态迁移。

    在应用架构中,我们需要避免将静态环境信息,比如 IP / mac 地址等与应用逻辑耦合。在微服务架构中,可以利用 Zookeeper/Nacos 等实现服务的注册发现;在 Kubernetes 中,我们可以通过 Service / Service Mesh 减少对服务端点 IP 的依赖。此外,对应用状态的持久化也尽可能通过分布式存储或者云服务等实现,这样可以大大提升应用架构可伸缩性和自愈能力。

    2. 自包含可观测性

    分布式系统所面对的最大挑战之一就是可观测性。可观测性可以帮助我们解系统当前的状态,并作为应用自愈,弹性伸缩和智能运维的基础。

    在云原生架构中,微服务应用是自包含的,应该自己具备可观测性,可以方便地被系统进行管理和探查。首先是,应用应该具备自身健康状态的可视化能力。

    在 Kubernetes 中,业务应用可以提供一个 liveness 探针,可以通过 TCP、HTTP 或者命令行方式对应用就绪进行检测。对于 HTTP 类型探针,Kubernetes 会定时访问该地址,如果该地址的返回码不在 200 到 400 之间,则认为该容器不健康,会杀死该容器重建新的容器。

    4.gif

    对于启动缓慢的应用,为了避免在应用启动完成之前将流量导入。Kubernetes 支持业务容器提供一个 readiness 探针,对于 HTTP 类型探针,Kubernetes 会定时访问该地址,如果该地址的返回码不在 200 到 400 之间,则认为该容器无法对外提供服务,不会把请求调度到该容器。

    5.gif

    同时在新的微服务架构中已经内置了可观测探针,比如在 SpringBoot 的 2.3 发布了两个新的 actuator 地址:/actuator/health/liveness 和 /actuator/health/readiness ,前者用作存活探针,后者用作就绪探针。业务应用可以通过Spring系统事件机制来读取、订阅、修改 Liveness State 和 Readiness State ,这样可以让 Kubernetes 平台可以做更加准确的自愈和流量管理。

    参考更多信息

    此外,应用可观测性包含三个关键能力:日志、监控与链路追踪。

    6.jpg

    • Logging – 日志(事件流):用于记录离散的事件,包含程序执行到某一点或某一阶段的详细信息。不但包括应用、 OS 执行过程的日志,还应包含运维过程中的日志信息,如操作审计等。
    • Metrics – 监控指标:通常是固定类型的时序数据,包括 Counter、Gauge、Histogram 等,是可聚合的数据。系统的监控能力是多层次的,既包含计算、存储,网络等基础设施服务层次的监控指标,也应该包含业务应用的性能监控和业务指标监控。
    • Tracing – 链路追踪 - 记录单个请求的完整处理流程,可以为分布式应用的开发者提供了完整的调用链路还原、调用请求量统计、应用依赖分析等能力,能够帮助开发者快速分析和诊断分布式应用架构下的性能和稳定性瓶颈。

    在分布式系统中,稳定性、性能、安全等问题可能发生在任何地方,需要全链路可观测性能力保障,需要覆盖基础设施层、 PaaS 层,应用等不同层次,并且可以在不同系统间实现可观测性数据的关联、聚合、查询和分析。

    软件架构的可观测领域具备广阔的前景,也涌现出众多的技术创新。2020 年 9 月 CNCF 发布了云原生可观测性的技术雷达

    7.png

    其中,Prometheus 已成为企业首选的云原生应用程序的开源监控工具之一。Prometheus 培养了一个活跃的开发者和用户社区。在 Spring Boot 应用架构中,通过引入 micrometer-registry-prometheus 的依赖,既可以让应用的监控指标被 Prometheus 服务所采集。更多信息可以参考文档

    在分布式追踪领域,OpenTracing 是 CNCF 下属的开源项目。它是一个技术中立的分布式追踪的规范,提供统一接口,可方便开发者在自己的服务中集成一种或多种分布式追踪的实现。Jaeger 是Uber 开源的分布式追踪系统,兼容 OpenTracing 标准,已经成功在 CNCF 毕业。此外OpenTelemetry是一个潜在的标准,它试图在融合 OpenTracing 和 OpenCensus 这两个项目,形成统一的技术标准。

    对于很多遗留的业务系统,现有应用并不具备完备的可观测性能力。新兴的服务网格技术可以成为提升系统可观测性的新方式。通过数据平面代理的请求拦截,网格可以获取服务间调用的性能指标。此外,在服务调用方应用中只需加入需要转发的消息 header,在服务网格上即可获得完整的链路追踪信息。这样的方式极大简化了可观测性能力的建设,可以让现有的应用低成本融入云原生可观测性体系中。

    阿里云提供了丰富的可观测性能力。XTrace 分布式追踪提供了对  OpenTracing/OpenTelemetry 标准的支持。ARMS 提供了托管 Prometheus 服务,可以让开发者无需关注系统的高可用和容量挑战。可观测性是 AIOps 的基础,在未来企业IT应用架构中将扮演更加重要的角色。

    3. 面向失败的设计 - Design For Failure

    根据”墨菲定律“ — “Anything that can go wrong will go wrong”。分布式系统可能受到硬件、软件等因素、或者内部和外部的人为破坏。云计算比自建数据中心提供了更高 SLA、更加安全的基础设施,但是我们在应用架构设计时依然要时刻关注系统的可用性,关注潜在的”黑天鹅“风险

    系统化的稳定性需要在软件架构,运维体系和组织保障等方面全局考虑。在架构层面,阿里经济体有着非常丰富的经验,比如防御式设计、限流、降级、故障隔离等,而且也向社区贡献了 Sentinel、ChaosBlade 等优秀的开源项目。

    本文,我们将会谈谈几个在云原生时代可以进一步思考的地方。个人的总结是 “Failures can and will happen, anytime, anywhere. Fail fast, fail small, fail often and recover quickly.”

    首先是“Failures can and will happen”,我们需要提升服务器的可替换性。在业界有一个非常流行的隐喻:“Pets vs. Cattle”,宠物和家畜。我们面对一个架构选择:对于应用所在服务器我们是需要精心伺候,防止系统宕机,出现问题后不惜一切代价抢救 (Pet);还是倾向于出现问题后,可以通过简单抛弃和替代进行恢复(Cattle)。云原生架构的建议是:允许失败发生,确保每个服务器,每个组件都能够在不影响系统的情况下发生故障并且具备自愈和可替代能力。这个设计原则的基础是应用配置和持久化状态与具体运行环境的解耦。Kubernetes 的自动化运维体系让服务器的可替换性变得更加简单。

    此外是 “Fail fast, fail small, recover quickly” 。立即失效(Fail fast)是一个非常反直觉的设计原则,它背后的哲学是既然故障无法避免,问题越及早暴露、应用越容易恢复,进入生产环境的问题就越少。采用了 Fail-fast 策略以后,我们的关注点将从如何穷尽系统中的问题转移到如何快速地发现和优雅处理失败。只要跑的够快,故障就追不上我。:-) 在研发流程上,通过集成测试尽可能在早期发现应用存在的问题。在应用级别,可以采用断路器(Circuit Breaker)等模式防止一个依赖服务的局部故障引起全局问题;此外通过 K8s 的健康监测、可观测性可以实现对应用故障的探知,通过服务网格的断路器功能,可以将故障发现、流量切换和快速自愈这些能力外置到应用实现之外,由系统能力保障。Fail small 的本质在于控制故障的影响范围——爆炸半径。这个原则在架构设计和服务设计上都需要我们持续关注。

    最后是“Fail often”,混沌工程是一种在生产环境周期性引入故障变量,验证系统对非预期故障防御的有效性的思想。Netflix 引入混沌工程概念解决微服务架构的稳定性挑战,也得到了众多互联网公司的广泛应用。在云原生时代又有了更多新的手段,Kubernetes 让我们可以轻松注入故障,杀死 pod,模拟应用失效和自愈过程。利用服务网格我们可以对服务间流量进行更加复杂的故障注入,比如 Istio 可以模拟缓慢响应、服务调用失败等故障场景,帮助我们验证服务间的耦合性,提升系统的稳定性。

    更多关于交付和运维架构的更多稳定性思考,我们会在下一篇文章中和大家分享。

    应用基础设施能力下沉

    云原生软件架构的重要目标让开发者关注业务逻辑,让平台去承载系统复杂性。云原生计算重新定义了应用与应用基础设施的边界,进一步提升了开发效率,降低了分布式应用开发的复杂性。

    1. 服务治理能力与业务逻辑解耦

    在微服务时代,以 Spring Cloud 与 Apache Dubbo 为代表的应用框架取得了巨大的成功,它们通过代码库方式提供了服务通信、服务发现和服务治理能力(流量转移、熔断、限流、全链路追踪等)。这些代码库被构建在应用程序本身中,随着应用一起发布和维护。这样的架构存在一些无法回避的挑战:

    • 侵入性:服务治理本质是横向的系统级关注,是与业务逻辑正交的。但在现有微服务框架中,其实现方式和生命周期与业务逻辑耦合在一起的。服务治理能力的增强需要微服务框架的升级,会导致整个系统所有组件的重新构建和部署,导致升级和维护成本提升。
    • 实现绑定:由于微服务框架代码库通常由特定语言实现,难以支持多语言(polyglot)实现。随着业务的快速发展,异构系统之间的集成逐渐成为挑战。

    8.jpg
    图片出处

    为了解决上述挑战,社区提出了 Service Mesh(服务网格)架构,它将业务逻辑与服务治理能力解耦。下沉到基础设施,在服务的消费者和提供者两侧以独立进程的方式部署。这样既达到了去中心化的目的,保障了系统的可伸缩性;也实现了服务治理和业务逻辑的解耦,二者可以独立演进不相互干扰,提升了整体架构演进的灵活性;同时服务网格架构减少了对业务逻辑的侵入性,降低了多语言支持的复杂性。

    Google、IBM、Lyft 主导发起的 Istio 项目就是服务网格架构的一个典型的实现,也成为了新的现象级“网红”项目。

    9.png

    上图是 Istio 的架构,逻辑上分为数据平面和控制平面。数据平面负责服务之间的数据通信。应用和以 sidecar 方式部署的智能代理 Envoy 成对出现。其中由 Envoy 负责截获和转发应用网络流量,收集遥测数据并且执行服务治理策略。在最新的架构中, istiod 作为控制平面中负责配置的管理、下发、证书管理等。Istio 提供了一系列通用服务治理能力,比如:服务发现和负载均衡、渐进式交付(灰度发布)、混沌注入与分析、全链路追踪和零信任网络安全等。可以供上层业务系统将其编排到自己的 IT 架构和发布系统之中。

    服务网格在架构上实现了数据平面与控制平面的分离,这是一个非常优雅的架构选择。企业客户对数据平面有着多样化的需求,比如支持等多样化协议(如 Dubbo),需要定制化的安全策略和可观测性接入等。服务控制平面的能力也是快速变化的,比如从基础的服务治理到可观测性,再到安全体系、稳定性保障等等。但是控制平面与数据平面之间的 API 是相对稳定的。

    CNCF 建立了通用数据平面 API 工作组(Universal Data Plane API Working Group / UDPA-WG),以制定数据平面的标准 API。通用数据平面 API(UDPA)的目标是:为 L4/L7 数据平面配置提供实现无关的标准化 API,类似于 OpenFlow 在 SDN 中对 L2/L3/L4 所扮演的角色。UDPA API 涵盖服务发现、负载均衡、路由发现、监听器配置、安全发现、负载报告、运行状况检查委托等。

    UDPA API 基于现有的 Envoy xDS API 逐步演进,目前除支持 Envoy 之外,将支持客户端负载均衡实现 (比如 gRPC-LB),更多数据平面代理,硬件负载均衡和移动客户端等等。

    我们知道 Service Mesh 不是银弹,其架构选择是通过增加一个服务代理来换取架构的灵活性和系统的可演化性,但是也增加了部署复杂性(sidecar 管理)和性能损失(增加两跳)。UDPA 的标准化和发展将给服务网格架构带来的新一次变化。

    gRPC 在最新版本中提供了对 UDPA 负载均衡的初步支持

    “proxyless” 服务网格概念浮出水面,一个概念示意图如下:

    10.png

    gRPC 应用直接从控制平面获取服务治理的策略, gPRC 应用之间直接通信无需额外代理。这个可以看到开放的服务网格技术的雄心,进化成为一套跨语言的服务治理框架,可以兼顾标准化、灵活性与运行效率。Google 的托管服务网格产品已经率先提供了对 “proxyless” gRPC 应用的支持。

    2. 新一代分布式应用运行时

    对于分布式应用,Bilgin Ibryam 在 Multi-Runtime Microservices Architecture。

    文中分析并总结了典型的四大类需求:

    • 生命周期(Lifecycle)
    • 网络(Networking)
    • 状态(State)
    • 捆绑(Binding)

    11.png

    熟悉传统企业架构的同学可能发现,传统的 Java EE (现在改名为 Jakarta EE )应用服务器的目标也是解决类似的问题。一个典型 Java EE 应用服务器的架构如下图所示:应用生命周期由各种应用容器管理,如 Web 容器、EJB 容器等。应用的安全管理、事务管理、连接池管理都是交给应用服务器完成。应用可以通过 JDBC 、JMS 等标准 API 接口访问外部的企业中间件,如数据库、消息队列等。

    不同的外部中间件通过 Java Connector Architecture 规范实现与应用服务器的插拔。应用通过 JNDI 在运行时实现与具体资源的动态绑定。Java EE 将系统的 cross-cutting concern下沉到应用服务器来解决,让开发者只关注应用的业务逻辑,开发效率有了较好的提升;同时减轻应用对环境和中间件实现的依赖,比如可以在开发环境中用 ActiveMQ ,在生产环境中使用 IBM MQ 替换,而无需修改应用逻辑。

    12.png

    在架构上,Java EE 是一个大的单体应用平台,拖慢了自身架构迭代的速度,跟不上时代的变化。由于 Java EE 过于复杂、沉重,在微服务兴起之后已经被大多数开发者所遗忘。

    在云原生的时代,我们到底需要什么样的应用运行时?

    Dapr 是微软给出的答案。Dapr 是一个事件驱动的,可移植的,构建微服务应用的运行时环境。支持应用在云或边缘部署,支持语言与框架的多样性。Dapr 利用 Sidecar 的模式,把应用逻辑中的一些横切关注点需求(Cross-cutting)分离和抽象出来,从而达到应用与运行环境的解耦以及对外部依赖(包括服务之间)的解耦。

    13.png

    Dapr 的功能和定位如上图所示:

    • 最底下基础设施是各种云平台或者边缘环境。
    • 其上是 Dapr 运行时和“building block” (构件)。Dapr 构件解耦了外部服务和服务的消费者,可以按需加载。构件以统一的 HTTP/gPRC API 为应用层提供服务访问。我们可以将外部服务从 Amazon DyanamoDB 切换为 Azure ComosDB,上层应用无需修改任何代码。Dapr 运行时作为一个独立的 sidecar 进程,独立于应用逻辑。
    • 应用通过轻量化的 SDK 来简化对构件 API 的调用,基于 gRPC/HTTP 开放协议可以轻松支持多语言。

    尽管 Dapr 和 Service Mesh 在架构上有些类似,服务治理功能有所重叠,但两者在本质上却大有不同。服务网格对应用是透明的基础设施;而 Dapr 为状态管理,服务调用和故障处理,资源绑定,发布/订阅,分布式跟踪等提供抽象,需要应用程序通过 SDK/HTTP/gRPC 显式调用 Dapr 能力,它是面向开发人员的开发框架。

    Dapr 还非常年轻,还在快速迭代中,距离被广大开发者和三方厂商所支持还有很长的路要走。但是 Dapr 给我们揭示出一个新的方向:通过关注点分离,让开发者只需关注业务逻辑自身,而分布式架构的系统关注下沉到基础设施中实现;让业务逻辑与外部服务解耦,避免厂商绑定;同时应用和应用运行时是两个独立的进程,通过标准化 API 进行交互、生命周期解耦,便于升级和迭代。

    1. Serverless 的机遇与挑战

    在上一篇文章中,我们已经对 Serverless 应用基础设施,如函数即服务(FaaS), Serverless 容器做了介绍。本文谈谈函数即服务 FaaS 应用在架构方面的一些思考。

    FaaS 的核心思维是:开发者不必关心基础设施运维、容量规划或者扩容缩容,只需为使用的云资源和服务付费既可。这个思考的背后是:让开发者避免投入基础设施的运维,尽可能复用现有的云服务能力,让开发时间重新分配到对用户有更有直接影响和价值的事情上,比如健壮的业务逻辑、能吸引用户的界面及快速响应、可靠的 API 上。

    在软件架构层面中, FaaS 将复杂的业务逻辑拆解成一系列细粒度的函数,并通过事件驱动的方式触发调用。函数之间是松耦合的,可以通过如下两种典型的模式进行协同、组合:

    • Workflow Orchestration 工作流编排:以阿里云 Serverless 工作流为例,可以通过一个声明式的业务流程来编排任务。这种方式简化了开发和运行业务流程所需要的任务协调、状态管理以及错误处理等繁琐工作,让开发者聚焦于业务逻辑开发。

    14.png

    • Event Choreography 事件协调:函数服务之间通过事件交换消息,由事件总线等消息中间件来进行事件的转发,并触发其他函数执行。下面是一个示例应用场景,通过 EventBridge,将订单,用户通知、商家通知、接单、结单等基于函数实现的业务逻辑串联在一起。这种方式更加灵活,系统的健壮性也更好。但是缺点是缺乏显式的建模,开发和维护相对较复杂。

    15.png

    Serverless 具备很多优势, 比如:降低运维成本,提升系统安全性,提升研发效率,加速业务交付等等。然而 Serverless 还有一些不能回避的问题需要我们来做判断:

    成本管理:对于“Pay as you go”的收费模式的一个弱点是:无法准确预测具体会产生多少费用,这于许多组织预算管理的方式不同。

    厂商锁定:即使 Serverless 应用基于开放的语言和框架,但是多数Serverless应用还依赖一些非标准化的 BaaS(Backend as a Service)服务,如对象储存、Key- Value 数据库、认证、日志、和监控等。

    调试和监控:与传统应用开发相比, Serverless 应用的调试与监控工具能力还不完善。良好的可观测性是将 Serverless 计算的重要助力。

    架构复杂性:Serverless 开发者无需关注底层基础设施的复杂性,但是应用架构的复杂性需要格外关注。事件驱动架构和细粒度函数微服务,与传统开发模式非常不同。大家需要根据业务需求和自己的技术能力,在合适的场景应用,然后逐渐扩大应用范围。

    关于典型的 Serverless 应用架构,大家可以参考《What a typical 100% Serverless Architecture looks like in AWS ! 》。

    《Cloud Programming Simplified: A Berkeley View on Serverless Computing》也是深入了解 Serverless 计算的一个好的参考。

    应用运行时的敏捷进化

    更快、更轻、更敏捷的应用运行时技术是云原生计算的持续追求。

    • 体积更小 - 对于微服务分布式架构而言,更小的体积意味着更少的下载带宽,更快的分发下载速度。
    • 启动速度更快 - 对于传统单体应用,启动速度与运行效率相比不是一个关键的指标。原因是,这些应用重启和发布频率相对较低。然而对于需要快速迭代、水平扩展的微服务应用而言,更快的的启动速度就意味着更高的交付效率,和更加快速的回滚,以及更快的故障恢复速度。
    • 占用资源更少 - 运行时更低的资源占用,意味着更高的部署密度和更低的计算成本。

    正因为此,Golang、Node.js、Python 等语言开发者在持续攀升,有几个值得大家关注的技术:

    在 Java 领域,GraalVM 已经逐渐成熟。它是基于 HotSpot 上增强的一个跨语言的全栈虚拟机,支持众多语言的运行平台(包括 Java、Scala、Groovy、Kotlin、JavaScript、Ruby、Python、C、C++ 等)。GraalVM 允许您将程序提前编译为本地可执行文件。

    与经典 Java VM 相比,生成的程序具有更快的启动时间和更低的运行时内存开销。Quarkus /Micronaut 等作为云原生定制的新一代 Java 框架,可以实现惊艳的启动时间和资源开销。更多分析可以参考 Java 的云原生进化

    WebAssembly 则是另外一个令人激动的技术。WebAssembly 作为一个面向现代 CPU 体系架构设计的,安全的、可移植、高效率的虚拟机沙箱,可以在任何地方(服务器、浏览器、IoT 等等)、任何平台(不同操作系统,不同 CPU 体系架构下)安全运行应用。WebAssembly System Interface(WASI)是来标准化 WebAssembly 应用与系统资源的交互抽象,比如文件系统访问,内存管理,网络连接等,提供类似 POSIX 这样的标准 API 。

    平台开发商可以针对具体的操作系统和运行环境提供 WASI 接口不同的实现,可以在不同设备和操作系统上运行跨平台的 WebAssembly 应用。这可以让应用执行与具体平台环境实现解耦,使得应用“Build Once, Run Anywhere”的理想逐渐形成现实。虽然目前 WebAssembly 已经超越了浏览器的领域,但是其发展还在非常初期,期待社区共同推动。有兴趣的同学可以看看 WebAssembly 与 Kubernetes 双剑合璧

    趋势总结

    16.png

    云原生软件架构还在快速发展中,涉及的内容也非常广泛。上述内容更多是个人总结、理解和判断,期待与大家的交流和深入探讨。

    更多参考

    阿里云容器平台团队求贤若渴!社招技术专家/高级技术专家,base 杭州/北京/深圳。欢迎发简历到:jiaxu.ljx@alibaba-inc.com。

    点击链接立即查看容器服务 ACK:https://www.aliyun.com/product/kubernetes

    阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”

    原文链接:https://developer.aliyun.com/article/778175?

    版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
    展开全文
  • 大数据融合数据仓库 -- 一些思考

    千次阅读 2020-05-11 21:59:43
    其目的是实现物物、物人,所有的物品网络的连接,进而实现“管理、控制、营运”一体化的一种网络。 物联网三个重要特征:1.全面感知,利用RFID,传感器,二维码等随时随地获取物体的信息,比如 装载在高层建筑...
  • 近来学习的一些东西和思考

    千次阅读 2019-10-09 15:05:01
    我对看书有这样的体会,新知识在最开始学的时候会比较一点,一旦基础知识补充到了60%-70%的样子,剩下的内容就会看得很快。这三本书帮我补充了对ES6的一些语言基础。 《How JavaScript Works》,这本书目前只有...
  • 关于游戏自动更新工具的思考

    千次阅读 2007-10-31 18:09:00
    网络游戏的自动更新很频繁,而多数玩家会抱怨下载速度过同样的,如果全部都从游戏提供商的服务器上下载,势必导致网络资源的极大浪费,而且对于企业的更新服务器和带宽也是一个很大的考验在PSP技术盛行的今天,为什么不...
  • 导语:本文分享了笔者现网遇到的一个文件下载慢的问题。最开始尝试过很多办法,包括域名解析,网络链路分析,AB环境测试,网络抓包等,但依然找不到原因。然后利用网络命令和报文得到的蛛丝马迹,结...
  • 拥塞控制流量控制的区别:拥塞控制时让网络能承受现有的网络负荷,是一个全局性的过程,涉及所有的主机、所有的路由器,以及降低网络传输性能相关的所有因素。相反,流量控制往往是指点对点的通信量的控制,即...
  • 作为互联网上半场最成功的企业和企业家代表,腾讯马化腾是一个时代的标签。自2004年6月上市,腾讯的股价到2009年也不过在10港币以内徘徊,然而2009年之后到2018年初最高接近475港币,翻了近50倍,市值突破4.5万亿...
  • 同时下载的人数越多,BT下载的奥秘——另辟蹊径的P2P应用 BT大家或许不熟,但迅雷下载大家一定知道。通过BT下载同一文件的人数越多,BT下载的速度就越,这跟我们通常所理解的有些不一样。要说明原因,我们...
  • Linux的Netfilter框架深度思考-对比Cisco的ACL-

    万次阅读 多人点赞 2011-06-28 15:22:00
    这个步骤是可以并行的,比如可以同时在两个处理器上查找“源地址1”的值表和“源地址2”的值表,从而最大化CPU利用率,以最的速度得到两个位图,算法对于采用何种查找算法没有规定,取决于添加ACL时如何将匹配域的...
  • VBA关于数组Dim,ReDim Preserve运行速度对比思考如何插入一段漂亮的代码片 以前看教程经常有人说ReDim Preserve动态定义数组运行速度非常,特做测试分析是否真的想网友说的ReDim Preserve真的不堪重用 经测试得出...
  • 【干货】|800份实战经验PPT免费下载

    千次阅读 2018-01-15 07:08:00
    SQL Server云化思考与实践  SQL Server 2017  SQL Server在电子商务中的应用实 践  【阿里大数据专场】 【资料下载】EB级别体量之下的高效数据赋能  阿里巴巴大数据智能技术  阿里巴巴人工智能驱动大数据  ...
  • 精品免费软件更新下载

    万次阅读 2005-02-06 15:00:00
    腾讯QQ 2005 贺岁版 软件类别: 国产软件 / 免费版 / OICQ专区 文件大小: 17770 KB 运行环境: Win9x/NT/2000/XP 软件语言: 简体中文 软件等级: ... 2005-02-03 11:49:28 下载次数: 13217658 腾讯QQ(OIC
  • 创业公司产品经理的进阶思考

    千次阅读 2020-08-04 15:52:14
    我把这些能力梳理总结为“两个闭环、三个心、四个力”,并对此展开了分析思考大家分享。 最近有个问题一直在我脑子里环绕,一名优秀的产品经理应该是什么样子的呢? 我总结为:两个闭环、三个心、四个力,以下...
  • 结合信息和人员,释放工作效率,更地完成出色的工作,它如同一个虚拟的白板,仅仅通过单一视图组织头脑风暴、捕捉想法、交流规划信息,有其他软件无法媲美的项目管理和商业规划高级功能。利用它可以创建思维导图和...
  • 微软面试经历和相关思考总结

    千次阅读 2020-04-09 17:51:00
    说明:微信公众号不方便插入外链,需要查看文章链接的读者请直接点阅读原文看我博客……这篇文章介绍我面试微软的完整经历,以及相关的思考总结。文章字数1.3w+,阅读全文大约需要半小时。断...
  • 关于大型网站技术演进的思考

    千次阅读 2015-01-30 10:14:06
    关于大型网站技术演进的思考(一)--存储的瓶颈(1)  前不久公司请来了位互联网界的技术大牛跟我们做了一次大型网站架构的培训,两天12个小时信息量非常大,知识的广度和难度也非常大,培训完后我很难完整理出全部...
  • 这本来就是老师留的一道思考题~但是希望从这道题的答案给大家一个分析问题的思路,整理我们学过的网络知识。(当然里面也有一些相对细致的内容)   其实网速无非就是类比出行么 1. 在出发前整理的太 2. ...
  • 网站设计的思考

    万次阅读 2004-08-03 09:53:00
    网站设计的思考 1、定位你的网站主题和名称2、定位你的网站CI形象3、确定网站的栏目和版块4、确定网站的目录结构和链接结构5、确定网站的整体风格和创意设计6、首页的设计7、版面布局的原理8、网页色彩搭配的原理9、...
  • 分发文件并不是先上传再下载,而是一个报文一个报文的上传再一个报文一个报文的下载,也就是说,这边刚上传第一个报文,另一边就开始下载,所以几乎是同时开始上传和下载,这种情况下使用的时间必然受到速度的哪...
  • 网站设计的思考

    千次阅读 2006-06-04 21:32:00
    比如软件下载免费信息。“目标太高”是指在这一题材上已经有非常优秀,知名度很高的站点,你要超过它是很困难的。除非你下决心和有实力竞争并超过它,记住,在互联网上只有第一,人们往往只记得最好的网站,第二第...
  • Hortonworks , 快速上手 Hadoop 的套件

    千次阅读 2018-06-03 18:24:50
    最近我在思考的一件事情:如何帮助团队 SQL 开发快速掌握大数据相关技术呢?面对疯狂暴涨的数据,SQL Server 存储成本越来越高了,日志的增长量也极大超过预期,隔三差五总有空间不足导致的应用异常。而且各种多样化...
  • 一个程序员的思考

    千次阅读 2009-07-01 05:40:00
    1.同类软件有下载量的,有下载量证明有人尝试。但是这个下载量也要合适,不可能你牛到必须要写QQ,迅雷那种。那种背后不是技术,都是资金在堆。也不是传统意义上的软件了。是一个平台。 2.你有此类相关开发技术的。...
  • 提高效率的方法思考 ----嵌入式行业内的闲杂人员敝人抛砖引玉版,出道时间短,只做过Tornado上的项目,想和大家讨论一下如何提高工作效率的问题,看过人家写过的一篇文章,结合自己,写了如下东西:一.根据你从事的...
  • RabbitMQ快速入门(详细)

    万次阅读 多人点赞 2019-06-12 10:45:33
    RabbitMQ官方地址:http://www.rabbitmq.com 下载与安装 RabbitMQ由Erlang语言开发,需要安装RabbitMQ版本对应的Erlang语言环境,具体的就不解释了,自行搜索教程。RabbitMQ官网下载地址:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,254
精华内容 7,701
关键字:

思考快与慢免费下载