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

语言 & 框架

采纳 ?

  • 使用 Playwright,您可以编写在 Chrome、Firefox 和 WebKit 中运行的端到端测试。 通过使用 Chrome 开发者工具(DevTools)协议(CDP),Playwright 可以提供新功能并消除 WebDriver 中出现的许多问题。 基于 Chromium 的浏览器直接实现了 CDP。不过,为了支持 Firefox 和 Webkit,Playwright 团队不得不向这些浏览器提交补丁,这有时可能会限制框架。

    Playwright 的功能包括:内置自动等待,这使得测试更可靠、更易于理解; 浏览器上下文,可让您测试跨标签页的持久会话是否正常工作;以及模拟通知、地理位置和黑暗模式设置的能力。 Playwright 为测试套件带来的稳定性给我们的团队留下了深刻印象,并且喜欢它可以并行运行测试以更快地获得反馈。 Playwright 的其他特色包括更好地支持懒加载和追踪。 尽管 Playwright 有一些局限性(例如,组件支持目前处于实验阶段),但我们的团队认为它是首选的测试框架,甚至在某些情况下会从CypressPuppeteer 上迁移过来。

试验 ?

  • ASP.NET Core MVC 已经被证明是一种用于构建托管 APIs 的 Web 应用程序的强大而灵活的方法。然而,它的灵活性也带来了一定的复杂性,包括一些不明显的样板代码和约定。ASP.NET 提供的路由功能允许在单个应用程序中托管多个服务,但在当今的无服务器函数和可独立部署的微服务的世界中,这种灵活性可能会显得有些过剩。.NET Minimal APIs 在 .NET 生态系统中提供了一种简单的方法来实现 single-API 的 Web 应用程序。Minimal API 框架可以用仅仅几行代码就实现一个 API 端点。Minimal API 加入了新一代的 API 框架,包括 MicronautQuarkusHelidon,这些框架针对轻量级部署和快速启动时间进行了优化。我们对 Minimal APIs 和 .NET 7 Native AOT 的结合很感兴趣,可以用于在无服务器函数中实现简单、轻量级的微服务。

  • Ajv 是一个流行的 JavaScript 库,用于根据使用 JSON Schema 定义的结构验证数据对象。对于验证复杂的数据类型,Ajv 既快速又灵活。它支持多种多样的 schema 特性,包括自定义关键字和格式。许多开源的 JavaScript 应用程序和库都使用它。 我们的团队使用 Ajv 在 CI 工作流中实现消费者驱动的契约测试,另外再配合其他工具一起通过 JSON Schema 生成模拟数据,功能非常强大。在 TypeScript 的世界中,Zod 是一种流行的替代方案,它可以用于定义 schema 和验证数据的声明式 API。

  • Armeria 是一个用于构建微服务的开源框架。我们的团队使用它来构建异步 API,我们非常喜欢用它的服务装饰器来解决跨切面关注点,例如分布式跟踪或断路器。该框架支持 gRPC 和 REST 流量的端口复用以及其他巧妙的设计选择。借助 Armeria,我们可以在现有 REST 代码库之上逐步添加新的 gRPC 功能,或者反过来,在现有的 gRPC 代码库之上逐步增加新的 REST 功能。总的来说,我们发现 Armeria 是一个灵活的微服务框架,具有多个开箱即用的集成功能。

  • AWS Serverless Application Model (SAM) 是一款用于在 AWS 云基础设施上构建无服务器应用的开源框架。此前入选技术雷达条目的Serverless Framework作为一种在各个云服务商上部署无服务器服务的流行框架,主要用于基于AWS Lambda的服务。近来,AWS SAM 因其长足的发展而日益受到欢迎。我们的团队发现 AWS SAM 非常易于配置,并且我们还尝试将其用于测试和调试基于 AWS Lambda 的服务,包括开发时在本地执行 Lambda 函数。

  • Dart 是由 Google 开发的编程语言,支持构建跨平台的应用程序,包括 Web 浏览器、WebAssembly、桌面和移动应用。它的采纳是由 Flutter 的主导地位推动的。在跨平台原生移动应用框架领域,Flutter 是一个流行的、使用 Dart 作为其核心语言的跨平台 UI 工具包。根据社区的反馈,Dart 从最初的版本开始不断演进,除了具备健壮的类型系统,还在3.0版本中添加了内置的 sound null safety。此外,Dart 的生态系统正在快速发展,拥有活跃的社区、丰富的可用库和工具,这使其对开发者非常具有吸引力。

  • fast-check 是一个为 JavaScript 和 TypeScript 设计的基于属性的测试工具,它能够自动生成测试数据,从而无需创建不同的测试即可仔细检查各种输入,这使得它更容易发现边缘场景。 我们的团队在后端测试中使用 fast-check 取得了不错的结果,归功于它良好的文档、易用性以及与现有测试框架的无缝集成,单元测试的效率得到了明显提高。

  • 五年前,我们将 Kotlin 移至了采纳阶段,如今我们的许多团队报告称,Kotlin 不仅成为了他们在 JVM 语言上的默认选择,而且已经几乎完全取代了 Java,成为他们编写软件的主要语言。与此同时,microservice envy 似乎正在减弱,我们注意到人们开始使用诸如 Spring Modulith 等框架,探索具有更大可部署单元的架构。我们已经知道有许多出色的 Kotlin 原生框架,并且在之前也提到过一些;然而在大部分情况下,Spring 框架的成熟度和功能丰富性是一个巨大的优势,并且我们已成功地结合使用 Kotlin与Spring ,而并未遇到很大的问题。

  • Mockery 是一个成熟的 Golang 库,它能够生成接口的 mock 实现,并模拟外部依赖的行为。通过类型安全的方法生成期望的调用,并通过灵活的方式 mock 返回值,它使得测试能够专注于业务逻辑,而无需担忧外部依赖的正确性。Mockery 使用了 Go 生成器,且简化了测试套件中的 mock 的生成与管理。

  • 我们大多时候将 GraphQL 用于服务端资源聚合 ,并且使用多种技术实现服务端。对于使用 Spring Boot 开发的服务,我们的团队使用了 Netflix DGS ,体验很好。Netflix DGS 基于 graphql-java 开发,并提供了许多 Spring Boot 编程模型的特性与抽象。因此使得开发 GraphQL 端点,以及与 Spring Security 等 Spring 特性集成就变得很容易。虽然 DGS 是用 Kotlin 编写的,但在 Java 上它也工作的很好。

  • 我们使用 OpenTelemetry 作为解决方案已经有一段时间了,并且在之前的雷达中推荐试用。它能够在多个服务和应用之间无缝地捕获、检测和管理遥测数据,从而改善我们的观察堆栈。OpenTelemetry 的灵活性和与多样化环境的兼容性使其成为我们工具包中有价值的补充。目前,我们对最近发布的 OpenTelemetry Protocol (OTLP) 特别感兴趣,该规范包括了 gRPC 和 HTTP 两种协议。这一协议标准化了遥测数据的格式和传输方式,促进了互操作性并简化了与其他监控和分析工具的集成。随着我们继续探索该协议的集成潜力,我们正在评估它对我们的监控和可观察性策略以及整个监控领域的长期影响。

  • PolarsRust 实现的一个内存运行的DataFrame库。 与其他 DataFrame 库(如Pandas)不同,Polars 是多线程、支持惰性求值、并且并行操作安全的。 Polars 使用 Apache Arrow 格式作为内存模型,以高效实现分析操作,并实现与其他工具的互用性。 如果您熟悉 Pandas ,就可以快速上手 Polars 的 Python 绑定。 基于 Rust 实现和 Python 绑定的 Polars 是一个高性能内存 DataFrame 库,可满足您的分析需求。 我们的团队在 Polars 方面继续拥有良好的体验,因此我们将其将其移至 “试验” 。

  • Pushpin 是一种反向代理工具,充当处理长连接(如 WebSockets 和服务器发送事件)的后端服务器与客户端之间的中介。它提供了一种终止来自客户端的长连接的方法,意味着系统的其他部分可以从这项复杂工作中解放出来。它能有效管理大量持久连接,并自动将其分配给多个后端服务器,从而优化性能和可靠性。我们在使用 Pushpin 来处理移动设备的 WebSockets 实时通信时获得了良好的体验,并且我们已经通过横向扩展成功使其服务于数百万台设备。

  • Snowpark 是一个用于 Snowflake 大规模查询和处理数据的库。我们的团队使用它来编写可管理代码,用以与Snowflake中存储的数据进行交互 — 这类似于为 Snowflake 编写 Spark 代码。总的来说,它是一个引擎,能够将代码转换为 Snowflake 能够理解的 SQL。你在构建应用程序时无需将 Snowflake 中待处理的数据移动到代码运行的地方。一个缺陷:单元测试的支持仍待优化;我们的团队通过编写其它类型的测试来弥补这个缺陷。

评估 ?

  • 不要与安卓基准配置文件相混淆,基准配置文件是指导提前编译的安卓运行时配置文件。基准配置文件会在发布前在开发机上创建,并随应用程序一起发布。因此,相较于依赖云配置文件(一种较早的相关技术),基准配置文件会更快可用。通过在应用或库中分发基准配置文件,安卓运行时可以优化重要的代码路径,从而在下载或更新应用程序时改善新老用户的使用体验。根据其文档所提到的,创建基准配置文件相对简单并可以显著提高性能(最多 30%)。

  • GGML 是一个机器学习的 C 语言库,它支持 CPU 推理。它定义了一种分布式大语言模型(LLMs)的二进制格式。为此,GGML 采用了量化技术,这种技术可以使LLM在用户的硬件上运行有效的 CPU 推理。GGML 支持多种量化策略(例如 4 位、5位、以及 8 位量化),每种策略动都在效果和性能之间提供了不同的取舍。一种快捷地对使用这些量化模型的应用进行测试、运行和构建的方法是使用一个叫做 C Transformers 的 Python 绑定。它是一个 GGML 之上的 Python 封装,通过高级的 API 来消除推理的样板代码。我们已经在尝试使用这些库构建原型和实验。如果你正在考虑为你的组织搭建自托管式大语言模型, 请慎重选择这些社区支持的库。

  • GPTCache 是一个用于大型语言模型(LLM)的语义缓存库。我们认为需要在 LLM 前增设缓存层主要出于两种原因——通过减少外部 API 调用来提升整体性能,以及通过缓存近似响应来减少运营成本。不同于使用精确匹配的传统缓存方式, 基于 LLM 的缓存解决方案需要对输入进行相似或相关匹配。 GPTCache 通过使用嵌入算法将输入转化为嵌入,再通过向量数据库对这些嵌入进行相似性搜索。这种设计有一个缺点,可能会导致缓存命中时遇到假阳性结果,或缓存未命中时遇到假阴性结果,因此我们建议你在构建基于 LLM 应用时,仔细评估 GPTCache。

  • 在许多语言中,性别的表现都比英语更为明显,且词语会根据性别发生变化。例如,称呼用户时,可能需要对词语进行变形,但通常的做法是默认使用男性形式。有证据表明,这会对人的表现和态度产生负面影响 —— 当然,这也是不礼貌的。使用性别中立语言的变通办法往往显得笨拙。因此,正确地称呼用户是首选。借助 Android 14 中引入的语法性别 API,安卓开发者们现在可以更容易地做到这一点。

  • htmx 是一款轻量简洁的 HTML UI 库,近期突然迅速走红。在技术雷达讨论期间,我们发现其前身 intercooler.js 早在十年前就已存在。与其他越来越复杂的预编译 JavaScript/TypeScript 框架不同,htmx 鼓励直接使用 HTML 属性来实现诸如 AJAX、CSS transitions、WebSockets 和服务器发送事件等操作。从技术角度来看,htmx 并不复杂,但它的流行让人想起早期网页中超文本的简洁风格。该项目的网站上还提供了一些关于超媒体和网页开发的深入(且有趣)的文章,这显示出 htmx 团队对其目标和理念进行过认真思考。

  • Kotlin Kover 是一个专为 Kotlin 设计的代码覆盖率工具集。它支持 Kotlin JVM 、Multiplatform 和 Android 工程。代码覆盖率的重要性在于能够凸显未经测试的代码片段,从而增强软件的可靠性。随着 Kover 的发展,它因能够生成为 Kotlin 量身定做的、全面的 HTML 和 XML 报告而引人注目。对于深度使用 Kotlin 的团队,我们建议您评估 Kover ,以助力您提高代码质量。

  • LangChain 是一个利用大语言模型(LLM)构建应用程序的框架。要构建实用的 LLM 应用,需要将其与用户或领域的特定数据结合起来,这些数据不属于训练数据的一部分。LangChain 利用提示管理、链式、代理 和文档加载器等功能填补了这一空白。如提示模板和文档加载器等组件的好处是可以加快产品上市速度。尽管 LangChain 是实施检索增强生成(Retrieval-Augmented Generation) 应用程序和 ReAct 提示工程 模式的热门选择,但它也因难以使用和过于复杂被批评 。当您为 LLM 应用程序选择技术栈时,可能需要在这个快速发展的领域继续寻找类似的框架(如 Semantic Kernel

  • LlamaIndex 是一个旨在促进私有或领域特定数据与大语言模型(LLMs)集成的数据框架。它提供了从各种数据源获取数据的工具,包括 API、数据库和 PDF,然后将这些数据结构化为 LLMs 能够轻松消费的格式。通过各种类型的“引擎”,LlamaIndex 使得对这些结构化数据进行自然语言交互变得可能,从而使其可用于从基于查询的检索到对话界面等各种应用。与 LangChain 类似,LlamaIndex 的目标是加速跟大语言模型应用的开发,但它更多地采用了数据框架的方法。

  • promptfoo 是一款测试驱动的 prompt engineering。在应用程序中集成 LLM 时,调整提示词为生成最佳回答并保证输出的一致性,往往会耗费大量时间。你可以将 promptfoo 作为 CLI 和库使用,根据预定义的测试用例对提示词进行系统测试。测试用例和结果断言则可通过简单的 YAML 配置文件完成设置。 这个配置文件包含需要测试的提示词、模型提供者、断言以及将会在提示词中被替换的变量值。promptfoo 支持多种断言,包括相等性、JSON 结构、相似性、自定义函数检查,甚至支持使用 LLM 对模型输出结果分级。如果你想对提示词和模型质量进行自动化反馈,请务必体验 promptfoo。

  • Semantic Kernel 是微软 Copilot 产品套件中的一个核心组件的开源版本。它是一个 Python 库,与 LangChain 类似,它可以帮助你在大语言模型(LLMs)之上构建应用程序。Semantic Kernel 的核心概念是计划器,它可以帮助你构建由 LLM 驱动的代理 ,这个代理可以为用户创建一个计划,然后在各种插件的帮助下逐步执行这个计划。

  • 尽管我们是微服务(microservices)的早期倡导者,并看到该模式在无数系统上取得了成功,但我们也看到微服务被误用和滥用,这通常是microservice-envy(microservice envy)导致的。与其从头开始构建一个由单独部署的进程组成的新系统,我们通常建议从一个精心设计的单体应用开始,并且仅当应用程序达到一定规模时,才将其分解为可单独部署的单元,此时微服务的好处才能超越分布式系统所固有的额外复杂性。最近,我们看到人们对这种方法重新产生了兴趣,以及对什么构成了精心分解的整体有了更详细的定义。Spring Modulith 是一个框架,它以一种使代码在适当时候更容易拆分成微服务的方式来组织代码。它提供了一种模块化代码的方法,使领域和限界上下文的逻辑概念与文件和包(package)结构的物理概念保持一致。这种对齐方式使得在必要时重构单体架构以及单独测试领域变得更加容易。Spring Modulith 提供了一种进程内事件机制,有助于进一步解耦单个应用程序中的模块。 最重要的是,它与 ArchUnitjmolecules 集成,可以自动验证其领域驱动的设计规则。

暂缓 ?

 
  • languages-and-frameworks quadrant with radar rings 采纳 试验 评估 暂缓 采纳 试验 评估 暂缓
  • 新的
  • 移进/移出
  • 没有变化

无法找到需要的信息?

 

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

无法找到需要的信息?

 

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

下载第29期技术雷达

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

获取最新技术洞见

 

立即订阅

查看存档并阅读往期内容