I have had an interest in programming and computer science for years, but never pursued that interest because I believed switching the focus of my studies would leave be far behind my peers. During the summer of 2011, after graduating with an B.A. in International Economics and German, I finally made the decision to follow that ambition. As I apply for full-time employment I am also studying numerous subjects, including Bash, Python, C, and algorithms. Fortunately, there are many introductory resources for computer science on the Internet that have helped me with this process.

Introductory resources

Resource Progress Division Length Type
MIT 6.00 Intro to Computer Science & Programming 20/24 Lecture 19:49:08 Hour
Stanford Computer Science 101 -/- Class
Harvard Computer Science 50 1/24 Lecture Hour
Harvard Extension School Introduction ... Using Java II 2/14 Class Hour
Introduction to Programming in Java 1/19 Chapter 723 Page
Stanford Programming Methodology 1/28 Lecture 22:17:29 Hour
Stanford Programming Abstractions 2/27 Lecture 21:02:24 Hour
Stanford Programming Paradigms 4/27 Lecture 22:27:20 Hour
How to Count: Programming for Mere Mortals, Vol. 1 3/9 Section 69 Page
Structure and Interpretation of Computer Programs -/5 Chapter 657 Page

MIT Intro to Computer Science & Programming, Fall 2008 is an excellent introductory course to computer science taught by Eric Grimson and John Guttag that makes use of Python. Lectures 7-10 deal with efficiency and require some understanding of discrete mathematics. The OpenCourseWare course page includes assignments, subtitles/transcripts, and exams. Video recordings of the course are available through a YouTube playlist.

Stanford Computer Science 101 is an interactive online course designed for students without any previous experience. The entire course is centered around the course's website, including development.

Harvard Computer Science 50 is a very basic introductory course with an enthusiastic instructor and many associated resources (e.g. videos, notes, problem sets, quizzes). The final weeks focus on web development. The unique course website provides numerous resources. An alternate webpage is available at the Harvard Extension School.

How to Count: Programming for Mere Mortals, Vol. 1 is "a series of books designed to introduce the concepts of programming from the ground up to a reader who has never written a line of code. Unlike most programming books which aim to teach you a particular language or operating system, this series focuses on the core fundamentals that are common to programming any computer." - Steven Frank

Structure and Interpretation of Computer Programs is "a textbook published in 1984 about general computer programming concepts that was formerly used as the textbook of the MIT introductory programming class and at other schools."1 The entire contents of the book was published on a book website by MIT Press. > Abelson, Harold, Gerald Jay Sussman, with Julie Sussman. Structure and Interpretation of Computer Programs. Cambridge, Massachusetts: The MIT Press, 1996.

Introduction to Programming in Java is an interdisciplinary approach to the traditional introduction to computer science course, which uses an "objects-in-the-middle" approach that emphasizes data abstraction. Each programming concept is motivated by examining its impact in various fields (e.g. materials science, genomics, astrophysics). An online version of the text provides excerpts of the text, hundreds of exercises, and java code. > Sedgewick, Robert and Kevin Wayne. Introduction to Programming in Java: An Interdisciplinary Approach. Pearson Addison-Wesley, 2008.

Stanford Programming Methodology is "an introduction to the engineering of computer applications emphasizing modern software engineering principles: object-oriented design, decomposition, encapsulation, abstraction, and testing. Uses the Java programming language. Emphasis is on good programming style and the built-in facilities of the Java language." In my opinion it is a very basic introduction that, like Harvard CS50, uses a simple programming environment called Karel for the first four lectures. Numerous additional materials (i.e. syllabus, handouts, assignments and exams) are available on the Stanford Engineering Everywhere course page. Video recordings of the course are available through a YouTube playlist.

Stanford Programming Abstractions provides numerous additional materials (i.e. syllabus, handouts, assignments and exams) are available on the Stanford Engineering Everywhere course page. Video recordings of the course are available through a YouTube playlist.

Stanford Programming Paradigms is a course by Professor Jerry Cain that covers Assembly, C, C++, Concurrent Programming, Scheme (Functional Paradigm) and Python assuming some knowledge of C++ and Sequential Programming. Numerous additional materials (i.e. syllabus, handouts, assignments and exams) are available on the Stanford Engineering Everywhere course page. Video recordings of the course are available through a YouTube playlist.

Harvard Extension School Introduction to Computer Science Using Java II is the second semester in a full year course that teaches the basic principles of object-oriented programming methods using the Java programming language. It covers abstract data types; strings, multidimensional arrays, vectors, and linked lists; streams and file I/O; recursion; exception handling; threads and event-driven programming; and graphical user interface design using the Swing classes; RISC machine architecture. In addition to a weekly two hour lecture, the course had one hour office hours and section meetings every week. Videos, slides and code examples for the final four lectures of the precursor to this course, Introduction to Computer Science Using Java I, were made available for the second part of the course, which I enrolled in at Harvard Extension School.

See also

Advanced topics

More advanced topics covering shell scripting, high level programming languages, and algorithms have been separated into the following pages:

Other topics

Resource Progress Division
Stanford Natural Language Processing -/- Classes
Alternatively, a archived version of the course is available through Stanford Engineering Everywhere.

There are many key concepts of computer science that are covered in these resources. One of the most difficult to understand is polymorphism. One specific case of polymorphism is operator overloading, which is the act of replacing attributes by redefining them lower in the class tree.

Object Oriented Programming is a programming paradigm that has become increasingly popular during the past two decades. It encapsulates data and methods into objects. This concept is briefly covered in Travis Grigg's blog post, One of the Best Bits of Programming Adivce I ever Got.


  1. Wikipedia contributors, "Structure and Interpretation of Computer Programs," Wikipedia, the Free Encyclopedia, (accessed December 8, 2011).