Updated 25 Feb 2012
There are lots of books out there about the current dominant programming languages (or the currently hip and fashionable smaller languages). You can find these by searching Amazon or Stackoverflow. But software development is, for me, much more about thinking skills, design tradeoffs, and communication. Let me suggest some other aspects of the job that you might consider to become a better developer.
How To Solve It: A New Aspect of Mathematical Method, by George Polya
This is a great set of patterns for approaching problems in a structured way.
Although intended for mathematical problems, I find that asking the same
questions can really focus my thinking on anything. What are the knowns?
What are the unknowns? Can you find an analogous problem and solve that?
(Wikipedia)
Six Thinking Hats, by Edward de Bono
People working in a group typically play several roles (eg, devil’s advocate,
positive thinker, moderator), but they usually do it unconsciously. If we are aware
of what kind of thinking is needed at a certain moment, we can
work together in the same mode, instead of battling each other just because
we have different assumptions about what we’re trying to accomplish.
The Wall Street Journal Guide to Information Graphics, by Dona M. Wong
If you need to share quantitative data from tests, benchmarks, etc., it’s a
good idea to understand the basics of visually presenting your data. It also
helps to recognize presentations from others that are confusing or
misleading.
The Elements of UML 2.0 Style, by Scott W. Ambler
A quick and pragmatic guide to UML diagram types. Which kind of diamond to
use on this line? When in doubt, leave it out.
101 Things I Learned in Architecture School, by Matthew Frederick
You should learn how to use figure and ground in your drawings. And how
to draw a perfect rectangle.
Getting Things Done: The Art of Stress-Free Productivity, by David Allen
Get your TODOs out of your head and into a system where you can be certain
they will not be forgotten. Divide your time consciously between planning and
doing. Also be careful to define tasks that really are “do-able” (it’s common
to write todos that are subtly vague in a way that makes them tough to
complete).
Pomodoro Technique Illustrated, by Staffan Noteberg
This is kind of like iterative development for your tasks. Work in small
batches at a sustainable pace, focus on one thing, and reflect in order to
improve.
Emergent Design: The Evolutionary Nature of Professional Software Development, by Scott Bain
An excellent book, explaining the ways that
pressures on your software (over time) can guide your design to grow along
with the needs. Use of patterns emerge from the need, rather than being a
design goal from the start.
Patterns of Enterprise Application Architecture, by Martin Fowler
Higher-level patterns at the application level.
This is an area where there seems to be a bit of a gap in software
literature, and this, along with the others in the Martin Fowler series (eg,
Enterprise Integration Patterns), is a much-needed catalog for application
developers.
Refactoring to Patterns, by Joshua Kerievsky
Framing patterns as solutions to a “code smell” is
much more effective than learning them abstractly and then looking for places
to apply your new knowledge.
Smalltalk Best Practice Patterns, by Kent Beck
This is the best resource I’ve found for patterns
at the class and method level (eg, ExplainingMethod, DefaultValue). This was
also published with Java code under the title “Implementation Patterns”, but
somehow the Smalltalk version is much better.
The Pragmatic Programmer: From Journeyman to Master, by Andrew Hunt and David Thomas
Not only very practical advice, but at the same
time the philosophy and wisdom of years of experience behind that advice.
Study this and study your craft.
Software Craftsmanship: The New Imperative, by Pete McBreen
Software really isn’t a science, so is there
anything we can learn from the craft traditions? Studying the work of
masters, working with more experienced developers as mentors, mixing
theoretical learning with practical application.
The Mythical Man-Month, by Frederick P. Brooks
A classic, and still applicable nearly 40 years
later because it’s still people developing software.