程序員必須關注的技術趨勢,內附PDF下載鏈接

接收程序員的技術早餐

程序员必须关注的技术趋势,内附PDF下载链接

作者|ThoughtWorks

ThoughtWorks 已於昨日發佈了最新一期的技術雷達,InfoQ 第一時間拿到了先手資料,提取了朋友們最感興趣的內容整理成文,以饗廣大讀者。本文將從技術、平臺、工具、語言 & 框架等四個方面,為你詳解技術未來的趨勢。

寫在前面

這個雷達是圖形性質的, 把各種技術項目歸類為技術、 工具、 平臺和語言及框架。 如果某個條目可以出現在多個象限, 我們選擇看起來最合適的象限。 我們還進一步將這些技術分為四個環以反映我們目前對其的態度。

本期技術雷達亮點

瀏覽器增強,服務端式微

為了實現應用邏輯,瀏覽器在持續擴展成為部署目標的能力。當平臺能照顧好橫切關注點和非功能性需求的同時,我們注意到後端邏輯的複雜性有逐步降低的趨勢。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

要記住,就像適用於其他軟件領域一樣,封裝也同樣適應於事件和事件驅動的體系結構。特別是,我們需要考慮一個事件的範圍,以及我們是否期望它在同一個應用程序、同一個領域或整個組織中被消費。DOMAIN-SCOPED EVENT 將在其發佈的同一個領域內被消費,因此我們期望消費者能夠訪問特定的上下文、資料或引用,進而對事件進行處理。如果這個事件的消費在組織內更廣泛地發生,且事件的內容需要有所不同,我們就要注意不要“洩漏”其他依賴領域的實現細節。

HOSTED IDENTITY MANAGEMENT AS A SERVICE

GRAPHQL FOR SERVER-SIDE RESOURCE AGGREGATION

在實踐微服務的過程中,為了將後端資源進行聚合,我們實踐了一個又一個的模式。之前,我們經常使用類似於 Netflix Falcor 這樣的工具幫助我們實現 BFF (Backend forFrontend ),現在很多項目已經開始使用 GRAPHQL FOR SERVER-SIDE RESOURCE AGGREGATION。GraphQL 可以讓客戶端直接使用特定的查詢語句去訪問 BFF 以獲取數據。使用這項技術時,後端服務可以繼續暴露 RESTful API,而 GraphQL 可以輕易的將這些服務所提供的資源聚合在一起,並且對客戶端十分友好。我們推薦 GraphQL 是因為其簡化了 BFF 和其他聚合服務的實現。

LOG LEVEL PER REQUEST

在高度分佈式的微服務架構中,其可觀察性有一個兩難問題 —— 要麼記錄一切,代價是巨量的存儲空間;要麼隨機抽樣記錄,代價是有可能丟失某些重要事件。最近我們注意到一項技術,它在這兩種方案之間提供了一個折衷方案。通過跟蹤請求頭中傳入的某個參數來 LOG LEVEL PERREQUEST。使用跟蹤框架(可能基於 OpenTracing 標準),你可以在一次事務中的多個服務之間傳遞一個相關的 ID。還可以在開始事務時注入其它數據(比如期望的日誌級別),並且與跟蹤信息一起傳遞它。這樣可以確保這些額外數據在系統中總是和相應的單個用戶事務一起流動。這在調試時也是個很有用的技巧,因為服務可能會暫停或以逐個事務的方式進行修改。

SECURITY CHAOS ENGINEERING

我們在上一期技術雷達裡討論了混沌工程,以及 Netflix 公司的 Simian Army 工具套件。我們已經採用它們來測試生產環境的恢復能力。SECURITY CHAOS ENGINEERING 擴展了安全技術的範疇。我們曾故意將誤報引入到生產環境網絡和其他基礎設施——例如構建時的依賴關係中,檢查它是否有能力在受控條件下識別安全故障。雖然這個技術很有用, 但應謹慎使用, 以避免團隊遇到安全問題。

二、平臺

.NET CORE

我們團隊認為.NET CORE 已經足夠成熟,可以成為.NET 服務器應用程序的默認平臺。開源的 .NET Core 框架支持在 Windows、MacOS 和 Linux 操作系統上使用一流的跨平臺工具來開發和部署 .NET 應用程序。微軟提供了好用的 Docker 鏡像,使得在容器化環境中部署.NET Core 應用程序變得非常簡單。其在社區中積極的發展方向和我們項目的反饋表明—— .NET Core 是 .NET 應用開發的未來。

AZURE

Microsoft 已經在穩健地改進 AZURE,如今大型雲提供商 Amazon、Google 和 Microsoft 在核心雲體驗上並沒有太大的差別。這些雲提供商似乎都在追求其他方面的差異性,比如功能、服務和成本結構。Microsoft 對歐洲公司在法務上的需求表現出了真正的興趣。對此,他們有一個細緻且合理的策略,比如提供了像 Azure Germany 和 Azure Stack 這樣各具特色的產品。這個策略為歐洲公司在預測 GDPR 以及美國可能對立法所做的更新中提供了幾分把握。

CONTENTFUL

Headless CMS (Content Management Systems, 內容管理系統) 正在成為數字化平臺的常見組件。CONTENTFUL 是一個現代化的 headless CMS。我們的團隊已經成功把它集成到開發工作流中。我們特別喜歡其“API 優先”的特點,及其 CMS as Code 的實現。它支持強大的內容建模原語代碼和內容模型演化腳本,並允許將其視為其他數據存儲的 schema,並將演進式數據庫設計實踐應用到 CMS 開發中。我們所喜歡的其他特性包括:默認包含兩個 CDN 以提供多媒體資源和 JSON 文檔,本地化的良好支持和與 Auth0 集成的能力(儘管需要做出一些努力)。

EMQ

EMQ 是一個可伸縮的開源多平臺 MQTT 代理。為了追求高性能,它使用 Erlang/OTP 語言編寫,能處理數百萬的並行連接。它能支持多種協議,包括 MQTT、MQTT 傳感器網絡、CoAP 以及 WebSockets,使其適用於物聯網和移動設備。我們已經開始在項目中使用 EMQ,很享受其安裝以及使用的便捷性,以及它能將消息路由到不同目的地(包括 Kafka 和 PostgreSQL)的能力,還有它在監控和配置上所採用 API 驅動的策略。

TICK STACK

TICK STACK 是一個由開源組件組成的平臺。使用它就可以輕鬆地收集、存儲、繪製基於時間序列的數據(如度量和事件)來觸發告警。TICK Stack 的組件包括:收集和報告各種指標的服務器代理 telegraf、高性能時間序列數據庫 InfluxDB、平臺的用戶界面 Chronnograf,以及可以處理來自 InfluxDB 數據庫的流式數據和批量數據的數據處理引擎 Kapacitor。不像基於“拉”模型的 Prometheus,TICK Stack 是基於“推”模型來收集數據的。InfluxDB 組件是該系統的核心,同時也是目前最好的時間序列數據庫。雖然這套組件棧基於 InfluxData ,而且需要使用諸如數據庫集群這樣的 InfluxData 企業版的功能,但在監控方面它仍然是一個不錯的選擇。我們正在一些生產環境上使用該平臺,並且獲得了一些很好的體驗。

WEB BLUETOOTH

WEB BLUETOOTH 能夠直接從瀏覽器控制任意低功耗藍牙設備。這樣以前只能通過原生手機應用來處理的場景,現在也可以適用了。該規範由 Web Bluetooth Community Group 發佈,並且定義了一個 API,通過藍牙 4.0 無線標準發現設備並在設備間通信。 當前,Chrome 是唯一支持這個規範的主流瀏覽器。藉助 Physical Web 和 Web Bluetooth, 現在有了其他途徑來讓用戶與設備進行交互, 且無需讓他們在手機上安裝另一個應用。這是一個令人興奮的領域, 值得密切關注。

WINDOWS CONTAINERS

憑著能讓 Windows 應用以容器的方式運行在基於 Windows 的環境中,WINDOWS CONTAINERS 已經追趕上了容器世界的步伐。截至目前,微軟提供兩種 Windows OS 鏡像來用作 Docker 容器——Windows Server 2016Server Core 和 Windows Server 2016 Nano Server。它們都可以作為 Windows 服務器容器運行在 Docker 中。在 build agents 場景中,我們的團隊已經開始使用 Windows 容器。類似場景下的容器都可以很好地工作。微軟已經意識到有些方面還存在優化空間,比如減少大型鏡像文件的大小、加強對生態系統的支持和對文檔進行豐富。

三、工具

BACKSTOPJS

我們很開心使用 BACKSTOPJS 來做 web 應用的可視化迴歸測試。作為可視化比較工具,它的可配置視窗和可調節容錯能力可以很容易定位到細微差別。它有很優秀的腳本功能,並且可以選擇在無界面 Chrome、PhantomJS 和 SlimerJS 中運行。我們還發現,它在實時組件樣式規範的基礎上運行時尤其有幫助。

CVXPY

世界上有數不清的問題都可以用數學優化問題來表達,而其中可以用凸問題來描述的那部分常常能夠得到有效解決。CVXPY 便是一種針對凸優化問題所開發的開源 Python 嵌入式建模語言。它由斯坦福大學的學者維護,已經為數個開源和商業解決方案提供了功能齊備的安裝套件。它的文檔中也包含了許多能夠引起開發者使用興趣的例子。儘管有些時候,我們仍然需要類似 Gurobi 和 IBM CPLEX 這類商業解決方案,但 CVXPY 在原型設計階段可以說所向披靡。在多數情況下,有 CVXPY 就足夠了。同時,基於最近的優化進展,其開發者一直在為我們提供更多的擴展包(例如 DCCP)和相關軟件(例如 CVXOPT)。

HELM

HELM 是 Kubernetes 的包管理器。共同定義某個應用的 Kubernetes 資源集合被打包成圖表。這些圖表可以描述單個資源,例如 Redis pod,或者全棧的 Web 應用程序:HTTP 服務器、數據庫和緩存。Helm 默認帶有一些精選的 Kubernetes 應用,維護在官方的圖表倉庫裡。想要為內部用途搭建私有的圖表倉庫也很容易。Helm 有兩個組件:一個是稱為 Helm 的命令行工具,另一個是稱為 Tiller 的集群組件。保護 Kubernetes 集群是一個寬泛而微妙的話題,但我們強烈建議在基於角色的訪問控制(RBAC)環境中搭建 Tiller。我們在很多客戶的項目中使用了 Helm,它的依賴管理、模板和鉤子機制極大地簡化了 Kubernetes 中應用程序的生命週期管理。

Archunit

Archunit 是用來檢查架構特徵的 Java 測試庫,比如包與類的依賴關係、註解驗證、甚至層級一致性。它可以在你現有的測試方案中,以單元測試的方式運行,但目前只能用於 Java 架構。ArchUnit 測試套件可以合併到 CI (持續集成)環境或部署流水線,使我們很容易地以演進式架構的方式實現適應度函數。

YARN

YARN 是一款快速可靠且安全的 JavaScript 包管理器。 通過鎖定文件和確定性算法,Yarn 能夠確保在一個系統上可以正常運行的設置,在另外一個系統上也能以完全相同的方式工作。 通過高效的請求隊列,Yarn 最大限度地提高了網絡利用率,因此我們看到了更快的軟件包下載速度。 儘管 npm(版本 5)有最新的改進,但 Yarn 仍然是 JavaScript 包管理的首選工具。

KOPS

KOPS 是一款用於創建和管理高可用生產環境 Kubernetes 集群的命令行工具。它已經成為我們在 AWS 上管理 Kubernetes 集群的首選工具,這不僅僅只是因為它快速增長的開源社區。它也可以 在 Google Cloud 上安裝、升級和管理 Kubernetes 集群。不過我們在 Google 上使用 kops 的經驗非常有限,因為我們更喜歡 GKE 這樣的託管式 Kubernetes 服務。我們推薦在可複用的腳本中使用 kops 創建基礎設施即代碼。對於未來 kops 會如何持續演進,支持託管式 Kubernetes 集群,例如亞馬遜自己的 Kubernetes 託管服務 EKS, 讓我們拭目以待。

NSP

NSP 是一款命令行工具,用於識別 Node.js 應用程序中的依賴是否存在已知安全漏洞。 在 Node.js 項目的根目錄下運行 check 命令,nsp 會通過檢查發佈公告來生成安全漏洞報告。 nsp 提供了一種自定義 check 命令的方法,可以隱藏所有低於給定 CVSS 分數的安全漏洞,或者當檢測到的任意一個安全漏洞的 CVSS 分數高於給定值,就會退出並顯示錯誤代碼。一旦通過 gather 命令保存了 advisories (公告)之後,nsp 也可以在離線模式下使用。

SENTRY

SENTRY 是一款錯誤追蹤工具,可以幫助實時監控並修復錯誤。像 Sentry 這樣的錯誤追蹤和管理工具,與類似 ELK Stack 這種傳統的日誌解決方案有所不同,前者更關注發現、調查和修復錯誤。Sentry 出現已經有一段時間了,並且非常流行——對於目前備受矚目的“平均故障恢復時間”,錯誤追蹤工具變得越來越有用武之地。因為能夠與 Github、Hipchat、Heroku、Slack 等平臺集成,Sentry 可以讓我們更聚焦於自己的應用。它能在產品發佈之後提供錯誤通知,讓我們跟蹤新的提交是否真正解決了問題,並且能在問題再次出現的時候進行通知。

四、語言 & 框架

KOTLIN

KOTLIN 的使用率得到了飛速增長,工具支持也突飛猛進。其流行的背後原因包括語法簡潔、空指針安全、易於從 Java 遷移以及與其他 JVM 語言的互操作性。並且,它還是非常不錯的函數式編程入門語言。隨著 JetBrains 添加了新功能,允許在多平臺將 Kotlin 編譯為原生二進制文件,以及可以轉譯為 JavaScript,我們相信,對於廣大移動和原生應用開發者來說,它具備進一步廣泛使用的潛力。儘管現在靜態分析和代碼覆蓋率分析這樣的工具還不成熟,但基於我們在許多產品應用上使用 Kotlin 的經驗,我們相信 Kotlin 已經可以廣泛採用。

ENZYME

ENZYME 已經成為了測試 React UI 組件的事實標準。與其他基於快照的測試工具不同,Enzyme 可以進行無設備渲染的測試,速度更快,粒度更細。這很大程度上減少了在 React 應用裡所需要的功能測試代碼。在大部分項目中,我們會結合單元測試框架(如 Jest)一起使用。

HYPERLEDGER COMPOSER

Hyperledger 項目現在已經發展成包含一系列子項目的大工程。針對不同業務需求,可以支持不同的區塊鏈實現方式。例如,Burrow 專門用來實現帶權限控制的 Ethereum,而 Indy 更專注於數字身份。在這些子項目中,Fabric 是最成熟的一個。當開發者們談到使用 Hyperledger 技術時,實際上大多數時候是在考慮 Hyperledger Fabric。然而,chaincode 的編程抽象相對底層,因為它直接處理賬本的狀態數據。此外,在編寫第一行區塊鏈代碼之前,搭建基礎設施也經常耗去很多時間。HYPERLEDGER COMPOSER 構建於 Fabric 基礎之上,加速了將想法實現為軟件的過程。Composer 提供 DSLs 來建立業務資源模型、定義訪問控制和構建業務網絡。使用 Composer,可以在不搭建任何基礎設施的情況下,僅通過瀏覽器來驗證我們的想法。需要明確的是,Composer 本身並不是區塊鏈,仍然需要把它部署在 Fabric 上。

FLUTTER

FLUTTER 是一個跨平臺的框架,可以使用 Dart 語言編寫原生 Mobile 應用。藉助 Dart,它能夠編譯成原生代碼,並直接和目標平臺通訊,而不必藉助橋接和上下文切換——這些可能導致框架中出現性能瓶頸,就像 React Native 或 Weex 那樣。Flutter 的熱重載(hot-reload)特性讓人驚歎,它能在編碼時為你提供超快的視覺反饋。目前,Flutter 仍在 Beta 階段,不過我們會持續關注它,瞭解其生態系統的成熟度。

RASA

RASA 是聊天機器人領域的新成員。 它並非使用簡單的決策樹,而是通過神經網絡將用戶意圖和內部狀態映射到回應上。Rasa 集成了自然語言處理解決方案(spaCy)。與技術雷達中的其他同類工具不同,Rasa 是開源軟件,可以自行託管,對於擔心數據所有權的使用者來說 Rasa 是一個可行的方案。我們在內部應用中使用了 Rasa Stack,效果良好。

REACTOR

REACTOR 是一個基於 Reactive Streams 規範的、用於開發非阻塞式應用程序的 JVM 庫,支持 JVM 8 及以上版本。響應式編程強調將命令式邏輯轉換成異步、非阻塞和函數式風格的代碼,特別是在處理外部資源時。Reactor 實現了 Reactive Streams 規範,並且提供了兩個不同的發佈者 API:Flux (0 到 N 個元素) 和 Mono (0 或 1 個元素),可以高效地對基於推送的流處理進行建模。Reactor 項目非常適合微服務架構,並且為 HTTP、WebSockets、TCP 和 UDP 等提供了支持背壓(backpressure)的網絡引擎。

RIBs

RIBs 即路由器(Router)、交互器(Interactor)和構建器(Builder)的縮寫, 是來自 Uber 的跨平臺移動架構框架。RIBs 的核心思想是將業務邏輯從視圖樹中分離出來,從而確保應用程序由業務邏輯驅動。 可以將其看作是 CleanArchitecture 模式在移動應用程序開發領域的一次應用。通過在原生 Android 和 iOS 應用上使用一致的架構模式,RIBs 為應用提供了清晰的狀態管理模式和良好的可測試性。儘管我們一直建議儘量將業務邏輯放在後端服務,不要將其洩漏到前端視圖中,但移動應用程序非常複雜,RIBs 可以幫助管理這種複雜性。

TENSORFLOW LITE

TENSORFLOW LITE 是我們上一期技術雷達中提到的 TensorFlow Mobile 的指定接班者。和 TensorFlow Mobile 一樣,TensorFlow Lite 是為移動設備 (安卓和 iOS) 做調整和優化的輕量級解決方案。我們預期的應用場景是將預訓練模型部署到移動端的應用程序中,令人驚喜的是,TensorFlow Lite 甚至還支持在設備上進行學習,這樣其應用領域會更加廣泛。

WEBASSEMBLY

WEBASSEMBLY 將“瀏覽器作為代碼執行環境”向前推進了一大步。它是一種二進制編譯格式,幾乎以原生速度跑在瀏覽器中,已經獲得所有主流瀏覽器的支持並向後兼容。它拓展了編寫前端功能的語言範圍,早期集中在 C、C++ 和 Rust,並且也可以作為 LLVM 的編譯目標。在沙盒中執行時,它可以和 JavaScript 交互並且共享相同的權限和安全模型。當和 Firefox 最新的流式編譯器一起使用時,也可以提升頁面初始化速度。儘管還處在早期階段,但是這個 W3C 標準絕對值得研究。

InfoQ 用戶福利

程序员必须关注的技术趋势,内附PDF下载链接

如果對自己的運氣沒有信心,但又特別想去這個大會,可以掃描下圖二維碼購票,更有免費 VIP 專家票限量申請。

今日薦文
程序员必须关注的技术趋势,内附PDF下载链接

卓越程序員煉成記


分享到:


相關文章: