Tester's Guide to Gaining 'System' Knowledge

In retrospect, my father had the incredible foresight to introduce me to electronics at a young age. When I was in junior high we built a vacuum tube AM radio kit from Heathkit. That thing put out enough heat to warm a small apartment, but there was something satisfying about sitting by the window at night fine tuning in the local stations on a radio I built. Then my parents suggested that I apply to a new 'blue ribbon' high school in our area, and I was fortunately accepted at Eastern Technical High School's engineering/electronics program. Somewhere along the way I became more interested in social sciences. But, obviously my long and winding path eventually led me to a career in the tech sector and I have a job that I love. I only bring up my past to provide some context for readers to understand why I take some of the strong positions that I take. For example, I strongly advocate that testers should have an in-depth knowledge of the 'system' under test.

 In my last post I mentioned computer system internals is one particular area of study that is especially useful for professional testers. Similar to how medical doctors study human biology and anatomy, testers who understand the inner workings of a computer are more capable of designing tests to expose errors in complex systems, decomposing test data into discrete equivalence class subsets, and troubleshooting the cause of errors rather than simply reporting the various symptoms. Since I teach software testing at 2 local colleges (and also advise Microsoft STEs who lack a strong technical background) I am always looking for books I think will benefit a tester's technical knowledge. Just before leaving Ireland, I came across a book entitled Code: The Hidden Language of Computer Hardware and Software by Charles Petzold. I am a big fan of Petzold's books on Windows programming, but I somehow overlooked this particular book in the past.

Although the book was a great refresher for me, I enjoy Charles Petzold's style of writing and I did learn a few new things. Charles Petzold is amazingly capable of taking a rather complex subject and explaining it in a fashion that is easy to comprehend. Code: The Hidden Language of Hardware and Software starts with an explaination of basic codes such as Morse code and braille, then uses the basics of electrical switches leading to an understanding of logic gates to explain a simple 'computer' (switchs and lights) that adds and subtracts in binary. There is also a brief discussion of Boolean algebra and its relation to computer science. The book progresses to explain how computer memory works, how computers encode characters (ASCII only but it is a good intro to character encoding basics), basic computer architecture, and ends with a high level discussion of some programming languages and the impact of the graphical user interface.

One of the best things I liked about this book is the way it really walks the reader through an understanding of assembly language. The Assembly language is good to know for debugging.  Debugging is an important skill for testers because it is often required for root cause analysis of certain types of defects, it is also important to isolate the cause of a defect that manifests itself with diverse symptoms, allows testers to participate in resolving complex problems such as isolating memory leaks, and of course to more effectively troubleshoot  problems with test automation. At Microsoft, many groups now require testers to debug some defects to line of code. This doesn't mean that a developer's time is more valuable than a tester's time, and not all defects require debugging, and there is always a trade-off for time a tester spends debugging (it generally depends on the type of defect). But, in general testers engaging in debugging is a good thing because it brings testers and developers closer together and increases a tester's credibility.

So, for testers wanting to increase their 'system' knowledge I would highly recommend Code: The Hidden Language of Computer Hardware and Software.