This revised and expanded edition of the standard reference on programming in Mathematica addresses all the new features in the latest Version 3 of the software. The support for developing larger applications has been improved, and the book now discusses the software engineering issues related to writing and using larger programs in Mathematica. As before, Roman Maeder, one of the original authors of the Mathematica system, explains how to take advantage of its powerful built-in programming language.
I read this several years ago (the date is a guess) and it's a bit out of date now. Besides being a good introduction to various aspects of Mathematica programming, it is particularly strong on how packages, contexts and options work. I often refer to it for these topics.