Enable javascript in your browser for better experience. Need to know to enable it? Go here.

语言 & 框架

采纳 ?

  • 仿照苹果推出的 SwiftUI ,Google 也为现代 Android 应用提供了完全不同的全新用户界面构建方式 Jetpack Compose。Compose 提供了更强大的工具和一组直观的 Kotlin API,这在多数情况下可以减少代码量,并且比起先定义静态 UI 再填充数据的传统方式,在应用运行时直接创建用户界面会更容易。随着 Compose MultiplatformKotlin Multiplatform 的出现,开发者现在可以使用统一的工具套件来构建桌面、网页以及原生 Android 应用。此外,Compose 支持 Wear OS 3.0+,而随着 Kotlin Multiplatform Mobile 提供对 iOS 的支持,将来 Compose 也可能会支持 iOS。

  • React Hooks 引入了一种管理状态逻辑的新方法;鉴于React组件相比较类来说更接近于函数,Hooks接受了这一点并将状态传给函数,而不是将函数作为方法传给带有状态的类。React应用中状态管理的另一个主要内容是 Redux ,我们注意到它已经受到审查,可以看到,在某些时候Redux的复杂性并不值得,对于这些情况,使用Hooks的简单方法是更可取的。完全靠自己去引入这种实现很快会变得棘手;因此我们推荐考虑结合 React Context 以及useContext和useReducer Hooks,并根据这篇 博客文章 中解释的路线来实现。

试验 ?

  • Arium 是一个Unity 3D应用测试框架。功能测试是健康的测试金字塔中的一个重要组成部分。以包装 Unity Test framework 而成的Arium,让您能够在多个平台上为3D应用编写功能测试。我们已经在一些项目上成功地使用了它。

  • Chakra UI 是专门为无障碍设计的一个React.js的UI组件库。我们很喜欢它关于无障碍设计的功能,比如深色模式以及与无障碍网页倡议(WAI-ARIA)的兼容。此外,它易于测试和定制,为开发提供了良好的体验,加速 UI 解决方案在生产环境中的开发过程。

  • DoWhy 是一个 Python 库,用于执行端到端的因果推理和分析。尽管利用当时存在的变量的相关性,机器学习模型可以根据事实数据进行预测。但在我们需要问如果为什么问题的场景中,它们是不够的。如果一个变量改变了呢?对结果会有什么影响?因果推理是回答此类问题的一种方法。它估计了因果效应,也就是说,如果我们改变一个原因变量,结果会发生多大的变化。由于实验的成本或限制,当我们无法通过观察和收集 A/B 测试的数据来得出答案时,就可以采用这种方法。基于使用过去收集的事实和数据以及人们可以在了解领域时做出的假设,DoWhy 库对因果效应进行估计。它使用了一个四步流程,即根据假设对因果关系图进行建模,确定结果的原因,估计因果效应,最后通过反驳结果来挑战这些假设。我们已经在生产中成功地使用了这个库,它是因果估计用例中常用的库之一。

  • 尽管有几个框架承诺保持与静态站点生成器相同的开发简易性和可扩展性,但我们仍然认为 Gatsby.js 拥有良好的体验。 特别是我们已经使用它来构建和部署了可扩展到大量用户的网站,而无需担心容量规划或部署基础设施。 我们的开发人员也对其关注可访问性和支持旧系统的特性印象深刻,并且他们可以重用自己的 React.js 经验。 总而言之,我们觉得 Gatsby 已经相当成熟,是这个领域的可靠选择。

  • Jetpack Hilt 最近发布了 1.0 版,我们的使用体验良好。 Jetpack Hilt 提供了用于将 Hilt 与各种其他 AndroidX 库(例如 WorkManager 和 Navigation)集成的扩展。它进一步扩展了 Hilt 的范围,为开发人员提供了一种将 Dagger 依赖注入集成到 Android 应用程序中的标准方法。 在之前 Radar 中我们提到过作为 Kotlin 原生依赖注入框架的 Koin。虽然在已有的大型代码库中,我们并不建议尝试替换 Koin。但当启动一个新项目时,Hilt 似乎是应该采取的方案。

  • 随着跨平台移动开发的端到端体验日益高效愉悦,构建跨平台移动应用成为了许多组织的一项强有力选择。Kotlin Multiplatform Mobile(KMM)是JetBrains 提供的 SDK,在利用 Kotlin 跨平台能力的同时,它还提供了工具和特性以优化开发体验。使用 KMM 时,您只需用 Kotlin 对业务逻辑和核心应用程序编写一份代码,然后即可被 Android 和 iOS 应用共享。仅在必要时(如利用原生UI元素),您才需要针对特定的平台编写代码,且这些特定代码保存在各个平台的不同视图中。基于 KMM 的迅速发展我们将其移至“试验”环。我们也看到一些组织已经将其作为了默认选项。

  • lifelines 是一个用 Python 编写的进行生存分析的库。它最初是为出生和死亡事件而开发的,现在已演变成一个用来预测任何持续时间的完整的生存分析库。除了医疗使用案例(例如用来回答:这个人能活多久?),我们也已经在零售和制造业中用它来回答类似 用户对一个服务订阅了多久?我们应该什么时候做下一个预防性的维护?这样的问题。

  • Web 应用,特别是企业内部应用,通常分为两个部分。用户界面和小部分业务逻辑运行在浏览器中,而大部分业务逻辑、认证和持久化工作运行在服务器中。这两部分一般会通过在 HTTP 上传输 JSON 进行通讯。但请不要误认为这些端点(endpoint)是真正的 API,它们只是当应用要穿越两个运行环境时的实现细节而已。与此同时,它们也提供了一个合适的“接缝”,以便独立测试这些“零件”。当测试 JavaScript 部分时,可以通过像 Mountebank 这样的工具在网络层对其服务端进行打桩(stub)和模拟(mock)。Mock Service Worker 则提供了另一种选择——在浏览器中拦截各种请求,从而进一步简化了手工测试。和Mountebank一样,为了测试网络交互,Mock Service Worker 运行在浏览器外部的 Node.js 进程中。由于 GraphQL 的复杂性,此前我们一直难以对它在网络层进行手工模拟。而在 REST 交互之外, Mock Service Worker 对 GraphQL API 的模拟能力也为它锦上添花。

  • React 应用中的状态管理一直是技术雷达中反复出现的话题。最近我们阐明了对 Redux 这一流行框架的立场。NgRx 本质上是 Angular 的 Redux。它是一个使用 Angular 构建响应式应用的框架,可以进行状态管理并隔离副作用。 我们的团队认为使用 NgRx 很简单,不仅仅因为它由 RxJS 构建,他们还强调了我们从 Redux 中了解到的一个权衡:增加响应式状态管理就会增加复杂性,而只有大型应用才能利大于弊。NgRx提供的脚手架库Schematics以及一组支持可视化状态追踪和回溯调试的工具提高了开发体验。

  • 起初,Python 添加了类型注解用以支持静态分析。然而,考虑到类型注解和一般注解在其他编程语言中的广泛使用,开发者开始将 Python 的类型注解用于其他目的只是时间问题。pydantic 就是其中一种,用类型注解进行运行时数据验证和设置管理。当接收到JSON数据,并需要将其解析为复杂的 Python 结构时,pydantic 确保传入的数据与预期类型匹配,或在不匹配时报告错误。虽然 pydantic 可以被直接使用,许多开发者将它作为最流行的 Python web 框架之一—— FastAPI 的一部分来使用。事实上,在 FastAPI 中使用 pydantic 被认为非常有必要,以至于最近有一个 Python 更改提议——旨在降低加载带注解的代码到内存中的成本——被重新考虑, 因为它会在运行时破坏类型注解的使用。

  • 我们在两年前开始评估 Quarkus,现在我们团队在这方面对它有了更多的经验。 Quarkus 是为 OpenJDK HotSpot 和 GraalVM 量身定制的 Kubernetes 原生 Java 技术栈。在过去的两年里,Quarkus 已经连接了 Java 世界中最好的库,并简化了代码配置,给我们的团队提供了一个很好的开发体验。 Quarkus 的启动时间非常快(几十毫秒)并且具有较低的 RSS 内存占用;这归功于它的 container-first 构建方法:它使用提前编译技术在编译时进行依赖注入,这样就避免了反射的运行时间成本。使用Quarkus的同时我们的团队也不得不做出一些妥协:在流水线上构建Quarkus需要将近10分钟;一些依赖注解和反射的功能(如 ORM 和序列化器)也受到了限制。这些妥协一部分是使用 GraalVM 造成的。因此,如果您的应用程序不是为了 FaaS 运行的,那么使用 Quarkus 和 HotSpot 也是一个不错的选择。

  • 如果我们想在 React Native 应用中制作动画,可是使用 React Native Reanimated 2.0。 我们之前有 Reanimated 1.x,但它存在与 Reanimated 声明式语言的复杂性相关的问题,并且还有一些与 React Native JavaScript 线程和 UI 线程之间的初始化和通信相关的额外性能成本。 Reanimated 2.0 尝试重新构想如何在 UI 线程中绘制动画;它允许我们使用 JavaScript 编写动画代码并在使用名为 animation worklets 的新 API 的 UI 线程上运行它们。它通过在 UI 线程上生成一个辅助 JavaScript 上下文来使之可以运行 JavaScript 函数。 我们在需要动画的 React Native 项目中使用它,并且非常喜欢它。

  • React Query 通常被描述为 React 缺失的数据获取库。数据获取,缓存,同步和服务器状态更新是很多 React 应用中非常普遍的需求,虽然这些需求很容易理解,但在程序中正确的实现却是众所周知的困难。React Query 提供了一种基于React Hooks 的简便直接的方案。作为应用的开发者,只需要传入一个解析数据的函数,然后把其他的工作都交给这个框架即可。我们喜欢它能开箱即用,又能在需要时进行多样化配置。它的开发工具可以帮助新接触 React Query 的开发人员理解该框架的工作原理,但遗憾的是,它还无法在 React Native 中使用。根据我们的经验,该框架的第三版拥有了线上产品所需要的稳定性。

  • 我们的开发人员一直在使用 Tailwind CSS 提高工作效率,并且对其在大型团队和代码库的可扩展性印象深刻。 Tailwind CSS通过较低层次的 CSS 样式类降低复杂性,为 CSS 工具和框架提供了一种替代方法。Tailwind CSS 易于定制,可以适应任何客户的视觉设计。 我们还发现它与 Headless UI 搭配得很好。 Tailwind CSS 使开发者不需要编写任何新的样式类或 CSS 样式。从长远来看,这将产出更易于维护的代码。Tailwind CSS 在可重用性和自定义创建可视化组件之间,提供了适当的平衡。

  • 自2018年雷达中首次提到 TensorFlow Lite 以来,我们已经在一些产品中使用了它。很高兴它与宣传的效果一致。除了将预训练模型集成到移动应用程序中的标准用法, TensorFlow Lite 还支持设备上训练,从而进一步开辟应用领域。TensorFlow Lite 网站不仅展示了许多常见的应用示例(如图像分类和目标检测),还隐含了诸如姿态估计和手势识别等新交互方式的应用。

  • 我们第一次提到 Three.js 是2017年,在雷达的“评估”环上。在这之后,这个 web 3D 渲染库得到了快速的改进和发展。随着 WebGL API 标准的改进,以及对 WebXR 的支持,Three.js成为了一个可以用来营造沉浸式体验的工具。与此同时,浏览器对 3D 渲染和 WebXR 设备 API 的支持也得到提升,使得 web 成为一个越来越有吸引力的 3D 内容平台。尽管还有别的 3D 渲染库,我们团队还是更喜欢 Three.js,特别是和 React Three Fiber 一起用的时候,能抽象掉一些底层细节。不过,开发者仍然需要注意性能问题,有时还需要重构数据来优化渲染速度。

  • 当我们使用 SwiftUI 创建界面时,其背后理念是创建一个可以轻松映射到界面元素的视图模型。在这种场景下,大多数测试都可以在模型上完成,而我们只需使用标准的单元测试框架就能编写直观、高效的测试。为了测试模型和视图之间的数据绑定,开发者会使用 XCUITest,这个自动化框架会启动完整的应用并远程控制界面,它能达到目的,测试效果也还算稳定,但是耗时很长。

    想要更快地给 SwiftUI 编写单元测试,您可以试试 ViewInspector 开源库,它利用 Swift 开放的反射API 访问 SwiftUI 创建的底层视图。因此,基于 ViewInspector 的测试只需要实例化一个 SwiftUI 视图,定位到需要测试的界面元素,就可以对元素进行断言测试,而像点击这种基本的交互也可以被测试到。如同许多别的 UI 测试框架,ViewInspector 提供了定位界面元素的 API,您可以指定路径,通过视图层级结构找到元素,也可以使用一系列查找方法定位元素。基于 ViewInspector 的测试往往比用 XCUITest 的测试更简单,运行起来也要快得多。不过,需要注意的是,尽管用 ViewInspector 写测试很简单,您也可能因此过度测试——测试简单的一对一映射逻辑就像在复印代码,没有太大意义。此外,即便 ViewInspector 降低了测试 SwiftUI 代码的难度,也请记住要把大部分逻辑放在模型中实现。

  • Vowpal Wabbit 是一个多功能的机器学习库,尽管它最初由雅虎研究院于十多年前创立,但我们仍想强调许多最新的机器学习技术时至今日依旧最早被添加于此。如果对机器学习感兴趣,那么您最好对 Vowpal Wabbit 上的更新多加留意。值得注意的是,近年来微软也对 Vowpal Wabbit 展现出更为浓厚的兴趣,除聘请了一位主要贡献者外,还将该库集成到他们的 Azure 产品中,例如 machine-learning designerPersonalizer

  • Zap 是一个用于 GoLang 的超高性能的结构化日志库,它比标准的日志实现和其他日志库更快。Zap 既有一个“漂亮”的记录器,提供了结构化和 printf 风格的接口,也有一个更快的记录器,仅提供了结构化的接口。我们的团队已经大规模地使用了它,并且很高兴将其推荐为他们的首选解决方案。

评估 ?

  • Headless UI 是为React.jsVue.js提供的无样式组件库 ,它和 Tailwind CSS 诞生于同一个团队。和其他自带默认样式的组件库不同,开发人员不需要订制或者调整默认样式就能开始使用,这一点非常讨人喜欢。组件丰富的功能和完全的可访问性,再加上可以随意添加样式,开发人员能够更高效地专注于业务问题和用户体验。 毫无疑问,Headless UI 也可以很好的与 Tailwind CSS 类结合使用。

  • 基于 PyTorch 及 MXNet 的 InsightFace 是开源的 2D 及 3D 深度人脸分析工具集。InsightFace 使用前沿且精确的方法进行人脸检测、人脸识别和人脸对齐。InsightFace 最吸引我们的是它为 ArcFace——用于检测两个图像相似性的前沿机器学习模型—— 提供了一个的最佳实现。带有 ArcFace 的 InsightFace 在 LFW 数据集上获得了 99.83% 的准确率。我们正在使用它进行面部重复数据剔除,效果很好。

  • Facebook Research 最近发布的 Kats 是一个轻量级的时间序列分析框架。时间序列分析是数据科学中的一个重要领域,包含预测、检测(周期性、异常值和变化点)、特征提取和多变量分析等问题域。在时间序列分析中,一般会使用不同的库进行不同的分析。而 Kats 则致力于提供一组算法和模型,为时间序列分析的所有问题域提供一站式服务。雷达已经介绍过同样来自 Facebook Research 的 Prophet —— Kats 提供的用于预测的模型。我们期待在涉及时间序列分析的问题中试用 Kats。

  • 如果你正在使用 Apache Kafka 并构建流处理应用程序,ksqlDB 是一个不错的框架,用来以类似SQL的语句编写简单的应用程序。ksqlDB 并不是一个传统的SQL数据库。然而,它允许你在现有的Kafka topics上使用轻量级类似SQL的语句来构建新的 Kafka streamstables 。和从传统数据库读取数据类似,Queries 能够拉取数据,或者当有增量变化发生时把结果推送到应用程序。你可以选择将其作为现有 Apache Kafka 原生部分安装并以 standalone server 的方式运行,或者作为 Confluent Cloud 上一个完全托管的服务。我们正在简单的数据处理场景中使用 ksqlDB 。在更复杂的场景中,比如当应用程序需要在代数 SQL 查询之外进行编码的情况下,我们会继续在 Kafka 之上使用诸如 Apache SparkApache Flink 这些数据处理框架。我们建议在应用程序的简单性允许的情况下尝试使用 ksqlDB。

  • Polars 是在 Rust 中实现的一种内存 DataFrame 库。与其他 DataFrame 库(如Pandas)不同,Polars 是多线程、并行操作安全的。Polars 使用 Apache Arrow 格式作为内存模型,以高效实现分析操作,并实现与其他工具的互用性。如果您熟悉 Pandas ,就可以快速上手 Polars 的 Python 绑定。基于 Rust 实现和 Python 绑定的 Polars 是一个高性能内存 DataFrame 库,可满足您的分析需求。

  • PyTorch GeometricPyTorch 的几何深度学习扩展库。几何深度学习旨在构建能从非欧几里得数据(比如,图网络)中学习的神经网络。基于图网络的机器学习方法在社交网络建模和生物医药领域,特别是在药物发现领域,越来越受到人们关注。PyTorch Geometric 提供了一个易于使用的库,用于设计复杂的图网络问题,比如蛋白质结构的表示。这个扩展库同时支持 GPU 和 CPU,还在最新研究成果的基础上,内置了大量基于图的机器学习算法。

  • 微前端 自推出以来,一直很受欢迎。然而,如果团队未能保持应用程序从样式技术到状态管理的一致性,则很容易陷入微前端的无序乾坤,在中文中代表天地,是一个旨在为此提供开箱即用解决方案的JavaScript库。乾坤基于single-spa,允许不同的框架共存于单一应用程序中。它还提供了样式隔离和 JavaScript 沙箱,以确保微应用的样式或状态不会相互干扰。乾坤在社区中获得了一定的关注;我们的团队也在评估它,希望它可以支持更为友好的调试。

  • 随着3D和扩展现实(XR)应用在网页浏览器中的可行性提升及人们对其兴趣的增加,我们的团队已经尝试使用 React Three Fiber 在网页端开发3D体验。React Three Fiber 是一个将React.js 组件和状态模型转译为由 Three.js 渲染的3D对象的库。这一方法将3D网页编程开放给了更广泛的开发者群体,这部分开发者已经熟悉 React.js 和其丰富的工具以及库的生态系统。但是,在使用 React Three Fiber 开发应用时,我们的团队经常需要命令式地操作3D场景。这一点与 React 提供的响应式组件范式兼容得不太好,且开发者仍然必须理解基础的3D渲染机制。React Three Fiber 是否能够提供足够的抽象来吸引开发者学习其特性,或者直接使用 Three.js 开发其实更为容易?目前尚无定论。

  • TauriElectron 的替代品,它使用 Rust 工具以及在操作系统 WebView 中渲染的 HTML 、 CSS 和 JavaScript 组合来构建桌面应用程序。与捆绑 Chromium 的 Electron 不同,用 Tauri 构建的应用程序利用了底层的 WebView ,即 macOS 上的 WebKit , Windows 上的 WebView2 和 Linux 上的 WebKitGTK 。这种方法有一些有意思的利弊:一方面,你可以得到运行迅速而小巧的应用程序二进制文件;但另一方面,你需要验证不同系统中 WebView 的兼容性问题。

  • Transloco 是一个用来构建多语言应用程序的 Angular 库, 它可以在模板中使用,并提供了处理更复杂情况的功能。 由于翻译是在运行时按需加载的,Transloco 可以轻松地在 Web 浏览器中实现语言切换。 Transloco 还可以通过模板管道对数字、日期等进行本地化处理。

暂缓 ?

 
新建
移进/移出
没有变化

无法找到需要的信息?

 

每期技术雷达中的条目都在试图反映我们在过去六个月中的技术洞见,或许你所搜索的内容已经在前几期中出现过。由于我们有太多想要谈论的内容,有时候不得不剔除一些长期没有发生变化的条目。技术雷达来自于我们的主观经验,而非全面的市场分析,所以你可能会找不到自己最在意的技术条目。

无法找到需要的信息?

 

每期技术雷达中的条目都在试图反映我们在过去六个月中的技术洞见,或许你所搜索的内容已经在前几期中出现过。由于我们有太多想要谈论的内容,有时候不得不剔除一些长期没有发生变化的条目。技术雷达来自于我们的主观经验,而非全面的市场分析,所以你可能会找不到自己最在意的技术条目。

Radar

下载第25期技术雷达

English | Español | Português | 中文

Radar

获取最新技术洞见

 

立即订阅

查看存档并阅读往期内容