天天看點

如何看待 Kotlin 成為 Android 官方支援的開發語言?一線開發者這樣說

本文嘗試從一個客觀全面一點兒的角度來看待這件事情,盡力為大家提供一個比較理性的觀點供參考。

關于 google 為什麼會選擇 kotlin,我認為有兩方面的原因。

● 為了逐漸擺脫專利流氓oracle。從去年的轉向openjdk,到現在的支援kotlin作為官方語言,某種意義是為了擺脫藉由9行代碼敲詐擷取天價賠償的oracle。

● 選用kotlin,實至名歸,這個榮譽它值得擁有。kotlin确實以其實用,高效赢得了海外很多公司和開發者的認可,比如square的jake大神一直在推kotlin。kotlin在國外至少有将近2年的應用生産環境的實踐(非jetbrains内部實踐應用)。在移動開發中,相比ios程式員,android程式員總是很幸運,因為我們有很多優秀好用的工具(android studio等),選用kotlin,則是google 為開發者提供高效的開發工具的一貫作風。

● 官方:工具支援(android studio 3.0附帶kotlin),官方的宣傳(教學視訊,主題演講等)

● 對于社群來說,kotlin版本的庫和架構如雨後春筍般湧現

● 對于java,曾經借助android這場春風,着實讓遲暮的它再度輝煌,現在和将來在android領域可謂是棋逢敵手,java的在android開發語言市場佔有率會降。但是這也并不一定是壞事,有競争才能更好進步。

● 對于android 開發者,我們多了一種開發android的語言選擇,那些對于之前由于前景不明朗卻對kotlin躍躍欲試的人可以放心使用了。有了kotlin意味着開發效率應該會有所提升。

● 對于團隊,這往往帶來了一個選擇的問題,use kotlin or not, that’s a question. 團隊中總有人想要嘗試kotlin,而另一些人則興緻不那麼高。由于曆史包袱,團隊成員興趣,對于已有項目采用kotlin和java長期并存是實際可行的方案。而新項目則應該鼓勵使用kotlin,但具體還需要結合團隊的能力和其他因素。

kotlin的有很多特點,比如簡潔,安全實用,開發效率高和提升可讀性,更好的函數式程式設計支援。

1. 簡潔,kotlin的代碼确實比java更加簡潔,比如類型推斷,省去結尾的分号等等,然而這遠不能成為我們改用kotlin的原因。

2. 安全,這是kotlin的一個很重要的特性。kotlin是空指針安全的,jetbrains做了一件很聰明的事情,它們将運作時才能空指針的檢測提前到了編譯時,主要方式是增加了any?這種可為空的類型,使用kotlin之後,我們程式的空指針會得到明顯的改善。

3. 實用,高效率。kotlin的實用具體表現在

● 引入object,便于我們更好的應用單例模式 ● 引入data class, 避免了我們手寫getter/setter/tostring等方法 ● 引入參數預設值和具名參數,避免了不必要的方法重載 ● 支援擴充方法,讓我們可以省去好多必須要的代碼

4. kotlin引入了lambda,streams api 和函數式程式設計支援。

● lambda表達式可以省去了我們建立很多匿名内部類的代碼(注由于目前kotlin基于jvm6,lambda表達式在位元組碼階段依然會翻譯成内部類形式) ● streams api 結合lambda表達式和方法引用,讓我們的代碼處理一件事情以描述的形式,而不是指令實作的方式。 ● kotlin支援oop(面向對象程式設計)和fp(函數式程式設計),語言本身并沒有限制,給了我們選擇的自由,kotlin對fp的友好支援,便于我們寫出更加穩定,易于測試,無副作用的方法和代碼

5.可讀性 從客觀上,kotlin文法和特性上讓代碼更加具有描述性而已。但是不得不指出代碼可讀性主要依賴編寫者的編碼素質和能力。

對我個人而言,高階函數和方法擴充這兩個特點着實真心受用。方法擴充會讓我有一種創造感,這是java種的util方法所無法比拟的。

這個很難說,因為這個世界上并不是一件事物好,就會必然得到廣泛應用的。一件事物的推廣開來靠的是一群人,但阻力也往往也來自一群人,隻不過和前者不是相同人群。

從個人主觀來看這個問題,我更加願意看到這種現象發生。原因并不是因為我更喜歡kotlin,而是在于我更願意看到事物在進步,在變得優秀,是以即便某一天kotlin被更加優秀的語言取代,我也是很歡迎的。

kotlin适用于多個平台,并沒有對學習者做限制。任何有學習意願的人都可以習得這門語言。

但是考慮到國内 kotlin 資源不夠豐富,網絡不夠暢通等問題,是以導緻了很多人變成了吃瓜群衆進行觀望。

然而,對于一個項目和團隊來說,總需要有第一個人先來推進。而且這個推進過程并非順利,這其中包括

● 首先你需要足夠了解kotlin ● 你需要說服團隊,這期間你會接收到很多challenges,有時候你會很沮喪和生氣 ● 你需要提供一系列的資料或分享,比如如何配置,sample code, troubleshooting等等 ● 有時候甚至你經常兼職做mentor指導工作,這也就意味着你的手頭上的其他工作需要被打斷

上述推進 kotlin 觀點部分參考自life is great and everything will be ok, kotlin is here (google i/o ‘17) 中 christina lee(pinterest software engineer,國外 kotlin 美女布道師之一)的分享内容。

雖然 kotlin 很優秀,但是推動在項目中推動 kotlin 應用并非易事,因為這對于新事物來說在正常不過了,就像明治維新一樣看起來很光鮮,成功,但是它的變革程序并非順利,先是血雨腥風的倒幕運動,再到明治六年爆發的标志武士時代結束的西南戰争,經過數十年的努力才算取得成功。

是以關于哪些人适合率先應用 kotlin,我認為需要具備以下幾點

● java 技術和基礎要好,這一點很重要 ● 英語要好,因為目前 kotlin 的資料幾乎都是英文的,當然也推薦看英文的 ● 願意承擔在項目團隊推進工作,有耐心,敢挑戰,負責任

目前想到了一些關于 kotlin 應用在項目中的一些顧慮。這些顧慮目前并非全面,但是提出來,希望大家可以規避和改善。

1. 寫出來的代碼并不是 kotlin style。解決這個問題,還是需要多學習和思考

2. 擴充方法的濫用,kotlin 的擴充方法很好,我們可以擴充很多方法,彌補framework的一些不完善,但是擴充時我們需要謹慎,一定要把合适的方法放到合适的類型上,不可為了簡單增加不符合某些類不應該具備的職責。 具體需要最好以下兩點

● 選擇在合理範圍内的最抽象類增加方法,比如我們想為activity增加一個longtoast,應該想一想是不是放在更加抽象的context會更好一些

● 同時也不能為了便利,增加和目前類不相關的方法,比如我們想為每個context增加顯示一個簡單dialog的擴充方法,這顯然不是很合理,因為對于非ui的context這是有問題。

kotlin出來之後,聽到了兩種不同的聲音:

● 太好了,終于可以有理由改用kotlin了,寫代碼更加高效了。可以逐漸開始放棄java了。

● wtf,又要學新的語言,感覺好累,會不會以後面試不會kotlin就被pass掉呢。

出現以上兩種不同的聲音,不得不引起我們對于 android 程式員的核心競争力的思考。那麼到底什麼才是 android 程式員的核心競争力呢?

android程式員和其他程式員甚至其他職業并無二緻,我認為這種競争力表現在解決問題的能力。想要具備這種能力,極其依賴我們對問題和技術的準确認識和紮實的基礎。

程式設計語言本質上還是工具,好的工具能帶來更好的效果,但是如何運用好,将效率和品質提升到最高,則還是更主要的依賴于開發者的能力。

選用好的工具,更側重夯實基礎和加強對事物本質認識的能力,我想這樣才能讓我們的競争力更強。

總結而言,kotlin是一個更好的工具,沒有它,并不影響我們日常的 android 開發工作。但是我還是建議開發者和團隊去嘗試這種語言,抓住這個近在咫尺的小确幸。

事情的發展越來越顯得不可控了,推介kotlin和不看好kotlin的人逐漸分化出來,更準确的說,甚至這件事已經快要演變成了從對事變成了對人。

kotlin 成為 android 官方語言的消息一出來,一下子出來了很多被當做投機蹭熱點的kotlin推介者,當然還出現了一些看不慣這些做法的人,他們認為前者刻意拔高了kotlin。因而讨論越來越偏向從事情到人的方面。我想要說的是,就像商人追求利潤,資本家攫取剩餘價值那樣,投機者蹭熱點,以及招緻他人批評,這都是正常的事情,但是我們不能讓讨論脫離問題的本質,我們需要回歸。

很多人說kotlin無非就是很多文法糖,沒什麼突破

in computer science, syntactic sugar is syntax within a programming language that is designed to make things easier to read or to express. it makes the language “sweeter” for human use: things can be expressed more clearly, more concisely, or in an alternative style that some may prefer.

由定義可知,文法糖的目的就是讓代碼更簡單,更可讀。

決定kotlin使用這麼多文法糖的除了簡潔,高效可讀之外,還有一個原因,是因為kotlin編譯生成的class檔案是目标到jvm 6(基于jvm 6 是一種權衡後的結果),比如我們在kotlin中使用了lambda,它是不可能編譯成invokedynamic指令的,因為那樣會導緻在jvm6上根本無法識别,是以經常通過翻譯成内部類的形式來實作。

使用文法糖又能怎樣,它的目的是好的,畢竟它真真實實介紹了開發人員的代碼量。

kotlin是一門實用語言,這是它的基因,它不是學術語言,它的目标是減輕開發者的負擔。它很适合 android,因為大多數的 android 的程式員是做工程。

kotlin,是基于jvm的程式設計語言,但是基于jvm的程式設計語言并沒有什麼不好。(j)vm的出現無非也是一種平衡的結果。在犧牲部分執行效率的前提下,提供了一定的抽象,加快了開發者的效率。這種tradeoff其實更加有利于人的一側,這也是程式設計語言發展的趨勢和目标

kotlin 在國内推廣應用的道路可謂是 漫漫而修遠兮。是以更需要真正實踐,去踩坑的人開始on board,去出産更多的真正能推動 kotlin 應用的文章,分享等這些有實質性意義的行動。

====================================分割線================================

本文作者:ai研習社

繼續閱讀