I started to teach myself programming when I was 8 years old. It was a brand new Macintosh Plus, and I was totally hooked on Hypercard. I mostly learned by tearing apart the examples it came with, and figuring things out myself. And, while this was fun, it really didn’t teach me a lot about software engineering.
I personally look at the difference between programming and software engineering as the difference between building a dog house and building a real house.
You can learn how to build a dog house on your own: completely self-taught. You can build a dog house over a weekend or two of dedicated effort. You can build a dog house on your own. The consequences of completely screwing up your dog house are pretty minimal. All that said, it’s not actually easy to make a super nice dog house, so there’s some real effort involved if you’re going to do it well, and there are some spectacular dog houses out there.
However… building a real house is an entirely different kind of endeavor. To even start, you’re going to need to seek out some professional education. You certainly will need a lot more than a few weekends. You’re also going to need a team of specialists to help. And, of course, the consequences of screwing up a real house will be very expensive: if not actually dangerous.
So, when I went off to school to learn how to go from being an avid programmer to a professional software engineer, I had a lot to learn.
I may talk about my schooling at some future point, but it was actually the reading I did on my own, at the recommendation of some of my early mentors, that taught me the most. So, I want to pay it forward, and recommend a couple of those books I found most formative.
Code Complete, by Steve McConnell is where I was first introduced to most of the essential concepts of large-scale software engineering. As each concept was introduced, it was accompanied with lots of examples in code, and excellent, in-depth explanations. It is no exaggeration that this book completely changed how I wrote code. If you only ever read one book on coding, make it this book.
Design Patterns, by Erich Gamma et. al. is the foundational book for the entire concept of design patterns. In short, straight-forward chapters, it teaches some of the most fundamental and re-usable building blocks of complex software systems. The patterns described in this book have become the very language of software design.
Refactoring, by Martin Fowler outlines the most essential skills in changing existing code. Whether it’s to add a new feature, fix a bug, or anything else you’ll want to learn and follow the procedures outlined in this book.
To be fair, these are three among a great number of amazing books on software engineering, so the fact that I don’t list a particular book here doesn’t mean it’s not valuable. There are a lot of other books I have on my shelf and have read cover-to-cover (some of them multiple times). However, of all the books in my collection, I view these three as having been most personally influential on the way I write and think about code.