As you know, I am on an object-oriented programming (OOP) quest. Most programming languages, and all of the most popular ones, provide object-oriented features. The move to objects in mainstream languages (Smalltalk has never been mainstream) started with C++ (1983) and picked up steam when Java was introduced in 1995. Once Microsoft joined in with C# and the .NET Framework in 2001, the migration was complete. These days, making use of the many timesaving frameworks and development tools available requires knowing OOP—it is unavoidable.
Now, one would think that the ubiquity of OOP would make materials for learning OOP easy to come by – well, yes and no. I decided to use C# as my main OOP language (for reasons mentioned in previous posts). After going through three C# books, I found that I understood concepts such as inheritance, polymorphism, and encapsulation, but it was not obvious how to design OO software. In addition, when reading discussions about OOP, I saw references to MVC, inversion of control, and other concepts I had never heard of–despite having read the C# books. This was troubling, and having been away from programming for seven years, I had no idea where to go for more information. Searching Google and Wikipedia, I eventually found programming sites where I could ask questions. This solved only part of the problem as I quickly learned that asking a question about inversion of control on a site for professional developers resulted in an answer that was over my head.
Luckily, learning OOP was a common topic on many forums. Seemingly, many programmers were having difficulties mastering objected-oriented concepts. Interestingly, not every developer considered OOP a good thing, or even useful for that matter. Often I saw OOP denounced as just more “cool-kid” nonsense. Reading forum debates on OOP, I came to realize that doing OOP well was not just a little bit different from procedural programming–it was vastly different–and required a new approach to creating software. Obviously, I am not an expert, but OOP seems to require far more upfront consideration of software architecture and execution behavior than does procedural programming. It became apparent that the books I had been using focused on teaching syntax, data structures, and algorithms. These are important topics, but I needed help with architecture and design.
Eventually, I came across a forum thread about design patterns that recommended Head First Design Patterns as an accessible introduction. This is the perfect book for someone with programming experience, but no knowledge of the topic–exactly what I needed. Later I found Head First Object-Oriented Analysis and Design. Now I have the books needed to move forward on my quest.
For anyone else trying to make this journey, here are my suggestions.
- Pick an OOP language and get a good introductory book for syntax, data structures and algorithms.
- Create a few projects to get the language and basic OOP concepts in your head.
- Next read Head First Object-Oriented Analysis and Design and Head First Design Patterns. (Note that both books use Java for programming examples.)
- Read Code Complete, Second Edition. I haven’t looked at it, but everyone who responded to my inquiries suggested reading this book. Moreover, numerous posts in every forum I visited recommended it.
I wish someone had given me this information eight months ago. It would have saved me hours of googling and reading snarky forum posts in a quest for book suggestions. What are your favorite OOP books and resources?