Don't hold back your programming
When people ask how to improve their programming skills invariably they are told to write more code, to dive into open source projects or to build a replica of a well known piece of functionality. All of those tips are great but at the same time they can reinforce bad habits or lead you to the situation where you can make something work but you don't know why!
Why your programming doesn't work out the way you plan
The key to improving your skills is to both practice programming but also to read more on the subject, by reading I don't mean spending 2 hours on Hacker news everyday (although that can be fun!). A solid concerted effort to work through particular programming books will pay dividends in your future abilities and critical thinking. By expanding your knowledge of core concepts you can spend more time on the domain problem and how to work efficiently rather than coding by coincidence or wondering how your program works... In this article I'm going to provide a selection of books that I have found to be excellent reads that have not bored myself to tears. Not all are obligatory to read and some will be less relevant for the functional programmers or NoSQL people out there.
1. Pragmatic Programmer
The Pragmatic Programmer is an absolutely essential book for any aspiring software developer, code examples are light on the ground, instead this book focuses on the overall 'craft' of the developer. It dives into best practices for prototyping, the dangers of coupling,estimating and other problems that hamper developers. It covers key topics such as 'coding by coincidence' and methods for teams to work in efficient, automated and 'pragmatic' ways.
If you only have time to read one book then let it be this one, it's easy to pick up and read for 5 minutes and then start again another day, the chapters are easily digestible and I feel that it has helped me in countless ways.
Buy here: Amazon
2. Introduction to Algorithms - Read either this or book number 3
Do not let this title fool you, it is a large book that is very heavy on technical algorithmic theory and examples. However don't let that scare you off because it's an absolute treasure trove of examples and use cases, from the various sorting algorithms through to much more complex data structures and graphing theory. I've never read the book cover to cover but instead taken a chapter on its own as its own mini book, it'll certainly refresh what you did or didn't do at university and in many cases will be incredibly useful as it never hurts to have a better understanding of algorithms.
Buy here: Amazon
3. The Algorithm Design Manual - Read either this or book number 2
Compared to Introduction to Algorithms this book is a much easier read, it covers 90% of the same material but has an easier writing style and I believe covers the introductory side of algorithms much better. However I think it does lack some of the higher end topics, either of the two books I'd consider essential reading. So if you find Introduction to Algorithms a bit intimidating then try out this book!
Buy here: Amazon
4. Growing Object-Oriented Software, Guided by Tests - Essential Reading
There is a lot of discussion about Test Driven Development (TDD) on the internet at the moment, people are either incredibly passionate for or against it, a typical programming flame war. Personally I think TDD is a great tool for driving the design of a class,module or service, it allows you to have a suite of tests allowing quick feedback on refactors and provides a level of confidence that just isn't there when you lack tests.
This book is THE book to read if you like the idea of TDD but don't know where to start, perhaps you already write your tests after you've written the functionality but find they are brittle or verbose.
Steve Freeman and Nat Pryce guide you through a whole project of developing an automatic ebay product bidder. There are many examples including their reasoning and you can see how the tests drive the design cycle. The examples are in Java but I would think they are useful for any C#,Ruby/Python developer. The main takeaway from the book is the methodology and process as opposed to the language.
Buy here: Amazon
5. Design patterns : elements of reusable object-oriented software
This book was recommended to me when I got my first programming job, I didn't have time for it because I was too busy writing code and trying out the new web dev framework that arrived every week. I wish I'd taken the time then to give the book a go, it covers all the major design patterns that you see in the programming world. This is one of the cases where you are probably already using some of the patterns without realising it! It you take the time to read this book it'll certainly enhance how you approach higher level problems, be it with GUIs, new projects or how to adapt legacy projects. After reading it go back through your favourite libraries and github projects and see where they are utilised.
Buy here: Amazon
6. SQL Performance Explained
Even though the NoSQL scene grabs a lot of the headlines at the moment, RDBM's are still the go-to tool for the a multitude of projects. Most programmers will know how to set up their favourite DB, be it MySQL,PostgreSQL or Oracle. Most programmers will be able to write simple to fairly complex queries yet most programmers aren't DBA's and lack the understanding of indexes, joins and SQL operations past the simple basics that 'get things to work'. This book will boost your understanding of optimizing SQL performance allowing you to squeeze the extra crucial seconds out of your queries.
Markus (the author) also has a blog which has some really awesome additional content.
Buy here: SQL Performance Explained
Conclusion
This is not a conclusive list of all the best books out there and I'd love to hear from you if I've missed a book that should be on the list but didn't make it. I'll follow up this article with a few books targeted towards developing your skills specifically in Java and Ruby. As always I'd love to hear your comments on here or you can reach out to me on twitter.