Software Engineering: Foundations, Processes, Requirements, Design, Testing, and Maintenance
Software engineering is the disciplined development, operation, and maintenance of software systems using systematic methods, tools, and quality controls. The field emerged as a response to the software crisis identified in the late 1960s, when increasingly large systems were delivered late, over budget, difficult to maintain, or not delivered at all.2 The NATO conferences of 1968 and 1969 helped popularize the term and positioned software creation as an engineering activity rather than only a programming craft.
A useful historical distinction is between a program and a programming system product: a single program becomes far more complex when it must be generalized for multiple users, fully documented, tested, integrated, packaged, and maintained as a real product. This helps explain why software projects scale nonlinearly in cost and coordination effort.
Software also has unusual characteristics compared with physical products. It is largely intangible, does not wear out in the mechanical sense, is often highly changeable, and accumulates complexity through modification over time.2 These properties make process discipline, requirements clarity, design structure, and testing rigor essential.
Fred Brooks' famous argument in No Silver Bullet remains foundational: there is no single technology or management technique likely to produce a tenfold improvement in productivity, reliability, or simplicity within a decade. Brooks separated essential complexity from accidental complexity, arguing that many advances reduce the accidental part, but the core problem remains difficult. This perspective still explains why modern tools help greatly, yet do not eliminate the need for sound engineering judgment.
Software development is therefore studied as an integrated lifecycle involving requirements, design, implementation, testing, deployment, maintenance, measurement, and evolution.2
Footnotes
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩ ↩2 ↩3 ↩4 ↩5
-
The history of coding and software engineering - Describes the software crisis, NATO conferences, and subsequent development of software engineering practices. ↩
-
No Silver Bullet - Summary of Fred Brooks' argument about essential and accidental complexity in software engineering. ↩ ↩2 ↩3 ↩4 ↩5
-
Software Testing: Boundary Value Analysis & Equivalence Partitioning - Explains boundary-focused testing and the role of regression-like retesting concepts in ongoing software change contexts. ↩
Introduction to the Software Development Life Cycle
Why Software Engineering Exists
Software engineering became necessary because large software systems repeatedly failed in cost, schedule, and quality during the software crisis of the 1960s and beyond.2
Footnotes
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩
-
The history of coding and software engineering - Describes the software crisis, NATO conferences, and subsequent development of software engineering practices. ↩
Historical Roadmap of Software Engineering
Software Crisis
1960sLarge systems increasingly suffered from delays, budget overruns, reliability problems, and maintenance difficulty, motivating new engineering approaches.2"
Footnotes
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩
-
The history of coding and software engineering - Describes the software crisis, NATO conferences, and subsequent development of software engineering practices. ↩
NATO Conferences
1968–1969The term software engineering gained prominence through NATO conferences convened to address the crisis."
Footnotes
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩
Structured Methods
1970sStructured programming, information hiding, and structured design methods gained influence in response to complexity."
Footnotes
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩
Metrics and Process Maturity
1980sFormal process models, software metrics, CASE tools, and quality frameworks expanded software engineering practice.2"
Footnotes
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩
-
A testing methodology using the cyclomatic complexity metric - NIST publication explaining control flow graphs, cyclomatic complexity, and links to structured design principles. ↩
Object Orientation and Reuse
1990sObject-oriented analysis and design, UML, component-based development, and reuse became widespread."
Footnotes
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩
Agile and Continuous Evolution
2000s onwardAgile methods, iterative delivery, automation, and continuous improvement reshaped development process choices."
Footnotes
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩
Module I — Introduction and Software Development Life Cycles
A software process defines how software is specified, designed, built, validated, and evolved. Different lifecycle models attempt to control uncertainty, improve visibility, and reduce risk. The right model depends on requirement stability, technical novelty, stakeholder access, schedule pressure, and risk tolerance.
Core introductory concepts
Characteristics of software
- Intangible and logic-based rather than manufactured material goods.
- Easy to copy, but expensive to design, validate, and evolve.
- Does not physically wear out, yet degrades structurally through poor changes and increasing complexity.
- Often custom-built and continuously modified, which makes maintenance a dominant lifecycle cost.2
Software myths Software myths are false beliefs held by customers, managers, or developers, such as: requirements can change freely with little cost, testing alone guarantees quality, or programming is the only meaningful work in a project. These myths lead to underestimation, poor planning, and weak engineering discipline.
Major SDLC models
| Model | Main idea | Strengths | Weaknesses | Best fit |
|---|---|---|---|---|
| Code-and-Fix | Start coding immediately | Fast for tiny tasks | Poor predictability, high rework, weak documentation | Very small throwaway work |
| Waterfall | Sequential phases | Clear milestones and documentation | Inflexible to changing requirements | Stable, regulated projects |
| Evolutionary model | Iterative refinement | Early partial results, feedback-friendly | Can drift without discipline | Uncertain requirements |
| Incremental implementation | Build in increments | Earlier value, reduced integration shock | Needs sound architecture | Business systems |
| Prototyping | Build to learn | Clarifies user needs | Risk of confusing prototype with final product | Requirements discovery2 |
| Spiral model | Iteration around risk analysis | Strong for high-risk systems | Management overhead | Large, risky systems |
| Software reuse | Reuse components/services | Faster delivery, lower duplication | Integration and dependency issues | Product lines, platforms |
A critical comparison shows that no lifecycle model is universally superior. Waterfall emphasizes control, incremental and evolutionary models emphasize adaptability, and the spiral model emphasizes risk analysis. Reuse-oriented development changes the lifecycle itself because requirements and design may be constrained by available components.
Non-traditional software development processes
Rational Unified Process (RUP). RUP is an iterative framework organized into inception, elaboration, construction, and transition phases, combining use cases, architecture focus, and iterative risk reduction.
Rapid Application Development (RAD). RAD prioritizes fast delivery through prototyping, component reuse, user involvement, and time-boxing. It works best when scope is partitionable and speed is critical.
Agile development. Agile methods emphasize short iterations, stakeholder feedback, adaptive planning, and working software over excessive upfront specification. Agile does not eliminate engineering discipline; it relocates it into continuous collaboration, automated validation, and iterative refinement.
Footnotes
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19
-
Software Testing: Boundary Value Analysis & Equivalence Partitioning - Explains boundary-focused testing and the role of regression-like retesting concepts in ongoing software change contexts. ↩
-
Ch 4: Requirements Engineering - Covers requirements engineering processes, SRS structure, validation, and distinctions among requirement types. ↩
How to Select an Appropriate SDLC Model
- 1Step 1
If business rules are well understood and unlikely to change, more plan-driven approaches such as waterfall may be feasible; unstable needs favor iterative approaches.2
Footnotes
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩
-
Ch 4: Requirements Engineering - Covers requirements engineering processes, SRS structure, validation, and distinctions among requirement types. ↩
-
- 2Step 2
High uncertainty, safety constraints, or novel technology make risk-driven models such as spiral or RUP more suitable.
Footnotes
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩
-
- 3Step 3
If stakeholders need early usable functionality, incremental, prototyping, RAD, or agile approaches offer faster partial value.
Footnotes
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩
-
- 4Step 4
Agile and prototyping rely heavily on frequent user feedback; if stakeholders are inaccessible, more formal documentation becomes important.2
Footnotes
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩
-
Ch 4: Requirements Engineering - Covers requirements engineering processes, SRS structure, validation, and distinctions among requirement types. ↩
-
- 5Step 5
Regulated environments often need stronger traceability, review gates, and formal specifications than informal code-and-fix or lightweight agile variants.2
Footnotes
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩
-
Ch 4: Requirements Engineering - Covers requirements engineering processes, SRS structure, validation, and distinctions among requirement types. ↩
-
- 6Step 6
Incremental delivery succeeds best when the architecture is modular enough to support staged implementation without destabilizing the whole system.2
Footnotes
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩
-
A testing methodology using the cyclomatic complexity metric - NIST publication explaining control flow graphs, cyclomatic complexity, and links to structured design principles. ↩
-
Common SDLC Mistake
Using code-and-fix for medium or large systems usually increases rework, weakens documentation, and makes testing and maintenance significantly harder.
Footnotes
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩
Module II — Requirements Engineering
Requirements engineering is the foundation of successful software projects because errors introduced here propagate into design, code, testing, and maintenance at much higher correction cost later. A requirement is a condition or capability needed by a user or system to solve a problem or achieve an objective.
User needs, software features, and software requirements
A user need describes what stakeholders are trying to accomplish. A software feature translates that need into an externally meaningful capability. A software requirement expresses the capability or constraint in a form suitable for analysis, validation, and contractual agreement.
Classes of user requirements
A common distinction separates:
- Enduring requirements: relatively stable needs tied to core business or domain operations.
- Volatile requirements: needs likely to change because of policy, market, regulation, technology, or organizational change.
Volatile requirements demand mechanisms for prioritization, traceability, negotiation, and controlled change management.
Functional and nonfunctional requirements
Functional requirements describe what the system shall do, such as calculate totals, authenticate users, or generate reports. Nonfunctional requirements describe qualities and constraints such as performance, availability, safety, usability, portability, reliability, and security.2
Examples:
Sub-phases of requirement analysis
Requirement work usually includes elicitation, analysis, specification, validation, and management. Elicitation gathers information from interviews, observation, workshops, documents, and prototypes. Analysis resolves ambiguity, inconsistency, overlap, and feasibility issues. Specification records requirements clearly. Validation checks correctness, completeness, consistency, realism, and verifiability. Management tracks changes over time.
Barriers to eliciting user requirements
Requirement elicitation often fails because stakeholders use different vocabularies, omit tacit knowledge, disagree on priorities, or cannot envision future workflows clearly.2 Additional barriers include incomplete domain knowledge, geographically distributed teams, political conflict, ambiguous language, and changing business context.
Software requirements document and SRS standards
The Software Requirements Specification (SRS) is the official statement of what will be implemented, including user requirements, detailed system requirements, and relevant constraints; importantly, it is not a design document. IEEE Std 830 historically standardized SRS structure, and later ISO/IEC/IEEE 29148 modernized requirements engineering terminology and specification guidance.2
A good SRS should be:
- Correct
- Unambiguous
- Complete
- Consistent
- Ranked for importance or stability
- Verifiable
- Modifiable
- Traceable2
Case study idea: real-time system SRS
For a real-time monitoring system, the SRS must usually combine functional behavior with strict timing, event handling, fault tolerance, and external interface constraints. Real-time SRS documents must specify response deadlines, sensor data rates, alarm logic, fail-safe behavior, and recovery conditions in measurable terms.
Footnotes
-
Ch 4: Requirements Engineering - Covers requirements engineering processes, SRS structure, validation, and distinctions among requirement types. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17
-
What Are Nonfunctional Requirements? Definition + Best Practices - Explains nonfunctional requirements and their role in product development and SRS documentation. ↩ ↩2
-
Overcoming Challenges of Requirements Elicitation in Offshore Outsourced Software Development Projects - Discusses common elicitation barriers such as ambiguity, incompleteness, inconsistency, and stakeholder challenges. ↩ ↩2
-
Markdown Software Requirements Specification (MSRS) - Practical SRS template aligned with IEEE 830 and ISO/IEC/IEEE 29148, emphasizing traceability and verifiable requirements. ↩ ↩2
The system shall record each sensor reading with timestamp, source identifier, and status code, and shall trigger an alarm when a reading exceeds configured thresholds for two consecutive samples.
Footnotes
-
Ch 4: Requirements Engineering - Covers requirements engineering processes, SRS structure, validation, and distinctions among requirement types. ↩
Requirements Engineering Workflow
- 1Step 1
List user groups, operators, customers, maintainers, regulators, and interfaces to establish boundaries and viewpoints.
Footnotes
-
Ch 4: Requirements Engineering - Covers requirements engineering processes, SRS structure, validation, and distinctions among requirement types. ↩
-
- 2Step 2
Use interviews, workshops, observation, document study, and prototypes to gather goals, constraints, and business rules.2
Footnotes
-
Ch 4: Requirements Engineering - Covers requirements engineering processes, SRS structure, validation, and distinctions among requirement types. ↩
-
Overcoming Challenges of Requirements Elicitation in Offshore Outsourced Software Development Projects - Discusses common elicitation barriers such as ambiguity, incompleteness, inconsistency, and stakeholder challenges. ↩
-
- 3Step 3
Remove ambiguity, resolve conflicts, classify requirements, and assess feasibility, risk, and priority.
Footnotes
-
Ch 4: Requirements Engineering - Covers requirements engineering processes, SRS structure, validation, and distinctions among requirement types. ↩
-
- 4Step 4
Document functional, nonfunctional, interface, domain, and constraint requirements in a structured and traceable form.2
Footnotes
-
Ch 4: Requirements Engineering - Covers requirements engineering processes, SRS structure, validation, and distinctions among requirement types. ↩
-
Markdown Software Requirements Specification (MSRS) - Practical SRS template aligned with IEEE 830 and ISO/IEC/IEEE 29148, emphasizing traceability and verifiable requirements. ↩
-
- 5Step 5
Review for completeness, consistency, realism, and testability before development proceeds.
Footnotes
-
Ch 4: Requirements Engineering - Covers requirements engineering processes, SRS structure, validation, and distinctions among requirement types. ↩
-
- 6Step 6
Baseline approved requirements and control revisions through traceability and impact analysis.
Footnotes
-
Ch 4: Requirements Engineering - Covers requirements engineering processes, SRS structure, validation, and distinctions among requirement types. ↩
-
Tools for Requirements Gathering and Analysis
Requirement Writing Rule
Prefer measurable statements such as response time, throughput, retention period, or error rate; vague terms like 'fast' or 'easy' are difficult to verify.2
Footnotes
-
Ch 4: Requirements Engineering - Covers requirements engineering processes, SRS structure, validation, and distinctions among requirement types. ↩
-
What Are Nonfunctional Requirements? Definition + Best Practices - Explains nonfunctional requirements and their role in product development and SRS documentation. ↩
Module III — Software Design, Metrics, and Development
Software design determines how the system will satisfy requirements through decomposition, interfaces, control, data organization, and component interaction. Good design aims for correctness, maintainability, adaptability, understandability, reusability, and testability.2
Design strategies and methodologies
Design may proceed top-down from system goals to modules, bottom-up from reusable components to larger assemblies, or through hybrid methods. Data-oriented design emphasizes how information is organized, stored, and transformed across the system.
Structured design
Structured design uses decomposition and clear control hierarchy to organize modules. A structure chart shows calling relationships and module breakdown. Two major evaluation principles are:
- Cohesion: higher cohesion is desirable because each module serves a focused purpose.
- Coupling: lower coupling is desirable because modules interact through limited, stable interfaces.
A modular design with strong packaging improves maintainability, testing, and incremental development.
Object-oriented design
Object-oriented design organizes software around objects, classes, responsibilities, and collaborations. It benefits from abstraction, encapsulation, inheritance, and polymorphism. Design patterns capture proven arrangements such as Factory, Observer, Strategy, and Singleton for recurring software problems.
Structured analysis
Data Flow Diagram (DFD) shows processes, data stores, external entities, and data movement, helping analysts understand functional decomposition. A data dictionary defines data items, structures, meanings, ranges, and usage rules.
Software measurement and metrics
Metrics help estimate size, complexity, quality, and effort. Common size-oriented measures include Lines of Code, Function Point counts, and other effort indicators. Function points are useful because they focus on externally visible functionality rather than implementation language alone.
Halstead metrics estimate software attributes from the number of distinct and total operators and operands in code. These metrics attempt to characterize vocabulary, length, volume, difficulty, and effort.
Cyclomatic complexity measures structural complexity from a control flow graph and is closely tied to testing effort. For a single connected component:
where is the number of edges and is the number of nodes in the control flow graph.
It may also be expressed as:
where is the number of predicate nodes.
Higher values generally indicate more branching and more independent paths requiring test attention, though the metric must be interpreted with design context rather than used mechanically.
Development practices
Language selection should consider ecosystem, performance, safety, team skill, tooling, maintainability, and deployment constraints. Coding guidelines improve readability, consistency, defect prevention, and review quality. Code documentation should capture interfaces, assumptions, side effects, invariants, and usage rather than merely restate the code.
Footnotes
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7
-
A testing methodology using the cyclomatic complexity metric - NIST publication explaining control flow graphs, cyclomatic complexity, and links to structured design principles. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12
Comparison of Common Software Metrics
Relative emphasis of selected metrics in software measurement practice
Design and Development Essentials
Module IV — Software Testing
Software testing checks whether implemented software satisfies specified behavior and quality expectations. Testing is not only bug hunting; it is also a validation activity linked to requirements, design structure, risk, and operational confidence.
Testing process
A typical testing process includes planning, test design, test case preparation, environment setup, execution, defect logging, regression testing, reporting, and closure. Good test design seeks representative and high-risk scenarios rather than exhaustive execution, which is usually impossible.
Functional testing
Functional testing derives tests from specifications and business rules rather than code structure.
Important techniques include:
- Boundary value analysis: choose values at minimum, maximum, just inside, and just outside valid boundaries because defects frequently occur at edges.
- Equivalence class testing: divide the input domain into valid and invalid classes and test representative members to reduce redundancy.
- Decision table testing: effective for systems with complex business combinations.
- Cause-effect graphing: helps derive tests for logical combinations of inputs and outputs.
Structural testing
Structural testing uses program logic to derive tests. This includes path testing, data flow testing, and mutation testing.
- Path testing targets independent execution paths, often guided by cyclomatic complexity.
- Data flow testing focuses on definition-use chains of variables.
- Mutation testing introduces small changes to code and checks whether test suites detect them, giving insight into test effectiveness.
Levels of testing
- Unit testing: tests individual functions, methods, or classes.
- Integration testing: tests interactions among modules.
- System testing: tests the complete integrated system against requirements.
- Alpha testing: in-house acceptance-like testing in a controlled environment.
- Beta testing: limited external release to real users for practical feedback.
Debugging and standards
Debugging is the diagnosis and correction of defect causes after test failure detection. Testing tools support test management, automation, static analysis, coverage, and defect tracking. Standards and disciplined processes improve repeatability, traceability, and evidence of quality in both general and regulated development settings.
Footnotes
-
Black Box Testing Techniques Explained - Overview of functional testing methods including equivalence partitioning, boundary value analysis, decision tables, and cause-effect graphing. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11
-
A testing methodology using the cyclomatic complexity metric - NIST publication explaining control flow graphs, cyclomatic complexity, and links to structured design principles. ↩
Designing Effective Test Cases
- 1Step 1
Identify expected inputs, outputs, constraints, business rules, and error conditions before writing tests.2
Footnotes
-
Ch 4: Requirements Engineering - Covers requirements engineering processes, SRS structure, validation, and distinctions among requirement types. ↩
-
Black Box Testing Techniques Explained - Overview of functional testing methods including equivalence partitioning, boundary value analysis, decision tables, and cause-effect graphing. ↩
-
- 2Step 2
Use equivalence classes to reduce the total number of cases while preserving behavioral coverage.
Footnotes
-
Black Box Testing Techniques Explained - Overview of functional testing methods including equivalence partitioning, boundary value analysis, decision tables, and cause-effect graphing. ↩
-
- 3Step 3
Select minimum, maximum, valid edge, and invalid edge values because defects often occur near limits.
Footnotes
-
Black Box Testing Techniques Explained - Overview of functional testing methods including equivalence partitioning, boundary value analysis, decision tables, and cause-effect graphing. ↩
-
- 4Step 4
For rule-heavy features, use decision tables or cause-effect graphs to cover meaningful combinations.
Footnotes
-
Black Box Testing Techniques Explained - Overview of functional testing methods including equivalence partitioning, boundary value analysis, decision tables, and cause-effect graphing. ↩
-
- 5Step 5
Where code access exists, complement functional cases with path or branch-oriented tests guided by control flow and complexity.
Footnotes
-
A testing methodology using the cyclomatic complexity metric - NIST publication explaining control flow graphs, cyclomatic complexity, and links to structured design principles. ↩
-
- 6Step 6
Preserve high-value tests so that future changes can be checked quickly for unintended side effects.2
Footnotes
-
Software Testing: Boundary Value Analysis & Equivalence Partitioning - Explains boundary-focused testing and the role of regression-like retesting concepts in ongoing software change contexts. ↩
-
Black Box Testing Techniques Explained - Overview of functional testing methods including equivalence partitioning, boundary value analysis, decision tables, and cause-effect graphing. ↩
-
Testing Limitation
Testing can reveal the presence of defects, but it cannot prove their total absence; confidence comes from risk-based coverage, sound design, and disciplined process.
Footnotes
-
Black Box Testing Techniques Explained - Overview of functional testing methods including equivalence partitioning, boundary value analysis, decision tables, and cause-effect graphing. ↩
If valid age input is from to , useful tests include , , , , , and .
Footnotes
-
Black Box Testing Techniques Explained - Overview of functional testing methods including equivalence partitioning, boundary value analysis, decision tables, and cause-effect graphing. ↩
Module V — Software Maintenance and Evolution
Software maintenance includes correcting faults, adapting software to changed environments, improving performance, and enhancing functionality after release. In practice, maintenance consumes a substantial share of total lifecycle effort because software continues to evolve with user needs, platforms, regulations, and operational experience.2
Management of maintenance
Maintenance must be planned, staffed, documented, prioritized, and controlled. Requests should be classified by urgency, impact, risk, and business value. Good maintenance management relies on issue tracking, versioning, traceability, release planning, and regression testing.
Maintenance process and models
A maintenance process usually includes change request logging, impact analysis, modification, retesting, documentation update, configuration update, and release. Maintenance models vary by organizational context, but all must preserve system integrity while accommodating change.
Regression testing
Regression testing is crucial in maintenance because even small fixes can break previously working behavior.2 Automated regression suites are especially valuable when systems evolve frequently.
Reverse engineering and reengineering
Reverse engineering extracts higher-level understanding from existing code, data, or documentation. Software reengineering restructures or modernizes systems while preserving useful functionality. These are essential when organizations depend on legacy systems with poor documentation or outdated technology.
Configuration management and documentation
Configuration management ensures that the correct versions of code, documents, tests, and builds are identified and controlled. Without it, maintenance becomes error-prone and auditability is lost. Updated documentation is equally important because undocumented changes increase future maintenance cost and risk.
Footnotes
-
Software Testing: Boundary Value Analysis & Equivalence Partitioning - Explains boundary-focused testing and the role of regression-like retesting concepts in ongoing software change contexts. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩
-
Black Box Testing Techniques Explained - Overview of functional testing methods including equivalence partitioning, boundary value analysis, decision tables, and cause-effect graphing. ↩
Typical Maintenance Change Lifecycle
Change Request
1A defect, enhancement, compliance need, or environmental change is reported and logged."
Footnotes
-
Software Testing: Boundary Value Analysis & Equivalence Partitioning - Explains boundary-focused testing and the role of regression-like retesting concepts in ongoing software change contexts. ↩
Impact Analysis
2Developers assess affected modules, interfaces, risks, documentation, and test scope."
Footnotes
-
Software Testing: Boundary Value Analysis & Equivalence Partitioning - Explains boundary-focused testing and the role of regression-like retesting concepts in ongoing software change contexts. ↩
Modification
3The required correction or enhancement is implemented under version control."
Footnotes
-
Software Testing: Boundary Value Analysis & Equivalence Partitioning - Explains boundary-focused testing and the role of regression-like retesting concepts in ongoing software change contexts. ↩
Regression Testing
4Existing and change-specific tests are run to ensure prior behavior remains correct.2"
Footnotes
-
Software Testing: Boundary Value Analysis & Equivalence Partitioning - Explains boundary-focused testing and the role of regression-like retesting concepts in ongoing software change contexts. ↩
-
Black Box Testing Techniques Explained - Overview of functional testing methods including equivalence partitioning, boundary value analysis, decision tables, and cause-effect graphing. ↩
Release and Baseline Update
5Approved changes are deployed, baselines are updated, and documentation is synchronized."
Footnotes
-
Software Testing: Boundary Value Analysis & Equivalence Partitioning - Explains boundary-focused testing and the role of regression-like retesting concepts in ongoing software change contexts. ↩
Maintenance-Focused Concepts
Integrative View Across All Modules
Software engineering should be studied as a connected discipline rather than isolated topics. Weak requirements degrade design; poor design increases coding and testing difficulty; inadequate testing increases maintenance cost; poor maintenance discipline erodes long-term quality.5
A coherent view of the subject can be summarized as follows:
- Introduction and process establish why disciplined methods are necessary.3
- Requirements engineering determines what problem is actually being solved.3
- Design and metrics organize the solution into manageable structures and measurable artifacts.
- Testing provides evidence that the implementation satisfies expectations and handles failure cases.
- Maintenance and configuration management preserve usefulness after delivery.
This integrated perspective explains why software engineering is not synonymous with programming alone. It is an end-to-end engineering discipline concerned with quality, process, structure, validation, and evolution.
Footnotes
-
History of software engineering - Historical overview of software engineering, software crisis, structured methods, object orientation, and agile evolution. ↩ ↩2 ↩3
-
Software Testing: Boundary Value Analysis & Equivalence Partitioning - Explains boundary-focused testing and the role of regression-like retesting concepts in ongoing software change contexts. ↩ ↩2
-
Ch 4: Requirements Engineering - Covers requirements engineering processes, SRS structure, validation, and distinctions among requirement types. ↩ ↩2
-
A testing methodology using the cyclomatic complexity metric - NIST publication explaining control flow graphs, cyclomatic complexity, and links to structured design principles. ↩ ↩2
-
Black Box Testing Techniques Explained - Overview of functional testing methods including equivalence partitioning, boundary value analysis, decision tables, and cause-effect graphing. ↩ ↩2
-
No Silver Bullet - Summary of Fred Brooks' argument about essential and accidental complexity in software engineering. ↩
-
The history of coding and software engineering - Describes the software crisis, NATO conferences, and subsequent development of software engineering practices. ↩
-
Overcoming Challenges of Requirements Elicitation in Offshore Outsourced Software Development Projects - Discusses common elicitation barriers such as ambiguity, incompleteness, inconsistency, and stakeholder challenges. ↩
-
Markdown Software Requirements Specification (MSRS) - Practical SRS template aligned with IEEE 830 and ISO/IEC/IEEE 29148, emphasizing traceability and verifiable requirements. ↩
Knowledge Check
Which statement best explains the historical origin of software engineering as a discipline?
Explore Related Topics
Systems Programming: Processes, Memory, Concurrency, and Operating-System Interfaces
Requirement Analysis in Software Engineering: Primary Goal, Rationale, and Exam Interpretation
Requirement analysis’s primary goal is to understand and document stakeholder and user needs, creating a clear specification that drives design, coding, and testing.
- Defined as “identifying, refining, and documenting what a system must do,” it yields an SRS, user stories, or use cases.
- Core steps: elicit needs, analyze/refine, document, validate, and baseline for downstream work ().
- It answers “What does the user need?” unlike design (“How will it be built?”) ().
- Coding, architecture, and testing are downstream activities; the exam answer is option (ii) – understanding and documenting user needs.
Algorithms: Foundations, Analysis, Design Paradigms, and Core Applications