Software Application Design — Part 2: Creating a Great User Experience
1. Introduction
In today’s complex environments, many layers come between the end user and the developer, especially in medium and large software organisations. It has become enormously challenging for developers to distinguish between genuine business needs articulated by customers and what the application managers, product managers, and system architects want.
To make things even worse, the end user’s requirements, vital for their business, are sometimes eclipsed by divisional, departmental, or personal agendas, feuds, idiosyncracies, and political ambitions.
All these deviations from the ultimate goals, which are providing top-value services at competitive prices, increasing the organisation’s value proposition, and achieving operational excellence, manifest themselves in the product’s design, cost, maintenance, and profitability.
This article will discuss the fundamentals of software application design that allow for a great user experience to emerge. It aims to help developers and software engineers understand what’s essential to the end user and how systems can be designed to suit end-user needs.
Let’s start with a few definitions, but before that, let’s look at what the series covers.
Application Design Series
2. Defining User Experience
2.1 What Is Meant by End-Users
In software applications, the term “end user” refers to the ultimate consumer or beneficiary of the software product. An end user is an individual or entity that interacts directly with the software to perform specific tasks, achieve objectives, or obtain desired results.
The end user is typically the person or entity for whom the software is designed to provide value and functionality. The ultimate objective of acquiring such software is solving a business need.
End users can encompass various individuals with varying technical expertise and specific needs. They may include but are not limited to, customers, employees, or any other stakeholders who work with the software to get their jobs done.
Understanding end users’ preferences, expectations, and usability requirements is crucial in designing and developing software applications to ensure user satisfaction and the product’s overall success.
2.2 What Is a Software Service
In software applications, a “service” refers to a modular and self-contained unit of functionality that performs a specific task or set of these. Services in software applications are often designed to operate independently, providing a well-defined and encapsulated functionality that can be utilized by other parts of the application or external applications through defined interfaces or APIs (Application Programming Interfaces).
The use of services allows for a modular and scalable approach to software design, where different components or modules of an application can interact with each other by invoking the services they provide.
These services can encompass various functionalities like:
2.3 What Is User Experience
In software applications, “user experience” (often abbreviated as UX) refers to a person’s overall experience while interacting with the software. It relates to every aspect of the user’s interaction, including the interface design, usability, accessibility, responsiveness, and overall satisfaction when using the system.
Critical components of user experience in software applications include:
A positive user experience is crucial for the success of software applications, as it can influence user satisfaction, retention, and the overall perception of the software product.
Designing while focusing on user experience involves understanding user needs, conducting usability testing, and iteratively refining the interface and interactions to meet those needs effectively.
In the following paragraphs, we will explore influential user experience factors in more detail.
2. Response Time and Throughput
2.1 System Response Time
Response time is how long a user waits before a request is completed. This metric is tightly coupled with performance and is crucial for creating a great user experience, especially in web applications.
For example, Google ranking algorithms include page speed as a ranking factor in deciding which pages to show in their results. Their rationale is based on empirical evidence showing that a slow-loading page will drive most users away. While enterprise application users may not be able to abandon a slow application, it might impact their ability to do their jobs efficiently.
2.2 System Throughput
Another performance metric closely related to response time is throughput.
In software applications, throughput refers to the rate at which a system or a specific component can process and deliver a certain amount of work over a given period. It measures the software’s efficiency and capacity to handle and complete tasks, often expressed in transactions, processing cycles, or other relevant units.
Throughput is a key performance metric that assesses the ability of a software application to handle a particular volume of workloads within a specific time frame.
Throughput is impacted by:
A great user experience demands decent response times, even during peak load times. But what about varying loads? Is it acceptable to have a dip in the response time on holidays, weekends, or when the number of new users increases significantly? Absolutely not. This opens up a new topic: the scalability of software systems. Scalability requires software systems to handle progressively more load without dramatically increasing cost.
Ideally, we want our software systems to have low response times, low costs, and constant throughput despite occasional but significantly varying loads.
2.3 Designing Systems for Low Response Times
System response times can be improved through the following:
2.3.1 Faster Algorithms
The speed of algorithms directly influences the response times of software systems. Here are vital factors to consider when examining the impact of algorithm speed on response times:
2.3.2 Better Caching
Caching is a technique used in computing to store and quickly retrieve frequently accessed or computationally expensive data to improve overall system performance. Caching helps reduce the time it takes to access data by storing a copy of the data in a location (RAM) that can be accessed more quickly than the source (filesystem).
Caching can be applied in the following cases:
The basic principle behind caching involves keeping a copy of data in a location that allows quicker access than fetching the data from its sources, such as slower storage or a remote server. Here’s a simplified overview of how caching works:
2.3.3 Specialized hardware
Specialized hardware is designed to perform specific operations more efficiently than general-purpose hardware. Load balancers, Hardware Security Modules (HSMs), and Graphical Processing Units (GPUs) are examples of specialised hardware. While none of these can run universal programs like personal computers, they boast much higher performances than the latter with load balancing, cryptographic functions, or graphical operations.
Specialized hardware provides improved performance at a cost:
Pros
Cons
However, specialized hardware comes at a cost:
In some cases, as in payment switches, HSMs are mandated by regulatory rules (PCI). In other cases, where specialized hardware is not mandatory, carefully considering integration challenges and optimization opportunities is crucial to maximize the returns on their investment.
2.3.4 Database Optimisation
Database operations are pretty resource-intensive, and the impacts of poorly written SQL statements or huge non-indexed tables are usually quick to manifest themselves. When performance slumps on production or during a load test, your best bet would be to look for long-running queries on your database.
Database optimization is, therefore, a critical aspect of system design, aiming to enhance database operations’ performance, efficiency, and reliability. Here are vital considerations for optimizing databases in system design:
Effective database optimization in system design involves thoughtful schema design, indexing, query optimization, and advanced techniques like caching and partitioning. Regular monitoring and maintenance are crucial to adapting to changing workloads and ensuring sustained performance improvements.
2.3.5 Profiling and Optimisation
Profiling and optimization are crucial aspects of system design, aiming to enhance performance, efficiency, and reliability. How does that work?
In a series of iterative approaches, software engineers start by running performance tests (or using profiling tools) to identify bottlenecks, resource usage, and areas for improvement. Optimization steps are then taken to remove the bottlenecks and scale where applicable.
Running performance tests before major database, server, or software updates is very common and should be relatively quick with the tools and infrastructure at our disposal today. Performance tests allow immediate identification of performance regression issues and are critical to ensuring a smooth customer experience. Otherwise, performance issues might cause outages as software updates are rolled back.
2.4 Horizontal and Vertical Scaling
Sooner or later, you must upgrade your systems when the number of users passes a certain threshold and response times become unbearably high. As a first step, you can increase the machine resources your application is running on. This is called vertical scaling.
Vertical scaling means more CPUs, larger memories, and faster and more extensive storage. At some point, though, the machines will be at their technological limits, and vertical scaling will not be an option anymore. This is where horizontal scaling comes in.
Horizontal scaling involves adding more machines (or nodes) to a system to distribute the load across multiple instances. You can have multiple load balancers, web, application, and database servers, each handling a portion of the load.
With a distributed design, we have:
The nature of the application and its requirements influence the choice between vertical and horizontal scaling. For example, stateless applications are often more amenable t
3. Up-Time and Availability
3.1 Service Availability
Mission-critical systems typically require nearly 100% up-time. Think of hospitals, supermarkets, or train stations where people try to pay with their bank cards but cannot because the system is down.
It is typical for payment, mobile, and energy networks to serve a significant portion of the market, perhaps up to 20-30% in some cases. Even if the payment network is down for less than an hour, massive damage will be caused simply due to the number of people and businesses that depend on its service to complete their transactions.
Customer experience with software systems is therefore highly dependent on its availability. With today’s technology, it is possible to keep a system running 99.999% of the time, as is typical of most Service Level Agreements (SLAs) today.
3.2 Designing Software Applications for Availability
I remember the buzz it made when one of the global payment switch providers announced it was going to support an Active/Active configuration for its payment switches, with two active nodes, two load balancers, and all the relief that this would bring to banks and payment processors running their payment switch. The complexity that had to be paid to achieve this was acceptable, provided it slashed service downtimes, providing a better customer experience.
Designing a software application for minimal downtime or high availability involves implementing strategies and architectures that minimize the impact of failures and ensure continuous service availability. Here are fundamental principles and practices to achieve high availability:
3.2.1 Redundancy and Fault Tolerance
Redundancy and fault tolerance can be accomplished through distributed architecture. Design the application with a distributed architecture, spreading components across multiple servers or locations to reduce the impact of a single point of failure. Also, Introduce redundancy for critical components, such as load balancers, databases, and application servers, to ensure that backups can take over in case of failure.
3.2.2 Load Balancing
Use load balancers to distribute incoming traffic across multiple servers. This improves performance and ensures that others can handle the load if one server fails or needs to be maintained.
Load balancers operate at different OSI model layers, with Layer 4 (Transport layer) and Layer 7 (Application layer) being the most common.
Layer 4 Load Balancing operates at the transport layer, focusing on routing decisions based on network and transport layer information. Layer 4 Load Balancing utilizes information from the IP header and transport layer protocols (TCP, UDP) and commonly performs load balancing based on IP addresses and port numbers. This type of load balancing is suitable for distributing traffic evenly across servers but lacks awareness of the application layer context. As we shall see in a second, routing based on context allows for smarter, more sophisticated load-balancing techniques.
The pros of this approach are faster processing (as it doesn’t inspect the application layer) and effectiveness for simple, stateless protocols. Its disadvantages lie in its limited understanding of application-specific requirements, which may not be suitable for scenarios requiring more granular control over traffic.
Layer 7 Load Balancing operates at the application layer, making routing decisions based on data from the application payload. This works by analyzing the content of the message, making it more application-aware. Layer 7 Load Balancing can distribute traffic based on specific characteristics such as URLs, cookies, or HTTP headers, providing better support for applications with complex routing needs.
Although more logic would need to be implemented on the load balancer, making for a more complex solution, the overall solution provided by Layer 7 Load Balancers will be more efficient.
3.2.3 Database Replication
Database replication, or database clustering, maintains multiple synchronized copies of the database on different machines. This setup enables failover to a standby database in case of a primary database failure. All major database engines provide replication off the shelf.
3.2.4 Automated Monitoring and Alerting
With many servers, applications, and platforms working in concert to provide the services users want, continuous monitoring is pivotal in the early detection of issues. The monitoring and alerting will be discussed thoroughly in the article on operations.
3.2.5 Rolling Deployments and Blue-Green Deployments
When running large IT systems, it is beneficial to implement rolling deployments, where updates are gradually applied to different system parts while maintaining overall service availability. Avoid deploying multiple changes simultaneously, as this reduces your chances of quickly detecting which change created the issue when things go wrong.
Also, a duplicate environment (green) that can seamlessly switch to the production environment (blue) while maintaining the latter minimizes downtime during updates. This is one significant advantage of distributed systems where one server can be brought down for maintenance at a time when the others can easily handle the load.
3.2.6 Graceful Degradation
When the availability of your services is at the mercy of third-party providers (telecom companies, payment gateways) or legacy systems prone to downtimes, you need a backup plan, which can come in two flavours:
3.2.7 Stateless Architecture
Design services to be stateless, where each request from a client contains all the information needed for processing. Stateless services make distributing requests across multiple servers and recovering from failures easier.
There are use cases, however, when stateless architecture is not very user-friendly. To use the online shopping application as an example, a user with a non-empty cart would be pretty frustrated if a connection problem means they must restart their shopping for that evening with an empty cart.
3.2.8 Cloud Services and Multi-Region Deployment
As a software business owner developing and operating your platforms, you probably are better off outsourcing infrastructure problems to specialized service providers who can do a better job than your teams at a lower cost. With the time and money you save, you can focus on developing your product and business.
This outsourcing is aided by cloud platforms becoming increasingly viable and affordable, distributed across the world’s regions.
3.2.9 Disaster Recovery Planning
Insurance is not vital until a disaster strikes. Disaster recovery planning in software businesses is crucial for ensuring business continuity and minimizing the impact of unforeseen events.
Here are some fundamental principles to guide effective disaster recovery planning:
Disaster recovery planning in software businesses demands a systematic and disciplined approach, incorporating risk assessment, comprehensive documentation, and regular testing to enhance preparedness for unforeseen events.
3.2.10 Failure Testing (Chaos Engineering)
Failure testing, often called Chaos Engineering, is a systematic approach to testing a system’s resilience by intentionally introducing controlled failures. Chaos Engineering involves purposefully injecting faults or disturbances into a system to observe its behaviour under adverse conditions.
The primary goal is to uncover weaknesses, potential points of failure, and areas for improvement in a controlled environment.
Failure testing (Chaos Engineering) is helpful for testing system reliability, as the following shows:
3.2.11 Stress Testing
Stress testing is a testing technique that evaluates how a system or component performs under extreme or abnormal conditions.
Stress testing involves subjecting the system to conditions beyond its standard operational capacity, such as high user loads, peak traffic, or resource limitations, to assess its stability and identify potential points of failure.
Why is stress testing helpful for testing system reliability?
4. Software Platform Reliability and Stability
4.1 What Is Platform Stability?
A stable software platform preserves a high standard of service quality during peak load times. Platform stability can be seen in adequate response times and minimal downtimes due to faults or maintenance.
The number of times you breach the Service Level Agreements (SLAs) per unit of time tells you how stable your platform is.
If the end user’s first wish is to have access to their services without interruption (platform availability), their next wish is that this service is stable and of good quality. If your software offers mission-critical services, users want predictability, primarily when their businesses depend on it. When safety is an issue, they also want top reliability, which we discuss next.
4.2 What Is Platform Reliability?
A reliable software platform breaks less often than an unreliable one. What is precisely meant by “broken” in this context depends on the software, the business, the SLAs, and the client. A reliable car will get you from A to B without breakdowns. Reliable software gets you through peak load times without outages. High reliability leads to high availability and stability.
Reliability can be measured by the number of breakdowns per unit of time, cycles, operations, or other units. A “breakdown” can be hard to define in complex solutions involving many platforms, where some have a more immediate and visible impact than others. Here again, the SLA terms might come into play.
4.3 Improving Platform Reliability and Stability
You can improve platform reliability through redundancy. On the other hand, stability can be enhanced with robust designs. For example, the reliability of a storage device can be vastly improved through a “redundant array of independent disks” or RAID. Its stability can be enhanced through smart disk operating systems and early warning mechanisms.
Improving reliability through redundancy can be expensive, making the solution costlier and more complex; you must carefully weigh the costs and benefits. At some point, the law of diminishing returns starts to apply quite heavily.
5. Visual Design and Aesthetics
5.1 Marketing Made Easy
Aesthetics greatly influence a prospective buyer’s decision to purchase the software. A visually appealing design gives buyers the impression that the software creators took their time putting their product together, trying to create something beautiful. It also provides the impression of modernity and progress.
While aesthetics alone may not help much when software providers fill a demanding Request for Proposal (RFP), unappealing software products might not even make it to that stage, all else being equal. While the latter (all else being equal) is rarely true, customers, when given a choice, will always prefer a good-looking design rather than one focusing solely on functionality.
5.2 Aesthetics and Engagement
Simple, responsive, consistent in style, and aesthetically beautiful software applications encourage end users to keep using them, exploring their functionality and looking at ways to improve them with enhancements or additional functionality.
The opposite is true for applications that are difficult to navigate, inconsistent, slow, or poorly designed. Users will find ways to avoid using them by, for example, creating bespoke front-ends and connecting them to the backend via APIs if these are supported.
5.3 Aesthetics Behind Nielsen’s Usability Heuristics
Nielsen’s Usability Heuristics primarily focus on general principles for usability, and while they touch upon aspects of aesthetics indirectly, they are not explicitly designed to address aesthetic considerations. However, with some creativity, one can provide insights into how some of Nielsen’s Usability Heuristics may relate to design aesthetics:
Informal Education, Soft Skills, and Timeless, Universal Topics You Often Miss at Engineering School
6. User-Friendliness
“User-friendly design” in software applications refers to the intentional and thoughtful creation of interfaces and interactions that prioritize the needs, expectations, and ease of use for the end-users. A user-friendly design aims to provide a positive and efficient experience, allowing users to interact with the software in a way that is intuitive, enjoyable, and effective. Here are key aspects and characteristics associated with user-friendly design:
6.1 Intuitiveness
User-friendly interfaces are intuitive, meaning users can easily understand how to navigate and interact with the software without extensive training or guidance.
6.2 Efficiency
Design considerations are made to streamline workflows and tasks, minimizing the number of steps and interactions required to accomplish everyday actions. This efficiency is crucial for user satisfaction and productivity.
6.3 Consistency
Consistent design elements, such as navigation patterns, terminology, and visual styles, contribute to a cohesive and predictable user experience. Users should be able to transfer their knowledge from one part of the application to another.
6.4 Feedback and Communication
User-friendly designs provide clear and timely feedback to users about their actions. This includes visual cues, messages, and responses that help users understand the system’s status and the outcome of their interactions.
6.5 Error Prevention and Recovery
Design considerations include mechanisms to prevent errors and guide users from making mistakes. In the event of errors, user-friendly designs offer clear error messages and pathways for recovery.
6.6 Flexibility and Customization
User-friendly software often allows users to customize their experience to some extent. This may include preferences for layout, themes, or other personalized settings that enhance the user’s comfort and engagement.
6.7 Clarity and Readability
Text, graphics, and other visual elements are designed with clarity and readability. Well-organized information, legible fonts, and appropriate contrast contribute to a user-friendly reading and navigation experience.
6.8 Accessibility
User-friendly designs consider accessibility principles to ensure that the software is usable by individuals with diverse abilities. This includes considerations for disabled users, such as providing alternative text for images or accommodating screen readers.
6.9 Simplicity and Minimalism
User-friendly interfaces often embrace simplicity and minimalism, avoiding unnecessary complexity. This makes the interface cleaner and reduces the cognitive load on users.
6.10 User Feedback and Iteration
User-friendly design is an iterative process that gathers user feedback and incorporates improvements based on their experiences. Continuous refinement ensures the software stays in tune with user needs and expectations.
7. User Behavior Analytics
User behaviour analytics (UBA) improves the web application’s user experience (UX). UBA provides valuable insights into their preferences, pain points, and overall behaviour by collecting and analysing data on how users interact with your website or app. This information can then be used to make data-driven decisions that directly improve the UX and user satisfaction.
Here are some specific ways UBA helps improve web app UX:
7.1 Identifying Pain Points and Friction
7.2 Personalizing the user experience:
7.3 Optimizing conversion rates
7.4 Enhancing engagement
7.5 Building Better Products
UBA empowers businesses to make data-driven decisions that directly impact the user experience. Understanding how users interact with your web app and addressing their needs can create a more engaging, enjoyable, and successful user experience.
Here are some additional benefits of using UBA for web app UX:
In conclusion, UBA is a powerful tool that can significantly impact your web application’s success. By leveraging its insights, you can create a user experience that is functional, efficient, enjoyable, and engaging for your target audience.
8. Final Words
This article summarised the main factors that impact user experience and how they influence the design of a software system. The aim is to ensure these factors always have a high priority and visibility at every level of the value generation stream.
9. Further Reading
- Great video on system design.