Software Design and Data Structures