为什么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"}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章