精华内容
下载资源
问答
  • 如何做到细节服务
    万次阅读 多人点赞
    2021-12-09 17:51:07

    之前跟大家说要恢复视频更新的速度,其实对我来说就是一个特别大的挑战。实在是太忙了,双十二也开始预热了,忙着开会忙着加班,回家还要扣出点时间搞视频,emo了一段时间。

    不过我这个人一般答应大家的就一定要做到,也就再少睡一个小时嘛,问题不大,我头发多。

    这期视频的出发点其实从我创建公众号以来就想做了,后台就一直有小伙伴来问,有没有最最基础,从头开始学java的文章分享,总觉得学到最后知识并不全面,想补充但是却没头绪,所以这次你们的贴心丙的最细节最全面的教程来了!

    跟着这个路线走一遍,保证你基础无遗漏!从学习工具、课程推荐到找工作面经,给你一条龙服务。

    这个脑图真的写的我贼累,总觉得还能再细一点,越加越多,总也写不完。最近公司加班还多,时间全靠我一点一点挤。

    总之真的很有诚意了,话不多大家看视频!

    耗时一个月,我肝了一个满是细节的Java学习路线,适用程序员入门&进阶

    更多相关内容
  • 泰勒公式的展开细节解析

    万次阅读 多人点赞 2017-08-05 08:58:22
    我并不赞成这个说法,以霍金为例,它的虚时间模型虽然只是数学上的技巧,但是最终的目标却是为他的有限无界的宇宙几何模型服务,这说明,完成逻辑完整性证明和寻找其意义同等重要,可能后者还会更重要,我没有看到哪...

    上周写完了《《三体》读后思考-泰勒展开/维度打击/黑暗森林》后收到一些邮件,进一步思考了关于泰勒展开的意义。也许我掌握的那些网络技术比如Linux Netfilter,NAT之类,太过底层太过小众,所以大家几乎都是没有感兴趣的,倒是这种科普性质的文章和那些吐槽类的文章,会引发一系列的互动,这对我来讲是好事,因为我喜欢跟人交流技术和思想。

    声明

    本来这篇文章应该添加在《三体》读后感后的“补遗”一节呢,后来觉得太长了,有点喧宾夺主的意思,就单独写了一篇文章。
      其实吧,这篇文章已经跟《三体》小说没有太大的关系了,这纯粹是一篇关于数学的文章,但是由于本文要涉及大量关于“趋势的趋势的趋势”,“走势的走势的走势的走势”,“导数的导数的导数的导数的导数…”,为了保持一致性,我将本文的题目写成了“《三体》读后感的读后感…”,可能后面还有,未完待续!

    第一部分.泰勒展开解释

    很多人对我解释的泰勒展开提出了自己的疑问,这些疑问大致都是对下面的问题表示不解:
    为什么可以从一个单独的点不断求导就可以画出整个函数的曲线?即“一点是如何蕴含整个世界”的。
    诚然,这个问题其实在数学上是及其容易证明的,在定量的角度,随便找出一本讲微积分或者数学分析的书都可以得到令人满意的回答,我在文章《《三体》读后思考-泰勒展开/维度打击/黑暗森林》中也给出了一个简易的推导。然而,在满足了逻辑上的自洽后,我们很多人对一件逻辑上合情合理的事情便有了探索其实际意义的欲望,比如我们会问,它的物理意义是什么,它的几何意义是什么,甚至更基本的,它的意义是什么?就这么问着问着,便似乎有了一点哲学探索的味道,在我看来,这便是最精彩的!
       很多人都看过双截棍表演,但现如今很少有人了解鞭术了,其实你可以把鞭子看成是N趋近于无穷大时的N截棍,玩起来更难。其实我也不是很懂,就是为了解释这个泰勒展开才稍微看了一点关于鞭术的东西,具体来讲,执鞭人手执鞭子在原地只是上下左右按照一定的规则甩鞭,一条很长的鞭子就会整体展现成各种漂亮的曲线,他是怎么做到的?
       当然,从物理上讲,这当然是若干列波从执鞭处向鞭子的另一端传播,传播的过程在不同的点产生了定向的效果,然而似乎不是一个很好的足以让人满意的解释,我们的问题是,那个执鞭人的手需要怎么个动作,才能让鞭子整体上看来是那种效果?
      这个问题我是回答不了,因为我不懂鞭术,身边也没有懂的人,但是这个问题似乎和本文一开始的那个问题讲的是同一回事,即从一个点来蕴含整体的行为。

      我的观点是:既然走势可以让人预测曲线上邻接的下一点的大致位置,那么走势的走势便可以相对精确地预测邻接下一点的具体位置,紧接着,走势的走势的走势便可以告诉人们这种趋势可以延续到什么时候,再继续…这似乎超出了人们的想象力…我们还是用简单的数学来表示吧。我们先从1阶导数,2阶导数,3阶导数的几何意义说起。
      先看1阶导数,我们知道,它是经过曲线上某点的切线的斜率:

    这里写图片描述

    我们来看这个1阶导数可以预测到多远处呢?如果我们仅仅知道该点的坐标以及有这么一个该点的1阶导数的值,我们几乎什么都预测不了,除了知道在该点处有沿着切线向上的趋势之外,这没能为我们画出这个曲线带来帮助,似乎下面的曲线都能满足,然而真正正确的只有一个:

    这里写图片描述

    换句话说,1阶导数只能将邻接的下面的点定位到两个范围中的一个:

    这里写图片描述

    so,我们需要进一步的信息,我们继续求2阶导数,看看能挖掘出什么新玩意儿。
      2阶导数是1阶导数的导数,换句话说,它代表了检测点切线的变化趋势,有了这个趋势,我们是不是可以相对精确地预测邻接的点的位置了呢?我们先看2阶导数的几何意义为何。学过数学的都知道,2阶导数表示了曲线的凸凹,对于凸函数,2阶导数是负数,它表示切线的斜率会越来越小,而对于凹函数,2阶导数是正数,它表示切线的斜率越来越大:

    这里写图片描述

    因此,有了2阶导数,我们对接下来的曲线走势定位就更加精确了,我们可以进一步缩小邻接的点的取值范围:

    这里写图片描述

    具体的坐标由2阶导数的具体值来约束。
      到了这一步,进一步将曲线往前延伸似乎是无望的,因为:

    1.首先,我们不知道代表检测点凸凹性的2阶导数的值在将来会不会逆转,即我们不知道曲线会不会由凸变凹或者由凹变凸;
    2.其次,即便假设函数的凸凹性不变,我们也不知道接下来曲线是越来越凸/凹呢?还是反过来呢?

    毕竟,我们只求得了检测点的1阶和2阶导数,注意,它们都只是一个数字,而不是一个带有自变量的新的函数,所以我们通过1阶导数和2阶导数,得到仅仅是2个值,仅此而已,如果我们能得到关于曲线任意一点的2阶导数的函数表达式,那么我们当然可以预测曲线2阶函数的走势,但在本文中,我不会那么做,我就假设,我们没有这个函数表达式,只有一个检测点的2阶导数的值!怎么办?
      我们继续看3阶导数。在此之前,我必须要澄清一个我的观点。
      我在知乎上查过相关资料,另外还特意请教过一些搞数学的老师或者朋友,得到的解答可能都是从哪个地方看到的一致性解答,说3阶,4阶,5阶…导数这些没有几何意义和物理意义,数学只追求逻辑上的完整,自包容,而不是去追求什么几何意义,物理意义。我并不赞成这个说法,以霍金为例,它的虚时间模型虽然只是数学上的技巧,但是最终的目标却是为他的有限无界的宇宙几何模型服务,这说明,完成逻辑完整性证明和寻找其意义同等重要,可能后者还会更重要,我没有看到哪一个伟大的物理学发现背后仅仅是纯粹的思辨性的数学,不管是牛顿的引力场,还是爱因斯坦的引力场,还是霍金的量子引力,在逻辑严谨性支撑的前脸,都有一个漂亮得体的几何模型作为表象。

      3阶导数不难求,继续对2阶导数表达式求导,然后代入检测点的x值即可,然而3阶导数的意义是什么?其实仔细想想,并不难理解,这正如2阶导数主导1阶导数的变化从而把1阶导数自认为正确的“以直代曲”的直线模拟拉成弯曲的或者凸或者凹的曲线一样,3阶导数同样主导2阶导数的变化,它可以表示“曲线是继续凸下去或者继续凹下去,还是会在某一个x值后逆转,由凸变凹或者由凹变凸”。用语言表示比较苍白难以理解,于是我画个图示:

    这里写图片描述

    好了,有了3阶导数,我们似乎进一步将曲线向前推进了,至少是预测出了一种趋势,然而这个趋势是必然的吗?考虑到一种情况,比如当前检测点的2阶导数值为1,表示曲线在检测点是凹的,而同时3阶导数的值为-1,这表示可能接下来邻接点的2阶导数会比1小一点,最终会变成0甚至负数,这意味着曲线会由凹变凸,即经历一个拐点,但这种预测一定会发生吗?
      不一定!But why?
      虽然当前检测点的3阶导数值为-1,但这并不意味着它会一直保持-1,如果它一直保持-1,那么我们的预测正确,但是如果曲线的3阶导数在该检测点是递增的呢?这意味着会发生下面的情况:
    在曲线从检测点 x0 开始,2阶导数变为0甚至负数之前,其3阶导数就已经从-1递增到0以上了,这说明虽然曲线的凹性越来越显得不那么凹,有变平变凸的趋势,但这种趋势的趋势越来越弱,还没等曲线变成凸的,这种作用便消失了,曲线将会继续保持凹型发展下去…
      上面的判断简直可以弥补3阶导数的误差,曲线进一步前进,很帅!那么如何判断3阶导数的走势呢?简单,求4阶导数!
    进一步,以上这样发展会持续多久呢?好吧,求5阶导数吧,可以再推进一步。我们对曲线走势的掌握离开检测点随着越来越高阶导数的求解渐行渐远,6阶导数,7阶,8阶,9阶…我们对曲线走势的预测将越来越接近原先的函数。

      我来画一个实际的例子结束讨论:

    这里写图片描述


    这是不是有点像鞭术大师执鞭表演,力道和甩鞭模式从大师的手掌开始沿着鞭体传播,模式的频率越低,影响的越远。除了鞭术,还有双截棍,如果玩双截棍的时候打到了自己,那么一定是哪个导数没有求好,比如4阶导数搞错了…
      在了解了曲线的走势后,剩下的就是用二项式去拟合了。其实,这种二项式叠加的拟合方式并没有什么特殊的含义,只是因为它是可以做到的而已,你同样可以用傅立叶变换的方式将一个函数在频域上展开,因为那也是一种可能的方式。其实任何两个或者多个带有实际效应的表达式叠加在一起,整体而言都会表现出各个叠加体局部的性质,这里重要的是一个纯数学上的技巧,即如何确定二项式的系数,可以肯定的是系数跟各阶导数是相关的,剩下的问题就是待定系数法求解了,这并不是需要赘述的内容。
      综上,在这个待定系数的角度,二项式拟合任何曲线实属凑出来的,因为凑出来的二项式叠加表达式的各阶导数值恰好等于原函数的各阶导数值。
      然而这并不能让不断寻找意义的人满意,如果非要在纯数学之外去寻找这样做的意义,那么我们可以从中值定理入手去理解。说好了不谈这些诸如中值定理的,但事实上,想彻底理解一个数学概念,这些概念是避不开的,问题是,我们如何更简单地(而不是更复杂地)去理解它们。
      以拉格朗日中值定理为例,它的中值定理是这样的:

    f(x)x0,x,[x0,x],ξ[x0,x]使:f(x)=f(x0)+f(ε)(xx0)

    按照这个思路展开,既然在直观的1阶导数情形下,拉格朗日中值定理拥有的几何意义,那么在2阶导数均拟合的情况下,是不是可以有下面的描述呢:

    f(x)x0,x,[x0,x],ξ[x0,x]使:f(x)=f(x0)+f(x0)(xx0)+f(x0)2!(xx0)2+f(ε)3!(xx0)3

    这个式子可以推广到 N 阶,这是一种很常见的思路,把一个式子一般化后推广,然后小心求证其合理性,待到证明完成,便可以进一步地解释现象,这种思路承接了近代绝大部分的科学技术进步!
      我来给出上式子的一个几何解释,虽然我们想象不到2阶导数依照其几何意义如何画出来,但是我们可以把原始的函数本身升一个维度,然后用积分的思想去理解2阶导数的几何意义。
      理解我在说什么了吗?我的意思简单点说,就是积分式的1阶导数(其实是导函数)就是被积函数,被积函数的1阶导数就是积分式的2阶导数,而我们知道积分式是有几何意义的,它表示面积,而被积函数则表示曲线,再进一步积分式的2阶导数则表示曲线上某点切线的斜率…这样,相当于我们将2阶导数看成了切线斜率,将1阶导数看成了曲线本身,而原始函数看成了曲线与x轴围成的面积:

    Farea=f(x)=x0g(x)dx
    f=g(x)
    f=g=线

    这样我们就可以用拼接图形求总面积的方式来在更高的维度表达类似拉格朗日中值定理的式子了。我们看一个图示:

    这里写图片描述

    我们依照上面的图示,试着求一下 OxDA 的总面积,首先我们将其表示成各个小块的和的形式:

    SOxDA=SOx0P0A+Sx0xCP0+SP0CB+SP0BD

    然后我们依照图示中的几何关系来分别求各个小块的面积,幸运的是,以直代曲的思想在此体现的淋漓尽致,我们要求的只是简单的三角形,矩形的面积,而我们知道这些完全用加减乘除四则混合运算就足够了,是不是很符合二项式叠加的思想呢?殊途同归!首先看 SOx0P0A ,由定义,我们知道它就是 f(x0) ,接下来看 Sx0xCP0 ,它是个矩形,变长分别为 xx0 LP0x0 ,而 LP0x0 按照定义,它就是 g(x0) ,而 g(x0) 又是什么呢?很显然根据上面的微积分关系,他就是 f(x0) ,到此为止我们可以把面积求和算式写成如下的样子了:

    SOxDA=f(x)=f(x0)+f(x0)(xx0)+SP0CB+SP0BD

    还剩下两项,现在来看 SP0CB ,它是个三角形,我们知道它的底边长就是 xx0 ,而高则是 LCB ,同时我们知道切线的斜率就是 f(x0) ,那么 LCB 显然就是 f(x0)(xx0) 咯!我们把它代入到上面的式子:

    SOxDA=f(x)=f(x0)+f(x0)(xx0)+12f(x0)(xx0)+SP0BD

    最后还剩一下一项了,即 SP0BD ,它太小了,并且貌似不是很容易计算,因为它不是三角形,也不是任何用直线围成的,它的上沿是一条曲线…这可怎么办?我们注意到,当 x x0趋于接近的时候,这块小面积就趋近于 0 了,这便是可以忽略不计了,这就是极限的思想,当然这不是本文的主题咯。我在画上面的示意图的时候,特意将x x0 拉开了一定的距离,这是为了直观,在真正的微积分运算中,这段距离就是无穷小,那么图形 SP0BD 的面积也就是无穷小了,暂且记为 O(SP0BD) ,最终的式子为:

    SOxDA=f(x)=f(x0)+f(x0)(xx0)+12f(x0)(xx0)+O(SP0BD)

    这样,当切分的区间越来越细致时, O(SP0BD) 越来越趋向于 0 (这个很容易用积分中值定理从直观上看出来,事实上,O(SP0BD)的值就等于 f(ε)3!(xx0)3 ).
      好了,这就是一个在2阶情况下,中值定理大致的几何印象。循着这个思路推广下去,泰勒公式就在眼前了。
      虽然我们想象不出来 N 阶中值定理的几何意义,但是正像物理学中经常提及超维一样,我们也可以把二维的笛卡尔坐标系拓展成“无限维度空间中的超立方体”。这样的假设下,似乎还不是特别令人满意,但也就只能这样了。
      事实上,我这里可以给出一点提示,利用积分中值定理可以证明泰勒公式在意义层面的合理性,利用分部积分从我上面给出的2阶导数直观几何意义开始,可以逐渐导出完整的泰勒公式!我不会在本文正文中去表达这些内容,因为怕公式太多。当你看线条找不出线条,夹角之间的关系时,试试面积,升个维度试试。
      最后,记住一个结论,N阶导数的几何意义物理意义要比如何用泰勒多项式表达任意表达式更加重要,后者只是说明它“恰好能做到”而已,除了泰勒多项式,傅立叶展开也可以达到同样的效果,另外,还可能有别的。
      在观察二项式拟合任意函数的时候,我们知道“它恰恰可以做到”,现在的问题是如何感性的认识到这一点,即“它为什么就可以做到?”,我们以下面的两个多项式为例,来点感性认识:

    f(x)=x2
    f(x)=x3

    我们把它们画在一个图里:

    这里写图片描述

    可以看得出,2次多项式的曲线表明它是关于 y 轴对称,而3次多项式的曲线表明它是关于O对称的。这个时候,我们试试两个二项式加和的图像时什么,为了保持对比,我把原始的两个二项式留在了图里:

    这里写图片描述

    感觉2次的多项式完全被3次多项式碾压覆盖,表现不出任何它自己的特征,我们可以清晰地看到,在 x 取值小于0的时候,根本表现不出2次曲线的行为,这似乎不是一个好消息,因为直观地看,次数越高的多项式在整体的求和表达式中越占据主导地位,那些次数较低的多项式都只是配角,负责曲线水平或者垂直的移动而已…这似乎打破了“任意次多项式求和表达式”可以拟合任何曲线的神话。
      然而,我们没有考虑缩放。
      直观地看,虽然3次曲线在x变化时,其 y 值的变化剧烈程度要大于2次曲线(从其1阶导数上便能看得出,2次曲线是2x,3次曲线是 3x2 ),如果我们能适当地,恰到好处的把二者的差异通过缩放平滑掉,那么结果如何呢?考虑到我们只能用四则混合运算,非常简单,给3次多项式除以一个大于1的系数,减小它的 y 效应,或者给2次多项式乘以一个大于1的系数,从而增加它的y效应,我们来看看结果如何。先看缩小3次曲线效应的结果:

    这里写图片描述

    再看增加2次曲线效应的结果:

    这里写图片描述

    这基本上达到了我们的预期。
      到这里,我们知道,二项式的加和表达式是“可以”拟合任何曲线的,而泰勒展开式的那些系数则是一组“恰到好处”的系数,它保证了原表达式和展开表达式的各阶导数都是相等的!

      我想,我终于把该表述的都说完了,有人提到说让我用动画去表示曲线的拟合,这个确实要比用图形和文字更加震撼,然而It is beyond my ability,我并不会这些东西,我所用的gnuplot都要折腾好久,我并没有什么更好的简单的工具来帮我做更加直观的东西,所以就只能通过画草图和文字加以赘述,实为能力所限,实在抱歉。
      我们考虑一个形象的表述来结束关于这个话题的讨论,那就是牛顿定律的 公式:

    v=at
    s=f(t)=v0t+12at2

    我们知道, 的1阶导数就是速度,2阶导数就是加速度,在恒力 F0 作用下,2阶导数是一个不随时间变化的定值,那么问题是,时间 t 后的位移由谁决定,仔细想想就会明白,如果我们忽略恒力导致的加速度a,即忽略 的2阶导数,那么时间t后的位移为:

    st=vt0t

    很显然,在恒力的作用下,这与真实的位移结果差很多,距离当前时间越远,结果误差就越大,很显然,在离当前时间 t0 的适当远 t 处,位移/时间的2阶导数便派上了用场,在恒力作用下,它可以精确计算相对于当前时间的位移。
      以上的讨论仅仅是在恒力作用下牛顿第二定律导出的结论,然而如果施加的力不是恒定的,而是一个关于时间t变化的变力 F=f(t) ,那么此时仅仅2阶导数便不足以刻画时间 t 后精确的位移了,此时要想预测时间t后的位移,随着 t 距离当前时间的远去,的3阶导数,4阶导数…便派上了用场,注意,变化率的变化率使得我们能在越来越远的地方预测趋势,这个正是和上文中关于泰勒展开的讨论是一致的。

    值得一提的是,牛顿在当初导出微积分重要结论的时候,就是为了研究物理运动的,特别是天体的运动,因此关于位移/时间在微积分上的结论应该是从《自然哲学的数学原理》中可以看到的第一手结论。

    第二部分.另外一种刻画的方式

    一般而言,我们在画一个函数的图像时,基本就两点:

    1.首先求解各阶导数,判断其增减性,凸凹性,极值,拐点等,并且描出这些点;
    2.其次,拟合若干个可以判断的具体点。

    这样,大致的曲线就画出来了,可以看到,这种画法跟素描的方式非常像,简直就是素描!先画轮廓,然后进一步细化。然而我觉得这不是云天明故事中针眼画师的画法,这也不是我的画法。
      不管怎样,虽然两种不同的画法在操作细节上是截然不一致的,但是结果是,两种方案的结论是完全一致的,函数被刻画了,性质坦然地舒展了,还有什么性质没有暴露呢?嗯,也许在无穷远处的无穷小的误差可能会引发逻辑上的争论。但此事并不经常,也不绝对。
      在正文中我是通过一个单独的点来蕴含整体模式的,然而在数学上,多数的建议却是,采用了素描的方式从粗到细地去刻画。两类的效果是一致的。

    第三部分.关于导数和频率

    我们知道,1阶导数就是函数在 x 变化时,对应到y变化的效应,而2阶导数则是 x 变化时,对应到函数1阶导数的变化效应,以此类推。最后我们发现,整个N阶导数对应是一系列不同频率的变化效应,而整个原始的函数曲线正是这些不同频率的效应的叠加,用这个思路去解释傅立叶展开是非常合理的,然而我们发现它竟然也可以对应地去解释泰勒展开!
      随着求导阶数的增加,效应频率也在不断降低,最终这些不同频率的效应将反馈到函数曲线上的任意一点,而这就完整勾勒出了整条曲线。如果能掌握了这个道理,那么那些执鞭者便可以从单点甩出任意曲线了,我们都知道,频率越高,传播距离越短,频率越低,传播距离越长,当然执鞭者也知道这个道理。这一切在数学上的反映,那就是:
    求导越深,频率越低,影响越远,曲线越拟合。
    爆炸!旋转升降座椅一定会爆炸!赶紧换椅子。

    很多人在看了这些文章后,都给了一些建议,比如说加入一些动画,我起初是不擅长这些的,然而主音吉他手告诉我说gnuplot里做gif超级简单,于是我在周一下班后仔细研究了一下,确实很简单,虽然还没有完全掌握关键的语法,但是比葫芦画瓢还是可以的。
      以下是一个 y=sin(x) 的泰勒展开的gif动画,红色代表原始的 y=sin(x) ,绿色曲线的每一帧表示多了一阶的导数,也就是展开式中多了一项,可以看得出,随着求导的深入,绿色曲线将越来越拟合原始的正弦曲线,能拟合到什么程度呢?答案是“你想到什么程度,就能到什么程度”
    这里写图片描述

    附录

    A. 分部积分法推导泰勒公式

    我们从正文中提到的的中值定理的变形体入手:

    f(x)=f(x0)+f(x0)(xx0)+

    为了简单起见,我忽略掉了余项 O(SP0BD) ,注意,只是在写法上忽略了余项,事实上它是会一直存在的,这个余项会随着推导的进行,一直往后逼,越来越小。
      我们首先希望推倒多米诺骨牌的第一块试试看,升个维度,把导数写成积分的形式,我们有:

    f(x)=f(x0)+xx0f(xr)dr

    请注意, r 是计算积分使用的变量,它和计算整个叠加和所用的x是不同的。以上就是整个多米诺骨牌布景了,现在该推倒第一块了!使用分部积分法则:

    udv=uvvdu

    u=f(xr)
    v=r

    xx0f(xr)dr=(f(xr)r)xx0xx0rdf(xr)

    xx0f(xr)dr=f(x0)(xx0)+xx0f(xr)2dr2

    f(x)=f(x0)+f(x0)(xx0)+xx0f(xr)2dr2

    好了,多米诺骨牌的第一块已然推倒了…接下来就观测吧!给出点提示:注意上面式子的第三部分:

    f(xr)2dr2

    如果我们再次设 u=f(xr) v=r2 呢,继续享受上面的分部积分过程吧
      大致意思就是这样,过程就不详细写了。

    B.泰勒公式失效的场景(这个附录会很长)

    是滋补鸡汤还是慢性毒药,刚刚喝完的时候是无法获知的,然而,当你喝下去这碗汤后3天,如果它是鸡汤,你无法在这么短的时间内体会到它带给你的益处,如果它是毒药,你将死去…
      是时候把物理意义扯出来了。
      在正文中,我强调的那些可以“从一点窥见整个世界”的曲线其实有有条件的,那就是它的定义域必须是全体实数,且处处可导,若不是这样的话,情况就会复杂得多,这些复杂的情况在本附录讨论。在详细讨论前,有个声明。
      由于本文并不是在同一时间写的,中间间隔了一个工作周,在这一周中我学会并喜欢上了Geogebra,所以我放弃了gnuplot,以下的图示全部来自于Geobebra。让我们开始吧!
      首先看一个简单的反比例函数 y=1x ,我们看下它的图像:

    这里写图片描述

    且问曲线如何从A点“按照趋势”延伸到B点?A点和B点之间有一堵墙,该墙不可逾越!因为分母不能是 0 ,所以y轴理所当然就是这堵不可逾越的墙了,换句话说, y 轴左右两边是隔离的两个世界,在数学上,这个x=0的点就叫做奇点
      奇点的意义在于,在该点,曲线是没有定义的,在这种点处,求导什么的都是毫无意义的,这些点真的就是“奇异”的点,任何计算,任何公式,定律都毫无意义(下文中将会赋予奇点以意义!)。
      知道了奇点的概念后,再说一个例子。
      有一天我微信上问温州皮鞋厂老板有没有什么好玩的东西,老板说算 5 比较好玩,然后我便犯了一个低级的错误。我信口开河“把 y=x12 泰勒展开,把 5 代入不就可以了吗”,为了在计算中不引入根号,瞬间想到了在x=1处展开…计算是简便了,然而结果对吗?
      我们先来看一段动画,即在 x=1 处展开 y=x12 的最多 n=50 阶逼近的过程(Geogebra做这个非常帅!简单直接易上手!):

    这里写图片描述

    n=1 n=50 ,把 x=5 代入均得不到正确的结果。可见,结论并不是我们之前预期的那样,在“ x=1 这一个点窥见整条曲线”,显然“能窥见”的曲线范围仅仅局限在大致 (0,2) 这个区间里。到底发生了什么?在进一步阐释物理意义之前,我还有点建议,如果你没有接触过复分析,收敛圆,收敛半径,审敛法这些,那么正好,如果你接触过这些但只是懂概念,能推导,那么建议暂时忘掉,如果你精通这些,那么不建议继续阅读下去。
    ………….
    霍金的宇宙模型中,奇点是所有经典物理定律完全失效的地方,它既是,它同时又是所有!霍金认为,量子理论可以解释奇点里发生的事,毕竟物理学不是哲学,人们显然不能接受纯粹的无或者无穷。奇点蕴含了整个宇宙本身,在创世之初的那一瞬间,奇点就是整个宇宙,它是时间,它是空间,它是上帝本体!
      宇宙的膨胀意味着时间的膨胀和空间的膨胀,既然是膨胀,肯定需要多余的物质和能量,当我们吹气球的时候,气球之所以会膨胀,那是因为有气体不断地注入气球内部,同时气球球壁还有足够的厚度可以展开,总之,整个过程是需要物质(球壁)和能量(吹气)的!宇宙外面是什么并不是我们讨论的范围,霍金认为宇宙就是宇宙,是一个自洽的整体,那么显然没有在宇宙外面吹气的那个人,宇宙也不会有球壁…促使宇宙膨胀的物质和能量来自哪里?
      来自奇点!
      来自奇点!
      来自奇点!
      奇点早就蕴含了一切!
      用霍金宇宙的奇点思想理解数学上的奇点概念,是朴素的。一条连续且光滑的曲线,它由它的奇点蕴含并生成,以 y=1x 为例,它由两条连续且光滑的曲线构成, x=0 是该函数的一个奇点,也是唯一的奇点,那么 x=0 处便蕴含并可生成整个两条曲线了。
      你可以把奇点想象成一个无线维度浓缩在一起的一个点,就像面团一样,可以展开到任何维度,可以擀成饺子皮,可以拉成拉面,可以团成馒头…现在我们用奇点的概念来描述一下函数 y=x12 的曲线的生成过程:

    这里写图片描述

    如果不加干预,整个曲线会一直展开下去,直到遇到定义域的边界,那么在泰勒公式的干预下,事情有所不同,当我们说将原函数在 x=a 处泰勒展开的时候,实际上我们是接管了整个展开过程, x>a 的后面的曲线将不再从奇点拉出,而是由泰勒公式预测出来并展开,此时奇点的物质和能量将停止向外释放,原始函数的曲线生成将停止,此后,泰勒展开的过程将用另外一条曲线去替代原始函数的曲线。需要注意的是,当我们将函数 f(x) x=a 处泰勒展开的时候,并非只针对 x>a 的点有效,而是所有定义域的点都有效,毕竟泰勒展开式和原始函数是完全不同的两个函数!
      由上面的过程性描述可知,如果将 f(x) x=a 处泰勒展开了,那么泰勒公式仅仅能看到的是曲线从其奇点开始到 x=a 结束这个区间的部分,其余的部分它是看不到的。这意味着什么?
      这意味着,泰勒公式仅仅可以利用曲线来自奇点的从奇点到这个展开点之间的小区间的“物质”和“能量”,这些能量有多少决定了泰勒公式能量曲线往后(离开奇点的方向上)延展多远,如果说从奇点到泰勒展开点,能量已经释放了 E ,那么泰勒公式就只能利用大小等于E的能量去展开原函数:

    这里写图片描述

    事实上也确实这样,抛开这些烧脑的东西,在我们日常生活中也经常会碰到类似的情况。
      当一个人讲话的时候,一些喜欢接话头的人就会插嘴说,我知道你想说什么,我来说吧。然而这种出风头的策略并非总是奏效。如果原来讲话的人刚开始说话,那么插话的人往往也预测不了太多的内容,然而如果最开始讲话的人说了很久,那么一些暗中观察的插话者往往能预测很多的内容并接着说下去。回到我们的泰勒展开,也就是说,展开点离开奇点越远,那么泰勒公式拟合的就越远,这背后的思想就是能量守恒,奇点已经将能量积累到了展开点,那么泰勒公式也就仅仅能用这么多能量(事实上所谓的能量就是各阶导数信息)来展开,这么多能量能跑多远呢?积累过程跑了多远,那就还能跑那么远!想想单摆运动吧,就这个道理。
      那么 y=sin(x) y=ex 这些函数的奇点在哪里?这些函数的奇点在无穷远处。这意味着,在任意一个展开点,函数曲线本身都已经积累的无穷的能量(即信息),这说明泰勒公式可以将其完全展开到无穷。
      离奇点越近,各种趋势越不易表现出来,奇点附近刚开始积累趋势,趋势尚未表现,这就是能量和运动的观点,我就是这样避开了那些收敛圆,收敛半径这些概念的。

    C.到底什么是数学

    如果你觉得数学纯思辨性的类似哲学的东西,那么你可以忽略我下面的所述,如果不是,请看完它,哪怕是心里压着邪火,保持着愤怒。
      只有在古希腊数学才是纯思辨哲学的分支,从罗马帝国的地中海世界开始,一直到今天,数学都只是工具,解题工具。当然这里说的解题并非我们考试中的解题,而是实实在在的处理数据时必须要解决的难题。
      不要把炼丹术和占星术看作是迷信这种不可救药的东西,它们和数学的关系源远流长。首先指出,现代数学和古希腊数学完全不是一个概念,甚至几乎没有什么关联,所以在理解现代数学本质的概念的时候,千万不要去想什么毕达哥拉斯学派什么的。炼丹术和占星术是现代化学和天文学的先祖,当它们无法用咒语欺骗国王的时候,它们就必须拿出证据来保住自己的饭碗,这无形中将它们推向了现代科学的“深渊”。千万不要将哥白尼,伽利略,牛顿…他们看成是拥有现代科学品质的明事理的人,在他们的年代,他们无一例外都披着神学的外衣,只是他们在处理一些棘手问题的时候,偶然间发现了一些所谓的真相,要让这些真相在逻辑上变得合理,他们必须处理大量的数据从而期望导出一些隐藏在这些数据背后的关系。在处理数据的时候,他们无一例外地被数据和关系的复杂性困扰,于是乎他们搞出一些处理技巧,这些技巧就是现代数学的前身,因此可以说炼丹术和占星术引导了现代物理,现代物理激发了现代数学,这其中一脉相承的就是神学和哲学的不断渗透和对抗。
      明白了这些之后,你会发现现在中学大学里的数学课程的教法是多么没有意义。这些课程看似很深邃,然而都是毫无意义的。我记得我上大学的时候(当时还是本科,后来才“进修到大专”),老师给我们讲梯度散度旋度,最后的输出就是背诵了一大堆的定理和公式,我问老师这些有什么用,老师说这些期末考试是必考点,以后考研也会考…后来我退学后跑到了女朋友(小小的妈妈)学校外面的村子里租了个房子,刚过去时,正逢她们班要期末考试了,也要考高等数学,什么洛必达法则,牛顿/莱布尼兹公式…爆炸,她们是日语教育专业啊!考这玩意儿毛用啊!
      然而抱怨是苍白的,我依然要拖着疲惫的身躯去给她们讲高等数学,对了,还包括她的同班男生,反正就是我女朋友全班…讲着讲着我就上瘾了(其实也没讲多久),当有人问我学这些有什么用的时候,我总是微笑着回答,这些都是必考点,以后你们考研也会考,说这话时我特别自豪,微笑里带着些许嘲讽和洒脱,因为我TMD再也不用考试和考研了!我不知道当时这样回答我的老师是不是也是这么想的。
    ….
    在以后的学习生涯中,我彻底摒弃了学校里的那一套,因为我再也不用考试了,而且也不会再参加任何形式的考试。所以我变得天马行空,我从马鞍面导出了Linux Netfilter的设计模型,最终确认作者也是这么想的,然后我想仅仅是精通iptables的配置或者看完conntrack的代码是多么Low啊,于是便更进一步探索了Cisco和Netfilter在设计上的差异,最终实现了基于Netfilter的Cisco模型…在我学习最小二乘法的时候,我试图理解平方的深意,后来我看了牛顿的《原理》之后,发现了平方律和立方律简直就是构成我们世界的基本元素啊!
      王姐姐说牛顿是外星人,我表示赞同。然而牛顿是怎么思考的?!
      1905年,爱因斯坦的奇迹年,主角是一位不修边幅,收入不高的专利局小职员,有点像《三体》小说作者刘慈欣,在火电站工作,不好好上班天天上班时间写小说…然而就是这个爱因斯坦道出了现代数学的本质,它只是工具!爱因斯坦从来没有系统学习过现代数学,他只是在用到的时候去请教身边的数学专家,他真的就是把数学当扳手使的。我不晓得其它的人怎么想,我只知道,狄拉克的算符,费曼的积分,霍金的虚时间轴,这些都是数学上的技巧,你要是问有什么物理意义,我觉得他们本人都说不出,只是这么处理很方便,仅此而已吧。
      那么,既然现代数学只是个工具,岂不是很Low?!No!每一个数学上的突破,均代表了一系列的总结,最终会引领新的突破,这方面,数学已经替代了哲学。在我工作的计算机领域,任何一个想法,如果你不能用数学表示出来,那便是不可处理的,请问不可处理的东西能完成KPI吗?于是便有了数学建模。然而模型的建立谈何容易。
    【外出买菜,未完待续】
    (TODO)

    展开全文
  • 2019年,德国,纽伦堡前段时间,朋友圈被《我是技术总监,你干嘛总问我技术细节》刷屏了,微信群里也有不少讨论。就我所看到的情况,各种意见都有。有人认为“技术人不能丢掉技术...

    640?wx_fmt=jpeg

    2019年,德国,纽伦堡

    前段时间,朋友圈被《我是技术总监,你干嘛总问我技术细节》刷屏了,微信群里也有不少讨论。就我所看到的情况,各种意见都有。有人认为“技术人不能丢掉技术”,也有人认为“工作做到上面都是考验人性”,还有人认为“工种不同,技术细节不清楚很正常”。借这个机会,我想谈谈自己的经历。

    十多年前,我曾经去BAT中的一家面试过(到现在也是我唯一一次BAT的面试经验)。当时刚毕业几年,写代码解决一般问题任务已经“得心应手”了,各方面知识也懂一点,会搭MySQL的Master-Slave,会用Memcache,HTTP协议也基本熟悉……

    在那个许多公司还在为100万PV就头疼的年代,这样的水准在技术上算比较领先了。所以我以为,这次面试应当是十拿九稳。

    结果大大出乎我的意料,可以说是“惨败”。

    我熟悉的领域一个也没有谈起,我解决的问题一个也没有问到,却问了一大堆“技术细节”问题。比如一个int变量要占几个字节,字符串的查找-替换怎样最快…… 在学校里,我最熟悉的Java,C和C++的课程只是囫囵吞枣,这类知识早就忘记了,做题比较多的也是离散数学、数值计算等等,工作了之后一直做Java,根本不会深入到这样的细节。所以,面试结果用“惨败”来形容,是一点不夸张的。

    当时我觉得很委屈,对已经工作的人,为什么要考这些细节的书本知识?而且是日常开发根本用不到的书本知识?难道不应当重视实际经验吗?

    等再工作几年我逐渐发现,这些原本不是“细节的书本知识”。如果你要解决的问题稍微有点挑战性,没有现成工具可以利用,只能靠自己思考和分析,或者借鉴其它现成工具的原理,就离不开这些看不起的“细节知识”。

    比如,后来(一直到如今也是)我经常说:“好的程序员不会凡事都靠实地测试,而是会预先计算”,就必须用到这些细节的知识。拿如今最热门的“高并发”应用来说,单个节点每秒处理多少个请求,每个请求包含哪些数据,每部分数据的大小是多少,机器的带宽是多少,网卡的吞吐率可以达到多少……能把所有这些数据综合起来,心里就大概有了把握,而且这种理性结算的结果,远远比“写个程序去压测”要靠谱得多。

    所幸我在这次面试失败之后几年就领悟到这个问题,于是又花时间(那时候996还很少见)把数据结构、算法、网络、系统结构等等基础知识全部梳理了一遍。如今回想起来,当时的这轮梳理确实值得,自己后来受益匪浅。

    行业内有句话说:搞技术的不玩虚的,就服实打实的解决问题的本事。我认为这句话是成立的。在我走上技术负责人的岗位后,也解决过不少技术上的疑难杂症,尤其是我“本职”领域之外的问题。比如困扰大家很久的接口概率性失败的现象,最后诊断出是证书问题;又比如HTTP能通SSH不能通的问题,最后发现是TCP的TIME_STAMP配置问题;再比如面对不稳定的遗留系统,迅速拿出方案隔离不稳定部分,为技术改造赢得时间…… 

    能解决这些麻烦的问题,自然能赢得各团队伙伴的信任,不过我并非这些领域的专家,只是多亏了之前对基础知识和技术细节的掌握,再加上学习和分析而已。

    在很长的时间里,我一度非常相信“技术负责人就是要懂细节”,否则内心也很慌张。对细节的把握,让我感到踏实、放心。同时,我也热衷于在面试中考察候选人对细节的了解,如果不了解细节,这个人就很浮躁。换句话说,优秀的技术人员应当像把篦子,一路梳理过去,各种细节了如指掌,所有的问题原形毕露,这样工作才称职,自己才放心。

    然而,随着面临问题的复杂,职位的升高,我发现自己日益焦虑,因为这是“不可能的任务”——技术细节太多了,想要对每个细节都了如指掌只会让人疲惫不堪;技术人员也太多了,想要在每个人那里都保持权威也会让人高度紧张。

    到最后我发现,这已经不是一个用不用功、专不专心的问题,因为精力有限,要照顾的方面又太多,所以无论你多么用功,多么专心,都会感到力有不逮、左支右绌的局面。看来,篦子这种模型有点问题——篦子当然好,但通常都不长,一手能够拿住,如果要覆盖很宽的面,就非常吃力。

    那么,该怎么办呢?如果自己找不到出路,我尝试去观察其他人是怎么做的。观察一段时间之后,我还真有很大收获。

    最大的收获是,我发现没有人可以了解所有的细节。如果光看媒体,似乎很多“大佬”无所不知、无所不晓,但仔细分析就发现,“大佬”往往只有在自己熟悉或者有充分准备的领域可以谈得很深,遇到自己不熟悉的领域,他们要么不发声,要么说错了但会有公关团队去掩盖。

    不可否认,一些企业里的高级管理人员或者创业者仍然保持了早期的工作作风,或者大概是为了保持“权威的存在感”,喜欢抓细节,喜欢就细节问题发表自己的看法。在面试中,也有一些面试官喜欢过分追究细节,不断拿特别细特别专门的问题来考验候选人,营造自己的优势。

    但仔细观察往往发现,这些人看起来无所不知,但如果是在他们不熟悉的领域,这样做多半没有好处。“抓细节”往往导致本末倒置,“随时就细节问题发表看法”往往容易适得其反,“用细节问题让候选人难堪”可能错过有潜力的候选人,这一切,都抬高了企业的运营成本。

    我经常说,IT行业可以从其它领域借鉴经验,对技术细节的把握也是如此。以我对其它领域的了解,许多成功的技术领导者,其实并不关心细节,至少不会在细节上花太多的精力。

    比如上世纪“太空竞赛”中,美国载人航天工程推进部分的总工程师冯·布劳恩,他最关心的是火箭分几级最合适,登月计划到底采用哪个方案更好,是地球轨道交会还是月球轨道交会。至于火箭制造的各种细节,其实他没有精力去操心,也轮不到他操心(参考《系统问题应当如何排查?看看NASA著名的“10厘米发射”吧》)。

    再比如我军的高级将领里,真正会打枪、枪打得好的没有几个,但这并不妨碍他们叱咤风云、攻城掠地。更典型的例子如1955年授衔上将的张爱萍将军,在后来主抓“两弹一星”工程,指挥我国第一颗洲际导弹发射时,丝毫没有技术背景的他却赢得了大批专业技术人才的信任和怀念。

    这其实是普遍现象。上世纪中情局的若干高科技工程中,主管Parangosky并不是理工科出身,但这不妨碍他受到大家的一致尊重,被公认为“奇迹创造者”(参考《K-129,CIA“偷天换日”的工程奇迹【二】》)。

    所有这些例子充分说明,不管是否技术出身的技术领导者,都不必过分强调“技术”,不必强求事无巨细全部掌握。相反,强求“面面俱到”反而显得荒谬。

    我曾经写文章介绍过我国著名的理论物理学家束星北教授(参考《看,这就是束星北先生》)。在十年动乱中遭受迫害。有一次,他被要求爬上电线杆去接电线,这种任务实在为难一把年纪的束星北,结果管制他的人反而说起了风凉话:还什么搞物理的大学教授呢,连个电线都不会接……

    看看正反两方面的例子,我感到有点惭愧,因为我自己许多做法就是反面典型。比如希望掌握所有细节,不但消耗了自己的精力,也没有给其他人放手工作的信任感;再比如拿细节去要求候选人和其它同事,有时候甚至到了“刁难”的程度,其实并不利于客观判断他们的水平和贡献。

    所以在观察、比较、思索了很久之后,我的结论是:技术领导者的精力是有限的,他们的能力模型既不应当是“博而不精”的宽泛,也不应当是“深而不广”的专注,甚至业界流行的“T型人才”也不准确。对技术领导者来说,最合适的能力模型应当是钉耙型。

    640?wx_fmt=jpeg

    说到“钉耙”,许多人第一个想到的大概是猪八戒的九齿钉耙,我们就拿九齿钉耙为例。钉耙很宽,扫出去可以覆盖一个面;同时钉耙又有许多齿,可以在某些具体的点上深入。不过无论如何,太上老君只有那么多神镔铁可以用来打造九齿钉耙,在资源有限的情况下就得具体分析,考虑钉耙到底有多宽,有几个齿,每个齿应该有多深。

    技术领导者可以动用的全部精力,就是打造钉耙可以用到的全部原料。每一名技术领导者都要思考,这些精力该如何分配,是照顾更宽广的面,还是照顾更深入的点——照顾哪些点、照顾到多深…… 身为技术领导者,重要的不是你永远在每个点上都扎到很深,而是应当具备“无论哪个点上出现问题,需要你的时候都能深入扎进去”的能力。

    换句话说,重要的是能及时识别和发现问题,及时了解问题,及时给出靠谱的解决方案。哪怕当时答不上来,但是能通过询问、学习、分析能迅速定位和解决问题,就是合格的技术领导者。

    而且与一次成型的钉耙不同,技术领导者必须时常“吊着一股劲”,那就是根据具体情况识别出最重要的问题,据此调整自己的精力分配和能力组成:如果运维弱一点,就要在运维这个点上扎深一点;如果前端弱一点,就得在前端这个点上扎深一点;如果暂时各团队状况都还不错,那就把覆盖面铺更广一点,多为未来做规划…… 

    总这个角度,也就可以理解为什么许多人说领导的关键就在于“找到合适的人,放到合适的位置上”,只有这样,领导者的钉耙才可以铺得很宽,不必在具体的细节上耗费太多。但是,如何找到合适的人,如何放到合适的位置,这恰恰是需要有足够的细节知识才能作出可靠判断的。

    总之一句话,各公司的情况不同,同样公司在不同阶段的情况也不同,合格的技术领导者一定需要具备“柔性”素质,能融入百般场景,解决万千问题。

    这也解释了为什么许多非技术出身的领导者,也可以做好技术团队的管理。原因大多是他们眼光精准、视野开阔、思维严密,并且对未来有充分的预见,时常能识别出当前最重要、最要紧的问题,投入资源去解决,确保一切处在有序、可控的状态。当然,还少不了对技术人员的尊重,对技术规律的敬畏。

    在此之外,技术出身的技术领导者还有额外的优势。他们对基础知识的掌握,对细节的了解,让他们即便面对陌生领域,也能够迅速搭起“从已知到未知”的桥梁,迅速得到“内行人”的视角,迅速和大家找到共同语言。非技术出身的领导者在这方面就要吃力许多,所以也只有少数极高明的人能做得好。

    认同这一点,许多问题也豁然开朗了。

    身为技术领导者,最重要的是保持对技术的敬畏,以及不排斥谈细节的意愿,所以虚浮的作风是万万要不得的。但同时,也不必苛求自己时刻了解所有细节。

    在工作中,我们可以经常询问自己:当前我是不是在解决最要紧的问题?这个问题的背景我是否充分认识了?对于解决方案我是否有足够的了解和把握?我目前没有具体关心的那些问题,是不是有靠谱的团队在用靠谱的方式解决?

    如果这些问题的回答都是肯定的,那么即便有一些技术细节不了解也是相当正常的,大可放心继续工作。如果有一个问题的回答不是肯定的,那么工作就还没有做到位,这时候即便你掌握了各种技术细节,大概也不算称职。

    对自己是如此,对其他人也是如此。至少在我看来,在招聘技术负责人时,没有必要过分纠结技术细节,而应当侧重考察对方的技术素养,所以重要的不是对细节了解多少,而是工作习惯有多细致。

    具体来说,技术细节的问题,大概可以分为三类:

    第一类,是候选人自称做过,也着重投入过精力的领域。合格的候选人,对这些细节细节是应当完整掌握的,并且其掌握应当能互相支撑印证,构成完整的技术决策网,不能有“想当然”的环节。如果这个领域的细节答不出来,或者经不住追问,那多半是很有问题的。

    比如候选人说自己做过服务治理,那么能谈的不应当只是和流行的PPT一样,大而化之地列举服务治理的好处,几个主要组成部分,还应当清楚服务注册流程、服务生命周期定义、异常(尤其是安全)情况处理、扩缩容规范和限制等细节信息。如果谈不出来,“做过服务治理”的经历就应当打个折扣。

    第二类,是候选人没有专门做过,但是不管解决哪个领域的问题都需要具备的基础细节。比如“一个int类型变量占几个字节”的问题就是如此,系统要做复杂一点,在分析和设计的时候,这些知识是不能空缺的。

    候选人还应当了解其它的基础细节,比如光在真空中的传输速度是30万公里/秒,而在光纤中的传输速度是20万公里/秒。这样分析技术问题时才有根据,比如北京到上海的直线距离大概是1200公里,所以单程理论传输时间大约要10ms,则ping值在25-30ms左右是正常的,没有更多优化空间优化。但南京到上海的距离只有不到300公里,如果ping值也在30ms,则网络上估计还有些问题。这样的细节知识,就是前端、后端、运维都可以用上的(此处数据经过老高(高春辉)确认)。

    第三类,是候选人没有专门做过,但也不那么基础的细节。这类细节如果答不上来,其实并不是很要紧。很难想象做社交的技术人员能懂得音视频处理的细节,做金融的技术人员能懂得游戏开发的细节。

    只要职位上升到一定的高度,都不可能在技术细节上面面俱到。就像上文说的,只要候选人有足够的技术素质,在宽度上能覆盖这些领域,能找到靠谱的人、评估出靠谱的方案,或者在深度上能保持(经过一段时间的学习了解)介入能力,这些问题是多半都是可以解决的。

    所以我的最终答案就是,“能力上不求全责备,意愿上不推三阻四”。如果面试遇到细节问题,最真诚的答案大概是这样:“我是技术总监,我可以把几个重要领域的细节全部谈清楚,但其它领域的细节我未必知道。不过我通常能判断一个不那么熟悉领域的方案是否靠谱,如果再多给我一点时间,我相信自己能答上来”。 

    展开全文
  • 摘要:在全球首届社区峰会IstioCon 2021中,华为云应用服务网格首席架构师张超盟发表了《Best practice:from Spring Cloud to Istio》主题演讲,分享了Istio在生产中使用的实际案例。 点击链接观看演讲:...
    摘要:在全球首届社区峰会IstioCon 2021中,华为云应用服务网格首席架构师张超盟发表了《Best practice:from Spring Cloud to Istio》主题演讲,分享了Istio在生产中使用的实际案例。

    点击链接观看演讲:https://events.istio.io/istiocon-2021/sessions/best-practice%EF%BC%9Afrom-spring-cloud-to-istio/

    以下为演讲全文

    大家好,我是来自华为云的工程师。很荣幸有机会和大家分享Istio在生产中使用的实际案例。

    华为云应用服务网格从2018年在公有云上线,作为全球最早的几个网格服务之一,经历和见证了从早期对网格的了解、尝试到当前大规模使用的过程。服务的客户越来越多,场景也越来越复杂。这其中的通用功能作为feature大都贡献到Istio社区,解决方案层面的实践也希望通过这样的机会和大家交流。

    本次我选取的主题是Spring Cloud to Istio。来自我们客户的Spring cloud的项目和Istio的结合与迁移案例。

    演讲主要包含四部分的内容:

    1)背景介绍

    2)使用Spring cloud微服务框架遇到的问题

    3)解决方案

    4)通过示例来描述方案的实践细节

    背景介绍

    还是以微服务为切入点,微服务的诸多优势非常明显,但相应给整个系统带来的复杂度也非常显著。单体的系统变成了分布式后,网络问题,服务如何找到并访问到对端的服务发现问题,网络访问的容错保护问题等。连当年最简单的通过日志中的调用栈就能实现的问题定位,微服务化后必须要通过分布式调用链才能支持。怎样解决微服务带来的这些挑战?

    微服务SDK曾经是一个常用的解决方案。将微服务化后通用的能力封装在一个开发框架中,开发者使用这个框架开发写自己的业务代码,生成的微服务自然就内置了这些能力。在很长的一段时间内,这种形态是微服务治理的标配,以至于初学者以为只有这些SDK才是微服务。

    服务网格则通过另一种形态提供治理能力。不同于SDK方式,服务治理的能力在一个独立的代理进程中提供,完全和开发解耦。虽然从图上看两者差异非常小,后面我们将会从架构和实际案例来分析两者在设计理念上的差异,来体会前者是一个开发框架,而后者是一个基础设施。

    SDK形态中Spring cloud是最有影响力的代表项目。Spring cloud提供了构建分布式应用的开发工具集,如列表所示。其中被大部分开发者熟知的是微服务相关项目,如:服务注册发现eureka、配置管理 config、负载均衡ribbon、熔断容错Hystrix、调用链埋点sleuth、网关zuul或Spring cloud gateway等项目。在本次分享中提到的Spring cloud也特指Spring cloud的微服务开发套件。

    而网格形态中,最有影响力的项目当属Istio。Istio的这张架构图在这次演讲中会高频出现。作为本次分享的背景,我们只要知道架构上由控制面和数据面组成,控制面管理网格里面的服务和对服务配置的各种规则。数据面上每个服务间的出流量和入流量都会被和服务同POD的数据面代理拦截和执行流量管理的动作。

    除了架构外,作为背景的另外一个部分,我们挑两个基础功能稍微打开看下两者的设计和实现上的相同和不同。首先是服务发现和负载均衡。

    左边是Spring cloud,所有的微服务都会先注册中心,一般是Eureka进行服务注册,然后在服务访问时,consumer去注册中心进行服务发现得到待访问的目标服务的实例列表,使用客户端负载均衡ribbon选择一个服务实例发起访问。

    右边Istio不需要服务注册的过程,只需要从运行平台k8s中获取服务和实例的关系,在服务访问时,数据面代理Envoy拦截到流量,选择一个目标实例发送请求。可以看到都是基于服务发现数据进行客户端负载均衡,差别是服务发现数据来源不同,负载均衡的执行体不同。

    下面比较下熔断:

    左边为经典的Hystrix的状态迁移图。一段时间内实例连续的错误次数超过阈值则进入熔断开启状态,不接受请求;隔离一段时间后,会从熔断状态迁移到半熔断状态,如果正常则进入熔断关闭状态,可以接收请求;如果不正常则还是进入熔断开启状态。

    Istio中虽然没有显示的提供这样一个状态图,但是大家熟悉Istio规则和行为应该会发现,Istio中OutlierDection的阈值规则也都是这样设计的。两者的不同是Spring cloud的熔断是在SDK中Hystrix执行,Istio中是数据面proxy执行。Hystrix因为在业务代码中,允许用户通过编程做一些控制。

    以上分析可以看到服务发现、负载均衡和熔断,能力和机制都是类似的。如果忽略图上的某些细节,粗的看框图模型都是完全一样的,对比表格中也一般只有一项就是执行位置不同,这一点不同在实际应用中带来非常大的差异。

    使用Spring cloud微服务框架遇到的问题

    本次演讲的重点是实践。以下是我们客户找到我们TOP的几个的问题,剖析下用户使用传统微服务框架碰到了哪些问题,这些大部分也是他们选择网格的最大动力。

    1)多语言问题

    在企业应用开发下,一个业务使用统一的开发框架是非常合理常见的,很多开发团队为了提升效率,经常还会维护有自己公司或者团队的通用开发框架。当然因为大部分业务系统都是基于Java开发,所以Spring cloud开发框架,或者衍生于Spring cloud的各种开发框架使用的尤其广泛。

    但是在云原生场景下,业务一般更加复杂多样,特别是涉及到很多即存的老系统。我们不能要求为了微服务化将在用的一组成熟服务用Spring cloud重写下。用户非常希望有一种方式不重写原来的系统也能对其进行应用层服务访问管理。

    2)将Spring cloud的微服务运行在K8s上会有很大的概率出现服务发现不及时

    前面介绍过Spring cloud服务发现是基于各个微服务先向注册中心进行服务注册的数据来实现的,在传统Spring cloud场景下,当微服务部署在VM上,服务动态变化要求没有那么高,顶多个别实例运行不正常,通过服务发现的健康检查就足够了。但是在k8s场景下,服务实例动态迁移是非常正常场景。如图示,producer的某个Pod已经从一个节点迁移到另外一个节点了,这时需要新的pod2的producer实例向eureka注册,老实例Pod1要去注册。

    如果该情况频繁发生,会出现注册中心数据维护不及时,导致服务发现和负载均衡到旧的实例pod1上,从而引起访问失败的情况。

    3)升级所有应用以应对服务管理需求变化

    第三个问题是一个比较典型的问题。客户有一个公共团队专门维护了一套基于Spring cloud的自有开发框架,在每次升级开发框架时,不得不求着业务团队来升级自己的服务。经常会SDK自身修改测试工作量不大,但却要制定很长周期的升级计划,来对上千个基于这个SDK开发的服务分组重新编译,打包,升级,而且经常要陪着业务团队在夜间变更。业务团队因为自身没有什么改动,考虑到这个升级带来的工作量和线上风险,一般也没有什么动力。

    4)从单体式架构向微服务架构迁移

    这是一个比较普遍的问题,就是渐进的微服务化。马丁福勒在著名的文章单体到微服务的拆分中(https://martinfowler.com/articles/break-monolith-into-microservices.html )也提到了对渐进微服务化的倡议,如何能从业务上将一个大的业务分割,解耦,然后逐步微服务化。马丁福勒强调 “解耦的是业务能力不是代码” ,大神将代码的解耦留给了开发者。

    但是站在开发者的角度讲渐进的微服务不是一个容易的事情。以基于Spring cloud框架进行微服务开发为例,为了所有的微服务间进行统一的服务发现、负载均衡,消费和执行同样的治理策略,必须要求所有的微服务基于同样的,甚至是统一版本的SDK来开发。

    当然我们客户在这种情况下也有基于API层面做适配,将原有的未微服务化的和已微服务化的并存,使用这种类似于灰度方式,实际操作非常麻烦。

    曾经有客户问过有没有不用费劲搞两套,是否可以直接有些大的单体微服务化,另外一些单体很长时间内完全不动,直到有时间或者认为安全想动它的时候去动。

    解决方案

    对于客户实际碰到的4个典型的微服务框架的问题,我们推荐的解决方案都是服务网格。下面我们分别看下Istio如何解决上面的几个问题。

    首先,多语言问题。基于服务网格,业务和治理的数据面无需运行在同一个进程里,也无需一起编译,因此也没有语言和框架上的绑定。无论什么语言开发的服务,只要有一个对外可以被访问和管理的一定应用协议上的端口,都可以被网格进行管理。通过统一的网格控制面,下发统一的治理规则给统一的网格数据面执行,进行统一的治理动作,包括前面介绍到的灰度、流量、安全、可观察性等等。

    关于Spring cloud服务在Kubernetes运行时,关于原有的服务注册和发现不及时的问题。根本原因是两套服务发现导致的不一致问题,那么解决办法也比较简单,统一服务发现即可。既然K8s已经在Pod调度的同时维护有服务和实例间的数据,那么就没有必要再单独搞一套名字服务的机制,还要费劲的进行服务注册,然后再发现。

    比较之前Spring cloud注册发现那张图,注册中心没了,服务基于注册中心的服务注册和服务发现的动作也不需要了,Istio直接使用k8s的服务发现数据,但从架构上看也简洁很多。

    我们也总结过,大部分碰到这个问题的场景,都是将微服务框架从VM迁移到k8s时候碰到的,有点把容器当作之前的VM使用,只使用了k8s作为容器部署运行的平台,并没有用到k8s的service。

    对于SDK自身升级导致业务全部重新升级的问题,解决办法就是把服务治理的公共能力和业务解耦。在网格中,将治理能力下沉到基础设施后,业务的开发、部署、升级都和服务治理的基础设施解耦了。业务开发者专注自己的业务部分。只要没有修改业务代码,就无需重新编译和上线变更。

    当治理能力升级只需基础设施升级即可,基础设施的升级对用户业务完全没有影响。像华为云ASM这样大部分网格服务的服务提供商都能做到一键升级,用户完全感知不到这个过程。

    关于渐进微服务化的问题,使用Isito服务网格可以非常完美的解决。Istio治理的是服务间的访问,只要一个服务被其他服务访问,就可以通过Istio来进行管理,不管是微服务还是单体。Istio接管了服务的流量后,单体和微服务都可以接收统一的规则进行统一的管理。

    如图中,在微服务化的过程中,可以对某个单体应用svc1根据业务拆分优先进行微服务化,拆分成三个微服务svc11、svc12和svc13,svc1服务依赖的另外一个单体应用svc2不用做任何变更,在网格中运行起来就可以和另外三个微服务一样的被管理。同样在运行一段时间后,svc2服务可以根据自身的业务需要再进行微服务化。从而尽量避免一次大的重构带来的工作量和业务迁移的风险,真正做到马丁富勒倡导的渐进微服务化的实践。

    实践

    以上是对实际工作中客户的几个典型问题的解决方案。在实践中,怎么把这些解决方案落地呢?下面基于实际客户案例总结,分享具体的实践。

    我们的主要是思路是解耦和卸载。卸载原有SDK中非开发的功能,SDK只提供代码框架、应用协议等开发功能。涉及到微服务治理的内容都卸载到基础设施去做。

    从图上可以看到开发人员接触到开发框架变薄了,开发人员的学习、使用和维护成本也相应的降低了。而基础设施变得厚重了,除了完成之前需要做的服务运行的基础能力外,还包括非侵入的服务治理能力。即将越来越多的之前认为是业务的能力提炼成通用能力,交给基础设施去做,交给云厂商去做,客户摆脱这些繁琐的非业务的事务,更多的时间和精力投入到业务的创新和开发上。在这种分工下,SDK才真的回归到开发框架的根本职能。

    要使用网格的能力,前提是微服务出来的流量能走到网格的数据面来。主要的迁移工作在微服务的服务调用方。我们推荐3个步骤:

    第一步:废弃原有的微服务注册中心,使用K8S的Service。

    第二步:短路SDK中服务发现和负载均衡等逻辑,直接使用k8s的服务名和端口访问目标服务;

    第三步:结合自身项目需要,逐步使用网格中的治理能力替换原有SDK中提供的对应功能,当然这步是可选的,如调用链埋点等原有功能使用满足要求,也可以作为应用自身功能保留。

    为了达成以上迁移,我们有两种方式,供不同的用户场景采用。

    一种是只修改配置的方式:Spring cloud本身除了支持基于Eureka的服务端的服务发现外,还可以给Ribbon配置静态服务实例地址。利用这种机制给对应微服务的后端实例地址中配置服务的Kubernetes服务名和端口。

    当Spring cloud框架中还是访问原有的服务端微服务名时,会将请求转发到k8s的服务和端口上。这样访问会被网格数据面拦截,从而走到网格数据面上来。服务发现负载均衡和各种流量规则都可以应用网格的能力。

    这种方式其实是用最小的修改将SDK的访问链路和网格数据面的访问链路串接起来。在平台中使用时,可以借助流水线工具辅助,减少直接修改配置文件的工作量和操作错误。可以看到我这个实际项目中,只是修改了项目的application.yaml配置文件,其他代码都是0修改。当然对于基于annotation的方式的配置也是同样的语义修改即可。

    前面一种方式对原有项目的修改比较少,但是Spring cloud的项目依赖都还在。

    我们有些客户选择了另外一种更简单直接的方式,既然原有SDK中服务发现负载均衡包括各种服务治理能力都不需要了,干脆这些依赖也全部干掉。从最终的镜像大小看,整个项目的体量也得到了极大的瘦身。这种方式客户根据自己的实际使用方式,进行各种裁剪,最终大部分是把Spring cloud退化成Spring boot。

    迁移中还有另外一部分比较特殊,就是微服务外部访问的Gateway。

    Spring cloud 有两种功能类似的Gateway,Zuul和Spring cloud Gateway。基于Eureka的服务发现,将内部微服务映射成外部服务,并且在入口处提供安全、分流等能力。在切换到k8s和Istio上来时,和内部服务一样,将入口各个服务的服务发现迁移到k8s上来。

    差别在于对于用户如果在Gateway上开发了很多私有的业务强相关的filter时,这时候Gateway其实是微服务的门面服务,为了业务延续性,方案上可以直接将其当成普通的微服务部署在网格中进行管理。

    但是大多数情况下我们推荐使用Istio的Ingress Gateway直接替换这个微服务网关,以非侵入的方式提供外部TLS终止、限流、流量切分等能力。

    经过以上的简单改造,各种不同语言、各种不同开发框架开发的服务,只要业务协议相通,彼此可以互相访问,访问协议可以被网格管理,就都可以通过Istio进行统一的管理。

    控制面上可以配置统一的服务管理规则。数据面上,统一使用Envoy进行服务发现、负载均衡和其他流量、安全、可观察性等相关能力。数据面上的服务即可以运行在容器里,也可以运行在虚机上。并且可以运行在多个k8s集群中。

    当然在迁移过程中间,我们也支持阶段性的保留原有微服务框架的注册中心,使Istio和其他的服务发现结合使用的中间状态,让网格中的服务可以访问到微服务注册中心的服务。

    这里是一个Spring cloud开发的服务运行在Istio服务网格上进行灰度发布的示例。上面的日志是服务调用方Sidecar的日志,可以看到网格将流量分发到不同的服务后端上。下面的截图是使用了华为云ASM服务的灰度功能,可以看到这个Spring cloud服务通过网格配置的分流策略,将30%的流量分发到灰度版本上。

    下面这个示例是Spring cloud开发的服务使用Istio的熔断功能。这个过程就是就是前面原理一节Hystrix的状态迁移图的实践,不同在于这个实现是基于Istio来实现的。基于服务网格不管这里的服务是什么语言或者框架开发的,都可以对访问进行熔断保护。

    这里的效果截图是来自华为云应用服务网格ASM的应用拓扑,可以非常清新的看到服务级别、服务实例级别流量变化情况,服务和服务实例的健康状态,从而展示故障的Spring cloud实例被隔离的全过程。从拓扑图上可以看到有个实例异常满足熔断阈值,触发了熔断,网格数据面向这个故障实例上分发的流量逐渐减少,直到完全没有流量,即故障实例被隔离。通过这种熔断保护保障服务整体访问的成功率。

    下面三个流量拓扑演示了故障恢复的过程。

    可以看到:

    • 初始状态这个故障实例被隔离中,没有流量;
    • 当实例自身正常后,网格数据面在将其隔离配置的间隔后,重新尝试给其分配流量,当满足阈值要求则该实例会被认为是正常实例,可以和其他两个实例一样接收请求。
    • 最终可以看到三个实例上均衡的处理请求。
    • 即实现了故障恢复。

    最后,通过微服务、容器、k8s和Istio的关系图来总结今天的内容:

    1. 微服务和容器都有轻量和敏捷的共同特点,容器是微服务非常适合的一个运行环境;
    2. 在云原生场景下,在微服务场景下,容器从来都不是独立存在的,使用k8s来编排容器已经是一个事实标准;
    3. Istio和k8s在架构和应用场景上的紧密结合,一起提供了一个端到端的微服务运行和治理的平台。
    4. 也是我们推荐的方案,使用Istio进行微服务治理正在成为越来越多用户的技术选择。

    以上四个关系顺时针结合在一起为我们的解决方案构造一个完整的闭环。

    华为云早在2018年就率先发布全球首个Istio商用服务——应用服务网格(Application Service Mesh,简称ASM),华为云应用服务网格是一种高性能、高可靠性和易用性的全托管的服务网格,支持虚拟机、容器等多种基础设施,支持跨区域多云多集群服务的统一治理。以基础设施的方式为用户提供服务流量管理、服务运行监控、服务访问安全以及服务发布能力。

    目前,华为云应用服务网格已服务于互联网、汽车、制造、物流、政府等多个行业的近千家客户,满足不同行业客户的业务诉求。华为云将在此过程中积累的丰富经验,转化为代码贡献给Istio社区,极大的推动了Istio技术的成熟和社区的快速发展。同时,华为云还大力投入服务网格的技术布道,通过社区论坛、技术会议、视频直播、专业书籍等各种方式,推动服务网格技术传播和普及。

     

    点击关注,第一时间了解华为云新鲜技术~

    展开全文
  • 阿里云ECS 云服务器和轻量应用服务器 区别

    万次阅读 多人点赞 2019-05-28 11:05:22
    轻量应用服务器是面向入门级云计算及简单应用用户,提供基于单台云服务器的域名管理、应用部署、安全和运维管理的一站式综合服务。用户可以选择精品应用镜像(比如wordpress),并可在控制台实现全方位的服务器、...
  • 近日,应邀为国家电网供电公司的领导干部进行培训,讲座的题目是《细节决定成败,什么决定细节?》与其说是一次讲座,其实更是一种“竞标”,因为对于国网供电公司而言,他们是想通过“讲座比稿”来决定后面的国网...
  • 在系统服务化的过程中,我们不得不面临的一个问题是多个子系统间业务数据的一致性如何保证,解决这个问题有多种方式。XA可能很多人首先会想到XA规范中定义的分布式事务,下图是XA规范中定义的DTP(Distributed ...
  • 以上实现了全球同服 服务器技术架构,可以实现全球玩家同服,细节方面就不多说了,比如使用哪种通信协议,开发逻辑使用lua开发等等。其实,它的主要原理还是利用了Web架构的设计,要假设全球同服 服务器,读者主要...
  • AWS核心服务概览

    千次阅读 2017-09-02 06:56:52
    使用RDS的方式也很简单,RDS隐藏了EC2的细节,我们直接按照RDS的要求配置,就可以得到一个可用的单实例或主从复制的数据库集群了。 此外,还可以关注一下AWS的新东西,兼容MySQL但有更好的性能的Aurora和新型的图...
  • 汽车服务架构(SOA)开发设计

    千次阅读 2022-02-23 16:51:42
    以在企业内部和跨企业创建新业务功能方面重用和重新组合服务,SOA很好的做到了“粗粒度”和“松散耦合”的特点,相较于当前分布式物理架构具有更大的灵活性。SOA 最佳实践创建包含业务流程的设计—— 并增强将流程...
  • Spring Cloud源码分析之Eureka篇第五章:更新服务列表
  • 浅谈RPC服务治理服务

    千次阅读 2018-04-02 19:44:20
    面向服务的架构SOA 任何大型网站的发展都伴随着网站架构的演进。网站架构一般最初是单应用设计,然后逐渐经历面向对象设计和模块化设计的架构,最终发展到面向服务服务化架构。在单应用设计架构体系当中,我们...
  • 5、SOA架构:将各系统的不同功能单元抽象为服务服务间通过标准的接口协议连接,从而到达复用 6、微服务:SOA思想的一种提炼,强调业务系统彻底的组件化和服务化 7、微服务2.0:由服务网格以代理的方式建立稳定的...
  • 服务计算(一)

    千次阅读 2020-03-19 21:12:16
    文章目录第零章、XML第一章、介绍1.0 为什么要学服务计算1.1 Web服务简介1.1.1 今天的网络:以人为中心的网络1.1.2 Web服务:以应用程序为中心的Web1.1.3 Web服务愿景:自动化Web1.1.4行业格局1.2 Web服务架构1.2.1 ...
  • Tars是基于名字服务使用Tars协议的高性能RPC开发框架,同时配套一体化的服务治理平台,帮助个人或者企业快速的以微服务的方式构建自己稳定可靠的分布式应用。Tars是将腾讯内部使用的微服务架构TAF(Total ...
  • 我们看到的《细节决定成败》等大量书籍,声称"魔鬼藏在细节中",但是很多人,只是看到了细节,却没有发现细节中的魔鬼!没有"魔鬼"这一灵魂,所谓的"细节"只是一个海市蜃楼的空壳。 按照"错层"的思路想来,只有...
  • 系统架构之服务器架构图

    万次阅读 多人点赞 2019-10-09 14:46:46
    优点:由于处于两个服务器,可以做到访问的分流,减少应用服务器压力,正常用户访问和文件下载上传不共享一个服务器带宽,做到分带宽,如果在文件和应用都在一个服务器会存在上传下载时候,其它访问很慢。...
  • [后端服务]后端程序健壮性几点思考

    千次阅读 2017-01-04 10:29:31
    对每一个程序员而言,故障都是悬在头上的达摩克利斯之剑,都唯恐避之不及,如何避免故障是每一个...对于这一问题,大家都可以从需求分析、架构设计 、代码编写、测试、code review、上线、线上服务运维等各个视角
  • Dubbo | 魔鬼在细节

    万次阅读 2018-09-14 17:01:11
    最近一直担心Dubbo分布式服务框架后续如果维护人员增多或变更,会出现质量的下降, 我在想,有没有什么是需要大家共同遵守的, 根据平时写代码时的一习惯,总结了一下在写代码过程中,尤其是框架代码,要时刻牢记的...
  • 披露时间线以太坊代币“假充值”漏洞影响面非常之广,影响对象至少包括:相关中心化交易...出于影响,我们采取了负责任的披露过程,这次攻击事件的披露前后相关时间线大致如下:漏洞细节以太坊代币交易回执中 status...
  • 它提供了完整的非侵入式的微服务治理解决方案,包含微服务的管理、网络连接以及安全管理等关键能力,无需修改任何代码就能够实现微服务的负载均衡,服务服务之间的认证授权以及监控。从整个基础设施角度上看,可以...
  • 以下是我重点开源和维护的项目: 全网首个完全开源的分布式全局有序序列号(分布式ID生成器)服务,支持嵌入式(Jar包)、RPC(Dubbo)、Restful API方式发布服务。开源地址: GitHub: ...
  • 得到APP是罗辑思维团队花费2年多时间,打磨的一款知识服务类产品,自出生那一刻就光环环绕,明星团队打造,发布1年后营收超1亿,2年多达到2000万用户。 在知识付费的红海中,得到是怎样杀出来的呢? 插坐学院...
  • 一文带你搞定TCP面试所有细节_TCP详谈

    万次阅读 多人点赞 2021-06-07 17:42:02
    等待一段时间没有收到重发就说明服务的已经CLOSE了。如果有重发,则客户端再发送一次ACK信号。 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文...
  • 牛逼!Java 从入门到精通,超全汇总版

    万次阅读 多人点赞 2021-05-06 19:40:33
    文章目录Java 基础Head First JavaJava 核心技术卷一Java 编程思想设计模式Head First 设计模式图解设计模式设计模式重学 Java 设计模式Java 进阶Java 并发编程实战Java 并发编程艺术Java 并发编程之美图解Java多...
  • 本文来自作者 Mike 在 GitChat 上分享 「从零开始,搭建 AI 音箱 Alexa 语音服务」,「阅读原文」查看交流实录。「文末高能」编辑 | 哈比一、概述生活场景的引入: 物联网的快速发展,各种智能设备层出不穷,...
  • SOA/软件架构设计---面向服务的架构(SOA详细解释)

    万次阅读 多人点赞 2019-03-06 16:53:53
    文章比较多,但干货慢慢,请耐心阅读 面向服务的架构 迄今为止,对于面向服务的架构... (1)W3C 的定义:SOA 是一种应用程序架构,在这种架构中,所有功能都定义为独立的服务,这些服务带有定义明确的可调用接口...
  • 你认为困难的实时光线追踪,NVIDIA却做到了……

    千次阅读 热门讨论 2018-08-30 14:15:52
    猛然一看,你可能会觉得这是一段提前录制好的且充满视觉感的demo,但现场的NVIDIA的技术人员对记者表示,视频中所有细节的光影处理都是经过实时渲染得到的,这种实践在过去的影视频制作中,是完全无法做到的。...
  • 关于泰勒展开的细节-《三体》读后感的读后感...

    万次阅读 多人点赞 2017-07-30 08:25:23
    我并不赞成这个说法,以霍金为例,它的虚时间模型虽然只是数学上的技巧,但是最终的目标却是为他的有限无界的宇宙几何模型服务,这说明,完成逻辑完整性证明和寻找其意义同等重要,可能后者还会更重要,我没有看到哪...
  • 回答:在视频平台看视频的时候,获取到浏览器的cookie等相关信息,通过调用百度的服务去匹配同一个设备的最新的搜索数据,然后进行广告投放,做到千人千面 问题二:而且更加奇怪的是,你明明是在电脑pc 端搜索的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 136,711
精华内容 54,684
关键字:

如何做到细节服务