Tuesday, March 27, 2012

My lesson plan

I shared what I have done up until now; at this point maybe it would be nice to share my tentative plan of what I'm going to study over the next year.

With the rise of free online lectures provided by the likes of KhanAcademy, TheNewBoston and of course a variety of universities like MIT, Stanford, Berkeley and IIT Kharagpur, there really is an embarrassment of riches to be found for a self-learner, and if anything a problem is that it can be simply too much to choose from. Right now I find myself on vacation from work for a few weeks, and I still don't feel like there's nearly enough time in the day to cover all of the courses I'm taking now, let alone all that I want to take. But as is often the case, the first step to success is a plan; even if you don't know the best way, simply having a plan in mind is said to be helpful. So here we go.

Since I'm looking to enter graduate school, it would seem natural to want to cover the content of an undergraduate computer science education. Unfortunately, there is a wide degree of variability in such majors, both between schools and within the same school, based on a student's goals. Listing every course taken by computer science undergrads, let alone grad students, would be futile. But at the absolute basic level, they seem to share some fundamentals:

Computer Science topics:

Introduction to Computer Science
Data Structures and Algorithms
Computer Organization
Systems Programming

Mathematical topics:
Discrete Math
Linear Algebra
Probability and Statistics


From what I've seen looking at various department websites, these seem to make a fairly solid base. I start from here and then add on what I find particularly useful/relevant to me. The field I'm most interested in is artificial intelligence, computer creativity and computer vision. Basically I want to design the brains of a creative robot. So, things that are most relevant to me are things like artificial intelligence, machine learning, differential equations, digital signal processing, natural language processing, and the like. There are also a few I've starred (*) to indicate things that perhaps might not be essential, but that I'm just interested in.

So let's expand our list. In addition to what we had before, let's add some. Note that with some of these, the distinction between math and CS is a bit blurry.

Computer Science topics:

Introduction to Computer Science
Data Structures and Algorithms
Computer Organization
Systems Programming

Artificial intelligence
Machine learning
Natural Language Processing

Mathematics:

Discrete Math
Linear Algebra
Probability and Statistics

Differential Equations
Digital Signal Processing

OK, we now have quite a lot on our plate. But this still isn't everything that I want to cover - I'm also interested in program design, smartphone and web application development, computer music and algorithmic composition, and others, so we'll just have to find a way to accommodate as many of those things as possible. So, let's turn our course outline into a plan of online courses to take. We'll get to ordering and scheduling later. For now I just want to know that all of this stuff can be covered with existing online lectures. Here we go:


Computer Science topics:

Introduction to Computer Science
I've already taken two classes in this vein, the 6.00 course from OCW and the CS101 course from Udacity. With such a broad topic, practically anything that adds fundamental programming knowledge helps, so after this point I won't really worry too much about satisfying this requirement specifically.
Data Structures and Algorithms
I'm taking a really good-seeming Design and Analysis of Algorithms class from the Stanford Coursera website. It doesn't seem to cover data structures, but the Stanford Programming Abstractions class I'm taking, I believe, does address that. If not, then we might have to find something else to cover DS, but for now we'll consider this base being covered.
Computer Organization
I admit, I'm not to excited about this class. The inner workings of computers don't interest me nearly as much as what those workings can accomplish. But just for completeness, let's find a course on this. The Berkeley 61C course - Machine Structures would seem to do the trick.
Systems Programming
Here we turn again to Berkeley, as they seem to have a nice one there called Operating Systems and Systems Programming. Once again I'm not to psyched about this class, but if I want to develop for an OS, it would seem to be necessary.

Artificial intelligence
The free AI Course offered by Stanford looks nice, although I'm not sure I'll actually be able to access it. I suppose we'll cross that bridge when we come to it. Alternatively, I can take the robotic car class from Udacity.
Machine learning
Stanford's SEE site has a Machine Learning class that looks great!
Natural Language Processing
Once again, it's Stanford to the rescue with their Natural Language Processing course. As I'm looking at the course list on the SEE website, I notice that it might be best to take the natural progression of three courses beginning with Introduction to Robotics. Once again, we'll wait to cross that bridge.

Mathematics:

Discrete Math
The Berkeley one of this seems nice, and broad-ranging.
Linear Algebra
The one I'm taking right now, 18.06 of OCW, fits, but there's a further one I'd like to take if I can, which is introduction to linear dynamical systems at Stanford.
Probability and Statistics
For now, I'm looking at the Probability and Random Processes lecture series from NPTEL. But I might want to switch to another course that has accompanying homework assignments. We'll see.

Differential Equations
The 18.03 course from MIT seems ideal.
Digital Signal Processing
MIT to the rescue again, with their eponymous course.


OK, there we go! Let's see how it shakes out.

No comments:

Post a Comment