John Cole's Suggested Reading
Updated 8/5/2018As you know, your instructor reads a great deal. A few of you have asked for a reading list, so here it is. These are in no particular order. The CS-related books are things that I have found interesting that relate to our field. The non-fiction books relate to the wider world, and although not specific to our field, relate to the way the world works in general. The fiction I have chosen is there because these books have a deeper message.
Computer Science Related
Studying Engineering by Ray Landis. He should remove the second word from the title; this book is useful for anyone studying anything, but it is geared toward engineers, including computer scientists. Most of his advice is common sense, which, sadly, is not nearly common enough, and some of it has been on my main Web page for a few years. It's even reasonably priced, and available from Amazon.
Programming the Universe by Seth Lloyd. This is an excellent introduction to quantum computing. He makes a good case for the universe being such a computer.
The Mythical Man-Month by Fred Brooks. This is the classic in software project management, and should be required reading. Brooks managed the OS/360 project at IBM and learned a great deal about how not to run a programming project.
UML Distilled by Martin Fowler. This is a great introduction to the Unified Modeling Language, enough to get you started until you take a full-blown OOAD course.
The Inmates Are Running the Asylum by Alan Cooper. Cooper makes a fairly strong argument for software engineers not designing software products. However, since we need to be involved in the process, he offers guidelines for doing this. His other book is About Face: The Essentials of User Interface Design. Cooper was the designer behind the "Visual" part of Visual Basic, and explains, using psychology and reason, why some interface designs are better than others and how to create good ones.
The Soul of a New Machine by Tracy Kidder. This book is about the Eagle Project at Data General, to build a machine compatible with their Eclipse line. It details many of the mistakes and problems in both the technology and the management of this project. It's a bit dated but still worth reading, especially in conjunction with a project planning course.
Fab by Neil Gershenfeld. The subtitle is "How to Make (Almost) Anything." The author runs the Fab Lab at MIT and teaches courses in exactly what the subtitle says, from design through actually making the object. He teaches students how to use such things as laser cutters and sintering machines. Wouldn't it be fun if we had one of these at UTD?
Inside SQL Server 2005: The Storage Engine by Kalen Delaney. This gives you the intimate details of how SQL server databases are laid out, how the various kinds of blocks relate to each other, how indexes are structured, and so much more. Required reading if you're going to write add-ons for this product and useful if you want to understand database internals. While this isn't required reading for CS4347 or CS6360, it should be.
Godel, Escher, Bach: An Eternal Golden Braid by Douglas Hofstadter. Many programmers are also accomplished musicians. Hofstadter explores the relationship between music, the strange recursive paintings by Escher, and computation. He writes well and explains things clearly and with humor. There is also a running thread of conversations between the two characters of Zeno's paradox: Achilles and the Tortoise.
The Elements of Programming Style by Brian Kernighan and P. J. Plauger. Good programs are not only technically correct, they are elegant, as well. That is, they have a consistent internal structure, use good naming conventions, and are well-commented. My copy is, to say the least, a little dated, with examples in FORTRAN and PL/1, but the ideas apply to Java and C# as well.
Makers: The New Industrial Revolution by Chris Anderson. Manufacturing isn't limited to big companies anymore. What the laser and inkjet printers did for personal publishing, 3D printers and CAD software will do for making your own stuff. As much as we use information, we still live in a world of physical things, but the line is starting to blur. He also explores the social implications of being able to make nearly anything you want. This is a great follow-on to Fab, so read that first.
Evil by Design by Chris Nodder. While this tries to be a general book on interaction design, it is heavily Web-oriented. Still, it is a valuable guide on how to design interfaces that appeal to our worst nature and how to avoid getting sucked in by them. Pride, envy, lust, sloth, greed, anger, and gluttony all play a part.
The 5 Elements of Effective Thinking by Edward Burger and Michael Starbird. While not strictly CS, it certainly applies to our field. Many of the examples are taken from math, which is what the authors teach. This is the book we're currently using (Fall 2015) in the CS1200 course. The elements are the classical ones: Earth, Air, Fire, Water, and Change as the quintessential element. You'll have to read it to see how those elements tie in.
Code by Charles Petzold. He starts with the simplest problem, attempting to communicate with someone without being able to see him directly, and uses that to launch into a discourse that takes you from communication through computer architecture and programming into operating systems. Even though it is quite technical, it is also very readable.
Android User Interface Design by Ian G. Clifford. This is an excellent introduction to the idea of "material design," which means treating the user interface not as flat but as a material, with various properties. Once you do this, design possibilities open up that you might not have considered before. Here is a link to Google's page on the topic: http://developer.android.com/design/material/index.html
Nine Algorithms That Changed the Future by John MacCormick. The nine algorithms include public-key encryption, data compression, search engines, page ranking, pattern recognition, and others. Mostly these are classes of algorithms, not the specifics, and the explanations are generally good. However, this was meant for a non-technical audience, and thus is weak on math. He probably should have included more detail in appendices or footnotes. Worth reading for the beginner.
The Man Who Saw Tomorrow by Lillian Hoddeson and Peter Garrett. The subtitle is "The Life and Inventions of Stanford R. Ovshinsky." Never heard of him? Probably not, but you know some of his inventions: Nickel-metal hydride batteries. Phase-change memory such as CDs and DVDs. Noncrystalline solar cells such as many calculators use. And many others. Someone I knew who knew him once describe him as a cross between Einstein and P. T. Barnum. It's fun if you like history and biography.
Datapoint: The Lost Story of the Texans Who Invented the Personal Computer Revolution, by Lamont Wood. Ask anyone which company invented the personal computer and the answer is usually Apple. Ask which company developed the first local area network, and you might get Cisco or 3Com. The real answer to both of those is Datapoint, a company founded in 1969 in San Antonio, Texas. They also developed the first microprocessor, the Intel 8008, and ceded the IP to Intel, which they contracted to manufacture it. I worked there during its heyday, from 1977 through 1979.
The Design of Everyday Things by Donald Norman. All of the things we use every day, including pencils, keyboards, chairs, cars, and doors, were designed by someone. Given this obvious fact, why are they so often poorly designed and how can the process of designing them be improved? While this isn't specifically about software design, he does cover the design of some aspects of programs. Some of his examples are humorous, and the book is fun reading.
Don't Make Me Think by Steve Krug. Strange as it may seem, people who use your programs don't want to think, they just want to get their job done. Thus any user interface that requires cognitive processing to use will not be well received. Krug does a great job of explaining how you can design programs that require minimal thinking and still work well. There is a new "Revisited" edition that I haven't yet read.
The Closing of the American Mind by Allan Bloom. The author was a professor of English at the University of Chicago, and the book details how American education fell into decline and gives some prescriptions as to what to do about it. When he started teaching in the 1950s, incoming freshman had familiarity with at least two basic documents: The Bible and The Declaration of Independence. (I strongly recommend reading the Constitution of the United States of America, as well.) By the end of the 1960s, this was no longer true.
Beyond Reason by Roger Fisher and Daniel Shapiro. While this isn't a computer science book, it is directly relevant to both project planning and software engineering, in that both involve negotiation. The authors define five basic elements of negotiation: Appreciation, Affiliation, Autonomy, Status, and Role, and explain how they can be used when working with others.
The Physics of Consciousness by Evan Harris Walker. This almost belongs in the above section because it deals, first, with the information processing capacity of the mind/brain. However, he quickly verges into real physics and how quantum interactions work in the brain. He intersperses the technical chapters with a deeply personal narrative that relates to the subject. This is easily the best book on how consciousness works that I have ever read, although he is missing a couple of key pieces.
Guns, Germs, and Steel by Jared Diamond. "Why did the whites get all the cargo?" asks Kali, a tribesman in New Guinea. This book is a fascinating description of why the civilizations that sprang from the fertile crescent were so much more materially successful than those in other parts of the world. It has more to do with geography and the availability of certain kinds of plants and animals than anything else.
The Blank Slate by Steven Pinker. If you're interested in learning and teaching, you'll find this thought-provoking. The concept of the "tabula rasa," advanced by John Dewey, is that everything we are is created by our experience. Pinker shows that this is simply not true.
Freakonomics by Steven D. Levitt and Stephen J. Dubner. The subtitle is, "A rogue economist explores the hidden side of everything." My favorite quote from the book is, "Morality is the way we want the world to work. Economics is the way it actually works." That is, you can tell what people really value by where they put their money. If a teacher is evaluated by how students do on a test, they will do well on the test at the expense of learning anything, for example.
Cornered by Barry C. Lynn. He explains how the weakening of American antitrust laws starting in 1981 and accelerated during the Clinton administration have led to near-monopolies. This would be bad enough, but they have also led to trading, rather than production, being the way to maximize profits.
Chaos by James Gleick. This is a great introduction to chaos theory and fractal geometry. If you were intrigued by the Sierpinski triangle from CS1337 or CS2336, this will give you a much greater appreciation for fractals, Julia sets, and the math behind them. Gleick, a science writer, has also written biographies of Richard Feynman and Isaac Newton, which I highly recommend.
Engines of Creation by K. Eric Drexler. This is an early book on nanotechnology, and probably still the best introduction. Drexler explores the technology, mechanisms by which to create nanomaterials, and the social implications. It helps to have some science background, but he's a good, clear writer.
Difficult Conversations by Douglas Stone, Bruce Patton, and Sheila Heen. Any discussion of grades is a difficult conversation, but there are many others, both in a personal and professional context. Communication skills are crucial to success, and this will help you gain them. The authors maintain that there are really three conversations: The "what happened" conversation, the "feelings" conversation, and the "identity" conversation. Knowing which one you're having is crucial to actually communicating.
Wealth of Nations by Adam Smith. Written in 1776, this is still the essential document of capitalism. Smith describes the division of labor, why trade is good, the operation of the "invisible hand," and many other concepts relating to economics. This is one of those books you see quoted in Wall Street Journal articles and elsewhere but one that very few people have actually read. It is a bit of a slog because of the language and his tedious descriptions of things like the pricing of English corn, but worth it.
The E-Myth Revisited by Michael E. Gerber. Many of my students talk about starting companies. I encourage this; I have started two. However, most of us in computer science or engineering are highly competent in our field and much less so in running a business. This book is required reading before you try to start your first company. From the back cover: "The E-Myth is the fatal assumption that an individual who understands the technical work of a business can successfully run a business that does that technical work."
The Richest Man in Babylon Tells His Secret by George Clason. I have seen many books that purport to tell you how to get rich quickly. This little classic tells you how to get rich slowly. Some of the key traits you'll need to develop are the same as those required to become a computer scientist: persistence, precision, and a future orientation.
Pre-Suasion by Robert B. Cialdini. While some of the concepts in this might be useful in Web application design, I'm including it here because it is more general. We have all tried to persuade someone to do something for us, to change their ideas, and so on. This book, loaded with interesting and entertaining examples and heavily documented with references, is the definitive guide on how to do it. His chapter on ethics would alone make the book worth reading.
Shop Class as Soulcraft by Matthew B. Crawford. I learned of this amazing little book at a First Year Engineering Experience conference in 2016. One of the speakers uses it, along with Zen and the Art of Motorcycle Maintenance, as one of the textbooks for a freshman course. He covers a lot of ground, from the nobility of work to a discussion of agency versus autonomy. Writing software is a craft, similar in some ways to any trade in which you create something to be used by others. True, there is considerable theory, but the intended end is generally a useful program. Thus the ideas carry over to what most of us, as computer scientists and programmers, actually do.
How to Fail at Almost Everything and Still Win Big by Scott Adams. I believe in setting goals, so when Adams says, "Goals are for losers" I wondered what he meant. He says you should develop a system that will let you learn from failure and continuously improve. Thus you should develop a system to do well in your classes, not set a goal of getting an A in everything. Another thing he discusses, although with some skepticism even though they appear to work, is affirmations, statements to yourself of things you wish to be true.
Island by Aldous Huxley. Huxley's last, best book, this is a story of a culture on a remote island that is a balance of Scottish pragmatism and Hindu spirituality. The story begins with the protagonist waking up on a beach after a shipwreck and hearing the word "Attention," but I'll leave what happens after that for you to discover. While everyone reads Brave New World in high school, this is far better and more insightful.
Childhood's End by Arthur C. Clarke. In my opinion, Clarke is one of the best science fiction writers ever, and this strange tale of aliens visiting our planet and the changes they facilitate is probably his best work.
The Shockwave Rider by John Brunner. This was his last and best book. (Is there a pattern here?) The title comes from Alvin Toffler's Future Shock, about the accelerating rate of change in modern culture. The eponymous Rider rides this shockwave rather than being destroyed by it. Or as Alan Kay put it, "The best way to predict the future is to invent it." The moral of the story is that to survive you need to be able to adapt to change, and that is especially true in any technology field.
Communications of the ACM. This is the primary journal of computer science, and highly recommended. You can get a student membership in ACM for about $20 as of 2017, and it is well worth it.
EE Times This is a free trade magazine, and easily one of the most forward-looking publications of its kind. I recommend it especially to computer scientists, since if you see a piece of hardware on the shelves today, it was reviewed in EE Times at least five years ago.
Scientific American and Scientific American: Mind These are a little weak for serious scientists but always contain something of interest, something that points to a more in-depth article, so they're worth reading. Politically they lean pretty far left, so you have to discount that somewhat.
The Wall Street Journal Once referred to as "The best little newspaper in lower Manhattan," the Journal is essential for keeping up on business trends that affect our industry.