Stanford course: programming abstractions