Software Engineering
SDLC - The Software Development Lifecycle
What is Software Engineering
Topic | Description / Key Points |
---|---|
Definition | Software engineering is the application of scientific and engineering principles to the design and development of software. |
Origins & Evolution | - Emerged in the 1960s - Addressed inefficiencies in early software development - Triggered by the “Software Crisis” (mid-1960s to mid-1980s) |
The Software Crisis | - Software projects were over-budget, late, and unreliable - Lack of formal process - Prompted need for disciplined engineering approaches |
Crisis Solution | - Standardized methodologies (e.g. SDLC) - Use of CASE tools (e.g., debugging, project management, validation) |
CASE Tool Categories | - Business analysis - Development tools - Validation & verification - Configuration management - Metrics - Project management |
Software Engineer Responsibilities | - Design, build, maintain systems - Write and test code - Consult with stakeholders, vendors, security experts |
Engineer vs. Developer | - Engineers take a system-wide view, focused on architecture and scalability - Developers focus on specific features/functionality |
Modern Practice | Guided by the Software Development Life Cycle (SDLC) to ensure quality and structure in software development |
Phases in the SDLC
Intro
The Software Development Life Cycle (SDLC) is a systematic process used to develop high-quality software efficiently, on time, and within budget. It is designed to ensure that software products meet business and technical requirements through a structured set of phases and deliverables.
Originally formalized in the 1960s during a time of increasing software complexity, the SDLC started with the Waterfall model, a linear approach. Over time, it evolved into more iterative and adaptive methodologies to support changing customer needs.
Key Benefits
- Structured Workflow: Provides a consistent roadmap for development, helping teams avoid ad hoc or chaotic processes.
- Clearly Defined Phases: Each phase (planning, design, development, etc.) is well-documented, allowing teams to understand what to focus on at each stage.
- Improved Communication: Enhances collaboration among developers, stakeholders, and customers. Everyone understands their role and when their input is required.
- Iterative Capability: Supports revisiting previous stages to adapt to new requirements or feedback, increasing flexibility.
- Early Problem Detection: Identifies issues during early stages like planning or design, reducing costly fixes later in development.
- Defined Roles: Assigns clear responsibilities to each team member, minimizing conflict and improving productivity.
The SDLC offers a disciplined approach to software development. It reduces risk, improves efficiency, fosters clear communication, and supports adaptability. As projects grow more complex, the SDLC remains a vital tool for aligning business goals with technical execution.
The Six SDLC Phases
Phase | Purpose | Key Activities | Output |
---|---|---|---|
Planning | Define and document requirements | Identify users, goals, inputs/outputs Estimate resources, costs, schedule Build prototypes if needed |
Software Requirements Specification (SRS) |
Design | Architect the software solution | Design system structure Create design document Review with stakeholders |
Design Document |
Development | Build the software based on design | Assign coding tasks Write code using appropriate tools Follow organizational coding standards |
Working Code |
Testing | Verify functionality and quality | Conduct unit, integration, system, and acceptance tests Fix bugs Retest for stability and compliance |
Tested and Stable Code |
Deployment | Release software to users | Release to UAT environment Gain stakeholder sign-off Deploy to production via web, app store, or internal tool |
Live Software in Production |
Maintenance | Support and improve post-deployment | Monitor for bugs Identify UI issues and enhancements Feed updates into future development cycles |
Updated Requirements / Next Iteration |
The SDLC offers a repeatable framework for managing software development through distinct, manageable phases. From requirement gathering to ongoing support, each phase contributes to building robust and adaptable software solutions. By incorporating stakeholder feedback and iterative design, teams can continuously improve their products throughout the software lifecycle.
Key Processes in Building Quality Software
Process | Purpose | Key Practices / Elements |
---|---|---|
Requirements Gathering | Define what the software must do | - Create Software Requirements Specification (SRS) - Include use cases - Identify functional, UI, system, and non-functional requirements |
Design | Translate requirements into technical architecture | - Break down requirements into components - Define system structure, APIs, UI, and database - Ensure performance and security planning |
Coding for Quality | Write clean, maintainable, and error-resistant code | - Follow coding standards and styles - Use linters to detect issues - Write comments and documentation in code |
Testing | Verify software meets requirements and is free of bugs | - Perform unit, integration, system, and UAT(User Acceptance Testing) testing - Use functional, non-functional, and regression test types |
Releases | Distribute software in controlled phases | - Alpha: early internal version - Beta: external limited testing - GA: general availability to all users |
Documentation | Provide guidance for both technical and non-technical users | - System docs: README, architecture, maintenance guides - User docs: manuals, videos, help tools |
Requirements Gathering
- The requirements process is iterative and critical to aligning software with business and user needs.
- SRS: Focuses on software functionality and performance.
- URS: Captures user goals in use-case format.
- SysRS: Covers system-wide constraints, including hardware and policy requirements.
Topic | Purpose / Description | Key Details |
---|---|---|
Requirement Gathering Steps | Define the problem and document a solution plan | 1. Identify stakeholders 2. Establish goals and objectives 3. Elicit requirements 4. Document requirements 5. Analyze and confirm 6. Prioritize |
Stakeholders | Identify individuals/groups affected by the software | Includes decision-makers, end-users, system admins, engineering, sales, marketing, and support |
Goals vs. Objectives | Goals = broad outcomes Objectives = measurable actions |
Goals guide long-term vision Objectives help achieve those goals |
Elicitation Methods | Gather raw requirements from stakeholders | Surveys Interviews Questionnaires |
Requirement Confirmation | Ensure requirements are accurate and agreed upon | Analyze for clarity, consistency, and completeness Reviewed and approved by stakeholders |
Prioritization Labels | Rank requirements to manage delivery focus | “Must-have”, “Highly desired”, “Nice to have” |
SRS (Software Requirement Specification) | Captures all technical/software needs | Includes: - Purpose, scope - Constraints, assumptions, dependencies - Functional - External Interface - System Features - Non-functional |
URS (User Requirement Specification) | Describes end-user needs using stories or use cases | Answers: Who is the user? What function is needed? Why is it needed? Validated via User Acceptance Testing (UAT) |
SysRS (System Requirement Specification) | Broadest doc outlining the full system requirements | Includes: - Capabilities - Interfaces - Policy, regulatory, performance, personnel, and security needs - Hardware/software expectations and acceptance criteria |
Software Development Methodologies
Methodology | Structure | Pros | Cons |
---|---|---|---|
Waterfall | - Sequential - Each phase completed before the next begins - No overlap between stages |
- Simple and easy to understand - Clearly defined stages - Easier budget estimation |
- Inflexible to changes - Late customer feedback - Long development cycles |
V-Model | - Extension of Waterfall - “V” shape: Left = Verification, Right = Validation - Test plans created early |
- Clear mapping of testing to development - Saves time during validation - Structured |
- Very rigid - Changes are hard to accommodate after testing begins |
Agile | - Iterative and cyclical - Work in short sprints (1–4 weeks) - Continuous feedback loop |
- Adapts easily to changing requirements - Early and frequent delivery of working software |
- Hard to estimate total cost/scope early - Requires high stakeholder involvement |
Software Testing
Category / Level | Purpose | Key Characteristics |
---|---|---|
Functional Testing | Verify that software meets functional requirements | - Based on inputs/outputs (black box) - Tests usability and accessibility - Can be manual or automated |
Non-Functional Testing | Evaluate software’s quality attributes | - Tests performance, scalability, security, recovery, documentation consistency, cross-platform behavior |
Regression Testing | Ensure recent changes haven't broken existing functionality | - Triggered by bug fixes or requirement changes - Prioritize frequently failing, complex, or recently modified test cases |
Unit Testing | Validate individual components (functions/modules) | - Done by developers - Detects construction errors early - Increases development efficiency |
Integration Testing | Detect errors between combined modules | - Black-box testing - Checks interaction between modules, databases, external systems - Finds logic or exception mismatches |
System Testing | Verify the complete integrated software against all requirements | - Conducted in a staging environment - Includes both functional and non-functional tests |
Acceptance Testing | Confirm the software meets user/business needs | - Final validation by users or stakeholders - Done during maintenance or before production rollout |
Software Documentation
Category | Purpose | Target Audience | Examples / Notes |
---|---|---|---|
Documentation Formats | Methods to deliver information about software | All users | Written Video Graphical |
Product Documentation | Describes what the software is and how it functions | Developers, QA, End Users, Stakeholders | Includes: Requirements, Design, Technical, QA, and User documentation |
Process Documentation | Describes how to perform a task or follow a workflow | Developers, Admins, QA | Includes process overviews, often paired with SOPs |
Requirements Docs | Define expected functionality of software | Developers, Architects, QA | SRS, URS, SysRS |
Design Docs | Explain how the software will be built | Architects, Developers | Conceptual and technical designs |
Technical Docs | Help understand and maintain the codebase | Developers | Code comments, working papers, engineering notes |
QA Documentation | Outline testing strategy, execution, and metrics | QA Engineers | Test plans, test cases, strategies, traceability matrices |
User Documentation | Guide end users on software use and troubleshooting | End Users | FAQs, tutorials, manuals, help guides |
SOPs (Standard Operating Procedures) | Detailed step-by-step guide for org-specific tasks | Internal teams (e.g., engineers, testers) | Flowcharts, outlines, or written steps e.g., code merge procedures |
Maintenance Note | Documentation must stay up-to-date, especially after UI changes | All stakeholders | Updated during the maintenance phase of the SDLC |
Software Versions
Topic | Description / Purpose |
---|---|
Definition | A system for tracking changes, updates, and patches to programs and applications |
Common Formats | - Typically use 2, 3, or 4 numbers (e.g., 1.2.0.5) - Numbers are separated by periods |
Semantic Versioning | A common structure with 4 parts: 1. Major (new release) 2. Minor (small updates) 3. Patch (bug fixes) 4. Build (less significant/internal) |
Alternate Formats | Some developers use date-based versions (e.g., Ubuntu 18.04.2 = Year 2018, April, update 2) |
Finding Version Info | Typically found under Help > About in applications (e.g., in Chrome, via menu > Help > About) |
Beta/Test Versions | Versions under 1.0 (e.g., 0.9) indicate the software is in testing/beta stage |
Compatibility Issues | - Common between old and new versions - Can be resolved by updating or using backward-compatible software |
Roles in Software Engineering
Role | Description | Key Responsibilities |
---|---|---|
Project Manager (Waterfall) | Oversees the entire project in traditional SDLC | Planning, scheduling, budgeting Allocating resources Executing plans Facilitating communication |
Scrum Master (Agile) | Ensures team success and communication in Agile projects | Facilitates Agile processes Prioritizes people over process Supports team collaboration |
Stakeholder | End-users, clients, admins, and decision-makers | Define requirements Provide feedback Participate in beta and acceptance testing |
System / Software Architect | Designs the technical foundation of the software | Define software architecture Guide technical decisions Support development phases |
UX Designer | Focuses on user experience and interaction | Design intuitive interfaces Define user interactions Ensure usability and accessibility |
Software Developer | Writes and maintains the codebase | Implement architecture and requirements Collaborate with UX design Build functional features |
Tester / QA Engineer | Ensures software quality and correctness | Write and run test cases Identify bugs Verify software meets requirements |
Site Reliability Engineer (SRE) | Bridges development and operations | Monitor systems Automate infrastructure Troubleshoot and ensure system reliability |
Product Manager / Owner | Owns the product vision and aligns with user needs | Understand client/user needs Lead development goals Ensure product delivers stakeholder value |
Technical Writer | Produces documentation for non-technical users | Write manuals, guides, reports Communicate complex ideas clearly Support user onboarding and feedback |
Summary & Highlights
- Software engineering is the application of scientific principles to the design and creation of software.
- Responsibilities of a software engineer include designing, building, and maintaining software systems.
- Using the SDLC can improve efficiency and reduce risks by:
- letting team members know what they should be working on and when
- facilitating communication between the customer, other stakeholders, and the development team
- letting stakeholders know where they fit into that process and
- letting cross-domain teams know when they have completed their tasks so development can move to the next phase.
- Common software engineering processes are requirements gathering, design, coding, testing, releasing, and documenting.
- The requirement gathering process entails identifying stakeholders, establishing goals and objectives, eliciting requirements from the stakeholders, documenting the requirements, analyzing, prioritizing, and confirming the requirements.
- An SRS is a document that captures the functionalities that the software should perform and also establishes benchmarks or service levels for its performance.
- A URS is a subset of the SRS that details user specification requirements.
- The SysRS contains the same information as an SRS, but can also additionally include system capabilities, interfaces, and user characteristics, policy requirements, regulation requirements, personnel requirements, performance requirements, security requirements, and system acceptance criteria.
- Waterfall, V-shape model, and agile are all different methodologies for implementing the software development life cycle.
- Functional testing is concerned with inputs and corresponding outputs of the system under test, non-functional testing tests for attributes such as performance, security, scalability, and availability. Whereas regression testing confirms that a recent change to the application, such as a bug fix, does not adversely affect already existing functionality.
- Types of documentation include requirements, design, technical, quality assurance, and user.
- There are many different roles involved in a software engineering project. Some of them include project manager or scrum master, stakeholder, system or software architect, UX designer, software developer, tester or QA engineer, site reliability or Ops engineer, product manager or owner, and technical writer or information developer.
Application Development Concepts
Squads
A Squad in Agile is a small, cross-functional, self-organizing team responsible for a specific feature, product, or service. Each squad typically includes developers, testers, designers, and a product owner. Squads work autonomously, follow Agile principles (e.g., Scrum or Kanban), and collaborate closely to deliver end-to-end value.
Key points:
- 6–12 members
- Owns one product or feature area
- Works like a mini startup
- Inspired by Spotify’s Agile model
- Encourages autonomy and accountability
Pair Programming
Aspect | Details |
---|---|
Definition | Agile development technique where two developers work side-by-side on the same code (physically or virtually). |
Main Styles | - Driver/Navigator: One types (driver), one guides (navigator); roles are swapped regularly - Ping-Pong: Based on test-driven development (TDD); one writes failing test, other writes code to pass it - Strong Style: Experienced dev navigates, junior dev drives—idea must go through another’s hands before being implemented |
Benefits | - Promotes knowledge sharing and onboarding - Enhances communication and problem-solving skills - Reduces typos, bugs, and logic errors - Encourages early code review - Leads to higher code quality despite potentially slower development pace |
Challenges | - Requires high concentration and can be mentally draining - Scheduling conflicts can occur - Risk of role imbalance (e.g., one dominates) - Personality mismatches - Noise issues in multi-pair settings |
Application Development Tools
Tool / Concept | Purpose | Key Features | Examples |
---|---|---|---|
Version Control | Track changes in source code; manage collaboration | - Records edits by time and author - Enables branching, merging, and reverts |
Git, GitHub |
Libraries | Reusable code for solving specific problems or adding features | - Developer controls when functions are called - Speeds up development |
jQuery, Email-validator, Apache Commons |
Frameworks | Provide a structured workflow and architecture for apps | - Inversion of control: framework calls your code - Standardizes structure and reduces config time |
AngularJS, Vue.js, Django |
CI/CD | Automate integration, testing, and deployment of code | - CI: Integrate changes frequently and test - CD: Deliver changes to staging or production reliably |
Jenkins, GitHub Actions, GitLab CI/CD |
Build Tools | Compile, package, and test code automatically | - Automates tasks: compiling, bundling, testing - Useful in multi-developer environments |
Webpack, Babel, Gradle, Maven |
Packages | Bundled archive of app files and metadata for distribution | - Contains install scripts, versioning, dependencies - Ensures easy installation for end users |
.deb , .rpm , .pkg files |
Package Managers | Manage finding, installing, updating, and removing packages | - Automates dependency management - Ensures integrity (via checksums, signatures) - Connects to online repositories |
npm (JS), Pip/Conda (Python), RubyGems, Homebrew |
Software Design and Modeling
Concept | Purpose / Description | Key Elements / Examples |
---|---|---|
Structured Design | Breaks down software into smaller modules to improve organization and scalability | - Modules should be cohesive (group related functions) - Should be loosely coupled (minimal dependencies) |
Behavioral Models | Describe what the system does without specifying how it is done | - Focus on interactions and states - Often represented through UML behavioral diagrams |
UML (Unified Modeling Language) | A standardized visual language to represent software architecture and behavior | - Language-agnostic - Divided into structural and behavioral diagrams |
Advantages of UML | Enhances communication, planning, and onboarding | - Saves time/cost by planning before coding - Aids collaboration across technical and non-technical teams |
State Transition Diagram | Behavioral UML diagram that shows system states and transitions based on events | - States (e.g., "waiting", "testing") - Events trigger transitions between states |
Interaction Diagram | Shows how objects interact over time in a dynamic context | - Often visualized using sequence diagrams - Example: online appointment booking workflow |
Object-Oriented Analysis and Design (OOAD)
Concept | Purpose / Description | Key Details / Examples |
---|---|---|
OOAD | A method for designing software systems using object-oriented principles | - Used with languages like Java, Python, C++ - Emphasizes modularity and interaction of objects |
Object | An instance of a class that holds data and behaviors | - E.g., Naya Patel as a patient object- Can perform actions like cancelAppointment() |
Class | A blueprint or template for creating objects | - Defines properties (e.g., LastName ) and methods- Instantiation assigns real values to these attributes |
Class Diagram (UML) | A structural UML diagram showing relationships and attributes of classes | - Boxes = Classes - Shows properties and methods - Shows inheritance relationships |
Inheritance | Mechanism where a subclass inherits attributes from its parent class | - E.g., Doctor inherits from MedicalPersonnel Specialist inherits from Doctor |
Application Architecture
Concept | Purpose / Description | Key Features / Examples |
---|---|---|
Component | Encapsulated unit of functionality used within applications | - Characteristics: Reusable, Replaceable, Independent, Extensible, Encapsulated, Non-context specific |
Examples of Components | Functional units reusable across systems | - API connectors - Data Access Objects - Controllers |
Component-Based Architecture | System design composed of loosely coupled components | - Higher abstraction than object-oriented design - Promotes modular, scalable applications |
Service | A component that is deployed independently and reused across systems | - Always-running instance - Handles business tasks like credit checks or loan processing |
Service vs Component | Services are built from components and run independently | - Services = network-accessible, single instances - Components = internal reusable blocks |
Service-Oriented Architecture (SOA) | Network-based communication between services | - Services interact via protocols (e.g., HTTP) - Loosely coupled - Enables distributed system design |
Distributed System | System with multiple services running on different machines, appearing as one to the user | - Properties: Fault-tolerant, Concurrent, Scalable, Heterogeneous (hardware/OS) - Examples: Client-server, Microservices |
Node | Any device that processes and transmits data on the network | - Hosts one or more services within the distributed architecture |
Software Architectural Patterns
- Architectural Pattern = Reusable solution to a recurring structural problem in system design
- Patterns can often be combined (e.g., microservices within a 3-tier architecture)
- Some are mutually exclusive (e.g., P2P cannot be 2-tier because of role separation)
Pattern | Description | Key Characteristics | Example |
---|---|---|---|
2-Tier (Client-Server) | Client interfaces with a dedicated server | - Centralized server - Clients send requests, server responds - Simple architecture |
Text messaging app, DB client-server |
3-Tier | Application divided into Presentation, Logic, and Data layers | - Layers interact only with adjacent ones - Promotes separation of concerns |
Most web apps (UI ↔ App ↔ DB) |
Peer-to-Peer (P2P) | Decentralized nodes act as both clients and servers | - No central coordination - Nodes share resources (e.g., storage, compute) - Scalable, resilient |
Bitcoin, Ethereum |
Event-Driven | Focuses on producers and consumers reacting to events | - Loose coupling - Event router distributes notifications - Real-time interactions |
Ride-sharing apps (e.g., Uber) |
Microservices | System broken into independent, loosely coupled services | - Each service handles one function - Communication via APIs - Highly scalable and maintainable |
Social media platforms |
Microservices
Microservices is an architectural style where an application is built as a collection of small, independent services, each handling a specific business function.
Key Characteristics
- Single Responsibility: Each service does one thing well
- Independent Deployment: Can be developed and deployed separately
- API Communication: Communicates via REST, gRPC, or message queues
- Own Data Store: Each service manages its own database
- Technology Agnostic: Different services can use different tech stacks
Comparison: Monolith vs Microservices
Feature | Monolith | Microservices |
---|---|---|
Structure | All-in-one | Modular and independent |
Deployment | As a single unit | Per service |
Scalability | Whole system | Per service |
Fault Isolation | One crash affects all | Crashes are isolated |
Common Stack
- Backend: FastAPI, Flask, Node.js, Spring Boot
- API Gateway: Nginx, Kong, Zuul
- Containerization: Docker
- Orchestration: Kubernetes
- Communication: REST, gRPC, RabbitMQ, Kafka