This course is a systematic study of programming languages and algorithms organized around the unifying concept of data and code abstraction. Emphasis is placed on ADT-based and object-oriented design, incremental development and testing, and comparison of data structure implementations.