为什么 Java 后端开发没有大规模采用 Kotlin?

在使用了 Java 15 年后,我写了第一行 Kotlin 代码,到现在已经差不多 5 年了。我们的团队用Utterlyidle替代 Spring,用Totallylazy进行函数式编程。我们是 IntelliJ 的忠实粉丝,并试着充分利用它提供的 Java 工具。

那个时候,我们不只使用 Java。有一些团队对 Scala 感兴趣,并用它开发了一些服务。但是,因为 Scala 与 Java 代码库协作的复杂性以及缓慢的构建时间,对于我们大多数人来说,它并没有太大吸引力。

2017 年,谷歌宣布 Kotlin 成为 Android 的官方开发语言,另一个与我们关系密切的团队开始评估是否可以在他们的服务器端开发中使用它。最后,我们大多数人都去尝试了一下。

我被 Kotlin 给代码库带来的影响震撼到了。它给人的感觉是更高效、更安全,虽然开发工具没有 Java 那么成熟,但也足够好了。

从一门陈旧而冗长的编程语言中解脱出来,并探索哪些编码风格更适合 Kotlin 的特性,这本身就是一件非常有趣的事情。Kotlin 与 Java 出色的互操作性意味着我们可以增量地依赖现有的生态系统和过渡系统,而不会对工作造成重大干扰。

很快,由于对 Kotlin 的兴趣,我们一起开发了http4k,一个用于开发 Kotlin HTTP 应用程序的工具包,并组织了Kotlin开发研讨会,帮助其他团队尝试使用 Kotlin。

最后,我们看到其他各种项目也在服务器端使用 Kotlin,也看到了一些团队强烈不愿意采用 Kotlin 的原因。

有意思的是,这种抗拒并不总是因为编程语言本身。那么,为什么 Java 服务器端开发社区没有更多地采用 Kotlin 呢?

以下是我和我的同事们看到的一些原因。

这也就是我们在软件开发项目当中经常看到的“忙着砍柴没时间磨斧子”现象。这通常预示着更深层次问题,比如不断增加的技术债务和开发效率问题。

健康的软件项目需要开发者花大量时间去学习。一个有能力的 Java 开发者可以在数小时内掌握 Kotlin 的基本知识,并在数天内提高开发效率。

如果采用新语言可以让他们写的代码更简单,遇到的问题更少,那么投入就是值得的。

这是真的,Java 正在变得更好,而且发布的速度也越来越快。但是,对于处理空值这么简单的事情,仍然远远落后于 Kotlin。

也许 Java 社区已经习惯了这种演化速度。尽管如此,Kotlin 还是提供了一种方法,可以在项目中用上很多 Kotlin 特性。

这种想法是最要命的。如果一个程序员把他们的专业身份和一种编程语言联系在一起,那就没有办法了。

如果说 Java 开发者不想赌上自己的事业踏入一门新语言的未知领域,我可以理解。或者他们可能想成为一个领域的专家,这也很合理。

但是,我也并没有看到哪个 Java 开发者因为使用 Kotlin 而“落后”了。相反,这表明他们一直在寻找适合自己的工具,这是一种积极的特质。

这是我们在 2017 年经常听到的反对采用 Kotlin 的说法。在那一年,谷歌宣布将 Kotlin 作为 Android 的官方开发语言,让我们确信科技巨头们对这门语言是感兴趣的。

现在,Spring 和 Micronaut 等流行框架似乎已经接受了这门新语言,之前的反对声就不那么经常听到了。

希望这能让更多的服务器端开发对这门语言有足够的了解,并尝试一下。

在 Eclipse 中使用 Kotlin 的体验与 JetBrains 的 IDEA 不太一样。

这是可以理解的,因为销售开发工具是 JetBrains 的商业模式之一,而且这种情况短期内不太可能改变。

对于这些人来说,他们能够期望的是 Kotlin 可以达到一个质量临界点,证明 Eclipse 为它提供进一步的支持是值得的。但在此之前,对于 Kotlin 开发者来说,最好的开发体验仍然是使用 JetBrains 产品。

我认为,IntelliJ 已经是一个更好的 Java IDE 了,所以它也值得一试。

这一点很难说,从招聘网站的数据来看,Kotlin 开发者的薪资总体上略高一些。

如果我们只考虑服务器端开发者,就很难进行比较。一般来说,Java 开发者的薪资是最高的,但在 Kotlin 方面并没有足够的数据来进行比较。

有趣的是,在实际当中,我们可以看到高级 Java 开发者经常是率先采用 Kotlin 的人,这可能会给人留下 Kotlin 开发者很“贵”的印象。

在招聘方面,我们并没有觉得很难招到 Kotlin 开发者。我们很清楚,有些工作需要使用这门新语言,并允许开发者在工作中边学边用。

这似乎让 Java 开发者放下心来,并吸引了那些热衷于学习新事物的人。

Kotlin 之所以成为 Scala 等语言的替代语言,其中一个原因是它在易用性和高级特性之间取得了良好的平衡,与 Java 具有更好的互操作性,所以更有可能被流行框架采用。

在实际当中,这种反对声与团队的技能、风格和习惯有关。

初学者一般会像使用 Java 一样使用 Kotlin,但随着他们越来越熟悉这门语言,可能会深入使用一些特性(例如扩展和内联函数),从而导致代码库变得越来越难以理解。

在团队完全掌握新语言之前,我们建议尽可能长时间地使用普通的 Kotlin 特性。最后,团队中的大多数人都会在选择很酷的语言特性和保持代码库易于理解之间找到平衡点。

这是在实际项目中没有尝试过 Kotlin 的人经常会有的担忧。

在实际当中,当团队意识到新的 Kotlin 代码需要与 Java 共存,那么在一个项目中使用两种语言并不会给他们造成很大的痛苦。

这里有一个有用的规则:“如果一个变更涉及到两种语言,首先将旧代码转换成 Kotlin”。

这样,团队就可以避免大爆炸式的重写,并将需要添加新特性的地方进行逐步迁移。

如果需要保留一些 Java 代码,那也没关系。很有可能是因为这些代码仍然有用,并且没有进行重构的迫切需求。

在实际当中,有一些场景不一定要使用 Kotlin,一切仍然能够进行得很顺利,团队能够以可接受的速度完成工作。

然而,根据我们的经验,这是例外,而不是常态。通常情况下,这种对语言的抗拒源于缺少时间和兴趣,而不是因为没有可提升的空间。

如果没有在真正的项目中使用 Kotlin,是也很难体会到 Kotlin 的好处的。即使是作为一个实验,也存在很多焦虑。

对于这种情况,我们建议“在工作中边学边用”(以编码道场、培训等形式),创造一个可以进行这种实验的安全环境。

这样可以帮助团队评估他们对 Java 的使用状况,以及是否值得在 Kotlin 上投入。

有时候,Java 开发者意识不到语言方面存在的限制,或者是因为他们已经习惯了。有时候,他们会抗拒新语言,因为新语言会让他们质疑自己正在使用的语言。

在不深入细节的情况下,我们可以说 Kotlin 的简洁性和安全性是它的主要优点。然而,有些人声称他们不认为 Java 的冗长有什么问题,并且写出来的代码也很安全。

在真正去尝试 Kotlin 之前,人们很容易将其忽略掉。而在真正面对它的时候,一些人会继续寻找不尝试使用它的理由。

采用一种新的编程语言,特别是在正在进行的项目当中,这对于大多数团队来说都是一个挑战。对变化的抗拒与特定的环境有关,与项目需求和个人原因以及语言本身也有关。

话虽如此,我仍然鼓励更多从事 Java 服务器端的开发者,如果有机会的话,可以尝试一下 Kotlin。

原文链接:

https://medium.com/google-developer-experts/why-are-java-server-side-developers-not-adopting-kotlin-8eb53e06ee99?fileGuid=nbh1KOt8ZzMdpX2m

学Java很久了,但越学越“糊涂”,Java学到什么程度才叫精通呢?

Java到现在,已经是相当的成熟了。而现在的Java程序员更是多不胜数,那目前为止,学Java到什么程度才能叫精通呢?我们来看一下!

首先,学习路线图往往是学习一门技术的入门指南,网上搜到的Java学习路线图也是一抓一大把。

而这次,我们只选一张图,仅此一图,足以包罗Java后端技术的知识点。所谓不求最好,只求最全,学习Java后端的同学完全可以参考这张图进行学习路线安排。

当然,有一些知识点是可选的,并不是说上面有的你都要会啦。

闲言少叙,我们还是看看这张图上都包含哪些有价值的信息吧,再次说明,本文只对路线图做一个简单的解读,仅供参考。大家可以根据自身情况来制定合理的学习计划。相信也会大有裨益,

这部分内容是计算机相关专业同学的课程,但是非科班的同学就需要花时间恶补了,特别是计算机网络、操作系统、数据结构这三门课程。

至于编译原理嘛,个人认为大概懂一点就行了。我也只看过简单的概念和状态机相关的内容,并不是特别重要。

这里的Java编程部分包含了很多内容,我们可以分别来看看,大概归纳就是以下的几个部分。

  • 1、Java基础

这里的Java基础包括基本语法、集合类框架以及一些高级特性,例如反射、注解等等。

Java基础的知识点非常的多,所以要真正搞懂也没有那么简单。另外,随着时间的推移,一些新特性也需要得到我们的重视,比如时下流行的JDK8。

  • 2、设计模式

我一直觉得设计模式可以和Java基础一起学,所以我也把它放在这里。当然,一些真正使用到设计模式的地方,例如JDK的集合类、IO流等等,也需要足够的重视。

  • 3、Java Web技术

Java Web技术包括J2EE(现在叫Java EE),以及Web框架。乃至一系列常用的组件。

①、J2EE主要包括的就是Servlet、Jsp这些比较复古的Web开发组件了。虽然现在直接用它们的情况比较少,但是我们还是需要花一些时间去掌握它们的。

②、Web框架常用的就是Spring了,相应的。Hibernate和MyBatis也需要了解一下。

③、同时,Java Web开发时的常用类库,例如Jnuit单元测试、Log4j日志工具以及构建工具Maven,都属于我们要掌握的范畴。

④、最后要注意的是,Web相关的一些基本知识,例如HTTP协议、网络安全基础,也是我们要考虑的部分。

  • 4、Java并发技术

Java的并发技术泛指Java的多线程技术以及JUC包里的并发类,例如线程池、并发工具类、阻塞队列等等。

Java并发技术完全可以独立出来学习,是Java进阶知识的一大重点。

  • 5、Java网络编程和服务器

这一块了内容是Java中比较复杂但也很重要的一块内容。例如BIO、NIO、AIO的一些使用和原理,以及Tomcat这类Web服务器,甚至是Netty这种网络编程框架,都是可以去了解和学习的内容。

  • 6、JVM基础与调优

JVM是提供Java程序运行的一个进程,学习JVM知识也是我们的必经之路。除了看懂《深入理解JVM虚拟机》之外,我们还要学习的内容就是JVM调优,使用合适的工具诊断问题,最后解决问题。

这部分内容在面试中呈现的不仅仅是GC、内存分区以及类加载器,也包括了上述所说的JVM调优问题。

作为后台同学,常年被面试官问Linux相关的问题,所以觉得学好Linux还是蛮重要的,除了基本命令外,最好还能连接一些Shell脚本。甚至是内核相关的知识。

在这个路线图里,数据部分囊括了非常多的数据源,我们来看看都有哪些是我们需要掌握的。

  • 1、关系数据库MySql

这个不必多说,人手都要会。不管是基础的Crud、索引、亦或是进阶的储存引擎、分布式方案等,我们都需要对应掌握。

  • 2、缓存

如Redis、Memcache一类的缓存,作为后端开发者的我们也需要对应掌握。当然,它们的高级特性以及分布式方案也是必备的知识点。

  • 3、搜索引擎

基于Lucene的Solr、Elasticsarch这类搜索引擎,本质上也是数据源,但并不是后端必备的内容,不过学一学也没有坏处啦!

  • 4、大数据

海量数据处理的场景越来越多,大数据技术如Hadoop、Storm等也越来越火,但大数据应用一般都会由专业的大数据工程师来做。所以我们学一些基本内容也就足够了!

算法一直是校招同学面前的一座大山,作为后端同学来讲,除了基本的数据结构算法外,也要回一些高级的算法。例如DP,搜索,贪心等等。

另外,通过网上的一些题库来刷题的方式来巩固算法也是公认的好办法。

最后一个部分,也是内容最多、覆盖面最广泛的部分了。分布式相关的技术实在是太多了,我们这里也会做一下简单的归纳。

  • 1、分布式理论

这部分内容包括分布式的发展演化、Base理论和Cap理论等等。学习分布式之前,最好能对这部分概念有一定的了解。

  • 2、一致性问题

强一致性的解决方案:事务和锁。

弱一致性的解决方案:消息队列。

  • 3、分布式Session

一个常见的问题,也有多种解决方案。

  • 4、分布式缓存

和上述的缓存一样,只不过这里侧重缓存的分布式方案。

  • 5、分布式数据库

这里指的是数据库的分布式方案,也包括HBase这种分布式数据库。

  • 6、负载均衡

负载均衡也是一个值得探讨的话题,一般我们讨论的是七层和四层负载均衡。

  • 7、消息队列

消息队列是一个比较复杂的分布式组件,我们可以了解常用消息队列,例如Amq、Kafka等的实现。

  • 8、服务化

服务化的核心包括Rpc、服务注册中心等等。分布式服务相关技术也是后端同学必须掌握的内容。

  • 9、虚拟化

虚拟化同样也是后端同学必须掌握的内容,只不过现在越来越多的服务部署方式使用的是Docker和云服务的方式,所以了解一下也没有什么不好的。

把以上这些内容掌握以后,就可以自诩精通Java后端了!但做到的没有几个!

学习编程是一个漫长而痛苦的过程,需要持之以恒的耐心,千万不可急于求成。

想要入门很容易,但想精通谈何容易呢?

编辑不易,望各位看倌不吝点评指导!!

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。