February 9, 2019

Engineer Learning Plan (JVM-based, server)

This learning plan is only focused around JVM-based server-side development and related areas.

One could consider it as an actionable checklist to stay up-to-date in server-side development topic.

I has written it for my own purposes and based on my principles. I would be glad to see any advices or recommendations to improve it and make accessible for more beginners and professionals.

Principles

To get more from learning plan and learn faster, I try to follow my basic learning principles. If your learning principles differ from my, please, share them.

Learn only through practice

For each topic I will provide an example and I will totally recommend to implement it and to work on it. Main point here is to develop small set of projects to get maximum from current learning topic.

No matter how long you are watching videos about how to cycle, until you go out and try, you won’t learn it. That’s it.

20% of theory and 80% of practice.

Focus

Go deep. Try to master one thing at time. Do not learn two or more things at the same time.

Focus should help to acquire skill faster, since there is no context switching and time spending on other topics.

Write down and summarize

Try to summarize and write notes for each topic you learn. It could be a blog post, question in a forum or even small email letter a friend.

Discuss

The goal is to view and explore topic from most sides. Discussion with a friend could help. The best option is to have more experienced mate on this topic and to ask him.

Today you could write to anyone, you could find professional for any topic and write email to him.

Answer and ask questions

While you’re acquiring skill and learning topic, try to find public forum related to it and ask questions there.

One good way is also to answer the questions related to topic.

Reddit, Quora, StackOverflow for your needs.

Subscribe to most advanced professionals

To stay up-to-date on topic, you could subscribe to most advanced professionals in it.

Learn only by need

I am not sure I could 100% follow this principle all the time. But! In case if current job requires mastering concurrency in Java, it is the best time to learn about it. I can apply all learnt skills and concepts right at the job. But we are not so lucky and we could suddenly receive task for which we do not have time to learn. So it is better to prepared and learn constantly.

In case if I could, I would prioritize acquiring skills according to the job tasks. E.g. if I see that we are going to move to micro-service architecture I will prioritize learning micro-service architecture techniques.

Skills and concepts

Master IDE or text editor and tools

This is your army knife. Pick one and make sure you get most of it.

Basically, there are two main approaches in choosing and working with IDE:

  1. Choose one tool which could cover most of your questions. E.g. use JetBrains IntelliJ IDEA,
    extend it for all kind of tasks and never quit out of it.
  2. OS and terminal are your IDE. For each task use one specific best tool at it and master it. E.g. use Vim for text editing, use Git CLI tool for for managing git repository, redis-cli to work with Redis and so on.

Each of these approaches has cons and pros.

Pros of using IntelliJ IDEA:

  1. With modern IDE like Intellij IDEA it is easier to explore big monolith projects, to refactor them and to jump through the regions of code.
  2. IntelliJ IDEA is perfect at debug and running unit tests.
  3. IntelliJ IDEA has a dozen of plugins which could cover all your needs.
  4. It starts fast and has amazing performance.

Cons of using Intellij IDEA:

  1. More advanced version costs money.
  2. You are tightly-coupled to one ecosystem. Changing language could be quite hard, but! almost for every popular language JetBrains proposes and IDE with same key mappings and plugins ecosystem. Even for languages which are not supported by JetBrains, there is a path, e.g. Cursive for Clojure.

Pros of using Vim/(other light text-editor) and tools:

  1. Fast.
  2. Vim is everywhere.
  3. Not dependent on one specific platform and language.

Cons of using Vim/(other light text-editor) and tools:

  1. Not as intelligent as it could. Will require amount of time to hack it for your needs.
  2. Steep learning curve.

I would recommend to master Vim and CLI tools to automate your work. This approach will give you freedom and independence from platform and language. Try to start with A Four Week Plan.

After you’ve mastered it, you could set up Vim for Java.

Java

Use Java as main language. No need to worry about vacancies next few years.

I propose to learn only book to master Java - Effective Java from Joshua Bloch.

Why this book?

  1. It discovers a broad set of topics in Java.
  2. It is adapted for modern Java as well.
  3. It is very practical. You can pick one topic and try to master it.
  4. Each topic in book is independent, you could just open book at any topic you need and read it without worries that you have read previous chapters.

JVM internals

Since, it is the main platform for executing Java code. I think that this is necessary to understand how JVM behaves and executes Java code.

It also could help to write more optimal and effective Java code.

You could start from reading any article about JVM internals. And go deeper with The Java Virtual Machine Specification.

Garbage Collection

It is necessary to understand limitations and pitfalls of Garbage Collection. You need to understand in everyday basis how to manage memory carefully.

To understand topic deeper, try to follow JVM memory management course on PluralSight and tutorial from Oracle.

JVM

Java has a lot of JVM to execute code, I propose to master one or two, but be aware of all. Java performance and resource utilization might slightly depend on JVM.

There is a short list with short summary of most popular JVM.

Performance of JVM applications

Writing code which executes fast could be tough enough. Nowadays, it seems not so critical since we have a lot of available computing resources. But performance is always a competitive advantage.

So, become an expert in JVM performance. I recommend to pick one book Java Performance: The Definitive Guide: Getting the Most Out of Your Code and start from it.

Networking including TCP/IP v6

Nowadays, probably, every application communicates over TCP/IP stack. And expertize for this area is highly valuable. You could have a grate architecture, but with bottleneck in networking communications it won’t move far away.

I prefer to start with basic concepts behind networking.

There is a good course from Google - Computer Networking.

Oracle has notes about Java networking library.

Concurrency, parallelism & distributed systems

It is very complex and broad topic. But nowadays engineer who does not use these tools will be limited to dramatically improve performance of applications.

There is a good book to leverage basics of Java Concurrency in Practice.

To go deeper and get more practice, dive into “Parallel, Concurrent, and Distributed Programming in Java Specialization”.

Articles

  1. http://lamport.azurewebsites.net/pubs/pubs.html
  2. http://dancres.github.io/Pages/
  3. http://alvaro-videla.com/2015/12/learning-about-distributed-systems.html

CAP Theorem

Make sure you are familiar with CAP Theorem. There is an interesting illustrated proof of the CAP Theorem.

Functional programming (Scala & Clojure)

I choose one book - Functional Programming in Scala to leverage the basics of functional programming.

And I would recommend to try Clojure for the Brave and True.

Reactive Programming

The only one article you could read and start develop using reactive approach is https://gist.github.com/staltz/868e7e9bc2a7b8c1f754.

Try to use RxJava.

DDD

As communication layer between developers and business. There are 2 basic books to start development
in DDD-style:

  1. Domain-Driven Design: Tackling Complexity in the Heart of Software.
  2. Implementing Domain-Driven Design.

First is more theoretical one, and second is more about practice. You could even skip first and start right away from second.

Unit and integration testing

As approach to speed up delivery, increase code and overall application quality.

There is classical book for this - “Test Driven Development: By Example” by Kent Beck.

I also propose try to use Mutation Testing.

SQL (PostgreSQL)

As approach to store data.

Practice SQL:

  1. https://www.hackerrank.com/domains/sql
  2. https://www.amazon.co.uk/Joe-Celkos-Puzzles-Answers-Second/dp/0123735963
  3. https://www.amazon.com/SQL-Practice-Problems-learn-doing-ebook/dp/B01N41VQFO/

NoSQL (Redis, Cassandra, ElasticSearch)

  1. Redis in-memory data store.
  2. Apache Cassandra as example of unlimited scalable database.
  3. ElasticSearch for indexing and searching things.

Messaging (Kafka)

There is a ton of messaging brokers, each of it has pros and cons and different use cases. I propose to pick up, one modern messaging system and master it.

I recommend to start with Kafka. There is Kafka: The Definitive Guide.

Use Apache Flink or Spark for streaming and data processing solutions.

Error processing

Errors are facts. Errors happen and happen often. Think of error like any other entity.

Learn how to work with exceptions in Java. Learn best practices from other languages like Go, Rust, Scala.

Logging

Learn why and how use logging. How to read logs? How to analyze logs? Logging best practices.

Debugging

Try jdb to debug Java right in CLI. Then you will never have any problems to set up and debug JVM-application in any IDE or even without.

Spring Boot

There is no need to create every application from scratch. You could jump in and use stable and modern platform rapid application development.

Start From Zero to Hero with Spring Boot - Brian Clozel .

Cloud

Docker dominates. So, today it is essential to master Docker basics and more advanced topics like volumes, networking, and so on.

Kubernetes could with Docker orchestration in a cloud.

Try to package complex application with a Docker image and deploy it to Kubernetes.

Algorithms and data structures

It depends on domain of your job. But it might be the case, that you will never implement algorithms learned in these courses:

  1. https://www.coursera.org/learn/algorithms-part1
  2. https://www.coursera.org/learn/algorithms-part2

But! Most important thing is your muscle - brain. After passing courses and training brain on practice:

  1. LeetCode
  2. HackerRank

You will probably write near-optimal code by default. You will feel the complexity of code, of solution.

Architecture

It is hard to find practical articles and books to gain design skills fast. But there is one killer course, which could help - Grokking the System Design Interview.

It also could be a good asset to pass system design interviews.

Cryptography and Security

Why I need to learn cryptography today? We have a lots of libraries, public APIs and tools. But! I truly believe the only way to use tools right is to learn principles behind them.

Start from cryptography basics:

  1. Cryptography I at Coursera.
  2. Cryptography II at Coursera.

And proceed to more high-level concepts with well-established resources like OWASP.