Complexity
by Oleg Sovetnik
Developing complex software systems requires not only programming expertise but also an understanding of various types of complexity that affect design, architecture, and the end-user experience. Some complexities are tied to business logic, others to technical aspects of implementation, and still others to user perception. In this article, we will explore three key types of complexity commonly discussed in the context of creating modern digital products: domain complexity, perceived complexity, and added complexity.
We will focus on analyzing domain complexity, one of the most important and fundamental aspects of successful software development.
Domain Complexity
Domain complexity refers to the complexity associated with the business logic and rules of the domain in which the system operates. This complexity stems from the specifics of the business, the requirements for processes, and the standards to which the system must adhere. It is closely tied to how well developers understand the particular industry and its processes.
Characteristics:
• Complex business rules and processes: Every domain has its own unique rules and exceptions. The more intricate this model, the harder it is to reflect in code.
• Nuances and exceptions: Different business cases require consideration of numerous parameters that depend on the context. For example, in the banking sector, when issuing a loan, factors such as credit history, the client’s current income, and local laws and regulations must be taken into account.
• Compliance with standards: In some industries (such as finance or healthcare), legal and regulatory requirements must be followed, which can be complex and subject to frequent changes.
Example:
In a banking system, the loan issuance process might seem simple: the user requests an amount, and the system makes a decision. However, behind this process lies complex risk assessment models, credit history checks, regulatory requirements, and the bank’s internal business processes. The complexity of these business rules and their proper modeling is the essence of domain complexity.
Perceived Complexity
Perceived complexity refers to how complex a system feels to the end-user when interacting with it. It is directly related to the user interface, system responsiveness, and the ease with which tasks can be performed.
The main goal of most software products is to minimize perceived complexity by providing users with an intuitive interface and easy access to needed functionality. Even if the system handles complex processes behind the scenes, the interface should remain simple and user-friendly.
Characteristics:
• Simplicity of interfaces and UX: Products with well-designed UX allow users to complete complex tasks with minimal effort.
• Clarity and accessibility of functions: It is important for the product’s functions to be logically grouped and easily accessible.
• Speed and predictability of responses: Quick system responses and predictable behavior reduce perceived complexity.
Example:
In mobile applications like Uber or Airbnb, users encounter simple interfaces: choose a destination, pay for the ride, or book accommodation. However, behind these actions are complex processes involving logistics, routing, and transaction handling. These apps make these actions intuitive, minimizing perceived complexity.
Added Complexity
Added complexity refers to the complexity that arises during the technical implementation of the system. It includes architectural decisions such as scalability, distributed systems, high availability, security, and integration with external services. This type of complexity is not directly visible to the user, but it is critically important for the system’s stability, performance, and maintainability.
Characteristics:
• Architectural decisions: For example, microservice architecture simplifies system development but significantly complicates the interaction between its components.
• Scalability: The need to support millions of users and requests can require complex solutions for load distribution and data management.
• Integration with external services: Working with APIs, databases, payment systems, and logistics adds complexity to both development and operation.
Example:
In an e-commerce platform like Amazon, users can easily add items to their cart and complete their purchase. However, implementing such a system requires complex solutions for inventory management, handling millions of transactions, interacting with suppliers, scaling infrastructure, and ensuring data security.
The Interrelationship Between Domain, Perceived, and Added Complexity
These three types of complexity often intertwine:
1. Domain complexity defines the system’s requirements based on business logic. The more complex the domain, the more technical solutions are needed to implement it.
2. Added complexity arises as a result of attempts to implement complex business processes and ensure system reliability. Sometimes technical solutions can introduce unnecessary complexity if the architecture is not well-designed.
3. Perceived complexity depends on how effectively complex processes are hidden from the user. The developers’ task is to create a system that minimizes this complexity for users.
Why Domain Complexity is Important
Domain complexity often becomes the central element that determines the success of a project. If developers poorly understand the business logic or misinterpret the rules, the system may become non-functional or require significant rework. A deep understanding of the domain and its proper implementation allows for the creation of a reliable and effective product.
Moreover, domain complexity often dictates the added complexity of the system. For example, complex business processes may require more intricate architecture, algorithms, and integrations, complicating technical implementation.
In the following sections, we will focus on domain complexity, as it underpins many complex software solutions and has a key impact on the architecture, user experience, and long-term support of the product.
Understanding the three types of complexity — domain, perceived, and added complexity — is crucial when developing software systems. While perceived complexity directly influences the user experience, and added complexity determines the technical aspects of development, it is domain complexity that serves as the primary driver of complexity. In future articles, we will explore in more detail how to effectively manage domain complexity to create efficient, reliable, and scalable solutions.
complexity development