Fundamentals of computing II: abstraction, data structures, and large software systems