ThoughtWorks技术雷达第23卷

2020-10-29 11:04:09

Arrow被提升为Kotlin标准库的功能伙伴。事实上,Arrow提供的现成的高级抽象包已经被证明是如此有用,以至于我们的团队现在认为Arrow在使用Kotlin时是一个明智的默认值。最近,在为1.0版本做准备的过程中,Arrow团队引入了几个更改,包括添加了新模块,但也有一些弃用和删除。

Jest-When是一个轻量级JavaScript库,通过匹配模拟函数调用参数来补充Jest。JEST是测试堆栈的优秀工具;JEST-WHEN允许您期待模拟函数的特定参数,从而使您能够编写具有许多依赖项的模块的更健壮的单元测试。它易于使用,并为多个匹配者提供了很好的支持,这就是为什么我们的团队在这个空间中默认选择嘲笑时会开玩笑的原因。

在需要在Node.js中实现的情况下,我们看到Fastify是我们团队非常满意的选项。此Web框架提供了轻松处理请求-响应验证的功能、对TypeScript的支持以及一个插件生态系统,让我们的团队在开发软件时有了更轻松的体验。虽然这在Node.js生态系统中是一个很好的选择,但我们坚持我们之前的建议:不要陷入Node过载的情况。

随着单页JavaScript应用程序复杂度的增加,状态的可预测性管理变得越来越重要。不变性可以帮助确保我们的应用程序行为一致,但不幸的是,JavaScript没有提供内置的深度不可变的数据结构(参见ES记录和元组提案)。IMMER(一直都是德语)是一个很小的包,它允许您以更方便的方式处理不变的状态。它基于写入时复制机制,具有最少的API,并可在普通JavaScript对象和数组上操作。这意味着在向现有代码库引入不变性时,数据访问是无缝的,不需要大量的重构工作。我们的许多团队现在在他们的JavaScript代码库中使用它,并且更喜欢它而不是Immutable.js,这就是为什么我们要将它转移到试验阶段。

我们已经决定将Redux移回试用圈,以表明我们不再将其视为Reaction应用程序中状态管理的默认方法。我们的经验表明,Redux在许多情况下仍然是一个有价值的框架,但与其他方法相比,它也会导致代码更冗长、更难理解。把Redux Sagas加入其中通常会使这个问题变得更加复杂。作为替代方案,您通常可以使用Reaction的最新版本中的功能来有效地管理状态,而不需要额外的框架。然而,我们想要强调的是,当您的简单状态管理解决方案开始变得复杂的时候,也许最终还是值得使用Redux,或者甚至是Facebook最近发布的Redux。

Rust编程语言越来越受欢迎,并连续五年被开发人员评为最受欢迎的Stack Overflow语言。我们也喜欢它。它是一种快速、安全和富有表现力的语言,随着其生态系统的发展,它的实用性也在不断增加。例如,Rust开始用于数据科学和机器学习,可以显著提升性能。此外,MATERIALIZE是一个用Rust编写的面向流的低延迟数据库。

Single-SPA是一个JavaScript框架,用于将多个微前端整合到单个前端应用程序中。虽然我们建议不要出现微前端无政府状态,但使用微前端作为混合和匹配多个框架的借口,单SPA正是支持这一点。我们理解,在需要跨多个框架集成的情况下,有一些合理的情况,比如跨多个微前端升级到框架的新版本。Single-SPA已经成为我们团队微前端集成的首选框架,他们发现它可以很好地与SystemJS配合使用,并且可以管理单个依赖项的不同版本。

Kotlin生态系统在不断发展,越来越多的库正在利用Kotlin语言的特性来取代它们的Java替代品。Strikt是一个断言库,它允许您以非常流畅的风格编写测试断言。它使用块和lambdas等Kotlin特性来帮助您在保持可读性的同时减少测试的冗长。Strikt还支持构建自定义断言,这可以使您的测试更加特定于域。

我们以前在雷达中使用过几个状态管理库,但是XState采取了稍微不同的方法。它是一个简单的JavaScript和TypeScript框架,用于创建有限状态机并将其可视化为状态图。它与更流行的反应式JavaScript框架(Vue.js、Ember.js、React.js和RxJS)集成,并基于有限状态机的W3C标准。另一个值得注意的特性是机器定义的序列化。我们发现在其他上下文中创建有限状态机时(特别是在编写游戏逻辑时),有一件事很有用,那就是可视化状态及其可能的转换的能力;我们喜欢使用XState的可视化工具很容易做到这一点。

几年前,当我们写到虚拟现实超越游戏时,我们没有预测虚拟现实解决方案会以多快的速度和在多大程度上出现在视频游戏以外的领域。事后看来,我们当然看到了人们的兴趣和采用率的增长,但接受的速度比我们中的一些人预期的要慢。其中一个原因可能是工具。Unity和Unreal是开发VR应用的两个非常成熟和强大的引擎。我们还突出显示了戈多。然而,这些引擎与大多数Web和企业团队所熟悉的完全不同。随着我们继续探索,我们意识到基于网络的虚拟现实解决方案已经有了很长的路要走,我们对巴比伦.js有了积极的体验。使用TypeScript编写并在浏览器中呈现其应用程序的Babylon.js为许多开发团队提供了熟悉的体验。此外,Babylon.js是开源软件,成熟且资金雄厚,这使得它更具吸引力。

虽然JavaScript及其生态系统在webUI开发领域占据主导地位,但随着WebAssembly的出现,新的机会正在打开。我们认为Blazor是使用C#构建交互式WebUI的一个有趣的选择。我们特别喜欢这个开源框架,因为它允许在WebAssembly之上的浏览器中运行C#代码,利用.NET标准运行时和生态系统,以及用这种编程语言开发的定制库。此外,如果需要,它还可以与浏览器中的JavaScript代码进行双向互操作。

颤振驱动器是一个用于颤振应用的集成测试库。使用颤振驱动程序,您可以在真实设备或仿真器上检测和驱动测试套件。我们的团队继续编写单元和小部件测试,以确保颤动应用程序中的大部分业务功能得以实现。但是,为了测试实际的用户交互,我们正在评估颤动驱动程序,您也应该这样做。

尽管我们大力提倡将安全策略定义为代码,但该领域的工具相当有限。如果您正在使用HashiCorp产品(如Terraform或Vault),并且不介意为企业版付费,您可以选择使用HashiCorp Sentinel。实际上,Sentinel是一种完整的编程语言,用于定义和实现基于上下文的策略决策。例如,在Terraform中,它可用于在应用基础设施更改之前测试是否违反策略。在Vault中,可以使用Sentinel来定义API的细粒度访问控制。这种方法具有高级编程语言提供的封装性、可维护性、可读性和可扩展性的所有优点,为传统的声明性安全策略创建了一个有吸引力的替代方案。Sentinel与Open Policy Agent属于同一类工具,但它是专有的、闭源的,只能与HashiCorp产品一起使用。

Hermes是一个JavaScript引擎,针对在Android上快速启动Reaction Native应用程序进行了优化。诸如V8之类的JavaScript引擎具有即时(JIT)编译器,可以在运行时分析代码以生成优化的指令。然而,Hermes采取了一种不同的方法,提前将JavaScript代码(AOT)编译成优化的字节码。因此,您可以获得更小的APK映像大小、更少的内存消耗和更快的启动时间。我们正在仔细评估几款反应原生应用程序中的爱马仕,并建议您也这样做。

我们真的很喜欢使用打字脚本已经有一段时间了,我们喜欢强打字提供的安全性。但是,将数据放入类型系统的边界(例如从调用到后端服务)可能会导致运行时错误。一个帮助解决此问题的库是io-ts。它通过提供编码和解码功能,在编译时类型检查和外部数据的运行时消耗之间架起了桥梁。它还可以用作自定义类型的保护。根据我们团队的说法,对于一个无赖的问题来说,这是一个优雅的解决方案。

在过去,我们已经讨论过在数据科学项目中应用好的工程实践的改进工具。凯德罗是这个领域的另一个很好的补充。它是数据科学的开发工作流框架

自从我们在2014年第一次写关于Web组件的文章以来,已经取得了稳步的进展。LitElement是聚合物项目的一部分,它是一个简单的库,您可以使用它来创建轻量级Web组件。它实际上只是一个基类,它消除了对许多通用样板的需要,使得编写Web组件变得容易得多。我们已经在项目中使用它取得了初步的成功,我们很高兴看到这项技术的成熟。

Web应用程序,特别是那些为企业内部使用编写的应用程序,通常由两部分编写。用户界面和一些业务逻辑在Web浏览器中运行,而业务逻辑、授权和持久性在服务器上运行。这两部分通常通过HTTP上的JSON进行通信。端点不应该被误认为是真正的API;它们只是跨两个运行时环境拆分的应用程序的实现细节。同时,它们提供了有效的接缝来单独测试各个部分。在测试JavaScript部分时,服务器端可以通过诸如mount bank之类的工具在网络级别进行存根和模拟。另一种方法是在浏览器中拦截请求。我们喜欢模拟服务工作者采用的方法,因为对于服务工作者,它使用开发人员熟悉的抽象。这种方法使设置更简单,测试执行更快。但是,因为这些测试不测试实际的网络层,所以您需要实现一些端到端测试,作为健康测试金字塔的一部分。

越来越多使用Reaction的团队正在重新评估他们的状态管理选项,我们在重新评估Redux时也提到了这一点。现在,Facebook--Reaction的创建者--发布了RECOIL,这是一种新的管理状态的框架,它出自一个必须处理大量数据的内部应用程序。尽管我们目前对反冲没有太多的实际经验,但我们看到了它的潜力和前景。该API简单易学,感觉像是惯用的反应。与其他方法不同,RECOIL提供了一种在应用程序间共享状态的高效而灵活的方式:它支持派生数据和查询动态创建的状态,以及应用程序范围内的状态观察,而不会影响代码拆分。

现代的ML模型非常复杂,需要大量的标注训练数据集来学习。Snorkel在斯坦福人工智能实验室开始时意识到,手动标记数据非常昂贵,而且往往是不可行的。Snorkel允许我们通过创建标记函数以编程方式标记训练数据。Snorkel使用有监督的学习技术来评估这些标注函数的准确性和相关性,然后对它们的输出标签进行重新加权和组合,从而获得高质量的训练标签。自那以后,Snorkel的创建者们推出了一个名为Snorkel Flow的商业平台。虽然Snorkel本身不再被积极开发,但它在使用弱监督方法来标记数据方面的想法仍然意义重大。

Streamlitt是数据科学家用Python开发的开源应用程序框架,用于构建美观的数据可视化应用程序。Streamlight在Dash等竞争对手中脱颖而出,它专注于快速原型制作,并支持广泛的可视化程序库,包括Ploly和Bokeh。对于需要在实验周期内快速展示的数据科学家来说,Streamlight是一个可靠的选择。我们正在几个项目中使用它,喜欢我们如何用很少的努力就能将交互式可视化组合在一起。

我们继续看到新的前端JavaScript框架,Svelte作为一个很有前途的新组件框架脱颖而出。与其他利用虚拟DOM的框架不同,Svelte将您的代码编译成普通的、无框架的JavaScript代码,从而直接更新DOM。然而,它只是一个组件框架;如果您计划构建功能丰富的应用程序,请考虑与Svelte一起评估Sapper。

SWR是一个Reaction Hooks库,用于获取远程数据。它实现了过时并重新验证HTTP缓存策略。SWR首先从缓存返回数据(陈旧),然后发送获取请求(重新验证),最后使用最新响应刷新这些值。组件不断地、自动地接收数据流,先是陈旧的,然后是新鲜的。我们的开发人员使用SWR获得了良好的体验,极大地改善了始终将数据显示在屏幕上的用户体验。但是,我们提醒团队仅在适当的情况下才使用SWR缓存策略,以便应用程序返回陈旧数据。请注意,HTTP要求缓存使用适合于请求的最新响应来响应请求,并且只有在经过仔细考虑的情况下才允许返回过时的响应。

测试库是一系列用于测试众多框架中的应用程序的软件包