One of the main reasons that I’ve been neglecting writing articles is that I had been taking the CS101 Udacity course. Udacity is a MOOC, short for massive open online course. That means that anyone can go online to register and take the course. Most MOOCs, including Udacity are usually free. I am a huge fan of MOOCs and this is the second course that I’ve finished. The first was on Coursera (Introduction to Computational Finance and Financial Econometrics — recommended). Although there are ways to get “credit” for taking a MOOC, my goals have been personal/professional development.
CS101 can be found here. Udacity divides their course catalog into Beginner, Intermediate and Advanced categories. CS101 is listed as a beginner course. CS101 teaches an introduction to Computer Science (CS). The class uses Python as its programming language for examples and assignments. To provide students with a coherent project that illustrates various aspects of CS, the class builds a simple search engine.
This happened to fit my needs quite well. I wanted a platform that could do the work of R but also provide a better framework for putting together small programs that I could use to automate tasks. I am also interested in Quantopian and their Zipline backtesting engine. It is written in Python and it might facilitate my research in short term trading strategies. Finally, I have an idea for an internet security & privacy product. Learning about search engines seemed terrific background. And the price was right: free.
My background includes a degree in computer engineering and I’ve done some coding professionally. I am not a beginner nor am I a current professional. I looked forward to a review of CS fundamentals.
David Evans teaches the course. The course description indicates “no prior programming knowledge needed.” Although perhaps not needed, I’d recommend some prior programming. It need not be extensive but it would be extremely helpful to have done some coding, some thinking about coding and made some mistakes. Udacity recently added another, more basic course, “Intro to Programming in Java” that I believe was added because of similar feedback. My recommendation for the target audience is someone already coding at the beginner or intermediate level that is looking to add some formality to their effort. Unlike the CS101 course that I took in school, there are no proofs in this class (if you don’t know what I’m referring to, don’t worry).
The course is made up of 11 sections presumably corresponding to week per section. The original course had 7 sections but was subsequently extended. Each lesson is made up of a video lecture, quizzes and problem sets. Professor Evans comes across in a friendly, somewhat purposefully nerdy manner that worked. A key part of the success of the course is the many quizzes and exercises. The quizzes are interspersed inside the lectures and need to be answered, though not correctly, to move on. Professor Evans goes over the answer with an explanation. Properly used, these quizzes keep students’ minds engaged and active rather than passive.
The problem sets come after the lecture. Problem sets include multiple choice questions and/or coding assignments. The course allows for the user to code in an online Python editor that enables a student to avoid having to go through a local Python installation. This takes the sometimes painful step of installation away from the process. There is a computerized grading mechanism for student code. It worked but sometimes could be tricked. I don’t feel this is a terrible shortcoming as my take is that most or all of the students are enrolled for their own benefit. Hence, any “cheating” truly is only cheating yourself. The coding assignments did not involve much typing but instead usually demanded thinking computer science-ly. This is where I felt that having some coding experience helps. This type of thinking involves looking at the world differently and requires a bit of practice.
In addition to the course itself, there is a discussion section where students can post questions, comments or offer help. Frankly, I did not take much advantage of this. Other students would post code that they thought did the job particularly well or cleverly, to figure out what was wrong with their code or even where to begin thinking about something. My recollection is that answers appeared quickly; so there is help available when one gets stuck. Plus, all problem sets have included video answers. It is worth noting that Professor Evans and the other instructors do respond in the forums.
What makes this course particularly good is that it is not teaching a programming language but does teach Computer Science. This is not the same as teaching a programming language although CS is about programming but in a more global, holistic way. The difference may seem small but a reasonable analogy would be the skill of say, steel-working vs. civil engineering. If you are going to design and build a bridge, it will involve a theory of what keeps bridges from falling (the theory or CS) and the actual building of the steel framework (programming). A good designer will understand the programming and be able to choose the correct tools for the job, i.e., the best environment and programming language. But the design or algorithm, should transcend the particular tool. In fact, computer scientists create programming languages for particular (or general) problem types.
Many quizzes involve what appear to be trick questions. These are not meant to be tricky but to point out how some of the details of the Python interpreter influence code behavior. It provides examples for how to think about debugging programs and the types of things that can go wrong. It would be helpful had the course explicitly noted that other programming languages handle things slightly differently and therefore it is useful to understand the details. Ultimately a programmer will find out the details, it is just a question of find out the easy way or the hard way. One section that is very helpful to beginners was the section that covered how to learn new techniques and/or libraries.
Professor Evans gives the three main themes of Computer Science: abstraction, universality and recursion. My CS professor from school would add that CS is about managing complexity. These are discussed in terms of solving actual problems and that makes it extremely relevant to the student. And I think it is important to rise above the details of programming and get an idea of how to think about problems using data structures and algorithms. This manner of thinking is beneficial beyond computer science – it has served me well in thinking about economics and finance.
The stated goal is that the student will “have learned key concepts in computer science and enough programming to be able to write Python programs.” The course does an excellent job of doing this. As I stated before, I recommend at least some coding experience. The video lectures, with the support of the discussion forums, provide a clear exposition of the material in an easy-going manner. Professor Evans covers the key concepts for an introduction to computer science and to the fundamental tools to get programming jobs done. The quizzes and problem sets are what bind the whole experience together. Watching lectures alone cannot teach; learning is about doing. There is plenty of both to be had in Udacity’s CS101 class.