This article also appeared in the November/December 2011 issue of Better Software Magazine
Epistemology is the study of knowledge and knowing. What is knowledge? How can we tell what we know and what we don't? Is observation a valid way of acquiring knowledge? What about reason or feelings?
Since testing is, at its core, a practice of acquiring knowledge about how a piece of software works, some of these questions may sound very familiar. When do we stop testing, knowing that we know enough about the state of this piece of software to do so? How can we separate what we know about the software from what we merely believe?
We think of logic as being the branch of philosophy most closely related to the field of software. Formal logic—mathematical logic in particular—dictates how hardware gates, software control structures, and database queries work. It gives us tools like truth tables and Boolean algebra, which we can then use to analyze possibilities, decisions, or the flow of a program.
However, just as the importance of humans in software is frequently overlooked, so, too, is the importance of informal or persuasive logic. Software creators, software users, and software project managers are people, and the importance of being able to interact with all of them in a reasonable way cannot be overstated. Can you build a case for making a certain technical decision? How about formulating a reasonable approach when it comes to encountering a bug in the wild or justifying that approach later? Informal logic is as crucial to navigating the human and organizational side of making software as formal logic is to interfacing with computers.
"The study of beauty" is the most commonly offered description of aesthetics, but this definition is as superficial as it is glib. Aesthetics addresses how and why we can make meaningful critical judgments on whether or not something possesses beauty, elegance, or value—judgments that are always to some degree subjective.
This all sounds well and good, but what does it have to do with the world of computing? We tend to think of our work as being technical, mechanical, and mathematical; as having cut and dried answers; as being far removed from the subjective worlds of art and music. But, I would argue that our work should exemplify beauty as well, and not just in the areas of design or UI, where it is most obvious. Well-made software exhibits what open source hackers refer to as elegance—a combination of simplicity, grace, and power.
Programs that are well organized and straightforward to understand are better than impenetrable spaghetti code. Interfaces that are clean and easy to use are better than those that are cluttered and require contortions on the part of the user. Study of aesthetics helps one discover and articulate consistent principles behind why code written a certain way is clearer or why organizing an interface a certain way makes things easier for users.
Whether we explicitly acknowledge it or not, philosophy informs the key decisions surrounding software and its creation. Its study hones the skills of reasoning, inquiry, and analysis that are at the core of software testing. Familiarity with philosophy allows one to place software in a larger context and ask critical questions about it—questions as broad as what role one's code plays in society, and as focused as how users will get enough value out of it to make it worth paying money for. Thus, a fundamental understanding of philosophy is an indispensable aid for any software professional.
Check out the other articles in Rick's series on philosophy and software testing: