One of the most popular version control system. It's just not possible to live without Git anymore.
Not just a web developer but for any programmer, the Linux command line is very, very important, and I strongly recommend you to spend some time to learn them.
Data Structures and Algorithms
These are the building blocks of any program, and a good knowledge of Algorithms and Data Structure is vital for your next job or doing well on your current situation. You should at least be familiar with essential data structures like an array, linked list, hash table, binary tree, queue, stack, and graph.
The HTTP protocol is the backbone of the web, and a good knowledge of both HTTP and HTTPS is mandatory for a web developer
Computer Science Fundamentals
If you are creating global applications that show information in many different languages across the world, then you should have a good knowledge of character encodings. It basically tells your browser how to show your data.
There is no doubt that every programmer should know Git and Github as they are the standard in terms of version control and code repository.
Java Developer RoadMap
The tools section is divided into different sections as follows:
- First, your IDE, which is your primary tool and can do almost everything you asked for like compile, run, debug, profile, test, compare files and code, refactoring, and much more.
- The second part is the build tool, which you need to build and deploy your projects like Maven and Gradle. Anyone of this would be enough. I have just listed ANT, but that's for legacy projects. For all new Java projects, prefer Maven or Gradle.
- The third and most crucial part includes containers like Docker and Kubernetes, CI/CD tools like Jenkins and TeamCity, and Infrastructure automation tools like Ansible.
The next important thing to learn is JDK APIs, which is very, very important for any Java developer. This is quite a big section, and that's why it's divided into core areas like Java Collections framework, Java Concurrency, Java IO, and Java 8 APIs, let's explore each of them
Java Collections Framework
This is one of the most essential Java API every Java developer should learn. This API provides implementations of standard data structure in Java-like linked list, set, stack, queue, hash table, priority queue, and others.
At least you should know about all everyday objects like ArrayList, HashMap, HashSet, LinkedHashSet, TreeSet, etc. Each of them has their different property like ArrayList is a dynamic array which can grow, HashMap is a standard implementation of the hash table and can be used to store key-value pairs.
Similarly, HashSet is a set implementation that doesn't allow duplicate elements.
After Java Collections, the next, most crucial API in Java is about multithreading and concurrency, and I firmly believe that if you want to be a competent Java developer, you must have a solid understanding and command on Java Concurrency API.
You should not only have an in-depth understanding of fundamental concepts like Thread, Runnable, Object locking, and Synchronization, but you should also be familiar with concepts like deadlock, livelock, race conditions, and how to deal with them.
You should also learn about advanced Java concepts like synchronizers added on Java 5 and subsequent version, I mean CyclicBarrier, CountDownLatch, Phaser, and CompleteableFuture, etc., along with Futures and how to perform the async operation in Java.
I have interviewed more than 100+ Java programmers, and I have noticed one pattern; they all have very little knowledge of Java IO and NIO APIs as compared to Java Collections and Java Multithreading API. I can understand that many people spend a lot of time learning those two APIs, but you cannot leave behind this critical APIs.
If you have to code a real-world, core Java application, you will need to use classes like File, InputStream, OutputStream, Reader, Writer from java.io package, which is the core of the Java IO API. Similarly, you also need to know about ByteBuffer, FileChannel, Selector, and other critical classes from the java.nio API, if you want to write a socket-based application.
Java 8 Features
Now, the next and another necessary API, a Java programmer, should learn is the Java 8 features, which has completely changed the way Java is coded and programmed nowadays. To become a Java developer in 2020, you must know how to use a Lambda expression, Stream API, Optional classes, and new Date and Time API.
Without knowing these APIs, it would be very tough to write a Java application in 2020. Most of the library also now stop supporting version lower than Java 8, which means you have to learn Java 8 features now than later. It's already 5 years since Java 8 was released, so you literally have no excuse left.
The best thing about Java is that it has a vibrant eco-system, which means there are a lot of frameworks and libraries to almost anything. Usually, I don't suggest a Java developer learn a framework until he needs to use it in his project. Still, there are some frameworks and libraries, which I believe every Java developer should know like Spring, Spring Boot, Hibernate, Log4j, JUnit, etc.
This is one of the most popular Java frameworks, and literally, almost every single Java application I have worked in the last 5 years, uses this framework.
Spring Framework encourages writing clean code, which is easier to test and maintain by providing you features like Dependency Injection and Inversion of Control. It also has a rich API for most of the day-to-day tasks, and that's why every Java developer should learn Spring framework.
The second framework which I recommend every Java developer to learn is the Hibernate, which is based upon JPA (Java Persistence API). To be accurate, Hibernate came before JPA, but because JPA is standard API to implement the persistence layer in Java, Hibernate implements it.
Now, why should you learn Hibernate? Well, because most of the Java applications you will work with will interact with Database, and it's excruciating to deal with Database in Java using JDBC and without a proper framework like Hibernate.
It provides some of the essential features like Caching and Transaction out-of-the-box, which means you have more time to focus on your application logic, then implementing caching in your application. This seriously improves the performance of Java application, and so far, my most significant reason to use Hibernate.
This is another framework I recommend every Java developer to learn in 2020 and going forward. Spring Boot took Spring's philosophy of simplification and made it easy to work with Spring itself. Just like Spring makes it easier to create a Java application, Spring Boot makes it easier to create a spring-based Java application.
Features like auto-configuration take away most of the pain associated with configuring Spring application. Similarly, starter POM features grouped commonly used dependency into simple reusable POMs.
MicroProfile, Micronaut, and Quarkus
While learning Spring Boot and Spring Cloud is sufficient for developing Microservices in Java, there is a couple of more advanced frameworks you can explore, like Eclipse Microprofile, Micronaut, and Quarkus.
It's an initiative that aims to optimize Enterprise Java for Microservice Architecture. It's driven by Eclipse, one of the leading organizations of Java and the company behind popular Eclipse IDE. The goal Eclipse of MicroProfile is to define standard APIs for building microservices and deliver portable applications across multiple MicroProfile runtimes. The current version of Eclipse Microprofile in 3.2, and it's a useful Java framework to learn in 2020.
This is another Java framework you can learn in 2020. Micronaut is a modern, JVM-based, full-stack framework for building modular, easily testable microservice and serverless applications. It's a polyglot framework and allows you to create an application using Java, Kotlin, or Groovy. Some of the key talking points of Micronaut is reduced startup time, blazing-fast throughput, and minimal memory footprint.
Quarkus is a Kubernetes Native Java stack tailored for OpenJDK HotSpot and GraalVM, crafted from the best of breed Java libraries and standards. Quarkus tailors your application for GraalVM and HotSpot to get Amazingly fast boot time and incredibly low RSS memory (not just heap size!).
It also provides instant scalability and high-density memory utilization in container orchestration platforms like Kubernetes using a technique called compile-time boot. You can also use both the familiar imperative code and the non-blocking reactive style when developing applications for Quarkus.
In short, one of the best platforms for Java developers to create an application and something worth learning in 2020.
Testing is an essential skill for any Java developer, particularly unit testing, integration testing, and automation testing. At the bare minimum, every Java developer should be familiar with JUnit and Mockito, two of the most popular Unit testing and Mock library.
If you know these two and know how to use them to effectively create a unit test, you will be a much better Java developer than without them.
There are more advanced libraries also exists like Cucumber for Business-driven testing, Robot Framework for integration testing, but there is no substitute for JUnit, you will always need that.
When it comes to a mocking library, you have a couple of choices like PowerMock, Mockito, and EasyMock. Still, I strongly suggest you learn Mockito because it's a vast library, and also many Java developers and companies are doing that. It is slowly becoming the standard library for creating mock objects in Java.
The real power of Java lies in its vibrant ecosystem of open source libraries. You will find libraries to do almost anything in Java from logging to machine learning, from sending an HTTP request to parsing JSON and much more.
Apart from that, Java is also lucky to have utility libraries like Apache Commons and Google Guava, these two libraries effectively complement JDK libraries.
I suggest you go through that list, chances are that you already half of them but if you don't learn them they are very, very useful and help you to write better Java programs and deliver faster.