Last week, O'Reilly published a new book in their Cookbook series called the Mathematica Cookbook, by Sal Mangano. It's by far the best book I've come across for learning about advanced programming techniques in Mathematica. Most books on Mathematica focus on aspects like symbolic algebra, symbolic and numerical routines like integration, and plotting and graphics. Those features tend to be what students in universities are exposed to, and what academic researchers tend to be familiar with. The use of Mathematica as a programming language, with which one can build up complex functionality from interconnected modules, is much less common compared to these other basic uses, and when this functionality is deployed, it is typically done using procedural programming techniques with heavy use of Do loops.
But to truly take full advantage of Mathematica's capabilities as a programming language, one has to learn about its functional and rule-based programming constructs, and this book does a fantastic job of clearly explaining these techniques. I highly recommend to anyone interested in becoming an advanced Mathematica coder to carefully read the first five chapters: 1. Numerica, 2. Functional Programming, 3. Data Structures, 4. Patterns and Rule-Based Programming, 5. String and Text Processing.