“Programmers rate themselves almost exclusively by these two rubrics: how challenging is the field and toolset, and how virtuoso are their talents.”—Alan Cooper
“Let us change our traditional attitude to the construction of programs. Instead of imagining that our main task is to instruct a computer what to do, let us concentrate rather on explaining to human beings what we want a computer to do.”—Donald Knuth
“Design and programming are human activities; forget that and all is lost.”—Bjarne Stroustrup
The Need for Refactoring
Both software engineers and UX professionals can find themselves in the position of having to modify a system that has evolved without strategic planning rather than resulted from requirements?driven design. When faced with a situation in which we are trying to improve a user experience without adding new functionality, we can apply refactoring, a common approach in software engineering. Martin Fowler, coauthor of the book Refactoring: Improving the Design of Existing Code, defines refactoring as follows:
“…changing a software system in such a way that it does not alter the external behavior of the code yet improves its internal structure…you are improving the design of the code after it has been written.”—Martin Fowler
Consider an object-oriented system that software engineers have repeatedly modified to meet a variety of different needs. An organization’s ever-changing demands on software engineering to make changes to the system’s code can result in software engineers’ taking different approaches at different times to meet short term needs. As a result, variable and method names may have become inconsistent. In such a case, when the time comes for engineers to add new functionality to the system, they are likely to find that the structure of the code makes it difficult to do so.
While the engineers could add the new functionality without refactoring the code, they may judge that changing the object model would make the code more coherent and easier to modify in the future. At the same time, bringing consistency to the variable and method names would make the code much more readable, making it easier for other engineers to understand how the code works. While none of these changes would add functionality to the system, they would make it easier to do so in the future. More important, these changes would improve the user experience of the software engineers who are working on the system!
When UX professionals refactor a user interface, we identify usability problems, refine the user interface’s look and feel, and attempt to improve users’ performance, without changing the software’s essential functionality. Our goal is to ensure that, when using the software, users are able to develop a coherent mental model of how the software works. We support users’ understanding of the software by making its user interface consistent and predictable. Further, we want to be able to add new functionality in the future, without forcing users to change their mental models significantly.