掘金 AMA:听 Node.js Core Collaborator 之一 死月聊 Node.js && 技术写书

2,614 阅读14分钟

第五期 沸点,掘金团队请来了Node.js Core Collaborator 之一,《Node.js:来一打 C++ 扩展》作者死月做了为期三天的 Ask Me Anything (AMA) 活动(已结束)。

我们在此精选了一些来自用户的提问及死月的回答。

关于死月:

  • Node.js Core Collaborator 之
  • 《Node.js:来一打 C++ 扩展》作者
  • 在蚂蚁金服体验技术部,负责一些内部基础设施、框架的研发和维护
  • 掘金专栏:juejin.cn/user/361484…
  • Github 地址: github.com/XadillaX

社区小伙伴提问

node 使用场景? ─ @zephyru

路过,首先,抱头蹲防最高..其次.. 问个老生常谈的问题...当前环境下NodeJs的应用场景? 诚然,业务逻辑的性能,通过C++扩展可以有长足的提升,然而个人有种华而不实的感觉... 做胶水的话..python似乎用的更多... Web服务器端,大型项目大都还是选择JAVA..我听有用Node写到最后依赖管理非常痛苦...又推倒换回JAVA的... 几年来,在大型项目上我只听说淘宝在16年拿来做过中间层...其它还有什么大型项目的成功案例么? 我个人,其实是很喜欢NodeJs的..毕竟我是前端,写js很亲切,但是,目前..我还没有找到Node拿来写玩具或者中小型项目以外的应用空间... 近两年...我开始见到用js来做深度学习,和写硬件的... 在这些方面不晓得有何高见?

----------------------------

备选问题: 听说,有些地方招算法,只要看面试者随便登录一个社交平台,看是不是二次元妹纸头像就基本能决定要不要,对于这个现象的看法?

其实这个问题网上答案已经很多了,并且很多答案也都是可信的。在于小公司来说,Node.js 快速出原形,并且后续迭代,是非常好的一个选择。对于这种项目的,技术选型来说并没有太多讲究,无非是选型的人手熟哪个,并且能不能 Hold 住。当下的硬件环境或者设施来说,语言以及其性能在大多数场景下并不会成为瓶颈,而网上各种大肆吹鼓某种语言的现象其实看看就好。

而对于大一点的项目来说,或者公司环境来说,除去上述的方面考虑,还要考虑到生态的完善性、人力资源的掌控性,Java 无疑是一哥,而 Node.js 在其易学性上面也减少了一定量的人力成本和学习成本,在各种业务线上的表现来说其性能也不会成为瓶颈(极端情况另论)。语言之争非要说 Ruby 啊 Python 啊什么的比 JavaScript 好,仁者见仁——学习成本来说,由于早年还不大会编程的时候玩 RPG Maker 留下的阴影,导致我至今没学会 Ruby,所以学习成本这事也是仁者见仁智者见智。

你要说有什么项目的话,网上能得到的信息其实很多的,支撑天猫的各种活动会场(尤其是双十一)的服务就是 Node.js 实现的,而你能见到的很多的支付宝前端页面,也都是 Node.js 渲染出来的。

当然也有不少公司拿 Node.js 做纯(且唯一)的后端,这证明了是可行的,还是一开始那句话,通常的选型来看无非是拍板人的选择,并不会说造成不用某个东西做就做不下去了的情况,除非是某些已经巩固比较深的地位,如 Docker 与 Golang 的搭配等。

你说的硬件、人工智能方面,这些领域与上述回答不一样,它们在我看来 Node.js 的确是玩具,也许未来某一天会有所成就,目前我持保留意见。在 IoT 方面应该的确是个不错的选择。

至于备用答案,其实这是一个概率问题。我们假设一个面试官手头有非常多的简历,但他自身很忙,没有时间去筛简历。我虽然不懂人力资源,但也能猜个大概,招人并不是要把所有的合适的人招进来,而是在有限的人头数量中挑几个合适的,也就是说其实漏掉几个合适的问题也不大,除非是那种“非要不可”的。既然漏掉几个没关系,那么问题就简单了,我因为精力有限,粗粗将人分为“可能挺不错”和“虽然这一波也可能有不错的人但是有几率是不怎么样的”两拨,这两拨人中在面试官的脑海里的印象会出现“不错”的人的概率在第一波中比较高。至于为什么高,这个就涉及到 ACG 的圈子了。OIer / ACMer(你可以理解为算法很不错的人)圈子与 ACG 的圈子重合度相较于别的圈子来说会高一些,通过这种方法第一遍筛人就能有一定几率拿到自己想要的人。并且,在招人的时候看的不仅仅是能力,两个人水平一样的情况下,面试官更倾向于招一个与团队基因更为契合更有共同话题的候选人,这个时候,整个团队都有 ACG 基因,二选一当然招妹子头像的了。

关于 C++ 扩展华而不实这点,可以参考我的另一个答案,阅读的角度。你不写扩展,这本书依然可以为你能更好地自行阅读 Node.js 去了解它提供很好的帮助。

这里只是拿 C++ 扩展作为本书依附的一个宿主。

node未来的方向? ─ @wujunze

你好 node未来的方向 和 它真正能擅长的场景是哪些 ?

Web 领域应该会继续守住,但也不会去撼动谁谁谁的地位,各有所长,在大家的熟练度、性能以及研发效率之间找一个平衡。相似的还有就是游戏类的服务器,但是竞品太多了,而且还没完成一个太集中和完善的生态,老大哥柚子感觉已经好久没人维护了。

在渲染方面会有优势。因为这一层比较轻薄,上 Java 就显得厚重了。

一些 Serverless 引擎以及类似场景可能会有天然的优势。例如 leancloud 在你做各种事情的时候可以写一些 JavaScript 源码作为补充逻辑,自己解释自己的开发成本通常比你在 Java 层面搞个解析器或者上 V8 之类的研发成本会低一些,而且性能也不错。

IoT 方面也是一个不错的选择,不过我还在观望。

其它方面就是客户端的东西,例如 Electron,NW.js 等,的确会降低客户端软件的开发门槛以及研发效率,毕竟样式什么的直接上 HTML + CSS 了,这个方法比较好,以前就有人这么用了,以前就是 qt 也用了类似的方法。我一直期待会有一个内置 Node.js 的无线终端引擎,而不是 React Native 之类的,也许是因为相较于他们现在的引擎 Node.js 还比较笨重吧。

包括 Cocos2d 之类的也一样,不知道为什么就是不基于 Node.js,可能是那边的开发者不在一个领域,大家都不 care 里面有什么,生态里面能做什么,只要是能写 JavaScript 就够了。

最近在写一个桌面的 2D 游戏引擎的 Node.js 玩具 Wrapper,就想验证一下自己的想法,Node.js 也可以写游戏,而不只能是基于别的运行时的 JavaScript。

Wrapper 在 GitHub 的私有仓库。而 github.com/XadillaX/no… 这个是更小的一个仓库,用于验证通过 Node.js C++ 扩展能搞这么一个 Wrapper 的正确性的小 Demo。

未来如果真有这么一个引擎了,我感觉开发游戏起来会更方便吧,不过这只是我的个人业余爱好而已。

如何成体系地输出技术文章? ─ @lingany

想问下如何成体系地输出技术文章?单篇文章地思路我还是蛮清晰,demo、设计思路、代码分解、完整代码(如果我的思路有问题欢迎指出)

其实先列提纲是比较有必要的。比如我的书,如何写 C++ 扩展,脑图画出来所关联的点就有 Node.js 模块是怎么样的,你要写的话需要安装什么,需要了解 libuv、Chrome V8、NAN、NAPI 等等等等。这些大纲列出来后,针对每一点再继续细化,最后成为一个体系。

然后你就沿着体系中的每一个点线开始写成面就好了。

最后来几个实战部分加深一下印象就好了。

另外,推荐一下一篇当初启发我的一篇文章。写一本技术书籍

大搜车、蚂蚁金服这两个技术团队各自有啥特点? ─ @Kotling

我去年陪朋友参加过你的 Meetup,可以评价在大搜车、蚂蚁金服这两个技术团队各自有啥特点吗

技术团队我只能说是我待过的团队,不代表所有的蚂蚁团队和大搜车团队,而且不代表其他人对团队的看法。

首先一点就是驱动类型变了。在大搜车的时候目标比较明确,而在蚂蚁团队的时候更偏向于自我驱动型,你所要做的事情别人不一定知道,由于不是在业务线,你需要自己思考怎么样去更好地服务于业务线,要花更多时间在这一层面的思考。

而人与人之间的联系也变了,由相对紧密的团体(指的是做的事情非常紧密和有关联,不是团队的私下关系)变成了更相对独立的个体,每个人负责的内容让团队的每个人都有一定的外在联系,需要自己去维护和负责,而在大搜车更偏向于的是内在联系——所以蚂蚁所在的团队相当于对于每个人的能力考验变得更高了,每个人都更需要独当一面。

技术方面,由于大搜车的基础设施虽然很不错,但相较于蚂蚁团队并没有那么完善,所以在各方面的选型或者使用方面会有更大的自由度,比如我可以选择使用 OpenResty + Node.js 来完成一个网关系统,只要乐意,我甚至可以拿 Rust 玩玩并上线;而在蚂蚁这边的团队,由于设施完备,体量也在,所以相对没有设施的各种技术栈会难以在线上进行,相对来说技术栈选择的空间变小了,但是好处就是,开发、运维等一些列操作变简单了。而很幸运的是,我在蚂蚁金服所在的团队就是负责各种前端、Node.js 技术栈基础设施的建设和维护。

总之,排除别的东西不讲,两个团队在技术方面各有优缺点吧。

前端er ,请问未来一两年怎样规划?─ @hehe_coder

前端er ,请问未来一两年怎样规划

说实话,我对“界面展示交互层”的前端不甚了解,也不资深,无法就这一条深度路线给出太好的建议。但是正如我一次知乎 Live《当我们在学 Node.js 时,我们在学什么?》(www.zhihu.com/lives/90721…

「最后,太极生两仪,两仪生四象,四象生八卦,八卦生万物。Node.js 就是万物中的一个,而整个编程界可以比作太极,我们从万物开始学,最后都需要归宗到太极当中去——当我们在学习 Node.js,我们其实就是在学编程,不要把自己局限住了。」

无论你是何种岗位,你始终是一个程序员,而一个程序员最重要的是思维和基础,哪怕工作中不是一定或者经常会用到,思维和基础的提升对你的整个职业生涯都非常有用。比如数据结构、算法、安全、离散数学等等内容,都是在我看来哪怕一个合格程序员不熟练但也至少知道的必备素质。

如果你在这些基础上尚有欠缺,我推荐你在日常工作有条不紊继续下去,新的技能继续习得,架构能力可以提升的前提下,开始补上这些基础。而且这些基础对我前面所说的“工作继续”、“架构提升”以及“新技能 Get”等等方面都会有非常大的帮助。

还是那句话,不要把自己局限住了,这是我的建议,也只代表我个人的观点。

当然,如果你这些能力上已经非常好了,而以我的能力,应该暂时无法在前端路线给出更好的规划了。

javascript和node可以算同一个领域吗?─ @a851870

javascript和node可以算同一个领域吗?还有英语要怎么学习

很多人把 JavaScript 当成前端,实际上它只是 ECMAScript 对应的一套语言,引擎有 V8 等等。而 Node.js 实际上是使用 Node.js 写后端,但是还是很多人觉得它是前端。在这种大环境下,相较而言,我只能接受这种“泛前端”的概念了,就是大后端以前的,都叫“泛前端”,包括给前端提供 RESTful 接口的后端服务。

按照正确的理解来说,JavaScript 领域包含 Node.js 和浏览器前端 JavaScript,以及其它一些别人自己写的用 JavaScript 做的事情,比如 React Native、Cocos2D 等等。

英语怎么学,你让我一个四级压线过的,研究生英语挂过科的人怎么回答呢?

如何在面试中能发挥正常水平?─ @军长

请问如何在面试中能发挥正常水平,经常会发现面试问的问题,其实自己仔细想想是会的,但有些问题总是当时没有get到点或者没回答好。以及想问问同是毕业3年的前端,个人成长有什么好的建议?感谢。

不好意思,恕我直言,从我听你的讲述来看,你面试中如果能答上来属于“超常发挥”。

#其实自己仔细想想是会的,但有些问题总是当时没有 get 到点或者没回答好#

虽然有点不好听,但是我单方面判断,虽然自己知道,但是对这一块领域还是比较不熟悉,或者相对陌生。如果这些题目能答好的确属于“超常发挥”了。

如果想在面试中能“发挥正常水平”,还是推荐在日常开发中或者业余中把该弄会的东西“真”的弄懂弄会,并且追根溯源,而不是一知半解。一知半解很容易给自己造成一个“我其实是知道这个东西的,只是面试时候没答好,没有 Get 到点”的错觉。

但如果我猜测错了,那有可能是面试官问问题的方式或者面试水平有问题。

毕业三年,基本上是属于一个可以有至少一两个新人带的阶段。这个时候主要还是夯实自己的基础,并且弄透彻,这样才能在带人的时候把人家也弄懂。至于基础和思想来说,还是我的另一个回答,多写多思考以及多学习。不要把自己局限在“前端工程师”,而应该是一个“程序员”、“工程师”、“黑客”,甚至是“架构师”,以这个为目标去进步,而不是进步成一个“比现在要厉害的前端工程师”。就跟军队一样,首先是一个“兵”,然后再是各种不同的兵种。


本期 AMA 社区小伙伴提了许多实用问题,感谢死月认真地为掘金小伙伴解答了不少疑问。浏览更多的问答,可以到死月的 AMA 进行阅读和讨论。


死月 AMA 福利:书籍《Node.js:来一打 C++ 扩展》

死月从所有提问中选择 2 个他觉得提问着赠送他的书籍《Node.js:来一打 C++ 扩展》。记得查看评论提醒哟~