Software Architecture
Software Architecture
Software architecture refers to the high-level structure of a software system, defining its components,
their relationships, and the principles guiding its design and evolution. It serves as a blueprint for the
system, ensuring that it meets functional and non-functional requirements
Software engineering is a disciplined approach to the development, operation, and maintenance of
software systems. It encompasses a systematic, organized, and quantifiable process for designing,
building, testing, deploying, and maintaining software applications, ensuring that they meet specified
requirements, are delivered on time, within budget, and are of high quality.
3. Design and Architecture: Software engineering involves the design and architecture of software
systems including defining software components.
6. Project Management: It involves project planning, estimation, scheduling, and resource allocation
to ensure that software projects are completed on time, within budget, and according to
predefined scope and quality objectives.
i. Software Engineer is responsible for designing, developing, testing, and maintaining software
applications, adhering to software engineering principles and best practices.
ii. He/She is a professional who applies principles and practices of software engineering to design,
develop, test, deploy, and maintain software applications and systems.
iii. He/She possess a deep understanding of computer science fundamentals, programming
languages, software development methodologies, and tools to create efficient and reliable
software solutions.
iv. Based on the requirements, software engineers design software architectures. They create a
blueprint that outlines the structure, components, and interactions of the software system
Key Responsibilities of a Software Engineer
• Requirements Analysis: Collaborating with stakeholders to understand their needs and
requirements for software systems.
• Design and Architecture: Creating the overall structure and architecture of software systems,
including defining components, interfaces, and relationships.
• Testing and Quality Assurance: Conducting various types of testing, to ensure the quality,
reliability, and performance of software products.
• Understanding Requirements: Collaborate with stakeholders to gather and analyze functional and
nonfunctional requirements.
• Choosing Architectural Patterns: Select appropriate architectural styles based on project needs.
Evaluate trade-offs between different patterns.
• Designing Components and Interfaces: Break down the system into modular components.
• Ensuring Scalability and Performance: Design the system to handle growth in users, data, or
transactions.
• Addressing Security and Reliability: Incorporate security best practices
What is SDLC?
SDLC is a process followed for a software project, within a software organization. It consists of a detailed
plan describing how to develop, maintain, replace and alter or enhance specific software to meets or
exceeds customer expectations.
SDLC Models
1. Waterfall Model: The Waterfall model is a linear project management methodology that's often
used in software development. It's also known as the Waterfall
2. Iterative Model: The iterative model is a software development approach that breaks down
projects into smaller, manageable chunks called iterations.
3. Spiral model: The Spiral model combines iterative development with risk management. It consists
of four phases: Planning, Risk Analysis, Engineering, and Evaluation.
4. V-Model: is an approach that represents the process in a "V" shape. The left side focuses on
verification activities, while the right side focuses on validation activities.
5. Big Bang Model: The Big Bang Model is an approach that involves minimal planning and focuses
primarily on coding and implementation.
6. Agile Model: is an iterative and incremental software development approach where projects are
divided into small, manageable chunks and delivered in regular cycles
1. Understanding Stakeholder Needs – Engages users and stakeholders to capture their requirements.
2. Defining System Functionalities– Documents specific functions to ensure all necessary features are
included to meet the desired objectives.
3. Specifying Constraints– Identifies performance, legal, and compatibility limitations for compliance,
ensuring that the system operates within defined boundaries.
Types (categories) of Software Requirements
1. Functional Requirements: Define the system’s specific operations and behaviors under different
conditions.
2. Non-Functional Requirements: Address quality attributes like performance, security, and
scalability, it focus on the system's overall performance and behavior.
3. User Requirements: Focus on user interaction, experience, and expectations.
4. System Requirements: Describe interactions between the software and external components. It
defines the environment in which the software will operate and any dependencies that need to
be considered.
5. Business Requirements: Align software with organizational goals and strategies.
Requirements Elicitation Techniques
Requirements elicitation is a crucial phase in the software development lifecycle where stakeholders'
needs and expectations are identified and documented. It involves gathering, analyzing, and prioritizing
requirements to ensure that the final product meets stakeholders' objectives.
1. Interviews: Direct discussions with analysts and stakeholders for in-depth insights.
2. Surveys & Questionnaires: Collect structured feedback from a stakeholder regarding specific
requirements or features.
3. Workshops & Focus Groups: Collaborative brainstorming for requirement alignment by the
stakeholder and project team manager.
a. They enable rapid exploration of ideas, alignment of expectations, and consensus-
building.
b. Dominant personalities or groupthink may influence the outcome,
4. Prototyping: Creates visual representations to validate functionality early to stakeholders.
Requirements Specification & Documentation
1. Requirements Specification: involves capturing, analyzing, and documenting stakeholders' needs,
expectations, and constraints concerning the software system.
2. Documentation: serves as a formal record of the requirements, design, implementation, and
operation of the software system.
a. Requirements Document: Defines functional and non-functional aspects.
b. Design Document: Outlines system architecture and components.
c. Test Plan – Specifies testing strategies and cases.
d. User & Maintenance Manuals – Provide usage and system upkeep guidelines.
Software Design
Defines where the architecture, components, interfaces, and modules of a software system are defined.
It bridges the gap between requirements analysis and implementation, providing a blueprint for
developers to follow.
Architectural Patterns
Architectural patterns provide structured approaches to designing software systems. They help in
organizing components and defining interactions based on factors like scalability, maintainability, and
performance.
Common Architectural Patterns:
• Model-View-Controller (MVC): Separates application logic into Model (data and business logic),
View (user interface), and Controller (handles user input and updates the model and view).
• Layered Architecture: Divides the system into layers where each layer has a specific responsibility
and interacts with adjacent layers.
• Microservices: Decomposes systems into independently deployable services.
• Event-Driven Architecture (EDA): Uses events for asynchronous communication and scalability
within a system.
• Service-Oriented Architecture: Organizes the system into reusable, loosely coupled services.
• Hexagonal Architecture: Separates core logic from external dependencies via ports and adapters.
• Component-Based Architecture: Breaks down the system into reusable components with defined
interfaces.
Software Design Principles
These principles ensure maintainability, scalability, and efficiency in software design:
1. Single Responsibility Principle (SRP): Each module/class should have one responsibility, these to
improve clarity and maintainability.
2. Open/Closed Principle: Software entities should be extendable without modifying existing code.
3. Liskov Substitution Principle (LSP): Subtypes must be usable as their base types without affecting
functionality.
4. Interface Segregation Principle (ISP): Clients should not depend on unnecessary interfaces. it's
better to define smaller, more specific interfaces tailored to the needs of individual clients
5. Dependency Inversion Principle: High-level modules should depend on abstractions, not concrete
implementations.
Software Design Techniques
Top-Down Design: A structured method that begins with a high-level system view and progressively
breaks it down into smaller, manageable components and more detailed modules.
Steps:
Bottom-Up Design
Bottom-Up Design is a software design approach that starts with the implementation of individual
components or modules and gradually integrates them to form higher-level functionalities or systems.
Steps
Key concepts
1. Objects: Objects are the fundamental building blocks of an object-oriented system. An object
represents a real-world entity
2. Classes: A class is a blueprint or template for creating objects of a particular type. It defines the
structure and behavior of objects belonging to that class.
3. Inheritance: Inheritance is a mechanism that allows a class (subclass or derived class) to inherit
properties and behavior from another class (superclass or base class).
4. Encapsulation: Encapsulation is the principle of bundling data and methods that operate on that
data into a single unit (class) and hiding the internal implementation details from external entities.
5. Polymorphism: Polymorphism allows objects of different classes to be treated as objects of a
common superclass through method overriding and method overloading.
Design Patterns
Design patterns are reusable solutions to common problems encountered in software design. Design
patterns provide proven solutions to design challenges and promote design flexibility and
maintainability
Pros:
• it allows software to be released in iterations
• allow users to realize software benefits earlier
• Problems are detected and fixed at the early stage
• Eliminated time of project deliverables
• Top-notch quality of the final product
cons:
• rely on real-time communication
• They require a huge time commitment from users
• labor intensive because developers must fully complete each feature within each
iteration for user approval
• Requires immediate responding to issues and feedback in real-time
• Easy to get lost in details and be pulled off the project course
2. DevOps deployment methodology: DevOps is not just a development methodology but also a
set of practices that supports an organizational culture. DevOps deployment centers on
organizational change that enhances collaboration between the departments responsible for
different segments of the development life cycle
Pros:
• DevOps is focused on improving time to market
• minimizing disruption while maximizing reliability.
• shortening the lead time between fixes
Cons:
• Some customers don’t want continuous updates to their systems
• Some quality attributes require human interaction, which slows down the delivery
pipeline
• Some industries have regulations that require extensive testing
3. Waterfall development methodology: The waterfall method is a rigid linear model that consists
of sequential phases focusing on distinct goals. Each phase must be 100% complete before the
next phase can start.
Major benefit
• All the processes are easy to understand
• Enforced discipline and better keeping the timelines
• All the steps of testing scenarios are planned in advance
• No financial risks due to the high planning accuracy
• The project plan is simple and straightforward
Draw backs
• The planning stage can be too challenging to organize the entire process
• A longer time of delivery
• Weak for long or ongoing projects
• Low flexibility and inability to implement the changes once the software development
process is started
Software Testing
Software testing is an art of investigating software to ensure that its quality under test is in line with the
requirement of the client which is carried out in a systematic manner with the intent of finding defects
in a system.
major benefits of Software Testing
1. Equivalence Partitioning
• Divide the input domain into classes or partitions.
• Choose one representative value from each partition as a test case.
• Reduces the number of test cases while ensuring coverage of different input scenarios.
2. Boundary Value Analysis (BVA)
• Focuses on testing the boundaries between equivalence partitions.
• Helps uncover errors that may occur at boundary conditions.
3. Decision Table Testing
• Models’ complex business rules or logical conditions using decision tables
• Ensures comprehensive coverage of different scenarios.
4. State Transition Testing
• Suitable for systems with different states or modes
• Helps ensure that the system behaves as expected in different states
5. Use Case Testing
• Derive test cases from use cases that describe interactions between users and the
system.
• Ensures that the software meets user requirements and expectations
6. Pairwise Testing (Combinatorial Testing)
• Tests all possible pairs of input parameters while minimizing the number of tests
• Helps achieve adequate coverage with fewer test cases.
7. Error Guessing
• Helps achieve adequate coverage with fewer test cases.
• Test cases are designed to expose these anticipated errors.
What is a Test Suite?
Test suite is a container that has a set of tests which helps testers in executing and reporting the test
execution status.
Test suite is a container that has a set of tests which helps testers in executing and reporting the test
execution status.
Test suites are created based on the cycle or based on the scope. It can contain any type of tests
Automated Testing
Automated testing is a software testing technique that involves the use of specialized tools and scripts
to execute test cases and compare actual outcomes with expected results automatically.
Objectives of Automated Testing
• Saves time and effort by executing test cases quickly and repeatedly
• Enhances accuracy by eliminating human errors associated with manual testing.
• Facilitates early detection of defects, leading to better software quality.
• Improves test coverage by running a large number of test cases in a short amount of time.
• Initial setup and configuration of automated testing frameworks may require time & effort
• Maintenance of automated test scripts can become challenging as the software evolves
• Automated tests may yield false positives or false negatives if not designed and maintained
properly.
• Automated tests may yield false positives or false negatives if not designed and maintained
properly.
Regression Testing
It’s a critical aspect of software testing that ensures that recent changes or enhancements to a software
application do not adversely affect existing functionality.
1. Complete Regression Testing: Involves re-executing the entire suite of existing test cases.
2. Selective Regression Testing: Selects a subset of test cases based on the areas of the software
that are affected by recent changes.
3. Unit Regression Testing: Focuses on testing individual units or components of the software after
code modifications.
4. Partial Regression Testing: Combines aspects of complete and selective regression testing.
1. Quality Planning: Establishing quality objectives, processes, and standards for the project.
2. Quality Control: Monitoring and evaluating software development processes to ensure
compliance with quality standards and requirements.
3. Quality Assurance: Implementing systematic processes and procedures to ensure that quality
standards are followed throughout the software development lifecycle
4. Quality Improvement: Continuously improving software development processes and practices
to enhance quality and efficiency.
5. Process Improvement: Identifying inefficiencies, bottlenecks, and areas for improvement in
software development processes.
6. Training and Education: Providing training and education to software development teams on
quality standards, processes, and best practices
7. Documentation and Reporting: Documenting quality assurance processes, procedures, and
activities to ensure consistency and traceability.
Quality Assurance Processes
Quality assurance processes are systematic activities and methodologies implemented to ensure that
software products meet specified quality standards, adhere to requirements, and satisfy customer
expectations. These processes are essential for minimizing defects, optimizing efficiency, and enhancing
overall software quality.
Configuration Management
Configuration Management (CM) is a systems engineering process for establishing and maintaining
consistency of a product's performance, functional, and physical attributes with its requirements,
design, and operational information throughout its life
1. Planning and Management: This guides the design of the product, who has what
responsibilities, and includes which tools and procedures to use.
2. Identification: Allows for setting baselines and identifying the configuration of assets and/or
software.
3. Control: Maintain control of configurations, change requests, and execution of changes to a
system and its documentation.
4. Status Accounting: The process of recording and reporting configuration item descriptions and
changes from the baseline over the item’s life-cycle.
5. Verification/Audit: Be able to audit what you have implemented and maintain positive control
of all managed product.
Importances of configuration management
1. ensures that the current design and build state of the system is known
2. help in accessing accurate historical record of system
3. knowing what has changed between one set of tests and the next, it helps to identify what could
possibly be causing a fault
4. it reduces risks and errors by helping to identify and mitigate risks associated with changes to
software configurations
5. improves efficiency and productivity through streamlining development processes
Purposes
• Monitoring Progress
• Identifying Quality Issues
• Estimating Effort and Resources
• Supporting Decision-Making
1. Product Metrics: These are the measures of various characteristics of the software product.
a. Size and complexity of software.
b. Quality and reliability of software.
2. Process Metrics: These are the measures of various characteristics of the software development
process.