程序员必须关注的技术趋势,内附PDF下载链接
点击关注 InfoQ,置顶公众号
接收程序员的技术早餐

ThoughtWorks 中一群资深技术领导组成的 ThoughtWorks 技术顾问委员会 (TAB) 创建了该雷达。 他们定期开会讨论 ThoughtWorks 的全球技术战略以及对行业有重大影响的技术趋势。这个雷达以独特的形式记录技术顾问委员会的讨论结果,为从开发人员到 CIO 在内的各路利益相关方提供价值。 这些内容只是简要的总结, 我们建议您探究这些技术以了解更多细节。
这个雷达是图形性质的, 把各种技术项目归类为技术、 工具、 平台和语言及框架。 如果某个条目可以出现在多个象限, 我们选择看起来最合适的象限。 我们还进一步将这些技术分为四个环以反映我们目前对其的态度。
点击阅读原文,可获取全部技术雷达详细内容!
为了实现应用逻辑,浏览器在持续扩展成为部署目标的能力。当平台能照顾好横切关注点和非功能性需求的同时,我们注意到后端逻辑的复杂性有逐步降低的趋势。WebAssembly 的引入为 web 应用创建逻辑提供了新的语言选择,同时把处理过程更加推向金属侧(以及 GPU)。WebBluetooth 让浏览器能够处理那些原本是本地应用才能处理的功能,而且我们看到越来越多像 CSS Grid Layout 和 CSS Modules 这样的开发标准正在替换掉自定义的库。对更好用户体验的追求,正在持续地把功能装进浏览器里,许多后端服务因此变得越来越薄,复杂性也因而降低。
虽然 AWS 继续凭借令人眼花缭乱的新服务保持领先,但我们逐渐看到 Google Cloud Platform (GCP)和 Microsoft Azure 已经成为可行的替代方案。像 Kubernetes 这样的抽象层以及持续交付和基础设施即代码这样的实践,能支持更容易的演进式变化,从而促进云环境之间的过渡。但随着 Polycloud (这允许组织根据差异化的功能在多个供应商之间进行挑选)以及越来越多的监管和隐私问题的出现,云策略必然会变得更加复杂。例如,许多欧盟国家现在依法对数据所在地做出要求。这使得数据存储的管辖权和其主机的管理策略成为评估云计算环境的新维度。云计算环境的可选范围也在扩大,比如在“函数即服务”和“管理更长寿命集群”这两者之间,就可以选择提供了“容器即服务” (CaaS)的 AWS Fargate 这个有趣的选项。虽然各个组织对云技术的应用日臻成熟,但伴随使用这些新技术构建真实解决方案的,是逐渐蔓延又无法避免的复杂性。
对于几乎所有的软件开发来说,安全问题仍然是至关重要的。当前我们观察到传统的“全局权限管理”的安全策略正在转变为更为细致的本地化方法。现在许多系统会在更小的领域内管理信任,并在不同系统之间使用一些新的机制创建可传递的信任。其理念正在由“永远不信任领域外所有东西”以及“从不验证领域内任何东西”转变为“信任但是需要验证领域内外任何东西”——也就是说可以假设和系统其它部分有本意良好的互动,但一定要在本地验证这份信任。这使得团队可以对自己的基础设施、设备和应用程序栈有高度的权限控制,从而实现高度可视化,并可以在必要时候提供高级访问护栏。类似 Scout2 的工具以及 BeyondCorp 这样的技术反映了关于信任更成熟的视角。我们欢迎这种向本地化管理的转变,特别是当工具和自动化策略可以确保同等或更好的合规性时。
物联网(IoT)生态系统持续稳步发展,关键成功因素包括安全和成熟的工程实践。我们看到了整个物联网生态系统的增长,从设备上的操作系统到连接标准,尤其是基于云服务的设备管理和数据处理。我们看到了一些成熟的工具和框架,支持良好的工程实践,比如持续交付、部署以及为实现最终广泛使用的大量其他必要实践。除了主要的云服务提供商——包括 Google IoT Core ,AWS IoT 和 Microsoft AzureIoT Hub ——像阿里巴巴和阿里云这样的公司也在大力投资物联网 PaaS 解决方案。可以从我们的 EMQ 和 Mongoose OS 条目一瞥当今物联网生态系统的主流功能,它们也例证了物联网的良好的发展状态。
要记住,就像适用于其他软件领域一样,封装也同样适应于事件和事件驱动的体系结构。特别是,我们需要考虑一个事件的范围,以及我们是否期望它在同一个应用程序、同一个领域或整个组织中被消费。DOMAIN-SCOPED EVENT 将在其发布的同一个领域内被消费,因此我们期望消费者能够访问特定的上下文、资料或引用,进而对事件进行处理。如果这个事件的消费在组织内更广泛地发生,且事件的内容需要有所不同,我们就要注意不要“泄漏”其他依赖领域的实现细节。
身份管理是平台的关键组件之一。外部用户在使用移动应用的时候,需要对其身份进行验证,开发人员需要被授权才能访问基础设施组件,而微服务也需要向彼此证明自己的身份。你应该考虑的是,身份管理是否真的有必要自己来搭建和维护。根据我们的经验,HOSTED IDENTITY MANAGEMENT AS A SERVICE (SaaS)这种解决方案更为可取。我们相信,像 Auth0 和 Okta 这样的顶级托管商可以在“正常运行时间”和“安全”两方面提供更好的 SLA。也就是说,虽然有时候自行搭建和维护身份管理解决方案是一个现实的选择,特别是对于那些有操作规范和资源的企业来说,这个选择更为安全。但大型企业的身份解决方案通常包含更广泛的功能,例如集中授权、治理报告和职责分离管理等等。不过,这些担忧通常与员工身份更相关,特别是那些受遗留系统限制的企业,尤其如此。
在实践微服务的过程中,为了将后端资源进行聚合,我们实践了一个又一个的模式。之前,我们经常使用类似于 Netflix Falcor 这样的工具帮助我们实现 BFF (Backend forFrontend ),现在很多项目已经开始使用 GRAPHQL FOR SERVER-SIDE RESOURCE AGGREGATION。GraphQL 可以让客户端直接使用特定的查询语句去访问 BFF 以获取数据。使用这项技术时,后端服务可以继续暴露 RESTful API,而 GraphQL 可以轻易的将这些服务所提供的资源聚合在一起,并且对客户端十分友好。我们推荐 GraphQL 是因为其简化了 BFF 和其他聚合服务的实现。
在高度分布式的微服务架构中,其可观察性有一个两难问题 —— 要么记录一切,代价是巨量的存储空间;要么随机抽样记录,代价是有可能丢失某些重要事件。最近我们注意到一项技术,它在这两种方案之间提供了一个折衷方案。通过跟踪请求头中传入的某个参数来 LOG LEVEL PERREQUEST。使用跟踪框架(可能基于 OpenTracing 标准),你可以在一次事务中的多个服务之间传递一个相关的 ID。还可以在开始事务时注入其它数据(比如期望的日志级别),并且与跟踪信息一起传递它。这样可以确保这些额外数据在系统中总是和相应的单个用户事务一起流动。这在调试时也是个很有用的技巧,因为服务可能会暂停或以逐个事务的方式进行修改。
我们在上一期技术雷达里讨论了混沌工程,以及 Netflix 公司的 Simian Army 工具套件。我们已经采用它们来测试生产环境的恢复能力。SECURITY CHAOS ENGINEERING 扩展了安全技术的范畴。我们曾故意将误报引入到生产环境网络和其他基础设施——例如构建时的依赖关系中,检查它是否有能力在受控条件下识别安全故障。虽然这个技术很有用, 但应谨慎使用, 以避免团队遇到安全问题。
我们团队认为.NET CORE 已经足够成熟,可以成为.NET 服务器应用程序的默认平台。开源的 .NET Core 框架支持在 Windows、MacOS 和 Linux 操作系统上使用一流的跨平台工具来开发和部署 .NET 应用程序。微软提供了好用的 Docker 镜像,使得在容器化环境中部署.NET Core 应用程序变得非常简单。其在社区中积极的发展方向和我们项目的反馈表明—— .NET Core 是 .NET 应用开发的未来。
Microsoft 已经在稳健地改进 AZURE,如今大型云提供商 Amazon、Google 和 Microsoft 在核心云体验上并没有太大的差别。这些云提供商似乎都在追求其他方面的差异性,比如功能、服务和成本结构。Microsoft 对欧洲公司在法务上的需求表现出了真正的兴趣。对此,他们有一个细致且合理的策略,比如提供了像 Azure Germany 和 Azure Stack 这样各具特色的产品。这个策略为欧洲公司在预测 GDPR 以及美国可能对立法所做的更新中提供了几分把握。
Headless CMS (Content Management Systems, 内容管理系统) 正在成为数字化平台的常见组件。CONTENTFUL 是一个现代化的 headless CMS。我们的团队已经成功把它集成到开发工作流中。我们特别喜欢其“API 优先”的特点,及其 CMS as Code 的实现。它支持强大的内容建模原语代码和内容模型演化脚本,并允许将其视为其他数据存储的 schema,并将演进式数据库设计实践应用到 CMS 开发中。我们所喜欢的其他特性包括:默认包含两个 CDN 以提供多媒体资源和 JSON 文档,本地化的良好支持和与 Auth0 集成的能力(尽管需要做出一些努力)。
EMQ 是一个可伸缩的开源多平台 MQTT 代理。为了追求高性能,它使用 Erlang/OTP 语言编写,能处理数百万的并行连接。它能支持多种协议,包括 MQTT、MQTT 传感器网络、CoAP 以及 WebSockets,使其适用于物联网和移动设备。我们已经开始在项目中使用 EMQ,很享受其安装以及使用的便捷性,以及它能将消息路由到不同目的地(包括 Kafka 和 PostgreSQL)的能力,还有它在监控和配置上所采用 API 驱动的策略。
TICK STACK 是一个由开源组件组成的平台。使用它就可以轻松地收集、存储、绘制基于时间序列的数据(如度量和事件)来触发告警。TICK Stack 的组件包括:收集和报告各种指标的服务器代理 telegraf、高性能时间序列数据库 InfluxDB、平台的用户界面 Chronnograf,以及可以处理来自 InfluxDB 数据库的流式数据和批量数据的数据处理引擎 Kapacitor。不像基于“拉”模型的 Prometheus,TICK Stack 是基于“推”模型来收集数据的。InfluxDB 组件是该系统的核心,同时也是目前最好的时间序列数据库。虽然这套组件栈基于 InfluxData ,而且需要使用诸如数据库集群这样的 InfluxData 企业版的功能,但在监控方面它仍然是一个不错的选择。我们正在一些生产环境上使用该平台,并且获得了一些很好的体验。
WEB BLUETOOTH 能够直接从浏览器控制任意低功耗蓝牙设备。这样以前只能通过原生手机应用来处理的场景,现在也可以适用了。该规范由 Web Bluetooth Community Group 发布,并且定义了一个 API,通过蓝牙 4.0 无线标准发现设备并在设备间通信。 当前,Chrome 是唯一支持这个规范的主流浏览器。借助 Physical Web 和 Web Bluetooth, 现在有了其他途径来让用户与设备进行交互, 且无需让他们在手机上安装另一个应用。这是一个令人兴奋的领域, 值得密切关注。
凭着能让 Windows 应用以容器的方式运行在基于 Windows 的环境中,WINDOWS CONTAINERS 已经追赶上了容器世界的步伐。截至目前,微软提供两种 Windows OS 镜像来用作 Docker 容器——Windows Server 2016Server Core 和 Windows Server 2016 Nano Server。它们都可以作为 Windows 服务器容器运行在 Docker 中。在 build agents 场景中,我们的团队已经开始使用 Windows 容器。类似场景下的容器都可以很好地工作。微软已经意识到有些方面还存在优化空间,比如减少大型镜像文件的大小、加强对生态系统的支持和对文档进行丰富。
我们很开心使用 BACKSTOPJS 来做 web 应用的可视化回归测试。作为可视化比较工具,它的可配置视窗和可调节容错能力可以很容易定位到细微差别。它有很优秀的脚本功能,并且可以选择在无界面 Chrome、PhantomJS 和 SlimerJS 中运行。我们还发现,它在实时组件样式规范的基础上运行时尤其有帮助。
世界上有数不清的问题都可以用数学优化问题来表达,而其中可以用凸问题来描述的那部分常常能够得到有效解决。CVXPY 便是一种针对凸优化问题所开发的开源 Python 嵌入式建模语言。它由斯坦福大学的学者维护,已经为数个开源和商业解决方案提供了功能齐备的安装套件。它的文档中也包含了许多能够引起开发者使用兴趣的例子。尽管有些时候,我们仍然需要类似 Gurobi 和 IBM CPLEX 这类商业解决方案,但 CVXPY 在原型设计阶段可以说所向披靡。在多数情况下,有 CVXPY 就足够了。同时,基于最近的优化进展,其开发者一直在为我们提供更多的扩展包(例如 DCCP)和相关软件(例如 CVXOPT)。
HELM 是 Kubernetes 的包管理器。共同定义某个应用的 Kubernetes 资源集合被打包成图表。这些图表可以描述单个资源,例如 Redis pod,或者全栈的 Web 应用程序:HTTP 服务器、数据库和缓存。Helm 默认带有一些精选的 Kubernetes 应用,维护在官方的图表仓库里。想要为内部用途搭建私有的图表仓库也很容易。Helm 有两个组件:一个是称为 Helm 的命令行工具,另一个是称为 Tiller 的集群组件。保护 Kubernetes 集群是一个宽泛而微妙的话题,但我们强烈建议在基于角色的访问控制(RBAC)环境中搭建 Tiller。我们在很多客户的项目中使用了 Helm,它的依赖管理、模板和钩子机制极大地简化了 Kubernetes 中应用程序的生命周期管理。
Archunit 是用来检查架构特征的 Java 测试库,比如包与类的依赖关系、注解验证、甚至层级一致性。它可以在你现有的测试方案中,以单元测试的方式运行,但目前只能用于 Java 架构。ArchUnit 测试套件可以合并到 CI (持续集成)环境或部署流水线,使我们很容易地以演进式架构的方式实现适应度函数。
YARN 是一款快速可靠且安全的 JavaScript 包管理器。 通过锁定文件和确定性算法,Yarn 能够确保在一个系统上可以正常运行的设置,在另外一个系统上也能以完全相同的方式工作。 通过高效的请求队列,Yarn 最大限度地提高了网络利用率,因此我们看到了更快的软件包下载速度。 尽管 npm(版本 5)有最新的改进,但 Yarn 仍然是 JavaScript 包管理的首选工具。
KOPS 是一款用于创建和管理高可用生产环境 Kubernetes 集群的命令行工具。它已经成为我们在 AWS 上管理 Kubernetes 集群的首选工具,这不仅仅只是因为它快速增长的开源社区。它也可以 在 Google Cloud 上安装、升级和管理 Kubernetes 集群。不过我们在 Google 上使用 kops 的经验非常有限,因为我们更喜欢 GKE 这样的托管式 Kubernetes 服务。我们推荐在可复用的脚本中使用 kops 创建基础设施即代码。对于未来 kops 会如何持续演进,支持托管式 Kubernetes 集群,例如亚马逊自己的 Kubernetes 托管服务 EKS, 让我们拭目以待。
NSP 是一款命令行工具,用于识别 Node.js 应用程序中的依赖是否存在已知安全漏洞。 在 Node.js 项目的根目录下运行 check 命令,nsp 会通过检查发布公告来生成安全漏洞报告。 nsp 提供了一种自定义 check 命令的方法,可以隐藏所有低于给定 CVSS 分数的安全漏洞,或者当检测到的任意一个安全漏洞的 CVSS 分数高于给定值,就会退出并显示错误代码。一旦通过 gather 命令保存了 advisories (公告)之后,nsp 也可以在离线模式下使用。
SENTRY 是一款错误追踪工具,可以帮助实时监控并修复错误。像 Sentry 这样的错误追踪和管理工具,与类似 ELK Stack 这种传统的日志解决方案有所不同,前者更关注发现、调查和修复错误。Sentry 出现已经有一段时间了,并且非常流行——对于目前备受瞩目的“平均故障恢复时间”,错误追踪工具变得越来越有用武之地。因为能够与 Github、Hipchat、Heroku、Slack 等平台集成,Sentry 可以让我们更聚焦于自己的应用。它能在产品发布之后提供错误通知,让我们跟踪新的提交是否真正解决了问题,并且能在问题再次出现的时候进行通知。
KOTLIN 的使用率得到了飞速增长,工具支持也突飞猛进。其流行的背后原因包括语法简洁、空指针安全、易于从 Java 迁移以及与其他 JVM 语言的互操作性。并且,它还是非常不错的函数式编程入门语言。随着 JetBrains 添加了新功能,允许在多平台将 Kotlin 编译为原生二进制文件,以及可以转译为 JavaScript,我们相信,对于广大移动和原生应用开发者来说,它具备进一步广泛使用的潜力。尽管现在静态分析和代码覆盖率分析这样的工具还不成熟,但基于我们在许多产品应用上使用 Kotlin 的经验,我们相信 Kotlin 已经可以广泛采用。
ENZYME 已经成为了测试 React UI 组件的事实标准。与其他基于快照的测试工具不同,Enzyme 可以进行无设备渲染的测试,速度更快,粒度更细。这很大程度上减少了在 React 应用里所需要的功能测试代码。在大部分项目中,我们会结合单元测试框架(如 Jest)一起使用。
Hyperledger 项目现在已经发展成包含一系列子项目的大工程。针对不同业务需求,可以支持不同的区块链实现方式。例如,Burrow 专门用来实现带权限控制的 Ethereum,而 Indy 更专注于数字身份。在这些子项目中,Fabric 是最成熟的一个。当开发者们谈到使用 Hyperledger 技术时,实际上大多数时候是在考虑 Hyperledger Fabric。然而,chaincode 的编程抽象相对底层,因为它直接处理账本的状态数据。此外,在编写第一行区块链代码之前,搭建基础设施也经常耗去很多时间。HYPERLEDGER COMPOSER 构建于 Fabric 基础之上,加速了将想法实现为软件的过程。Composer 提供 DSLs 来建立业务资源模型、定义访问控制和构建业务网络。使用 Composer,可以在不搭建任何基础设施的情况下,仅通过浏览器来验证我们的想法。需要明确的是,Composer 本身并不是区块链,仍然需要把它部署在 Fabric 上。
FLUTTER 是一个跨平台的框架,可以使用 Dart 语言编写原生 Mobile 应用。借助 Dart,它能够编译成原生代码,并直接和目标平台通讯,而不必借助桥接和上下文切换——这些可能导致框架中出现性能瓶颈,就像 React Native 或 Weex 那样。Flutter 的热重载(hot-reload)特性让人惊叹,它能在编码时为你提供超快的视觉反馈。目前,Flutter 仍在 Beta 阶段,不过我们会持续关注它,了解其生态系统的成熟度。
RASA 是聊天机器人领域的新成员。 它并非使用简单的决策树,而是通过神经网络将用户意图和内部状态映射到回应上。Rasa 集成了自然语言处理解决方案(spaCy)。与技术雷达中的其他同类工具不同,Rasa 是开源软件,可以自行托管,对于担心数据所有权的使用者来说 Rasa 是一个可行的方案。我们在内部应用中使用了 Rasa Stack,效果良好。
REACTOR 是一个基于 Reactive Streams 规范的、用于开发非阻塞式应用程序的 JVM 库,支持 JVM 8 及以上版本。响应式编程强调将命令式逻辑转换成异步、非阻塞和函数式风格的代码,特别是在处理外部资源时。Reactor 实现了 Reactive Streams 规范,并且提供了两个不同的发布者 API:Flux (0 到 N 个元素) 和 Mono (0 或 1 个元素),可以高效地对基于推送的流处理进行建模。Reactor 项目非常适合微服务架构,并且为 HTTP、WebSockets、TCP 和 UDP 等提供了支持背压(backpressure)的网络引擎。
RIBs 即路由器(Router)、交互器(Interactor)和构建器(Builder)的缩写, 是来自 Uber 的跨平台移动架构框架。RIBs 的核心思想是将业务逻辑从视图树中分离出来,从而确保应用程序由业务逻辑驱动。 可以将其看作是 CleanArchitecture 模式在移动应用程序开发领域的一次应用。通过在原生 Android 和 iOS 应用上使用一致的架构模式,RIBs 为应用提供了清晰的状态管理模式和良好的可测试性。尽管我们一直建议尽量将业务逻辑放在后端服务,不要将其泄漏到前端视图中,但移动应用程序非常复杂,RIBs 可以帮助管理这种复杂性。
TENSORFLOW LITE 是我们上一期技术雷达中提到的 TensorFlow Mobile 的指定接班者。和 TensorFlow Mobile 一样,TensorFlow Lite 是为移动设备 (安卓和 iOS) 做调整和优化的轻量级解决方案。我们预期的应用场景是将预训练模型部署到移动端的应用程序中,令人惊喜的是,TensorFlow Lite 甚至还支持在设备上进行学习,这样其应用领域会更加广泛。
WEBASSEMBLY 将“浏览器作为代码执行环境”向前推进了一大步。它是一种二进制编译格式,几乎以原生速度跑在浏览器中,已经获得所有主流浏览器的支持并向后兼容。它拓展了编写前端功能的语言范围,早期集中在 C、C++ 和 Rust,并且也可以作为 LLVM 的编译目标。在沙盒中执行时,它可以和 JavaScript 交互并且共享相同的权限和安全模型。当和 Firefox 最新的流式编译器一起使用时,也可以提升页面初始化速度。尽管还处在早期阶段,但是这个 W3C 标准绝对值得研究。
ThoughtWorks 技术雷达峰会 将于 6 月 2 日在 深圳四季酒店 举办,届时微服务概念提出者 James Lewis、微软(中国)CTO 黎江、优维 CEO 王津银以及众多 ThoughtWorks 技术决策者将分享新一期技术雷达的主题趋势,现身讲述技术选型中的经验与体会。ThoughtWorks 为 InfoQ 用户提供了十张 VIP 赠票,感兴趣的同学可以点击下方小程序参与抽奖,中奖名单将在收集完成后统一提供给主办方。
如果对自己的运气没有信心,但又特别想去这个大会,可以扫描下图二维码购票,更有免费 VIP 专家票限量申请。
今日荐文
点击下方图片即可阅读

卓越程序员炼成记
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

随时掌握互联网精彩
- 1 聆听习主席重要讲话 军队代表这样说 7965316
- 2 又一个千万人口大市诞生了 7933038
- 3 甄子丹怼台媒:你这个人很坏 7834593
- 4 代表委员答网友问:什么是AI幻觉 7769042
- 5 委员:建议把手机还给孩子 7661412
- 6 微信朋友圈有新功能 7537557
- 7 00后用DeepSeek1天卖出3.3亿 7409523
- 8 吉林松原市长:趁媒体都在 我辟个谣 7317584
- 9 外交部回应“中国台湾省”称谓 7267910
- 10 “好房子”长这样 7103836