Computer Science › Algorithms & Software

Software Construction

0 of 20
  1. Branching and Merging Strategies

    Beyond the mechanics of a single branch and merge — real conventions (feature branches, a shared main line kept always working) that keep a team's history readable instead of a tangle of conflicting changes.

    Read →6 sections10 min
  2. Commit Hygiene

    A commit is a unit of communication, not just a save point — small, focused commits with a clear message make a project's history something a future reader (often yourself) can actually use.

    Read →6 sections11 min
  3. Code Review

    Having another person read a change before it's merged — catching bugs, design problems, and unclear code a lone author stops being able to see in their own work.

    Read →6 sections11 min
  4. Safe, Easy, Ready: A Framework for Good Code

    MIT's own organizing objective for teaching software construction — safe from bugs, easy to understand, ready for change — three lenses this entire discipline keeps returning to.

    Read →6 sections17 min
  5. Specifications: Preconditions and Postconditions

    Writing down precisely what a function promises to its caller — what it requires to be true going in (precondition) and what it guarantees coming out (postcondition) — before a single line of its body is written.

    Read →6 sections17 min
  6. Unit, Integration, and System Testing

    Writing a test case for one function in isolation is only the smallest of three levels — integration testing checks that modules work together, and system testing checks the whole assembled program.

    Read →6 sections14 min
  7. Systematic Debugging

    Going beyond the basic isolate-and-fix process already covered — reliably reproducing a bug first, then bisecting the problem space in half repeatedly, the same divide-and-conquer idea applied to finding a fault instead of sorting a list.

    Read →6 sections15 min
  8. Black-Box and White-Box Testing

    Designing test cases from a specification alone, with no look at the implementation (black-box), versus designing them to exercise specific paths through the actual code (white-box) — two different, complementary sources of test cases.

    Read →6 sections13 min
  9. Test Coverage

    A measurable answer to "how much of my code did my tests actually exercise?" — and why 100% coverage is a floor for confidence, not a ceiling proving the code is correct.

    Read →6 sections11 min
  10. Test-Driven Development

    Writing a failing test before the code that makes it pass — a discipline that turns "did I test this?" from an afterthought into the very thing that drives what gets written next.

    Read →6 sections11 min
  11. Information Hiding and Abstraction

    The design-level reason an ADT's interface is kept separate from its implementation — hiding a decision a caller doesn't need lets that decision change later without breaking anyone who depends on it.

    Read →6 sections14 min
  12. Coupling and Cohesion

    Two dials that measure a module's design quality — how tightly it depends on other modules (coupling, want it low) and how tightly its own responsibilities belong together (cohesion, want it high).

    Read →6 sections13 min
  13. Refactoring

    Changing a program's internal structure without changing what it does — made safe specifically by the test suite already covered, which proves external behavior hasn't shifted underneath the redesign.

    Read →6 sections12 min
  14. The SOLID Principles

    Five widely-adopted design guidelines, first articulated by Robert C. Martin, aimed directly at keeping coupling low and cohesion high in object-oriented designs specifically.

    Read →6 sections11 min
  15. Design Patterns: An Introduction

    Named, reusable solutions to problems that recur across many different programs — a shared vocabulary for design decisions, not a library to import.

    Read →6 sections11 min
  16. Software Architecture Styles

    Zooming out from a single module's design to a whole system's shape — client-server and layered (n-tier) architecture as the two most common styles worth recognizing by name and by trade-off.

    Read →6 sections12 min
  17. Software Reuse

    Building on an existing library or component instead of writing new code from scratch — and the real cost that comes with it: a dependency you didn't write is a piece of your system you don't fully control.

    Read →6 sections12 min
  18. Individual vs. Team Software Process

    Practices that scale from one developer to a team don't stay the same size — code review, commit conventions, and shared architecture decisions all matter more, not just proportionally more, once more than one person touches the same code.

    Read →6 sections12 min
  19. A Design Goals Decision Guide

    Closing the discipline by running every practice covered — specifications, modularity, testing strategy, version control discipline, refactoring — back through the same three lenses it opened with: does this make the code safer, easier to understand, or more ready for change?

    Read →6 sections13 min

Software Construction

Part of the Computer Science curriculum.

Sort
1

Version Control with Git

Tracking every change to a codebase as a sequence of commits, branching to work on something without disturbing the main line of development, and merging that work back in — the tool that makes collaborative software construction possible at all.

2

Branching and Merging Strategies

Beyond the mechanics of a single branch and merge — real conventions (feature branches, a shared main line kept always working) that keep a team's history readable instead of a tangle of conflicting changes.

3

Commit Hygiene

A commit is a unit of communication, not just a save point — small, focused commits with a clear message make a project's history something a future reader (often yourself) can actually use.

4

Code Review

Having another person read a change before it's merged — catching bugs, design problems, and unclear code a lone author stops being able to see in their own work.

5

Safe, Easy, Ready: A Framework for Good Code

MIT's own organizing objective for teaching software construction — safe from bugs, easy to understand, ready for change — three lenses this entire discipline keeps returning to.

6

Specifications: Preconditions and Postconditions

Writing down precisely what a function promises to its caller — what it requires to be true going in (precondition) and what it guarantees coming out (postcondition) — before a single line of its body is written.

7

Unit, Integration, and System Testing

Writing a test case for one function in isolation is only the smallest of three levels — integration testing checks that modules work together, and system testing checks the whole assembled program.

8

Systematic Debugging

Going beyond the basic isolate-and-fix process already covered — reliably reproducing a bug first, then bisecting the problem space in half repeatedly, the same divide-and-conquer idea applied to finding a fault instead of sorting a list.

9

Black-Box and White-Box Testing

Designing test cases from a specification alone, with no look at the implementation (black-box), versus designing them to exercise specific paths through the actual code (white-box) — two different, complementary sources of test cases.

10

Test Coverage

A measurable answer to "how much of my code did my tests actually exercise?" — and why 100% coverage is a floor for confidence, not a ceiling proving the code is correct.

11

Test-Driven Development

Writing a failing test before the code that makes it pass — a discipline that turns "did I test this?" from an afterthought into the very thing that drives what gets written next.

12

Information Hiding and Abstraction

The design-level reason an ADT's interface is kept separate from its implementation — hiding a decision a caller doesn't need lets that decision change later without breaking anyone who depends on it.

13

Coupling and Cohesion

Two dials that measure a module's design quality — how tightly it depends on other modules (coupling, want it low) and how tightly its own responsibilities belong together (cohesion, want it high).

14

Refactoring

Changing a program's internal structure without changing what it does — made safe specifically by the test suite already covered, which proves external behavior hasn't shifted underneath the redesign.

15

The SOLID Principles

Five widely-adopted design guidelines, first articulated by Robert C. Martin, aimed directly at keeping coupling low and cohesion high in object-oriented designs specifically.

16

Design Patterns: An Introduction

Named, reusable solutions to problems that recur across many different programs — a shared vocabulary for design decisions, not a library to import.

17

Software Architecture Styles

Zooming out from a single module's design to a whole system's shape — client-server and layered (n-tier) architecture as the two most common styles worth recognizing by name and by trade-off.

18

Software Reuse

Building on an existing library or component instead of writing new code from scratch — and the real cost that comes with it: a dependency you didn't write is a piece of your system you don't fully control.

19

Individual vs. Team Software Process

Practices that scale from one developer to a team don't stay the same size — code review, commit conventions, and shared architecture decisions all matter more, not just proportionally more, once more than one person touches the same code.

20

A Design Goals Decision Guide

Closing the discipline by running every practice covered — specifications, modularity, testing strategy, version control discipline, refactoring — back through the same three lenses it opened with: does this make the code safer, easier to understand, or more ready for change?