Programming in the Large with Design Patterns