Basics of Software Engineering (5)
Basics of Software Engineering (5)
T
AF
BASICS OF SOFTWARE ENGINEERING
DR
LECTURER: Paul, J.
April 2, 2025
• Lectures
• Group Assignment + Practical :15 Marks
T
• Individual Ass. :5 Marks
• Attendance :5 Marks
AF
• Quiz 1 :2.5 Marks
• Test 1 :5 Marks
DR
• Quiz 2 :2.5 Marks
• Test 2 :5 Marks
• Continuous Assessment (40%)
• Semester Examination (60%)
T
2 Software development processes
AF
3 Agile Software development
4 Requirements engineering
5 System modeling
DR
6 Software testing
T
instructions and code written by developers on any of various particular
computer languages.
AF
Engineering: is the application of scientific and practical knowledge
to invent, design, build, maintain, and improve frameworks, processes, etc.
Or
DR
Engineering on the other hand, is all about developing products, using
well-defined, scientific principles and methods.
Therefore: Software Engineering provides a standard procedure to design
and develop software.
IEEE (Institute of Electrical and Electronic Engineering) defines software
engineering as: The application of a systematic, disciplined, quantifiable
approach to the development, operation and maintenance of software.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 4 / 50
What is Software Engineering?
Software Engineering is the process of designing, developing, testing, and
maintaining software. It is a systematic and disciplined approach to
software development that aims to create high-quality, reliable, and
maintainable software. Software engineering includes a variety of
techniques, tools, and methodologies, including requirements analysis,
T
design, testing, and maintenance.
Software Engineering = Designing + Developing + Testing + Maintaining
AF
Software.
Software Product
DR
T
⊛ By following the principles of software engineering and using the
appropriate tools and methodologies, software developers can create
AF
high-quality, reliable, and maintainable software that meets the needs
of its users.
⊛ Software Engineering is mainly used for large projects based on
DR
software systems rather than single programs or applications.
⊛ The main goal of Software Engineering is to develop software
applications for improving quality, budget, and time efficiency.
⊛ Software Engineering ensures that the software that has to be built
should be consistent, correct, also on budget, on time, and within the
required requirements.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 6 / 50
Key Principles of Software Engineering
⊙ Modularity: Breaking the software into smaller, reusable components
that can be developed and tested independently.
⊙ Abstraction: Hiding the implementation details of a component and
exposing only the necessary functionality to other parts of the
T
software.
⊙ Encapsulation: Wrapping up the data and functions of an object
AF
into a single unit, and protecting the internal state of an object from
external modifications.
⊙ Reusability: Creating components that can be used in multiple
DR
projects, which can save time and resources.
⊙ Maintenance: Regularly updating and improving the software to fix
bugs, add new features, and address security vulnerabilities.
⊙ Testing: Verifying that the software meets its requirements and is
free of bugs.
⊙ Design Patterns: Solving recurring problems in software design by
providing templates for solving them.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 7 / 50
Key Principles of Software Engineering, Cont...
T
⊙ Agile methodologies: Using iterative and incremental development
processes that focus on customer satisfaction, rapid delivery, and
AF
flexibility.
⊙ Continuous Integration & Deployment: Continuously integrating
the code changes and deploying them into the production
DR
environment.
T
1 Efficiency: It provides a measure of the resource requirement of a
AF
software product efficiently.
2 Reliability: It assures that the product will deliver the same results
when used in similar working environment.
DR
3 Reusability: This attribute makes sure that the module can be used
in multiple applications.
4 Maintainability: It is the ability of the software to be modified,
repaired, or enhanced easily with changing requirements.
T
1 As a Product
AF
• It delivers computing potential across networks of Hardware.
• It enables the Hardware to deliver the expected functionality.
• It acts as an information transformer because it produces, manages,
acquires, modifies, displays, or transmits information.
DR
2 As a vehicle for delivering a product
• It provides system functionality (e.g., payroll system).
• It controls other software (e.g., an operating system).
• It helps build other software (e.g., software tools).
T
⊚ Correctness: A software product is correct if the different requirements
specified in the SRS Document have been correctly implemented.
AF
⊚ Reusability: A software product has good reusability if the different
modules of the product can easily be reused to develop new products.
DR
⊚ Testability: Here software facilitates both the establishment of test
criteria and the evaluation of the software concerning those criteria.
⊚ Reliability: It is an attribute of software quality. The extent to which
a program can be expected to perform its desired function, over an
arbitrary time period.
⊚ Portability: In this case, the software can be transferred from one
computer system or environment to another.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 11 / 50
Objectives of Software Engineering, Cont...
T
⊚ Adaptability: In this case, the software allows differing system
constraints and the user needs to be satisfied by making changes to
AF
the software.
⊚ Interoperability: Capability of 2 or more functional units to process
data cooperatively.
DR
T
Following are the job choices in software engineering:
AF
⋄ SWE (Software Engineer)
⋄ SDE ( Software Development Engineer)
⋄ Web Developer
DR
⋄ Quality Assurance Engineer
⋄ Web Designer
⋄ Software Test Engineer
⋄ Cloud Engineer ·
⋄ Front-End Developer
⋄ Back-End Developer
⋄ DevOps Engineer.
⋄ Security Engineer.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 13 / 50
What Tasks do Software Engineers do?
T
complete various projects and develop solutions to satisfy certain customer
or corporate demands.
AF
Some of the key responsibilities of software engineer are:
1 Requirement Analysis
2 Testing and Debugging
DR
3 Code Review
4 Maintenance
5 Documentation
T
needed by software to increase quality of software product. These
AF
requirements are generally a type of expectation of user from software
product that is important and need to be fulfilled by software.
Analysis means to examine something in an organized and specific
manner to know complete details about it.
DR
Therefore, Software requirement analysis simply means complete
study, analyzing, describing software requirements so that
requirements that are genuine and needed can be fulfilled to solve
problem.
T
AF
DR
T
⊗ Evaluation and Synthesis: Evaluation means judgement about
something whether it is worth or not and synthesis means to create or
AF
form something. Here are some tasks are given that is important in
the evaluation and synthesis of software requirement:
• To define all functions of software that necessary.
DR
• To define all data objects that are present externally and are easily
observable.
• To evaluate that flow of data is worth or not.
• To fully understand overall behavior of system that means overall
working of system.
• To identify and discover constraints that are designed.
• To define and establish character of system interface to fully
understand how system interacts with two or more components or with
one another.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 17 / 50
⊗ Modeling :
After complete gathering of information from above tasks, functional
and behavioral models are established after checking function and
behavior of system using a domain model that also known as the
conceptual model.
T
⊗ Specification :
The software requirement specification (SRS) which means to specify
AF
the requirement whether it is functional or non-functional should be
developed.
⊗ Review :
DR
After developing the SRS, it must be reviewed to check whether it
can be improved or not and must be refined to make it better and
increase the quality.
The software requirement specification (SRS) will be discussed
later
T
What is Software Testing?
Software testing is an important process in the software development
AF
lifecycle. It involves verifying and validating that a software application is
free of bugs, meets the technical requirements set by its design and
development, and satisfies user requirements efficiently and effectively.
DR
This process ensures that the application can handle all exceptional and
boundary cases, providing a robust and reliable user experience. By
systematically identifying and fixing issues, software testing helps deliver
high-quality software that performs as expected in various scenarios. The
process of software testing aims not only at finding faults in the existing
software but also at finding measures to improve the software in terms of
efficiency, accuracy, and usability.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 19 / 50
What is Software Testing?
T
in contrast to actual requirements. It mainly aims at measuring the
specification, functionality, and performance of a software program or
AF
application.
Two Steps in Software Testing
DR
◦ Verification: It refers to the set of tasks that ensure that the
software correctly implements a specific function. It means “Are we
building the product right?”.
◦ Validation: It refers to a different set of tasks that ensure that the
software that has been built is traceable to customer requirements. It
means “Are we building the right product?”.
T
defects in the software, and fixing them improves the quality of the
software.
AF
⋆ Increased Customer Satisfaction: Software testing ensures
reliability, security, and high performance which results in saving time,
costs, and customer satisfaction.
DR
⋆ Helps with Scalability: Software testing type non-functional testing
helps to identify the scalability issues and the point where an
application might stop working.
⋆ Saves Time and Money: After the application is launched it will be
very difficult to trace and resolve the issues, as performing this
activity will incur more costs and time. Thus, it is better to conduct
software testing at regular intervals during software development.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 21 / 50
Need for Software Testing
Software bugs can cause potential monetary and human loss. There are
many examples in history that clearly depicts that without the testing
phase in software development lot of damage was incurred. Below are
some examples:
T
◦ 1985: Canada’s Therac-25 radiation therapy malfunctioned due to a
software bug and resulted in lethal radiation doses to patients leaving
AF
3 injured and 3 people dead.
◦ 1994: China Airlines Airbus A300 crashed due to a software bug
killing 264 people.
DR
◦ 1996: A software bug caused U.S. bank accounts of 823 customers to
be credited with 920 million US dollars.
◦ 1999: A software bug caused the failure of a $1.2 billion military
satellite launch.
◦ 2015: A software bug in fighter plan F-35 resulted in making it
unable to detect targets correctly.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 22 / 50
◦ 2015: Bloomberg terminal in London crashed due to a software bug
affecting 300,000 traders on the financial market and forcing the
T
government to postpone the 3bn pound debt sale. Starbucks was
forced to close more than 60% of its outlet in the U.S. and Canada
AF
due to a software failure in its POS system.
◦ Nissan cars were forced to recall 1 million cars from the market due to
a software failure in the car’s airbag sensory detectors.
DR
T
into 3 types:
AF
1 Functional Testing: It is a type of software testing that validates the
software systems against the functional requirements. It is performed
to check whether the application is working as per the software’s
DR
functional requirements or not. Various types of functional testing are
Unit testing, Integration testing, System testing, Smoke testing, and
so on.
2 Non-Functional Testing: It is a type of software testing that checks
the application for non-functional requirements like performance,
scalability, portability, stress, etc. Various types of non-functional
testing are Performance testing, Stress testing, Usability Testing, and
so on.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 24 / 50
3 Maintenance Testing: It is the process of changing, modifying, and
updating the software to keep up with the customer’s needs. It
involves regression testing that verifies that recent changes to the
code have not adversely affected other previously working parts of the
software.
Apart from the above classification software testing can be further divided
into 2 more ways of testing:
T
⋇ Manual Testing: It includes testing software manually, i.e., without
using any automation tool or script. In this type, the tester takes over
AF
the role of an end-user and tests the software to identify any
unexpected behavior or bug. There are different stages for manual
testing such as unit testing, integration testing, system testing, and
DR
user acceptance testing. Testers use test plans, test cases, or test
scenarios to test software to ensure the completeness of testing.
Manual testing also includes exploratory testing, as testers explore the
software to identify errors in it.
⋇ Automation Testing: It is also known as Test Automation, is when
the tester writes scripts and uses another software to test the
product. This process involves the automation of a manual process.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 25 / 50
⋇ Automation Testing: It is also known as Test Automation, is when
the tester writes scripts and uses another software to test the
product. This process involves the automation of a manual process.
Automation Testing is used to re-run the test scenarios quickly and
repeatedly, that were performed manually in manual testing.
Different Types of Software Testing Techniques
T
· Black box Testing: Testing in which the tester doesn’t have access
AF
to the source code of the software and is conducted at the software
interface without any concern with the internal logical structure of
the software known as black-box testing.
DR
· White box Testing: Testing in which the tester is aware of the
internal workings of the product, has access to its source code, and is
conducted by making sure that all internal operations are performed
according to the specifications is known as white box testing.
· Grey Box Testing: Testing in which the testers should have
knowledge of implementation, however, they need not be experts.
T
individual units are combined and tested as a group. The purpose of
this level of testing is to expose faults in the interaction between
AF
integrated units.
⊖ System Testing: It is a level of the software testing process where a
complete, integrated system/software is tested. The purpose of this
DR
test is to evaluate the system’s compliance with the specified
requirements.
⊖ Acceptance Testing: It is a level of the software testing process where
a system is tested for acceptability. The purpose of this test is to
evaluate the system’s compliance with the business requirements and
assess whether it is acceptable for delivery.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 27 / 50
Best Practices for Software Testing
∗ Continuous Testing: Project teams test each build as it becomes
available thus it enables software to be validated in real environments
earlier in the development cycle, reducing risks and improving the
functionality and design.
∗ Involve Users: It is very important for the developers to involve users
T
in the process and open-ended questions about the functionality
AF
required in the application. This will help to develop and test the
software from the customer’s perspective.
∗ Divide Tests into Smaller Parts: Dividing tests into smaller
DR
fractions save time and other resources in environments where
frequent testing needs to be conducted. This also helps teams to
make better analyses of the tests and the test results.
∗ Metrics and Reporting: Reporting enables the team members to
share goals and test results. Advanced tools integrate the project
metrics and present an integrated report in the dashboard that can be
easily reviewed by the team members to see the overall health of the
project.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 28 / 50
∗ Don’t Skip Regression Testing: Regression testing is one of the
most important steps as it encourages the validation of the
application. Thus, it should not be skipped.
∗ Programmers Should Avoid Writing Tests: Test cases are usually
T
written before the start of the coding phase so it is considered a best
practice for programmers to avoid writing test cases as they can be
AF
biased towards their code and the application.
∗ Service Virtualization: Service virtualization simulates the systems
and services that are not yet developed or are missing. Thus, enabling
DR
teams to reduce dependency and start the testing process sooner.
They can modify, and reuse the configuration to test different
scenarios without having to alter the original environment.
T
vulnerabilities in the software early in the development phase so that
the detected bugs can be fixed before the delivery of the product.
AF
Usability testing is a type of software testing that checks the
application for how easily usable it is for the users to use the
application.
DR
⋆ Cost-Effective: Testing any project on time helps to save money and
time for the long term. If the bugs are caught in the early phases of
software testing, it costs less to fix those errors.
⋆ Security: Security testing is a type of software testing that is focused
on testing the application for security vulnerabilities from internal or
external sources.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 30 / 50
What is Debugging in Software Engineering?
Debugging in Software Engineering is the process of identifying and
resolving errors or bugs in a software system. It’s a critical aspect of
software development, ensuring quality, performance, and user satisfaction.
Despite being time-consuming, effective debugging is essential for reliable
and competitive software products.
T
AF
DR
T
AF
DR
T
· Developers often use debugging tools to help with this step.
Step 3: Identify the Root Cause
AF
⊙
· Now, figure out why the bug happened. Examine the logic and flow of
your code and see how different parts interact under the conditions
that caused the bug.
DR
· This helps you understand what went wrong.
⊙ Step 4: Fix the Bug
· Once you know the cause, fix the code. This involves making changes
and then testing the program to ensure the bug is gone.
· Sometimes, you might need to try several times, as initial fixes might
not work or could create new issues.
· Using a version control system helps track changes and undo any that
don’t solve the problem.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 33 / 50
⊙ Step 5: Test the Fix
· Unit Tests: Check the specific part of the code that was changed.
· Integration Tests: Verify the entire module where the bug was found.
· System Tests: Test the whole system to ensure overall functionality.
· Regression Tests: Make sure the fix didn’t cause any new problems
elsewhere in the application.
⊙ Step 6: Document the Process
T
· Finally, record what you did. Write down what caused the bug, how
you fixed it, and any other important details.
AF
· This documentation is helpful if similar issues occur in the future.
T
⋆ Backtracking: Backward analysis of the problem which involves
AF
tracing the program backward from the location of the failure
message to identify the region of faulty code. A detailed study of the
region is conducted to find the cause of defects.
DR
⋆ Forward analysis of the program involves tracing the program
forwards using breakpoints or print statements at different points in
the program and studying the results. The region where the wrong
outputs are obtained is the region that needs to be focused on to find
the defect.
⋆ Using A debugging experience with the software debug the
software with similar problems in nature. The success of this
approach depends on the expertise of the debugger.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 35 / 50
Debugging Approaches/Strategies, Cont...
⋆ Cause elimination: it introduces the concept of binary partitioning.
Data related to the error occurrence are organized to isolate potential
causes.
⋆ Static analysis: Analyzing the code without executing it to identify
potential bugs or errors. This approach involves analyzing code
T
syntax, data flow, and control flow.
AF
⋆ Dynamic analysis: Executing the code and analyzing its behavior at
runtime to identify errors or bugs. This approach involves techniques
like runtime debugging and profiling.
DR
⋆ Collaborative debugging: Involves multiple developers working
together to debug a system. This approach is helpful in situations
where multiple modules or components are involved, and the root
cause of the error is not clear.
⋆ Logging and Tracing: Using logging and tracing tools to identify the
sequence of events leading up to the error. This approach involves
collecting and analyzing logs and traces generated by the system
during its execution.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 36 / 50
Debugging Approaches/Strategies, Cont...
T
Examples of error during debugging
⋄ Syntax error
AF
⋄ Logical error
⋄ Runtime error
⋄ Stack overflow
DR
⋄ Index Out of Bound Errors
⋄ Infinite loops
⋄ Concurrency Issues
⋄ I/O errors
⋄ Environment Dependencies
⋄ Integration Errors
⋄ Reference error
⋄ Type error
T
capabilities, including AI-driven debuggers and autonomous debugging for
AF
specialized applications. These are the debugging tools:
DR
T
allow developers to:
• Execute code line-by-line (step debugging)
AF
• Stop program execution at specific points (breakpoints)
• Examine the state of variables and memory
⊖ Standalone Debuggers:
Standalone debuggers like GDB (GNU Debugger) provide advanced
DR
debugging features:
• Conditional breakpoints and watchpoints
• Reverse debugging (running a program backwards)
⊖ Logging Utilities:
Logging utilities log a program’s state at various points in the code,
which can then be analyzed to find problems. Logging is particularly
useful for debugging issues that only occur in production
environments.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 39 / 50
⊖ Static Code Analyzers:
Static code analysis tools examine code without executing it to find
potential errors and deviations from coding standards. They focus on
the semantics of the source code, helping developers catch common
mistakes and maintain consistent coding styles.
T
⊖ Dynamic Analysis Tools:
Dynamic analysis tools monitor software as it runs to detect issues
AF
like resource leaks or concurrency problems. These tools help catch
bugs that static analysis might miss, such as memory leaks or buffer
overflows.
DR
⊖ Performance Profilers:
Performance profilers help developers identify performance
bottlenecks in their code. They measure:
• CPU usage
• Memory usage
• I/O operations
T
Debugging is different from testing. Testing focuses on finding bugs,
errors, etc whereas debugging starts after a bug has been identified in the
AF
software. Testing is used to ensure that the program is correct and it was
supposed to do with a certain minimum success rate. Testing can be
manual or automated. There are several different types of testing unit
DR
testing, integration testing, alpha, and beta testing, etc.
T
software system can be made more stable and less likely to experience
downtime, which can result in improved availability for users.
AF
⊕ Increased user satisfaction: By identifying and resolving bugs, a
software system can be made more user-friendly and better able to
meet the needs of users, which can result in increased satisfaction.
DR
⊕ Reduced development costs: Identifying and resolving bugs early in
the development process, can save time and resources that would
otherwise be spent on fixing bugs later in the development process or
after the system has been deployed.
⊕ Increased security: By identifying and resolving bugs that could be
exploited by attackers, a software system can be made more secure,
reducing the risk of security breaches.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 42 / 50
Advantages of Debugging, Cont...
T
that would have been caused by the changes.
Better understanding of the system: Debugging can help
AF
⊕
developers gain a better understanding of how a software system
works, and how different components of the system interact with one
another.
DR
⊕ Facilitates testing: By identifying and resolving bugs, it makes it
easier to test the software and ensure that it meets the requirements
and specifications.
T
⊗ Requires specialized skills: Debugging can be a complex task that
requires specialized skills and knowledge. This can be a challenge for
AF
developers who are not familiar with the tools and techniques used in
debugging.
⊗ Can be difficult to reproduce: Some bugs may be difficult to
DR
reproduce, which can make it challenging to identify and resolve them.
⊗ Can be difficult to diagnose: Some bugs may be caused by
interactions between different components of a software system, which
can make it challenging to identify the root cause of the problem.
⊗ Can be difficult to fix: Some bugs may be caused by fundamental
design flaws or architecture issues, which can be difficult or impossible
to fix without significant changes to the software system.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 44 / 50
Disadvantages of Debugging, Cont...
T
⊗ Limited insight: In some cases, debugging tools can only provide
limited insight into the problem and may not provide enough
AF
information to identify the root cause of the problem.
⊗ Can be expensive: Debugging can be an expensive process,
especially if it requires additional resources such as specialized
DR
debugging tools or additional development time.
T
operations of software, this process takes place which ultimately delivers
the best product. Do several questions arise after this process like whether
AF
the code is secure? Is it well-designed? Is the code free of error? As per
the survey, on average programmers make a mistake once at every five
lines of the code. To rectify these bugs Code Review comes into the
DR
picture. Reviewing a code typically means checking whether the code
passes the test cases, has bugs, repeated lines, and various possible errors
which could reduce the efficiency and quality of the software. Reviews can
be good and bad as well. Good ones lead to more usage, growth, and
popularity of the software whereas bad ones degrade the quality of
software.
T
them into sections. Set a goal to review at least 5 files of the first
folder in n no of days and once you complete reviewing it, go for the
AF
next folder. Like this, when you assign yourself a task for some time,
you’ll get sufficient time to review, and thus, you will not feel bored
or disinterested.
DR
2 Ask Fellow Developers to Review
This is the second step of the code review process. You must seek
advice or help from fellow developers as everyone’s contribution is
equally important. Experienced ones can identify the mistakes within
a second and rectify them but the young minds come up with more
simple ways to implement a task. So, ask your juniors as they have
the curiosity to learn more.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 47 / 50
3 Basic Principles: Naming Conventions, Usage of libraries,
Responsiveness
There are some principles and standards to follow while writing code.
There has to be followed to enhance the effectiveness and
productivity. Make a note of those principles and check one-by-one
whether they are followed or not.
T
4 Check For the Reusability of Code
Functions are reusable blocks of code. A piece of code that does a
AF
single task that can be called whenever required. Avoid repetition of
codes. Check if you’ve to repeat code for different tasks, again and
again, so there you can use these functions to reduce the repeatability
DR
of code.
5 Check Test Cases and Re-Build
This is the final step of the code review process. When you have
rectified all the possible errors while reviewing, check if all the test
cases are passed, all the conditions are satisfied. There are various
tests such as functionality, usability, interface, performance, and
security testing.
LECTURER: Paul, J. BASICS OF SOFTWARE ENGINEERING April 2, 2025 48 / 50
Individual Assignment
1 By Using software design techniques in software development process
∗ Explain characteristics of good software design.
∗ Identify items developed during the design phase.
T
∗ Explain Process/Function Oriented design approach.
Explain Data Flow Diagrams (DFDs) and its importance.
AF
∗
T
∗ Describe the concept of CASE tools in Software Engineering.
AF
∗ Show in detail how to apply ”Use Case” diagrams.