技術(shù)雷達(dá)是由 ThoughtWorks 技術(shù)戰(zhàn)略委員會(TAB)經(jīng)由多番正式討論給出的最新技術(shù)趨勢報(bào)告凡辱,它以獨(dú)特的雷達(dá)形式對各類最新技術(shù)的成熟度進(jìn)行評估并給出建議戒职,為從程序員到CIO/CTO的利益相關(guān)者提供參考。
技術(shù)雷達(dá)的內(nèi)容來自于 ThoughtWorks 的觀察透乾、對話以及在應(yīng)對最令客戶棘手的業(yè)務(wù)挑戰(zhàn)時(shí)所沉淀下的一線經(jīng)驗(yàn)洪燥,其中既包含現(xiàn)有技術(shù),也包含新興技術(shù)乳乌。技術(shù)雷達(dá)報(bào)告使用可視化的方式將技術(shù)趨勢分為四組捧韵,分別涵蓋技術(shù)、平臺汉操、工具和語言與框架再来,每個(gè)領(lǐng)域又進(jìn)一步細(xì)分為暫緩、評估磷瘤、試驗(yàn)或采用芒篷。
本期四大主題
崛起的中國開源軟件市場
星星之火,已成燎原之勢采缚!在態(tài)度和政策發(fā)生轉(zhuǎn)變之后针炉,包括阿里巴巴和百度在內(nèi)的眾多大型中國企業(yè)正在積極發(fā)布開源框架、工具和平臺扳抽。中國軟件生態(tài)正伴隨著經(jīng)濟(jì)擴(kuò)張而加速成長篡帕。從這個(gè)巨大而繁榮的軟件市場向 GitHub 等開源網(wǎng)站發(fā)布的開源項(xiàng)目的數(shù)量必將持續(xù)增多殖侵,質(zhì)量也將持續(xù)提高。中國企業(yè)為何熱衷于將他們的眾多資產(chǎn)開源出來镰烧?與硅谷等其他活躍的軟件市場一樣拢军,各個(gè)企業(yè)對開發(fā)人員的爭奪十分激烈。緊緊提升薪酬水平是不夠的拌滋,讓聰明的開發(fā)者一起在最前沿的開源軟件上共事才能夠持續(xù)激勵(lì)他們朴沿,這是一個(gè)放之四海而皆準(zhǔn)的通則。我們預(yù)期主要的開源創(chuàng)意會繼續(xù)保持 README 文件中先有中文版后有英文版的趨勢败砂。
容器編排首選Kubernetes
Kubernetes 及其在許多項(xiàng)目中逐漸增強(qiáng)的主導(dǎo)性推動(dòng)了大量雷達(dá)條目的更新赌渣,以及更多的討論。似乎軟件開發(fā)生態(tài)系統(tǒng)正在 Kubernetes 及其相關(guān)工具的周邊穩(wěn)定發(fā)展昌犹,以解決有關(guān)部署坚芜、規(guī)模化和容器操作這些常見問題斜姥。諸如 GKE鸿竖,Kops 和 Sonobuoy 這些雷達(dá)條目提供了托管平臺服務(wù)和工具,以改善采用和運(yùn)行 Kubernetes 的整體體驗(yàn)铸敏。事實(shí)上缚忧,它具備用一個(gè)調(diào)度單元來運(yùn)行多個(gè)容器的能力,可以讓服務(wù)網(wǎng)格(service mesh)和能夠?qū)崿F(xiàn)端點(diǎn)安全的 sidecar 得以實(shí)現(xiàn)杈笔。 Kubernetes已經(jīng)成為容器的默認(rèn)操作系統(tǒng)——許多云提供商已經(jīng)利用其開放的模塊化架構(gòu)來采用和運(yùn)行Kubernetes闪水,而它的工具則可以利用其自身開放的API來訪問諸如負(fù)載、集群蒙具、配置和存儲等功能球榆。我們看到更多的產(chǎn)品正在把Kubernetes作為一個(gè)生態(tài)系統(tǒng)來使用,使其成為繼微服務(wù)和容器之后的下一個(gè)抽象層次禁筏。更多跡象表明持钉,盡管面臨分布式系統(tǒng)固有的復(fù)雜性,開發(fā)人員仍然可以成功地駕馭現(xiàn)代的架構(gòu)風(fēng)格篱昔。
成為新常態(tài)的云技術(shù)
本期技術(shù)雷達(dá)討論中的另一個(gè)普遍性話題每强,無疑是近期的“多云”天氣。 隨著云提供商的技術(shù)能力越來越強(qiáng)大旱爆,且可以提供同樣好用的功能舀射,公有云正在成為許多組織中新的默認(rèn)選擇。當(dāng)啟動(dòng)新項(xiàng)目時(shí)怀伦,許多公司已經(jīng)不再問“為什么放在云端?”山林,而是問“為什么不放在云端房待?”邢羔。 誠然,某些類型的軟件仍然要在公司內(nèi)部私有地部署桑孩,但隨著價(jià)格的下降和功能的擴(kuò)展拜鹤,云原生(cloud-native)開發(fā)的可行性越來越高。盡管主要的云解決方案提供商提供的基本功能都很相似流椒,但它們也都提供了一些獨(dú)特的產(chǎn)品特性敏簿,以針對特定類型的解決方案來實(shí)現(xiàn)差異化。因此宣虾,我們看到一些公司通過“多云”(Polycloud)策略來同時(shí)使用幾個(gè)不同的云提供商惯裕,從中分別挑選最能滿足其客戶需求的平臺專業(yè)能力。
各方對區(qū)塊鏈的信任穩(wěn)步增強(qiáng)
盡管加密貨幣市場仍然處于混沌狀態(tài)绣硝,我們的許多客戶已經(jīng)開始嘗試?yán)没趨^(qū)塊鏈的解決方案來處理分布式賬本和智能合約的需求蜻势。雷達(dá)中的一些條目展示了區(qū)塊鏈相關(guān)技術(shù)運(yùn)用的成熟度,它們使用各種新技術(shù)和編程語言并以一些有趣的方式來實(shí)現(xiàn)智能合約鹉胖。區(qū)塊鏈解決了“分布式信任”與“共享且不可篡改的賬本”這些老大難問題握玛。如今,許多公司正致力于增強(qiáng)其用戶對將區(qū)塊鏈作為系統(tǒng)的底層實(shí)現(xiàn)機(jī)制的信心甫菠。許多行業(yè)存在著明顯的“分布式信任”問題挠铲,我們期待區(qū)塊鏈技術(shù)能持續(xù)找出解決這些問題的方法。
部分亮點(diǎn)預(yù)覽
技術(shù)篇:
DesignOps:受DevOps運(yùn)動(dòng)的啟發(fā)寂诱,包含一系列實(shí)踐和文化轉(zhuǎn)變的DesignOps橫空出世拂苹。它可以幫助組織不斷重新設(shè)計(jì)產(chǎn)品,而不在質(zhì)量刹衫、服務(wù)一致性和團(tuán)隊(duì)的自主性上妥協(xié)醋寝。 DesignOps提倡創(chuàng)建并不斷演進(jìn)設(shè)計(jì)的基礎(chǔ),最大限度降低創(chuàng)造新的UI概念及其變體的工作量带迟,并與最終用戶建立快速可靠的反饋機(jī)制音羞。使用DesignOps,設(shè)計(jì)正在從一種具體的實(shí)踐演變成每個(gè)人工作內(nèi)容的一部分仓犬。
Chaos Engineering:在早期的技術(shù)雷達(dá)中嗅绰,我們討論了Netflix的Chaos Monkey。Chaos Monkey可以隨機(jī)終止生產(chǎn)系統(tǒng)中的運(yùn)行實(shí)例搀继,并對結(jié)果進(jìn)行度量窘面,從而幫助驗(yàn)證系統(tǒng)在運(yùn)行時(shí)對生產(chǎn)中斷的應(yīng)對能力。今天叽躯,人們有了一個(gè)新興術(shù)語來描述這一技術(shù)的廣泛應(yīng)用:混沌工程财边。在生產(chǎn)環(huán)境的分布式系統(tǒng)中運(yùn)行這些實(shí)驗(yàn),可以幫助我們建立系統(tǒng)在動(dòng)蕩環(huán)境下依舊能夠按預(yù)期工作的信心点骑。如果想要更好地理解這個(gè)技術(shù)方向酣难,請參閱混沌工程原理谍夭。
Service Mesh:現(xiàn)在越來越多的大型組織在向更加自組織的團(tuán)隊(duì)結(jié)構(gòu)轉(zhuǎn)型,這些團(tuán)隊(duì)擁有并運(yù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ù)嚙合的一個(gè)典型實(shí)現(xiàn)包含輕量級反向代理進(jìn)程济舆,這些進(jìn)程可能伴隨每個(gè)服務(wù)進(jìn)程一起被部署在單獨(dú)的容器中。反向代理會和服務(wù)注冊表莺债、身份提供者和日志聚合器等進(jìn)行通信滋觉。通過該代理的共享實(shí)現(xiàn)(而非共享的運(yùn)行時(shí)實(shí)例),我們可以獲得服務(wù)的互操作性和可觀測性齐邦。一段時(shí)間以來椎侠,我們一直主張去中心化的微服務(wù)管理方法,也很高興看到服務(wù)嚙合這種一致性模式的出現(xiàn)措拇。隨著 linkerd 和 Istio 等開源項(xiàng)目的成熟我纪,服務(wù)嚙合的實(shí)現(xiàn)將更加容易。
平臺篇:
TensorFlow Serving:機(jī)器學(xué)習(xí)模型已經(jīng)開始滲入到日常的商業(yè)應(yīng)用中丐吓。 當(dāng)有足夠的訓(xùn)練數(shù)據(jù)可用時(shí)浅悉,這些算法可以解決那些以前可能需要復(fù)雜的統(tǒng)計(jì)模型或試探法的問題。 隨著機(jī)器學(xué)習(xí)從試驗(yàn)性使用轉(zhuǎn)向生產(chǎn)環(huán)境券犁,需要一種可靠的方式來托管和部署這些可遠(yuǎn)程訪問的模型术健,并能隨著消費(fèi)者數(shù)量的增加而進(jìn)行擴(kuò)展。TensorFlow Serving 通過將遠(yuǎn)程gRPC接口暴露給一個(gè)被導(dǎo)出來的模型粘衬,解決了上述部分問題荞估。這允許以多種方式部署訓(xùn)練完成的模型。TensorFlow Serving 也接受一系列的模型來整合持續(xù)的訓(xùn)練更新稚新。其作者維護(hù)了一個(gè)Dockerfile來簡化部署過程勘伺。 據(jù)推測,gRPC 的選擇應(yīng)與 TensorFlow 執(zhí)行模型保持一致褂删。 但是飞醉,我們通常都會對需要代碼生成和本地綁定的協(xié)議保持警惕。
LoRaWAN:LoRaWAN是一種低功耗廣域網(wǎng)屯阀,專為低功耗冒掌、遠(yuǎn)距離和低比特率的通信場景而設(shè)計(jì)噪裕。它提供了邊緣設(shè)備與網(wǎng)關(guān)設(shè)備之間的通信能力蹲盘,能夠通過后者將數(shù)據(jù)轉(zhuǎn)發(fā)至應(yīng)用程序或者后臺服務(wù)股毫。LoRaWAN通常用于分布式傳感器組或物聯(lián)網(wǎng)這些必須具備長電池壽命和遠(yuǎn)距離通信能力特點(diǎn)的設(shè)備上。它解決了在使用一般的WiFi進(jìn)行低功耗廣域網(wǎng)通信時(shí)的兩個(gè)關(guān)鍵問題:通信距離和功耗召衔。LoRaWAN已有若干實(shí)現(xiàn)铃诬,其中值得注意的是一個(gè)免費(fèi)的開源實(shí)現(xiàn)——The Things Network。
Language Server Protocol:那些大型 IDE 的威力很大程度上源于利用源代碼分析出的抽象語法樹(AST)來進(jìn)一步分析和操作源代碼的能力苍凛,比如代碼補(bǔ)全趣席,調(diào)用分析和重構(gòu)。語言服務(wù)器將這種能力提取到單獨(dú)的進(jìn)程中醇蝴,從而讓任意文本編輯器都可以通過 API 來使用 AST宣肚。微軟從他們的 OmniSharp 和 TypeScript 服務(wù)器項(xiàng)目中,提煉并引領(lǐng)了"語言服務(wù)器協(xié)議"(Language Server Protocol, LSP)的擬定悠栓。編輯器只要使用 LSP 協(xié)議就可用于任何具備 LSP 兼容服務(wù)器的編程語言霉涨。這意味著我們可以繼續(xù)使用自己喜愛的編輯器,同時(shí)也不必放棄各種編程語言的高級編輯功能——這對于很多 Emacs 癮君子來說尤其利好惭适。
工具篇:
Gopass:gopass是一個(gè)基于GPG和Git的團(tuán)隊(duì)密碼管理解決方案笙瑟。它的前身是pass,并在此基礎(chǔ)上增加了諸如多用戶密碼管理癞志、層級式密碼存儲往枷、交互式查找、基于時(shí)間的一次性密碼(TOTP),以及二進(jìn)制存儲格式等功能凄杯。由于它的存儲格式與pass基本兼容错洁,因此可以直接從pass遷移過來。這意味著只需調(diào)用一次存儲密鑰就能將其集成到遷移的整備工作流中戒突。
Jupyter:過去幾年間屯碴,我們注意到分析筆記本應(yīng)用(analytics notebooks)的流行度在持續(xù)上升。這些應(yīng)用都是從 Mathematica 應(yīng)用中獲得靈感妖谴,能夠?qū)⑽谋玖薄?shù)據(jù)可視化和代碼活靈活現(xiàn)地融入到一個(gè)具備計(jì)算能力的文檔中。在上個(gè)版本的技術(shù)雷達(dá)中我們所提到的基于Clojure 的GorillaREPL膝舅,就屬于此類工具嗡载。但隨著人們對機(jī)器學(xué)習(xí)的興趣不斷增加,以及該領(lǐng)域中的從業(yè)者們逐漸將Python作為首選編程語言仍稀,大家開始集中關(guān)注Python分析筆記本了洼滚。其中 Jupyter 看起來在ThougthWorks團(tuán)隊(duì)中格外引入注目。
Rendertron:JavaScript Web 富應(yīng)用的一個(gè)老問題是如何使這些頁面的動(dòng)態(tài)渲染部分可供搜索引擎檢索技潘。為此開發(fā)人員采用了各種各樣的技巧遥巴,包括使用 React.js 的服務(wù)端渲染千康,外部服務(wù)或預(yù)渲染內(nèi)容。現(xiàn)在谷歌 Chrome 新的 headless 模式又貢獻(xiàn)了一個(gè)新的技巧—— Rendertron铲掐,即 Chrome的headless 渲染解決方案拾弃。它在一個(gè) Docker 容器中封裝了一個(gè) headless 的 Chrome 實(shí)例,可以作為獨(dú)立的HTTP服務(wù)器來部署摆霉。無法渲染JavaScript的爬蟲機(jī)器人可以被路由到此服務(wù)器來進(jìn)行渲染豪椿。 雖然開發(fā)人員也可以部署自己的 headless Chrome代理并配置相關(guān)的路由機(jī)制,但 Rendertron 簡化了配置和部署過程携栋,并提供了令爬蟲機(jī)器人進(jìn)行檢測和路由的中間件示例代碼搭盾。
語言&框架:
Gobot:Go語言能夠被編譯為裸片上運(yùn)行的目標(biāo)程序,這使得嵌入式系統(tǒng)開發(fā)領(lǐng)域?qū)λ呐d趣與日俱增 婉支。GoBot是一個(gè)用于機(jī)器人鸯隅、物理計(jì)算和物聯(lián)網(wǎng)(IoT)的框架,它基于Go語言編寫向挖,并且支持多個(gè)平臺蝌以。我們在一個(gè)對實(shí)時(shí)性響應(yīng)沒有要求的實(shí)驗(yàn)性機(jī)器人項(xiàng)目中使用了GoBot,并且用GoBot創(chuàng)建了開源的軟件驅(qū)動(dòng)户誓。GoBot的HTTP API使其與移動(dòng)設(shè)備的集成十分容易饼灿,從而能創(chuàng)建更豐富的應(yīng)用。
Solidity:智能合約編程需要一種比交易處理腳本更具表現(xiàn)力的語言帝美。在眾多為智能合約設(shè)計(jì)的新編程語言中碍彭,Solidity是最受歡迎的。這是一種面向合約的靜態(tài)類型語言悼潭,其語法類似于JavaScript庇忌。 它抽象了智能合約中自我實(shí)現(xiàn)的業(yè)務(wù)邏輯。圍繞Solidity的工具鏈也在快速成長舰褪。如今皆疹,Solidity是Ethereum平臺的首選編程語言。
CSS-in-JS:CSS-in-JS是一種用JavaScript編寫CSS樣式的技術(shù)占拍,通過鼓勵(lì)采用一種通用模式略就,編寫樣式以及應(yīng)用樣式的JavaScript組件,使樣式和邏輯的關(guān)注點(diǎn)得到統(tǒng)一晃酒。該領(lǐng)域中的新秀——諸如JSS表牢,emotion和styled-components,依靠工具來將CSS-in-JS代碼轉(zhuǎn)化成獨(dú)立的CSS樣式表贝次,從而適合在瀏覽器里運(yùn)行崔兴。這是在JavaScript中編寫CSS的第二代方法,與以前的方法不同,它不依賴于內(nèi)聯(lián)樣式敲茄,這意味著它能支持所有CSS特性位谋,使用npm生態(tài)共享CSS以及跨平臺使用組件。我們的團(tuán)隊(duì)發(fā)現(xiàn)styled-components很適合像React.js這樣基于組件的框架堰燎,并且可以使用jest-styled-components做CSS的單元測試掏父。這是個(gè)新興的領(lǐng)域且變化迅速。用該方法時(shí)爽待,在瀏覽器里人工調(diào)試生成的class名稱會需要費(fèi)些功夫损同,并且可能不適用于那些前端架構(gòu)不支持重用組件并需要全局樣式的項(xiàng)目。
以上是我們在最新一卷技術(shù)雷達(dá)中隨機(jī)摘取的幾個(gè)Blips鸟款,欲獲取整版技術(shù)雷達(dá),請點(diǎn)擊這里茂卦!