Software engineering books

[ comments ]

I’ve been a software engineer for over 10 years now, and I’ve successfully passed through all stages of grief. I’m also an avid reader. This page contains my collection of books that have helped me the most throughout my career.

Software Engineering

The core of the list; this section contains books that are on-topic and give valuable technical insight. Some might seem outdated (a few are) and you may disagree with others (I’ve tried hard to keep my functions under 5 lines of code, but it’s not for me). Still, it’s a good idea to read them nonetheless to understand what some consider to be the golden standard of software engineering.

You’ll notice that this list does not contain books on specific languages or frameworks. That’s because learning a new language or platform is much easier through hands-on experience rather than reading a book cover-to-cover. Still, best practices, knowing how to organize your code, and gathering requirements, all of these are much harder to learn on your own and usually require a helping hand to set you on the right track.

Clean Code
by Robert Martin (Uncle Bob)

This is likely the most recommended book on software engineering. Most praise “Uncle Bob’s” writing and organizational style, considered the gold standard of writing clean and maintainable code. If you enjoy this series, you will be happy to hear that the author has published several other books on this topic, including books for designing Clean Architecture, organizing tasks using Clean Agile, and general guidance for software professionals through Clean Coder.

His video series, called Clean Coders, is equally brilliant, funny, and informative. When I first started my career, my team used to gather around and watch Uncle Bob’s video series each week, and I still remember those moments fondly. These meetings were an important pivot point in my career, as they helped me understand that writing software is more than just making it work.

The Pragmatic Programmer
by Andre Hunt, David Thomas

While “Clean Coder” made me a better programmer, “The Pragmatic Programmer” made me a better software engineer. There’s a large chasm between coding and engineering, one that can be traversed by learning the practical aspects of this career.

The author describes pragmatism as encompassing five key qualities: early adopter (keeping up to date with the latest technologies and trends; note: this is different from actually using them in mature production systems), inquisitive (understand how others do things the way they do and learn what you can from their techniques), critical thinker (never take things at face value, and understand why something is required from you), realist (which I think is the most important quality that is missing from most software engineers), and jack of all trades (you are aware of a wide range of technologies, keeping you flexible throughout your career).

The Mythical Man-Month
by Frederick Brooks Jr.

Can you make one baby in one month using nine pregnant women? Of course not, but some managers certainly seem to think so. Once you reach the point in your career where you have to estimate timelines and complexities, you’ll notice that this aspect of software engineering is more art than science. Still, that doesn’t mean we can’t improve. This book provides an introduction to some of the challenges and caveats of working with a large team of software engineers.

Release It
by Michael T Nygard

In the line of books that make you a more pragmatic programmer, “Release It” provides essential tips for managing your product once you’re ready to ship your code. It’s always difficult to let go of your baby after you’ve worked on it for so long. Not because you’re emotionally attached to it, but because it will instantly cause headaches the moment real customers start to use it. This book prepares you for the onslaught of customer complaints, angry managers, and threats of forced termination, that naturally come after you’ve released the very first version of your product.

Essential Scrum
by Rubin Kenneth S.

How do you prioritize work for a large system that needs to be implemented from scratch? How do you even begin to break down a monstrous and ambiguous new project into smaller tasks that a junior can understand? I’ve been in teams that have essentially used a wet sock thrown into the wind to decide what to work on next. Still, the most used technique for managing projects and tasks is Scrum (a form of Agile development). It’s popular because it works, and it’s a handy tool to keep in your toolbox.

Code Complete
by Steve McConnell

I must confess, I never actually finished “Code Complete”. At over 900 pages long, it’s not hard to see why. “Code Complete” is, in essence, the manual of software engineering. It covers a diverse set of topics, from code structuring, debugging, performance tuning, documentation, and so on. Given how comprehensive it is, it’s no wonder that “Code Complete” is one of the best-selling software engineering books of all time.

Patterns of Enterprise Application Architecture
by Martin Fowler

This book is now over two decades old, but don’t let its age fool you. Although some of the code examples from it are a bit outdated (it’s crazy to think that Java was already at version 4 when this book came out), the principles that are explained in this book are timeless. You’ve likely heard and used the model-view-controller design pattern, and this is just one of the concepts that are presented in this book. In essence, this book is about organizing complex software in a way that makes long-term maintainability as easy as possible.

Refactoring
by Martin Fowler

Another book by Martin Fowler, but this time on the topic of code evolution. I’m sure you’ve been in situations where you’ve had to deal with legacy code that is difficult to understand, error-prone, and time-consuming. I’m also sure that, if you’ve been in this situation, the first thing you suggested to your manager was: “It’s easier just to start over.” Faced with an imminent refusal, the next best thing is to try and reorganize the existing code base to bring it up to modern-day standards. Obviously, refactoring shouldn’t be done only to legacy systems. It should be a normal part of everyday coding. It’s hard to predict the future and write everything well in the first go. “Refactoring” will teach you how to improve the readability and safety of your code without breaking anything.

Clean Code (Video Course)
by Maximilian Schwarzmüller

For those that prefer video learning, the “Clean Code” course is a comprehensive introduction to the best practices in the art of making software products maintainable and easy to understand by your peers. Anyone can make some piece of code work, but it’s a lot more difficult to translate solved problems into something that won’t look like an ancient writing system two years in the future. Ultimately, the code is destined to be written only once, but read many more times, so it’s important to be optimized for this aspect as well.

Code
by Charles Petzold

I added this last book in this section with the purpose of inspiring you rather than providing you practical tips. “Code” presents the ingenuity of some past pioneers that have created the foundation of the current technological industry.

Quick Reference Books

These books are not meant to be read cover to cover. And, no, you don’t have to know all the data structures that exist under the sun. The books in this short section are meant to be kept in your library, and dusted off and skimmed when you need inspiration about a particular problem.

Introduction to Algorithms
by Thomas H. Cormen, Charles E. Leiserson, and others

If you decide to buy physical copies of any of the books mentioned in this list, “Introduction to Algorithms” will be the largest one in your collection. That’s because there are a lot of different ways to solve low-level problems, and, more often than not, someone else has already solved them for you. It’s difficult to see how in the era of copy-and-paste programming one would ever need to solve such low-level problems. However, these kinds of challenges creep up on you more than you think.

Throughout my career, I’ve had to use and sometimes implement a wide range of data structures and algorithms, including tries, bloom filters, hash maps, sorted binary trees, and many more. This book might not be used daily, but it’s indispensable when you’ve really hit a wall.

Cracking the Coding Interview
by Gayle Laakmann McDowell

Here’s a secret interviewing tip if you’ve ever wanted to apply to a FAANG company: a lot of interviewers draw inspiration for coding problems from this book (myself included). “Cracking the Coding Interview” will sit on your bookshelf, gathering dust, until you’re ready to change jobs and need a reminder of how a hash table works. Even if you don’t plan on changing your job anytime soon, this book is still valuable as a gentler introduction to various data structures and algorithms that will keep your skills fresh.

Big Data, Data Science, and Data Analysis

Similar to how the internet revolutionized the technological industry, big data and machine learning are shaping up to be the next innovation in software design. Even if you think that you can side-step these changes and concentrate on your current favorite stack, at some point, you will likely have to deal with all that data that your app or system gathers.

On the same note, adding books about statistics to this list might seem like we’re drifting even further apart from software engineering. But I’m sure you’ve used or at least heard about A/B testing, one of the core ways developers of user-facing software use to understand if a change is beneficial or not. Knowing the basics of statistics is crucial to designing and understanding such tests, and ultimately what your customers need from your product.

Designing Data-Intensive Applications
by Martin Kleppmann

This book won’t teach you about any specific big-data platform (such as Spark or Hadoop), but it will help you understand why these systems exist. Ultimately, big data is about using the right tool for your specific data and needs, which may just be a simple Python script running on your computer. But, if you’ve found that this is not enough and you need distributed computing, then this book will help you learn what to keep in mind when working with such platforms. Even if you just glue these systems from AWS or a similar cloud provider, it’s still useful to have some idea of how they work and what are their common bottlenecks and pitfalls.

Statistics in a Nutshell
by Sarah Boslaugh

Similar to other books on this list, you might not want to read “Statistics in a Nutshell” cover to cover. Some topics might be too advanced, even for those that deal with analytics daily. Still, the very first concepts presented in this book are easy to understand and don’t require any prior knowledge of math or probability. Even so, if you need an alternative book that is easier to understand, Statistics Without Tears is another great option.

Better Data Visualizations
by Claus Wilke

What do you do when you’ve finished your analysis on some big dataset and want to present your findings to your manager? A written report is good, and charts are better, but charts with eye candy are even better. It’s a shame to spend all that effort gathering and analyzing some data, to drop the ball on presentation. Spending a little more effort on designing the appropriate visualization for the message you are trying to transmit will only make your presentation clearer. “Better Data Visualizations” will help you make your data presentation more appealing and easier to understand.

Deep Learning with Python
by François Chollet

Me mentioning this book feels a bit like cheating, as I promised to not include any books that are specific to only one language or framework. Even so, the learnings that you get from Deep Learning with Python apply to a wide range of machine-learning frameworks and languages.

I’m sure that one of the first thoughts that came to mind when you first started learning about machine learning and prediction was: “Hey, can I use this on stocks?”. Yes, you are not alone. Most of us have tried naively to use deep learning on stuff that can bring us cash, but it almost always ends in tears. However, that doesn’t mean that deep learning doesn’t work on some problems. In fact, it’s been very successful at some specific tasks. This book provides a simple introduction to one of the most powerful machine learning techniques, namely deep neural networks.

Hands-On Machine Learning with Scikit-Learn and Tensorflow
by Aurélien Géron

You likely don’t need two books on machine learning to get started in this field. However, if you’re serious about machine learning, “Hands-On Machine Learning with Scikit-Learn and Tensorflow” is another great introduction. It contains hands-on examples using one of the most popular machine learning frameworks and libraries, and you can’t go wrong with at least trying them out.

Improving your statistical inferences
by Daniel Lakens

Not a book, but a video course (and free!), one that I highly recommend. It’s also one of the highest-rated courses on Coursera, for good reason. If you use statistical tests for your job, you’re most likely using the good-old faithful t-test. It might seem that you only need to apply some formulas or call some library functions to get a yes or no answer from this test. But if you do only this, then your answer will very likely be wrong (or at least, interpreted wrong). “Improving your statistical inferences” provides the appropriate logical framework that you need to understand what your data is trying to tell you.

Exploratory Data Analysis
by Roger D. Peng, and others

Another video course that is also free. But this one is on topics that cover what you need to do before you start working on your big data pipeline or machine learning algorithm. Understanding your data is important, not only to make sure that your conclusions are based on correct assumptions but also to optimize your algorithms and keep costs down.

Practical Time Series Analysis
by Tural Sadigov, William Thistleton

Data with a time component is one of the most common sources of information. That’s because all data is ultimately captured at a specific moment in time, be it a stock price, a computer crashing, or users sending a text message. Having a deeper understanding of this type of dataset is important for most software engineers, as tracking metrics and anomalies are part of our daily lives.

Web Development

No matter which industry you work in, it’s very likely that you have had to deal with the internet at some point in your career. Nowadays, for better or worse, everything connects to everything else, so managing and understanding how the internet works is an inescapable part of our job. Hell, even my fridge is connected to the internet now. The following books provide an introduction to high-performance networking, alongside some tips on how to untangle the mess that is async programming.

High Performance Web Sites
by Steve Souders

Steve Souders is one of the most influential figures in the web performance space, alongside Ilya Grigorik, who is also mentioned in this section. I remember following every Tweet they posted back when I was starting my career. Steve Souders created many web performance analysis tools back when Lighthouse wasn’t even an idea. He is also the co-founder of the Velocity performance conference. His book, “High Performance Web Sites”, distills the best practices that he has gathered throughout his career.

High Performance Browser Networking
by Ilya Grigorik

Another early pioneer in the web performance industry, Ilya Grigorik was co-chair of the W3C Web Performance working group and has led the design of many web standards that are now implemented universally in most browsers. Nowadays, he’s not as active as he used to be, but his book on best practices for building high-performance websites is just as relevant now as it was when it was first published 10 years ago. You can read this book online entirely for free as well.

Web Performance Calendar

‘Tis the season. Carols are playing in every shop. St. Jolly is at the forefront of every store to promote capitalist consumerism. Work has slowed down almost to a crawl, and not even managers seem to care. It’s also the season of the “Web Performance Calendar”, a gift that keeps on giving every day throughout December. Most sane people eagerly await the time of gift giving and family reunions when the holidays arrive. But web nerds (myself included) have something else to be excited about; a new stream of web performance tips and best practices. This blog is updated only once per year, but every post is archived and available to read with your morning coffee.

Business and Finance

Software engineers generally shy away from understanding some of the more business aspects of their company. Finance seems more like a management problem rather than an engineering one. But don’t be so quick to judge. Understanding the business will make you more valuable to your company, while also making you better at engineering decisions as you have a deeper understanding of what’s required from you.

More so, most engineers have, at some point, thought about starting their own startup, while some have even taken the leap and developed their first product. After many sleepless nights and energy drinks, people that have launched their first product will find that it is entirely a flop. That’s because creating and launching a successful software product is more than just about coding. It’s about understanding your customers’ needs, marketing, managing finances, and many more. The books in this short list will provide a gentle introduction to the world of starting and managing a business.

The Personal MBA
by Josh Kaufman

The Personal MBA is kind of an encyclopedia of managing a business, and should be treated as such. Don’t expect to get a deep understanding of this subject. But what you will get is a great starting point from which you can continue your study. The book covers a wide range of subjects, from product design, to finance, marketing, and personal growth. It’s the best starting point that you can get, as long as you’re willing to put in the effort to follow up with some other books that go a little deeper on each subject.

Financial Intelligence
by Karen Berman, Joe Knight

Most view accounting as a boring subject, with no room for creativity. After all, it’s just about adding numbers in a spreadsheet, right? When I was younger I felt that most accountants can be easily replaced with an App, and I couldn’t understand why we can’t automate these processes. Well, it turns out I was wrong. Accounting, it seems, is more art than science. Profit is misleading, and cold cash can tell many lies. “Financial Intelligence” provides a wide-opening perspective as to how some companies can make themselves profitable out of thin air, and how to structure your financial goals in a way that doesn’t guarantee long-term headaches.

Personal Development and Growth

We’ve reached a topic that most software engineers shy away from. That’s because we’re very analytical, and some of the topics covered by self-help books might not seem very sciency. But don’t be so quick to judge; some books in this category contain genuinely valuable information that has helped me make better career and life decisions.

As I mentioned in the introduction of this list, I often see brilliant software engineers that get stuck in their careers, even if they have excellent problem-solving skills and very high intelligence. The reasons for this are diverse, but they almost always fall in the “soft skills group”: not knowing how to work with others and when to compromise, not being able to communicate ideas effectively and when needed, not managing anxiety and self-doubt, and so on. I urge any software engineer to invest more into improving non-technical skills, as they are usually the bottleneck in having a long and fruitful career.

The Personal MBA
by Josh Kaufman

Yes, this book is twice on this list. That’s because the topics covered by it are so diverse, that it’s impossible to include this book into just one category. About one-third of the book is dedicated to managing others and improving oneself, so it’s a good introductory book on the topic of personal growth as well.

Why Has Nobody Told Me This Before?
by Dr Julie Smith

Burnout is a real issue affecting most software professionals. The kicker is that those in this situation don’t even realize they are burned out. But they do feel the effects. Low motivation, lack of energy, irritability - all of this can happen if you are overworked. But this is not the only mental health issue that affects professionals in our field. Self-doubt, anxiety, and intrapersonal conflict can all creep up as our work bandwidth is stretched to its limit. It’s important to recognize and treat these signs early on, as they can be severely debilitating, both to our professional careers and to our personal life. “Why Has Nobody Told Me This Before?” is a book about recognizing and managing various challenges related to mental-health that we face throughout our life.

The Workplace Guide to Time Management
by Phoebe Gavin

There are quite a few books in this section about time management and productivity, which I feel is warranted given that this is something most software engineers struggle with. It might not be too bad if you work in a larger company, but smaller firms tend to require you to get into that “last minute crunch” to fulfill a previous engagement for a release date. These problems usually stem from poor planning, but they can also be caused by a lack of productivity in the team.

“The Workplace Guide to Time Management” is a concise book that contains various tips for staying productive while at work, and ways to deal with unexpected events, such as a sudden leave by one of your colleagues or a last-minute cancellation.

Management Time: Who’s Got the Monkey?
by William Oncken Jr. and Donald L. Wass

If you’ve been around people managers, you’ve likely heard a few monkeys thrown around.

“I have too many monkeys on my back, Jim.”

“Start shooting some of your monkeys, Jim. You can’t feed them all.”

“Stop letting your monkeys die, Jim!to your goddam emails already!”

I don’t know who Jim is, but the metaphor of comparing tasks with monkeys originates from this short blog post. It’s an interesting take on how to handle multiple projects at once and how to delegate efficiently. It’s also short enough that everyone should read it if they’re struggling with time management.

A World Without Email
by Cal Newport

Efficient communication is a common issue among software professionals. I probably don’t need to tell you how time seems to drag if you’re stuck in a meeting that you shouldn’t even be in. A lot of time and money is wasted in the IT sector by requirements getting lost or misinterpreted by the time they reach the engineers. Meetings also do not provide the best ROI on time. The author of “A World Without Email” proposes a novel way to tackle communication for a project, through a method that combines the project management tools that we already use with direct customer communication.

The Toyota Way
by Jeffrey K. Liker

Toyota was at some point the most valuable car company in the world. It still is if you compare net earnings. Their cars are renowned for being reliable and generally well built. The company is also famous for pioneering the “lean manufacturing” process, and for driving continuous improvements. There’s a lot to learn from what some consider the most successful car manufacturer in the world, and most of these principles apply to software management as well.

Peopleware
by Tom DeMarco and Tim Lister

This book has been around for more than 35 years now, but it’s just as relevant now as it was when it first appeared. That's because the way people think and how they communicate changes rarely, unlike all the programming languages and frameworks that we’re used to. This classic book on software management explains why most issues in software development are caused by humans and not software. Even if you are not a people manager, “Peopleware” still provides valuable insights and advice on how to improve your collaboration with others.

[ comments ]