Stanford's Free Online CS Course: CS106A Programming Methodology. http://see.stanford.edu/see/courses.aspx