As a software engineer, I am convinced that design is one aspect that is often always misunderstood or taken lightly. It depends on who you ask and their perspective on design. So I’ll pause a bit and encourage you to think about what is your understanding of “good design”? What does “good design” even look like?
If you answered the above questions, now ask yourself — what is the difference between “design” and “good design”?
Good Design vs —
I realized when I was studying software engineering in college that I never asked myself the obvious question when it came to designing complex systems; that is, What does “good design” look like?
For a long time, my understanding of design was basic. So very basic like ordering a pumpkin spice latte from Starbucks. I thought of design as a prototype in the sense that it addresses the needs of the client or solves a particular problem by transforming our thoughts and ideas into objects. But as I read more white papers on software designs and with some experience in the field of Human-Computer Interaction (HCI), I realized communication is the key to good design.
I am going to highlight and list my top 2 perspectives on software design, explain how it goes hand in hand with software engineering, and share my experience building technical software products at Groupon.
- Design as the Central Focus of Software Engineering
My inspiration for this title comes from a research paper written by Richard N. Taylor and André van der Hoek on software design and architecture. The paper explains key aspects of research-focused design illustrating why design should be a principal focus.
As I highlighted earlier, communication is an important aspect of good design, It is important that we design software products in such a way to accommodate the needs, capabilities, and behaviors of users with regard to the components and functions of the software system.
From a design standpoint, I emphasize how relevant it is for components to be visible for good design and that they must communicate the correct message, indicating what actions are possible, what is happening, and what is about to happen. This is especially true for any software product; users should not have to guess what they can and cannot do with the system. When users have to guess, this is an instance of bad design.
Don Norman proposes the “Norman door,” a concept forewarning designers who begin to slip toward bad design. Don explains that if you ever come across a door that forces you to guess whether to push or pull the door, then the design is inherently flawed. The door in this case is called the Norman door.
At Groupon Coupons, our focus is to keep design intuitive while being simplistic. Just like the Norman door, software products are very similar. When we are working on any design feature, we try and make sure that it does not pressure the user to continuously guess on how to navigate the system. This is equivalent to entering an incorrect password and receiving a popup. We must communicate the correct message at every step of the user journey.
This brings me to my second point —
2. Participatory Design in Agile and Test-driven Development Process
My inspiration for this title comes from a research paper written by Karlheinz Kautz on “Participatory Design Activities and Agile Software Development.” The paper focuses on the contextual analysis of how users participate in the Agile development process.
In Groupon Coupons, we prefer Agile methods because they involve the user throughout the iterative development process. This promotes maximum customer satisfaction and welcoming changing requirements even late in the development cycle in order to meet the user’s needs.
The test-driven development complements Agile making it easier for beta testing software after each sprint. This allows teams to gain valuable feedback early in the project and the ability to make changes as needed.
Once the team is sure the software design satisfies the users’ needs, is intuitive and simplistic, and provides feedback at every step of the way, the design is on the right track to enhance the user experience. Otherwise, as the saying goes, “Complexity breeds complexity.”
Bad design in software engineering, can come from technical limitations and constraints of the system, but more often comes from humans not considering the user as they design software components. When we design a software product that communicates clearly to the user and enhances their performances, we can be sure that we’re doing something right. After all, the focus of design should be simple, user friendly, easy to use as well as easy to understand. It should communicate what the object is supposed to do, takes care of planning, and an understanding of how people behave for a good user experience.