【干货】和谐统一的Universal Javascript

天下大势,合久必分,分久必合。



我们的技术体系每天都在更新换代。90年代初(像早期的新浪搜狐都是这样)很多网页是由C/Java语言写的,根据请求输出一坨HTML/CSS/JS。90年代末出现了JSP/PHP等网页脚本,网页开发者终于不需要做很底层的开发了。但2000年左右有人认为Server代码混着Client代码很难受,于是让他们分家了。模板语言的出现彻底改变了格局,于是各种MVC框架雨后春笋一般兴起。


(前面废话铺垫有点多,不耐烦可以从第一张图片看~)


至此,我们的开发技术看起来已经很不错了,开发者可以各司其职。Server端的开发和Client端的开发各自分道扬镳走过了十几个岁月。


其间,Server端进入五花八门的世界,Python/Ruby等和各种框架各种MVC MVVM MVP模型五花八门,引领***。中华大地唯独喜欢PHP,也是在世界范围内的奇观。Client端也是风生水起,Javascript引擎不断优化,加上Client的硬件越来越牛逼,框架越来越丰富,各种新标准(HTML5 Javascript ECMA)层出不穷。


多说一句,Web前端不仅仅是HTML/CSS/Javascript体系,还有刚刚被Adobe放弃的Flash/Action Script体系,和微软做了没多久就放弃的Silverlight体系。也许还有,不想考究。反正现在没得选了。


但想上手学Web技术的人总是会疑惑,我要做Server端还是Client端?我也疑惑。选了Server端我要用什么语言?PHP,Java,Python,Ruby,Perl。这种问题,我也很疑惑


就像人类社会各种方言各种书面语言一样,计算机世界的语言越来越多。也越来越多的人,陷入了这种选择危机。有个笑话就是,如果你想和一个程序员吵架,就和他分辨他擅长的语言不比某个语言好。

(文章正式开始………………)

================分割线==================

年中时,美国版乐视Netflix公布彻底完成重构了他们的系统,用来Universal Javascript技术,一度是个热门新闻。咦!这个词看着新鲜有趣!简单意思是,让Javascript来完成整套Web开发。


但其中的细节,耐人寻味。


去查了下来由,这个新词出现还经历一番波折。起初有个挺牛逼的歪果仁架构师起名“Isomorphic Javascipt”,被无数人吐槽。后来有个人说,要不叫“Universal Javascript”吧,大家称好。他说:


“It’s true that there are two hard problems in computer science and one of them is naming things. Why? Because good names are important. A good name teaches about purpose and responsibility, so you have to spend some time thinking about it.”


这个“技术”,就是指,用Javascript实现Web的全套开发,包括Client和Server端,实现大一统!


如图:

这个好处想想还挺多:

  1. 有段Server端的代码,比如说某个算法,想突然在Client端用,发现要重写,无比蛋疼。反过来亦然。 统一以后,虽然不一定是能直接函数调用,至少拷贝过来用还是可以的。 如果文件管理得当,不需要拷贝,只需要放在一个文件,当做shared public code就好。 美妙!

  2. 开发团队更加简单,不再像中国公司那样去刻意区分前端后端工程师。流量大的时候还是需要,但早期就不用了(根据99% startup都要死掉的规律,还是很有意义)

  3. 前面我们的纠结也没了。别选前端后端了,一招鲜吃遍天下~~



然而故事还没结束。


你以为就这几句话,就能说服老板,让公司放弃老技术,采用新技术吗?你说你方便简单,但我老招用惯了不需要学更简单呢!


新技术靠忽悠人不行,还得看实力——解决运行效率问题。Netflix重构的首要原因不是维护难,而是并发太差。据文章说的,在加载请求某一页面的时候,会初始化大量的数据,导致服务器压力很大。但是很多数据只有在往下拉或者点击的时候才会展示。所以这次重构,就是要做这样逻辑的优化——只有真正要展示的时候或者快要展示的时候再去加载数据。


如图下:


这想法不错啊!但 认真想想,这可不是要放弃老技术的理由。。

我只要重构重构代码就行了。就像作者见过的百度知道、百度百科、百度贴吧的技术重构一样。这些问题的原因并不是采用的技术不好,而是由于历史原因,开发的时候太急躁留下的各种问题罢了。


然而用和谐统一的Universal Javascript还真非常有助于做这样的事情!

前面说了,现在Client端机器性能越来越好,如果能把一大块业务逻辑放到Client去执行,那对Server端真是舒一口气!

比如,<ul><ol>的List,常见的做法是在Server端循环生成然后通过HTTP请求输出展示。想象下,为了做这种重复的事情,我们的Server要不停地在内存复制粘贴复制粘贴复制粘贴复制粘贴复制粘贴。。。。。


不仅如此啊,这种东西很多,还会让输出的HTTP包变得很大。当然数据本身大小也是一方面,但是这种重复的东西,可能Server只要告诉你重复几遍就行了。


然而用和谐统一的Universal Javascript还真非常有助于做这样的事情!

然而用和谐统一的Universal Javascript还真非常有助于做这样的事情!


因为如果这个逻辑不是保密的,我就让他道Client端执行就好了?反正现在浏览器牛逼的不得了。


从另一个角度说,MVC中大部分,可能就要大部分迁移到Client端来实现了,如图:

原来是这样:

现在是


(PS,具体怎么做,请参考最近火爆的ReactJS,和Angular JS)


然而如果你以为故事结束了?


把这些逻辑迁移到Client可不是Universal Javascript的专利!多少年前的ExtJs就这么做了好吧——当然要承认人家前后端统一语言后是会方便这么搞很多。


Universal Javascript背后支持的Node.js,在Server端还有一些闪闪发光的“新”技术! (打引号是因为不是他的专利)


也许Node.js还不至于引发技术***产品***(像安卓系统出世那样),毕竟也有点不足之处(源于不少人对Javascript的“歧视”,比如我)。

Node.js 引入的编程模型(函数式编程),高性能Web流程模型(特化处理线程)。那些新的光芒在Node.js上也许无法引发***,那是迟早的事。


函数式编程

什么是函数式编程?简单说就是把代码写出一个个函数。有几点要求是:1.传入的参数不允许改变,只能靠return 返回结果(data in functional programs should be immutable ) 2. 函数必须无状态(没有静态变量)(functional programs should be stateless) 。 还有一些额外要求,比如non-blocking IO,倒不是函数式编程的原意。


能和函数式编程媲美的就是面向对象编程思想了。这不是什么具体的技术,你可以用任何语言实现。

这只是一直组织代码的方式。


好处是会让代码1. 更容易看懂,一目了然,2.某些情况下执行效率更高(尾递归,或者Erlang那种并发执行)

PS,虽然都是思想,但不冲突。就像面向过程和面向对象要共存一样,函数式编程往往也是和面向对象编程共存


高性能Web流程模型


Node.js的请求处理流程,别树一帜,非常值得一提,也是他得优势之一。

在处理请求的时候,Node.js都是单进程单线程,但会极快无比——因为是non-blocking IO的关系。所有的外部IO(SQL,文件,外部网络请求等所有IO)由Node.js的一群子线程来处理。

这群子线程可以称作特化的隐藏子线程(暂时想不出好名字),因为开发者是无法接触的。

这样的好处:

  1. 效率。很多外部IO都需要各种初始化,比如数据库需要建立连接等,如此一来,就不用重复建立这些连接。

  2. 安全。IO子线程的异常不会影响正常HTTP处理线程的稳定。


前面说,这种方式并不是Node.js的专利。Java的SSH体系就有线程池,可以避免重复建立连接。PHP体系里面虽然没有线程池,但是有DB proxy来保证连接复用,本质上都在解决同一个问题。


然而伟大的是,Node.js强制了这一做法,并且统一化到所有的IO。何况很多小公司小团队,自己维护DB proxy是非常蛋疼的。

曾经看到百度的一个分析统计,IO处理占执行时间的80%以上。所以,可见这一问题之重要。


对比图如下,正常情况的HTTP Server执行流程

Node的执行流程:



最后,并不见得Universal Javascript会真的***世界,技术体系背后还有公司的较量。(Node.js是谷歌体系, Java PHP C#等体系背后一样有各种大公司) 但这套技术背后的先进思想,是挡不住的。

拥抱变化,期待和谐统一的世界!



来自http://card.weibo.com/article/h5/s?from=groupmessage&isappinstalled=0#cid=1001603926037162533128&vid=&extparam=&from=&wm=0&ip=107.77.83.114

全部评论
抢沙发
点赞 回复 分享
发布于 2015-12-31 12:56

相关推荐

感性的干饭人在线蹲牛友:🐮 应该是在嘉定这边叭,禾赛大楼挺好看的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务