Programming and Software Engineering
Programming and Software Engineering tests lifecycle discipline: requirements, design quality, testing levels, version control, and continuous integration. Questions often ask you to classify a practice or compute a simple design metric.
Core concepts
Requirements should be testable and traceable. Good design favors high cohesion within modules and low coupling between them. Verification asks whether the product was built correctly; validation asks whether the right product was built. Unit tests isolate small units, integration tests check interfaces, system tests check end-to-end behavior, and acceptance tests check user needs. Black-box testing uses specifications; white-box testing uses code structure. Continuous integration runs automated builds and tests on every change.
Worked example
A control-flow graph has 8 nodes, 9 edges, and 1 connected component. Cyclomatic complexity is E − N + 2P = 9 − 8 + 2 = 3. This equals the number of independent paths and, for a structured program, decisions + 1. Three independent paths must be exercised for basis-path coverage, though that alone does not prove the code is correct.
Traps
Do not confuse verification with validation. High statement coverage can still miss data-dependent bugs and missing requirements. Unit tests that depend on a database are really integration tests. Low coupling is not the same as zero communication between modules; interfaces still need contracts.