從Visual Studio 2017談起,解析微軟技術生態進化之道
作者|何愷鐸
編輯|尾尾
曾經被業界取笑「閉關鎖國」的微軟如今也走向了「改革開放」的道路,Visual Studio 2017 的發布,不僅是 VS 二十周年的大事件,更是微軟技術生態煥然一新的直觀體驗。以前只支持 Windows 及自家產品的微軟,現在 iOS、Android、Mac 都支持了。
寫在前面
北京時間 2017 年 3 月 8 日凌晨,Visual Studio 2017 如期發布。今年恰逢 Visual Studio 二十周年,Visual Studio 團隊可謂誠意滿滿、不負眾望——VS2017 不僅擁有全新的模塊化設計和更強的性能,功能上也是具有頗多看點和干貨,絕非不痛不癢的“年貨式”更新。更重要的意義在于,它折射出了微軟對于業界技術趨勢的最新思考,也展現出了微軟擁抱開發者社區的全新姿態。
大家可能還記得鮑爾默在眾人前高喊"Developers, developers, developers!"的場景,這說明微軟本有著非常重視開發者社區和開發者體驗的傳統。然而前些年,也許是失之于封閉和捆綁,微軟在開發者群體中的影響力走勢低迷。將各技術產品線進行排他性整合的思維最終被證明是不受歡迎的——在這個崇尚開源的互聯網時代,它反而削弱了微軟各大技術平臺的競爭力。
好在新任 CEO 納德拉執掌公司以來,給微軟帶來了巨大的思維方式的轉變,開放與協作迅速成為了主旋律。 嶄新的公司文化幫助微軟的技術生態跳出了過去的窠臼和局限,并逐漸進入了一種生機盎然的絕佳狀態。本文試圖通過梳理 VS 2017 的諸多特性,從編程語言及其工具體系、移動和云、容器化和 DevOps 等不同視角來探討 Visual Studio 乃至整個微軟技術棧的基因變化,解析其進化之道。
編程語言及其工具體系
Visual Studio 2017 一如既往地為多種編程語言提供了原生支持,如C#、TypeScript/JavaScript、C++、F#、Visual Basic 等,也集成了這些語言的最新版本。
C#語言穩步發展,開始支持模式匹配
眾所周知,VS 的當家語言是C#。C#現已是一門多范式的主流編程語言,歷久彌新,LINQ、dynamic、async/await 等標志性特性使其在世界范圍內擁有眾多擁躉。新版 Visual Studio 按照慣例帶來了全新的 C# 語言版本C#7,新增了 Out 變量(Out variables)、元組值類型(Tuples)、引用返回(Ref locals and returns)、本地函數(local functions)等特性。C#7 的演化思路很清晰,是在C#6 的基礎上帶來穩健的增量更新,使代碼更為簡練,可讀性和可維護性更強,進一步鞏固 C# 主流編程語言的地位。
最值得一提的新特性,恐怕要數模式匹配(pattern matching)了。這一標志性的函數式編程范式引入 C# 后,巧妙地融入了原有的 is 關鍵詞和 switch 語句,可在諸多場合大幅簡化繁瑣的變量聲明、if 語句和類型轉換,凸顯業務邏輯本身。
與此同時,我們還能夠看到 C# 語言團隊的謹慎和克制——因為模式匹配原本計劃做得更加深入,如加入 match 關鍵詞和類型分解(destructuring)等高級特性,但 C# 團隊最終選擇了暫時避免激進變化,采用了更溫和更穩健的策略。這樣的一種克制,對于 C# 這樣具有較重歷史負擔和大量遺留代碼的語言來說,是一種對龐大的用戶群體負責任的態度,也降低了眾多 C# 開發者學習和升級的門檻。
Roslyn 編譯器為 C# 發展推波助瀾
C#眾多新特性的背后,離不開 Roslyn 編譯平臺的堅定支撐。歷經數年孵化的 Roslyn 使用 C# 實現了一個現代的 C# 編譯器,現已能完全替代原有的 C++ 實現,真正走向了成熟。任何語言的生命力源于一個開放的、架構良好的、可維護的編譯器 code base,開源的 Roslyn 做到了這一點。像前面提到的模式匹配的類型分解,其實在 Roslyn 平臺上實現并不困難,甚至已經有了初步的代碼實現。因此,全新出發的 Roslyn 平臺,是 C# 后續良好快速發展的保證,我們對 C# 的未來應當充滿信心。
Roslyn 帶來的另一個好處是強大的編譯器 API 和元數據暴露能力,也在 VS2017 中得以體現,提高了生產效率。在使用 VS2017 時不難發現,最常用的查找所有引用(“Find All References”)的結果得到了良好的格式化和語法高亮,還支持更多的展現選項;“Ctrl + .” 的智能提示組合鍵也變得更加強大,覆蓋了更多場景,還能幫助開發者遷移代碼到C#7——這些都離不開 Roslyn 的加持。之前類似的功能可能需要通過第三方商業擴展(如 JetBrains 的 Resharper)才能擁有,而現在相當部分已經在 Visual Studio 中直接內置了。
頗受好評的 TypeScript 持續快速迭代,同時支撐了新版 Visual Studio 中的 JavaScript 工具體系
TypeScript 是微軟近年來的另一個重大投入,由 C# 之父 Anders Hejlsberg 親自掌舵,可以理解為 JavaScript 語言的一個超集。TypeScript 設計和發展的思路緊緊圍繞兩點:一是引入可選的強類型機制,以提供強大的編譯期檢查和智能提示;二是全面擁抱乃至提前實現 ECMAScript 標準,使得眾多開發者可以第一時間嘗鮮,不必等待瀏覽器的內置支持,而對標準的遵循也使得開發者的學習成本得以攤薄。
這兩個正確的設計決定讓 TypeScript 具備了鮮明的強類型生產力特征,同時又能與 JavaScript 和 Node.js 的已有社區成果深度兼容。因此,TypeScript 一經推出就廣受歡迎,在近年不斷獲得關注和采用。如 Angular 框架團隊于 2015 年宣布 Angular2 放棄自有的 AtScript 轉而使用 TypeScript,堪稱微軟與谷歌開源技術合作的破冰之舉。
毫無疑問,VS2017 自然內置了最新的 TypeScript 2.2 版本。除去在 Visual Studio 中開發和編輯 TypeScript 代碼的豐富體驗外,基于 TypeScript 的核心能力和強類型生態,Visual Studio 2017 還全新打造了 JavaScript Language Service(原開發代號"Salsa")來支撐在新版 VS 中的 JavaScript tooling 體系。
換句話說,微軟基于 TypeScript 的能力打造了為 JavaScript 開發服務的語言基礎設施,類似 Roslyn 對于 C# 的基石作用,使得 VS 中 JavaScript 相關的智能提示、代碼導航、代碼重構等體驗取得了大幅改進。之所以相關能力可以躍升,基于 TypeScript 的靜態代碼分析引擎功不可沒,它替換了老舊的主要依賴動態執行獲取信息的 Intellisense 引擎 。另外,JavaScript 編輯時上下文中的靜態類型信息既可以來自 TypeScript 生態的大量強類型定義(主要由 DefinitelyTyped 項目提供),也支持解析社區常見的 JSDoc,這是又一個亮點。
TypeScript 近期版本還不斷地加強了對 JSX 語法的原生語言級別支持(JSX 自 TypeScript 1.6 版本開始引入)。從面向 React.js 進行 JSX 特性的設計,一直到最近為 React Native 進行適配和優化——傾聽社區聲音的 TypeScript 非常接地氣 ,體現了對流行框架的支持和融合。
微軟技術棧中的其他語言,也在 Visual Studio 2017 中得到了更新,如C++、F#和 Visual Basic。其中,C++進一步實現了C++14 和C++17 標準中的特性,并開始支持跨平臺開發;F#發布 4.1 版本,提出要成為具備最佳效率工具支持的現代函數式編程語言;而 Visual Basic 則將一定程度停止對 C# 的簡單克隆,著重發展自己的特色。因篇幅所限,此處就不再展開。
以 Visual Studio 2017 領軍的 VS 家族已經完成布局,形成了一個開發生態的矩陣
伴隨著新生的 Visual Studio 2017 一起陸續走到前臺的同門兄弟,還包括開源、跨平臺、多語言支持的輕量級開發環境 Visual Studio Code 以及由 Xamarin Studio 發展而來的 Visual Studio for Mac(仍處 Preview 狀態),它們都已是 Visual Studio 大家庭里的重要成員。
前面文中提到的C#、TypeScript 等語言的新版本和新特性,得益于相應語言基礎設施的開放性和模塊化,也都可以在 VSCode 和 VS for Mac 中找到并使用。例如 Visual Studio Code 中完善的 C# 支持,是通過一個巧妙的被稱為 Omnisharp Server 的后臺 Http 服務進程實現了對代碼結構的實時解析和智能提示,而在 Omnisharp 背后進行支撐的正是 Roslyn。
移動和云
“移動為先,云為先”是微軟的全新戰略,因此 Visual Studio 2017 對這兩方向的開發支持都進行了巨大的投入,達到了新的高度。
移動開發方面微軟采用了迂回策略,通過C#/Xamarin 和 JavaScript/Cordova 吸引兩大陣營開發者,進軍 Android/iOS 應用開發
移動方面,去年微軟成功地完成了對 Xamarin 的收購,終于將 Xamarin 賴以成名的利用 C# 編寫 Android、iOS、Mac 等平臺原生應用的能力收入囊中,并與微軟產品線進行整合——此舉受到了 .Net 社區的廣泛歡迎。今天我們看到的 Visual Studio 2017 已經體現了整合的成果:用戶們不必再額外付費購買昂貴的 Xamarin 商業套件,新版 Visual Studio 中已經直接納入了使用 C# 語言和類庫生態編寫 Android/iOS 應用的能力,大幅降低了使用 Xamarin 技術的門檻。
并入微軟官方體系之后,Xamarin 的生態也許將逐漸迎來真正意義上的繁榮時期。不過對于中國的廣大開發者來說,國內目前 Xamarin 的聲量還比較小,對國內移動互聯網生態(如認證、分享、支付等)尚無太多的官方支持和兼容考慮,這可能會成為國內公司使用 Xamarin 進行移動開發的主要障礙。如果微軟和社區在這方面進行積極的合作和推動,解決這樣的“水土不服”問題,相信國內的 Xamarin 成功案例也將開始涌現。
除 Xamarin 外,微軟在移動開發還有另一套基于 Apache Cordova 的解決方案,以吸引 JavaScript 和 Web 技術背景的移動開發者。Visual Studio 團隊其實多年前就開始構建 Visual Studio Tools for Apache Cordova(簡稱 TACO),試圖為開發者提供一站式的 Cordova 開發體驗,幫助解決繁雜的安裝、依賴梳理、環境配置、調試支持等工具鏈問題——這正是 Visual Studio 所擅長的。Visual Studio 2017 帶來了新版的 TACO,在相關體驗上再次上了一個新的臺階,還支持最新版本的 Ionic2 框架,有興趣的朋友不妨一試。
跨平臺 .Net Core 走向成熟,成為適合云端的應用構建選擇
云計算方面,日前微軟 Azure 在公有云領域穩居世界第二,且勢頭不斷攀升,已是微軟整體業績的重要增長引擎。毫無疑問,Visual Studio 2017 不遺余力地為開發云端應用程序準備了最新最強的支持。
為云助力的第一要務,是幫助開發者構建適應在云端環境運行的應用程序。.Net Core 和 Asp.Net Core 在此處扮演了重要角色,因為它們具有良好的跨平臺支持,并且能夠比較輕量地連同整個 runtime 一起打包進行自包含部署(Self-Contained Deployment)。之前 .Net Core/Asp.Net Core 曾在 Visual Studio 2015 中試水,并隨著技術思路的調整在 VS2015 的多次更新中不斷變化。終于,Visual Studio 2017 正式將蛻變完全的 .Net Core 和 Asp.Net Core 項目作為一等公民。之前因為 .Net Core 生態處于預覽狀態而擔心穩定性和 breaking change 的朋友們,現在則可以放心大膽地使用了。
.Net Core 和 Asp.Net Core 的歷史和關系說起來頗為有趣:多年前 Asp.Net 團隊在微軟內部就以開放和進取著稱,他們在設計下一代的時稱 Asp.Net 5 的框架時(早期代號為 Project K ),雄心勃勃地希望加入自包含部署、即時編譯、跨平臺運行等特性,并在當時 .Net 的工具鏈和運行時尚不能支持相關需求的情況下,竟自底向上地開發出了一套相對獨立的生態和工具鏈(DNX),事實上領先于 .Net Core 的孵化。Asp.Net 5 的預覽版發布后,在設計和性能上都取得了相當好的反響,聲勢上反倒蓋過了標準 .Net Core Tooling,一度造成了略顯尷尬、令人費解的局面。
令人高興的是,經過了一段相當長的過渡時期后,兩個團隊逐漸走向了協調和融合,期間 Asp.Net 5 重命名為了 Asp.Net Core,并最終完全基于 .Net Core 的 CLI 進行管理和運行。直到最近 Visual Studio 2017 發布時,DNX 工具鏈的最后標志 project.json 描述文件也隨著 .Net Core Tools 1.0 的正式交付而退出歷史舞臺,進化后的 csproj/msbuild 體系則再次統一項目模型。這一段軼事其實也折射出了微軟自我革新的歷程,可謂好事多磨,終成善果。
Azure 上的 PaaS 能力不斷推陳出新,Visual Studio 幫助大幅降低使用門檻
為云助力的另一角度,是需要為 Azure 上琳瑯滿目的 PaaS 特性提供支持和無縫集成,這部分一直由 Azure SDK 進行支撐。在 Visual Studio 2017 的 Azure 套件中,自然包含各種基于 PaaS 的云端項目模板,為用戶采用 Azure 的特性提供了一站式解決方案,典型的如 WebJob 和 Service Fabric。而對于需要消費 PaaS 和各種標準 API 的應用程序,Visual Studio 的 Connected Service 也能夠幫助開發者迅速地連接和配置這些平臺或服務。此外,Azure SDK 所包含的 Azure 模擬器可以幫助開發者在本機虛擬云端環境,極大地方便了云端應用程序在本地的開發和調試。
針對大數據處理和計算的 PaaS 能力是當前公有云廠商爭奪的重點。Azure 近來在此領域內動作頻頻,一方面不斷深化與 HortonWorks 的合作,高頻率地強化和更新 HDInsight(基于 HDP);另一方面 PaaS 化程度更高的 Azure Data Lake 也已結束了預覽進入 GA 狀態。Azure Data Lake 上的數據分析頗具特色,可使用微軟自研的U-SQL 語言結合 SQL 和 C# 的特點進行混合編程,給大規模數據處理和查詢帶來了讓人耳目一新的方式,受到 .Net 生態開發者的歡迎。在 Visual Studio 2017 中,開發者可以很方便地連接和管理云端的大數據資產,并創建相應生態的應用程序,如U-SQL、Storm、Hive、Pig 等。
總結移動和云方面,微軟可謂兼收并蓄,與時俱進。同時,通過充分利用 Visual Studio 這樣的生產力工具,微軟成功地對各種平臺和不同層面運行環境下的開發單元進行了良好的抽象,給予了開發者多樣化的選擇。
容器化和 DevOps
微軟同 Docker 進行深度合作,融入容器生態圈
容器化和 DevOps 已成行業熱詞,微軟自然不會錯過相關生態的布局,之前就成功而及時地與 Docker 達成了深度合作。在這個領域,微軟做了三件看起來非常具有前瞻性的事情,一是與 Docker 合作催生 Windows 容器,包括 Windows Server Core 和 Windows Nano Server 兩種形式,以方便傳統 Windows 應用程序向 Docker 容器遷移;二是著力優化 Windows 作為 Docker 宿主的能力和體驗,使得 Linux 容器能夠通過 Docker for Windows 穩定輕快地運行于開發人員 Windows 上,Docker 的原生支持也添加進了 Windows Server 2016 中;三是不失時機地推出了 Azure 容器服務(Azure Container Service),使得基于容器的大規模應用程序能夠順利地在微軟云中部署生根。
受益于上述策略的不斷落地,在 Visual Studio 2017 中進行流暢的容器化應用開發可謂水到渠成。我們可以輕松地為相關 Project 添加 Dockerfile 打包應用進容器,并在 Solution 層面使用 Docker Compose 進行容器編排。筆者曾嘗試在較短時間內建立起若干簡單的 Asp.Net Core 微服務,并互相組合形成了基于微服務架構的應用程序,然后通過 Visual Studio 在本機的多個 Linux 容器上一鍵部署運行。更方便的是,Visual Studio 2017 還幫助生成了 .Net Core 調試相關的 Docker 配置,使得調試模式下運行在 Linux 容器內的代碼輕松地命中了 VS 內的預設斷點!這樣的單機多容器“遠程”調試確乎是一種奇妙的體驗。
Azure 容器服務是微軟云的容器解決方案,支持多種編排引擎
前面提到的 Azure 容器服務,值得再略著一些筆墨。有不少人認為,容器生態的不斷發展對于傳統 PaaS 形成了強而有力的挑戰,因為細粒度的容器一定程度上可以替代 PaaS,同時提供更大的靈活度以及可移植性——很多情況下的確如此。在這一問題上,Azure 選擇了兩邊下注,在繼續不斷發展 PaaS 的同時(比如積極投入 Azure Functions 這樣的 Serverless 計算框架),也擁抱容器生態,推出并不斷改進 Azure Container Service 。保留不同粒度的抽象,把選擇權留給客戶,的確是最佳方案。目前 Azure 容器服務已支持 Docker Swarm、Mesosphere DC/OS 和 Kubernetes 三大編排引擎,同時底層利用 Azure VM Scale Set 特性優美地實現了彈性擴容。
VSTS/TFS 提供了現代的持續集成能力
真正的 DevOps 離不開持續集成 pipeline 的搭建和管理。在大家的印象中,Visual Studio 一直有比較好的手動發布支持,可以方便地一鍵部署應用程序至本地或云端。Visual Studio 2017 已更進一步,通過與云端 Visual Studio Team Service (VSTS)或本地 Team Foundation Server (TFS)的深度配合,可徹底將 CI/CD 的流程串聯并打通,實現自動編譯、測試、發布和部署。
最新版本的 VSTS/TFS 不但讓完整的 DevOps 流程開箱即用,并且從設計理念上充分考慮了開放性,可以在 CI/CD pipeline 的不同環節使用不同的技術:如使用 GitHub 的倉庫進行源代碼獲取和編譯觸發,又如支持以 Docker 為構建和發布的基本單位,再如使用 Octopus Deploy 進行部署等。此間,Azure 也扮演重要角色,既可以提供動態伸縮的 Build Agent,又能夠作為應用最終部署的目的地。
DevOps 流程中容易忽視的一個痛點在于關系型數據庫 schema 的版本控制和升級,實踐中往往需要依賴手動編寫的遷移腳本進行人工操作——這與 DevOps 的精神是相違背的。為了嘗試解決這一問題,微軟與第三方工具提供商 Redgate 進行了合作,首次將價值不菲的 Redgate Data Tools 內置于 Visual Studio 2017 企業版中。Redgate 相關工具的妙處在于,不僅能夠將數據庫 schema 進行完善的源代碼管理和編譯檢查,更能記錄不同版本的演化細節,并在 VSTS 的配合下自動地增量更新到 CI pipeline 的各個數據庫中,包括在審批后到達最終的生產環境。
展望與期待
不知不覺,Visual Studio 已經走過 20 個年頭。 Visual Studio 2017 是一個重要的里程碑,同時也是一個新的開始。我們有理由相信 VS2017 還將不斷升級,把握新的機遇。事實上,微軟已經開始為 VS2017 準備后續的更新,并緊鑼密鼓地發布了 Visual Studio Preview,使得開發者們能夠在正式的 Update 發布之前就可以率先嘗試即將到來的新特性。
通過 Visual Studio Preview 我們可以知道,在未來的 VS2017 Update1 中,全新的 Python 開發環境將粉墨登場,還會帶來支撐 Windows 10 Creator Update 新特性的 UWP 套件更新。之后,還會有針對數據科學和分析類應用程序(Data science and analytical applications)開發的專屬支持。相信這些將來的更新都會廣受歡迎。
針對中國的開發者群體和市場環境,Visual Studio 團隊想必也會越來越重視。近期微軟與華為的合作就是一個很棒的成功案例:華為通過使用 VS2017 進行面向 Linux 的 C++ 開發,大幅提升了生產效率。 在此,我們也期待 Visual Studio 未來能夠做得更多更好。其實除了解決部分組件水土不服的問題外,Visual Studio 還大可以嘗試與國內的公司、平臺和生態進行更深入的合作。讓我們大膽試想,如果 VS 能夠支持微信小程序的開發,或是在 VS 中能夠方便地對接使用阿里云的基礎設施,是不是聽上去就更有誘惑力了呢?
寫在最后
"Any Developer, Any App, Any Platform",Visual Studio 2017 在這樣的新口號下醞釀和誕生。開放而非封閉,合作而非拒絕,兼容而非分裂,這是屬于微軟的改變,這是屬于微軟的進化之道。眾多微軟技術生態愛好者們期待已久的春天,似乎真的要到來了。也許有一天,我們不再需要強調“微軟技術棧”,因為它本就是開放技術世界的組成部分,互相融合,難分彼此。
注:本文僅代表作者個人觀點。作者個人與文中所提及商業公司均無利益關系。
作者介紹
何愷鐸,供職于國雙科技(Nasdaq:GSUM),現任高級技術總監,負責網站與流量分析產品線。曾參與架構和設計了國雙多個面向數字營銷和社交聆聽的大數據解決方案。個人關注的技術領域包括 .Net 生態系統、云計算、大數據技術棧等。
來自: mp.weixin.qq.com