Unit - 1
Introduction
Software engineering works with a variety of software production methods. It accompanies software product development using well-defined scientific principles, methods and processes. The result of software engineering is an efficient and reliable software product.
The term software engineering is coined with the addition ‘software + engineering’. Software is more than just program code. The program is a usable code, which serves a specific calculation purpose. Software is considered a collection of effective editing code, compatible libraries and texts. Software, when required for a specific purpose, is called product software.
According to IEEE: Software Engineering is the systematic approach to the development, operation, maintenance and retirement of the software.
According to Bohem: “Software Engineering is the application of science and mathematics by which capabilities of computer equipment are made useful to man through computer programs, procedures and related documentations.”
Software Engineering is based on the following disciplines:
● Computer Science
● Management Science
● Economics
● Communication Skills
● Engineering approach to problem solving
Software Engineering is a branch of engineering that uses well-defined scientific principles, techniques and procedures to develop software products. A successful and reliable software product is the result of software engineering.
Software Characteristics
It refers to how well the program performs in comparison to its intended function. The following functions are required:
● Functionality: Refers to the degree of performance of the software against its intended purpose. A collection of characteristics that relate to a software's ability to sustain its level of performance under specified conditions for a specified period of time.
The following functions are required:
● Suitability
● Security
● Accuracy
● Interoperability
● Reliability: Refers to the ability of software to perform a required function under given conditions for a specified period.
Required functions are:
● Maturity
● Recoverability
● Usability: Refers the degree to which software is easy to use. It describes the ease with which the program can be used. The amount of time or effort it takes to learn how to use the app.
The following functions are required:
● Operability
● Understandability
● Learnability
● Efficiency: Refers to the ability of software to use system resources in the most effective and efficient manner.
The following functions are required:
● In Resource
● In Time
● Maintainability: Refers to the ease with which a software system can be modified to add capabilities, improve system performance, or correct errors.
The following functions are required:
● Testability
● Stability
● Changeability
● Portability: Refers to the ease with which software developers can transfer software from one platform to another, without (or with minimum) changes Robustness: it is the ability of a software to handle unexpected errors and faults with ease.
The following functions are required:
● Adaptability
● Installability
● Replaceability
Key takeaway:
Software is more than mere code for a programme.
On the other hand, engineering is all about product creation, using well-defined scientific concepts and methods.
Software engineering is a branch of engineering that uses well-defined scientific concepts, methods and procedures to create software products.
Software engineering is a tiered technique in which we must progress from one layer to the next in order to produce software. All of the levels are interconnected, and each one necessitates the completion of the one before it.
Fig 1: Software engineering layers
The layered technology consists of:
1. Quality focus
The characteristics of good quality software are:
● The software's ability to accomplish the functions that are expected of it.
● Software maintenance ability
● Integrity refers to preventing unauthorised users from accessing information or data.
● The effort required to utilize or run the software is referred to as usability.
2. Process
● It is the software engineering's basic layer or foundation layer.
● The software process is essential for keeping all levels in sync.
● It establishes a framework that encompasses many activities and duties.
● In a nutshell, it encompasses all activities, actions, and tasks associated with software development.
3. Methods
● The method answers all 'how-to' questions that arise during the procedure.
● It explains how to put the software into action on a technical level.
● Communication, requirement analysis, analysis and design modelling, programme construction, testing, and support are only a few of the duties included.
4. Tools
● The software engineering tool is a tool that aids in the development of software.
● The tools are interconnected, which means that information generated by one tool can be used by another.
● Consider the following scenario: Microsoft Publisher may be used to create web pages.
While I have defined five system activities and provided a fundamental description of each software team, before it could properly conduct any of these activities as part of the software process, it would need significantly more details.
You are then faced with a key question: what activities are suitable for a system operation, considering the nature of the problem to be solved, the features of the people doing the job, and the stakeholders funding the project?
Fig. 2: Process flow
The communication process could include nothing more than a phone call with the appropriate stakeholder for a small software project requested by one person (at a remote place) with clear, straightforward specifications.
Therefore, phone contact is the only action required, and the job tasks (the work set) that this action entails are:
● Make communication via telephone with the stakeholder.
● Evaluate and take notes on specifications.
● Organize notes in a short statement of specifications in writing.
● For evaluation and acceptance via Email to stakeholders.
If the project with several stakeholders, each with a different set of often contradictory criteria, was considerably more complex, the contact operation may have six separate actions: initiation, elicitation, elaboration, negotiation, pacification, and validation. There will be several working activities and a range of different work items for each of these software engineering acts.
The method is defined as a set of tasks, activities and tasks performed when a work product is to be produced. The acts and tasks of each of these activities are based on a structure or model that determines their relationship with the process and with each other.
A process model (also termed as software life cycle model) is a pictorial and diagrammatic representation of the software life cycle. A life cycle model represents
All the methods required to make a software product transit through its life cycle stages. It also captures the structure in which these methods are to be undertaken.
The software process is depicted schematically, with a collection of software engineering activities populating each framework activity.
A task set that defines the work tasks to be completed is defined by each software engineering activity. The working products to be made, the points of quality assurance that will be needed, and the milestones to be used to demonstrate progress.
A software process is made up of a number of different actions.
There are five activities that make up a generic process framework:
1. Communication:
Communication between the customer and the developer is the first step in software development.
2. Planning:
It includes thorough estimation, project development scheduling, and tracking.
3. Modeling:
● Modeling entails a thorough examination of the project's requirements as well as project design elements such as algorithms and flowcharts.
● The flow chart depicts a comprehensive flow diagram of a programme, while the algorithm provides a step-by-step solution to the problem.
4. Construction:
● Code generation and testing are two parts of the construction process.
● The coding section uses an appropriate programming language to accomplish the design details.
● Testing is used to determine whether the coding flow is correct.
● Testing ensures that the programme produces the expected results.
5. Deployment:
● Delivering the product to the consumer and receiving feedback is what the deployment stage entails.
● If the customer requests some changes or extra capabilities, then a change is required to increase the software's quality.
● It is a simplest model, which states that the phases are organized in a linear order.
● The model was originally proposed by Royce.
● The various phases in this model are
● Feasibility Study – The main aim of the feasibility study activity is to determine whether it would be financially and technically feasible to develop the product. The feasibility study activity involves the analysis of the problem and collection of all relevant information relating to the product such as the different data items which would be input to the system, the processing required to be carried out on these data, the output data required to be produced by the system as well as various constraints on the behavior of the system.
● Requirement Analysis – The aim of the requirement analysis is to understand the exact requirements of the customer and to document them properly. The requirement analysis activity is begun by collecting all relevant data regarding the product to be developed from the users of the product and from the customer through interviews and discussions. During this activity, the user requirements are systematically organized into a software requirement specification (SRS) document. The important components of this document are the functional requirements, the nonfunctional requirements, and the goals of implementation. The SRS document is written in end-user terminology. This makes the SRS document understandable by the customer. After all, it is important that the SRS document be reviewed and approved by the customer.
● Design – This phase is concerned with
● Identifying software components like functions, data streams and data stores.
● Specifying software structure.
● Maintaining a record of design decisions and providing.
● There are two categories of Design:
● Architectural Design – It involves
● Identifying the software components.
● Decoupling and decomposing the software component into modules and conceptual data structures.
● Specifying the interconnection between the various blueprints for the implementation phase
● Detailed Design – It is concerned with details of the implementation procedures to process the algorithms, data structures and interaction between the modules and data structures. The various activities that this phase includes are
● Adaptation of existing code.
● Modification of existing algorithms.
● Design of data representation and
● Packaging of the software product.
This process is highly influenced by the programming language under which the implementation would be carried out. This stage is different from implementation.
● Implementation – It involves the translation of the design specifications into source code. It also involves activities like debugging, documentation and unit testing of the source code. In this stage various styles of programming can be followed like built-in and user defined data types, secure type checking, flexible scope rules, exception handling, concurrency control etc.
● Testing – It involves two kinds of activities
● Integration Testing – It involves testing of integrating various modules and testing their overall performance due to their integration.
● Acceptance Testing – It involves planning and execution of various types of tests in order to demonstrate that the implemented software system satisfies the requirements stated in the requirements document.
● Maintenance – In this phase the activities include
● Corrective Maintenance – Correcting errors that were not discovered during the product development phase.
● Perfective Maintenance – Improving the implementation of the system, and enhancing the functionalities of the system according to customer’s requirements.
● Adaptive Maintenance – Adaptation of software to new processing environments.
Fig 3: Classical waterfall model
Advantages of Waterfall model
● All phases are clearly defined.
● One of the most systematic methods for software development.
● Being older, this is one of the time tested models.
● It is simple and easy to use.
Disadvantages of Waterfall Model
● Real Projects rarely follow sequential models.
● It is often difficult for the customer to state all requirements explicitly.
● Poor model for complex and object oriented projects.
● Poor model for long and ongoing projects.
● High amount of risk and uncertainty.
● Poor model where requirements are at a moderate to high risk of changing.
● This model is suited to automate the existing manual system for which all requirements are known before the design starts. But for the new system, having such unchanging requirements is not possible.
Key takeaway:
It is a simplest model, which states that the phases are organized in a linear order.
The model was originally proposed by Royce. It is simple and easy to use.
An Incremental model is a software development process where the requirements are divided into multiple independent software cycle modules. In this model, each module goes through the stages of need, construction, implementation and testing.
All subsequent release of the module can add function to the previous release. The process continues until a complete plan is found.
The various phases of incremental model are as follows:
1. Requirement analysis: In the first phase of the incremental model, the product analysis expertise identifies the requirements. And the system functional requirements are understood by the requirement analysis team. To develop the software under the incremental model, this phase performs a crucial role.
2. Design & Development: In this phase of the Incremental model of SDLC, the design of the system functionality and the development method are finished with success. When software develops new practicality, the incremental model uses style and development phase
3. Testing: In the incremental model, the testing phase checks the performance of each existing function as well as additional functionality. In the testing phase, the various methods are used to test the behavior of each task.
4. Implementation: Implementation phase enables the coding phase of the development system. It involves the final coding that design in the designing and development phase and tests the functionality in the testing phase. After completion of this phase, the number of the product working is enhanced and upgraded up to the final system product.
Fig 4: Incremental model
Key takeaway:
● Each module goes through the stages of need, construction, implementation and testing.
● To develop the software under the incremental model, Requirement phase performs a crucial role.
● When software develops new practicality, the incremental model uses style and development phase.
Evolutionary process model resembles the iterative enhancement model. The same phases are defined for the waterfall model that occurs here in a cyclical fashion. This model differs from the iterative enhancement model in the sense that this does not require a useful product at the end of each cycle. In evolutionary development, requirements are implemented by category rather than by priority.
SDLC Evolutionary model builds the required product in several successive versions and hence is also known as successive version model or incremental model
● In this model the requirement is broken down into different functional units
● These functional units are known as modules
● The functionality improvements are done in these modules until the desired system is realized.
● Each successive version is capable of performing more functions than the previous versions
Release of different evolutionary versions in SDLC
Fig 5: Evolutionary development of a software product
● Each of the version will be released with some new functionalities added to the older one
● Here B will have more functionality than A, but will exhibit less capability than C
● As the system is viewed to be developed in incremental way so it is also termed as incremental model of development
Fig 6: Evolutionary model of software development
Advantages:
● In this model the user gets a chance to experiment partially developed system
● It reduces the error because the core modules get tested thoroughly
Disadvantages:
● Sometimes it becomes hard to divide the problem into several versions that would be acceptable to the customer which can be incrementally implemented and delivered
Key takeaway:
● The evolutionary model is basically useful for very large products.
● Rather for waiting for the full product, the customer prefers to receive the product in increments so that he can start using them.
Many of the characteristics of one or more of the classic models outlined in the preceding sections are shared by specialized process models. When a specialized or narrowly defined software engineering strategy is adopted, however, these models are frequently used.
Component-Based Development
COTS (commercial off-the-shelf) software components are developed by vendors and sold as products. They provide targeted functionality with well-defined interfaces that allow the component to be integrated into the software being developed. Many of the qualities of the spiral model are included into the component-based development paradigm. It is evolutionary in nature, necessitating an iterative approach to software development. The component-based development paradigm, on the other hand, builds applications out of pre-packaged software components. The identification of candidate components is the first step in the modeling and construction process.
These components might be implemented as traditional software modules, object-oriented classes, or class packages16. The component-based development paradigm contains the following steps (executed using an evolutionary method) regardless of the technology used to produce the components:
1. For the application domain in issue, available component-based products are studied and appraised.
2. Issues with component integration are taken into account.
3. The components are accommodated by a software architecture.
4. The architecture incorporates the components.
5. Thorough testing is carried out to assure optimal functionality.
Software reuse is a result of the component-based development approach, and reusability provides software engineers with a number of measurable benefits. If component reuse becomes ingrained in your software engineering team's culture, you can cut down on development cycle time and project costs.
The Formal Methods Model
The formal methods model entails a series of operations that lead to the formal mathematical specification of computer software. Formal methods use a formal, mathematical notation to design, build, and verify a computer-based system. Some software development companies are presently using a variation of this approach known as cleanroom software engineering.
When formal methods are employed during software development, they provide a mechanism for removing many of the issues that are difficult to solve using traditional software engineering paradigms. Ambiguity, incompleteness, and inconsistency can be detected and addressed more quickly using mathematical analysis rather than ad hoc assessment. When formal methods are utilized during the design process, they serve as a foundation for programme verification, allowing you to find and fix flaws that might otherwise go undiscovered.
The formal techniques model promises defect-free software, despite the fact that it is not widely used. However, others have expressed reservations regarding its relevance in a corporate setting:
● Formal model development takes a long time and costs a lot of money right now.
● Because few software engineers have the background required to employ formal methods, substantial training is required.
● It's tough to use the models as a communication tool for clients who aren't technically savvy.
Despite these reservations, the formal methods approach is gaining popularity among software developers who must create safety-critical software.
Aspect-Oriented Software Development
Builders of complex software usually implement a set of localized features, functions, and information content, regardless of the software technique used. These localized software characteristics are modeled as components (for example, object oriented classes) and then built into the system architecture. Certain concerns — customer - required qualities or technical areas of interest—spread over the entire architecture as modern computer-based systems become more sophisticated (and complex). Some of the issues are system attributes at a high level (e.g., security, fault tolerance). Other issues have an impact on certain functions (for example, the implementation of business rules), while others are systemic (e.g., task synchronization or memory management).
Crosscutting concerns are those that affect numerous system functions, features, and information. Aspectual needs are crosscutting problems that affect the software architecture as a whole. Aspect-oriented software development (AOSD), also known as aspect-oriented programming (AOP), is a relatively new software engineering paradigm that provides a process and methodological approach for defining, specifying, designing, and constructing aspects—"mechanisms beyond subroutines and inheritance for localizing the expression of a crosscutting concern"—as well as a process and methodological approach for defining, specifying, designing, and constructing aspects.
A distinct aspect-oriented process is still in its infancy. However, such a process is likely to take on traits from both evolutionary and concurrent process models. Because aspects are found and subsequently developed, the evolutionary approach is applicable. Because aspects are engineered independently of localized software components, concurrent development's parallel nature is critical because aspects have a direct impact on these components. As a result, it's critical that the AOSD defines "aspects" to describe customer concerns that span numerous system operations, features, and data.
Create asynchronous communication between software process activities that are used in the engineering and implementation of aspects and components.
A common iterative and gradual software development process system is the unified software development process or unified process. The Logical Unified Method is the most accepted and thoroughly documented enhancement of the Unified Process (RUP).
The Unified Process is not just a system, but rather an expandable structure that can be adapted to particular organizations or projects. Similarly, a customizable system is the Logical Unified Method.
Fig 7: Unified process phases
Characteristics of Unified process:
- Iterative and Incremental
An iterative and gradual method of growth is the Unified Process. A number of timeboxed iterations are split into the Elaboration, Development and Transformation phases. (For a large project, the Inception stage can also be split into iterations.)
The consequence of each iteration is an increment, which is a device release that incorporates additional or enhanced features compared to the previous release.
While several iterations would involve work in most disciplines of the method (e.g. Specifications, design, implementation, testing), over the course of the project, the relative commitment and focus will shift.
2. Use case Driven
Use cases are used in the Centralized Phase to capture the functional specifications and to determine the content of the iterations. Each iteration takes a collection of use cases or scenarios all the way through implementation, test and deployment, from requirements.
3. Architecture Centric
The Cohesive Method maintains that design is at the core of the attempts of the project team to form the scheme. Because no single model is enough to cover all aspects of a structure, multiple architectural models and views are enabled by the Unified Method.
4. Risk Focused
Early in the project life cycle, the Cohesive Process allows the project team to concentrate on managing the most important risks.
In order to ensure that the greatest risks are tackled first, the deliverables of each iteration, particularly in the development phase, need to be chosen.
5. Project Lifestyle
The project is divided into four stages by the Unified Process:
● Inception Phase
Inception is the smallest stage in the project, and it should hopefully be very brief. It could be a sign of unnecessary up-front requirements if the Inception Period is long, which is contrary to the Cohesive Process spirit.
For the Inception process, the following are common objectives.
For the project, create a justification or business case
Prepare a project preliminary schedule and estimate of costs
Identify risks
● Elaboration Phase
The project team is expected to catch a healthy majority of the device specifications during the Elaboration Process. However, Elaboration's primary goals are to resolve identified risk factors and to develop and validate the architecture of the system. The generation of use case diagrams, conceptual diagrams (class diagrams with only basic notation) and package diagrams are common processes carried out in this phase (architectural diagrams)
● Construction Phase
The biggest step of the project is construction. The rest of the framework is based on the foundation laid down in Elaboration in this stage. In a sequence of brief, timeboxed iterations, device features are introduced. An executable release of the programme results in each iteration. During the construction process, it is customary to write full text use cases and each one becomes the start of a new iteration.
● Transition Phase
Transition is the ultimate project phase. The system is deployed to the target users in this process. In the course of many Transition step iterations, feedback obtained from an initial release (or initial releases) may result in further refinements to be implemented.
Fig 8: Project lifecycle
Key takeaway:
● In comparison to Rational Unified Process, the term Unified Process is commonly used to identify the generic process, including those elements common to most refinements.
● The final deliverable planning phase is a plan for the construction phase (including cost and timeline estimates).
● During the construction process, it is customary to write full text use cases and each one becomes the start of a new iteration.
● The Milestone for the Product Release marks the conclusion of the Transition process.
The Agile model was created to assist a project in fast adapting to change requests. As a result, the Agile model's primary goal is to speed up project completion. Agility is essential to complete this challenge. Agility is achieved by tailoring the process to the project and eliminating processes that aren't required for the project. Anything that wastes time and effort is also avoided.
The Agile model actually refers to a collection of development methodologies. These processes have certain basic properties in common, but there are some subtle distinctions between them. The following are a few Agile SDLC models:
● Extreme Programming (XP)
● Adaptive Software Development (ASD)
● Dynamic Systems Development Method (DSDM)
● Scrum
● Crystal
● Feature Driven Development (FDD)
● Agile Modeling (AM)
Extreme Programming
On these tasks and coding, Intense Programming builds. With many tight feedback loops through efficient implementation, testing and continuous refactoring, it is the comprehensive (not the only) design operation.
Extreme Programming is based on the values below:
● Communication
● Simplicity
● Feedback
● Courage
● Respect
XP is a software development that is lightweight, effective, low-risk, scalable, predictable, science and fun.
In the face of unclear and evolving requirements, eXtreme Programming (XP) was conceived and developed to meet the unique needs of software development by small teams.
One of the methodologies of Agile software development is Extreme Programming. It offers beliefs and ideals to guide the actions of the team. It is predicted that the team will self-organize. Extreme programming offers particular core activities in which
● Each activity is easy and complete in itself.
● More complex and changing behavior is created by a combination of techniques.
Extreme Programming involves −
● Prior to programming, writing unit tests and keeping all of the tests running at all times. Unit testing is automated and faults are eliminated early, thus lowering costs.
● Just enough to code the features at hand and redesign when necessary, beginning with a basic design.
● Pair programming (called pair programming), with two programmers on a single computer, using the keyboard in turns. When one of them is on the keyboard, the other continuously reviews and gives suggestions.
● Several times a day, implementing and checking the entire system.
● Rapidly bringing a minimal working system into development and updating it whenever appropriate.
● Holding the client active and receiving constant input all the time.
As the programme progresses with the evolving demands, iterating enables the accommodating changes.
Fig 9: Extreme programming
Adaptive Software Development (ASD)
● Self-organization occurs when a group of autonomous agents works together to solve an issue that is beyond the capabilities of any single actor.
● Self-organizing teams, interpersonal collaboration, and individual and team learning are all highlighted.
● Phases
● Mission-driven
● Component-based
● Iterative
● Time-boxed
● Risk driven and change-tolerant
● Imagination (project initiated and adaptive cycle planning takes place).
● Collaboration (needs coordinated teamwork and shared application).
● Development is the recommended method for acquiring requirements; minispecs are generated).
● Educating yourself (components implemented and testes, focus groups provide feedback, formal technical reviews, postmortems).
Dynamic Systems Development Method (DSDM)
DSDM is a software development rapid application development technique that provides an agile project distribution structure. Users must be actively connected in order to use DSDM, and teams have been given the authority to make decisions.
DSDM employs the following techniques:
● Time Boxing
● MoSCoW Rules
● Prototyping
The DSDM project contains seven stages:
● Pre-project
● Feasibility Study
● Business Study
● Functional Model Iteration
● Design and build Iteration
● Implementation
● Post-project
Scrum
Scrum is a lightweight agile method system mainly used for software development management. Hey, Scrum is
● Lightweight since it has few components that are recommended
● Three roles: Team, Scrum Master (often a Project Manager), Product Owner (often a Product Manager)
● Three meetings: Sprint Planning, Daily Scrum, Retrospective
● Three artifacts: Product Backlog, Sprint Backlog, Burndown chart
● Agile as it maximizes responsiveness to evolving needs of customers
● A system structure because it is not a method, but a set of methods and principles from which a process can be constructed.
Scrum is a process system that, since the early 1990s, has been used to handle work on complex goods. Scrum is not a procedure, methodology, or conclusive process. Instead, it is a structure within which different processes and techniques can be employed. Scrum makes clear the relative effectiveness of the product management and job strategies such that the product, the staff, and the working atmosphere can be continually enhanced.
Scrum Teams and their related tasks, events, objects, and rules consist of the Scrum system. Each component serves a particular role within the system and is important to the success and use of Scrum.
Scrum's rules tie the functions, activities, and objects together, governing the relationships and interaction between them.
Benefits of scrum:
From a software development process, various stakeholders want distinct things.
● Developers want code, not documents, to be written.
● Quality Assurance engineers want to build research plans that guarantee the quality of the product and provide a high-quality code to test.
● Project managers want a process that is simple to schedule, implement, and control.
● Product Managers want features that are easily implemented, with no bugs.
Crystal
This approach is divided into three concepts:
● Chartering: This phase includes a variety of activities such as assembling a development team, conducting feasibility analyses, developing plans, and so on.
● Cyclic delivery: this entails two more cycles, which are as follows:
○ The release strategy has been updated by the team.
○ The users are served through an integrated product.
● Wrap-up: This phase performs deployment and post-deployment, depending on the user environment.
Feature Driven Development (FDD)
The "Designing and Building" features are the center of this method. Unlike other smart approaches, FDD outlines the small work steps that must be obtained separately for each function.
Framework activity
● Create a comprehensive model (contains set of classes depicting business model of application to be built).
● Make a feature-by-feature plan (features assessed based on priority, effort, technical issues, schedule dependencies).
● Feature-based design (classes relevant to feature are chosen, class and method prologs are written, preliminary design detail developed, owner assigned to each class, owner responsible for maintaining design document for his or her own work packages).
● Feature-by-feature construction (class owner translates design into source code and performs unit testing, integration performed by chief programmer).
Agile Modeling (AM)
A lightweight, practice-based paradigm for effective modeling and documenting of software systems.
Modeling principles
● Model with a purpose
● Use multiple models
● Travel light (only keep models with long-term value)
● Content is more important than representation
● Know the models and tools you use to create them
● Adapt locally
When to use the Agile Model?
● When there are a lot of changes to be made.
● When you have access to a highly qualified and experienced workforce.
● When a customer is ready to meet with a software team on a regular basis.
● When the scope of the endeavor is limited.
Key takeaway:
XP is a software development that is lightweight, effective, low-risk, scalable, predictable, science and fun.
Scrum is not a procedure, methodology, or conclusive process.
Scrum Teams and their related tasks, events, objects, and rules consist of the Scrum system.
References:
- Software Engineering‐A Practitioner’s Approach (Sixth Edition)‐Roger Pressman (TMH)
- Software Engineering (Ninth Edition)‐Ian Sommerville (Pearson Education)
- Software Engineering‐Schaum’s Series (TMH)
- Software Project Management ‐ Sanjay Mohapatra (Cengage Learning)