Programming Praxis is language-agnostic: the problems are intended to be amenable to solution in any reasonable programming language. More information about various languages can be found on these pages: Awk, Haskell, Lua, Python, and Scheme.

Programming is, at heart, about algorithms and data structures. The best text on algorithms and data structures, by far, is Donald Knuth’s three-volume Art of Computer Programming. Introduction to Algorithms, by Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Cliff Stein is also excellent. Chris Okasaki’s book Purely Functional Data Structures provides a somewhat different look at some familiar data structures, plus some good material not usually covered elsewhere. And there are many other textbooks on algorithms and data structures, with varying emphases and degrees of excellence.

The good folks who used to work at Bell Laboratories wrote some fantastic books about programming. Brian W. Kernighan and P. J. Plauger wrote Software Tools and Software Tools in Pascal back in the 1970s, but they are still relevant today. Jon Bentley’s books Programming Pearls and More Programming Pearls are entertaining as well as educational. More recently, Brian W. Kernighan and Rob Pike wrote The Practice of Programming, which is simply superb. All these books are highly recommended.

People who are just learning to program would be wise to look at How to Design Programs by Matthias Felleisen, Robert Bruce Findler, Matthew Flatt, and Shriram Krishnamurthy, which uses Scheme as the programming language but is not about programming in Scheme. Another classic book is Structure and Interpretation of Computer Programs by Harold Abelson and Gerald Jay Sussman with Julie Sussman, known as the wizard book due to its cover art, which is the textbook that accompanies MIT’s introductory computer science course; it’s complete text is available on-line at http://mitpress.mit.edu/sicp/.