Most students taking an introductory computer science (CS) course often start with learning how to write programs in a high-level language. They learn how to analyze problems so that they can create procedures (that is, algorithms) to solve them, and then implement the procedures in the syntactically correct computer language being taught so that they run on the operating system of their computers. There is a lot that has to be mastered here, all taking place at the same time. There is also plenty not included in the course.

Xu and Zhang emphasize topics in introductory courses that are most often treated lightly, if at all. These topics are primarily conceptual, but that does not mean easy. The authors used this book in their introductory computing course that had no prerequisite of programming skills. The topics come from the theoretical and historical foundations of CS as a discipline. They may be found primarily in a discrete structures course as well as in other comparable courses on algorithms and computer organization.

The text has eight chapters. The first six chapters have the bulk of the content. The first chapter is an overview of the fundamental characteristics of the discipline of CS--how CS differs from other scientific and engineering disciplines and how CS fits into contemporary culture.

The second chapter is on digital symbol manipulation. Decimal and binary representations of numbers are covered, and how characters are represented digitally. The generation of Fibonacci numbers is used to illustrate how programs manipulate digital symbols. The computing language is Go. Students do not write the programs. Listings are discussed in the text.

Logic is the subject of the third chapter. It covers propositional logic, predicative logic, the Turing machine, and automata. The Church-Turing hypothesis, incomputable problems, paradoxes, and Gödel’s incompleteness theorem are used to discuss the power and limitation of computing. This chapter may be heavy going for students since the propositional and predicative logic topics are presented with full use of appropriate symbolic logic notation and since the Turing machine and automata are covered too speedily. This is a lot of challenging subject matter to squeeze into 50 pages, especially for introductory students.

“Algorithmic Thinking” is the fourth chapter. Sorting algorithms begin the discussion of how algorithms are constructed and how well they may perform in storage and time. Big-O and little-o characterization of performance is introduced. Additional illustrations based on search algorithms, greedy programming, and dynamic programming are brought in. The chapter concludes with a presentation of P versus NP. Again, there is a lot of content poured into 50 pages.

The emphasis of chapter 5, “Systems Thinking,” is on abstraction and modularization. These general concepts are made more particular in the representation of real numbers and floating-point numbers; ASCII, Unicode, UTF-8 characters; and adders, memory, pointers, and addressing. All of these topics come together in the von Neumann computer. This is the longest chapter in the book at 69 pages.

The sixth chapter, “Network Thinking,” is the last major content chapter. It covers network terminology, topology, protocols, programming for the Internet, and topics related to the user experience, including bandwidth and data transmission.

The last two chapters are comparatively short. Chapter 7 presents four major student projects from a course that used this book, and the last chapter has appendices including common Linux command-line commands and principal statements in the Go programming language. The book has a companion website from which readers can pull down over 200 MB of zip files with lecture notes, lab notes, answers to the even numbered exercises in the text, and project notes.

This is a puzzling book in some respects. On the one hand it covers basic concepts and terminology for the beginning student, yet on the other hand plunges into sophisticated topics without drawing a breath. Likewise, it claims that programming experience is not a prerequisite, yet the experience of having programmed and solved challenging problems would be of real help in comprehending the more challenging topics. Although students only see a small sample of demonstration programs in Go (which they did not have to write), one of the four major projects involves the creation of webpages, JavaScript programs, and using JSON. There seem to be two books trying to emerge at the same time--a genuine introductory text and a book covering topics at least at the intermediate level. There is enough here for two semesters of work with careful attention to sequencing of topics and the need to amplify the text during lecture. This way introductory topics for novices could be disentangled from the deeper topics for more experienced students.