There are plenty of articles on the Internet claiming to list must-read programming books, but they all recommend the same old books. Finding good, up-to-date resources has become really difficult.

To make the job easier for you, we’ve listed some of the best programming books, written specifically to give you a solid foundation in all the areas that matter for becoming a better programmer. If you read even one of them, you’ll be a step ahead of almost everyone around you.

Don’t Make Me Think, Revisited

  • Author: Steve Krug.
  • Release year: 2013
  • Suitable for: beginners

The author makes the subject of web usability genuinely interesting. Along with an easy writing style, he adds wit to hold your attention from cover to cover.

The book gets you thinking about usability and accessibility. All the chapters are logical and concise. There are plenty of examples that explain the author’s point of view and show how different people involved in web projects can contribute to a site’s usability.

In my opinion, everyone should read this book—designers should read it to learn the golden rules before they get started, programmers should read it to understand the technical requirements for implementing usability, and project managers should read it to get their brains thinking. And to see the world in a new way.

Peopleware: Productive Projects and Teams

  • Authors: Tom DeMarco and Tim Lister.
  • Release year: 2013 (third edition)
  • Suitable for: beginners

Written by two software consultants, Peopleware is a well-known book about software management. It emphasizes the fact that most problems in software development are human, not technical.

The book explores conflicts between the perspective of individual work, corporate ideology, and workspace theory. Most topics are presented as principles, backed up by authoritative sources or a specific story.

Anyone who works should read it (whether they’re a manager or a subordinate), because it gives a very concise and direct account of how to build successful and effective teams.

Working Effectively with Legacy Code

  • Author: Michael Feathers
  • Release date: 2004.
  • Suitable for: intermediate programmers

The book is 18 years old. Nevertheless, its content hasn’t aged. It includes a catalog of 24 dependency-breaking techniques that let you safely make changes to your program.

The book teaches you how to work with large, untested legacy programs, how to pinpoint where code changes are needed, and how to work with applications that don’t have a suitable structure.

You’ll find plenty of techniques that can be applied in any language or on any platform, including C, C++, C#, and Java. Some techniques may seem outdated, but you never know when you might need them.

Make Your Own Neural Network

  • Author: Tariq Rashid
  • Release year: 2016
  • Suitable for: beginners and intermediate programmers

What do you usually expect when you buy a book about artificial intelligence? Definitions on every page? Theorems and proofs? Lots of math? Numerous dry paragraphs? Well, this book is different. You’ll get exactly what you need to understand the subject and put it into practice—no more, no less.

It will teach you how to build your own neural network (in Python) and train it to recognize handwritten numbers. The book is divided into three sections:

Section 1: introduces the mathematical concepts behind neural networks.

Section 2: covers the basics of the Python programming language and how to build a neural network that can learn to recognize handwritten numbers.

Section 3: explores methods for improving the neural network’s performance and testing it on your own handwriting.

For people who are completely unfamiliar with how neural networks work, this book can be a wonderful revelation and lay the groundwork for future learning.

Code: The Hidden Language of Computer Hardware & Software

  • Author: Charles Petzold
  • Release year: 2000
  • Suitable for: beginners and intermediate programmers

This book opens up the world of computing in the form of a short, linear narrative. Starting with older technologies such as Morse code, Braille, and Boolean logic, the author gradually catches up to the modern era, discussing HTTP and the WWW.

He then explains later developments, including topics such as ASCII, operating systems, and floating-point math. To keep the chapters interesting, he also makes sparing use of metaphors and analogies.

Whatever your technical skills, this book will charm you and may even awaken the technophile in you.

The C++ Programming Language

  • Author: Bjarne Stroustrup
  • Release year: 2000
  • Suitable for: intermediate to expert

Written by the father of C++ himself, this is the world’s most popular and widely read book on C++. It provides complete and authoritative coverage of the C++ language, its core design techniques, and the standard library.

This 1300-page book can be divided into three sections. The first section (chapters 2-5) is a fast-paced course in C++. The second section (chapters 6-29) is a tutorial on the language’s structure. The last section (chapters 30–44) explores the standard library, which is just as important and integral a part of C++ as the language itself.

If you want to learn the language quickly, this isn’t for you. However, if your goal is to become a master (which takes a lot of time and effort), this book is for you. It’s a long and highly technical read that examines every aspect of the language in great detail, from the basics to the esoteric.

Introduction to Algorithms

  • Authors: Thomas Cormen, Clifford Stein, Ronald Rivest, Charles Leiserson
  • Release year: 2001
  • Suitable for: beginners and intermediate programmers

This book describes a broad range of algorithms in detail, from classic algorithms in graph theory to specialized algorithms in number theory, computational geometry, and string matching.

Everything is explained in very simple language without sacrificing depth of coverage or mathematical rigor. But don’t expect a plain algorithm cookbook that you can copy or download.

If you’re a beginner, you’ll need to read every chapter carefully. The exercises at the end of each chapter will help you better understand the concept you’ve just read about. Just put enough person-hours into this textbook, and you’ll learn specific approaches for determining just how hard you’re making the computer work.

Effective Java

  • Author: Joshua Bloch.
  • Release year: 2017
  • Suitable for: beginners to experts

Since its first edition (published in 2001), Effective Java has changed considerably. The author updated the title to take advantage of the new version of Java and its library features.

As in previous editions, each chapter contains several sections (each written as a straightforward, standalone essay that reveals the intricacies of the Java platform) and updated code snippets.

The book covers almost all of Java’s important features, as well as good and bad practices in some of the libraries we use today. Since remembering everything is difficult (even for experienced programmers), I’d recommend keeping it as a reference while you code.

Fluent Python

  • Author: Luciano Ramalho
  • Release year: 2015
  • Suitable for: experts

It’s always nice to follow authors who really understand a programming language and have a knack for teaching. Luciano Ramalho is one of those authors. He writes about Python with passion, but doesn’t hide its pitfalls and shortcomings.

While some chapters seem very straightforward, others cover quirks and complexities, getting to the heart of the language. It covers Python’s data model, data structures, functions as objects, control flow, and metaprogramming.

Overall, this 700-page book will introduce you to Python’s key features and libraries and teach you how to make your code faster, shorter, and more readable.

Code Complete

  • Author: Steve McConnell
  • Release year: 2014 (second edition)
  • Suitable for: beginners to experts

This classic book has been fully updated and expanded with hundreds of new code examples and best practices that illustrate the science and art of software development.

The book is divided into seven parts: the first six lay the groundwork for writing quality programs, and cover variables, statements, and code improvements. The seventh part is devoted to software craftsmanship (character, style, layout, and documentation).

In my opinion, every programmer with 2-3 years of experience should read this book. Although it doesn’t apply to every software development process and may be outdated in places, it certainly conveys ideas that all programmers should understand and adopt.

7. Deep Learning

  • Authors: Ian Goodfellow, Yoshua Bengio, and Aaron Courville.
  • Release year: 2016
  • Suitable for: experts

It provides a huge amount of detail on neural networks and their deep versions. The authors have organized complex topics in a way that presents the ideas smoothly.

The book is divided into three sections:

150 pages of background material: cover important concepts in numerical computation, probability theory, information theory, and machine learning.

300 pages of applications: this is the main part, which includes deep feedforward networks, sequence modeling, convolutional networks, and optimization algorithms. It explores various applications in natural language processing, bioinformatics, and video games.

200 pages of research topics: cover theoretical topics such as representation learning, Monte Carlo methods, and deep generative models.

This book is intended for people who are already familiar with the concept of deep learning and want to study its theoretical foundations. It is also very good for Ph.D. students and researchers whose work is related to artificial intelligence.

Artificial Intelligence: A Modern Approach

  • Authors: Stuart Russell, Peter Norvig
  • Release year: 2015
  • Suitable for: beginners and intermediate programmers

This book is not only a wonderful introduction to artificial intelligence, but also a survey course in technical writing. It doesn’t assume a great deal of knowledge beyond some familiarity with mathematical notation and a basic understanding of algorithmic efficiency or computational complexity.

The book contains everything you might want to know about artificial intelligence. Every concept is explained very well and packed with examples to help you understand what lies behind it.

It also covers practical implications in the same field, such as speech recognition, machine translation, robotics, and much more. Read it, reread it, and treat it with care—you'll reap the benefits for a long time to come.

Clean Code: A Handbook of Agile Software Craftsmanship

  • Author: Robert Cecil Martin.
  • Release date: 2007.
  • Suitable for: beginners and intermediate programmers

The author of Clean Code is best known for developing numerous software design principles. In this book, he presents the best agile practices for cleaning up code on the fly.

It contains lots of code snippets, and you have to figure out what is wrong with them and what is right about the code. The book teaches you what bad code looks like and how it should have been written in the first place.

There are three sections. The first introduces patterns, principles, and practices for writing clean code. The second contains a number of different case studies. The third contains a list of heuristics gathered while studying specific cases.

Although most of the examples are geared toward Java, anyone interested in creating higher-quality code can read this book, whether they're a software developer, team lead, systems analyst, or project manager.

Cracking the Coding Interview

  • Author: Gayle Laakmann McDowell.
  • Year published: 2011
  • Suitable for: beginners and intermediate programmers

Cracking the Coding Interview is the most comprehensive and detailed guide to passing programming or software development interviews.

It starts by explaining the “why” behind technical interviews, how to practice for nontechnical questions, how to analyze and break down problems, how to write efficient code, and how to respond to acceptance and rejection.

Then you'll find more than 180 programming questions and answers, which make up most of the book. Each section begins with a discussion of the basic knowledge and approaches for solving similar problems, then delves into specific techniques for solving them. The book also includes a link where you can download, compile, and analyze the solutions yourself.

Grokking Algorithms

  • Author: Aditya Bhargava
  • Release year: 2015
  • Suitable for: intermediate and expert readers

This is a disarmingly accessible look at a core topic in computer science. The book will teach you how to apply algorithms to real-world problems you encounter in your everyday life as a programmer.

It all starts with simple tasks like searching and sorting. As your thinking skills develop, you'll tackle more complex topics like hashing, graphs, greedy algorithms, MapReduce, P and NP, data compression, and much more. Everything is explained with illustrations and visual examples.

Whether you're developing mobile apps, video games, or business tools, you'll learn algorithmic problem-solving techniques that were once beyond your grasp. For example, you'll be able to understand how data compression works using Huffman coding, write a spell-checking program using graph algorithms, and much more.