This is a very deep question. If I had a good, or easy, answer I'd be a hero (or at least a consultant). And it isn't for lack of thinking about this-- I've been worried about just this subject for a long time.
There aren't any particular books that are going to make you a good programmer or a good designer or a good architect, although there are many that might help. I just finished
The Design of Design by Fred Brooks, which is an excellent set of essays on what it takes to be a good designer. I'm still sort of happy with
my own essay on this topic, written for OOPSLA 5 years ago.
My own view (for those who don't want to slog through the essay) is that the best way to become a good designer (or a good programmer) is essentially to apprentice yourself to a good programmer or designer, and work with them until you master the craft. Programming (and system design) is as much art as it is science, and the way art is taught is by doing art, receiving criticism, and then repeating the cycle. We do the same thing with programming and system design-- you code (or design), it gets reviewed (sometimes in humbling ways), and we repeat. Different people will learn better from different masters, so if you aren't progressing you may need to find a different master. At some times it is like woodworking, at others it is like Zen. There is no single path, but you can tell the difference between those who have mastered the craft and those that are just journeymen.
So my advice, if you are looking to really improve, is to find someone who is a real master and ask him or her to look at what you are doing and give you feedback. If there is no one where you work, look for an open-source project that seems to work (or look for a new job). Read lots of good code, and try to emulate it. Reading books may help, but it won't get you there. Only practice, and patience, will.
Sorry if this sounds overly mystic, but there is something mystical about good programs and good design. Good luck in your quest...