I found the title of this book a little misleading. In fact, it is simply an introduction to programming, using Python as a programming language. In a volume of this size, it is not really possible to present software design seriously.
I volunteered to review this book because I have taught introductory programming for more than 40 years and, thus, I feel deeply concerned with this subject. Moreover, I did not know Python and wanted to see whether it was more suitable for this task than any of the numerous programming languages that have been used in the past.
Since this book is intended for students, there is no discussion about either the choice of programming as the introductory subject to computer science, or the choice of Python as a first programming language. The very few words about the goals of this book are in the preface and, in summary, they are: keep it short; be careful with vocabulary; build gradually; and focus on programming, not the programming language.
The first goal is clearly attained. The second goal is helped by glossaries at the end of every chapter. The third goal may be considered to be achieved, at the expense of coherence--some subjects, judged to be more difficult than others, are split into small steps, scattered among chapters; thus, despite the detailed index, it would be difficult to use this book as a reference. The fourth goal, however, is not achieved, as this is clearly a book about Python. In order to focus on programming only, it would be necessary to first present the fundamental concepts of programming, and then illustrate them with Python. As soon as you are forced to explain why the equal sign no longer has the meaning mathematicians gave it centuries ago, why a÷b×c has the same meaning as a×c÷b, why some common English words cannot be used as variable names, why parameter passing does not have the same meaning when the argument is a string as when it is a list, you are presenting a lot of absurdities as if they were cleverly designed. It is useful to quote a letter to the editor from Communications of the ACM [1]. The use of Python as an introductory programming language, intended to teach good practices in software design, is an example of the “pervasive use of scripting languages that abandon static safety altogether.”
To conclude, if you think that programming is the first thing a student in computer science must learn, that the ease of use of the supporting language is its most important characteristic, that static safety is a notion of the past, and that Python is an excellent programming language, then this book is a very good one. It is short and well written, it follows a very smooth progression, and its companion Web site is very good. It is regrettable, however, that all of the external references are to Wikipedia, thus enforcing the idea, already much too widespread among students, that it is the only existing and reliable source of information.