Modernizing Java to keep pace in a cloud-native world
Java is no spring chicken and some are even referring to it as a “vintage language”. Despite its popularity, there are some complaints about it. In our new cloud-native world, why does Java need to evolve? In order to evolve to keep up with modern, cloud-native apps, Java needs to keep all of what makes it so dependable, while also being able to function in new app environments.
Don’t worry, you are not the only one who feels old when you hear Java being described as a “vintage” programming language. While Java has been around since 1995, it is certainly not ready to retire (or rather, be retired), and continues to rank among the top languages TIOBE index. In fact, no other language has been so popular for so long.
However, it is not without its issues, including sometimes being too clunky to keep up with some of the newer programming languages, not agile and flexible enough to work in this new world of containers, and not really relevant in applications that are not coded to be Java first. While they say you can’t teach an old dog new tricks, you can rethink how it performs what they already know.
This piece will discuss what the community can do to help the language keep up with modern application development trends, to ensure that it continues to have a place in the new cloud-native programming world.
Why has Java stood the test of time?
It has been said that Java is having a “Renaissance Moment” where the programming language keeps evolving. In fact, there is so much demand for new innovations that release cycles have been shortened to every six months, and Java 13 was just recently announced at this year’s Oracle OpenWorld. It addition to never dipping below number two on the TIOBE index, SlashData has predicted that there will be 7.6 million Java developers by the end of 2019.
Java has many advantages, including being designed for ease of use, and it is often said that it is easier to write, compile and debug in Java than in any other programming language. This, coupled with the fact that it ranks among the top programming languages used by companies in the Fortune 25, means that it continues to remain relevant, even as shiny new programming languages like Rust, Elixir, and Swift come on to the scene.
Why does Java need to evolve?
The disconnect between modern application development and Java is that the apps built on newer programming languages tend to be more lightweight, agile and flexible, often running in containers, which traditionally Java has not been well-equipped for.
Common complaints include:
- Java is too fat, often starting with libraries that are not used. This does not bode well for microservices architectures but does work when the Java application is being used to solve a more complex problem.
- It still follows the “write once, run anywhere” principle, meaning that any device that has a Java Virtual Machine (JVM) should be able to successfully – meaning without it being altered – run a Java app. While this is generally a good feature, it is not as important when targeting containers.
- Java has a longer start-up time when compared with newer apps, which goes back to it being really good at having everything it needs to solve complex problems, but leaves something to be desired in terms of simpler processes.
- Having too many libraries, and therefore having a large package size, slows down the start-up time and makes the Java app less agile.
- Some also say that Java is too verbose and that more modern languages can do the same thing with less code.
- Java is a very dynamic language, which is part of what makes it so productive and agile but can also cause some frameworks to abuse the dynamic capabilities, resulting in longer startup time and large memory overhead.
- It is not always the best equipped language to handle event driven architectures where concurrency and throughput are more important. Java’s plan to address this is through Fibers.
In order to evolve to keep up with modern, cloud-native apps, Java needs to keep all of what makes it so dependable, while also being able to function in new app environments. Part of Java’s renaissance moment is that developers are beginning to realize that, and are doing what they can to modernize Java while not straying too far from the tried and true benefits of the language. This can enable allow the millions of current Java developers to expand the work they can do without having to learn an entirely new language and shift how they work.
Java in the modern application development world
When I say modern application development, I am referring to environments like Kubernetes and Serverless, both of which rely on containers for deploying code into production, that up until very recently, Java has been incompatible with.
SEE ALSO: JEP 365: ZGC on Windows
Long time Java leaders like Red Hat are aiming to make it a key player in these environments, through initiatives like Quarkus, which is a Kubernetes-native Java framework tailored for GraalVM and OpenJDK Hostpot. By offering developers the ability to use Java in a unified reactive and imperative programming model, Quarkus aims to enable developers to work within Kubernetes and serverless environments without having to learn a new paradigm. It can deliver new runtime efficiencies to try to tackle some of what currently makes Java stuck in the past, including faster startup time, lower memory utilization and a smaller application and container image footprint.
Through frameworks like Quarkus, I believe Java will be better equipped to scale in the modern application development landscape and continue to not only evolve but also innovate. Because that is what is key here – creating a path to the future for cloud-native Java and in doing so, keep Java at the center of enterprise innovation.