Category Archives: Software Design

Microservice-Based System

Motivation:

You want to use microservice architecture for your system but you are not sure whether your design does follow microservice style.

You need to explain your microservice-based design to your client or manager.

You need to evaluate a system against microservice architecture style.

Information:

A microservice-based system contains 2 main parts: a user interface and a collection of APIs (or web services or just services).

[A diagram shall be added here.]

The user interface can be multiple web pages or single web page or mobile native application or Windows native application.

The user interface can be implemented using ASP.NET MVC or React or Angular or Android SDK or iOS SDK or even ASP.NET Web Forms or WordPress.

Each API must have its own database, must be deployed independently of other APIs, must support automation testing and automated deployment, must be able to be scaled horizontally, can be implemented using preferred technology stack, and should focus on a single business domain.

Each API database can be a relational database (MS SQL, Oracle, mySQL) or noSQL database (MongoDB, Cassandra).

These APIs can be implemented using .NET Framework 4.8 or .NET 6 or Spring Boot (Java) or Node.js or Golang or even WordPress.

These APIs often share an identity provider that in turn is often a specific API too.

These APIs often share several utilities (e.g. notification service, file service, payment service) that in turn are often specific APIs too.

These APIs can be grouped into API Gateways for easier authentication and authorization control. The API Gateways can be implemented using using .NET Framework 4.8 or .NET 6 or Spring Boot (Java) or Node.js or Golang or even WordPress.

These APIs can also share data with one another using a message broker (i.e. message queues). These message queues can be implemented using a relational database (MS SQL, Oracle, mySQL) or noSQL database (MongoDB) or a distributed event streaming platform (Kafka, RabbitMQ).

 

 

Why Select Microservice Architecture for Your System?

Motivation:

You need to decide whether to use microservice architecture for a new system or for modernizing a legacy system.

Suggestions:

A. Why select microservice architecture for your new system?

Reason 1: You want to have several independent development teams.

Reason 2: You want or your client wants to have a faster and modern UI (i.e. SPA) that is totally decoupled from the other parts of the system.

Reason 3: You want or your client wants that a part of your system (e.g. user store and authentication) can be shared among or reused by multiple different systems.

Reason 4: You want or your client wants your system to be able to scale out easily later.

Reason 5: You want or your client wants that some parts of your system can be revised or extended or replaced easily later.


B. Why migrate your legacy system to microservice architecture?

Reason 1: You want to have several independent development teams.

Reason 2: You want or your client wants to have a faster and modern UI (i.e. SPA) that is totally decoupled from the other parts of the system while the old technologies (like ASP.NET Web Forms or WordPress) cannot provide it.

Reason 3: You do or your client does have performance or scalability issue with the legacy system.

Reason 4: You find that is too difficult to add a new feature to the legacy system because it is too complicated.

Reason 5: You want or your client wants that some parts of your system (e.g. user store and authentication) can be shared among or reused by multiple different systems.

Reason 6: You want or your client wants your system to be able to scale out easily later.

Reason 7: You want or your client wants that a part of your system can be revised or extended or replaced easily later.


C. Here are my suggestions based on estimated development effort and a number of system users.

For a new small project (3-month effort, less than 1,000 users) I always recommend that we use any simple solution that works (e.g. WordPress, Magento, Salesforce LWC, ABP).

For a new medium or large project (2-year effort, more than 20,000 users) I recommend that we use a microservice-based and SPA solution.

For a legacy project I think that we do need a really “good” reason to migrate it to microservice architecture first.

Maybe your client wants to provide a modern SPA for their users.

Maybe the number of users grows to 1,000,000 and you do have a performance or scalability issue.

 

Topic 16 – Advanced Software Design

Why do I need to learn about advanced software design?
I think that I already learned about software design in the Topic 13 – Introduction to Software Design.

Now your task is not just to build a house.  Your task is to build a city. Now you will create very complicated software. You are responsible for creating a software system containing about 10,000 classes or functions for 5,000 people to use in 15 years. The maximum system downtime must be less than 5 minutes per year.

Image that you have to create a system that serves millions of users simultaneously like Facebook or YouTube or Amazon or Office 365 or GMail. Are you comfortable with building one.

Image that you are tasked to create a web framework for developers to extend such as ASP.NET or Yii or React. Are you confident in creating one?

If you are not sure how to fulfill these tasks then probably, you should learn how other people crafted similar systems and adapt their experiences to your case. Advanced software design introduces knowledge and tools to you so that you can begin to build your own complicated software.

What can I do after finishing learning advanced software design?

You will know how to design a complex software system that satisfies not only functional requirements but also security, modifiability, scalability, reusability, extensibility and reliability requirements.

That sounds interesting! What should I do now?

Advanced software design requires a lot of reading. Please do review the software design knowledge introduced to you in the Topic 13 – Introduction to Software Design first.

Nowadays software can be applied to many fields. Each of them requires specific advanced software design knowledge. In this topic, we only focus on enterprise software due to its popularity.

Before you design a complicated system you must thoroughly  understand its sophisticated requirements. This is a critical step when building a large system.

Please read this David C. Hay (2002). Requirements Analysis: From Business Views to Architecture. Prentice Hall PTR book to learn how to elicit, analyze and document requirements for an enterprise system.

After that please read this Philip A. Bernstein and Eric Newcomer (2009). Principles of Transaction Processing. Second Edition. Morgan Kaufmann book to learn about transactional processing principles and techniques.

After that please read
– this Eric Evans (2003). Domain-Driven Design: Tackling Complexity in the Heart of Software. Addison Wesley book, and
– this Jimmy Nilsson (2006). Applying Domain-Driven Design and Patterns: With Examples in C# and .NET. Addison-Wesley Professional book, and
– this Dino Esposito and Andrea Saltarello (2014). Microsoft .NET: Architecting Applications for the Enterprise. Microsoft Press book, and
– this Vaughn Vernon (2013). Implementing Domain-Driven Design. Addison-Wesley Professional book to learn how to leverage domain-driven design approach to reduce system complexity.

After that please read
– this Mark Endrei et al. (2004). Patterns: Service-Oriented Architecture and Web Services. IBM Corp book, and
– this Sam Newman (2021). Building Microservices: Designing Fine-Grained Systems. O’Reilly book, and
– this Sam Newman (2019). Monolith to Microservices – Evolutionary Patterns to Transform Your Monolith. O’Reilly Media book, and
– this Cloves Carneiro and Tim Schmelmer (2016). Microservices From Day One. Apress book to learn how to design microservices.

After that please read  this Martin Kleppmann (2016). Making Sense of Stream Processing. O’Reilly Media book to learn how to leverage event sourcing and stream processing to design software.

After that please read this Ian Gorton (2022). Foundations of Scalable Systems – Designing Distributed Architectures. O’Reilly Media book to learn how to design scalable software systems.

Terminology Review:

  • Enterprise Applications
  • Enterprise Systems
  • Transaction Processing
  • Domain-Driven Design
  • Factory
  • Repository
  • Microservices
  • Command Query Responsibility Segregation (CRQS)
  • Event Sourcing
  • Stream Processing
  • Event-Driven Architecture
  • Serverless

After finishing learning this topic please click Topic 17 – Calculus to continue.

 

Topic 13 – Introduction to Software Design

Why do I need to learn about software design?

What will you do if you are asked to build a house?
You will need to sketch its first and build the house based upon the sketch. Otherwise you may build a house that may collapse in a few weeks or cannot be decorated due to errors.

The situation is similar when you create software. You need to plan how you will build it first by deciding how many components and objects will be used for constructing to solve at least a core problem, what are their responsibility, how they work together, how data will be organized, how data will be flowed within these components, how users will interact with your application, how these components will be deployed.

Software design knowledge will guide you how to do these tasks.

What can I do after finishing learning software design?

You will know how to create a design for an application including static and dynamic structure, data organization, business processing workflows.

Is is really useful? I feel that you can write the code right after having the requirements and I could refactor my code when needed.

That’s great if you can do it like that. You may just return to this topic

(i) when you do not know how to write the code for a feature or

(ii) when you cannot refactor your code because only a small change breaks the whole application or

(iii) when you write a software system together with 20 other developers and you do not know how to integrate results of all the developers into one solution or (iv) when you software system serves 20 users simultaneously very well but it stops when serving 2,000 users simultaneously and you do not know how to fix it.

Alright! What should I do now?

Software design requires a lot of reading. Each application type (enterprise systems, games, intelligent systems) require specific design knowledge. At this point we focus only on the basic elements of software design.

In order to get familiar with software design please read these 3 books below in parallel:
Grady Booch et al. (2005). The Unified Modeling Language User Guide. Addison Wesley Professional
Craig Larman (2004). Applying UML And Patterns. 3rd Edition. Prentice Hall
Robert C. Martin (2003). Agile Software Development – Principles, Patterns, and Practices. Pearson

After that please read this Erich Gamma et al (1994). Design Patterns Elements Of Reusable Object Oriented Software. Addison-Wesley Professional book.
Please focus on the Motivation section of each pattern first. You can skip a pattern if the problem presented in the Motivation section is not relevant to your situation.

After that please read
– this Frank Buschmann et al. (1996). Pattern-Oriented Software Architecture: A System Of Patterns. John Wiley & Sons Ltd book, and
– this Deepak Alur, Dan Malks and John Crupi (2003). Core J2EE Patterns: Best Practices And Design Strategies. Prentice Hall PTR book, and
– this Martin Fowler et al. (2002). Patterns Of Enterprise Application Architecture. Addison Wesley book.

After that please read
– this Meilir Page-Jones (1988). The Practical Guide to Structured Systems Design. Pearson Education book, and
– this Bertrand Meyer (1997). Object-Oriented Software Construction. Prentice Hall book, and
– this Grady Booch et al. (2007). Object-Oriented Analysis and Design with Applications. Pearson book, and
– this David Budgen (2003). Software Design. Pearson book and this David Budgen (2020). Software Design. CRC Press book
to learn how to design software systematically.

After that please read this Robert C. Martin (2017). Clean Architecture: A Craftsman’s Guide to Software Structure and Design. Pearson Education book to learn how to create a real world architecture for an enterprise system.

After that please read
– this Len Bass, Paul Clements and Rick Kazman (2012). Software Architecture in Practice. Addison-Wesley book to review software architecture aspects, and
– this Paul Clements et al. (2010). Documenting Software Architectures: Views and Beyond. Pearson book to learn how to document an architecture so that it can be used for communicated, built and maintained, and
– this Humberto Cervantes and Rick Kazman (2016). Designing Software Architectures: A Practical Approach. Addison-Wesley Professional book to learn how to create an architecture systematically, and
– this Nick Rozanski and Eoin Woods (2012). Software Systems Architecture: Working with Stakeholders Using Viewpoints and Perspectives. Addison-Wesley Professional book to learn how to apply theory to create an architecture systematically in real world.

Terminology Review:

  • UML
  • Object-Oriented Design
  • Class Diagram
  • Sequence Diagram
  • State Diagram
  • Static Structure
  • Dynamic Structure
  • Design Principles
  • SOLID Principles
  • Cohesion
  • Coupling
  • Design Patterns
  • Software Architecture
  • Architecture Qualities
  • Architectural View
  • Architectural Viewpoint
  • Architecture Pattern
  • Enterprise Patterns
  • Row Data Gateway
  • Active Record
  • Data Mapper
  • Table Data Gateway
  • Table Module
  • Transaction Script
  • Domain Model
  • Structured Design

After finishing learning this topic please click Topic 14 – Software Project Management to continue.