MIT course: 6.005  Elements of Software Construction