In my recommendations this has to be the very first book. Even if the only available edition was the original, published in 1984 I would still recommend it as a very first book for any aspiring programmer that wants to learn computer programming from a ground up. This book sold over a half a million copies throughout its six editions. With every new edition author updated its content in an effort to keep the book current, informative and helpful. This book gives a unique insight into the methodology of modern computer programming, teaches the most essential elements of any structured programming language and does it in a way that is easy to understand, follow and retain. I specially like the Author's approach of building the included programming samples and exercises form simple to more complex to match the covered concepts. Overall this book has my five star rating and I recommend it for any aspiring programmer even if they don't plan to use C as their chosen language.
Code Complete: A Practical Handbook of Software Construction (2nd Edition)
by Steve McConnell
Code Complete is one of a few books that I know that are virtually language independent. It teaches you not the language specific tricks and techniques but instead concentrates on an overall approach to creating computer programs and applications. If you as a programmer find yourself in a situation that you have to spent some time to decipher your own code (at some point almost all of us get there) you are ready for this book. Over the years it helped me write a better code (and pseudo code as well) by providing guidance to my programming and problem solving approach. If you follow the methodology presented in Code Complete I can guarantee that your programs will be easier to understand and maintain. If you are just starting your coding journey and your programs don't go beyond 2-3 thousand lines of code you might hold of on reading this book or just skim it. I know from experience that once you are comfortable with a programming language of your choosing you will find ways to create applications beyond a few thousands lines of code. When that happens we usually need help with making our programs more efficient and reader/programmer friendly. This book provides just that, it will help you to simplify and structure your code and create better, more robust applications. Five stars rating for intermediate level programmers.
Design Patterns: Elements of Reusable Object-Oriented Software
by Erich Gamma; Richard Helm; Ralph Johnson; John Vlissides
When I started to program (it was back in the computer stone age), object oriented programming was just a concept because computers were probably less powerful than today's electronic wrist watches. Today however I can't fathom even a simplest computer program without objects and classes. It is probably possible to program using classes designed by others without ever understanding the concepts and power of object oriented development. However if we want to be good developers we have no choice but to really understand how modern computer software is designed, implemented and used. If you ever thought about reusable code then you should know that object oriented programming or OOP is a key concept of that philosophy. Design Patterns is one of the books that can easily be called a modern classic of object oriented programming. It provides a language independent approach to solving common design challenges of software development and maintenance. It provides an insight into OOP patterns and its methodology, inheritance, flow control in object oriented applications and object management. It also provides many examples that can be applied to the real life situations. If you are just beginning with object oriented programming you should probably start with An Introduction to Object-Oriented Programming (3rd Edition)
or An Introduction to Object Oriented Programming. But if you are serious about object oriented development you should get the Design Patterns and keep it at an arms length as a reference, I promise it will get out of a "jam" more often then you would like it to.