Welcome to the Fundamentals of Software Testing course, This is the course that covers everything that you need to know about software Testing in the IT industry or everything any software tester should be aware of. In this course you will learn all the fundamentals that you need to know about Software Testing from basics to more advanced concepts, so by the end of the course you will have a thorough idea of what actual software testing is and how software testing is carried out in real life IT projects.
Welcome to the Fundamentals of Software Testing course, This is the course that covers everything that you need to know about software Testing in the IT industry or everything any software tester should be aware of. In this course you will learn all the fundamentals that you need to know about Software Testing from basics to more advanced concepts, so by the end of the course you will have a thorough idea of what actual software testing is and how software testing is carried out in real life IT projects.
if you have been searching for a comprehensive, Easy to follow and well-organized, and practical course that takes you from zero to hero then this is the right Software Testing course for you.
no prior knowledge of Testing is needed to take this course. Everything you need is right here so you don't need to jump back and forth between the random tutorial.
We will start with understanding the Software Testing phase of SDLC, what activities are part of this phase, and all the challenges of the testing phase.
then will move towards Testing in deep where we will understand the basics of testing including different testing methods, Different Testing levels and then we will cover the different types of testing,Course Curriculum :
Software Design and Architecture Phase of SDLC :
Software Design and Architecture Phase
Why Software Design and Architecture phase is most important in SDLC
Challenges of Software Design and Architecture phase.
Software Design :
What is Software Design
What is called a good Software Design
Software Design Principles - SOLID Principle of SDLC
Other Design Principles
Software Design Patterns
High-Level Software Design Diagram
Low-Level Software Design Diagram
UI UX Software Design
Wireframe Software Design
High-Fidelity and Low-Fidelity Software Design
Database Schema Design Diagram
Software Architecture :
What is Software Architecture
What is called a good software Architecture
Architecture Patterns
Monolithic Software Architecture
Layered Software Architecture
Tiered Software Architecture
Microservices Software Architecture
Serverless Software Architecture
Event-Driven Software Architecture
UML Unified Modelling Language
Structure Diagrams
Class Diagram
Component Diagram
Deployment Diagram
Object Diagram
Package Diagram
Profile Diagram
Composite Structure Diagram
Behavioral Diagrams
Use Case Diagram
Activity Diagram
State Machine Diagram
Sequence Diagram
Communication Diagram
Interaction Overview Diagram
Timing Diagram
along the way, I will explain each and every concept involved in Software Design and Architecture we will learn what, why, and how each concept is..
In this course, I assume you know absolutely nothing about Software Design and Architecture, and that's perfectly fine because I am going to cover software testing from scratch.All these things we will learn via the Real Life examples and case studies. All of the above things are covered in just over 14+ hours of high-quality content. This is equivalent to a book with more than a thousand pages. in a very clear and concise manner doesn't waste a single minute of your precious time.
You're not going to get this information in One Place Anywhere over the Web.
And on top of all these, you'll get:
Closed-captions generated by a human, not a computer. Currently, only the first few sections have closed captions but new captions are being added every week.
Offline access: if you are traveling or have a slow connection, you can download the videos and watch them offline.
Downloadable resource
We will learn everything from scratch in this course.
30- Take the course, watch every lecture, and do the exercises, and if you are not happy for any reason, contact Udemy for a full refund within the first 30 days of your enrolment. All your money back, no questions asked. I am a software engineer with decades of experience working in Multinational IT companies. Till now I have taught thousands of students about Software development and the life Cycle.
if you follow along with me in this course, It's my promise to you that you will have end-to-end knowledge of Software testing.
Are you ready to jumpstart your career in Software testing Hit the enroll button and let's get started.
Welcome to my complete Software Design and Architecture Course, In this course you will learn all the concepts that you need to know about Software Design and Architecture from basics to more advanced concepts, so by the end of the course you will have a thorough idea of what Software Design and Architecture is and how the Software Design and Architecture is carried out in the Real life IT projects.
if you have been searching for a comprehensive, Easy-to-follow well-organized, and practical course that takes you from zero to hero then this is the right Software Design and Architecture course for you.
no prior knowledge of Software Design and Architecture is needed to take this course. Everything you need is right here so you don't need to jump back and forth between the random tutorial.
This course is divided into 4 sections
in the first section, we will understand where the software design and architecture fit in the SDLC. we will learn what exactly happens in the design and architecture or prototyping phase of SDLC. who all will be part of it, and what challenges teams can face for software design and architecture in the SDLC.
in the second phase, we will dive deep into what is Software design, Here we will start with what exactly software design is, then Software Design principles including SOLID Design Principles, and then we will get a glimpse of Design Patterns what are they, and in which scenario we can use them. Along with all this, we will understand in detail the High-level design diagram, Low-level design diagram, data flow diagram, UI-UX design, Wireframe design, high-fidelity and Low-fidelity design, and Database schema design.
Everything that comes under the software design will be covered in this section
Then in the third section, we will delve into Software Architecture
what software architecture is, and what is called good software architecture, we will see different Architecture patterns like monolithic, layered, tiered, microservices, and serverless event-driven architecture, everything about software architecture.
then we will understand the famous 4+1 architecture concept which is being followed in modern real-world software development projects.
in the next section, we wi ll learn UML and all the design diagrams of UML in detail. I believe that if you want to be good at software design and architecture then you should be good at UML, hence this section. here we will learn all the UML Design diagrams
In this course, I assume you know absolutely nothing about Software design and architecture, and that's perfectly fine because I am going to cover software design and architecture from scratch.
I am Yogesh and I am gonna be your instructor for this course. I am a software engineer with decades of experience working in Multinational IT companies. Till now I have taught thousands of students about Software development and the life Cycle.
if you follow along with me in this course, It's my promise to you that you will have end-to-end knowledge of software design and architecture. and you will have all the confidence to design and architect the software in real-life IT projects.
Are you ready to jumpstart your career in Software design and architecture? Hit the enroll button and let's get started.
Design and Prototyping
Welcome to the third and crucial phase of the Software Development Life Cycle (SDLC) known as the Design and Prototyping phase.
This phase revolves around the creation of designs and prototypes. Designing involves transforming our requirements or ideas into tangible representations, providing a visual understanding of the final product's appearance, functionality, and real-time operation.
Prototyping serves as a tool or process that enables us to learn and refine our requirements before investing significant time and resources.
In this phase, the input is typically the Software Requirements Specification (SRS) document or the requirements captured in the previous phase.
Now, let's delve into what happens during this phase. Several activities are undertaken in this phase to ensure the successful development of a software system in later stages. Here are some common tasks and considerations during this phase:
Requirements Analysis: This involves analyzing the requirements to understand what the software should do and how it should function.
System Architecture Design: This involves creating a high-level overview of the system, including how different components will interact with one another. here a high level system architecture diagram of the system will be created
Detailed Design: Once the system architecture or high level diagram is in place, we can start with detailed design or Low level design of the system. Here, the focus is on designing each component of the system in great detail and low level diagram of the component will be created
User Interface Design: The design of the software's user interface is created in the form of wireframes ,mock ups considering aspects such as layout, navigation, and visual aesthetics to ensure a user-friendly experience.
Database Design: If the software requires a database, the design of the database schema and data storage structure is created during this phase.
Prototyping: Prototypes are developed to provide a tangible representation of the software's functionalities and user interface , it can be small POCS proof of concept illustrating the application functionalities. These prototypes help gather feedback and validate design decisions.
Testing Strategy: The testing approach and strategy for the software are planned, including the types of tests to be performed and the tools and resources required.
Design Reviews: Regular design reviews are conducted to evaluate the progress, identify potential issues or risks, and make necessary adjustments to the design.
Documentation: Documentation, Each task in this phase can generate the artifacts like High level design diagram , low level design diagrams , Use interface wireframes mock up, Database schema design all design specifications are created also all other relevant technical guides are created like Developers manual ,Design guidelines is created to assist developers, testers, and end-users. and finally Design Review Reports are generated in this phase
Stakeholder Collaboration: Collaboration and communication with stakeholders, including clients, end-users, developers, and testers, play a vital role in ensuring that the design meets their expectations and requirements.
These activities contribute to shaping the software system's design, ensuring alignment with desired functionality, user experience, and technical requirements.
Now let us try to understand who all involved in this phase :
The design and prototyping phase of the SDLC typically involves various stakeholders and roles. The specific individuals involved can vary depending on the project and organization, but here are some common roles:
Business Analysts: Business analysts analyze user requirements, ensuring that the software design aligns with the business needs and objectives. He is the go to person for development team for any clarifications or doubts
System Architects: System architects are responsible for designing the overall structure and architecture of the software system, defining the components, modules, and their interactions.
User Interface (UI) Designers: UI designers focus on creating the visual and interactive elements of the software's user interface, considering usability, aesthetics, and user experience.
Database Designers: If the software involves a database, database designers are involved in designing the database schema, tables, relationships, and data storage mechanisms.
Software Designers/Developers: Software designers or developers play a crucial role in translating the system design into actual software components, following the design specifications.
Testers/QA Analysts: Testers or quality assurance (QA) analysts collaborate during the design phase to ensure that the design is testable, define the testing strategy, and provide feedback on design aspects that might impact testing.
Project Managers: Project managers oversee the design and prototyping phase, ensuring that it stays on schedule, aligns with the project's objectives, and manages stakeholder expectations.
End-Users and Clients: End-users and clients provide valuable input during the design and prototyping phase. Their feedback and requirements help shape the software design to meet their needs and expectations.
You might see in some project the multiple roles will be played by the single person
So these all important stuff happens in this phase , This phase you can say a map for further phases of the SDLC. Success of this phase is crucial for successful project.
The design and prototype phase holds significant importance in the SDLC for several reasons. Firstly, it serves as a visual representation of the system-to-be, allowing stakeholders to review and provide feedback on the proposed design before extensive development efforts. This helps in aligning expectations and reducing the likelihood of costly rework or requirement changes during later stages.
Secondly, the design and prototype phase facilitates early detection of design flaws and usability issues. By creating a prototype, developers can identify potential challenges and rectify them at an early stage, saving time and effort in the long run. Additionally, it enables stakeholders to have a hands-on experience with the system, gaining a better understanding of its functionalities and making informed decisions.
Why Design and prototyping is so important
We have said design prototyping phase is the crucial phase of sdlc .Now its a time to understand why it is so important . there are several reason for this
Requirement Understanding: This phase allows for a thorough analysis of user requirements, ensuring that the software design meets the desired functionality and objectives. It helps to clarify ambiguities and establish a common understanding among stakeholders.
Visualization and Feedback: it serves as a visual representation of the system-to-be, allowing stakeholders to review and provide feedback on the proposed design before extensive development efforts. This helps in aligning expectations and reducing the likelihood of costly rework or requirement changes during later stages.
Risk Mitigation: By creating design specifications and prototypes, potential risks and issues can be identified and addressed early in the development process. This reduces the chances of costly mistakes or rework later on.
Cost and Time Optimization: Investing time in the design and prototyping phase helps identify and resolve design flaws and usability issues early. This saves time and effort that would otherwise be spent on rework during the development or maintenance stages.
Communication and Collaboration: The design phase facilitates effective communication and collaboration among team members, stakeholders, and end-users. Clear design specifications and prototypes help bridge the gap between technical and non-technical individuals, ensuring everyone is on the same page.
Scalability and Maintainability: A well-designed software system is scalable, allowing for future enhancements and modifications. Considerations such as modular design, reusability, and extensibility are addressed during this phase, ensuring easier maintenance and adaptability.
Alignment with Business Goals: The design phase ensures that the software design aligns with the overall business goals and objectives. It allows for evaluation of technical feasibility, cost-effectiveness, and alignment with the organization's strategic direction.
Overall, the design and prototyping phase plays a crucial role in setting the foundation for successful software development. It helps mitigate risks, gather feedback, ensure stakeholder satisfaction, optimize costs and time, and establish a solid framework for development.
Challenge of Design and Prototyping Phase
The design and prototyping phase of the Software Development Life Cycle (SDLC) presents several common challenges or mistakes that need to be addressed and you should be aware of those . Let's explore these challenges:
Insufficient requirements gathering: Failing to gather comprehensive and accurate requirements from stakeholders can lead to design and prototyping solutions that do not meet their needs.
Inadequate user involvement: Not involving end users and stakeholders throughout the design and prototyping phase can result in solutions that don't align with user expectations or fail to address their requirements effectively.
Lack of clarity in design objectives: If the design objectives are not clearly defined, it can lead to confusion and ambiguity during the design and prototyping process, making it challenging to create a suitable solution.
Poor communication and collaboration: Ineffective communication among team members, stakeholders, and designers can lead to misunderstandings, delays, and suboptimal design decisions.
Unrealistic or overly ambitious designs: Setting unrealistic design goals or attempting to implement overly complex features during the prototyping phase can lead to difficulties in implementation and negatively impact project timelines.
Inadequate consideration of scalability and maintainability: Failing to address scalability and maintainability concerns during the design phase may result in challenges when the system needs to handle increased loads or when maintenance and future enhancements are required.
Insufficient testing and validation: Neglecting proper testing and validation of the design and prototype can lead to functional, usability, or performance issues that are discovered at later stages, requiring rework and causing delays.
Inadequate documentation: Failing to document the design decisions, assumptions, and rationale can make it challenging for team members to understand and maintain the design in the future.
Addressing these challenges and avoiding these mistakes is crucial during the design and prototyping phase. this phase is the time to rectify any issues and ensure that the project stays on schedule. By addressing these challenges effectively, organizations can enhance the overall success and quality of their software development projects.
Welcome to this session , in this session let us try to understand what is software design.
It is often said that the only constant in this world is change. Technology is evolving at a rapid pace, and we use numerous software applications on a daily basis. These applications undergo frequent upgrades in design and functionality. whatever you see today in the application tomorrow it will not be same like that . Have you ever wondered how they can accommodate these changes so quickly? The answer lies in their robust and scalable software design.
In this session, we will explore the concept of software design and what is called as a good software design and everything you need to know about it.
Software design is the process of creating a plan or blueprint for the construction of a software system. It involves making high-level decisions about the structure, behavior, and components of the software, including its architecture, modules, interfaces, and algorithms.
it involves defining the methods, functions, objects, and overall structure and interaction of your code to ensure that the resulting functionality meets the requirements of your users.
It is the process of creating a representation of the complete software components and behavior before implementing the actual software.
Some individuals may claim that they have never used design techniques while working on software projects, yet they have successfully developed many software applications. Congratulations to them! However, software development is not just about creating the software initially. It also involves making regular changes and maintaining the software over an extended period.
The quality of software design can be evaluated based on several factors:
How easy was it to make changes to the code?
Did a small code change cause a ripple effect and causing you to change at lot many irrelevant places in the code
Was the code difficult to reuse?
Was the software challenging to maintain after a release?
Did it have a good design, or could the design have been improved?
Was there even a design in place?
Good software design enables you to address all of the above concerns effortlessly. It is not limited to writing code but also extends to expressing ideas about your software to other developers, teams, and clients. Having a well-thought-out design makes your software easier to implement, reduces the need for major changes in the future, and saves you from headaches down the line.
Good software design is Modular, Extensible, Scalable ,Reusable, Maintainable, Robust, efficient and flexible , these are the characteristic of good software design.
Software design typically involves two stages or steps:
Conceptual Design: In this stage, you assemble the software components in a non-technical manner. For example, you may list out all the components and their behaviors, create wireframes, and develop flow diagrams. The focus here is on representing the software in a non-technical way. Common methods used in conceptual design include wireframes, mockups, and component diagrams.
Technical Design: After completing the conceptual design, you shift your attention to the technical aspects. You start considering questions such as how the implementation will be done, how it will interact with servers or databases, and . The technical design phase addresses these questions. Common diagrams used to represent technical design include class diagrams, activity diagrams, sequence diagrams, and state diagrams
many types of diagrams can be used to represent the software design, the diagram which give implementation level details can be a part of the software design diagram . You can make use of UML diagrams to define the software design or you can even come up with your own diagram representing the software design , that is completely fine .
If i want to tell you the difference between software Architecture and Software Design then it will be
software architecture define WHAT and WHERE part of software ,
but Softwre design
This is important statement
software architecture define WHAT and WHERE part of software ,
but Softwre design defines HOW part of software.
During implementation or coding if you have question on HOW to accomplish something then you should refer for Design diagram , in case you dont have any then consider creating one , it will help you a lot.
It's worth mentioning that many people refer to software design diagrams as Low-level Design Diagram because both types of diagrams capture the granular details of how the system will be designed.
Now dont think that software design will be a tough part . you don't need to reinvent the wheel in this process. There are already Design Principles and Patterns defined by those who have encountered design problems in the past . You can simply make use of then in your application design.
In the upcoming session, we will delve into design patterns and principles in more detail.
Software Design Principle- SOLID principle
Welcome to the world of software design , in this session let us try to understand the widely used, Software design principle called SOLID principles.
we have seen software principles and patterns are nothing but the but the time tested solution to the past recurring problem of software design.
"SOLID principles provide a solid foundation for creating software that is easy to understand, , and extend.
hence It is recommended that software teams should make use of those where ever possible and make the software design better.
The SOLID principles are a set of five design principles in software development that help create more maintainable and flexible code. Each principle focuses on a specific aspect of software design and encourages developers to write code that is easy to understand, modify, and extend. Here is a brief explanation of each SOLID principle:
Single Responsibility Principle (SRP): This principle states that a class or module should have only one reason to change. In other words, it should have a single responsibility or purpose. means if you have EmployeeFinance class then it should have responsibility of employee finance only it should not be responsible for creation of employee or updating the employees. other example is. a Customer class should be responsible for managing customer data and not be burdened with tasks like sending emails or processing payments. By separating different responsibilities into separate classes, you can achieve better code organization, reusability, and testability.
Open-Closed Principle (OCP): Software entities (classes, modules, functions) should be open for extension but closed for modification. Imagine a power plug , it is open for extension you can use it to charge your laptop or anything , or you can even use extension box to extend it functionality.
This principle encourages designing software in a way that allows for adding new features or behaviors by extending the existing code rather than changing it.
Liskov Substitution Principle (LSP): The Liskov Substitution Principle emphasizes that objects of a superclass should be replaceable with objects of its subclasses without affecting the correctness of the program. In other words, derived classes should be able to be used as substitutes for their base classes, adhering to the same contracts and behavior. Think of a remote control that works with any TV brand without needing any modifications. Similarly, when inheriting from a base class, the derived class should be able to seamlessly replace the base class without causing errors or unexpected behavior.
Violations of this principle can lead to unexpected behavior and bugs.
Interface Segregation Principle (ISP): The Interface Segregation Principle suggests that clients should not be forced to depend on interfaces they don't use. It promotes the idea of creating specific, focused interfaces instead of having large, general-purpose interfaces. This helps , and also encourages loose coupling between components.
it is like you should not buy something which you dont have need off , if you keep on buying something which you don't need , then the thing keep on accumulating and soon they spoil something which you have desperate need off. Similarly, interfaces should be designed to be specific and focused so that clients can implement only the methods they require. This avoids unnecessary dependencies and reduces the impact of changes. 5. Dependency Inversion Principle (DIP): The Dependency Inversion Principle states that high-level modules should not depend on low-level modules; both should depend on abstractions. This principle encourages the use of dependency injection, where dependencies are provided to a class from external sources rather than being created within the class itself.
In a home automation system, the Home Automation Controller follows the Dependency Inversion Principle (DIP).
Rather than depending on specific electronic devices, it relies on a common interface, IDevice.
The IDevice interface defines the common operations that all electronic devices should have, such as powerOn(), powerOff(), and adjustVolume(). Each electronic device, like the television, the stereo system, and the smart lighting system, implements the IDevice interface and provides its own implementation of these operations.
This allows the controller to control any device that implements the interface, promoting flexibility and easy integration of new devices.
By adhering to the DIP, the system becomes adaptable, future-proof, and capable of managing a variety of electronic devices
So this is all about the SOLID design principle; , I hope i would have make it simple for you to understand. but believe me it is interesting and big topic to learn . can not be covered in mere 5-10 mins session , hence i have complete course on it , if you are interested to learn it thoroughly feel free to enroll for that course.
so conclusion is By following these SOLID principles, developers can create code that is easier to understand, maintain, and extend, leading to more robust and scalable software systems.
Other software design principles
In this session let us have a quick look at the other major software design principles which are often used along with SOLID design principle.
Few other famous principles which you often hear during design and prototyping or in development phase are
DRY (Don't Repeat Yourself): The DRY principle emphasizes that code duplication should be avoided. It suggests that every piece of knowledge or functionality in a system should have a single, authoritative representation. By eliminating duplication, you can improve maintainability, reduce the risk of inconsistencies, and make code easier to change.
KISS (Keep It Simple, Stupid): The KISS principle advocates for simplicity in software design. It suggests that systems should be kept as simple as possible, avoiding unnecessary complexity. Simple designs are easier to understand, debug, and maintain. This principle encourages developers to favor simplicity over unnecessary abstractions or over-engineering.
YAGNI (You Ain't Gonna Need It): The YAGNI principle advises against adding functionality or features to a system until they are actually needed. It encourages developers to avoid speculative or premature optimizations. means sometime what happens is during development developer think that in future this change might come and he make the provis ion in the code to accommodate that change , but in reality that change wont come. Yagni principle recommends to avoid thinking in the future. By focusing only on the requirements at hand, you can avoid unnecessary complexity, reduce development time, and prevent the accumulation of unused code.
Composition over Inheritance: This principle promotes the use of composition (combining smaller components) instead of relying solely on inheritance (creating hierarchical relationships between classes). Composition allows for greater flexibility and code reuse by assembling objects with different behaviors, rather than creating deep inheritance hierarchies that can be inflexible and difficult to maintain.
Law of Demeter (LoD) or Principle of Least Knowledge: The Law of Demeter states that an object should only communicate with its immediate neighbors and not with objects further down the chain. It encourages loose coupling and encapsulation by limiting the knowledge that objects need about other objects. This principle helps reduce dependencies and improves the maintainability and reusability of code.
Separation of Concerns (SoC): The Separation of Concerns principle advocates for dividing a system into distinct and independent parts, with each part handling a specific concern or responsibility. By separating different concerns, such as user interface, business logic, and data access, you can achieve modular and reusable code that is easier to understand, test, and modify.
So this is all about the most used software design principle. I hope you would have got a good understanding of them and at the same time you are equipped with the knowledge on how to start learning software design.
Design Patterns
In this session let us have an overview of the design patterns. What are Design Patterns?
Design Patterns are models of code that solve classic code-level problems. They are solutions to software design problems you can find in a real-world application. A Design Pattern is not a code that is ready to be used in your application, but it is a model that you can use to solve a problem.
so henceforth if someone talks about a specific design pattern then expect a code from him. and if someone is talking about architecture then expect the block-level diagram from him.
In this session, we are talking about design patterns without any coding examples this is an overview session because explaining design patterns can be a complete course in itself. My intention is to make you aware of these concepts and why to use them so that henceforth if you hear them you should not feel lost. and you should get direction on how to explore it further, hence this session.
so coming to design pattern again.
Design patterns are language-neutral, so they can be applied to any language that supports object orientation.
Why and when should we use Design Patterns?
Design Patterns exists to help us, developers. They enable us to **implement tried and tested solutions (**that are also used by other developers) to known problems, this way saving time and effort during the implementation of the code. They also define common words to talk about specific problems, making it easier to communicate, for example, you could say “You can use a factory in this case”, and other developers will know what they need to do.
In 1995, four developers, Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides, collectively known as the 'Gang of Four' (GoF), published the book 'Design Patterns: Elements of Reusable Object-Oriented Software.' This book introduced the concept of design patterns and presented 20+ design patterns. These patterns are widely regarded as the cornerstone for all other patterns and are grouped into three categories:
Here there is a brief explanation of each of the patterns. Those definitions are also from the book ‘Design Patterns’ from the GoF:
Creational Pattern : These patterns provide various object creation mechanisms, which increase flexibility, reuse of existing code, and decoupling the instantiation process from the client code.
Abstract Factory — Create group of related objects.Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
Builder —Build Object step by step. Separate the construction of a complex object from its representation so that the same construction process can create different representations.
Factory Method —creating objects without specifying their concrete classes. Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.
Prototype —Create a copy of fully prepared examples . Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.
Singleton — ****
Structural Pattern These patterns explain how to assemble objects and classes into larger structures while keeping these structures flexible and efficient.
Adapter — Connect things with different interfaces. Convert the interface of a class into another interface clients expect. The adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.
Bridge — It links how an object works to what it does. Decouple an abstraction from its implementation so that the two can vary independently.
Composite — Create a tree-like structure of simple and complex parts. Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.
Decorator — Add features to objects without changing their core. Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.
Facade — It represents the system as a single, simplified interface. Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.
Flyweight —Helps to share small and reusable items efficiently. Use sharing to support large numbers of fine-grained objects efficiently.
Proxy — Represent another object. Provide a surrogate or placeholder for another object to control access to it.
Behavioral Pattern These patterns are concerned with algorithms and the assignment of responsibilities between objects.
Chain of Responsibility — Passes a request through a chain of objects. Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.
Command —Turn a request into an object, ready for action. Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.
Iterator —Access the element in collection one by one Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
Mediator — Simplifies interactions between different classes Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.
Memento —Helps in capturing and restoring the object states Without violating encapsulation, capture and externalize an object’s internal state so that the object can be restored to this state later.
Observer —Notifies classes about the changes in other objects Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
State — The object Alters its behavior when its internal state changes. Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.
Strategy —Encapsulates interchangeable behaviors and allows dynamic selection at runtime. Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
Template Method —Defines the skeleton of an algorithm, letting subclasses override steps. Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. The Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.
Visitor —Adds a new operation to a class without altering it. Represent an operation to be performed on the elem ents of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.
So this is the overview session. but if you want to learn more about these design patterns, feel free to explore them.
High level diagrams
We have seen design and prototyping this phase is all about how you design your application end to end. High level and low level system design are made in this phase.
In this session let us try to understand what is High level diagram and why to use it and what information it represent.
So let us start :
.A high-level diagram, sometimes also referred as system overview diagram or conceptual diagram, provides a broad, abstract representation of a system or software application. It illustrates the major components, their interactions, and the overall structure of the system at a high level. High-level diagrams are often used to communicate the system's architecture to stakeholders who may not have technical expertise.
The primary purpose of a high-level diagram is to provide a holistic view of the system, highlighting its main components and their relationships. It helps stakeholders understand the system's overall design and functionality without getting into detailed implementation specifics. High-level diagrams are valuable for discussions, presentations, and initial planning stages, as they allow stakeholders to visualize and grasp the system's structure and flow.
High-level diagrams often use simple shapes and symbols to represent the major components of the system and their relationships to each other. You can also say it can be block level diagram of the system.
to give you analogy for remembering this concept , then consider a apartment project with 10-20 towers if you take the top view how it will looks like same way for software top view will be captured in this High level diagram . now how much top you go it is up to you hence you can see variations high level diagram.
I have seen few people who actually think that High level diagram is same as of Software Architecture diagram and myself noticed these terms are used interchangeably. but these are not the same concepts . they differ in what information they represent. that we will see in the upcoming session. but just keep in mind that High level diagram is not same as Software architecture diagram.
So let us have a look at the sample High level diagram of the online shopping application.
Just one is this diagram might be missing some of the components that is fine , the intention is to just illustrate you how the sample High level diagram looks like
SO if you see it will start with user hitting our website URL in the browser, he can login with Gmail or Facebook identity, these identities then verified at application side and access will be given to the application, i have not shown the arrow here , but that is okay.
Once user get the access then he can interact with the Front end ui of the application.
Now let us have look at the individual module of our application
we have front end, front end will be develop in the React technology, we will use typescript for coding and bootstrap as a front end UI Library all the applicable thing you can list down here.
then moving to next module that is product management, all the product related data will be managed here , like pricing management, Discount mgmt , Product supplier management. all sorts of product data will be managed in this module.
then we have order mgmt module . which is responsible for all the order related functionality starting from managing the cart to end to end order processing
then application Jobs, Every shopping application needs to background jobs to process the data, so all such jobs will come in this section
then Admin tools : This module focus is on the overall application management and Handling the support related requests from the users. All admin related stuff can go here.
then we have Reporting Module , reporting is crucial module in any of the application , it help leadership to make the inform decision about the product strategies.
so all kind of reports like application reports ,Audit reports will go here.
then we will have metrics , how the users are using our application , what products they are more interested in, application usage metrics all this kind of analytics will be generated here .
so these are all modules which we have. These all things we will try to build up in the C# .NET technologies. Hence you can see i have added it here .
then all the supporting services, concepts , technologies will be listed in the adjacent part of the application modules.
now Few disclaimer
it is not mandatory that you should show your high level diagram like this . Someone might show it like this ,
it is completely fine,
high level diagram is flexible, its up to the designer and architect to what level of details they can include in this diagram so that everyone should get conceptual idea about the system. so how much high you take it is up to designers. Usually High level diagram should include module level information
Currently we are representing entire system in the high level diagram but you can leverage the high level diagram even to represent the single module
I have seen people do make use of component diagram in the high level diagram because the objective of both diagram is almost similar.
People even use High level diagram as a alternative to the software architecture diagram. few people use this terms interchangeably even. there is a slight difference that you will get to know as we progress further.
So this is all about the High level diagram in detail.I hope you would have got the better understanding of what is High level diagram and how it can be designed..
Low Level Diagram
In this session let us have a look at the low level design diagram. Before starting our concrete coding work . it is strongly advised that you first design the low level design diagram of that module.
so let us understand low level design diagram in details :
Low-level design is a detailed description of every module of software. It describes every module in detail by incorporating the logic behind every component in the system. It goes deep into every specification of every system, providing a micro-level design. It focuses on the implementation details and specific interactions between these elements.
Now let us answer how much low level the low level design diagram can be designed , now it is recommended to so that if we give low level design diagram to developer he can straight forward code it .
To explain it further, let's consider the example of a module within a software system. A module can be thought of as a self-contained unit that performs a specific function or task. A low-level design diagram for this module would depict the internal structure of the module, including its sub-components, classes, methods, and data.
In the diagram, you would typically see boxes representing classes or sub-components, along with their associated attributes and methods. Lines or arrows would illustrate the relationships between these elements, such as inheritance, composition, or method calls.
The purpose of a low-level design diagram is to provide developers with a detailed understanding of how the module works internally. It helps in writing the actual code by specifying the classes and their relationships, the data structures, and the methods or functions that need to be implemented.
Low-level design diagrams can also include other implementation details like algorithms, database schemas, or specific design patterns being used within the module. These details aid in ensuring that the design is robust, efficient, and meets the requirements of the software system.
Again if i want to relate it with our analogy of apartment project of 10-20 towers ,now each tower you can say a big module of the system if you go inside and take a cross section of a particular module, what you will see , you will see all its internal structure, where the stairs are , how the rooms are connected , where the common areas is and everything inside you can see right. Same is the case with low level design of software , it can give you that level of micro details
Low level diagrams can include the diagrams like Class diagrams, Activity diagram ,sequence diagram any uml diagram which focus on the structure and behavior of the system at granular level can be low level design diagram.
Here is the sample low level diagram of the online shopping application, which represent all the classes which needs to be created to accomplish the specific functionality.
So this is basically a UML class diagram which is serving as the low level design diagram.
Data Flow Diagram
In this session let us have a look at Data flow diagram, which is being created as a part of the design and prototyping phase.
A data flow diagram (DFD) is a graphical representation of the flow of data within a system. It illustrates the movement of data between different processes, data stores, and external entities. A DFD visually depicts how data is input, processed, stored, and output within a system or business process.
The main purpose of using a data flow diagram is to understand and document the flow of data in a system or process. It provides a clear and concise representation of how data moves through various components of a system, including inputs, processes, data storage, and outputs. Here are a few reasons why DFDs are commonly used:
System Understanding: DFDs help stakeholders and analysts gain a better understanding of how data is processed and transformed within a system. It allows them to visualize the interactions between different components and identify potential issues or inefficiencies.
Requirement Analysis: DFDs serve as a useful tool during requirement analysis. They help in identifying the data requirements for a system, determining the necessary processes, and understanding the relationships between different components. This information is crucial for designing and implementing effective solutions.
Communication and Documentation: DFDs provide a visual representation that can be easily understood by both technical and non-technical stakeholders. They help in communicating complex system structures and processes in a clear and concise manner. DFDs also serve as documentation artifacts that can be referred to during system maintenance or future enhancements.
System Design: DFDs aid in the design phase of a system or process. They assist in identifying the appropriate components and their interactions, defining data flows, and designing efficient processes. DFDs can also help in identifying potential bottlenecks or areas where improvements can be made.
Now let us have a look at the sample data flow diagram of product data flow in online shopping application
Before understanding the flow , few basic things you should know about this diagram which are
Processes: Represented by circles, processes symbolize activities or transformations that occur within the system. They can be manual or automated operations.
Data Flows: Represented by arrows, data flows depict the movement of data between processes, data stores, and external entities. They show how data is input, processed, stored, and outputted within the system.
Data Stores: Represented by rectangles with two parallel lines, data stores symbolize the storage of data within the system. They can represent databases, files, or any other form of persistent data storage.
External Entities: Represented by squares, external entities represent external sources or destinations of data. They can be other systems, users, or organizations that interact with the system being analyzed.
now its a good time to understand the product data flow , so there is the external SAP system which holds the product data , this data now pushed and uploaded and inserted in to staging database. This is a raw data hence it is loaded in staging database where this data processing will happens and the verification of this data will be carried out . whatever invalid data is there that data will be logged as per the logging defined in the system and the verified data will be pushed to the production database from here the data will be available in the application for the user access. this is the sample product data flow .
So this is all about the sample data flow diagram, I hope you would have got the good understanding of the sample data flow diagram how it will created and how to read it
UI UX
While going in the depth of designing the application you would have heard these term ,or buzzwords called UI-UX . these are the concepts or technology you can say which is very famous and used widely to design interactive user application or web interface .
To begin, let me share a fascinating statistic with you. Did you know that 88% of online consumers are less likely to return to a website after a bad user experience? This highlights the crucial role of UI/UX design in capturing and retaining users' attention.
The major Challenge the product teams are facing today is designing interfaces that meet users' needs and enhance their overall experience. This problem is significant because poor UI/UX can lead to user frustration, higher bounce rates, and negative brand perception. On the other hand, a well-designed UI/UX has the power to transform the way users interact with digital products, positively impacting their lives and the success of businesses.
Research shows that every dollar invested in UX brings a return of up to $100. This demonstrates the tangible value that good UI/UX design can bring to businesses. Additionally, research shows that 70% of mobile app users uninstall an app due to poor user experience. These findings highlight the importance of prioritizing UI/UX to ensure user retention and satisfaction.
This much important UI UX for the Software products.
now let us come back to the concept of UI UX
here
UI stands for User interface/UI Design and UX stands for User experience or UX design ,Often there seems a lot of confusion between these two. Are these two term UI and UX are the same or one is just a part of another. we are going to see all this in this session.
so in this session we will going to understand exactly what is UI Design and UX design difference between UI and UX
The UI design is all about the look and feel, the presentation and interactivity. It deals more with the aesthetics and less with the functionality part of a product. It refers to the visual elements and interactive components that users engage with in a digital product or service.
It includes:
Visual Design: This involves the aesthetics and overall look and feel of the interface. It includes the selection of colors, typography, icons, images, and other visual elements to create a visually pleasing and cohesive design.
Layout and Organization: UI design focuses on how the elements are arranged and organized on the screen. It involves designing a logical and intuitive layout that allows users to navigate and find information easily.
Interaction Design: UI design determines how users interact with the interface. It includes designing interactive elements like buttons, menus, sliders, and forms to provide a smooth and engaging user experience. Interaction design aims to make the interface responsive, interactive, and intuitive, enabling users to complete tasks efficiently.
Information Architecture: UI design involves structuring and organizing information in a way that is clear and understandable for users. This includes categorizing content, creating navigation systems, and defining the hierarchy of information to facilitate easy access and retrieval of information.
Usability and Accessibility: UI design focuses on creating interfaces that are usable and accessible to a wide range of users. It considers factors such as intuitive navigation, clear and concise instructions, legible text, and appropriate use of color contrast to ensure that the interface can be easily understood and used by all users, including those with disabilities.
Coming to UX or User experience .
A functional and aestehtically pleasing user interface liked by many people but it is not the only thing that is needed to retain the user, there is another factor that is the user experience,
This term was first applied in the 1990s by Don Norman who was a cognitive scientist and co-founder of the Nielsen Norman Group Design Consultancy and according to whom, “User experience encompasses all aspects of the end user’s interaction with the company, its services, and its products. ”
and user experience is a term which you apply to any real life situation and places such as your office , your home experience .vehicle experience
if you want to build the great user experience then ask below question :
is the product user flow designed so that user can quickly achieve his goal or objective.
How easy it is to use the product.
is the product intuitive enough to guess what user wants
the person who is responsible for UX has many responsibilities :
Understanding the market , User Research that is understanding the target users through research techniques such as interviews, surveys, and observations., Competitor, Competitor Users pain point , Users mentality , Motivations. these insights help in design process.
User Flows and Information Architecture: UX design involves mapping out the user's journey and creating user flows to define the steps and interactions required to accomplish tasks. It also includes designing the information architecture to ensure that the content is organized in a logical and intuitive manner, allowing users to find information easily.
Wireframing :Wireframing is the process of representing the application screens and order in which it should come.This is also called low fidelity prototype /representation.
Prototyping: While wireframing provides the visual idea of the planned layout, prototyping gets more close to the actual product. It consists of middle to high fidelity representation. It gives the look and feel of the final product as well as the interactions, which further proves itself helpful in user-testing.
So, to sum it up, UI design is how products appear, and UX design is how it functions.
Wireframe Diagram
Again Welcome to the world of design ,In this session let us have quick look at the most used diagram for UI-UX representation that is wireframe diagram.
let us understand what is wireframe diagram is :
A wireframe is a visual representation or a skeletal outline of a software interface or a web page. It is a low-fidelity, simplified representation that focuses on the structure, layout, and functionality of the design rather than the visual details. Wireframes typically include basic shapes, placeholders for content, and navigational elements means typically the basic elements of the final design
It is easiest ,simplest and most basic way to represent the website interface
it is also said that Wireframing is the art of visualizing software functionality before it comes to life.it is the language of collaboration between designers, developers, and stakeholders in software projects
The sample wireframe diagram of online shopping application will looks like this
If you see it represent structure, layout, and functionality to some extent.
Top patch of rectangle is the Nav bar below that there is place for sliding carousal, it is basically a constant sliding set of images which is used for promoting the latest offers products etc.
followed by that we have section for New Launched products and below that we have section showing categories on the left and the corresponding products on the right. You can have a option to filter the product by clicking on the category.
Very simple wireframe diagram i have taken here , but expect much detail in real life wireframe diagrams. You can also see the series of wireframes which capture the entire user journey, here i have just shown one but expect more in the real life projects.
now let us try to understand what are the purpose Wireframes serve in software design:
They help to visualize and communicate the layout and structure of a user interface before investing significant time and resources into detailed design and development.
They facilitate early feedback and collaboration among stakeholders, allowing them to provide input and make necessary changes at a relatively low cost.
Wireframes can serve as a blueprint for developers, guiding them in implementing the desired functionality and interaction.
Wireframe diagram can be easily drawn using MS PAINT or any whiteboard application ,I have used the draw.io for drawing this Wireframe diagram but even if someone uses a white paper and pencil that is also fine here.
Now let us see What are the alternatives to wireframes? While wireframes are widely used and effective, there are alternative methods for representing and communicating design concepts. Some alternatives include:
Mockups: These are more detailed visual representations that provide a clearer sense of the final design, it captures the colors, typography, and visual elements.
Prototypes: Prototypes are interactive representations of the software interface that simulate user interactions and demonstrate the flow and functionality.
Storyboards: Storyboards are a series of sketches or illustrations that depict the user's journey or specific scenarios within the software. it is very much similar to the series of wireframes.
Some of the top tools use for wireframing are There are several popular tools available for creating wireframes. Here are a few widely used ones:
Figma: Figma is a collaborative design tool that allows teams to create wireframes, prototypes, and high-fidelity designs in a single platform.
Adobe XD: Adobe XD is another popular tool for designing and prototyping interfaces, offering features specifically tailored for user experience (UX) design.
InVision Studio: Invision is the another mock up creation tool which is getting used in real life project
So this is all about the Wireframe diagram.
High Fidelity and Low Fidelity Diagram
In software design, the terms "high fidelity" and "low fidelity" are often used to describe the level of detail and realism in diagrams or prototypes. These terms are commonly associated with user interface (UI) or user experience (UX) design, but can also apply to other aspects of software design.
In early phase of my career when i heard these terms, I didn't got any clue what it is and observed many people working in IT projects not aware of these concepts but no worries now we will understand these concepts in detail in this session.
now let us see what is low fidelity diagrams :
A low fidelity diagram or prototype is a rough and simplified representation of the final product. hence it is also said that low fidelity diagrams are the playground of ideas, where concepts are born and concepts evolve.
It usually lacks detailed visual design, complex interactions, or realistic content. they don't use real data in the representation.
In low fidelity, imperfection is embraced. It's about exploring possibilities without getting caught up in the details.
Low fidelity diagrams are often created using simple tools like pen and paper, or basic prototyping software. They are quick to create and can be easily modified as design ideas evolve. Low fidelity diagrams are useful in the early stages of the design process, where the focus is on exploring different ideas, gathering feedback, and validating concepts before investing significant time and resources , the wireframe diagram which we saw that is a kind of the low fidelity diagram.
now let us see what is High Fidelity diagram :
A high fidelity diagram or prototype is one that closely resembles the final product in terms of visual design, interactivity, and functionality. It contains detailed visual elements, accurate content, and realistic interactions. and one more thing is they use the real data in the design hence after your project completion if you compare the application webpage with high fidelity , it will be almost same. hence it is said that "High fidelity design brings your vision to life with pixel-perfect precision." - Unknown
High fidelity diagrams are typically created using specialized design tools or coding languages. They provide a more realistic representation of the final product, allowing designers and stakeholders to evaluate the user experience in a more accurate manner.
High fidelity diagrams are often used in the later stages of the design process, when most design decisions have been made. means before designing high fidelity lot many wireframes low fidelity diagrams are designed and scraped to arrive at the final high fidelity design.
now let us have a look at how the high fidelity looks like in the real world. Figma ,invision, Photoshop are the most used tools for designing the high fidelity diagrams. we will see the high fidelity diagram in figma. for this go to this site search with Ecommerce and let us filter only free mock up. now you will see all the free mock up of ecommerce application.
if you click on it , it will open like this ,click on open with figma, now this is opened in figma
let me show you mock up means high fidelity for ecommerce application.
—
Both high fidelity and low fidelity diagrams have their own advantages and use cases in software design. Low fidelity diagrams are great for brainstorming, exploring different design options, and getting early feedback from stakeholders. They are less time-consuming and allow for faster iteration. High fidelity diagrams, on the other hand, provide a more accurate representation of the final product, allowing for detailed evaluation and user testing. They are useful for
It's important to note that the choice between high fidelity and low fidelity diagrams depends on the specific goals, timeline, and resources of a software design project. Often, a combination of both approaches is used throughout the design process to effectively communicate and refine the design.
Database Schema Design Diagram
Welcome to the world of software design , in this session let us have a look at the database schema design.
Every project needs data or generates the data right, so every project needs database to maintain this data, so how our database needs to be design and structured is represented using the database schema design
A database schema design diagram is a visual representation of the logical structure and organization of a database. It illustrates the tables, columns, relationships, and constraints that make up the database schema. The diagram helps in understanding the database structure and how the various entities and attributes are related to each other.
Now let us have a quick look at the sample database schema design diagram
I am just sharing with you a part of the database schema but in reality the application like online shopping application can have around 100-200 tables , you can capture the important ones that is also fine.
so if you see the diagram ,I have shown six tables First one is order which is the main table which hold the order information then there are related tables like orderdetail which hold more information about the order then order payment which holds the orderpayment related infromation then ordershipping details which is suppose to hold the shipping related details, then product table which hold the master data that is products information. and product category which is hierarchical data of product categories. I have also tried to show the relationships between them by arrows for example Order table is linked to Order detail table by the foreign key OrderDetail_id, in datbase foreign keys are used to depict the relationship between the tables.
During designing the database schema , the concept which is recommended to followed is Database Normalization, I will not cover it here , but if you want to explore go ahead, this concept help us to design the database which is Optimized , Easily maintainable and scalable. So without database normalization the schema design will be of no use.
in the design and prototyping phase database schema design is prepared and discussed thoroughly and the final version will be given to the developers to creates the database in the next phase of development.
There are several reasons why it is beneficial to use a database schema design diagram:
Communication and Documentation: The diagram visually communicates the database design to different stakeholders and acts as concise documentation for easy understanding.
Visualization of Relationships: The diagram illustrates table relationships, helping in query formulation and data manipulation by showing how entities are connected.
Database Optimization: The diagram helps identify performance issues and optimize the database design for efficient data retrieval and storage.
Maintenance and Upgrades: The diagram simplifies modifications by highlighting the impact of changes and ensuring alignment with the existing schema.
: The diagram facilitates the implementation of data constraints, enforcing integrity and consistency rules in the database.
So this is all about the database schema design diagram
Software Architecture
Welcome to the world of software architecture and design in this session we are going to understand the software architecture and software architecture diagram in great details.
every day we interact with lot many software application, for example IRCTC , it is railway booking application, just think at a single moment , numerous people uses this website to book a ticket. And tickets are getting booked seamlessly. Another example consider Netflix , it host thousands of high quality movies, multiple people will access from all over the world, it is able to stream those within fraction of seconds,
Stock trading platform , which is giving us every second data market data without any issues
How all these things are possible. this is all possible because of great software Architecture ,Software architecture is the backbone of a successful software project. It determines its resilience, performance, and adaptability.
So in this session we will see what is software architecture is
Software architecture is a very broad concept you will find different people explaining it differently. let us see the gist of it
Software Architecture is also known as a blueprint for a system. Software architecture refers to the highest-level framework, the skeleton of the software system. It’s one of the very first choices made or decision taken for the bedrock of the system. That choice can significantly influence the flow of work, quality of the code, maintenance, deployment, and ease of development.
Primarily, software architecture is based on a set of crucial decisions related to software development. Each of these decisions has a considerable impact on the overall success and performance of the final product.
It takes the major decisions about
Selection of structural components and their interfaces
Behavior as stated in collaborations in between those components
Configuration of those structural and behavioral components into a substantial subsystem
Architectural decisions following business requirements
so “Architecture is about the important stuff. Whatever that is.”
Signs of good software architecture are
Modularity: Good software architecture organizes components into reusable and encapsulated modules for easier maintenance and understanding.
Scalability: A well-designed architecture allows for seamless growth, adding features and handling increased loads without sacrificing performance or stability.
Flexibility: Good software architecture adapts to changing requirements, enabling easy modifications and extensibility while minimizing impact on existing functionality.
Separation of Concerns: A sign of good architecture is clear separation of responsibilities, enhancing maintainability, testability, and overall system understanding.
Performance: Good architecture optimizes performance through efficient resource utilization, minimizing bottlenecks and ensuring responsiveness and scalability.
Testability: Well-architected systems enable comprehensive testing by facilitating the creation of independent unit tests and integration tests.
Understandability: Good architecture is easily comprehensible with clear naming conventions, consistent design patterns, and comprehensive documentation.
Maintainability: Good architecture simplifies maintenance, making it easier to make changes, fix bugs, and perform updates.
Security: Well-designed architecture incorporates security measures and follows secure coding practices to protect data and system integrity.
Alignment with Business Goals: Good architecture supports the business goals and requirements of the system, reflecting an understanding of the problem domain and stakeholder needs.
"Good software architecture is like a well-designed city. It provides a solid foundation for growth, scalability, and maintainability." - Unknown
now a single application can have multiple Architecture and for each architecture you can have associated diagram
Application Architecture Diagram
Integration Architecture Diagram
Deployment Architecture Diagram
DevOps Architecture Diagram
Data Architecture Diagram
sometime the single architecture diagram is enough to capture all these diagram essence. this also possible . so based on complexity of your application you can have multiple architecture diagrams.
now let us have a quick look at the architecture diagram of the application.
here you can see skeleton of our software system , please note that some of you might say some components are missing in this . i know that , but intention of this session to keep the things simple and easy to understand for everybody. but in real projects you might see complex architecture diagram.
This diagram highlights structural components of the system. the flow start when the user request arrives , it will go to the Traffic manager and based on the region of the user the request will be redirected either to region one or region 2.
our application is deployed in both regions in separate virtual networks.
suppose request forwarded to region 1 then region one has the load balancer which will decide which app service should handle this request based on the load, app service is a azure component which host the web applications. this is our web tier
from web tier request will flow down to business tier .Again here we will have the load balancer to manage the load. from our business tier if there is need to access the database then request will go to our sql server tier you can say, here the data operation will be carried out.
now similar is the structure we are having for the region 2. and both the databases will be sync using asynchronous way.
now if you see the use of serverless and load balancer help us in achieving the scalability in our application. spanning application multiple regions help us in optimizing the performance
I hope you would have got the fair idea of the software architecture.
Few points to note here :
for single project you might see different architectural diagrams , it is not a true that single project should have only one architecture diagram. It is up to architect , if he thinks that entire system architecture can be depicted in single diagram then fine else he may come up with multiple diagrams to simplify the stuff.
how to design and position these components there are some guidelines those are called as a architecture pattern . we will have a quick look on them in the upcoming session.
so this is all about the software architecture.
The main goal of the software architecture is to define WHAT and WHERE of the software
Monolithic Architecture
In this session and upcoming few session we are going to see most used architecture patterns which are considered during designing the architecture of the software. we are going to see it in the interesting way ,means we are going to see it in the form of journey , how they evolved over the time .
but one note for you is .It is not mandatory that you should use these ,but it is recommendation. These are the time tested, proven solution to recurring architectural problems but if you can come up with better architecture than the patterns suggested then you are always welcome to follow that.
An architecture pattern is not a rigid set of rules; it's a flexible guideline that can be tailored to fit the specific needs and constraints of a project.”
so now let us start with monolithic architecture pattern.
as the name suggest Monolith, means a single block of stone right so similar is the concept here
Monolithic architecture is straightforward and simple approach to building your application.
in this approach the application is built as a single, indivisible unit. In this architecture, all components and modules of the application are tightly coupled together, and they run as a single process on a single server or computing instance. Understand this Single indivisible unit , run as a single process on a Single server.
Means at code level you will create a single solution with a single project contains all classes database calls , business logic and finally you will figure out in the solution what to display to the user, so every thing is mixed in here. sometime people try to split the class files as per folders, but it is still a large mess to manage.
In a monolithic architecture, the entire application is typically developed, deployed, and scaled as a whole. This means that any changes or updates to one part of the application require rebuilding and redeploying the entire application. The components within the application share the same memory space, allowing them to communicate with each other directly and efficiently.
Monolithic architectures have been widely used for a long time and are known for their simplicity and ease of development. I will say it is one of easiest architecture pattern to follow.
They often use a single technology stack, making it easier for developers to work on the application. However, as the application grows in size and complexity, monolithic architectures can become harder to maintain and scale.
Few main challenges of monolithic architecture are :
Scalability :
One of the main challenges with monolithic architectures is their limited scalability. Since the entire application runs on a single server, scaling the application requires scaling the entire system, even if only a specific component or module needs additional resources. This can lead to inefficiencies and increased costs.
Flexibility with respect to technologies :
Another drawback is the lack of flexibility in choosing different technologies for different parts of the application. In a monolithic architecture, all components must use the same technology stack, which can limit the ability to adopt new technologies or frameworks.
Fixing issues : Since monolithic architecture has tightly coupled component , fixing issue in one component can break the other component. you end up doing the code changes at multiple places
Deployment : Since monolithic is the single indivisible unit. Even if you fixed the issue in some component ,entire application you need to deploy again.
To give you analogy to understand this concept then consider
Restaurant with a Single Kitchen: Imagine a restaurant with a single kitchen where all the cooking activities take place. In this monolithic restaurant, all the different tasks, such as food preparation, cooking, plating, and serving, happen within the same kitchen.
The kitchen represents the monolithic architecture here, where all the components of the restaurant are tightly coupled together. The chefs handle all the cooking, and once the food is ready, it is plated and served directly to the customers. The entire restaurant, from taking orders to serving meals, operates as a single unit with no distinct separation of responsibilities.
Layered Architecture
layered architecture is the next approach to monolithic architecture where it has Introduce layered concept within the monolithic application you can also call it as modular monolithic.
This pattern is one of the widely used architectural patterns in the software industry for its easy-to-develop-and-maintain feature. As the name suggests, it follows a layered approach wherein the code is organized in layers. This pattern organizes an application into logical layers based on their responsibilities and functionalities.
Now what is layer? so in object oriented design, a layer is a a group of classes that have the same set of module dependencies to other modules , in other words a layer is a group of reusable components.
Layered architecture project can have a single solution , and for logical separation , multiple project can be created under the solution or namespaces can be used to segregate the layers
Most used layers in the general software system:
Presentation Layer or UI Layer
Application Layer or Business Layer
Data Access Layer or Persistence Layer and final one is of Database layer
Layers are typically arranged in a hierarchical manner, where each layer depends on the layer below it.
The purpose of layered architecture is to achieve Separation of concerns, modularization, and maintainability by encapsulating different functionalities within separate layers.
Communication between layers usually happens vertically, with each layer calling the layer immediately below it.
In layered architecture the Three Layered architecture is widely used, it contains presentation layer ,business layer and data access layer thats all . In layered architecture based on need multiple layer can be introduced like domain layer ,repository layer etc.
Coming to deployment , Layered architecture will be deployed on the single machine similar to monolithic architecture.
Layered architecture made the monolith architecture modular but it has not still solved challenges of monolithic
that is limited scalability. Since the entire application runs on a single server, scaling the application requires scaling the entire system, even if only a specific component or module needs additional resources. This can lead to inefficiencies and increased costs.
Another Challenge is the lack of flexibility in choosing different technologies for different parts of the application. In a layered architecture, all components must use the same technology stack, which can limit the ability to adopt new technologies or frameworks. if you can try to add layers with different tech stack then it might run but it will add a hell lot of complexity in the code.
Fixing issue can be simplified here compare to monolithic architecture as the code is segregate in the logical layers. the fix can impact the single layer and you might not see impact on the other layers.
coming to deployment , even if we segregate the code in to logical layers ,still this kind of architecture will be deployed as a single unit on the single server, hence fixing in one layer can cause you to deploy entire application again.
If i want to give you analogy to understand Layered architecture then consider
Now, let's consider a restaurant with layered architecture, where different layers represent specific functionalities.
The kitchen layer represents the food preparation and cooking, similar to the monolithic kitchen. The service layer includes the waitstaff, responsible for taking orders, serving meals, and attending to customer needs. The management layer oversees the overall operations, including inventory management, scheduling, and financial aspects.
Each layer operates independently, with well-defined interfaces for communication. The waitstaff interacts with the kitchen layer to coordinate food preparation and ensure timely service to customers. The management layer handles administrative tasks and provides guidance to both the kitchen and service layers.
So this is all about the Layered architecture in detail.
Tiered Architecture
Welcome to this session in this session let us have a look at the another software architecture that is tiered architecture. Tiered architecture is the next and advance approach to layered architecture. it has tried its best to address the challenges of layered architecture. We will see it soon how it address these challenges.
Now let us try to understand what is Tier architecture approach is Tiered architecture you can say a one more level of separation on the top of layered architecture where the logical layers will be separated physically .the term tier refers to the physical structure
each tier will be hosted separately on the deployable unit or host can be a virtual machine ,App service etc.
Tiers are defined with an eye toward the computing environment on which the software will run. By dividing an application into tiers, it’s possible to achieve a higher degree of scalability.
Now here we have option , to choose which logical layers we want to club together and how many tiers to creates
usually tiered architecture will start with TWO tier architecture to n tier architecture.
Two tier , three tiers are widely used, but if you have requirements you can for n tier as well.
whatever i am showing you is the typical three tier architecture .
same architecture i can convert to two tier by clubbing the layers in to one of the tier. like this
This has become now a 2 tier architecture , it is also referred as a Client-Server Architecture, the UI Layer is on a dedicated tier while the Business Logic Layer and Data Access Layer are on another.
!https://www.baeldung.com/wp-content/uploads/sites/4/2021/04/Tier-Architecture-2.png
Let us a have quick look at how it has address the old challenges
it has address Limited scalability challenge, by making each tier to deploy on separate machine or host, if single tier needs additional resources then it will be provided easily without impacting others. it is a efficient way and reduce the cost as well.
it has address lack flexibility in choosing different technologies for different parts of the application. As the tier is the separate unit of code , you can use different technologies for tiers
Fixing issues became very simple : you can fix the issue in one tier and only that tier will be impacted, impact will not persist in the other tiers.
Deployment become simple, if you made the code changes in the single tier only that tier can be deployed without impacting other tiers.
so basically the major benefits of tiered architecture are Modularity, Reusability, Scalability and Flexibility, Security
to get better understanding of tiered architecture let us try to do the comparative study of layered and tiered architecture.
let us compare layered and tiered architecture side by side.
A layer = a part of your code A tier = a physical machine, a server.
Layered architecture is the logical separation of code in to layers . on the other hand tiered architecture is the physical separation of code. Tiers define where to deploy the layers
Layered can not contains the tiered architecture internally but tiered architecture can contain layered architecture internally .
In Layered architecture, all layers in the application is deployed over a single deployable unit or HOST it can be virtual machine.
where code deployed over the IIS website and database is deployed over the DB server installed on the same machine.
in Tierd architecture, the application is deployed over the multiple deployable units or HOSTs , it can be multiple virtual machines , or multiple app services etc.
Tierd architecture is since each tier contains the part of code which can be scaled whenever needed and since it is small part it is easy to maintain as well.
Now let us have a look at the challenges of tier architecture
Main challenges in tier architecture is because it is still holding the multiple layers in the single tier these challenges include
Complexity : Tier architecture still group some logical layers it has some level of complexity included in it.
Scalability : it has given better scalability than layered architecture but since the tier contains the multiple layers, maximum scalability still not achieved.
Maintenance and Upgrades: still the layers are group inside tier, you can have challenge maintaining and upgrading those. you might need to upgrade entire tier
Performance :As data and requests flow through multiple tiers, it can introduce latency and affect overall system performance. Efficient communication and data transfer mechanisms must be implemented to minimize any performance bottlenecks.
Fault Isolation : Tier architecture if you see it is a sequential kind of architecture where one tier communication with sequential adjacent tier, some failure in one tier can bring application fully unavailable.
Communication and Synchronization: Effective communication and synchronization between layers become crucial in n-tier architecture. Different layers may use different communication protocols and technologies, making integration and coordination more challenging.
Deployment and Configuration: Deploying and configuring an n-tier architecture can be more involved than deploying a monolithic application. Each layer needs to be properly installed, configured, and connected, increasing the deployment complexity.
Security: With multiple layers and components, security can become more complex to manage. Each layer must be properly secured, and vulnerabilities in one layer may potentially impact the entire system. Implementing robust security measures throughout all layers is essential.
Testing and Debugging: Testing and debugging can be more complex in an n-tier architecture due to the distributed nature of the system. Identifying and resolving issues that span multiple layers can be time-consuming and require comprehensive testing strategies.
Till now i hope you would have got a better understanding of n tier architecture.
but still let me give you real life analogy to related this concept
Restaurant with Kitchen, Front of House, and Back of House: Consider a restaurant with tiered architecture, which separates the front of house (FOH) and back of house (BOH) operations.
The FOH represents the customer-facing activities, such as hosting, taking orders, and serving meals. It includes the dining area, host/hostess, and waitstaff. The BOH represents the kitchen and other operations that happen behind the scenes, such as food preparation, cooking, dishwashing, and inventory management.
In this tiered restaurant, the FOH and BOH operate as separate tiers, each with its own responsibilities. The waitstaff in the FOH interacts with customers, takes orders, and coordinates with the kitchen staff in the BOH to ensure efficient service.
Till now we have seen Monolithic Architecture, Layered Architecture, and now tiered architecture.
In reality software teams can merge these three and create a custom hybrid architecture, and many software teams does that. one of the famous mix version is Monolithic tiered architecture
So this is all about the Tiered architecture. in the next session we will try to understand how all these challenges gracefully address by the next architecture pattern called microservices architecture pattern. stay tune.
Microservices architecture
Welcome to the another session of software arechitecutre in this session we will see microservices architecture in detail. icroservices architecture next better approach to the Tiered architecture you can say.
Microservices architecture is an architectural style that structures an application as a collection of small, independent, and loosely coupled services.
Note this statement it is important that is Each service focuses on a specific business capability and can be developed, deployed, and scaled independently.
So main recommendation here is , the major modules or functionality from the project convert them in to independent services.
For example if we consider the online shopping application then you can see the microservices in it like
Product Service, Inventory service, Order Mgmt. service, Payment service ,Fulfillment service ,Notification service etc. all these modules will be created as a independent services and deployed separately. You can see in the diagram each service is the separate service , now they can use same database or different database as per the database design of the project.
if you see microservices architecture inclined towards the SRP principle that is Single Responsibility Principle
As a viable alternative to monolithic architecture patterns, microservices have gained popularity and importance. I
https://miro.medium.com/v2/resize:fit:768/0*GQhBZ1sNPOj2irJf
Major benefits of Microservices architecture are .
Modularity and Scalability: Microservices architecture enables modularity by breaking down the application into smaller, self-contained services. Each service represents a specific business function and can be developed, deployed, and scaled independently. This modularity allows for easier maintenance, updates, and scalability of individual services without impacting the entire system.
Independent Development and Deployment: With microservices, different teams can work on separate services concurrently. Each team can choose the most suitable technology stack, programming language, and tools for their specific service. This independence in development and deployment accelerates the overall development process and fosters innovation within the organization.
Fault Isolation and Resilience: Microservices architecture promotes fault isolation. If a single service fails or experiences issues, it does not necessarily affect the entire system. Other services can continue to operate independently, improving the overall system's resilience and fault tolerance.
Flexibility and Technology Diversity: Microservices architecture allows for flexibility and technology diversity. Different services can use different technologies and frameworks based on their specific requirements. This flexibility enables the organization to adopt the most appropriate technology for each service, take advantage of the latest advancements, and evolve the architecture over time.
Improved Scalability and Performance: Microservices architecture supports horizontal scaling, where individual services can be scaled independently based on their workload and demand. This scalability ensures optimal resource utilization and can handle varying levels of traffic or load efficiently. Additionally, services can be deployed closer to the users, reducing network latency and improving performance.
Continuous Deployment and DevOps Practices: Microservices architecture aligns well with DevOps practices and continuous deployment. Each service can have its own independent deployment pipeline, enabling faster and more frequent releases. This promotes faster time to market, better collaboration between development and operations teams, and easier rollbacks or updates of specific services without affecting others.
Improved Maintainability and Debugging: Microservices architecture simplifies the maintenance and debugging process. Services are decoupled, and each service has a well-defined boundary, making it easier to understand, modify, test, and debug specific functionalities. This isolation improves maintainability and reduces the impact of changes on other parts of the system.
Enhanced Team Autonomy and Scalability: Microservices architecture allows teams to work autonomously on their specific services. It enables smaller, cross-functional teams to take ownership of individual services, leading to faster decision-making, improved agility, and better scalability as the organization grows.
Let us see which kind of project should go for this pattern
Fast developing web and business apps : the application where requirement changes often and need more agility, microservice architecture will be useful here.
Large and Complex Systems: Microservices are suitable for managing the complexity of large-scale applications by breaking them into smaller, more manageable services.
Project which needs Scalability and High Demand: project which has the large active user base, and varying demand
Project which has Independent and Autonomous Teams: organizations that have multiple autonomous teams, This patterns allow each team to take ownership of specific services and work independently.
Project which needs Heterogeneous Technology: Project which needs different technologies, frameworks, and programming languages for different services within the application.
Project which needs Continuous Deployment and DevOps Practices: Project which wants less TIME to MARKET KPI, and want to deliver the functionalities quickly
If any of these traits project has then it is fit for microservices architecture .
Now let us have a quick look at the challenge of this pattern
Distributed System Complexity: Building a network of microservices introduces challenges like latency, fault tolerance, load balancing, and service discovery.
Service Coordination: Managing the coordination between numerous services, ensuring consistency, and maintaining transactional integrity can be complex.
Data Management: Handling data consistency, integrity, and migrations across multiple microservices is challenging in a distributed environment.
Service Dependencies: Changes in one microservice can impact others, requiring careful versioning, dependency management, and backward compatibility.
Operational Complexity: Operating and troubleshooting a larger number of services with their own deployment and monitoring requirements is complex.
Testing and Deployment: Testing the entire system with multiple services and managing coordinated deployment is challenging.
Service Discovery and Load Balancing: Implementing scalable and efficient solutions for dynamic service discovery and load balancing is necessary.
Security and Authentication: Ensuring secure communication, access control, and managing authentication across services can be complex.
Organizational Challenges: Adopting microservices requires changes in structure and culture, effective communication, and collaboration among teams.
Monitoring and Observability: Implementing robust monitoring, logging, and observability to detect issues and ensure system performance is crucial.
if i want to give analogy to understand this
Restaurant with Specialized Stations: Imagine a restaurant with a microservices architecture, where each specialized station handles a specific aspect of the restaurant's operations.
The stations represent individual microservices, each responsible for a specific functionality. For example, you might have a station for order taking, a station for food preparation, a station for Beverages, a station for dessert, and so on. Each station operates independently and communicates with other stations as needed.
Customers interact with the different stations based on their requirements. They might place an order at the order-taking station, which then coordinates with other stations to fulfill the order. Each station focuses on its specialized task, and the overall restaurant experience is composed of the collective efforts of these microservices.
Serverless Architecture
Welcome to this session on Software Architecture in this session let us try to understand serverless architecture.
before understanding this let us recap what we have learned till now :
we have learned monolithic where the application is written as a single block of code and deployed on the single Host
then Layered architecture where the application is divided into logical layers and deployed on a single host
then Tiered architecture where the application is divided into physical layers and deployed on multiple hosts
then microservices architecture where the application is divided into multiple services and each service is deployed separately on a separate host.
now we are here at the next part of this journey which is serverless architecture. this became a hot topic because of the concept of serverless.
In the previous type of architecture we used to deploy applications on a single host or multiple hosts and we were responsible for the host. If there is some issue in the host, or there is a power outage and need to manage the power, or we need to scale the application, then monitor it all this stuff we need to do it on our own, and it used to take a hell lot of time.
means we were responsible for our application code and hosts, 50-50 % you can say. and you might be knowing being responsible for something is big task responsibility ,
But If I say henceforth you just focus on writing code and developing applications, someone will manage all your hosts or deployable units. It will be great and you will obviously go for it. Right, definitely you will go for it. This is the magic of serverless architecture.
In layman's terms, serverless architecture or serverless computing means that your code will run on some third-party vendors server infrastructure which you don't need to worry about, it does not mean that there is no server to run your code logic rather you do not need to maintain it. that is the business of third-party vendors like Microsoft Azure, AWS and Google, etc.
Now let us see the benefits of using serverless architecture:
No server management is required. With serverless computing, you don't need to worry about provisioning, managing, or scaling servers. This frees up your developers to focus on building and deploying applications.
Pay-per-use pricing. You only pay for the serverless resources that you use. This can help you to save money, especially if your application has variable traffic patterns.
Automatic scaling. Serverless platforms can automatically scale your applications up or down based on demand. This ensures that your applications are always available, even during spikes in traffic.
Faster deployments and updates. Serverless applications can be deployed and updated quickly and easily. This can help you to iterate on your applications more rapidly and respond to changes in demand.
Improved security. Serverless platforms typically take care of many of the security aspects of running applications, such as load balancing, firewalls, and intrusion detection. This can help you to reduce your overall security risk.
Here are some additional benefits of serverless computing:
Increased agility. Serverless computing can help you to become more agile by making it easier to launch new features and applications.
Improved focus on innovation. By freeing up your developers from the need to manage servers, you can help them to focus on innovating and building new features for your applications.
Reduced costs. Serverless computing can help you to reduce your overall IT costs by eliminating the need to purchase and maintain servers.
Now I ho pe you would have got a high-level idea of what is serverless and what are the benefits of it.
now let us try to understand how to achieve serverless architecture:
some misconception is that serverless architecture means simply deploying your application on Cloud. This is not true or I will say it is partially true.
For this to understand more we need to understand cloud services first. The cloud provider offers us Three types of services IAAS, PAAS, and SAAS
1**. Infrastructure-as-a-Service (IaaS):**
where you procure the infrastructure over the cloud and make it ready per your requirements, it is similar to buying a car.
In this scenario, IaaS is similar to buying all the individual components required to build a car. You purchase the engine, chassis, wheels, seats, and other necessary parts separately. With IaaS, you have complete control and responsibility for assembling these components and managing the maintenance, fueling, and overall operation of the car. It gives you the flexibility to customize the car as per your requirements, but it also means you have to handle the operational aspects.
In the context of technology, IaaS is like renting virtualized hardware resources from a cloud provider. You have control over the operating system, middleware, runtime environment, and applications you want to run on the infrastructure. It provides you with the flexibility to configure and manage the infrastructure components while offloading the physical hardware management to the cloud provider.
Platform-as-a-Service (PaaS): Now, consider a scenario where you want to use a car without worrying about the complexities of owning and maintaining it. PaaS is similar to renting a car from a car-sharing service. You don't have to worry about buying or assembling the car components. Instead, you have access to a pre-built car with all the necessary features and functionalities. Yo u can focus solely on driving and utilizing the car for your specific needs.
In the technology realm, PaaS offers a complete development and deployment platform. It abstracts away the underlying infrastructure and provides a pre-configured environment to build, test, and deploy applications. You can focus on writing and deploying your code without worrying about the underlying infrastructure, operating system, or runtime environment. The cloud provider manages the hardware and networking aspects, allowing you to concentrate on application development and data management.
Software-as-a-Service (SaaS): Now imagine a scenario where you don't want to deal with the car at all. You simply want to get to your destination without any involvement in the car's ownership or operation. SaaS is similar to hiring a chauffeur-driven car service. You have no responsibility for the car itself. You specify your destination, and the driver takes care of everything, from navigation to maintenance.
In the technology landscape, SaaS refers to accessing software applications or services hosted and managed by a third-party provider. You don't have to worry about the underlying infrastructure, platform, or even software maintenance. The SaaS provider handles all the aspects of the software, including installation, updates, security, and scalability. You simply access and utilize the software through a web browser or dedicated client, focusing solely on using the application to fulfill your needs.
Now coming to serverless, If you are using IaaS, PaaS, and SaaS to deploy your application then that is not called serverless.
As you would have seen I presented this architecture diagram in the previous session, this entire architecture resides in the cloud, but it is not a serverless architecture.
For achieving the serverless we need to use the component which are Belong to FaaS that functions as a service. This might be a new term for you. In Function-as-a-Service (FaaS), you have small, self-contained functions that perform specific tasks or execute a piece of code based on certain triggers or events. These functions are hosted and executed on a serverless platform provided by a cloud service provider.
now which cloud components are categorized as FaaS are :
AWS Lambda (Amazon Web Services): AWS Lambda is a serverless computing service provided by Amazon. It allows you to deploy your application code as functions that are triggered by events. Your functions are hosted and executed on the AWS Lambda platform.
Azure Functions (Microsoft Azure): Azure Functions is a serverless computing service offered by Microsoft Azure. It enables you to deploy individual functions that respond to various triggers, such as HTTP requests, database events, or timers. Azure Functions takes care of hosting and executing your functions.
Google Cloud Functions (Google Cloud Platform): Google Cloud Functions is Google's serverless computing offering. It allows you to deploy functions that respond to events, such as HTTP requests or Cloud Pub/Sub messages. Your functions are hosted and executed on the Google Cloud Functions platform.
so in simple terms, you write a code and deploy it over the FaaS component and whenever the relevant event ha ppened your code will be executed, you will be charged for the time for which it is executed and the resources used during that time that's it. if within 24 hours if you are code is running only 2 hours , you will be charged for 2 hours only.
now here is the sample serverless architecture diagram for the online shopping application.
As you see here we are using the cloud provider Microsoft Azure, and in this diagram, we are using the Azure functions to execute our code or services, or apps you can say . since the Functions are triggered using the events or HTTP requests, you can expect the use of event mgmt components here we are using an event g rid.
here the flow is the user will log in to the application and perform an activity that activity will fire the HTTP requ est, and that request will go to API mgmt, now API mgmt is intelligent enough to differentiate the request if the request is for searching product it will be passed to a product service function, similarly if it is related to order then it will be passed to order service functions and if it is related to the user then it will be passed to the user function.
now all these functions need to interact with the database hence it is connected with the SQL database.
as soon as the order is initiated in the db then the order workflow function will trigger, now this is a durable function means it is a long-running and stateful workflow function. then it will raise the appropriate events and send them to the event grid, as soon as the event is received at the event grid, if it is related to payment capture then the payment processing function will be invoked
note that I have taken a very simple example here, but in real time it can go complex. it will have lot many functions and event management components like event bus , ques, event grids and other components.
So this is all about how a serverless architecture diagram can be designed.
I know this session is going bigger but it's necessary to understand the basics of serverless architecture.
now let us have a look at the challenges of serverless architecture.
Vendor Lock-in: Adopting a serverless platform often involves vendor-specific features and services. This can create some level of vendor lock-in, making it challenging to switch providers or migrate the application to a different architecture in the future.
Limited Execution Time: Serverless functions typically have a maximum execution time limit imposed by the platform. Long -running processes may need to be broken down or rearchitected to fit within these execution time constraints.
Cold Start Latency: When a function hasn't been invoked for a while, there may be a slight delay (known as a cold start) when invoking it for the first time. This can impact real-time or low-latency applications, although serverless platforms continuously work to minimize cold start times.
Testing and debugging: Testing and debugging serverless applications can be challenging because they are event-driven and stateless. This means that you can't easily reproduce the environment in which
So this is all about the challenges, These challenges are not significant there are ways to manage them.
Now let me complete this session by giving you an analogy to remember this concept well ,
Serverless Architecture - Restaurant with On-Demand Chefs:
Imagine a restaurant with a serverless architecture, where you have a team of on-demand chefs available to prepare meals whenever needed. In this restaurant, the chefs represent the serverless functions, which are small, event-triggered units of code that execute specific tasks. Instead of having a fixed kitchen or predefined cooking stations, the chefs can be dynamically allocated and invoked as required.
When a customer places an order, an event is triggered, and the corresponding on-demand chef is invoked to prepare the meal. Once the meal is ready, the chef completes their task and goes idle until the next event occurs. The infrastructure and resource allocation is managed automatically by the serverless platform, allowing the restaurant to scale seamlessly based on demand.
So guys this is all about the serverless architecture in detail.
Event-Driven Architecture
Welcome to another session on software architecture that is event-driven architecture.
Event-Driven Architecture (EDA) is an architectural pattern that structures an application around the production, detection, and consumption of events. In this architecture, components communicate through events triggered by changes in the system's state or the occurrence of significant actions or interactions.
The key idea behind event-driven architecture is decoupling the components by establishing loose coupling and asynchronous communication. When an event occurs, it is published to the event bus, and any interested components can subscribe to and consume the event. This decoupled nature enables flexibility, scalability, and responsiveness in building complex systems.
so in one line, this pattern suggests that develop application components separately and make them produce and consume and process the events accordingly.
Event-driven architecture usually gets used along with some other kind of architecture like microservices, n-tier architecture, etc.
If you see this diagram in this diagram we have event-driven architecture, it's not fully but it's there. if you see
here the order workflow durable function will generate the events like
Order placed, Order confirmed, Capture payment, Book inventory, etc and these events will be pushed in the event grid and then the destination services will consume it and perform the logic.
here the order workflow functiona is the producer of events and functions like notification service, payment processor, and fulfillment inventory mgmt are the consumer of the events.
Some basics steps on how to implement this event-driven architecture are :
Identify the events: Determine the key events that occur within your online shopping application. These events could include actions like user registration, product added to cart, order placement, paym ent completed, etc.
Define event sources: Identify the sources of these events. For example, a user registration event could be triggered by a user signing up on your website, while a product added to cart event could be triggered when a user clicks the "Add to Cart" button.
Choose an event-driven framework: Select a suitable event-driven framework or service that can handle event processing and distribution . There are various options available, such as Apache Kafka, AWS Lambda, Azure Event Grid, or Google Cloud Pub/Sub.
Design event producers: Implement the logic in your application to generate events when the corresponding actions occur. For example, when a user places an order, your application should generate an "order placed" event.
Implement event consumers: Create event consumers, which are responsible for handling and responding to events. For instance, when an "order placed" event occurs, a consumer might update the inventory, send a confirmation email to the customer, and trigger the payment process.
Define event schemas: Establish well-defined event schemas that define the structure and payload of each event. This ensures consistency and enables interoperability between event producers and consumers.
Ensure event reliability: Implement mechanisms to ensure reliable event processing. This includes techniques such as event queuing, m essage acknowledgment, and retries to handle potential failures or temporary issues.
Scale and monitor: As your application grows, consider the scalability of your event-driven architecture. Ensure that yo ur event processing infrastructure can handle increased event volumes and monitor the performance and health of your event-driven components.
Now let us see the benefits of event-driven architecture. Benefits of Event-Driven Architecture:
Loose Coupling and Flexibility: EDA promotes loose coupling between components, allowing them to operate independently. Components can evolve, scale, or be replaced without affecting the entire system, making the architecture more flexible and adaptable to changes.
Scalability and Performance: EDA enables horizontal scalability by distributing the workload across multiple components that can handle events concurrently. This scalability allows systems to handle high volumes of events and provide better performance under varying loads.
Real-time Responsiveness: By leveraging events, EDA enables real-time responsiveness to changes and triggers actions immediately. Components can react to events as they occur, enabling quick decision-making and timely responses to business needs.
Modularity and Reusability: Event-driven systems are composed of modular components that can be reused in different contexts. Components can be developed, tested, and deployed independently, promoting code reusability and reducing development effort.
Event Sourcing and Auditability: Events capture the sequence of actions and state changes in the system, facilitating event sourcing. Event logs provide a historical record of system behavior, enabling audibility, debugging, and replaying events for analysis or testing.
Challenges of Event-Driven Architecture:
The complexity of Event Flow: Managing the flow of events and their sequencing can become complex, especially in large-scale systems. Ensuring the correct order and handling of events across multiple components requires careful design and coordination.
Eventual Consistency: Event-driven systems often operate with eventual consistency, meaning that components might process events independently and asynchronously, which can introduce challenges in maintaining data consistency across the system.
Event Choreography and Orchestration: Coordinating multiple components to respond to events requires well-defined choreography or orchestration mechanisms. Designing and managing these coordination strategies can be challenging, significantly as the complexity of the system increases.
Event Durability and Reliability: Ensuring the durability and reliability of events becomes crucial. Events should be persistent and reliably delivered to interested components, even in the face of failures or system disruptions.
so this is all about the challenges of event-driven architecture.
So this is all about event-driven architecture, i hope you would have got better clarity on the event-driven architecture in this session.
4+1 Architectural View
Welcome everyone! We have seen Design and prototyping phase of SDLC is about Designing and prototyping or Modelling the system. This phase main goal is to create every possible view of the system from every angle and give customer and stakeholder idea and clarity of how the final system will looks like.
now here the the thing is different stakeholder has different prospective. and architecture also means different things to different stakeholders
for example : network engineer would only be interest in the hardware and network configuration of the system
a project manager would be only interested in the key components to be developed and their timelines
Developer would be interested in classes that make up the component and tester in the testable scenarios. so every stakeholder is interested in different different aspect of the system. If you observed till now we have also seen lot many architecture and design related diagrams so how to consider all this aspects and bring to standardization,
the solution is 4+1 architectural diagram
while working in the IT companies some of you might would have overheard this term 4+1 architecture view . this is standard term or concepts you can say widely used in defining the architecture of the system. 4+1 architecture view gives us the framework to follow for software design and architecture.
to give you analogy when you want to buy a house and you visit the apartment projects. to builder you specifically asked the master plan of the project , building floor plan which is cross section of the project , elevation plan then specific flat floor plan etc. These are the standards one which gets you covered from almost all angle. so in software terms if you want to get to know all the aspects of the software then ask for 4+1 architecture plan of that project. you will get end to end idea of that project
so in this session we will explore the five architectural views that make up the 4+1 model and understand their significance in software development.
The 4+1 architecture view, introduced by Philippe Kruchten, provides a comprehensive perspective on software systems, enabling us to analyze and design complex systems effectively.
the very first view here is
Logical View or structural view
the Logical View, focuses on the functionality and behavior of the system from a user's perspective. This view shows the components(objects) of the system as well as their interaction and relationship. it is a object oriented level decomposition of the system
Stakeholder under consideration here are Analysist,Designer etc.
During building this view the Functional requirements that is what the system should provide in terms of services to its user is considered
It defines the high-level components and their interactions, presenting a conceptual blueprint of the system's structure.
UML diagrams commonly used in the Logical View include
Process View or Behavioral View
The Process View concentrates on the system's runtime behavior and dynamic aspects, emphasizing the concurrent processes and interactions between them. it is a process level decomposition of the system
the stakeholder under consideration for this view is System integrators
During creating this view the Non-functional requirements are also considered including concurrency, performance scalability, useability, reuse, etc.
UML diagrams commonly used in the Proce ss View include the Activity Diagram, Sequence diagram, Communication diagram , Timing diagram, Interaction overview diagrams
Development View or Implementation view
The Development View focuses on the organization of the system's software components during development.
The stakeholder under consideration for this programmer and software managers
During creating this view of the software module organization, hierarchy of layers will be considered
UML diagrams commonly used in the Development View include Component Diagram, and Package Diagram which capture package details, execution environment s class libraries layers, subsystem design, etc.
This view shows the building blocks of the systems.
Physical View or Deployment View.
The Physical View addresses the system's deployment and distribution aspects, illustrating how the software components are mapped onto the physical infrastructure.
Stakeholder under consideration is System engineers
this view considers the non functional requirements for the hardware
UML diagrams commonly used in the Physical View include the Deployment Diagram, which represents the hardware and software components and their interconnections.
The Deployment Diagram helps in understanding the system's physical deployment, including hardware resources, network configurations, and software distribution. this view shows the system execution environment.
Scenarios or Use Cases
The fifth view in the 4+1 architecture model is the Scenarios or Use Cases view.
It considers system consistency and validity
This view focuses on capturing important scenarios or use-cases that demonstrate how the system behaves in various real-world situations.
UML diagrams commonly used in the Scenarios or Use Cases view include Use Case Diagram,
This view shows the validation and illustration of system completeness,
now let us understand the relation ship between these view This diagram already displays the relationship but let us understand it more .
The logical view and the process view are at the conceptual level and are used from the analysis to design
the development view and the deployment view are at the physical level and represent the actual application component build and deployed.
the logical view and development view are tied closer to functionality that is functional aspect . they depict how functionality will be modeled and implemented.
the process view and deployment view realizes the non functional aspects using behavioral and physical modelling.
the use case view leads the structural elements being analyzed in the logical view and implemented in the developer view , the scenario in the use case view are realized in the process view and deployed in the physical view
Now let us try to understand why it is getting called as 4+! instead of just 5
here the Use case view has special significance, if you see it as a guiding factor to all 4 views.
All other views would not be possible without the use case view.
Use case view conveys and details the high-level requirements of the system and other views tried to project or detail how the high-level requirements can be realized.
so finally understand that
The 4+1 architecture view o ffers a holistic approach to software architecture, encompassing different perspectives and addressing various concerns.
By examining the Logical, Process, Development, Physical, and Scenarios or Use Cases views and using relevant UML diagrams, we can better understand, design, and communicate complex software systems effectively.
Understanding these views helps architects, developers, and stakeholders collaborate, aligning their visions and ensuring successful software development projects.
you will see that some companies will have standard saying whenever their software projects architecture and design are defined they make it mandatory for architect people to develop the 4+! architecture view of the system and send it for review.
It will be document as per the company standards and it will contains all the relevant UML diagrams which covers the 4+1 view, one more thing is it is not only restrict to UML diagrams you can include the block level diagram or custom made diagrams that is also fine.
I will not cover 4+1 architecture document because all the UML diagrams and relevant diagrams which can be created in the design and prototyping phase i already covered in this section .Hence i am stopping here
Conclusion:
The 4+1 architecture view offers a holistic approach to software architecture, encompassing different perspectives and addressing various concerns.
By examining the Logical, Process, Development, Physical, and Scenarios or Use Cases views and using relevant UML diagrams, we can better understand, design, and communicate complex software systems effectively.
Understanding these views helps architects, developers, and stakeholders collaborate, aligning their visions and ensuring successful software development projects.
Thank you for your attention!
OpenCourser helps millions of learners each year. People visit us to learn workspace skills, ace their exams, and nurture their curiosity.
Our extensive catalog contains over 50,000 courses and twice as many books. Browse by search, by topic, or even by career interests. We'll match you to the right resources quickly.
Find this site helpful? Tell a friend about us.
We're supported by our community of learners. When you purchase or subscribe to courses and programs or purchase books, we may earn a commission from our partners.
Your purchases help us maintain our catalog and keep our servers humming without ads.
Thank you for supporting OpenCourser.