QB Unit 456
QB Unit 456
Programming paradigms are a way of structuring and organizing code. There are several
types of programming paradigms, each with its own strengths and weaknesses. The
following are some of the programming paradigms that can be used for advanced
development:
● Object-oriented programming (OOP): This paradigm is based on the concept of
objects, which are instances of classes that contain data and methods. OOP
promotes code reuse, encapsulation, and modularity.
● Functional programming (FP): This paradigm is based on the concept of functions,
which are self-contained blocks of code that take inputs and return outputs. FP
promotes immutability, pure functions, and declarative code.
● Procedural programming (PP): This paradigm is based on the concept of
procedures or subroutines, which are reusable blocks of code that perform a
specific task. PP promotes modularity and code organization.
● Event-driven programming (EDP): This paradigm is based on the concept of
events, which are actions or occurrences that trigger the execution of code. EDP
promotes interactivity and responsiveness.
● Aspect-oriented programming (AOP): This paradigm is based on the concept of
aspects, which are cross-cutting concerns that can be applied to multiple parts of
the codebase. AOP promotes modularization and separation of concerns.
Q3) Write a program in Java which uses the traceEnter and traceExit
method.
public class MyClass {
public static void main(String[] args) {
MyClass obj = new MyClass();
obj.traceEnter();
// Code goes here
obj.traceExit();
}
eBay is an online auction and shopping website that uses AspectJ for cross-cutting concerns
such as logging, security, and transaction management. For example, eBay uses aspects to log
user activity, enforce access control policies, and manage transactional consistency across
multiple services. Aspects allow eBay to modularize these concerns and apply them consistently
across the codebase
Q5) Build class diagram for AspectJ which use Element example
The main problem with aspect-oriented programming (AOP) is the potential for code tangling
and scattering. Code tangling occurs when the aspects become tightly coupled with the core
functionality of the system, making it difficult to reason about the codebase. Code scattering
occurs when the aspects are spread out across the codebase, making it difficult to maintain and
modify the system. AOP can also be difficult to learn and use effectively, as it requires a deep
understanding of the underlying concepts and mechanisms.
AspectJ is a powerful and flexible aspect-oriented programming (AOP) framework for Java. It
extends the Java programming language with new constructs for defining aspects, pointcuts,
and advice, and provides a runtime environment for applying aspects to the codebase. AspectJ
supports several types of advice, including before, after, and around advice, and provides a rich
set of pointcut designators for selecting join points in the codebase. AspectJ can be used to
modularize cross-cutting concerns such as logging, security, and transaction management,
making the codebase easier to reason about and maintain.
Q9) Write program in AspectJ which will use declare and
Point.clone().
Q11) Write program in aspect which will use Vector and Iterator.
before(): myPointcut() {
System.out.println("Before iterator...");
}
after(): myPointcut() {
System.out.println("After iterator...");
}
}
Q12) What is “Introduction” in aspect.
Introduction is a type of advice in aspect-oriented programming (AOP) that allows for the
addition of new methods and fields to existing classes. Introduction can be used to modify the
behavior of existing classes without modifying their source code, and can be a powerful tool for
modularizing cross-cutting concerns.
Pointcut designators are used in AspectJ to select join points in the codebase for advice
application. Some of the types of pointcut designators are:
● Execution: Selects join points at the execution of a method.
● Call: Selects join points at the call of a method.
● Field access: Selects join points at the access of a field.
● Initialization: Selects join points at the initialization of an object.
● Precedence: Selects join points based on their order of execution.
● Within: Selects join points within a specific type or package.
● Annotation: Selects join points annotated with a specific annotation.
In order to demonstrate the use of traceEnter and traceExit methods in Java, we will write a simple
program that uses these methods to log the entry and exit of a method. These methods can be useful for
debugging and tracing the flow of execution through a program.
public aspect MyAspect {
pointcut myPointcut(): execution(* com.example.MyClass.myMethod());
before(): myPointcut() {
System.out.println("Before myMethod...");
}
after(): myPointcut() {
System.out.println("After myMethod...");
}
}
Q15) Build class diagram for AspectJ which use Element example.
+-----------------------+
| Element |
+-----------------------+
| #name : String |
+-----------------------+
| +getName() : String |
| +setName(String) : void|
+-----------------------+
+-----------------------+
| MyAspect |
+-----------------------+
| |
+-----------------------+
| +myPointcut() : void |
| +myAdvice() : void |
+-----------------------+
+-----------------------+
| MyClass |
+-----------------------+
| |
+-----------------------+
| +myMethod() : void |
+-----------------------+
Unit 5:
SDA Unit 5
1. Identify uses and audience for architecture documentation
Architecture documentation is an important tool for communicating the design and structure of a
software system. It serves as a reference for developers, architects, testers, managers, and other
stakeholders involved in the development process. The following are some of the main uses and
audiences for architecture documentation:
Uses
Audience
In summary, architecture documentation is an important tool for communicating the design and
structure of a software system. Its main uses are design and development, maintenance and
support, communication, and training. Its main audience includes developers, architects, testers,
managers, and stakeholders.
Clarity
Architecture documentation should be clear and concise, using simple language and avoiding
technical jargon as much as possible. It should be easy to understand for all stakeholders,
including developers, architects, testers, managers, and others.
Completeness
Architecture documentation should be complete, covering all aspects of the system's design and
structure. It should include information about the system's components, their relationships, and
how they work together.
Consistency
Architecture documentation should be consistent, following the organization's standards and best
practices. It should be reviewed and updated regularly to ensure that it remains up-to-date and
reflects the current state of the system.
Context
Architecture documentation should provide context for the system's design and structure,
explaining why certain decisions were made and how they relate to the organization's goals and
objectives.
Variability
Architecture documentation should be flexible and adaptable to different stakeholders' needs. It
should be able to communicate the system's design and structure in different ways, depending on
the audience.
Views
Architecture documentation can be organized into different views, each of which provides a
different perspective on the system's design and structure. The following are some of the most
common views:
Functional view
The functional view describes the system's functionality and how it is organized into different
components. It includes information about the system's inputs, outputs, and the processing that
occurs between them.
Physical view
The physical view describes the system's physical components, including hardware, software,
and networks. It includes information about the system's topology, configuration, and
deployment.
Data view
The data view describes the system's data and how it is organized and stored. It includes
information about the system's data structures, data flows, and data management.
Process view
The process view describes the system's processes and how they interact with one another. It
includes information about the system's workflows, business processes, and system processes.
Development view
The development view describes the system's development process and how it is organized. It
includes information about the system's development methodology, tools, and techniques.
Please note that this is a textual representation of a use case diagram, and a visual diagram would
typically be used to present the relationships between actors and use cases more clearly. You can
use a diagramming tool or software to create an actual visual representation of the use case
diagram.
Layered Architecture
The layered architecture view organizes the system into layers, with each layer providing a
specific set of services to the layers above it. This allows the system to be modular and scalable,
with each layer handling a specific aspect of the system's functionality.
The component and connector view describes the system's components and how they interact
with one another. It includes information about the system's interfaces, ports, and connectors,
which are used to connect the components together.
Service-Oriented Architecture
The service-oriented architecture view focuses on the system's services and how they interact
with one another. It emphasizes the use of standard, reusable services that can be combined to
create larger, more complex systems.
Data-Centric Architecture
The data-centric architecture view focuses on the system's data and how it is organized and
managed. It includes information about the system's data structures, data flows, and data
management.
Object-Oriented Architecture
The object-oriented architecture view focuses on the system's objects and how they interact with
one another. It emphasizes the use of objects that encapsulate data and behavior, and can be
reused and extended to create larger, more complex systems.
In summary, module views provide a way to organize and communicate information about the
design and structure of a software system. The most common module views include the layered
architecture, component and connector, service-oriented architecture, data-centric architecture,
and object-oriented architecture views.
Textual Notations
Textual notations use natural language to describe the system's design and structure. This is the
most common type of notation used in architecture documentation, as it is easy to create and
understand. However, it can also be ambiguous and difficult to maintain.
Graphical Notations
Graphical notations use diagrams and symbols to represent the system's design and structure.
This type of notation is often used in conjunction with textual notations to provide a more
complete picture of the system. It can be easier to understand and maintain than textual
notations, but can also be more complex to create.
Mathematical Notations
Mathematical notations use formal mathematical notation to describe the system's design and
structure. This type of notation is often used in formal methods and rigorous software
engineering processes. It can be precise and unambiguous, but can also be difficult to understand
for non-mathematical stakeholders.
Tabular Notations
Tabular notations use tables and spreadsheets to organize and present information about the
system's design and structure. This type of notation is often used to present data and metrics, and
can be useful for comparing and analyzing different aspects of the system. However, it can also
be difficult to read and understand for complex systems.
Audience
The criteria should be tailored to the needs of the audience, including developers, architects,
testers, managers, and other stakeholders involved in the development process.
Purpose
The criteria should be aligned with the purpose of the documentation, whether it is for design
and development, maintenance and support, communication, or training.
Complexity
The criteria should be appropriate for the complexity of the system, considering the number of
components, their relationships, and how they work together.
The criteria should be aligned with the organization's standards and best practices for software
development and architecture.
Flexibility
The criteria should be flexible and adaptable to different stakeholders' needs, allowing for
different views and perspectives on the system's design and structure.
In summary, there are several categories of notations that can be used in architecture
documentation, including textual, graphical, mathematical, and tabular notations. When choosing
criteria for architecture documentation, it is important to consider the audience, purpose,
complexity, standards and best practices, and flexibility of the criteria.
Allocation views describe how the system's components are assigned to hardware, software, and
other resources. They provide a way to ensure that the system's components are allocated to the
appropriate resources and that the system's performance, reliability, and security requirements
are met. The following are some of the most common allocation views:
Deployment View
The deployment view describes how the system's components are deployed on hardware
resources, such as servers, workstations, and mobile devices. It includes information about the
system's topology, configuration, and deployment, and can help identify potential performance
and scalability issues.
Implementation View
The implementation view describes how the system's components are implemented in software,
such as programming languages, frameworks, and libraries. It includes information about the
system's code structure, modules, and interfaces, and can help identify potential maintenance and
update issues.
Process View
The process view describes the system's processes and how they are allocated to computing
resources. It includes information about the system's workflows, business processes, and system
processes, and can help identify potential bottlenecks and performance issues.
Network View
The network view describes how the system's components are connected to one another through
networks and other communication channels. It includes information about the system's
protocols, message formats, and security mechanisms, and can help identify potential security
and reliability issues.
Data View
The data view describes how the system's data is allocated to storage resources, such as
databases, file systems, and cloud services. It includes information about the system's data
structures, data flows, and data management, and can help identify potential data integrity and
availability issues.
In summary, allocation views provide a way to describe how the system's components are
allocated to hardware, software, and other resources. The most common allocation views include
the deployment view, implementation view, process view, network view, and data view.
Quality View
The quality view is a module view that focuses on the quality attributes of a software system,
such as performance, scalability, reliability, maintainability, and security. It describes how the
system's components and architecture support these quality attributes and how they are measured
and evaluated. The following are some examples of quality attributes and how they can be
addressed in the quality view:
Performance
Performance is the ability of the system to respond to user requests in a timely and efficient
manner. It can be addressed in the quality view by identifying performance requirements and
constraints, such as response time, throughput, and resource utilization. The quality view can
also describe how the system's architecture and components support performance, such as
through caching, load balancing, and parallel processing.
Scalability
Scalability is the ability of the system to handle increasing workloads and users without
degrading performance. It can be addressed in the quality view by identifying scalability
requirements and constraints, such as maximum capacity, growth rate, and resource allocation.
The quality view can also describe how the system's architecture and components support
scalability, such as through horizontal and vertical scaling, partitioning, and clustering.
Reliability
Reliability is the ability of the system to operate correctly and consistently under different
conditions and circumstances. It can be addressed in the quality view by identifying reliability
requirements and constraints, such as availability, fault tolerance, and error handling. The quality
view can also describe how the system's architecture and components support reliability, such as
through redundancy, failover, and recovery mechanisms.
Maintainability
Maintainability is the ability of the system to be easily modified, updated, and extended over
time. It can be addressed in the quality view by identifying maintainability requirements and
constraints, such as modularity, extensibility, and testability. The quality view can also describe
how the system's architecture and components support maintainability, such as through
abstraction, encapsulation, and separation of concerns.
Security
Security is the ability of the system to protect against unauthorized access, use, or disclosure of
sensitive information. It can be addressed in the quality view by identifying security
requirements and constraints, such as confidentiality, integrity, and availability. The quality view
can also describe how the system's architecture and components support security, such as through
authentication, authorization, encryption, and auditing.
In summary, the quality view is a module view that focuses on the quality attributes of a software
system, such as performance, scalability, reliability, maintainability, and security. It describes
how the system's components and architecture support these quality attributes and how they are
measured and evaluated.
Diagram
Components
Relationships
Properties
Rationale
Examples
Provide any relevant examples or use cases that demonstrate the view in action.
The primary presentation in architecture should be designed with the system's users in mind. It
should be intuitive and user-friendly, with a clear and consistent layout and navigation. It should
also be designed to meet the system's performance, scalability, reliability, maintainability, and
security requirements.
In summary, the primary presentation in architecture is the way in which the software system is
organized and presented to its users. It should be designed to be intuitive, easy to use, and
efficient, and should be consistent with the system's overall design and structure. Different views
can be used to provide different perspectives on the system's design and structure, and the
primary presentation should be designed with the system's users and requirements in mind.
Documentation Package A
Documentation package A includes all the documentation related to the software system's
architecture, design, and implementation. This documentation provides a detailed description of
the system's components, their relationships, and how they work together to provide the system's
functionality. The following are some of the documents included in package A:
Architecture Documentation
Architecture documentation describes the system's architecture and provides a high-level view of
its design and structure. It includes information about the system's components, their
relationships, and how they work together. Architecture documentation can be organized into
different views, each of which provides a different perspective on the system's design and
structure.
Design Documentation
Design documentation provides a detailed description of the system's design, including the
detailed design of its components, their interfaces, and their interactions. It includes information
about the system's data structures, algorithms, and other implementation details.
Implementation Documentation
Implementation documentation provides a detailed description of the system's implementation,
including its code, configuration files, and other implementation artifacts. It includes information
about the system's programming languages, libraries, and other software components.
Test Documentation
Test documentation provides a detailed description of the system's testing process, including test
plans, test cases, and test results. It includes information about the system's testing methodology,
tools, and techniques.
Documentation Package B
Documentation package B includes all the documentation related to the software system's
operation, maintenance, and support. This documentation provides a detailed description of the
system's operation, including how to install, configure, and use the system. The following are
some of the documents included in package B:
User Documentation
User documentation provides a detailed description of the system's functionality and how to use
it. It includes information about the system's user interface, features, and capabilities. User
documentation should be designed to be intuitive and user-friendly, with clear and concise
instructions.
Operations Documentation
Maintenance Documentation
Support Documentation
Support documentation provides a detailed description of the system's support process, including
how to report and resolve issues. It includes information about the system's support channels, as
well as instructions for reporting and resolving issues.
In summary, documentation package A includes all the documentation related to the software
system's architecture, design, and implementation, while documentation package B includes all
the documentation related to the software system's operation, maintenance, and support. Both
packages are essential for ensuring the system's successful development, deployment, and
maintenance.
Performance Scenario
A performance scenario might involve documenting how quickly a system can respond to a
particular user request or workload. This scenario could include identifying specific performance
requirements and constraints, such as response time, throughput, and resource utilization. The
quality view might describe how the system's architecture and components support performance,
such as through caching, load balancing, and parallel processing.
Scalability Scenario
A scalability scenario might involve documenting the system's ability to handle increasing
workloads and users without impacting performance. This scenario could include identifying
scalability requirements and constraints, such as maximum capacity, growth rate, and resource
allocation. The quality view might describe how the system's architecture and components
support scalability, such as through horizontal and vertical scaling, partitioning, and clustering.
Reliability Scenario
A reliability scenario might involve documenting the system's ability to operate correctly and
consistently under different conditions and circumstances. This scenario could include
identifying reliability requirements and constraints, such as availability, fault tolerance, and error
handling. The quality view might describe how the system's architecture and components support
reliability, such as through redundancy, failover, and recovery mechanisms.
Maintainability Scenario
A maintainability scenario might involve documenting the ease with which the system can be
modified, updated, and extended over time. This scenario could include identifying
maintainability requirements and constraints, such as modularity, extensibility, and testability.
The quality view might describe how the system's architecture and components support
maintainability, such as through abstraction, encapsulation, and separation of concerns.
Security Scenario
A security scenario might involve documenting the system's ability to protect against
unauthorized access, use, or disclosure of sensitive information. This scenario could include
identifying security requirements and constraints, such as confidentiality, integrity, and
availability. The quality view might describe how the system's architecture and components
support security, such as through authentication, authorization, encryption, and auditing.
In summary, there are many different quality view scenarios that might come up when
documenting software architecture, including performance, scalability, reliability,
maintainability, and security scenarios. Each scenario involves identifying specific requirements
and constraints and describing how the system's architecture and components support them.
A communication diagram is a type of UML diagram that shows the interactions between objects
or components in a system. It can be used to document the behavior of a software system by
illustrating how different components communicate with one another. The following is an
example of a communication diagram for a basic login process:
+-------------------+ +-------------------------+
| User | | Authentication Service |
+-------------------+ +-------------------------+
| - username | | - authenticate(username, |
| - password |--------| password) |
| | +-------------------------+
| |
| login(username, |
| password) |
| |
+-------------------+
In this diagram, the user and the authentication service are represented as objects. The user
object has two attributes, username and password, which are used to store the user's login
credentials. The authentication service object has one method, authenticate, which takes the
user's username and password as parameters and returns a Boolean value indicating whether the
authentication was successful.
The communication diagram shows the interaction between the user and the authentication
service during the login process. The user sends a login message to the authentication service,
passing in their username and password as parameters. The authentication service then calls its
authenticate method, passing in the username and password, and returns a Boolean value
indicating whether the authentication was successful.
The communication diagram can be used to document the behavior of other parts of the system
as well, such as the interactions between different components or services. It can also be used to
identify potential bottlenecks or performance issues in the system by analyzing the flow of
messages between components.
In summary, a communication diagram is a type of UML diagram that shows the interactions
between objects or components in a system. It can be used to document the behavior of a
software system by illustrating how different components communicate with one another.
15. Draw and elaborate use case diagram for documenting behavior.
16. Draw and elaborate state chart diagram for documenting behavior.
+-------------------+
| Documenting Behavior |
+-------------------+
|
+----+----+
| User |
+----------+
|
+-------------------------+
| Behavior Recording |
+-------------------------+
| +-----------------+ |
| | Idle | |
| +-----------------+ |
| | |
| | User Action |
| V |
| +-----------------+ |
| | Recording | |
| +-----------------+ |
| | |
| | Stop |
| V |
| +-----------------+ |
| | Stopped | |
| +-----------------+ |
+-------------------------+
In this state chart diagram:
● User Action: This event transitions the system from the "Idle" state to the "Recording"
state, indicating that the user has initiated the behavior recording process.
● Stop: This event transitions the system from the "Recording" state to the "Stopped" state,
indicating that the user has stopped the behavior recording process.
The state chart diagram illustrates the behavior of the "Documenting Behavior" system in terms
of its states and the events triggering transitions between those states. It provides a visual
representation of how the system behaves during the process of documenting user behavior.
17. Draw sequence diagram for documenting behavior and mention execution occurrences on
it
+-----------------------+
| Documenting Behavior |
+-----------------------+
|
+---+---+
| User |
+-------+
|
| User Action: Start Recording
|----------------------------------->|
| |
| Create Recording Instance |
|----------------------------------->|
| |
| Record User Behavior |
|----------------------------------->|
| |
| User Action: Stop Recording |
|----------------------------------->|
| |
| Save Recorded Behavior |
|----------------------------------->|
| |
This sequence diagram provides a visual representation of the interactions and steps involved in
the process of documenting behavior. It shows the sequence of events between the user and the
system, indicating the flow of control and the order of execution occurrences.
18. Draw activity diagram for documenting behavior and mention connection occurrences on
it.
+-----------------------+
| Documenting Behavior |
+-----------------------+
|
+--------+--------+
| User |
+-----------------+
|
+---------------+
| Start Recording |
+---------------+
|
+------------------+
| Record Behavior |
+------------------+
|
+---------------+
| Stop Recording |
+---------------+
|
+------------------+
| Save Documentation |
+------------------+
|
The activity diagram starts with the "Start Recording" activity, indicating the user's action to
initiate the recording process. From there, the flow moves to the "Record Behavior" activity,
representing the actual behavior recording. Once the recording is complete, the flow continues to
the "Stop Recording" activity, indicating the user's action to end the recording.
Finally, the flow moves to the "Save Documentation" activity, representing the step of saving the
recorded behavior as documentation.
This activity diagram provides a visual representation of the sequential flow of activities
involved in documenting behavior. It illustrates the connection occurrences and the order in
which the activities are performed.
UNIT 6
SDA Unit 6
1. What is architecture evaluation and why is it important in
software development?
Architecture evaluation is the process of analyzing and reviewing the design and implementation
of a software system's architecture. It is important in software development as it helps ensure that
the architecture meets the requirements and needs of stakeholders, is scalable, maintainable, and
can evolve over time. It also helps identify potential issues and risks early in the development
process, reducing the likelihood of costly errors and delays.
Example: A software development team is tasked with designing a new e-commerce platform for
a large retailer. They perform architecture evaluation to ensure that the architecture meets the
high transaction volumes and scalability requirements, aligns with the business goals, and is
easily maintainable.
● Reviews: A group of stakeholders review the architecture design, looking for potential
issues and areas of improvement.
● Walkthroughs: A group of stakeholders walk through the architecture design, discussing
potential issues and areas of improvement.
● Simulations: The architecture is simulated to determine its performance and scalability.
● Analysis: The architecture is analyzed using various tools and techniques to identify
potential issues and areas of improvement.
Example: A development team is tasked with evaluating the architecture of a new system. They
perform a design review and simulation to identify potential issues and areas of improvement.
● Ensuring that the architecture aligns with the business goals and objectives.
● Identifying potential issues and risks early in the development process.
● Reducing the cost and impact of changes to the architecture.
● Improving the overall quality of the software architecture.
● Ensuring that the architecture is scalable and can meet the needs of future requirements.
● Improving the maintainability of the system.
Example: A development team is tasked with evaluating the architecture of a new system. They
encounter challenges in identifying all potential issues and obtaining stakeholder buy-in.
Example: A development team uses ATAM to evaluate the architecture of a new system. They
identify tradeoffs between performance and scalability and determine that the architecture aligns
with the business goals and objectives.
Example: A development team uses ATAM to evaluate the architecture of a new system. They
identify the stakeholders and their concerns, develop a list of quality attributes and scenarios,
analyze the architecture with respect to the quality attributes and scenarios, generate a list of
tradeoffs between the quality attributes, and develop a set of recommendations.
7. Discuss the advantages and limitations of using ATAM as an
architecture evaluation method.
The advantages of using ATAM as an architecture evaluation method are:
● It helps identify potential issues and risks early in the development process.
● It helps ensure that the architecture aligns with the business goals and objectives.
● It helps identify tradeoffs between different architectural qualities.
Example: A development team uses ATAM to evaluate the architecture of a new system. They
encounter some limitations, such as difficulty in identifying all potential issues and risks.
● Architecture tactics are design decisions that address specific quality attributes of a
system.
● They provide a structured way to evaluate how well the architecture meets the
requirements of stakeholders.
● They help identify potential issues and risks related to specific quality attributes.
Example: A development team uses architecture tactics to address the performance and
scalability requirements of a new system. They evaluate how well the architecture meets these
requirements and identify potential issues and risks.
10. Explain the concept of reverse engineering in software
architecture and its purpose.
Reverse engineering in software architecture is the process of analyzing an existing software
system to understand its architecture and design. The purpose of reverse engineering is to gain a
better understanding of how the system works, identify potential issues and risks, and identify
opportunities for improvement.
11. What are the common techniques or tools used for reverse
engineering software architecture?
The common techniques or tools used for reverse engineering software architecture are:
● Source code analysis: Analyzing the source code of the system to understand its
architecture.
● Dynamic analysis: Analyzing the behavior of the system at runtime to understand its
architecture.
● Visualization: Representing the architecture of the system visually to gain a better
understanding.
Example: A development team uses source code analysis and visualization tools to perform
reverse engineering on an existing software system.
Example: A development team uses software visualization tools to represent the architecture of a
software system and gain a better understanding of how it works.
● Structural visualization: Visualizing the structure of the system, such as its modules and
components.
● Behavioral visualization: Visualizing the behavior of the system, such as its interactions
with external systems.
● Data visualization: Visualizing the data flow and relationships within the system.
Example: A development team uses structural visualization techniques to visualize the modules
and components of a software system.
Example: A development team uses software visualization to identify patterns and dependencies
in the architecture of a software system.