These are some of the books I recommended, and some other books that may be worth reading. This list is far from being complete, and will never be. It is biased after my own tastes. It is also far from finished.
This is a classic! Frd Brooks was one of the first to spot the problems software projects suffer from. It is short, sweet, and a MUST READ.
Deals with many interesting topics including management, development, and marketting. It is interesting to read this in sync with other Microsoft-Inside boks (some references will be added later). It will be interesting to see how things will change after the Microsoft trial ends.
Aside from being a good read, and an interesting history this book provides an example case study of the design and evolution of a computer system. The Interent grew up to be a robust system (even if not 100% reliable), by an evolutionary process. These are two elements that people tend to forget when thinking of software design.
This is a cult book on OOD. It makes an interesting read. Examples of topics: how to design iterators, how to implement undo etc. You can read more on this book and design patterns in general by following the links about patters in the links page.
This is a one of the classic books about computers and programming. It is almost the bible for some people. This book is used in MIT to teach programming, and does a great job teaching about "abstraction." Only drawback, for some people, is that it uses the language Scheme. Highly recommended.
Check the book's web site or check the comp.lang.scheme newsgroup which has discussions about the book occasionaly.
This books describes various debates that infulenced the design of C++. Of special importance to students of the Ada course are the chapters about excpetions and about multiple inheritance.
Programmers tend to forget that there is a user, fwho has to be able to use the computer system effectively. This books studies how to design the humam-computer interface. It has some cool ideas.
This book describes programming from the most simple concepts (variables, expressions) to the most complex (polymorphism, exceptions, concurrency). It is not a text book on these topics, but it does give the essential information. It gives examples in both C++ and Ada, thus providing a good starting point for comparing the languages. It also touches many of the important topics of softare engineering like abstraction, modularity etc.