Why you should solve complex problems using Systems Design

Photo by picjumbo.com: https://www.pexels.com/photo/white-printer-paper-196645/

I design, implement, and maintain systems using hardware, software, and network applications in my day-to-day work. The roles for this are called systems designer (design) and systems engineer (implement and maintain) in the ICT domain.

I focus mainly on operational technology (OT), which means it is technology fit for purpose. Some of my work also occurs in the information technology (IT) domain, causing me to jump between them.

It is quite a rewarding industry to work in, but it can be very challenging due to the complexity at scale. After my most recent project, I was reminded of the power of a structured design approach, which prompted me to write this post.

What is systems design?

A software and hardware systems design project usually starts with questions like the following:

  • What should be done to get the Commercial Off-The-Shelf (COTS) System A to operate and integrate into the operational custom System B?
  • How can we improve the workflow efficiency of the operators/users?
  • System C has now reached its end of life. How can it be replaced with a suitable and product-supported alternative?

The list goes on, but this is where Systems Design analyzes and solves the problem.

System design is the process of defining the elements of a system such as the architecture, modules and components, the different interfaces of those components and the data that goes through that system. It is meant to satisfy specific needs and requirements of a business or organization through the engineering of a coherent and well-running system.

What Is System Design? – Definition from Techopedia

Systems design, therefore, provides a systematic approach to solving complex problems. This also means that it is not only limited to a specific domain but can be applied to multiple disciplines involving hardware, software, people, processes, and data.

An example is human-centered systems design, for which I highly recommend reading the article: What the %*$# Is Systems Design? by Deirdre Cerminaro.

The structured approach

The core to solving complex problems using systems design is the structured approach. It is like a magnifying glass or binoculars that help you navigate a field of view that is in front of you and expose things invisible to the naked eye. This is needed due to the complexity of the underlying component interactions.

A system is never the sum of its parts, its the product of their interaction.

Russel Ackhoff

The structured approach can come in many different forms. However, each methodology needs to understand the component parts and their subsequent interaction with one another. After acquiring a base understanding of the system and establishing the problem, you can start designing, implementing, verifying, and deploying a solution.

The list below elaborates on the systematic approach I like to use¹:

  1. System Understanding: Gain a deep understanding of the existing system (if any) or the context in which the problem exists. This involves understanding stakeholders, processes, data flows, and external factors.
  2. Problem Identification: Clearly define the problem or challenge you’re trying to solve. Understand the requirements, constraints, and objectives.
  3. Requirement Analysis: Gather and analyze stakeholder requirements to consider all perspectives. Prioritize requirements based on their importance and impact.
  4. Conceptual Design: Develop high-level concepts or architectures that address the problem and meet the requirements. Explore different approaches and evaluate their feasibility.
  5. Functional Decomposition: Break down the system into smaller, manageable components or modules based on functionality. Define the interfaces and interactions between these components.
  6. Technical Design: Dive deeper into each component and design the technical details, including algorithms, data structures, and technologies to be used. Consider scalability, performance, security, and other technical aspects.
  7. Prototyping: Build prototypes or proof-of-concepts to validate the design and gather feedback early in the process. This helps identify potential issues and refine the design before investing in full-scale development.
  8. Integration Planning: Plan how the individual components will be integrated into the system. Define protocols, APIs, and data formats for seamless communication between components.
  9. Testing Strategy: Develop a testing strategy to ensure the system functions correctly and meets the requirements. This includes unit testing, integration testing, system testing, and acceptance testing.
  10. Deployment Planning: Plan the system’s deployment, considering factors such as infrastructure requirements, deployment environments, rollout strategy, and potential risks.
  11. Monitoring and Maintenance: Define mechanisms for monitoring the system’s performance, detecting issues, and applying updates or patches as needed. Establish procedures for ongoing maintenance and support.

By following these steps in a systematic manner, you can effectively solve complex problems using systems design methodologies. It is also important to consider the following points when traversing the above steps:

  • Document the design, architecture, implementation details, and operational procedures throughout these steps to ensure clarity and facilitate future maintenance and knowledge transfer.
  • Establish a feedback loop to continuously gather feedback from users and stakeholders, monitor system performance, and identify opportunities for improvement. This feedback creates an opportunity to iterate on the design and make incremental enhancements.
  • Transfer knowledge from the design team to the development team and other stakeholders involved in the project. This helps ensure everyone understands the system design and their respective roles.

Why you should start with design

Now that we know what systems design is and what the systematic approach entails, why should you start with design and not just build things?

Systems design encourages a holistic view of the problem, considering its individual components and their interactions and interdependencies. By understanding the system as a whole, you can identify potential bottlenecks, inefficiencies, and unintended consequences more effectively.

In startups, many people try to keep it lean and churn out a working prototype as fast as possible, but when working with large systems, I’ve seen the significant impact of systems design. Some of the advantages are¹:

  • Scalability: A well-designed system can scale to accommodate growth in data volume, user traffic, or other factors.
  • Flexibility and Adaptability: Systems design enables flexibility and adaptability in response to changing requirements or environments. Modular design principles allow for more straightforward modification and extension of the system without disrupting other components.
  • Efficiency and Performance: Systems design involves considerations such as resource allocation, data structures, algorithms, and concurrency management to ensure optimal performance.
  • Reliability and Resilience: By incorporating redundancy, fault tolerance mechanisms, and disaster recovery strategies, you can minimize downtime and ensure continuous operation even in adverse conditions.
  • Maintainability and Manageability: Well-designed systems are easier to maintain and manage over their lifecycle. Systems design emphasizes modularity, encapsulation, and separation of concerns, making debugging, upgrading, and troubleshooting individual components easier.
  • Cost-Effectiveness: Investing in systems design upfront can lead to long-term cost savings by avoiding costly rework, downtime, or performance bottlenecks later.
  • User Experience: Systems design incorporates user-centric design principles to ensure that the system meets the needs and expectations of its users.

The advantages are not limited to the list above, but the core message is to think before you build. Systems design is an incredible tool to enable such thinking. This will ensure the points listed above become much easier down the implementation road.

Summary

Systems design can assist one in thinking big picture in multiple domains.

It identifies and designs components and their interactions to solve business problems. 

Due to the complexity of such business problems, systems design provides a systematic approach to thinking about and deconstructing problems in a repeatable way. 

Finally, structured thinking (designing) leads to a more efficient, scalable, and maintainable system.

References


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *