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

发布于2019-04-21 20:21:50

这篇文章汇编了 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