全栈工程师是如何炼成的?Node大神狼叔访谈

在大会前夕,高可用架构采访了本届 GIAC大前端技术分论坛

出品人桑世龙,就目大家广泛关注的前端技术方面的问题进行了访谈。

全栈工程师是如何炼成的?Node大神狼叔访谈

高可用架构:狼叔好,很荣幸能有机会来采访您。首先,众所周知你是Node JS在国内的布道师,能否谈谈目前Node发展的现状?

桑世龙:目前国内Node.js主要是作为前端基础设施存在的,但Node.js目前已经横跨三端:移动端(phonegap/cordova),pc/h5,pc客户端(electron/nw.js)1)前端提效工具,比如脚手架,构建工具等 2)辅助前端提升性能,比如利用bigpipe提高性能,pwa/amp等 3)开发各种前端相关系统,比如流量统计,日志,配置中心,管理后台等。

俨然,Node.js是前端提效最好的工具,但很明显这和Node.js初衷是违背的,Node.js是为解决并简化服务器端编程而诞生的。目前Java依然是后端主流开发,任何新型语言都很难占有很大份额,Node.js也一样,目前中小公司,创业公司用node做后端的比较多,纯前端类的相关系统也是Node.js比较多。这块在未来会有一定比例份额,在微服务的架构下,任何语言都有机会,只是喜好问题。另外随着TypeScript的流行,能够让更多的后端同学习惯Node.js的。

高可用架构:Node是一门服务端的编程语言,能谈谈他在性能方面的表现,以及Node当下比较好的应用场景?

桑世龙:Node.js的性能整体来说还是相当不错的,在诞生之初,因异步吊打各种语言,一战成名。但随着时间的变化,各语言也都在成长,比如ruby、php都有极其明显的性能提升,甚至Java也能引入了异步编程,所以性能大家都没有特别明显的优势。

一般,后端开发指的是 Web应用开发中和视图渲染无关的部分,但现在架构升级,Node承担了前后端分离重任之后,有了更多玩法。从带视图的传统Web应用面向Api接口应用,到通过RPC调用封装对数据库的操作,到提供前端Api代理和网关,服务组装等,统称为后端开发,不再是以往只有和数据库打交道的部分才算后端,这样,就可以让前端工程师对开发过程可控,更好的进行调优和性能优化。

对Node.js来说,一直没有在后端取得其合理的占有率。原因很简单

  • 1)利益分配,已有实现大多是Java或者其他语言,基本是没法撼动的,重写的成本是巨大的,另外,如果用Node写了,那么那些写Java的人怎么办?抢人饭碗,这是要拼命的。

  • 2)Node相对年轻,大家对Node的理解不够,回调和异步流程控制略麻烦,很多架构师都不愿意花时间去学习。尽管在Web应用部分处理起来非常简单高效,但在遇到问题时并不容易排查定位,对开发者水平要求略高。

  • 3)开发者技能单一,很多是从前端转过来的,对数据库,架构方面知识欠缺,对系统设计也知之不多,这是很危险的,有种麻杆打狼两头害怕的感觉。

  • 4)Node在科普、培训、布道等方面做的并不好,国外使用的非常多,国内却很少人知道,不如某些语言做得好。

当下来说,服务器资源已经相当便宜,对我们的挑战是如何处理开发速度和性能的场景取舍。

  • 1)开发速度第一,当然是Ruby、Node类的更好

  • 2)在初期,原型验证等,Node是非常好的

  • 3)在特定场景,可以考虑Go来进行增强

Node.js 应用场景非常丰富,比如 Node.js 可以开发操作系统,但一般我都不讲的,就算说了也没多大意义,难道大家真的会用吗?一般,我习惯将 Node.js 应用场景氛围7个部分。

  • 1)初衷,server端,不想成了前端开发的基础设施

  • 2)命令行辅助工具,甚至可以是运维

  • 3)移动端:cordova,pc端:nw.js和electron

  • 4)组件化,构建,代理

  • 5)架构,前后端分离、api proxy

  • 6)性能优化、反爬虫与爬虫

  • 7) 全栈最便捷之路

之前已经讲过很多了,这里再列出一些,以便读者能够更好的了解 Node.js,

编号场景说明
1反向代理Node.js可以作为nginx这样的反向代理,虽然线上我们很少这样做,但它确确实实可以这样做。比如node-http-proxy和anyproxy等,其实使用Node.js做这种请求转发是非常简单的,在后面的http章节里,有单独的讲解。
2
爬虫有大量的爬虫模块,比如node-crawler等,写起来比python要简单一些,尤其搭配jsdom(node版本的jQuery)类库的,对前端来说尤其友好
3命令行工具所有辅助开发,运维,提高效率等等可以用cli做的,使用node来开发都非常合适,是编写命令行工具最简单的方式,java8以后也参考了node的命令行实现
4微服务与RPCnode里有各种rpc支持,比如node编写的dnode,seneca,也有跨语言支持的grpc,足够应用了
5微信公众号开发相关sdk,框架非常多,是快速开发的利器
6前端流行SSR && PWA
SSR是服务器端渲染,PWA是渐进式Web应用,都是今年最火的技术。如果大家用过,一定对Node.js不陌生。比如React、Vuejs都是Node.js实现的ssr。至于pwa的service-worker也是Node.js实现的。那么为啥不用其他语言实现呢?不是其他语言不能实现,而是使用Node.js简单、方便、学习成本低,轻松获得高性能,如果用其他语言,我至少还得装环境

高可用架构:移动互联网时代,服务端更多提供的是API的接口,对API的开发框架,有哪些方面的推荐?他们的优点是哪些?

桑世龙:前端越来越复杂,后端服务化,今日的前端要面临更多的挑战。一个典型的场景就是在服务化架构里,前端面临的最头痛的问题是异构API,前后端联调的时候,多个后端互相推诿,要么拖慢上线进度,要么让前端性能变得极其慢。进度慢找前端,性能差也找前端,但这个锅真的该前端来背么?

Node.js 的 Api 中间层应用很好的解决了这个问题。后端不想改的时候,实在不行就前端自己做,更灵活,更能应变。

  • 透传接口,对于内网或者非安全接口,可以采用中间层透传。

  • 聚合接口,对异构API处理非常方便,如果能够梳理model,应变更容易。

  • Mock接口,通过Mock接口,提供前端开发效率,对流程优化效果极其明显,比如去哪儿开发的yapi就是专门解决这个问题的。

除此之外,前端如果想做一些技术驱动的事儿,SSR(服务器端渲染)和PWA(渐进式Web应用)也是非常不错的选择。这里主要讲一下静态Api和服务器端api

1)静态Api

全栈工程师是如何炼成的?Node大神狼叔访谈

启动服务器

全栈工程师是如何炼成的?Node大神狼叔访谈

此时访问网址 http://localhost:3000/posts/1,即我们刚才仿造的静态Api 接口,返回数据如下

全栈工程师是如何炼成的?Node大神狼叔访谈

2)服务器端Api

服务器端Api的要点:稳定,高效,生态完备。选用Node.js的好处就是因为它的简单高效。基础框架除了应用最广泛的主流Web框架Koa外,Fastify也是一直劲敌,作者 Matteo Collina 是 Node.js 核心开发,Stream 掌门,性能优化专家。Fastify 基于 Schema 优化,对性能提升极其明显。当然,最值得说明的,我认为是企业级Web开发,这里简单介绍3个知名框架。

Egg.js

阿里开源的企业级 Node.js 框架 Egg 发布 2.0,基于 Koa 2.x,异步解决方案直接基于 Async Function。框架层优化不含 Node 8 带来的提升外,带来 30% 左右的性能提升。

Egg 采用的是 『微内核 + 插件 + 上层框架』 模式,对于定制,生态,快速开发有明显提升,另外值得关注的是稳定性和安全上,也是极为出色的。

Nest

Nest是基于TypeScript和Express的企业级Web框架。

很多人开玩笑说,Nest是最像Java开发方式的,确实,Nest采用TypeScript作为底层语言,TypeScript是ES6超集,对类型支持,面向对象,Decorator(类似于Java里注解Annotation)等支持。在写法上,保持Java开发者的习惯,能够吸引更多人快速上手。

TypeScript支持几乎是目前所有Node Web框架都要做的头等大事,在2017年Nest算首个知名项目,值得一提。

ThinkJS

ThinkJS 是一款拥抱未来的 Node.js Web 框架,致力于集成项目最佳实践,规范项目让企业级团队开发变得更加简单,更加高效。秉承简洁易用的设计原则,在保持出色的性能和至简的代码同时,注重开发体验和易用性,为WEB应用开发提供强有力的支持。

ThinkJS是国产老牌Web框架,在2017年10月发布v3版本,基于Koa内核,在性能和开发体验上有更好的提升。

整体来看,Node.js在企业Web开发领域日渐成熟,无论微服务,还是Api中间层都得到了非常好的落地。在2017年唯一遗憾的是Node.js在servless上表现的不太好,相关框架实践偏少。

高可用架构:现在区块链非常火,也有很多项目直接使用Node,也有一些项目支持Node,针对这块您是否了解?也谈谈您的看法?

桑世龙:对于区块链开发来说,一个主要的方向是以太坊的智能合约,solidity主要是采用c/c++开发,这对很多开发来说还是有些难度的。于是有了http://truffleframework.com/这样的Node.js框架,通过Node.js的addon把solidity的c++接口封装成js api,这样就极大的简化了开发。当然,问题也是有的,限于js语言的局限,还是有很多问题的,比如类型,数值精度等。

我对区块链掌握的有限,但其价值还是相当认可。另外参加Google IO,了解到tessorflow的Node.js版本tfjs,具有非常好的性能和易用性,也是假货的方向。如果有机会,推荐大家使用Node.js来做ai和区块链应用。

高可用架构:众所周知狼叔是一个牛的全栈工程师,而现在在互联网行业全栈工程师也非常吃香,您觉得怎样才能成为一个好的全栈工程师?

桑世龙:每次演讲我会都问大家是不是前端,回答“是”的人非常多,我会开玩笑的恭喜大家:“现在的前端就是钱端”,确实,现在前端发展异常的快,而且没有趋向于类比java里ssh框架的那种稳定,所以未来很长一段时间,还会增长,持续混乱,这对前端来说是把双刃剑,一方面有很强的压迫感,不学习就跟不上时代,另一方它也是机遇,能够带给更多机会,包括money。

大家都疑惑的一个问题是如何在这样巨变的时代能够通过学习来应变,我可以很负责的告诉大家,没有捷径,但通过掌握 Node.js 能够让你降低这个学习曲线而已,毕竟Node.js是大前端的基础设施。大家可以看一下,前端的开发过程,模块化,构建,辅助工具,调优,架构调整,可以说Node.js是无处不在的。

其实,辅助大前端开发只是Node.js的一个非常无心插柳的衍生功能,通过掌握Node.js能够让你能做的更多、获得的更多,甚至可以说有更多自我实现的快乐,这也是我那本书书名字里“更了不起的”要去阐述的内容。

综上种种,就是我一直提倡以 JavaScript 语言为中心的 Node全栈概念的缘由,JavaScript 覆盖所有前端,Node.js 擅长做 I/O 密集型的后端,外加辅助开发的各种基础设施,无疑是工作、学习和成为快速掌握全栈技术最好的途径。你会的越多,你能做的就更多,你的人生也将会有不一样的精彩篇章。

全栈核心

  • 后端不会的 UI(界面相关)

  • 前端不会的 DB(业务相关)

只要打通这2个要点,其他就比较容易了。最怕的是哪样都接触点,然后就号称自己是全栈,建议大家不要这样做,这就好比在简历里写精通一样,基本上都会被问到尴尬。全栈是一种信仰,不是拿来吹牛逼的,而可以解决更多问题,让自己的知识体系不留空白,享受自我实现的极致快乐。

高可用架构:听说您在写一本关于Node的书,能透露下您这边书的内容,以及写书的缘由和目的么?

桑世龙:是在写一本《更了不起的Node.js》,这个题目有点大,三月已截稿,却迟迟不敢发,再完善一下。当前Node.js的应用场景和3年前变化极大,是时候给大家来梳理一下具体的知识体系。

《Node.js in action》一书里说,Node.js 所针对的应用程序有一个专门的简称:DIRT。它表示数据密集型实时(data-intensive real-time)程序。因为 Node.js 自身在 I/O 上非常轻量,它善于将数据从一个管道混排或代理到另一个管道上,这能在处理大量请求时持有很多开放的连接,并且只占用一小部分内存。它的设计目标是保证响应能力,跟浏览器一样。

这话不假,但在今天来看,DIRT 还是范围小了。其实 DIRT 本质上说的 I/O 处理的都算,但随着大前端的发展,Node.js 已经不再只是 I/O 处理相关,而是更加的“Node”!

Node.js 使用场景主要分为4大类

  • 1)跨平台:覆盖你能想到的面向用户的所有平台,传统的PC Web端,以及PC客户端

    nw.js/electron、移动端cordova、HTML5、react-nativeweex,硬件ruff.io

  • 2)Web应用开发:网站、Api、RPC服务等

  • 3)前端:三大框架 React \ Vue\Angular辅助开发,以及工程化演进过程(使用Gulp/Webpack 构建 Web 开发工具)

  • 4)工具:npm上各种工具模块,包括各种前端预编译、构建工具Grunt/Gulp、脚手架,命令行工具,各种奇技淫巧等

下面列出具体的 Node.js 的使用场景,以模块维度划分

分类描述相关模块
网站类似于 cnodejs.org这样传统的网站Express/Koa
Api同时提供给移动端,PC,H5等前端使用的HTTP Api接口Restify/HApi
Api代理 为前端提供的,主要对后端Api接口进行再处理,以便更多的适应前端开发Express/Koa
IM即时聊天实时应用,很多是基于 WebSocket协议的Socket.io/sockjs
反向代理提供类似于 nginx反向代理功能,但对前端更友好anyproxy/node-http-proxy/hiproxy
前端构建工具辅助前端开发,尤其是各种预编译,构建相关的工具,能够极大的提高前端开发效率
Grunt/Gulp/Bower/ Webpack /Fis3/YKit
命令行工具使用命令行是非常酷的方式,前端开发自定义了很多相关工具,无论是shell命令,node脚本,还是各种脚手架等,几乎每个公司\小组都会自己的命令行工具集Cordova/Shell.js
操作系统有实现,但估计不太会有人用NodeOS
跨平台打包工具使用 Web 开发技术开发PC客户端是目前最流行的方式,会有更多前端开发工具是采用这种方式的
PC端的electron、nw.js,比如钉钉PC客户端、微信小程序IDE、微信客户端,移动的Cordova,即老的Phonegap,还有更加有名的一站式开发框架Ionicframework
P2P区块链开发、BT客户端webtorrent/ipfs
编辑器AtomVSCode都是基于electron模块的electron
物联网与硬件ruff.io和很多硬件都支持node sdkruff

高可用架构:本次GIAC大会,您对那些主题比较感兴趣? 能稍微透露下您此次大会的分享内容以及您对GIAC大会有哪些期望?

桑世龙:我个人还是对区块链和Ai相关内容更感兴趣。当然,作为前端,一下主题也是我非常感兴趣的。

  • ReactNative替代方案plato在腾讯课堂App中的实践,腾讯的朋友讲,据说分上下场,应该是非常有趣的异常

  • Nodejs微服务架构之路,是阿里的朋友讲,这部分国内讲的不多,算当下最佳实践,我还是非常希望Nodejs微服务架构可以真正普及,让更多人受益的。

  • webassembly在全民直播的应用,WA是新技术,将各种语言编译成js以弥补js的性能问题。在Google IO大会上,也有WA的主题,收益匪浅,相信WA在直播领域的尝试也是非常有远见卓识的。

本期 GIAC 大会上,大前端部分的精彩议题如下:

全栈工程师是如何炼成的?Node大神狼叔访谈全栈工程师是如何炼成的?Node大神狼叔访谈


分享到:


相關文章: