Software Engineering Reviewer
1. Software Engineering: Definition & Importance
   •   Definition: Software Engineering is the application of engineering principles to
       software development. It involves the design, development, maintenance, testing,
       and evaluation of software and systems.
   •   Importance: Ensures software is reliable, scalable, maintainable, and meets user
       requirements. It focuses on creating high-quality software within time and cost
       constraints.
2. Software Development Life Cycle (SDLC)
   •   Phases of SDLC:
          o   Requirements Analysis: Gathering and defining what the software should
              do.
          o   Design: Structuring the software, including architecture and user interface.
          o   Implementation/Development: Writing the actual code.
          o   Testing: Checking the software for errors and verifying it meets
              requirements.
          o   Deployment: Releasing the software for use.
          o   Maintenance: Updating and fixing issues post-deployment.
   •   SDLC Models:
          o   Waterfall: A sequential, step-by-step process.
          o   Agile: An iterative, incremental approach with frequent updates.
          o   V-Model: Each development phase is directly associated with a testing
              phase.
          o   Spiral: A risk-driven model that combines iterative development with a focus
              on risk assessment.
   •   Advantages and Disadvantages of SDLC Models:
          o   Waterfall: Simple and straightforward but inflexible.
          o   Agile: Flexible and customer-focused but can be chaotic without proper
              management.
3. Core Software Engineering Concepts
a. Software Requirements
   •   Functional Requirements: What the system must do (e.g., login functionality).
   •   Non-Functional Requirements: System qualities like performance, security,
       scalability, etc.
   •   Requirement Gathering Techniques:
          o   Interviews
          o   Surveys
          o   Observation
          o   Document Analysis
   •   Use Case Diagrams: Visual representation of system interactions with users or
       other systems.
b. Software Design
   •   Key Design Principles:
          o   Modularity: Dividing software into separate, interchangeable components.
          o   Abstraction: Hiding complex details behind simple interfaces.
          o   Encapsulation: Grouping related data and functions together in a single unit
              (like classes in OOP).
          o   Separation of Concerns: Dividing a system into distinct features that
              overlap in functionality as little as possible.
   •   Design Patterns: Reusable solutions to common software design problems.
          o   Singleton: Ensures a class has only one instance.
          o   Factory: Creates objects without specifying the exact class of object that will
              be created.
          o   Observer: Allows objects to notify others of changes in state.
c. Software Architecture
   •   Definition: High-level structure of a software system.
   •   Architectural Patterns:
          o   Layered Architecture: Divides the system into layers, such as presentation,
              business logic, and data layers.
          o   Client-Server Architecture: Divides the system into clients (request
              services) and servers (provide services).
          o   Microservices: Decomposes applications into loosely coupled services.
          o   MVC (Model-View-Controller): Separates data (Model), user interface
              (View), and control flow (Controller).
4. Software Development Fundamentals
a. Programming Paradigms
   •   Procedural Programming: Based on a sequence of steps or procedures (e.g., C).
   •   Object-Oriented Programming (OOP): Organizes software as objects that
       represent both data and behavior (e.g., Java, C++).
          o   Key concepts: Inheritance, Polymorphism, Encapsulation, Abstraction.
   •   Functional Programming: Focuses on pure functions and immutability (e.g.,
       Haskell, Scala).
   •   Logic Programming: Based on formal logic (e.g., Prolog).
b. Version Control Systems (VCS)
   •   Git: A distributed version control system.
          o   Common Git commands: git init, git clone, git commit, git push, git pull, git
              merge.
   •   Branching: Allows different versions of code to be worked on simultaneously.
   •   Merging: Combines changes from different branches.
c. Testing & Debugging
   •   Testing Levels:
          o   Unit Testing: Testing individual units or components of software.
          o   Integration Testing: Testing interactions between components.
          o   System Testing: Testing the complete system.
          o   Acceptance Testing: Verifying if the software meets the user’s requirements.
   •   Black-box Testing: Focuses on input-output behavior without knowing the internal
       workings.
   •   White-box Testing: Focuses on the internal structure and logic of the code.
5. Software Engineering Applications & Use-Cases
a. Agile Methodology
   •   Agile Principles: Flexibility, customer collaboration, and responding to change.
   •   Scrum: An Agile framework that organizes work in 2-4 week sprints, with roles like
       Product Owner, Scrum Master, and Development Team.
   •   Kanban: A visual workflow management method for tracking tasks.
b. DevOps
   •   Definition: A set of practices combining software development (Dev) and IT
       operations (Ops) to shorten the software development lifecycle.
   •   Continuous Integration (CI): The practice of frequently integrating code into a
       shared repository.
   •   Continuous Delivery (CD): Automating the release process so that software can be
       deployed at any time.
c. Software Project Management
   •   Key Project Management Elements:
          o   Scope: What the project will and will not deliver.
          o   Time: Project schedule and deadlines.
          o   Cost: Budget constraints.
          o   Quality: Meeting user requirements and industry standards.
   •   Risk Management: Identifying, assessing, and mitigating risks.
6. Sample Quiz Questions
Multiple Choice Questions (MCQs)
   1. Which of the following is NOT a phase in the SDLC?
         o   A) Requirements Analysis
         o   B) Design
         o   C) Marketing
         o   D) Deployment
   2. What does OOP stand for in software design?
         o   A) Open Object Programming
         o   B) Object-Oriented Programming
         o   C) Optimal Object Performance
         o   D) Organized Object Programming
   3. In Agile, what is the role of the Scrum Master?
         o   A) To develop code
         o   B) To ensure the team follows Agile principles and removes impediments
         o   C) To manage the product backlog
         o   D) To set deadlines for the project
   4. Which design pattern ensures that a class has only one instance?
         o   A) Factory
         o   B) Singleton
         o   C) Observer
         o   D) Strategy
   5. In DevOps, CI/CD stands for:
         o   A) Constant Integration/Continuous Development
         o   B) Continuous Integration/Continuous Delivery
         o   C) Correct Integration/Correct Development
         o   D) Controlled Integration/Controlled Delivery
True or False Questions
   1. The Waterfall model is an iterative approach to software development.
         o   True
         o   False
   2. The Factory design pattern is used to create objects without specifying the
      exact class of object that will be created.
         o   True
         o   False
   3. In Agile, the development process is broken into short, time-boxed iterations
      called sprints.
         o   True
         o   False
   4. Git is a centralized version control system.
         o   True
         o   False
   5. DevOps practices focus on reducing the time between writing code and
      deploying it to production.
         o   True
         o   False