Some Books for Software-oriented Humans

This entry was posted in Uncategorized on by .

Here’s a list of (mostly) software-related books I love. None of them are a big secret – they’re all written by people that go to the same conferences you and I go to, published by the typical software book publishers, and sold in all popular bookstores (except for the Real Options comic book).

I’ve kept the descriptions short and sweet mostly for pragmatic reasons, but also because I’m not trying to convince you to read any of these. Rather I’m simply offering them up as a bookshelf that you might peruse to see what strikes your fancy. I consider all of these to be “the best” books or “my favorite” books. That is, if you were pull any of these books off of my bookshelf I would smile and say “nice choice.”

After forming the list I grouped them into categories that made sense given the selection of books. Inside each group I’ve listed them by the date they were published. When reading any book, technical texts in particular, it’s important to take note of when the book was written and published. Sometimes readers criticize a work for its ideas “being a bit out of date.” That might be an accurate criticism of a book published in the late 90’s, but certainly an unfair one! I’m also a big fan of reading several books about the same topic at once, and I like knowing where they each fit into the conversation.

I’ve included links to freely-available online versions if I know of them, otherwise the links will take you to Amazon. If you know of a freely-available legal copy of any of the books here, please email me with the information and I will update it on this page.


Non-software-specific books

I’m starting off the list with these two books because they’re the only two non-software-specific books on here. Pragmatic Thinking and Learning will help you digest this reading list (or any other), and Fearless Change will help spread new ideas you learn to your workpace.

Fearless Change: Patterns for Introducing New Ideas

Mary Lynn Manns

September 2004

What it’s about

Creating positive change within yourself, team, and workplace

Why I love it

You’d think that sharing awesome new ideas with people would be welcome and easy, but it turns out that a lot of people hate change. This book has helped me fight the good fight numerous times.

Pragmatic Thinking and Learning: Refactor Your Wetware

Andrew Hunt

November 2008

What it’s about

Strategies for learning, and maintaining a sharp mind

Why I love it

It gives some insight into cognitive theory, and is packed full of strategies on how to learn effectively by retaining information and creating learning curriculums. This continues the PragProg theme of being responsible for your career and personal growth. It serves as a great starting point for learning about learning.


Agile

Extreme Programming Pocket Guide

chromatic

June 2003

What it’s about

A small handbook of XP principles and practices

Why I love it

It’s a super handy reference for XP ideas and great for giving to people to give them a first exposure to XP

Extreme Programming Explained: Embrace Change (2nd Edition)

Kent Beck & Cynthia Andres

November 2004

What it’s about

Effective, sustainable, ethical software development

Why I love it

I spotted the first edition of this book when I was 15 and was immediately drawn to it because I though “Extreme Programming” sounded cool. It was way over my head at the time but it did introduce me to unit testing which I was able to apply right away to my little IRC client that I was building. Through the years I continue to go back to it and am always impressed with the focus on human interaction and behavior. It’s an important work on ethical software development.

Agile Principles, Patterns, and Practices in C#

Robert C. Martin

July 2006

What it’s about

Pragmatic agile development

Why I love it

It gives a good rundown of the different practices you might use in an agile software project, and goes into great detail on important design patterns and principles for building high-quality software systems. As far as I know this is the first published reference to SOLID.

Agile Software Development: The Cooperative Game (2nd Edition)

Alistair Cockburn

October 2006

What it’s about

An analysis of what makes software development tick, and how to arrive at an effective development model for your team and organization

Why I love it

This book taught me how to think about software development methodologies instead of simply how to follow one. This is another book that is focused squarely on the human element of software development, which is by far the most important aspect.


Business / management / less-technical

The Secrets of Consulting: A Guide to Giving and Getting Advice Successfully

Gerald M. Weinberg

January 1986

What it’s about

Getting paid to give advice

Why I love it

Consulting can be like trying to navigate around Cape Fear. This book serves as lighthouse, map, and tidetables…but it can’t change the weather.

The Mythical Man-Month: Essays on Software Engineering, Anniversary Edition (2nd Edition)

Fred Brooks

August 1995

What it’s about

The realities of managing software projects

Why I love it

People screw up software projects in a lot of ways, and this book covers nearly every one of those in some form or another. “Adding manpower to a late software project makes it later,” “no silver bullet,” and the temptation and tragedy of software rewrites are all in this book. It’s a set of essays that you can read one at a time.

Peopleware: Productive Projects and Teams

Tom DeMarco

February 1999

What it’s about

How humans interact on software projects

Why I love it

It covers serious topics in a light-hearted manner, and challenges a lot of the “established wisdom” about managing software projects.

Beyond Software Architecture: Creating and Sustaining Winning Solutions

Luke Hohmann

February 2003

What it’s about

Bridging the gap between business and technology

Why I love it

It turns out that running a software business requires way more expertise than just writing good code. This is basically a handbook on running a software company.

The Inmates Are Running the Asylum: Why High Tech Products Drive Us Crazy and How to Restore the Sanity

Alan Cooper

March 2004

What it’s about

Creating technology that humans love to use

Why I love it

This got me thinking about software from the user’s perspective, which I had never really done before. I consider this another important work on ethical software development.

Chris Matts Presents Real Options at Agile 2009

Chris Matts

2009

What it’s about

An economic approach to software development

Why I love it

This book opened my eyes to the reality that software projects are economic problems. It’s a quickly-read comic book that will change the way you think about planning software development.


OOP & Design Patterns

Design Patterns: Elements of Reusable Object-Oriented Software

Richard Helm, Erich Gamma, John Vlissides and Ralph Johnson (“Gang of Four”)

November 1994

What it’s about

Designing object-oriented software

Why I love it

I never thought about design before this book, I just wrote code and tried to make it work. The GOF book introduced me to the idea of object-oriented design and gave me plenty of ideas for writing understandable, maintainable code.

What Every Programmer Should Know About Object-Oriented Design

Meilir Page-Jones

August 1996

What it’s about

How OOP is supposed to work

Why I love it

Wrapping your code in objects doesn’t necessarily mean you’re “doing OO” and certainly doesn’t mean you’re doing it effectively or deriving the benefits of a well-implemented OO approach. I think this is the most important book when it comes to conceptualizing OO programming.

Analysis Patterns: Reusable Object Models

Martin Fowler

October 1996

What it’s about

Domain-specific patterns that show up in all types of applications

Why I love it

The world doesn’t need any more accounting software, yet on nearly every project I’ve worked on I’ve been tasked to build at least a little bit of accounting functionality. This book contains an in-depth analysis of accounting patterns (how exciting!), as well as patterns for measurements, planning, and contracts. If it sounds a bit dry it’s because it is, but it is still a great reference for working on these sorts of problems. Also with a bit of imagination you’ll start to see how these patterns appear all of your code even if it’s not in the same domain language as this book, and you can draw on it for inspiration. This book introduced me to the layered architecture.

Smalltalk Best Practice Patterns

Kent Beck

October 1996

What it’s about

How to write good code

Why I love it

It manages to strike a fine balance between telling me how to write code and how to think about writing code. Every pattern in this book presents an example of good code and explores what makes it good.

A Little Java, A Few Patterns

Matthias Felleisen and Daniel P. Friedman

December 1997

What it’s about

An approachable introduction to object-oriented programming and design patterns

Why I love it

It’s written by the same folks and in the same style as “The Little Schemer.” It introduces some of Java’s basic features, and covers object-oriented theory and design patterns in a fun, approachable manner.

Refactoring: Improving the Design of Existing Code

Martin Fowler

July 1999

What it’s about

How to safely take any bit of code and rework it so it makes sense to you

Why I love it

It’s one of the best-written books that I’ve read and has stood the test of time. I still refer to it when I have a design problem and am not quite sure what to do.

Object-Oriented Software Construction

Bertrand Meyer

March 2000

What it’s about

The nuts and bolts of writing robust applications in an object-oriented style

Why I love it

It convinced me that object-oriented systems can be every bit as rigorous and provably correct as functional systems. Half of SOLID is from this book.

Smalltalk, Objects, and Design

Chamond Liu

April 2000

What it’s about

An introduction to smalltalk that quickly moves onto object-oriented design principles

Why I love it

This book made smalltalk accessible to me and improved my thinking about object-oriented design in general to apply to other programming languages.

Streamlined Object Modeling: Patterns, Rules, and Implementation

Jill Nicola, Mark Mayfield, Mike Abney

October 2001

What it’s about

Organizing logic in an object-oriented software system

Why I love it

It completely changed the way I think about object-oriented design. I’ve used the patterns in this book on several projects, and the parts of code that use these patterns are by far my favorite to work with. It’s the most worn out book on my shelf.

Object Design: Roles, Responsibilities, and Collaborations

Rebecca Wirfs-Brock

November 2002

What it’s about

The fundamentals of object design

Why I love it

I think this is the first book I read on object design, and it really helped me start to understand the difference between wrapping code in objects and object-oriented programming. It provides a straightforward methodology for analyzing problems and breaking them down into OO solutions.

Domain-Driven Design: Tackling Complexity in the Heart of Software

Eric Evans

August 2003

What it’s about

Focusing on the business logic in software

Why I love it

The second most important lesson I’ve learned about software development is that software is a knowledge acquisition process (the most important is that it’s always all about people). This book started me on my journey towards understanding how we learn in software projects and what we do with that knowledge. It argues that understanding the business logic of software projects is so important that you should make every effort to keep those concerns separate from all other concerns. It covers how to have conversations with domain experts, analyze problems, and ultimately implement them in code. I’ve also given away several copies of this book, and it served as the basis of my Domain-Driven Rails talk at Aloha on Rails (video) and Domain-Driven Rails Redux at RailsConf 2010 (slides).

Object Thinking

David West

February 2004

What it’s about

Understanding a software system’s behavior and organizing responsibilities

Why I love it

At this point in life I’m better served by books that give me a new way of thinking about things rather than just telling me how to do something. This is that book, for OOP.

Refactoring to Patterns

Joshua Kerievsky

August 2004

What it’s about

Moving code towards and away from design patterns

Why I love it

I definitely became “patterns happy” when I read the gang of four book. This book helped me identify the patterns hidden in my code and make them explicit, rather than try to force design patterns on my code. It was a critical book in my understanding of evolutionary design.

Design Patterns Explained: A New Perspective on Object-Oriented Design (2nd Edition)

Alan Shalloway & James R. Trott

October 2004

What it’s about

Object-oriented design with a focus on design patterns

Why I love it

It taught me how to think about object-oriented design and design patterns, not just tell me what they are.

Implementation Patterns

Kent Beck

November 2007

What it’s about

How to think about and write good code

Why I love it

It’s the same idea as his Smalltalk Best Practice Patterns, only in Java and with an extra decade of experience

Design Patterns in Ruby

Russ Olsen

December 2007

What it’s about

Structuring Ruby code

Why I love it

It’s the first book I read that really focused on beauty as a desirable end goal when writing code.


Automated Testing / TDD

Test Driven Development: By Example

Kent Beck

November 2002

What it’s about

An introduction to TDD

Why I love it

This is the book that started it all. Whenever I learn a new language or test framework I go through the examples in this book.

Test-Driven Development: A Practical Guide

Dave Astels

July 2003

What it’s about

Using TDD to write real software

Why I love it

After I read TDD by example I wondered, “where do I go from here?” This book was the answer for me. It builds on Kent’s work and builds a working, useful application start to finish using TDD, with a focus on refactoring. It also introduced me to the idea of “programming by intention” which has served me well.

JUnit Recipes: Practical Methods for Programmer Testing

J B Rainsberger

July 2004

What it’s about

Practical considerations when writing automated programmer tests

Why I love it

The recipes in this book have one underlying theme: how to think about automated testing. Even if you skip over the huge section on J2EE, you’ll get your money’s worth from the chapter on testing design patterns and appendix of essays.

Every recipe is presented in a “Problem, Background, Recipe, Discussion” format, making it a very pragmatic, approchable book and another one of those books you can digest in chunks.

Working Effectively with Legacy Code

Michael Feathers

October 2004

What it’s about

How to confidently make changes to gnarly, untested codebases

Why I love it

Life sucks when you don’t have automated tests to back you up. Follow the strategies in this book and you’ll eventually turn a codebase you hate into something enjoyable to work on. Note: It’s hard work.

I’ve given away more copies of this book than any other. It inspired my Working Effectively with Legacy Rails Code talk at Scotland on Rails 2009 (video) that I expanded with BJ Clark at RailsConf 2009 (slides)

xUnit Test Patterns: Refactoring Test Code

Gerard Meszaros

May 2007

What it’s about

How to write and refactor your way to a clean test suite

Why I love it

I’ve worked on many software projects where the team was dedicated to refactoring and keeping their codebase clean, and the test suite was a horrific mess. I never understood why. Then this book came out and I realized that it filled a hole: there simply was no literature on what makes for clean test suites prior to this book. There are different forces at play in your test suite than your production code, so the way you keep it clean necessarily differs from time to time. If you’ve wondered how to write a particular test, you’ll find some good hints in this book.

Growing Object-Oriented Software, Guided by Tests

Steve Freeman & Nat Pryce

October 2009

What it’s about

How to use TDD to build a software system from the ground up and continually refine its design to incorporate new understanding and keep things simple

Why I love it

Earlier books showed you how to do TDD. This is the book that shows you how effective TDD helps you write good software.


General Programming

The Pragmatic Programmer: From Journeyman to Master

Andrew Hunt & Dave Thomas

October 1999

What it’s about

Crafting a career as a software developer

Why I love it

It introduced me to several important programming practices and served as a starting point for deeper research and explanation. It gave me practical ideas on how to be responsible for my growth as a programmer. To this day I think it is the most beautifully constructed, organized software-related book that I’ve read.

Code Complete: A Practical Handbook of Software Construction

Steve McConnell

July 2004

What it’s about

Constructing robust software applications

Why I love it

I call it “Object-Oriented Software Construction, Millenium Edition.” It’s not an OO book, but it’s in the same vein as OOSC in that it provides a detailed approach for constructing software that can withstand users and technology.

Programming Ruby: The Pragmatic Programmers’ Guide, Second Edition

Dave Thomas, Chad Fowler, Andy Hunt

October 2004

What it’s about

Our most favoritest programming language ever

Why I love it

This might be the best language-specific book I’ve ever read. I remember it being so approachable, and it got me excited about programming again. Nearly every page led me to yell “no way!” and go experiment. Had I not encountered this book, I may not have pursued a career as a programmer.

There’s a 1.9 edition that I’ve not read yet.

Ruby for Rails: Ruby Techniques for Rails Developers

David A. Black

May 2006

What it’s about

An in-depth look at Ruby’s powerful features, with a focus on how they’re used to implement Rails

Why I love it

This book really opened my eyes to what you can do with Ruby. I had dug into the Rails source code but found a lot of what looked to me like magic. Ruby for Rails explained the magic and inspired me to do some crazy stuff with Ruby.

Clean Code: A Handbook of Agile Software Craftsmanship

Robert C. Martin

August 2008

What it’s about

Developing the habit of writing the best code you’re capable of, and constantly raising the bar

Why I love it

This is a great “15 minutes a day” book. It’s basically a list of of tricks and rules of thumb that old people like Bob wish young people like me knew. You can literally open the book to any page, read for 15 minutes, and come away with something to use in your work that same day.

The Clean Coder: A Code of Conduct for Professional Programmers

Robert C. Martin

May 2011

What it’s about

Bob’s treatise on what it means to be a professional programmer

Why I love it

Whereas Clean Code is all about the nitty gritty details of writing and thinking about code, The Clean Coder takes you up 10,000 feet and advises you on how to approach your career and growth as a programmer.


Software Architecture

Patterns of Enterprise Application Architecture

Martin Fowler

November 2002

What it’s about

Architectural design patterns

Why I love it

Design patterns in day-to-day code is nice, but what about application architecture? The way you divide your app into business logic, infrastructure, and error-handling code has a huge impact on how robust and maintainable your software is. My favorite part of reading this book was noticing how many ideas in Rails’ architecture came from this book (and how other parts of Rails could be improved!)

Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions

Gregor Hohpe & Bobby Woolf

October 2003

What it’s about

How to connect large software systems in a loosely-coupled manner

Why I love it

If I’m looking to split an application into services, expose an API, or consume an API, I consult this book for ideas, and it delivers.

The Architecture Of Open Source Applications

Amy Brown & Greg Wilson

June 2011

What it’s about

This is an anthology of essays written by open source software authors about software packages that you know and love (or hate)

Why I love it

It provides a pretty in-depth look at a wide variety of open source projects, in which the authors of those projects tell you funny stories, discuss the historical context of the software, and present some of their major challenges and how they solved them. If you want to understand how productive programmers make pragmatic decisions to ship useful software, this is a great starting point.


Functional Programming

The Little Schemer – 4th Edition

Matthias Felleisen, Daniel P. Friedman and Duane Bibby

December 1995

What it’s about

Recursion

Why I love it

It’s written in an extremely pleasant socratic dialogue style and introduced me to scheme. It focuses on breaking down problems into recursive solutions which can yield extremely elegant results.

The Seasoned Schemer

Matthias Felleisen, Daniel P. Friedman and Duane Bibby

December 1995

What it’s about

Thinking about computation

Why I love it

It introduced me to important functional programming concepts as well as computation concepts in general that I’ve been able to apply in my work every day since I read it.

Structure and Interpretation of Computer Programs, Second Edition

Harold Abelson, Gerald Jay Sussman and Julie Sussman

August 1996

What it’s about

The theory and practice of computer science

Why I love it

This is one of the absolute classics, and working through it gave me a solid foundation for reasoning about computer programs. The chapter on implementing a scheme interpreter in scheme blew my mind and excited my imagination.

The Haskell School of Expression: Learning Functional Programming through Multimedia

Paul Hudak

February 2000

What it’s about

Solving programming problems using functional thinking

Why I love it

My favorite thing about this book is how the author takes multiple approaches when solving problems. That’s the way most good programmers I know work – they try out a few different things and pick the best one. It’s refreshing to see a book advocate that sort of work ethic.

Practical Common Lisp

Peter Seibel

April 2005

What it’s about

How to build useful programs using Common Lisp

Why I love it

It took me a while to wrap my head around some of the stuff in this book but after typing in every line of code and studying it I started to come to grips with Common Lisp and felt comfortable writing programs on my own with it. It also has a chapter on building a TDD framework, and you know I’m a sucker for that.

The Reasoned Schemer

Daniel P. Friedman

October 2005

What it’s about

Merging functional and logic programming

Why I love it

It introduced me to logic-based programming in the style that I loved about The Little Schemer and The Seasoned Schemer

Let Over Lambda

Doug Hoyte

April 2008

What it’s about

Hardcore Lisp programming

Why I love it

Section 1.1 is titled “Macros”

Land of Lisp: Learn to Program in Lisp, One Game at a Time!

Conrad Barski

November 2010

What it’s about

Having fun while learning Lisp

Why I love it

This is probably the most fun I’ve had reading a programming book, and it’s so deep. It starts you off with “so what are these parentheses anyway” and takes you all the way to writing web apps. Along the way you learn all about the features that make Lisp so powerful. Plus, cartoon aliens!

Learn You a Haskell for Great Good!: A Beginner’s Guide

Miran Lipovaca

April 2011

What it’s about

A crash course on functional programming using the purest functional programming language around

Why I love it

“A language that doesn’t affect the way you think about programming, is not worth knowing.” – Alan Perlis

I enjoyed learning about Haskell but it had always been sort of a tough nut for me to crack. This book made it dead easy to start writing simple programs in Haskell explore what makes it such a unique language.


Scaling

The Art of Capacity Planning: Scaling Web Resources

John Allspaw

September 2008

What it’s about

Scaling web software, by the guy who kept Flickr.com running while transferring everything over to Yahoo’s datacenters

Why I love it

It’s the nuts and bolts of figuring out how much scale you’ll need to handle and how to actually handle it. Even if you don’t work on something the size of Facebook (cause let’s be real here) there’s a lot of knowledge you can apply to the web app you’re working on. One of the most important points is how to make sure that you plan for the load you’ll actually have and not to waste time building added complexity to handle load you’ll never have.

The Art of Scalability: Scalable Web Architecture, Processes, and Organizations for the Modern Enterprise

Martin Abbott & Michael Fisher

December 2009

What it’s about

Scaling people, process, and technology

Why I love it

It’s a higher level book that points out that even the best technology in the world can’t save an organization from itself if they don’t figure out how to manage people properly. In that sense it’s 2/3 organizational scaling and 1/3 technical scaling.

Scalability Rules: 50 Principles for Scaling Web Sites

Martin Abbott & Michael Fisher

May 2011

What it’s about

Everything you need to consider when building web applications with scalability in mind

Why I love it

Every application has different forces acting on it that help or hinder the scalability. This set of “rules” teaches you how to uncover those forces and deal with them. It’s not just about implementing for scalability, but also covers how to plan your development process to account for discovering scaling requirements, and what to do once you’ve actually shipped the thing.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>