爲什麼Java後端開發沒有大規模採用Kotlin?

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在使用了Java 15年後,我寫了第一行Kotlin代碼,到現在已經差不多5年了。我們的團隊用"},{"type":"link","attrs":{"href":"https:\/\/github.com\/bodar\/utterlyidle","title":"","type":null},"content":[{"type":"text","text":"Utterlyidle"}]},{"type":"text","text":"替代Spring,用"},{"type":"link","attrs":{"href":"https:\/\/totallylazy.com\/","title":"","type":null},"content":[{"type":"text","text":"Totallylazy"}]},{"type":"text","text":"進行函數式編程。我們是IntelliJ的忠實粉絲,並試着充分利用它提供的Java工具。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"那個時候,我們不只使用Java。有一些團隊對Scala感興趣,並用它開發了一些服務。但是,因爲Scala與Java代碼庫協作的複雜性以及緩慢的構建時間,對於我們大多數人來說,它並沒有太大吸引力。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2017年,谷歌宣佈Kotlin成爲Android的官方開發語言,另一個與我們關係密切的團隊開始評估是否可以在他們的服務器端開發中使用它。最後,我們大多數人都去嘗試了一下。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我被Kotlin給代碼庫帶來的影響震撼到了。它給人的感覺是更高效、更安全,雖然開發工具沒有Java那麼成熟,但也足夠好了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"從一門陳舊而冗長的編程語言中解脫出來,並探索哪些編碼風格更適合Kotlin的特性,這本身就是一件非常有趣的事情。Kotlin與Java出色的互操作性意味着我們可以增量地依賴現有的生態系統和過渡系統,而不會對工作造成重大幹擾。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"很快,由於對Kotlin的興趣,我們一起開發了"},{"type":"link","attrs":{"href":"https:\/\/http4k.org\/","title":"","type":null},"content":[{"type":"text","text":"http4k"}]},{"type":"text","text":",一個用於開發Kotlin HTTP應用程序的工具包,並組織了"},{"type":"link","attrs":{"href":"http:\/\/web.archive.org\/web\/20191105124733\/https:\/\/skillsmatter.com\/courses\/602-real-world-kotlin-development-workshop","title":"","type":null},"content":[{"type":"text","text":"Kotlin開發研討會"}]},{"type":"text","text":",幫助其他團隊嘗試使用Kotlin。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最後,我們看到其他各種項目也在服務器端使用Kotlin,也看到了一些團隊強烈不願意採用Kotlin的原因。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有意思的是,這種抗拒並不總是因爲編程語言本身。那麼,爲什麼Java服務器端開發社區沒有更多地採用Kotlin呢?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以下是我和我的同事們看到的一些原因。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"“我們沒有時間學習一門新語言”"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這也就是我們在軟件開發項目當中經常看到的“忙着砍柴沒時間磨斧子”現象。這通常預示着更深層次問題,比如不斷增加的技術債務和開發效率問題。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"健康的軟件項目需要開發者花大量時間去學習。一個有能力的Java開發者可以在數小時內掌握Kotlin的基本知識,並在數天內提高開發效率。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果採用新語言可以讓他們寫的代碼更簡單,遇到的問題更少,那麼投入就是值得的。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"“Java的每一個版本都在變得更好”"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這是真的,Java正在變得更好,而且發佈的速度也越來越快。但是,對於處理空值這麼簡單的事情,仍然遠遠落後於Kotlin。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"也許Java社區已經習慣了這種演化速度。儘管如此,Kotlin還是提供了一種方法,可以在項目中用上很多Kotlin特性。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"“作爲Java開發者,我們感到很自豪”"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這種想法是最要命的。如果一個程序員把他們的專業身份和一種編程語言聯繫在一起,那就沒有辦法了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果說Java開發者不想賭上自己的事業踏入一門新語言的未知領域,我可以理解。或者他們可能想成爲一個領域的專家,這也很合理。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"但是,我也並沒有看到哪個Java開發者因爲使用Kotlin而“落後”了。相反,這表明他們一直在尋找適合自己的工具,這是一種積極的特質。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"“Kotlin是一種被炒作的語言,它的未來是未知的”"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這是我們在2017年經常聽到的反對採用Kotlin的說法。在那一年,谷歌宣佈將Kotlin作爲Android的官方開發語言,讓我們確信科技巨頭們對這門語言是感興趣的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"現在,Spring和Micronaut等流行框架似乎已經接受了這門新語言,之前的反對聲就不那麼經常聽到了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"希望這能讓更多的服務器端開發對這門語言有足夠的瞭解,並嘗試一下。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"“我正在使用Eclipse,不想切換到IntelliJ”"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在Eclipse中使用Kotlin的體驗與JetBrains的IDEA不太一樣。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這是可以理解的,因爲銷售開發工具是JetBrains的商業模式之一,而且這種情況短期內不太可能改變。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對於這些人來說,他們能夠期望的是Kotlin可以達到一個質量臨界點,證明Eclipse爲它提供進一步的支持是值得的。但在此之前,對於Kotlin開發者來說,最好的開發體驗仍然是使用JetBrains產品。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我認爲,IntelliJ已經是一個更好的Java IDE了,所以它也值得一試。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"“Kotlin開發者太貴了,而且很難招到”"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這一點很難說,從"},{"type":"link","attrs":{"href":"https:\/\/www.itjobswatch.co.uk\/default.aspx?q=kotlin%2C+java","title":"","type":null},"content":[{"type":"text","text":"招聘網站"}]},{"type":"text","text":"的數據來看,Kotlin開發者的薪資總體上略高一些。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果我們只考慮服務器端開發者,就很難進行比較。一般來說,Java開發者的薪資是最高的,但在Kotlin方面並沒有足夠的數據來進行比較。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有趣的是,在實際當中,我們可以看到高級Java開發者經常是率先採用Kotlin的人,這可能會給人留下Kotlin開發者很“貴”的印象。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在招聘方面,我們並沒有覺得很難招到Kotlin開發者。我們很清楚,有些工作需要使用這門新語言,並允許開發者在工作中邊學邊用。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這似乎讓Java開發者放下心來,並吸引了那些熱衷於學習新事物的人。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"“Kotlin太複雜了”"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Kotlin之所以成爲Scala等語言的替代語言,其中一個原因是它在易用性和高級特性之間取得了良好的平衡,與Java具有更好的互操作性,所以更有可能被流行框架採用。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在實際當中,這種反對聲與團隊的技能、風格和習慣有關。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"初學者一般會像使用Java一樣使用Kotlin,但隨着他們越來越熟悉這門語言,可能會深入使用一些特性(例如擴展和內聯函數),從而導致代碼庫變得越來越難以理解。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在團隊完全掌握新語言之前,我們建議儘可能長時間地使用普通的Kotlin特性。最後,團隊中的大多數人都會在選擇很酷的語言特性和保持代碼庫易於理解之間找到平衡點。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"“在一個代碼庫中使用兩種語言讓人感到困惑”"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這是在實際項目中沒有嘗試過Kotlin的人經常會有的擔憂。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在實際當中,當團隊意識到新的Kotlin代碼需要與Java共存,那麼在一個項目中使用兩種語言並不會給他們造成很大的痛苦。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏有一個有用的規則:“如果一個變更涉及到兩種語言,首先將舊代碼轉換成Kotlin”。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這樣,團隊就可以避免大爆炸式的重寫,並將需要添加新特性的地方進行逐步遷移。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果需要保留一些Java代碼,那也沒關係。很有可能是因爲這些代碼仍然有用,並且沒有進行重構的迫切需求。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"“我們更喜歡Java”"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在實際當中,有一些場景不一定要使用Kotlin,一切仍然能夠進行得很順利,團隊能夠以可接受的速度完成工作。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"然而,根據我們的經驗,這是例外,而不是常態。通常情況下,這種對語言的抗拒源於缺少時間和興趣,而不是因爲沒有可提升的空間。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果沒有在真正的項目中使用Kotlin,是也很難體會到Kotlin的好處的。即使是作爲一個實驗,也存在很多焦慮。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對於這種情況,我們建議“"},{"type":"link","attrs":{"href":"https:\/\/deming.org\/institute-training-on-the-job\/","title":"","type":null},"content":[{"type":"text","text":"在工作中邊學邊用"}]},{"type":"text","text":"”(以編碼道場、培訓等形式),創造一個可以進行這種實驗的安全環境。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這樣可以幫助團隊評估他們對Java的使用狀況,以及是否值得在Kotlin上投入。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"“我看不出Kotlin會帶來什麼好處”"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有時候,Java開發者意識不到語言方面存在的限制,或者是因爲他們已經習慣了。有時候,他們會抗拒新語言,因爲新語言會讓他們質疑自己正在使用的語言。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在不深入細節的情況下,我們可以說Kotlin的簡潔性和安全性是它的"},{"type":"link","attrs":{"href":"https:\/\/kotlinlang.org\/#why-kotlin","title":"","type":null},"content":[{"type":"text","text":"主要優點"}]},{"type":"text","text":"。然而,有些人聲稱他們不認爲Java的冗長有什麼問題,並且寫出來的代碼也很安全。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在真正去嘗試Kotlin之前,人們很容易將其忽略掉。而在真正面對它的時候,一些人會繼續尋找不嘗試使用它的理由。"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"一些想法"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"採用一種新的編程語言,特別是在正在進行的項目當中,這對於大多數團隊來說都是一個挑戰。對變化的抗拒與特定的環境有關,與項目需求和個人原因以及語言本身也有關。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"話雖如此,我仍然鼓勵更多從事Java服務器端的開發者,如果有機會的話,可以嘗試一下Kotlin。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"原文鏈接:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"https:\/\/medium.com\/google-developer-experts\/why-are-java-server-side-developers-not-adopting-kotlin-8eb53e06ee99?fileGuid=nbh1KOt8ZzMdpX2m"}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章