經過重重篩選,我們爲什麼要選擇kotlin ?

內容來源:2017 年 11 月 19 日,上線了聯合創始人郭達峯在“2017 谷歌開發者節北京站”上進行的《Kotlin as Your Next Language》演講分享。IT 大咖說(微信id:itdakashuo)作爲獨家視頻合作方,經主辦方和講者審閱授權發佈。

閱讀字數:1700 | 4分鐘閱讀

摘要

本次將和大家分享我們公司對目前多門主流語言進行分析,從編程風格、社區生態圈、工具鏈、類型檢查幾個維度深入分析和探討,最終確定納入 Kotlin 作爲公司新的一門服務端語言技術棧。本次分享將會帶領大家縱覽主流語言的幾個特性和風格,相信對於編程語言有興趣但還在徘徊猶豫的開發者會有一些啓發。

獲取嘉賓演講視頻及PPT,掃一掃下方二維碼即可。

語言選擇

2017年由於公司的快速發展,使得我們的技術儲備無法跟上業務的要求,因此不得不考慮人員招聘的問題。併爲了更迅速的招攬到合適的人才,進行了各種技術棧的調研。

目前我們前端採用的是JavaScript& TypeScript,後端80%使用Ruby以及少量的Node.js,運維方面則是Golang。

其中後端是招聘方面的主要瓶頸,而恰巧當時我們後端正在做微服務化,於是就想着在後端新增一個技術棧,以方便招聘。

而爲了找出合適的語言,我們參考了IEEE 和 StackOverflow關於2017年的流行語言排行榜,將其中的各種語言劃分成不同維度進行分析。

需要注意的是下面對這些語言的分析,30%是客觀的事實,70%則是出於我們自身對這些技術的看法,其觀點是基於Web應用層面以及個人對編程風格的喜好。

Microsoftor Non-Microsoft

是不是所屬微軟意味着是否要用到.net體系,使用.net體系就必須要用到windows服務器,每年要交給微軟一筆費用。雖然目前.net也可以跑在Linux上了,但是絕大多數還是會在windows服務器上運行,對於我們這樣的創業公司是不會輕易使用.net體系的。

在上面所提到的兩個榜單中,只有C# 和 TypeScript 是屬於微軟的。不同於C#,由於TypeScript 是會編譯到JavaScript 的,並不依賴微軟的環境,所以TypeScript 我們還是會考慮。

StaticTyping or Dynamic Typing

第二個維度是靜態類型和動態類型。我們首先看下這兩類語言各自有哪些優勢。

靜態類型語言在IDE上會有很好的支持,比如自動補全;性能上也更優秀,編譯器能在底層做一些優化;對新手也比較友好,例如不用去猜測函數或方法的參數類型;並且還能通過分析工具在編譯時就解決一些問題。

而動態語言編寫的效率比較快,更加簡易,沒有編譯的過程,能更快的迭代。

綜合來看對於大型項目靜態語言會更加合適。

以上是進行分類後的情況,有意思的是Typescript 和Elixir被獨立開來了,其實這是因爲它們都歸屬於Opt-in Typing。

這一類型具有動態和靜態語言各自的優點,開發者可以根據實際情況決定何時添加類型限制。

雖然有這種優勢,但是在實際的程序開發中需要用到衆多的第三方庫,而有些第三方庫是沒有Opt-in Typing的一些特性的,由此造成了割裂。微軟在這方面算是處理的比較好的了,它花費了大量的人力財力去和第三方庫的開發者合作,爲這些庫添加它們原本缺失的typescript特性。

TypeInference

我們都知道靜態語言編寫起來是比較麻煩的,典型的就是變量的類型需要提前聲明。但如果深入瞭解的話,就會發現有些靜態語言的某個特性能夠很好的解決這類問題,這就是Type Inference — 類型推導。

我們先來看一個例子,上圖分別是java 和 Kotlin的代碼,可以看到其中java的變量需要提前聲明String 類型,而Kotlin卻省去了這個過程,它通過 s 的值就能在判斷S 是什麼類型。

有類型推導的語言分爲兩種,一種是Global,另一種是Local。Global的語言有Rust、OCaml、Haskell,而Local的語言有Scala、Typescript、Golang、Kotlin。

ProgrammingParadigm

目前的編程風格主要有三種,一種是Imperative,典型的代表是C語言,是直接告訴程序如何運行。還有一種Object OrientedProgramming(OOP)也就是大多數人比較熟悉的面向對象,它是基於對現實事物的抽象,Java就是面向對象類型的語言。

另外一種是Functional Programming(FP)函數式編程,它和Imperative 的不同點在於,更注重程序間的邏輯關係。這類語言一般都會有first class和高階函數,這類語言有Lisp、Haskell等。

上圖是對所選語言做的一個分析,圖中的語言越靠近某個方向就代表這方面的特性越強,需要注意的是某方面的特性更強並不代表沒有其他的兩個特性。一般來說越偏向於Object-orientend(OOP)或者Imperative,就代表相對更容易學習,這是因爲這兩種模式更類似於人類的正常思維,而Functional(FP)則更像是數學家的思考方式。

不過從我們自身出發的話,還是需要具備一些FP特性的語言,也就是下圖中右半部分。

Ecosystem

基於我們最初的考慮,Ecosystem(生態圈)可以說是非常重要的。其中有各方面的考慮,比如開發人員的數量,工具鏈是否易用豐富、IDE支持如何、第三方庫是否足夠等等。

現階段比較大的生態圈有JavaScript、JVM、GO。規模最大的當然就是JVM了。

總結

通過上面這一層層的分析,我們最後選擇了Kotlin。首先它並非是微軟系的語言,並且還是靜態語言,能夠進行類型推導,有着OOP的特性的同時兼顧Functional(FP),依託的是目前來說最大的JVM生態圈。

當然這只是現階段的考慮,相信隨着時間的發展還會有更好的選擇。

今天的分享就到這裏,謝謝大家!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章