Me neither. I mean, most of them I’ve read now since I finally wrote a book; people think I’ve read everything, so it forced me to go back and get at least a passing familiarity with many books that people would think… And when I talk, I get people in my classes who have computer science degrees who certainly don’t know very much about object-oriented programming. And when I ask them what kind of train they had in college, they say “We learned Java and we learned inheritance.”

So there’s a failure of teaching - that’s one thing. However, the other thing is this thing about cargo culting new ideas. I distinctly remember when I read the Design Patterns book back in the day, no long after it came out, and how I felt like I’d been saved. It was such a relief to see the clarity that they had around categories of problems that occurred over and over again, and I just used those design patterns everywhere; I used them all over my code, in appropriate places.

Same thing when TDD came out, when I decided I was gonna get on the testing bandwagon; people who seemed smarter than me were saying it was a good idea, and I went from being a pretty useful, competent programmer who’d get a lot done, to being able to accomplish almost nothing from one day to the next, because I was so bad at writing tests. I was slow and I was bad at writing tests. So my desire to use this new thing that seemed like a good idea caused me harm instead of doing good.

[ ] Does this mean that testing is bad, or that design patterns are bad? No. Does it mean that I was terrible at them when I started doing them? Yes. But how else could I have learned? What is the alternative? So one of the things that I’m a firm believer in is not denying people the opportunity to learn from making mistakes. That means that all of us - unless you came out of the egg as knowing all the answers, you’re just gonna learn from writing code.

I think there’s a lot of OO code out there where people didn’t get the chance to stick with it, so that they could learn stuff; they came from procedural, or they have a CS degree where they didn’t really learn to understand OO, and then they wrote a bunch of apps that people maintained over a bunch of years and those apps are big and messy and hard to understand. But I’m not convinced that any other programming language under the similar circumstance would not be equally imperfect over a number of years.

I’ll say one more thing about this and then I’m gonna shut up. I realize that I have a bias, and it is because people don’t call me when things are perfect. It is true that maybe I skew a little bit toward the big, large, unmaintainable OO app - that could be; I’m aware that I need to be careful about that. But I believe that despite that, despite that qualification, I believe this statement is true: anybody who’s been in business for ten years, anybody who won, has apps that are a mess. And those pretty apps that you see from the startups, they disappear. It should be considered a triumph; a triumph of persistence and an ability to survive in the marketplace to have big computer applications that are imperfect, because they all are. That’s the world we live in - there’s a big mess, and our job is to figure out how to deal with it.