Topics Covered - 7.2 | Software Engineering - Life Cycle Models | Software Engineering Micro Specialization
K12 Students

Academics

AI-Powered learning for Grades 8–12, aligned with major Indian and international curricula.

Academics
Professionals

Professional Courses

Industry-relevant training in Business, Technology, and Design to help professionals and graduates upskill for real-world careers.

Professional Courses
Games

Interactive Games

Fun, engaging games to boost memory, math fluency, typing speed, and English skillsβ€”perfect for learners of all ages.

games

7.2 - Topics Covered

Practice

Interactive Audio Lesson

Listen to a student-teacher conversation explaining the topic in a relatable way.

Defining the SDLC

Unlock Audio Lesson

Signup and Enroll to the course for listening the Audio Lesson

0:00
Teacher
Teacher

Today, we will explore the Software Development Life Cycle, or SDLC. Can anyone tell me what they think the term 'cycle' indicates in this context?

Student 1
Student 1

I think it suggests that software goes through multiple phases repeatedly.

Teacher
Teacher

Exactly! The 'cycle' signifies that software is iteratively developed and improved over time. It’s not just a one-time process.

Student 2
Student 2

What are the main phases of this cycle?

Teacher
Teacher

Great question! The main phases include requirements engineering, design, implementation, testing, deployment, and maintenance. Together, these phases ensure a structured approach to software development.

Student 3
Student 3

Why can't we just code directly without these phases?

Teacher
Teacher

Good point! Without these structured phases, projects can become chaotic, leading to poor quality and performance. Having a defined process helps in managing timelines and quality.

Student 4
Student 4

So, like having a blueprint before building a house?

Teacher
Teacher

Exactly! Just as a blueprint guides construction, SDLC provides guidance throughout the software development process. In summary, SDLC is vital for ensuring that software is developed effectively and efficiently.

Importance of SDLC

Unlock Audio Lesson

Signup and Enroll to the course for listening the Audio Lesson

0:00
Teacher
Teacher

Why do you think follow a structured methodology like SDLC is important?

Student 2
Student 2

To avoid mistakes and misunderstandings?

Teacher
Teacher

Exactly! Following SDLC improves predictability and control over a project’s timeline and resource allocation.

Student 1
Student 1

Does it help with quality too?

Teacher
Teacher

Yes! SDLC establishes quality gates, ensuring software is reviewed and tested at each phase. This promotes early detection of defects and ultimately leads to better quality.

Student 3
Student 3

What about stakeholder communication?

Teacher
Teacher

SDLC enhances communication by defining roles and responsibilities clearly, reducing miscommunications among teams. This involvement is crucial for gathering the right requirements and for project success.

Student 4
Student 4

It sounds like a lot of planning!

Teacher
Teacher

It is, but effective planning results in a much smoother development process. So, to recap, SDLC enhances predictability, quality, and stakeholder satisfaction in software engineering.

Universal Phases of Software Development

Unlock Audio Lesson

Signup and Enroll to the course for listening the Audio Lesson

0:00
Teacher
Teacher

Now, let's delve into the universal phases within any SDLC model. Can anyone name a phase?

Student 1
Student 1

Requirements engineering?

Teacher
Teacher

Correct! Requirements engineering is where we gather and validate what the system needs to do. Why do you think this phase is crucial?

Student 2
Student 2

Because it sets the foundation for everything else?

Teacher
Teacher

Exactly! Poor requirements lead to flawed projects. Moving on, after requirements, we have design. What is the goal of the design phase?

Student 3
Student 3

To create a blueprint for implementation?

Teacher
Teacher

Right! The design translates the requirements into a structured plan. Next is implementation. What happens here?

Student 4
Student 4

Coding the software based on the designs?

Teacher
Teacher

Absolutely! It’s where our designs come to life. Following implementation, we enter the testing phase. What is the focus here?

Student 1
Student 1

To check if the software works as intended?

Teacher
Teacher

Exactly! We need to validate that everything is functioning correctly. Finally, there’s maintenance, which is often the longest phase. Why is that important?

Student 2
Student 2

To keep the software updated and handle any issues after deployment?

Teacher
Teacher

Precisely! Each phase plays a crucial role in the SDLC, ensuring that we deliver a robust product.

Introduction & Overview

Read a summary of the section's main ideas. Choose from Basic, Medium, or Detailed.

Quick Overview

This section examines the Software Development Life Cycle (SDLC) models, highlighting their phases, significance, and the importance of structured methodologies in software engineering.

Standard

The section elaborates on the Software Development Life Cycle (SDLC), defining its phases including requirements engineering, design, implementation, testing, deployment, and maintenance. It emphasizes the critical importance of structured methodologies over ad-hoc approaches in enhancing project outcomes and quality.

Detailed

Software Development Life Cycle (SDLC) Models

The Software Development Life Cycle (SDLC) serves as a structured framework that guides software development projects through various phases. Its primary goal is to ensure that software systems are efficiently developed, leading to high-quality outcomes. This section encapsulates various key concepts related to SDLC models, including:

1. Definition of SDLC

SDLC is defined as a systematic, phased approach to software development that encompasses stages from conception to retirement. It outlines the comprehensive activities required for developing a software system, emphasizing the idea that software development is an iterative cycle.

2. Importance of SDLC

Understanding the rationale behind using SDLC is paramount. Here’s why:
- Enhanced Predictability and Control: Acting as a roadmap, SDLC allows teams to forecast timelines and resource allocations.
- Improved Quality Assurance: By establishing quality gates at each phase, SDLC ensures software reliability and prevent defects.
- Standardized Processes: SDLC facilitates learning and the application of best practices across projects, supporting organizational consistency.

3. Universal Phases of Software Development

Regardless of the specific model in use, all SDLC approaches include intrinsic phases:
- Requirements Engineering: Involves gathering, analyzing, and validating user requirements.
- Design: Translates needs into a structured architectural plan.
- Implementation: Code development that brings designs to life.
- Testing: Ensures that the software meets specified requirements and is free of defects.
- Deployment: Introduces the software to the production environment.
- Maintenance: Addresses ongoing updates and optimizations to the software post-deployment.

4. Evolution from Ad-Hoc Approaches

The transition from chaotic coding practices to structured models highlights the necessity for discipline in software development, ensuring better management and quality.

5. Characteristics of an Effective SDLC Model

An exemplary SDLC model possesses traits such as clarity, defined phases, risk management capabilities, adaptability, and robust documentation, which all contribute to the successful delivery of software projects.

Audio Book

Dive deep into the subject with an immersive audiobook experience.

1. The Software Development Life Cycle (SDLC): A Foundational Concept

Unlock Audio Book

Signup and Enroll to the course for listening the Audio Book

1. The Software Development Life Cycle (SDLC): A Foundational Concept

1.1. Definitional Precision:

SDLC is a structured, phased, and iterative (or sequential) framework that describes the stages involved in conceiving, developing, deploying, and maintaining a software system. It is a blueprint for guiding a software project from its initial conceptualization through to its eventual retirement, encompassing all technical and management activities.
Emphasis on "cycle" – implying that software is not a one-time product but often evolves through multiple cycles of development and enhancement.

Detailed Explanation

This chunk introduces the Software Development Life Cycle (SDLC) as a fundamental concept in software engineering. It defines SDLC as a structured approach divided into phases covering everything from the initial idea to the software's end-of-life, emphasizing that software development is cyclical, not just a one-time project. As software evolves, it may go through multiple development cycles, which means modifications, upgrades, or expansions happen continuously over time.

Examples & Analogies

Imagine building a house. Initially, you have a blueprint (the planning phase) outlining what the building will look like. As you start construction (development), you may find that you need to make adjustments due to unforeseen circumstances, like the land being uneven. Just like houses require repairs, upgrades, and renovations over time, software also needs regular updates and enhancements, which is why SDLC is a cyclical process.

1.2. Rationale and Strategic Importance in Software Engineering

Unlock Audio Book

Signup and Enroll to the course for listening the Audio Book

1.2. Rationale and Strategic Importance in Software Engineering:

  • 1.2.1. Enhanced Predictability and Control: Provides a roadmap, enabling better foresight into project timelines, resource allocation, and potential pitfalls. Reduces the "black box" nature of development.
  • 1.2.2. Superior Planning and Estimation: Facilitates more accurate estimations of effort, cost, and schedule by breaking down complex tasks into manageable stages. Allows for granular resource scheduling.
  • 1.2.3. Proactive Risk Management: Enables early identification, assessment, and mitigation strategies for technical, operational, and business risks at various stages of the project.
  • 1.2.4. Quality Assurance and Control: Establishes quality gates, review points, and testing activities at each phase, leading to higher quality, more reliable, and maintainable software. Promotes defect prevention over detection.
  • 1.2.5. Improved Communication and Collaboration: Defines roles, responsibilities, deliverables, and communication channels, fostering seamless interaction among development teams, management, and stakeholders. Reduces ambiguity and misunderstandings.
  • 1.2.6. Standardized Process: Establishes repeatable procedures, allowing organizations to learn from past projects, implement best practices, and achieve consistent results. Aids in onboarding new team members.
  • 1.2.7. Enhanced Stakeholder Satisfaction: By involving stakeholders at appropriate points and delivering according to a planned process, expectations are managed effectively.
  • 1.2.8. Regulatory Compliance: For certain industries (e.g., healthcare, aerospace, finance), adherence to a formal SDLC is often a regulatory mandate.

Detailed Explanation

This chunk outlines the reasons why an SDLC is critical in software engineering. It emphasizes various advantages, such as enhanced predictability and control over project timelines, comprehensive planning and cost estimation through task breakdown, and proactive risk management strategies that help mitigate potential issues early in the project. Furthermore, it highlights the importance of quality assurance and communication, as structured processes lead to clearer roles and responsibilities, resulting in higher software quality and greater satisfaction for stakeholders. Lastly, it mentions the necessity of regulatory compliance in certain industries, which mandates the use of formal SDLC processes.

Examples & Analogies

Consider planning a large event, like a wedding. Without a structured timeline and defined roles for each part of the planning (like catering, venue, invitations), the process can become chaotic, leading to missed deadlines and unhappy guests. By using an SDLC-like approach, you can break the planning down into phases, assign responsibilities, keep track of costs, and ensure everything is done on time, ultimately leading to a successful event.

2. Universal and Intrinsic Phases of Software Development

Unlock Audio Book

Signup and Enroll to the course for listening the Audio Book

2. Universal and Intrinsic Phases of Software Development:

These phases represent fundamental categories of activities, irrespective of the specific SDLC model's order or iteration.

2.1. Requirements Engineering (Elicitation, Analysis, Specification, Validation):

  • Goal: To fully understand, document, and validate what the system must do and what qualities it must possess. This is the "What" phase.
  • Sub-activities include:
  • Elicitation: Gathering requirements from stakeholders (interviews, brainstorming, surveys, workshops, prototyping, ethnographic studies).
  • Analysis: Examining, categorizing, prioritizing, and resolving ambiguities, inconsistencies, and incompleteness in elicited requirements using techniques like use case modeling and data flow diagrams.
  • Specification: Documenting the agreed-upon requirements formally. The final output is the Software Requirements Specification (SRS) that details functional (FRs) and non-functional requirements (NFRs).
  • Validation: Ensuring that documented requirements truly reflect stakeholder needs and are achievable within project constraints, involving prototypes and test cases generation based on requirements.
  • Management: Version control of requirements and change control for modifications.

Detailed Explanation

This chunk describes the initial phase of software development: Requirements Engineering, which consists of understanding what the software needs to accomplish. It outlines several sub-activities, including Elicitation, where team members gather information from stakeholders; Analysis, where those requirements are evaluated for clarity and feasibility; Specification, which involves documenting those requirements in a formal manner; Validation, to ensure they truly meet user needs; and Management, which involves keeping track of requirement changes. This phase answers the fundamental question 'What are we building?' and sets the foundation for all subsequent work.

Examples & Analogies

Think of building a custom home. Before construction begins, the architect needs to gather info from the homeowner about their desires, budget, and needs (Elicitation). After collecting these, they analyze what’s feasible (Analysis), draft the blueprints (Specification), confirm the homeowner is happy with the plans (Validation), and manage any future adjustments (Management). If the requirements aren't clear from the start, the home might not be what the homeowner envisioned.

2.2. Design Phases

Unlock Audio Book

Signup and Enroll to the course for listening the Audio Book

2.2. Design (Architectural, Detailed, User Interface):

  • Goal: To translate the "what" (requirements) into the "how" – a concrete plan for constructing the software system.
  • Sub-activities:
  • Architectural Design (High-Level Design): Defining the overall structure of the system, major components, their responsibilities, relationships, data flow, and interactions.
  • Detailed Design (Low-Level Design): Breaking down major components into smaller modules, defining internal logic, data structures, algorithms, and interfaces for each module.
  • Database Design: Designing the structure of the database, including tables, relationships, and indexing.
  • User Interface (UI) Design: Designing the user-facing aspects of the system, focusing on usability, accessibility, and aesthetics (often involves wireframing, mockups, prototyping).
  • Deliverables: System Design Document, Detailed Design Documents, database schema, UI/UX specifications.

Detailed Explanation

This chunk focuses on the Design phase of software development, which translates requirements into actionable plans. It explains that the process includes high-level architectural design that outlines how different components of the system will work together, followed by detailed design that breaks it down further into manageable modules. Critical elements like database structure and user interface design are also discussed, as these impact the overall functionality and user experience of the software. The outcome consists of various documents that guide the development team in building the actual software.

Examples & Analogies

Returning to the home-building metaphor, after gathering information from the homeowner, the architect drafts a blueprint (Architectural Design) that shows the house's overall layout. Then, they detail each room’s design (Detailed Design), figure out where fixtures will go (Database Design), and plan how the homeowner will interact with the spaces (UI Design). These blueprints are crucial guides that builders require to construct the house accurately.

2.3. Implementation Phase

Unlock Audio Book

Signup and Enroll to the course for listening the Audio Book

2.3. Implementation (Coding and Unit Testing):

  • Goal: To translate the detailed designs into executable source code.
  • Sub-activities include:
  • Coding: Writing source code in the chosen programming languages following coding standards, style guides, and best practices.
  • Debugging: Identifying and fixing errors in the code.
  • Unit Testing: Testing individual components or modules in isolation to ensure they function as per their design specifications. Typically performed by the developers themselves using test frameworks (e.g., JUnit, NUnit).
  • Code Reviews: Peer reviews of code to identify defects and ensure adherence to standards.
  • Version Control: Managing changes to source code using systems like Git, SVN.

Detailed Explanation

This chunk discusses the Implementation phase, where the actual coding occurs based on the designs drafted in previous phases. It highlights important activities like coding, where developers write code following set standards; debugging, where they troubleshoot and fix issues; and unit testing, which involves checking individual components to ensure they work correctly. The importance of peer reviews and version control during this phase is also stressed, as these practices increase code quality and facilitate collaboration.

Examples & Analogies

Think about a restaurant where chefs are tasked with preparing dishes as per the recipes provided. The coding is akin to chefs cooking (writing source code), and debugging is like tasting and adjusting flavors (fixing errors). Just as chefs check dishes to ensure they meet the restaurant's standards (unit testing), they also have fellow chefs review each other's work to maintain high standards. This collaborative approach improves the overall quality of the restaurant's meals.

2.4. Testing Phase

Unlock Audio Book

Signup and Enroll to the course for listening the Audio Book

2.4. Testing (Integration, System, Acceptance):

  • Goal: To systematically verify and validate that the developed software meets all specified requirements, functions correctly, and is free of defects.
  • Sub-activities include:
  • Integration Testing: Testing the interaction between integrated modules. Strategies include Top-down, Bottom-up, and Sandwich.
  • System Testing: Comprehensive testing of the complete, integrated system to evaluate its compliance with specified requirements in an environment similar to production. Includes performance testing, security testing, usability testing, load testing, stress testing.
  • User Acceptance Testing (UAT): Formal testing by end-users or clients to confirm that the system meets their business needs and is ready for deployment. This is the final verification stage before release.
  • Regression Testing: Re-running previous tests to ensure new code changes have not introduced new defects or re-opened old ones.

Detailed Explanation

This chunk covers the Testing phase, focusing on validating that the software functions as intended. It discusses various types of testing, starting with integration testing, where different modules are tested together to check for compatibility. Next is system testing, where the entire system is tested under conditions similar to those in which it will operate. User Acceptance Testing (UAT) ensures the final product meets user needs before launch. Regression testing ensures that new changes do not negatively impact existing functionalities, which is crucial for maintaining software quality.

Examples & Analogies

Picture a quality control department in a car manufacturing plant. Integration testing is like checking if various car parts (engine, brakes, electronics) work together properly after assembly. System testing is akin to taking the complete car out for a test drive to ensure it operates safely and meets all regulatory standards. UAT is when a group of customers test the car before it’s available in showrooms to make sure it meets their expectations. Finally, regression testing is similar to checking that changes (like new tires) still maintain the car's overall safety features.

2.5. Deployment Phase

Unlock Audio Book

Signup and Enroll to the course for listening the Audio Book

2.5. Deployment (Release and Installation):

  • Goal: To make the developed software available and operational for the end-users in a live production environment.
  • Sub-activities include:
  • Release Planning: Scheduling and preparing for the software release.
  • Installation: Installing the software on target servers or user machines.
  • Configuration: Setting up the software according to specific environment parameters.
  • Data Migration: Transferring existing data to the new system.
  • User Training: Providing training to end-users on how to use the new system.
  • Documentation: Providing user manuals, administration guides.

Detailed Explanation

This chunk explains the Deployment phase, which is when the software is officially released to users. It includes several key activities, such as release planning to ensure a smooth rollout, installation of the software on the necessary platforms, configuration to ensure it performs correctly in the intended environment, and data migration to integrate old data with the new system. User training is also essential in this phase, ensuring that those who will use the software understand its functionalities. Documentation is provided to support users in navigating the system.

Examples & Analogies

Think of deploying a new smartphone model. Before the launch event, the company must plan how many devices to release where (release planning), install the software on each phone (installation), customize settings for different carriers (configuration), migrate contacts from old models to the new ones (data migration), and provide user guides explaining new features (documentation). At the launch event, trainers demonstrate the phone’s capabilities to new users, helping them get comfortable with their new device.

2.6. Maintenance Phase

Unlock Audio Book

Signup and Enroll to the course for listening the Audio Book

2.6. Maintenance (Correction, Adaptation, Perfection, Prevention):

  • Goal: To ensure the software remains functional, relevant, and effective throughout its operational lifespan. This is the longest phase.
  • Sub-activities include:
  • Corrective Maintenance: Fixing bugs or defects discovered after deployment.
  • Adaptive Maintenance: Modifying the software to adapt to changes in the operating environment (e.g., new OS versions, database changes).
  • Perfective Maintenance: Enhancing existing features, improving performance, usability, or efficiency based on user feedback.
  • Preventive Maintenance: Modifying the software to prevent potential future problems or improve maintainability (e.g., refactoring code).
  • Support: Providing ongoing technical support to users.

Detailed Explanation

This chunk delves into the Maintenance phase, which requires ongoing attention to ensure the software remains effective over time. This phase includes several activities: corrective maintenance addresses bugs discovered post-release; adaptive maintenance adjusts the software to fit new environments or technology; perfective maintenance enhances existing features based on user input; preventive maintenance proactively addresses potential issues to improve future stability; and finally, support provides users with technical assistance as they navigate the software.

Examples & Analogies

Consider maintaining a car after purchase. Corrective maintenance is like getting repairs done when you discover mechanical issues. Adaptive maintenance corresponds to updating your car’s GPS as new roads are added. Perfective maintenance would involve adding features like Bluetooth connectivity based on user preferences. Preventive maintenance is like taking your car for regular check-ups to avoid larger issues later. Finally, ongoing support is similar to having a service center available whenever you need assistance with your car.

3. Evolution from Ad-Hoc to Structured Development: Early 'Code-and-Fix' Era

Unlock Audio Book

Signup and Enroll to the course for listening the Audio Book

3. Evolution from Ad-Hoc to Structured Development:

  • Early "Code-and-Fix" Era: Characterized by unstructured coding, minimal planning, and reactive bug fixing. Led to unmaintainable, unreliable, and often failed projects.
  • The Need for Discipline: As software became more complex and critical, the necessity for a systematic, predictable, and controllable approach became evident. This spurred the creation of formal SDLC models.

Detailed Explanation

This chunk outlines the historical evolution of software development practices. It describes the chaotic 'Code-and-Fix' era characterized by disorganization and a reactive approach to coding and error correction. This lack of structure often resulted in unreliable and difficult-to-maintain software projects. Over time, as the complexity of software systems grew, there was an evident need for more disciplined and systematic approaches, leading to the establishment of formal SDLC models to provide structure.

Examples & Analogies

Think of trying to bake a cake without a recipe. The 'Code-and-Fix' era represents this chaotic approach: you toss ingredients together haphazardly (coding) and then taste (bug testing), making changes on the fly when something doesn’t taste right. While you might end up with something edible, it often won’t be great. Over time, bakers developed recipes (formal SDLC models) to bring structure to the process, ensuring that cakes rise correctly and taste good, reflecting a more organized approach to baking.

4. Characteristics of an Effective SDLC Model

Unlock Audio Book

Signup and Enroll to the course for listening the Audio Book

4. Characteristics of an Effective SDLC Model:

  1. Clarity and Transparency: The model should be easily understood by all project participants – developers, managers, and stakeholders.
  2. Well-Defined Phases and Milestones: Distinct stages with clear objectives, inputs, outputs (deliverables), and measurable progress points (milestones).
  3. Entry and Exit Criteria: Specific conditions that must be satisfied before a phase can begin and before it can be considered complete.
  4. Iteration and Feedback Mechanisms (for appropriate models): Provisions for incorporating feedback from previous stages.
  5. Risk Identification and Mitigation: The model should support risk management throughout the life cycle.
  6. Scalability and Adaptability: The ability to tailor or scale the model to various project sizes and complexities.
  7. Traceability: The capability to link artifacts across different phases for verification and impact analysis.
  8. Emphasis on Documentation: Promotes the creation of necessary documentation at each stage for maintainability.
  9. Support for Change Management: Procedures for handling changes to requirements or design effectively.

Detailed Explanation

This chunk categorizes the critical features that make up an effective SDLC model. It emphasizes clarity and transparency to ensure all involved parties understand the process. Defined phases and milestones help track progress and ensure that specific conditions are met before moving on. The model's ability to incorporate feedback, manage risks, allow scalability, maintain traceability, emphasize documentation, and support change management are also essential attributes that contribute to a successful software development process.

Examples & Analogies

Imagine organizing a school play. An effective plan includes clearly defined roles (clarity), stages for auditions and rehearsals (defined phases), criteria for advancing to the next stage (entry and exit criteria), and feedback sessions after each rehearsal. You spontaneously adapt the play based on audience reactions, which reflects the need for feedback mechanisms. Documenting who is responsible for what ensures that everyone knows their roles. Just like in a software development context, having a solid structure enhances the likelihood of a successful performance.

Definitions & Key Concepts

Learn essential terms and foundational ideas that form the basis of the topic.

Key Concepts

  • SDLC: A structured framework for software development.

  • Phases of SDLC: Key stages include requirements, design, implementation, testing, deployment, and maintenance.

  • Importance of SDLC: Enhances predictability, quality, and stakeholder communication.

Examples & Real-Life Applications

See how the concepts apply in real-world scenarios to understand their practical implications.

Examples

  • An example of a project using the Waterfall model where requirements are fixed could be a small web application for a local business.

  • An example of an iterative approach can be seen in agile methodologies, like Scrum, where user feedback defines the next increment.

Memory Aids

Use mnemonics, acronyms, or visual cues to help remember key information more easily.

🎡 Rhymes Time

  • In the software's quest, phases unfold, requirements to maintenance, stories told.

πŸ“– Fascinating Stories

  • Imagine building a house: first, you plan (requirements), then design it (design), next you build (implementation), test it (testing), and finally, you live in it (maintenance). Each step is crucial!

🧠 Other Memory Gems

  • R&D, I&T, D&M - Remember 'Riding Down I-95 Towards Destination Maintenance' for phases: Requirements, Design, Implementation, Testing, Deployment, Maintenance.

🎯 Super Acronyms

SDLC

  • 'Systematic Development Leads to Code'.

Flash Cards

Review key concepts with flashcards.

Glossary of Terms

Review the Definitions for terms.

  • Term: Software Development Life Cycle (SDLC)

    Definition:

    A structured framework delineating the stages involved in software development, from conception to retirement.

  • Term: Requirements Engineering

    Definition:

    The phase focusing on eliciting, analyzing, and validating user requirements for a software system.

  • Term: Implementation

    Definition:

    The phase where actual coding takes place, translating design specifications into executable software.

  • Term: Quality Assurance

    Definition:

    The process of ensuring that software meets specified criteria through various testing activities.

  • Term: Maintenance

    Definition:

    The phase that involves updating the software and fixing issues post-deployment.