Recommended reading list

I've found lots of great books relevant to our profession as software developers. A lot of them are about timeless principles and ideas, others are about particularly useful technologies, and others deal with the human side of the profession.

Every book listed in those pages has helped my career enormously, and I hope some of them will also be useful to you.

Machine Learning & Data

These books are centered on techniques for extracting insights from data, generation of predictive (and other types) of models and the overall philosophy of working learning machines.

Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython

Python for Data Analysis has become the de-facto introductory book for the basic tools needed to do data analysis/science with Python. The book includes everything you need to know to start manipulating, transforming and plotting your data.

Even if your main interest is in machine learning, data cleaning is still the most time-consuming task in most projects, so solid foundations in data manipulation will definitely come in handy. It's a great book to read cover-to-cover or keep as reference.

Get the book!

Grokking Deep Learning

Grokking deep learning is, in my opinion, one of the best possible introductions to the topic. What I really like about this book is that it explains the topic in a casual and friendly way, and it's full of practical code examples.

The book builds on the very fundamentals of neural networks, and slowly expands into multi-layered network architectures. The last chapters are dedicated to specific applications of neural networks (Image/Text processing) and the construction of your own framework.

When you are done with this book you can easily move to more 'mathy' DL books.

Get the book!

Deep Learning (Adaptive Computation and Machine Learning series)

The Goodfellow&all book has become the go-to textbook for learning about deep learning in more... depth.

It's a very complete introduction to the topic, geared towards researchers and people who want to expand the state of the art of this field. The book also gives you an introduction to the mathematical and conceptual tools you need to perform research on deep learning, something I believe is important for the advanced practitioner.

It's an academic textbook, but if you want to take your knowledge to the next level this is a great place to start.

Get the book!

Data Science for Business: What You Need to Know about Data Mining and Data-Analytic Thinking

Data science for business is one of the best introductions to data science and machine learning out there. It exposes the most important ideas and processes used when creating data solutions in a practical context.

The book offers enough theoretical background to understand all the concepts, but doesn't go into unnecessary detail unless needed. The main idea of the book is teaching you how to use all these ideas to solve real problems.

It's a great book to read from cover-to-cover, and a useful reference to check when you need to refresh concepts. Definitely a great addition to your personal professional library.

Get the book!

The MIT Essential Knowledge series books.

The MIT essential knowledge series has books on a variety of topics, ranging from neuroplasticity to robotics. The main idea behind the series is to offer simple explanations to complex topics without sacrificing depth.

An extra plus is that usually the books in the series are very accessible, and can be purchased for very little money. Of special interest are the books centered on machine learning, data science and deep learning. Together, they offer a very good introduction for the aspiring data scientist, and will give you a good high-level introduction to the field.

Get the Data science book!

Get the Machine Learning book!

Get the Deep Learning book!

Software Design & Architecture

These books cover topics ranging from high-level architecture of software systems to detailed design of clean and readable code.

Clean Architecture, by Robert C. Martin (Uncle Bob)

I really enjoy Uncle Bob's books. I read Clean Code years ago and it had a huge impact on the way I write code. Clean Architecture had the same impact on the way I think about software modules and the best way to architecture a solution.

The chapters (34 chapters in total) are short and contain tightly packaged advice on several architecture related topics. I especially recommend the section on S.O.L.I.D principles and boundary drawing, as I believe these are the ones with the highest potential to improve your design skills.

You can read the book cover to cover or keep it as a reference, as every chapter is useful enough to be read in isolation. It's a book that you can finish reading relatively fast and get immediate benefits, and at the same time serve as a reference to consult in the future.

Some cool things you will learn from this book:

  • What is software architecture, and why it's important.
  • What are S.O.L.I.D principles, and when to use them.
  • How cohesion and coupling affect your code's ability to adapt to changes.
  • What are architectural boundaries and where to draw them.
  • Why databases, frameworks and the web are just design details.
Get the book!

Practical Object-Oriented Design: An Agile Primer Using Ruby, by Sandi Metz

This is, in my opinion, one of the best books on object-oriented software design ever made. I know that having the word 'Ruby' on the cover might push away a lot of people, but you don't need to be a Rubyist to benefit from reading this book.

Chapters are concise and very practical, full of code examples. There are well-thought explanations for why things should be done in particular ways. Usually resorting to principles, and then to practical examples that demonstrate the consequences of poorly-designed solutions, all before showing the right way of doing things.

If you work with object-oriented languages, this book is a must-read. If you work with dynamically-typed OO languages Python, Ruby or JavaScript, there's even better reason to read it.

Some cool things you will learn from this book:

  • Why software design is important, and what problems it solves.
  • How to design and create classes with a single responsibility.
  • How to control the direction of dependencies between modules.
  • How to create well-defined and flexible interfaces.
  • What is a duck type, and how it helps you define interfaces.
  • The importance of inheritance and composition.
  • How to design your code to make testing an easier task.
Get the book!

Code Complete - 2nd edition, by Steve McConnell

Code complete is a bit old, but it's still one of the most complete and relevant works on code quality and craftsmanship available.

It starts by exploring different metaphors on the development of software itself, and after deciding for the most convincing one (construction), starts to offer advice about how to design and program your solutions.

The book is huge, and incredibly complete. It deals with the quality of code at an incredible level of detail(how to structure loops, which directives to use, how to name variables, how to perform integration and documentation).

Get this book and devour it, several times. I can guarantee that the quality of your craft will improve considerably after immersing yourself in its content.

Some cool things you will learn from this book:

  • What a software developer and a builder have in common.
  • How to create high-quality routines and methods.
  • How to craft proper conditionals and loops.
  • How to use table-driven methods.
  • Fundamental and unusual data types.
  • How to use defensive programming to your code safer.
  • How to manage the construction of a software project in a controlled way.
Get the book!

Clean Code, by Robert C. Martin (Uncle Bob)

Yes, another Uncle Bob book. This one doesn't need an introduction, as it has become a must-read for every software developer in modern days.

It really is that good, I personally enjoy Martin's style, but the contents themselves are more than enough to consider working through this book. This is a very important thing: for getting the biggest benefits, you will need to sit down to do the heavy lifting.

Skimming through the book might teach one or two interesting things, but to internalize the important lessons, you'll need to solve the exercises. It won't take that long, and I ensure you that is totally worth it.

Clean code is a must-read. If you are not familiar with this book yet, make some time for it and get a copy

Some cool things you will learn from this book:

  • How to properly name your software entities.
  • How to create good quality and easy to understand functions.
  • How to write good comments, and avoid bad ones.
  • How to format your code for making it easier to read and navigate.
  • How to test your code effectively and handle errors the right way.
  • How to use concurrency in a safe way, and how to test threaded code.
Get the book!

Domain-Driven Design, by Eric Evans

Domain-Driven design is an important book because it focuses on one of the most important engineering aspects of software development: Managing complexity by creating models especially tailored for the problems we are trying to solve.

Evans does a great job at explaining all the most imprtant concepts and offering lots of practical examples and solutions to the most common design problems It's a great tool that will help you tackle the most complex design poblems of your career.

Get the book!

Soft Skills & Career

Books about career, big-picture view of the software engineer landscape and other useful skills that we often neglect.

Pragmatic Thinking and Learning: Refactor Your Wetware

This book was written by Andy Hunt, one of the co-writers of The Pragmatic Programmer.

It's a really cool collection of ideas and techniques that help you understand how your brain works and how to help it think and learn better. I wrote a series centered around this book, so if you aren't sure if it's the right book for you go and take a look!

Get the book!

The Mythical Man-Month, by Fred Brooks

This classic is a must-read for every single person working in the technology industry.

In this book Fred Brook shares a series of essays on the nature of the software (and technology) development process. It puts together decades of wisdom and lessons learned the hard way, so that you don't have to make the same mistakes.

The surprising thing is that most of the pitfalls Brooks warns us about are still common in the industry. Gain this knowledge and find ways to protect yourself (and your team) from falling behind schedule and building the wrong thing.

Some important lessons you will learn from this book:

  • Why hiring more engineers when the project is late makes things even worse.
  • How to achieve conceptual integrity in your software projects.
  • Why 9 women can't make a baby in 1 month, and why this is important for software development.
  • Why there is no silver bullet in software development, and what to do about it.
  • How to avoid death marches and total burnouts.
Get the book!

How to Win Friends and Influence People, by Dale Carnegie

We often think software engineering is about computers. We are terribly wrong, the main actor in our profession is the delightfully complex human being. Dale Carnegie's classic is still as relevant as the day it was released, we human beings don't change that much after all.

The title of this book is a bit misleading, it's not about making friends or influencing people per se. It's more like a framework for communicating effectively with other people. It's short, useful and really good (re-read-it-every-year good), so if there's a book in this list I'd urge you to get, it's this one for sure.

Some cool things you will learn from this book:

  • How to make it easier for people to like you.
  • How to make a good first impression.
  • Why arguments are pointless, and what to do about them.
  • How to become a better conversationalist.
  • How to properly give feedback.
Get the book!

Soft Skills: The software developer's life manual, by John Sonmez

I like Manning, and I like the stuff John Sonmez writes (you can check his blog here), so it was no surprise that I ended up enjoying this book a lot.

It covers a lot of topics, from learning methodologies to finances, it even has a chapter on the romantic side of things. I think a title like 'Swiss army knife of the software engineering career' would be more fitting for this book. It's a very enjoyable and light read, and it's full of good pieces of advice you might find useful.

Some cool things you will learn from this book:

  • How to pass a software development interview.
  • Why specialization is important, and how to choose your niche.
  • How to be professional in your day-to-day job.
  • How to market yourself, and why it's important.
  • Effective techniques for learning new technologies.
  • Productivity tips to make the most out of your time and avoid burnout.
  • Why failure is important, and how to deal with it.
Get the book!

The Passionate Programmer, by Chad Fowler

The Passionate Programmer is one of my all-time favorite books about career in software development. It's a collection of 53 career tips, in topics like productivity, learning new skills and marketing yourself (a really important career skill most of us are painfully bad at).

What I like the most about the book is the practical approach for every piece of advice: every single one contains actionable items that you can start applying immediately. Many of the important lessons I share in the 'Advice for new developers, or Things I wish I had known when I started programming' series comes from this book. Give it a try, it's a must-have for every developer who's serious about career growth.

Some cool things you will learn from this book:

  • How to choose a market to specialize in, and why it's important.
  • How to find a mentor, or how to be a mentor yourself.
  • How to make your contributions visible to management.
  • Why maintenance work is something we should learn to love.
  • How to build your own brand.
  • How to maintain your edge and keep ahead of your competitors.
Get the book!

The Pragmatic Programmer, by Andrew Hunt & David Thomas

Another great classic. The pragmatic programmer's main goal is to make you think about software development with a craftsman mindset. It explains why we should care about the craft itself, and how to improve the quality of our work.

The book is organized in small sections, each less than 10 pages. It explores different ways of improving the way we think about software development, and providing guidance on how to achieve a good quality product.

Some cool things you will learn from this book:

  • Why software development is a craft, and how to be a good craftsman.
  • Pratical advice for crafting maintainable code.
  • What basic tools you need to master to become a productive developer.
  • Techniques for creating efficient solutions.
  • What to do before starting a project to maximize the chances of success.
  • Why you should apply ruthless testing.
Get the book!

Web Development & Computer Networks

Books about software development, computer networks, distributed systems and other topics related to building modern internet applications.

Designing Data-Intensive Applications, by Martin Kleppmann

This is THE BOOK!

Fine, maybe I get a bit excited when I talk about this one, but it might be my favorite book on building web applications.

There are a lot of very important concepts I didn't really understand until I read this book's explanations on them. Partitioning and replication, database transactions, eventual consistency of data, encoding formats and batch/stream processing are all explained in a masterful way.

If you care about building quality systems at scale, get a copy of this book, it's a must-read.

Some cool things you will learn from this book:

  • What makes a reliable, maintainable and scalable application, and why these are desirable characteristics of a system.
  • Different data models, query languages and encoding formats.
  • How replication and partitioning help you provide resilient and fast ways of serving your data around the world.
  • What are database transactions and what role they play in data consistency.
  • Two important data processing system types: batch processing and stream processing.
Get the book!

Ruby on Rails Tutorial, by Michael Hartl

ROR tutorial is a complete introduction to full-stack web development. You'll build 3 applications using the ROR framework.

The approach of the book is in building everything from scratch and explaining all the little details, even the obvious ones. If you are totally new to web development and know nothing about HTML, CSS, Javascript or even Ruby, this book will teach you everything you need to know.

I believe this is one of the best introductions to web development out there, and if you are interested in breaking in this area, this book is an excellent way of doing it.

Some cool things you will learn from this book:

  • Fundamental skills in HTML, CSS and web development.
  • How to build a complete full-stack application from scratch using a widely-used web framework.
  • How to implement an authentication and authorization system from scratch.
  • The web-development workflow and how to add features in a manageable way.
  • How to use a version control system to protect your development process.
Get the book!

Getting MEAN with Mongo, Express, Angular, and Node, by Holmes & Herber

Javascript-based stacks are incredibly popular nowadays. You can build a complete full-stack application using only JS tools, and there are lots of job opportunities for people who can comfortably work with this type of stack.

Getting MEAN teaches you everything you need to know for building full-stack web applications using Javascript, while also using the popular Mongo database. This book covers both frontend and backend in detailed way, and is an excellent choice if you want to learn how to build complete applications using modern technologies.

Some cool things you will learn from this book:

  • How to build complete full-stack applications using only Javascript.
  • How to use Node and Express for building the server-side of your apps.
  • How to create SPAs(Single page applications) using the popular Angular framework.
  • How to use a NoSQL database to store your app's data.
  • The advantages and disadvantages of using JS as your language of choice for building your web applications.
Get the book!

Programming Languages

This list features my favorite books on specific programming languages. Most of them are about the task of learning the language itself, and serve as excellent references to keep in your bookshelf after finished reading them.

The 'You don't know JS' series, by Kyle Simpson

JavaScript is an extremely popular programming language, known especially for being the lingua franca of front-end web development. In the last years, with the advent of NodeJS and other technologies it started to gain popularity in server-side, desktop and mobile development.

The language is also known for having a lot of interesting (read confusing) design choices and lots of corner cases. Writing good JS requires you to be aware of many of the language's quirks. The 'You don't know JS' series is one of the few resources that explains the deeper technical aspects of the language in a clear and friendly way.

If you are interested in web development or just want to step-up your JS skills I recommend you take a look at this series. It's very well written and complete, and the explanations of closures, prototype-based inheritance and scope are the best out there in my opinion.

Get Book 1: Up & Going

Get Book 2: Scope & Closures

Get Book 3: this & Object Prototypes

Get Book 4: Types & Grammar

Get Book 5: Async & Performance

Get Book 6: ES6 & Beyond

Get A Bundle With All Books

Python Crash Course, by Eric Matthes

Python is an extremely popular programming language with applications in areas as diverse as web development and machine learning.

Nowadays, learning how to write in Python is an extremely valuable skill. No matter if your goal is building simple command-line tools or big backend services, Python offers enough power to help you build both.

PCC is a cool introduction to the language, it's very practical in nature (the book has complete projects you can add to your portfolio) and doesn't waste any time in nonsense. If you are trying to break into programming, or just want to add Python to your tool-belt, I recommend checking out this book.

Some cool things you will learn from this book:

  • The fundamental features of the Python programming language.
  • How to use classes to model real world entities in an object oriented way.
  • How to use exception and testing techniques to improve the reliability of your python code.
  • How to build a complete space invaders game using Python.
  • How to use Python for data visualization and web development (through projects).
Get the book!

Hacking: The Art of Exploitation, by Jon Erickson

What's a book about hacking doing in this list?

Well, it just happens to be one of the best introductions to the C programming language out there. Chapter 2 is practical an in-depth introduction to the C programming language, you will analyze the most important features of the language in step-by-step examples, using the help of a debugger.

The book does an excellent job at explaining how programming works at a fundamental level, and its treatment of memory layout and redirection is truly excellent. It's this book how I finally understood how pointers work (it dedicates a considerable part of chapter 2 to this topic).

Despite being a bit dated, if you are serious about understanding C, you should get a copy of this book. There's also the bonus part of teaching you how to hack stuff, but that's an added plus.

Some cool things you will learn from this book:

  • The basic constructs of the C programming language, and how to use it to build programs.
  • How to use a debugger to analyze your programs after compilation, a powerful tool for understanding what's happening 'behind the scenes'.
  • Memory segments, and how C distributes your data among them.
  • Probably the best explanation on pointers out there.
  • If you make it past chapter 2, you will learn how to use C to hack software systems, cool topic.
Get the book!

The Well-Grounded Rubyist, by Black & Leo

Another awesome book from Manning, this type about the Ruby programming language.

This book is not just a reference for the Ruby language, it is full of examples that teach you how to use this language's flexible features to craft elegant solutions. It covers all the important topics, from the basics up to metaprogramming and FP.

If you want to learn Ruby, this is the only book you will ever need, and it's a valuable reference to keep in your bookshelf for future projects.

Some cool things you will learn from this book:

  • The basics of the Ruby programming language, with up-to-date examples and explanations.
  • How to use modules to create... modular applications.
  • How object individuation and scope work in Ruby, and other important internals of the language.
  • How to manage concurrency using threads.
  • How to use the metaprogramming features of the language to create flexible software entities.
  • An introduction to Ruby's functional programming features.
Get the book!

Entertainment & Cool Geeky stuff

These books are not strictly related to building better software or creating a career in software development, but you can still learn some pretty neat things and have lots of fun reading them.

The 'Magic 2.0' series, by Scott Meyer

You might know Scott Meyer from his Basic Instruction comic series. If you don't, go and check it,  it's hilarious.

The Magic 2.0 series is about a young programmer who one day discover a file in a mysterious server. By modifying the entries in the file he can alter certain aspects of reality around him. Using his programming knowledge, he creates macros to 'perform magic'. After having problems with the authorities he flees back in time to medieval England, just to discover he is not the only person who has access to the file.

The series is incredibly geeky and funny, often laugh-out-loud funny. If you build software for a living, I'm sure you will enjoy Meyer's geeky humor.

Get Book 1: Off to Be The Wizard

Get Book 2: Spell or High Water

Get Book 3: An Unwelcome Quest

Get Book 4: Fight and Flight

Get Book 5: Out of Spite, Out of Mind

What If, by Randall Munroe

You know XKCD, it's an iconic part of developer culture.

In 'What If?', Munroe uses a rigorous scientific approach to answer those questions we've always wanted to ask, but never had the nerve to. Things like:

  • From what height would you need to drop a steak for it to be cooked when it hit the ground?
  • If someone's DNA suddenly vanished, how long would that person last?
  • If every person on Earth aimed a laser pointer at the Moon at the same time, would it change color?
  • What would happen if you tried to hit a baseball pitched at 90% the speed of light?
  • How many Lego bricks would it take to build a bridge capable of carrying traffic from London to New York? Have that many Lego bricks been manufactured?* How to avoid death marches and total burnouts.

And many others. It's not only fun, you'll also learn some truly bizarre facts about reality.

Get the book!

Thing Explainer, by Randall Munroe

Also by the creator of XKCD.

The book uses simple language and brilliantly made diagrams to explain some of the most interesting topics. It offers clear explanations on the internals of cells, the international space station, our solar system, helicopters and many others.

It's a beautiful collection of elegant explanations, and a perfect book for inquisitive folks who have always wondered how things work. You will learn about a lot of very interesting things and have a lot of fun reading it!

Get the book!

Disclaimer on the book links:

The books in the reading lists and the 'what to do next' sections include links to Amazon. These links have a little referral tag with the blog's code.

If you decide to purchase one of the books using the link, I will get a very small percentage of the purchase, and you will support this blog's existence. I think this is cool because of 3 things:

  • You can find good books with honest recommendations. Every single entry in the reading lists is a book I purchased, read and enjoyed.
  • We can support the authors of the books. Writting for the software industry is not a very profitable activity. By referencing books I consider good, I might help the authors so that they can continue writing good material.
  • It helps me cover the costs of keeping the blog online.

If you find a book that you like and decide to purchase it using the link, you have my gratitude. This will support the blog and help me write more content.

Thank you very much for reading!

Data Science for Business: What You Need to Know about Data Mining and Data-Analytic Thinking