技術(shù)雷達是由 ThoughtWorks 技術(shù)戰(zhàn)略委員會(TAB)經(jīng)由多番正式討論給出的最新技術(shù)趨勢報告,它以獨特的雷達形式對各類最新技術(shù)的成熟度進行評估并給出建議,為從程序員到CIO/CTO的利益相關(guān)者提供參考。
技術(shù)雷達的內(nèi)容來自于 ThoughtWorks 的觀察、對話以及在應(yīng)對最令客戶棘手的業(yè)務(wù)挑戰(zhàn)時所沉淀下的一線經(jīng)驗,其中既包含現(xiàn)有技術(shù),也包含新興技術(shù)。技術(shù)雷達報告使用可視化的方式將技術(shù)趨勢分為四組,分別涵蓋技術(shù)、平臺、工具和語言與框架,每個領(lǐng)域又進一步細(xì)分為暫緩、評估、試驗或采用。
本期四大主題
崛起的中國開源軟件市場
星星之火,已成燎原之勢!在態(tài)度和政策發(fā)生轉(zhuǎn)變之后,包括阿里巴巴和百度在內(nèi)的眾多大型中國企業(yè)正在積極發(fā)布開源框架、工具和平臺。中國軟件生態(tài)正伴隨著經(jīng)濟擴張而加速成長。從這個巨大而繁榮的軟件市場向 GitHub 等開源網(wǎng)站發(fā)布的開源項目的數(shù)量必將持續(xù)增多,質(zhì)量也將持續(xù)提高。中國企業(yè)為何熱衷于將他們的眾多資產(chǎn)開源出來?與硅谷等其他活躍的軟件市場一樣,各個企業(yè)對開發(fā)人員的爭奪十分激烈。緊緊提升薪酬水平是不夠的,讓聰明的開發(fā)者一起在最前沿的開源軟件上共事才能夠持續(xù)激勵他們,這是一個放之四海而皆準(zhǔn)的通則。我們預(yù)期主要的開源創(chuàng)意會繼續(xù)保持 README 文件中先有中文版后有英文版的趨勢。
容器編排首選Kubernetes
Kubernetes 及其在許多項目中逐漸增強的主導(dǎo)性推動了大量雷達條目的更新,以及更多的討論。似乎軟件開發(fā)生態(tài)系統(tǒng)正在 Kubernetes 及其相關(guān)工具的周邊穩(wěn)定發(fā)展,以解決有關(guān)部署、規(guī)模化和容器操作這些常見問題。諸如 GKE,Kops 和 Sonobuoy 這些雷達條目提供了托管平臺服務(wù)和工具,以改善采用和運行 Kubernetes 的整體體驗。事實上,它具備用一個調(diào)度單元來運行多個容器的能力,可以讓服務(wù)網(wǎng)格(service mesh)和能夠?qū)崿F(xiàn)端點安全的 sidecar 得以實現(xiàn)。 Kubernetes已經(jīng)成為容器的默認(rèn)操作系統(tǒng)——許多云提供商已經(jīng)利用其開放的模塊化架構(gòu)來采用和運行Kubernetes,而它的工具則可以利用其自身開放的API來訪問諸如負(fù)載、集群、配置和存儲等功能。我們看到更多的產(chǎn)品正在把Kubernetes作為一個生態(tài)系統(tǒng)來使用,使其成為繼微服務(wù)和容器之后的下一個抽象層次。更多跡象表明,盡管面臨分布式系統(tǒng)固有的復(fù)雜性,開發(fā)人員仍然可以成功地駕馭現(xiàn)代的架構(gòu)風(fēng)格。
成為新常態(tài)的云技術(shù)
本期技術(shù)雷達討論中的另一個普遍性話題,無疑是近期的“多云”天氣。 隨著云提供商的技術(shù)能力越來越強大,且可以提供同樣好用的功能,公有云正在成為許多組織中新的默認(rèn)選擇。當(dāng)啟動新項目時,許多公司已經(jīng)不再問“為什么放在云端?”,而是問“為什么不放在云端?”。 誠然,某些類型的軟件仍然要在公司內(nèi)部私有地部署,但隨著價格的下降和功能的擴展,云原生(cloud-native)開發(fā)的可行性越來越高。盡管主要的云解決方案提供商提供的基本功能都很相似,但它們也都提供了一些獨特的產(chǎn)品特性,以針對特定類型的解決方案來實現(xiàn)差異化。因此,我們看到一些公司通過“多云”(Polycloud)策略來同時使用幾個不同的云提供商,從中分別挑選最能滿足其客戶需求的平臺專業(yè)能力。
各方對區(qū)塊鏈的信任穩(wěn)步增強
盡管加密貨幣市場仍然處于混沌狀態(tài),我們的許多客戶已經(jīng)開始嘗試?yán)没趨^(qū)塊鏈的解決方案來處理分布式賬本和智能合約的需求。雷達中的一些條目展示了區(qū)塊鏈相關(guān)技術(shù)運用的成熟度,它們使用各種新技術(shù)和編程語言并以一些有趣的方式來實現(xiàn)智能合約。區(qū)塊鏈解決了“分布式信任”與“共享且不可篡改的賬本”這些老大難問題。如今,許多公司正致力于增強其用戶對將區(qū)塊鏈作為系統(tǒng)的底層實現(xiàn)機制的信心。許多行業(yè)存在著明顯的“分布式信任”問題,我們期待區(qū)塊鏈技術(shù)能持續(xù)找出解決這些問題的方法。
部分亮點預(yù)覽
技術(shù)篇:
DesignOps:受DevOps運動的啟發(fā),包含一系列實踐和文化轉(zhuǎn)變的DesignOps橫空出世。它可以幫助組織不斷重新設(shè)計產(chǎn)品,而不在質(zhì)量、服務(wù)一致性和團隊的自主性上妥協(xié)。 DesignOps提倡創(chuàng)建并不斷演進設(shè)計的基礎(chǔ),最大限度降低創(chuàng)造新的UI概念及其變體的工作量,并與最終用戶建立快速可靠的反饋機制。使用DesignOps,設(shè)計正在從一種具體的實踐演變成每個人工作內(nèi)容的一部分。
Chaos Engineering:在早期的技術(shù)雷達中,我們討論了Netflix的Chaos Monkey。Chaos Monkey可以隨機終止生產(chǎn)系統(tǒng)中的運行實例,并對結(jié)果進行度量,從而幫助驗證系統(tǒng)在運行時對生產(chǎn)中斷的應(yīng)對能力。今天,人們有了一個新興術(shù)語來描述這一技術(shù)的廣泛應(yīng)用:混沌工程。在生產(chǎn)環(huán)境的分布式系統(tǒng)中運行這些實驗,可以幫助我們建立系統(tǒng)在動蕩環(huán)境下依舊能夠按預(yù)期工作的信心。如果想要更好地理解這個技術(shù)方向,請參閱混沌工程原理。
Service Mesh:現(xiàn)在越來越多的大型組織在向更加自組織的團隊結(jié)構(gòu)轉(zhuǎn)型,這些團隊擁有并運營自己的微服務(wù),但他們?nèi)绾卧诓灰蕾嚰惺酵泄艿幕A(chǔ)架構(gòu)下,確保服務(wù)之間必要的一致性與兼容性呢?為了確保服務(wù)之間的有效協(xié)作,即使是自組織的微服務(wù)也需要與一些組織標(biāo)準(zhǔn)對齊。服務(wù)嚙合在服務(wù)發(fā)現(xiàn)、安全、跟蹤、監(jiān)控與故障處理方面提供了一致性,且不需要像API網(wǎng)關(guān)或ESB這樣的共享資產(chǎn)。服務(wù)嚙合的一個典型實現(xiàn)包含輕量級反向代理進程,這些進程可能伴隨每個服務(wù)進程一起被部署在單獨的容器中。反向代理會和服務(wù)注冊表、身份提供者和日志聚合器等進行通信。通過該代理的共享實現(xiàn)(而非共享的運行時實例),我們可以獲得服務(wù)的互操作性和可觀測性。一段時間以來,我們一直主張去中心化的微服務(wù)管理方法,也很高興看到服務(wù)嚙合這種一致性模式的出現(xiàn)。隨著 linkerd 和 Istio 等開源項目的成熟,服務(wù)嚙合的實現(xiàn)將更加容易。
平臺篇:
TensorFlow Serving:機器學(xué)習(xí)模型已經(jīng)開始滲入到日常的商業(yè)應(yīng)用中。 當(dāng)有足夠的訓(xùn)練數(shù)據(jù)可用時,這些算法可以解決那些以前可能需要復(fù)雜的統(tǒng)計模型或試探法的問題。 隨著機器學(xué)習(xí)從試驗性使用轉(zhuǎn)向生產(chǎn)環(huán)境,需要一種可靠的方式來托管和部署這些可遠程訪問的模型,并能隨著消費者數(shù)量的增加而進行擴展。TensorFlow Serving 通過將遠程gRPC接口暴露給一個被導(dǎo)出來的模型,解決了上述部分問題。這允許以多種方式部署訓(xùn)練完成的模型。TensorFlow Serving 也接受一系列的模型來整合持續(xù)的訓(xùn)練更新。其作者維護了一個Dockerfile來簡化部署過程。 據(jù)推測,gRPC 的選擇應(yīng)與 TensorFlow 執(zhí)行模型保持一致。 但是,我們通常都會對需要代碼生成和本地綁定的協(xié)議保持警惕。
LoRaWAN:LoRaWAN是一種低功耗廣域網(wǎng),專為低功耗、遠距離和低比特率的通信場景而設(shè)計。它提供了邊緣設(shè)備與網(wǎng)關(guān)設(shè)備之間的通信能力,能夠通過后者將數(shù)據(jù)轉(zhuǎn)發(fā)至應(yīng)用程序或者后臺服務(wù)。LoRaWAN通常用于分布式傳感器組或物聯(lián)網(wǎng)這些必須具備長電池壽命和遠距離通信能力特點的設(shè)備上。它解決了在使用一般的WiFi進行低功耗廣域網(wǎng)通信時的兩個關(guān)鍵問題:通信距離和功耗。LoRaWAN已有若干實現(xiàn),其中值得注意的是一個免費的開源實現(xiàn)——The Things Network。
Language Server Protocol:那些大型 IDE 的威力很大程度上源于利用源代碼分析出的抽象語法樹(AST)來進一步分析和操作源代碼的能力,比如代碼補全,調(diào)用分析和重構(gòu)。語言服務(wù)器將這種能力提取到單獨的進程中,從而讓任意文本編輯器都可以通過 API 來使用 AST。微軟從他們的 OmniSharp 和 TypeScript 服務(wù)器項目中,提煉并引領(lǐng)了"語言服務(wù)器協(xié)議"(Language Server Protocol, LSP)的擬定。編輯器只要使用 LSP 協(xié)議就可用于任何具備 LSP 兼容服務(wù)器的編程語言。這意味著我們可以繼續(xù)使用自己喜愛的編輯器,同時也不必放棄各種編程語言的高級編輯功能——這對于很多 Emacs 癮君子來說尤其利好。
工具篇:
Gopass:gopass是一個基于GPG和Git的團隊密碼管理解決方案。它的前身是pass,并在此基礎(chǔ)上增加了諸如多用戶密碼管理、層級式密碼存儲、交互式查找、基于時間的一次性密碼(TOTP),以及二進制存儲格式等功能。由于它的存儲格式與pass基本兼容,因此可以直接從pass遷移過來。這意味著只需調(diào)用一次存儲密鑰就能將其集成到遷移的整備工作流中。
Jupyter:過去幾年間,我們注意到分析筆記本應(yīng)用(analytics notebooks)的流行度在持續(xù)上升。這些應(yīng)用都是從 Mathematica 應(yīng)用中獲得靈感,能夠?qū)⑽谋?、?shù)據(jù)可視化和代碼活靈活現(xiàn)地融入到一個具備計算能力的文檔中。在上個版本的技術(shù)雷達中我們所提到的基于Clojure 的GorillaREPL,就屬于此類工具。但隨著人們對機器學(xué)習(xí)的興趣不斷增加,以及該領(lǐng)域中的從業(yè)者們逐漸將Python作為首選編程語言,大家開始集中關(guān)注Python分析筆記本了。其中 Jupyter 看起來在ThougthWorks團隊中格外引入注目。
Rendertron:JavaScript Web 富應(yīng)用的一個老問題是如何使這些頁面的動態(tài)渲染部分可供搜索引擎檢索。為此開發(fā)人員采用了各種各樣的技巧,包括使用 React.js 的服務(wù)端渲染,外部服務(wù)或預(yù)渲染內(nèi)容?,F(xiàn)在谷歌 Chrome 新的 headless 模式又貢獻了一個新的技巧—— Rendertron,即 Chrome的headless 渲染解決方案。它在一個 Docker 容器中封裝了一個 headless 的 Chrome 實例,可以作為獨立的HTTP服務(wù)器來部署。無法渲染JavaScript的爬蟲機器人可以被路由到此服務(wù)器來進行渲染。 雖然開發(fā)人員也可以部署自己的 headless Chrome代理并配置相關(guān)的路由機制,但 Rendertron 簡化了配置和部署過程,并提供了令爬蟲機器人進行檢測和路由的中間件示例代碼。
語言&框架:
Gobot:Go語言能夠被編譯為裸片上運行的目標(biāo)程序,這使得嵌入式系統(tǒng)開發(fā)領(lǐng)域?qū)λ呐d趣與日俱增 。GoBot是一個用于機器人、物理計算和物聯(lián)網(wǎng)(IoT)的框架,它基于Go語言編寫,并且支持多個平臺。我們在一個對實時性響應(yīng)沒有要求的實驗性機器人項目中使用了GoBot,并且用GoBot創(chuàng)建了開源的軟件驅(qū)動。GoBot的HTTP API使其與移動設(shè)備的集成十分容易,從而能創(chuàng)建更豐富的應(yīng)用。
Solidity:智能合約編程需要一種比交易處理腳本更具表現(xiàn)力的語言。在眾多為智能合約設(shè)計的新編程語言中,Solidity是最受歡迎的。這是一種面向合約的靜態(tài)類型語言,其語法類似于JavaScript。 它抽象了智能合約中自我實現(xiàn)的業(yè)務(wù)邏輯。圍繞Solidity的工具鏈也在快速成長。如今,Solidity是Ethereum平臺的首選編程語言。
CSS-in-JS:CSS-in-JS是一種用JavaScript編寫CSS樣式的技術(shù),通過鼓勵采用一種通用模式,編寫樣式以及應(yīng)用樣式的JavaScript組件,使樣式和邏輯的關(guān)注點得到統(tǒng)一。該領(lǐng)域中的新秀——諸如JSS,emotion和styled-components,依靠工具來將CSS-in-JS代碼轉(zhuǎn)化成獨立的CSS樣式表,從而適合在瀏覽器里運行。這是在JavaScript中編寫CSS的第二代方法,與以前的方法不同,它不依賴于內(nèi)聯(lián)樣式,這意味著它能支持所有CSS特性,使用npm生態(tài)共享CSS以及跨平臺使用組件。我們的團隊發(fā)現(xiàn)styled-components很適合像React.js這樣基于組件的框架,并且可以使用jest-styled-components做CSS的單元測試。這是個新興的領(lǐng)域且變化迅速。用該方法時,在瀏覽器里人工調(diào)試生成的class名稱會需要費些功夫,并且可能不適用于那些前端架構(gòu)不支持重用組件并需要全局樣式的項目。
以上是我們在最新一卷技術(shù)雷達中隨機摘取的幾個Blips,欲獲取整版技術(shù)雷達,請點擊這里!





