Thoughtworks第26期技术雷达——语言和框架

2022-04-29 14:03:15 浏览数 (1)

采纳

SwiftUI

对于在苹果生产的各种设备上实现用户界面来说,苹果在几年前推出SwiftUI是一个很大的进步。从一开始,我们就喜欢Combine提供的声明式的、以代码为中心的方法和反应式编程模型。但我们注意到,在苹果提供的XCUITest自动化框架下,仍需使用模型-视图-视图模型(MVVM)模式编写大量的视图测试,并不是非常合理。这个缺陷已经被ViewInspector所弥补。最后一个障碍是所需的最低操作系统版本。在发布时,只有最新版本的iOS和macOS可以运行用SwiftUI编写的应用程序,但由于苹果的定期更新,SwiftUI应用程序现在几乎可以在所有接受安全更新的macOS和iOS版本上运行。

Testcontainers

根据长期使用 Testcontainers 的经验,我们认为它是创建可靠的环境来运行自动化测试的默认选项。Testcontainers 是一个拥有多种语言版本 的库,并且 docker 化了常见的测试依赖——包括了不同种类的数据库,队列技术,云服务和 UI 测试依赖(例如 web 浏览器),还具有按需运行自定义 Dockerfile 的能力。它与类似 JUnit 的测试框架兼容,而且足够灵活,可以让用户管理容器的生命周期和高级网络,并迅速建立一个集成测试环境。我们的团队一直认为这个可编程的、轻量级的、一次性的容器库可以使功能测试更加可靠。

试验

Bob

在使用 React Native 构建应用时,有时你会发现不得不创建自己的模块。例如,我们在为 React Native 应用程序构建一个 UI组件库时就遇到了这种需求。创建这样一个模块项目并不简单,但我们的团队成功地使用 Bob 来自动化实现了这一任务。Bob 提供了一个命令行界面来为不同的构建目标创建脚手架。这个脚手架并不限于核心功能,还可以选择性地包括示例代码、代码检查工具、构建流水线和其他功能。

Flutter-Unity widget

Flutter 在构建跨平台移动应用方面越来越受欢迎, Unity 非常适合于构建增强现实(AR)和虚拟现实(VR)体验。而Flutter-Unity widget则是整合 Unity 和 Flutter 的一个关键组件。它允许开发者在 Flutter widget 内嵌入 Unity 应用。该插件提供的重要能力之一是能够提供 Flutter 和 Unity 之间的双向通信。我们发现它的性能也相当不错,我们期待在更多的 Flutter 应用中使用 Unity。

Kotest

Kotest(原名 KotlinTest )是 Kotlin 生态中的一个独立测试工具,它在我们团队各式各样的 Kotlin实现(原生、JVM 或 JavaScript)中越来越受到关注。Kotest 的主要优点在于它提供了丰富的测试风格来构建测试套件,其中还有一套全面的匹配器,可以帮助你使用优雅的内部领域专用语言(DSL)编写表达式测试用例。Kotest 除了支持基于属性的测试(一项我们在以前的技术雷达中提到过的技术)之外,我们团队还看好它可靠的 IntelliJ 插件以及来自于社区的持续支持。

Swift 包管理器

一些编程语言,尤其是较新的编程语言,内置了包和依赖管理解决方案。当 Swift 在 2014 年被推出的时候,它并没有附带包管理器,所以 macOS 和 iOS 开发者社区只能继续使用为 Objective-C 创建的第三方解决方案 CocoaPods 和 Carthage。几年后, Swift Package Manager(SwiftPM)作为一个苹果的官方开源项目被推出。那之后又过了几年,苹果才在 Xcode 中添加了对它的支持。尽管如此,在那时,许多开发团队仍在继续使用 CocoaPods 和 Carthage,主要是因为许多软件包根本无法通过 SwiftPM 获得。既然现在大多数包已经被添加在了 SwiftPM 中,并且对于包的创建者和使用者来说,流程都被进一步地简化了,我们的团队也自然地越来越依赖 SwiftPM。

Vowpal Wabbit

Vowpal Wabbit 是一个多用途的机器学习库。Vowpal Wabbit 最初是雅虎研究院于十多年前创建的,如今它依然在持续实现新的强化学习算法。我们想要特别提及的是 Vowpal Wabbit 9.0,它是六年后的一个主要版本,同时鼓励你规划 迁移 ,因为它拥有数个可用性改进,新降维算法和错误修复。

评估

Android Gradle 插件 - Kotlin DSL

Android Gradle 插件 Kotlin DSL 增加了 Gradle 构建脚本对 Kotlin Script 的支持,让它成为除 Groovy 之外的另一种选择。用 Kotlin 代替 Groovy 的目的在于 Kotlin 能更好得支持重构,并且在IDE里编写它更加简便,最终能够产出更易于阅读和维护的代码。对于已经在使用 Kotlin 的团队来说,这还意味着可以用更熟悉的语言编写构建脚本。我们曾经有一个团队在几天之内就对一份至少有七年、长达 450 行的构建脚本完成了迁移。如果你有一份庞大或者复杂的 Gradle 构建脚本,那么 Kotlin Script 值得一试,看看它是否会对你的团队产生帮助。

Azure Bicep

Azure Bicep 是一种使用声明式语法的领域特定语言 (DSL),主要面向那些喜欢使用比 JSON 更自然的语言来编写基础设施代码的人。它支持可重用参数化模板来实现模块化资源定义。它有 Visual Studio Code 插件 为其提供实时类型安全、智能感知和语法检查的功能,并且它的编译器允许双向转换 ARM 模板。Bicep 面向资源的 DSL 以及与 Azure 生态系统的原生集成使其成为 Azure 基础设施开发人员的不二之选。

Capacitor

我们争辩跨平台移动开发工具的优点几乎与我们发布技术雷达的时间一样长。在2011年发布 cross-mobile platforms 时,我们首次注意到新一代工具的诞生。尽管我们最初对其持怀疑态度,然而这些工具在近些年逐渐被完善并被广泛采用。React Native 经久不衰的人气和用处是毫无争议的。Capacitor 是以 PhoneGap 为起源,之后被重命名为 Apache Cordova 的系列工具的最新一代。Capacitor 将 Ionic 完全重写并让独立应用拥抱 渐进式网页应用 风格。迄今为止,我们的开发者喜欢这种用单一代码库统一管理网页、 iOS 和 Android 应用代码的方式,他们还可以按需访问原生 API 分别管理各个原生平台。尽管 React Native 已经坐拥多年的跨平台经验, Capacitor 还是为跨平台提供了一种额外选择。

Java 17

我们通常不会专门介绍某一语言的新版本,但我们还是想关注一下 Java 新的长期支持 (LTS) 版本—— Java 17。尽管出现了前景不错的新特性,比如模式匹配等预览特性,但其实向新 LTS 版本升级的方案更应该吸引各个组织的兴趣。我们建议各个组织在 Java 有新的发布时对其进行评估,确保能够恰当地适配这些新特性和版本。尽管定期更新有利于简化开发并且方便管理,但许多组织却意外地并不经常更新语言的版本。希望通过 LTS 版本的升级以及开发团队对语言的定期更新,能够使生产软件免于因为“更新成本太高”而一直困在 Java 的过时版本上。

Jetpack Glance

Android 12 对应用小部件做了重大更改,从而改善了用户和开发人员的体验。对于编写常规的 Android 应用程序,我们已经表达了对 Jetpack Compose 作为以一种现代方式来构建原生用户界面的偏好。现在,借助构建在 Compose 运行时之上的 Jetpack Glance,开发人员可以使用类似的声明式 Kotlin API 来编写小部件。最近,Glance 已被扩展以支持在Wear OS中构建Tiles。

Jetpack Media3

现如今安卓拥有多个媒体 API:Jetpack Media(也被称为 MediaCompat ),Jetpack Media2 和 ExoPlayer。然而,这些库都是分别开发的,它们的目的不同但是功能重叠。这就导致安卓开发者在编码的时候不仅需要斟酌类库的选型,当使用的特性来自于多个库的时候,还需要编写适配器或者兼容代码。Jetpack Media3 尝试去解决上述情况。它是从现有 API 中选取通用的功能——包括 UI、播放和媒体会话处理,然后将它们合并和改进成一个新的 API。Mediia3 目前仍处于早期开发版本。此外,ExoPlayer 的播放器界面也进行了更新、增强和简化,被用作 Media3 的通用播放器界面。

MistQL

MistQL 是一个在类 JSON 结构上执行计算的小型领域特定语言。MistQL 最初的设计是用于在前端手动提取机器学习模型的特征,而如今它有了能够运行在浏览器端的 JavaScript 实现版本以及能够运行在服务器端的 Python 实现版本。我们非常喜欢 MistQL 的简洁组合函数式语法,并建议你根据需要进行试用。

npm工作区

在 node.js 的世界里,许多工具都支持多包开发,而 npm 7中加入了 npm工作区 来直接支持此特性。将相关联的包集中管理可以让开发更加便利,比如你可以在一个代码仓库中存储多个相关的库。应用 npm 工作区后,一旦你在顶级的 package.json 文件中添加配置,引入了一个或多个嵌套的 package.json 文件,像 npm install 这样的命令就可以跨多个包使用,依赖的源包会符号链接到根目录的 node_modules 路径下。其他的 npm 命令也可以作用于工作区,例如,你可以只用一条命令在多个包中执行 npm run 和 npm test命令。这种开箱即用的灵活性减少了一些团队对于其他包管理器的需要。

Remix

我们见证了浏览器从服务器端渲染到单页应用的变迁,而如今的 Web 开发似乎又回到了两者中间。Remix 就是这样一个例子。Remix 是一个全栈 JavaScript 框架,它并没有使用笨拙的静态构建,而是通过利用分布式系统和本地浏览器两者的特点一起来加快页面的加载速度。它分别对嵌套路由和页面加载进行了部分优化,这使得页面渲染看起来特别快。Remix 与 Next.js 的定位十分相似,很多人也会将它们放在一起比较。我们很高兴地看到,这些框架可以巧妙地将浏览器渲染与服务器端渲染结合起来,从而提供更好的用户体验。

ShedLock

有一种很常见的需求,是在分布式处理器集群上执行一次定时任务,且只执行一次。例如处理一批数据,发送一条通知,或者执行某个常规的清理操作,都属于这类情况。但是谁都知道这个问题很难,一组处理器如何通过有延迟而且不稳定的网络来实现稳定的协作?这就需要在集群中存在某种锁定机制,来协调这些操作。幸好有很多分布式存储可以实现这种锁定,ZooKeeper 和 Consul 等系统,以及 DynamoDB 或 Couchbase 等数据库都有必要的底层机制来管理集群内部的一致性。ShedLock 是一个小型类库,如果你正在尝试用 Java 来实现自己的定时任务,它可以使你的代码更方便地和上述工具集成。ShedLock 有获得和释放锁的 API,还有各种连接器,可以适配不同工具的锁。如果您正在编写自己的分布式任务,但是不想使用 Kubernetes 这种复杂的重量级平台,ShedLock 值得一试。

SpiceDB

SpiceDB 受谷歌 Zanzibar 启发,是一个用于管理应用程序权限的数据库系统。你可以通过 SpiceDB 创建一个数据模式以对你的权限需求进行建模,并使用客户端库将创建的模式应用到任何一个受支持的数据库中;你也可以向数据库中插入数据,并高效地检索问题的答案,例如查询 "这个用户有权访问某个资源吗?",或者相反的问题:"这个用户有哪些资源可以访问?" 通常,我们提倡将授权策略与代码分离开,但 SpiceDB 更进一步,将数据与策略分离并将其以图的形式进行存储,以高效地应答授权信息的查询。正因为这种分离,因此你必须确保应用程序的主要数据存储的变更会反映到 SpiceDB 中。我们发现,在受 Zanzibar 启发的各种实现中, SpiceDB 是一个值得你基于当前授权需求进行评估的有趣框架。

sqlc

sqlc 是一个特别的编译器,它可以根据 SQL 生成类型安全并且风格自然的 Go 代码。与其他基于对象关系映射 (ORM) 的方法不同,sqlc 允许你根据需要编写原生的 SQL。一旦 sqlc 被调用,它会检查 SQL 代码的正确性并生成高性能的 Go 代码,这些代码可以直接被应用程序的其它部分调用。凭借对 PostgreSQL 和 MySQL 的稳定支持,sqlc 值得我们一试,因此我们鼓励你对其进行评估。

可组合架构

随着时间的推移, iOS 应用程序开发变得越来越顺畅, SwiftUI 进入采纳环就是一个标志。作为应用构建工具库与架构风格的集合体,可组合架构 (TCA) 在 SwiftUI 和其他常见框架之上更进了一步。TCA 是在一系列视频课程的基础上设计的。作者表示,他们在 The Elm Architecture 和 Redux 的基础上考虑了构图、测试和人体工程学。正如预期的那样,“适用面窄”和“有态度性 (opinionatedness)”既是 TCA 的优势也是劣势。我们认为,对于需要维护多种不同技术栈代码库的团队来说,如果他们对编写 iOS 应用没有太多专业知识时,他们就能从使用像 TCA 这样的“有态度”的框架中获取最大收益。我们很喜欢 TCA 表现出的这种“态度”。

WebAssembly

WebAssembly(WASM)是一项 W3C 标准,旨在为浏览器提供执行代码的能力。它是二进制的编码格式,其设计目标是可以发挥硬件的能力,让代码以接近原生的速度在浏览器中运行,目前 WASM 已被所有的主流浏览器支持并向下兼容。前端开发编程语言早期主要聚焦在 C、C 以及 Rust 上,WASM 的出现拓宽了可选范围。同时 WASM 还被 LLVM 支持,纳入为一个编译目标。当 WASM 在浏览器的沙盒环境中运行时,能够与 JavaScript 交互并共享相同的权限和安全模型。凭借其可移植性和安全性这两项关键能力,WASM 可以适配包括移动端、IoT 在内的更多平台。

Zig

Zig 是一门新的语言,它与 C 语言共享了许多属性,但是具有更强的类型,更简便的内存分配,以及对命名空间和众多其他特性的支持。然而它的语法,比起 C 更容易让人想到 JavaScript,这点会引起一些人的反对。Zig 的目标是为大家提供一种非常简单的语言,可以直接编译以减少副作用,并且程序执行是可预测和易于追踪的。Zig 还提供了 LLVM 交叉编译功能的简化接口。我们的一些开发同事发现这一特性非常重要,以至于他们尽管没有使用 Zig 编程,但是仍然把它当做一个交叉编译器使用。Zig 是一种新颖的语言,对于正在考虑或者已经使用 C 语言的应用程序,以及需要显式内存操作的底层系统应用程序,值得一试。

0 人点赞