Every software engineer progresses over time. Their programming skills get better and more solid solutions are shipped. At some point, developers start looking for more and more technical challenges. Unfortunately, not all of them are able to fulfill this need, and as a result, they jump between different companies.
Changing jobs does not always lead to satisfaction. Challenging yourself through learning is a more practical way to keep growing as a professional. In this article, I will provide a list of technical books that every senior software engineer should read. They will encourage you to look at certain things from a different perspective.
This book is full of insight into how processing and storing data works. It covers database topics deeply. You will learn different types of databases and their most common use cases.
As developers, we know what database indexes and transactions are. But do we really know the costs of these features? How often do we question whether the performance may suffer from every newly added operation in a transaction? The author’s answers to those questions are well-described and followed by a bunch of real-world examples.
The author guides readers not only through the databases, but the topics of data consistency and synchronization are also covered in depth. For example, the mechanisms and approaches for achieving data consistency across distributed instances, when database replications are necessary, etc. You will learn about Atomic Commit and Two-Phase Locking in transactions when multiple writers are used.
This book is definitely for advanced engineers. It assumes you know the basics of computer science subjects, such as binary trees and hash tables. If you already have some experience in the field and want to better understand how big data systems work, then this is a great starting point.
After learning how to program and releasing multiple solutions, every developer starts observing some similarities in code. In certain cases, they would usually apply one approach. In other cases, a different common technique would be used. If you feel the same way, you have reached a turning point.
Your next reading should be about design patterns. A software design pattern is a technique for solving common problems in a conventional way. Instead of reinventing the wheel, we can take advantage of the well-known solutions and instead focus on business challenges.
The best book about design patterns is from the “Gang of Four” (Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides). It is famous among senior software developers and architects. It covers many design patterns, starting from simple ones like Singleton and finishing with more complex ones like Command and Visitor.
After reading this book, you may feel a little overwhelmed and tempted to apply complex design patterns to simple problems even when it is not needed.
“I suppose it is tempting, if the only tool you have is a hammer, to treat everything as if it were a nail.” — Abraham Maslow
Use this book as learning material to expand your knowledge. Study all the examples they provide for every pattern. With that said, next time you have to deliver a project, carefully pick the right pattern and strive for simplicity.
At first, we learn programming in a single thread — usually the UI thread. Things work well until we have to perform heavy computations or read/write files. The blocked user interface becomes a problem as it waits for the completion of the operation. That is the case when the job has to be done asynchronously and the user interface should remain responsive.
Even if your main specialization is not Java, this book can teach you about common problems in multi-threading systems. It starts by explaining what a thread is and how the system actually executes tasks in parallel. Then the book explains the most common problems with threads, like race conditions and deadlocks.
The book reminds us of the “dining philosophers problem.” This is a good example of starvation and a possible deadlock, as every person requires two forks:
Later, the book dives deep into the topic of asynchronous task execution when the whole synchronization between parallel jobs is done by the framework.
The author focuses mainly on efficient parallel execution in the Java environment. Therefore, all examples are in Java. But you should not feel discouraged, as many other frameworks use similar ideas (e.g. .NET).
Concurrency is an advanced subject indeed. Start with this book when you feel confident in at least one programming language. After completing the book, you will have a clear picture of the costs of parallel work, non-blocking algorithms, and best practices in multi-threading systems.
Being a software engineer involves a lifetime of learning. New technologies are continually appearing, and if we want to grow and build reliable solutions, we have to catch up with the trends in the industry.
Staying curious is the key to succeeding as a developer.