写点什么

在 2019 年,如何成为更好的 Node.js 开发者?

  • 2018-12-25
  • 本文字数:4472 字

    阅读完需:约 15 分钟

在2019年,如何成为更好的Node.js开发者?

这篇文章汇编了 19 项在 2019 年可能会很有价值的技能和主题。但请不要感觉到有任何压力——我和其他大多数开发者也并非对每一个主题都很熟悉。我只是觉得这些东西应该值得我们关注,而且 JavaScript 生态系统的发展本来就永无止境。

1. 增加类型和模式——TypeScript 是 2019 年的一个非常好的候选项

事实证明,无类型编码不仅效率不高,而且容易出错。但这并不意味着你一定要使用严格的类型语法,你可以根据实际情况选择类型的严格程度,比如使用 JSON SchemaJoi来验证实体和模型,或者用静态类型来注解 JS(请参考 https://github.com/facebook/flow ),或者使用全类型的 TypeScript。


TypeScript 在 2018 年取得了显著的进展,似乎已经进入了 Node 领地。如果你计划使用 TypeScript,那么应该问一下自己,你是否只是想要使用它的类型功能,如果也要使用接口和抽象类,那么可能需要学习新的编程范式。

2. 丰富你的 linter

linter 实际上是免费的午餐,只需要 5 分钟的设置,就可以免费获得自动代码保护,并在输入代码时发现重大问题。认为 linting 只是花拳绣腿的日子已经一去不复杂了。如今,linter 可以捕获严重的代码问题,例如错误没有被正确抛出、丢失信息、没有完成的 promise,以及其他你从未真正想要留在代码中的错误。

3. 更多的 Java 和更少的 Ruby——加深你的架构知识

有关 NodeJS 生态系统的架构和设计方面的知识并不多,每个人都在谈微服务,但只谈到了一些内部结构。因此,大多数应用程序和示例都是基于 MVC 概念以及一些来自 Ruby 的其他模式。这有什么问题?MVC 适用于构建内容服务,但在构建健壮的后端方面差强人意。你可以用两个类——Controller 和 Model 来描述你的整个业务逻辑、规则、数据访问、与其他微服务的通信吗?


我绝对不建议采用重量级的 Java/Spring 模式(所以我们才会来到 Node 的领地,不是吗?),而是选择一些能够提供价值却不会牺牲应用程序简单性的想法。

4. 计划如何利用 Async Hook 来获得更好的跟踪和上下文

单线程模型有一个缺点——请求会丢失上下文:当它们流经多个文件并执行异步操作时,变量在整个生命周期中不会被保留。为什么这个很糟糕?例如,开发人员通常希望在每个日志条目中包含唯一标识符,以便稍后可以关联同一请求的所有日志条目——在 2018 年实现这个并不是很容易。


2019 年将会有新的东西出来,Async Hook 就是其中之一(不是全新的特性,但很快就会结束实验阶段)——简单地说,这是一种在异步操作开始和结束时随时注入自定义代码的机制。这样就可以关联同一请求的所有代码并保留上下文。这为很多自定义程序包奠定了基础,这些程序包将 Node 的跟踪和上下文能力提升到了一个新的水平。

5. 了解最新的“Serverless”

注意:这里将 FaaS 和 Serverless 这两个词互换使用,尽管它们并不完全相同。


最初,FaaS 用于微任务的开发,而不是用于“微服务”应用程序。随着它们受欢迎程度越来越高,云供应商的胃口也越来越大,很快,新功能开始堆叠起来,到了 2019 年,它似乎变成了强大的应用程序基础设施。


它现在可以与 Kubernetes 展开竞争并为大型应用程序提供服务吗?有些人认为 Serverless 和 FaaS 是正交技术,但实际上,2019 年的每一个新的云应用程序都必须选择三者中的一个:裸机实例(如 EC2 或 GCP 计算)、Kubernetes 或 FaaS。因此,了解 K8S 和 FaaS/Serverless 并知道它们之间的区别将成为一项必备的设计技能。

6. 了解最新的 JavaScript 特性

我并不是一个只顾追求每一个语言新特性的狂热粉丝,有时候,这些闪亮的玩具会违背代码的简单性原则。一些真正有价值的 JavaScript 特性会随着时间沉淀下来(比如两年前引入的 async/await),所以 TC39 提案列表node.green值得一探究竟。

7. 熟悉至少一种 API 技术——GraphQL 是 2019 年的一个很好的候选项

REST 风格的 API 与它的设计目标相得益彰:可以很好地控制实体的修改和查询。假设你有一个财务记录系统,你可能希望设计非常严格的端点,即单个显式数据模型。然而,在其他非常常见的场景中,REST 表现不足,比如执行一系列可能返回不同数据集的查询、需要最小化 API 有效载荷的低带宽网络、强调速度的机器到机器通信,等等。那么是否应该换成其他的?当然不是,你可以选择混合使用。API 并不是架构,它们只是应用程序的端口(即入口点),并且多种 API 样式可以共存,甚至是在单个 Web 框架之上,如 Express。


那么要学习哪一个?你最好的选择可能是 GraphQL,它正在成为主流。它的生态系统已经非常成熟,可以提供非常流行的用例,如动态搜索和层次数据源。另一方面,gRPC 仍然是一种适用于服务器到服务器间通信的小众技术,因为其开销非常小(例如用于 Pub-Sub/ 消息队列系统)。

8. 超越单元和集成测试

你已经对测试金字塔、单元、集成和端到端测试很熟悉了?很好,这些是成功测试策略的基础。在过去的 10 年中,开发领域发生了巨大的变化,但测试模型几乎保持不变,于是我们不禁想知道如何测试像微服务、丰富的前端和 Serverless 这样的东西。一些现代技术与传统技术栈相辅相成,有时候甚至可以替换它们,以便实现更精简的测试策略,获得更高的投资回报率。

9. 在监控中遵循 SRE/DevOps 最佳实践

2019 年,即使是一个中型应用程序也可能包含数十个移动部件。然而,大多数开发人员没有花心思去学习由 SRE 工程师教给他们的监控和警报方面的知识。例如,开发人员通常会优先考虑并专注于 CPU 和内存等内部硬件指标,而不是去考虑会直接影响最终用户体验的指标,例如错误率或延迟。这些面向客户的指标有时候被称为“黄金信号”,而在 2019 年,你可能希望从关注这些指标开始,并采用类似的最佳实践。

10. 像攻击者一样思考:通过学习攻击工具和技术来提高安全级别

如果你不能像攻击者那样思考,也就无法像防守者一样思考。2019 年,你不应该将防御工作外包给第三方公司或只依靠静态安全扫描程序:攻击类型的数量非常之多,应用程序发生变更的速度是不可控的——在开展安全研讨会两天之后,团队有可能又添加了几个新的 AWS 服务、数据库类型和新的 IAM 角色……因此,开发人员其实是最大的隐含威胁,教育他们似乎是最终的补救措施。你必须将安全 DNA 根植到你自己和团队中,并为所有东西添加安全保护。


当你开始这么做之后,事实证明,安全问题并不没有那么可怕。你只需熟悉常见的攻击类型和工具,画出应用程序架构和流程,并想想你自己会如何攻击它。随着时间的推移,在不知不觉中,你将在做出每个设计决策和编写每一行代码时考虑安全问题。

11. 制定包更新策略

2018 年的教训:过早更新可能很危险。一个团队通常会使用这两个包更新策略中的一种:一个是尽快更新,有时甚至使用自动化流程。一个是根本没有更新策略,有时候是看心情进行更新。虽然第一种方法似乎更好,但令人惊讶的是,它在 2018 年成为最危险的方法:在 40 天之内,社区就发现了好多个恶意包事件,如 flat-stream,那些在等待或没有进行更新的人反而平安无事。可以考虑使用自动化工具正式化更新策略,并找到不更新和更新之间的最佳平衡点。

12. 进行渐进式安装,将部署和发布阶段分开

2019 年,你可能会发现进行更安全的部署非常重要,也就是不一次性推出到所有的生产环境,然后让你的小心脏像锤子一样砰砰跳。进行细粒度部署(也就是金丝雀部署)可以分为 3 个阶段:部署——将新代码发送到隔离的新生产环境(例如新的 Kubernetes 服务或新的机器实例)。在这个阶段,它不为实际用户提供服务,所以没有什么可担心的。测试——现在有少数人可以使用生产环境的实例,并测试新代码。发布——逐步允许更多的用户使用新版本,在你有足够的信心后,可以下架旧版本。


需要注意的是:进行全面的金丝雀部署在 2019 年仍然是非常昂贵的,因为它需要协调很多基础设施部件,如路由和监控。因此,请考虑从简单和半手动金丝雀部署开始(例如根据监控指标手动启动更多部署了新版本的主机)。

13. Kubernetes 正在吃掉这个世界

有一个很明显的趋势:Kubernetes(K8S),一个为应用程序组件提供网络、横向扩展、部署和其他骨干服务的基础设施,现在几乎是托管应用程序的事实标准。它的受欢迎程度是非常惊人的:在所有云供应商的支持下,拥有无与伦比的扩展生态系统,54%的企业已经拥有至少一个 K8S 集群。


如果你是初学者,这里提供了一个很好的入门概述。同时也请了解 Istio、K-Native、Kuberenes 作业、网络政策、Helm、Scaffold。一句话:你花在加深了解 K8S 技能上的时间最终会给你带来回报。

14. 区块链技术提供了一些很好的机会

一个很明显的趋势:区块链不只是用于比特币和加密功能,它也可以用于任何分布式事务性系统。

15. 获得机器学习技能,至少有一定的谈资

一个很明显的趋势,可惜的是,我对机器学习库一无所知,我的 2019 年目标至少是能够说出一些有关机器学习的东西,并能够找出快速获胜的机会(例如像 tensorflow.js 和 brain.js 这样的 JS 库可以在没有强大的基础设施的情况下提供一些见解)。

16. 了解其他开源库代码

注意,长时间在一个项目中使用同样的技术可能会让你的视野变窄,并隐藏了很多替代方案。所以,努力去了解更多其他的项目,主要是成功的开源项目。

17. 深化对 Linux 操作系统的理解,重点关注 Linux 进程方面的东西

了解 Linux 进程将会让你获得真正的竞争优势,因为它会影响很多开发任务,如监控、保护进程、使用 Docker、优雅地关闭等其他任务。努力了解进程、信号、权限模型、常用命令、进程类型,等等。

18. 深入了解 Node.js 内部

我真的很喜欢 Ryan Dahl(Node.js 原始作者)讲的一句话:“你不可能理解所有的东西。但是,你应该让自己去了解系统”。当你需要处理令人头疼的生产环境问题或设计一些基础设施组件(例如监控事件循环性能)时,对底层机器的深入了解被证明是有价值的。你可能已经熟悉了 v8 和 libuv 等核心构建块。


那么 2019 年是深入了解 Node.js 的好时机,例如,了解每个 libuv 事件循环周期内究竟发生了什么?或者可以了解与操作系统 IO 的交互是如何进行的(例如活动句柄)?

19. 学习使用科学的方法

你学到的和内化的东西将塑造你未来的职业生涯。然而,很多开发人员既没有学习策略,也没有学习如何使用科学的方法进行有效的学习。


在一个关于“防止 JavaScript 类型错误”的会议上,VP 要求继续使用 JavaScript 而不重构整个代码库(不使用 TypeScript……),突然你的一位同事建议使用 Facebook Flow,房间里的每个人都表示赞同!你突然想起你曾经看到过有关它的文章,但它从来没有被你内化,只是在你的脑海中一闪而过。


这是怎么回事?


显然,有一种叫作“竞争幻觉”的现象解释了为什么我们会忘记这些东西:你可能花了 1 个小时阅读一篇博文,但在几天之内就不记得了!研究表明,如果你稍后尝试与某人说起这些东西,或者在第二天再次阅读文章摘要,就可以大大提高记忆成功率。当然,还有其他各种技巧可以帮助你在正确的时间记住并获取正确的知识。花几个小时学习如何学习可以为你的职业生涯带来很大的帮助!

英文原文:

https://medium.com/@me_37286/19-ways-to-become-a-better-node-js-developer-in-2019-ffd3a8fbfe38


2018-12-25 10:283444
用户头像

发布了 731 篇内容, 共 462.6 次阅读, 收获喜欢 2005 次。

关注

评论 1 条评论

发布
暂无评论
发现更多内容

Python代码阅读(第32篇):随机返回列表中的一个元素

Felix

Python 编程 Code Programing 阅读代码

点击量破百万!阿里内产微服务进阶讲义,简直是Java开发者的福音

Java 编程 架构 面试 程序人生

这篇阿里扫地僧所写关于SpringCloudAlibaba的笔记真香!

Java 架构 面试 程序人生 编程语言

项目管理中常见的十个问题

石云升

项目管理 管理 引航计划 内容合集 10月月更

【LeetCode】 第三大的数Java题解

Albert

算法 LeetCode 10月月更

0 基础架构入门 - 5(微博评论的高性能高可用计算架构)

felix

架构实战营 0 基础架构入门

【Spring源码分析】带你正视一下Spring祖容器之BeanFactory的原理与功能分析(1)

码界西柚

spring 容器 spring源码 BeanFactory 10月月更

NodeJs 全栈创建多文件断点续传

devpoint

大前端 upload 引航计划 10月月更

【Vuex 源码学习】第七篇 - Vuex 的模块安装

Brave

源码 vuex 10月月更

架构实战营 模块九(毕业设计) 作业

一雄

作业 架构实战营 毕业设计 模块九

架构实战营模块9作业

喻高咏        

架构实战营

美团大佬的Java性能调优实战手册,上线当天 下载量破百万!

Java 编程 架构 程序人生

阿里内部“SpringCloudAlibaba学习笔记”全彩第三版开源

Java spring 架构 面试 微服务

阿里巴巴《Java权威面试指南(全彩版)》来袭,冲击“金九银十”有望了

Java 程序员 架构 面试 后端

6. python 查漏补缺,namedtuple 命名元组,双向队列 deque,Counter 计数器,可排序字典

梦想橡皮擦

10月月更

代码要写注释了吗?

HelloWorld杰少

领航计划

新技术|基于信号特征的语音编码器Lyra Android实践

轻口味

android 音视频 引航计划 10月月更

《Go 开发指南》-快速安装 Go 环境

看山

Effective-go 10月月更

【Flutter 专题】37 图解 Flutter 基本动画 (二)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 10月月更

Jupyter Notebook从入门到精通,TensorFlow一个计算机视觉示例 易筋 ARTS 打卡 Week 68

John(易筋)

ARTS 打卡计划

Netflix实用API设计(上)

俞凡

架构 netflix API 大厂实践 10月月更

不愧是阿里巴巴内部Spring Boot实战文档,这细节讲解,神了

Java spring 架构 面试 微服务

“区块链+政务”纵深发展 链上共识提升服务效能

CECBC

起飞!这份技术点拉满的ELk+Lucene笔记,可能价值百万

Java 架构 面试 程序人生 编程语言

架构实战营 - 模块九作业

Julian Chu

架构实战营

008云原生之Serverless架构

穿过生命散发芬芳

云原生 10月月更

架构实战营模块 8 作业指导

华仔

架构实战营

私有云部署系列之动态IP获取(前期准备)

稻草鸟人

Python 私有云

Web安全应急响应小记

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 应急响应

白月光与朱砂痣-Flannel略糙,Cilium太美

Lance

Netflix实用API设计(下)

俞凡

架构 netflix API 大厂实践 10月月更

在2019年,如何成为更好的Node.js开发者?_大前端_Yoni Goldberg_InfoQ精选文章