Review of CS50's Introduction to Computer Science by Harvardx
This is a (long) collection of my thoughts and experiences related to Harvard CS50 on EdX.org and the beginning of my dive into computer science
Table of contents:
Who is this article for?
Why write this article?
What was the context for taking the course?
What was my objective?
Did the course help me achieve my objective?
What is the course structure? How much time and effort are required?
Was the course challenging?
Do you have other recommendations regarding this class?
Now that you’ve completed CS50x, what’s next?
Who is this article for?
Anyone thinking about enrolling or interested in learning more about CS50's Introduction to Computer Science course by HarvardX. I completed the 2020 version of the course and including the weekly labs added on January 1, 2021.
Why write this article?
Probably like many readers of this article, I had a curiosity about computer science and programming, no experience, and many, many questions. From having those questions and no answers to having completed the course, I often relied on other people to help answer my questions, and this is one way of paying it forward. As you become more exposed to the programmer ecosystem, you’ll soon learn this is just part of the culture..
What was the context for taking the course?
I’m in the middle of my career with about 10 years of experience in non-technical roles, mostly business development and business operations. In my first job, I worked for Groupon China in a data analyst role where I had to learn Excel and SQL. I stopped short of learning a programming language to automate tasks or enhance my capabilities then moved onto business development roles soon after. That interest in data analysis and internet technology stuck with me, however, and now I find myself pivoting my career and attempting to enter the tech industry which is the primary reason for my enrollment in CS50x. As an aside, I did not pursue a verified certificate.
What was my objective?
Hard to say. I knew that I had to increase my technical acumen to boost my attractiveness to the tech industry, but I didn’t really know what taking this class would teach me. I learn better with structure and guidance, so I figured an MOOC was a good starting point. I had been dabbling with some courses by Google on Coursera, but I had not begun to work with the command-line or with programming languages. I decided to watch the first lecture and was captivated by the professor, production, etc. and the rest is history.
Did the course help me achieve my objective?
Yes and no. First and foremost, it needs to be said that this is a phenomenal course. My knowledge of computer science and programming has leveled up tremendously since the start, and Professor Malan emphasizes that the goal of this course is about being better than where you started. That being said, this is not the type of course that will equip you with an immediate, hard skill that will make you employable. Instead, this course will help you create a strong foundation in computer science and programming principles that will be the foundation for you to further develop and expand your knowledge through continued self-learning. Like a good college course, you are exposed to a number of different theories, frameworks, paradigms, etc. and then challenged to apply them yourself in the homework. There is a good amount of programming to be done if you complete all of the required tasks, but you do not specialize in any one skill as you quickly move from one topic to the next, with each week building off of previous weeks culminating in the Final Project. The professor clearly states in Week 0 that, “this class is like trying to drink from a firehose”, meaning you will be exposed to an immense amount of information in a short amount of time. This is not a simple, beginner course.
Regardless, I have only stellar reviews for this course and give it a 9.5/10 as a non-believer of the perfect score. But learners should be mindful of what their objective is so they are not disappointed as the time investment to complete this course is not insignificant.
What is the course structure? How much time and effort are required?
You can read the course syllabus here. The entire course is organized into 11 weeks. Each week HarvardX provides students with an extensive list of resources that can be utilized including: lecture recordings, notes, source code, topical short videos, weekly labs, weekly problem sets, and a final project. There are also several supplementary lectures which can be viewed at any time.
I would estimate that each week takes about 6 hours of learning, at a minimum. The lecture will take at least 3 hours, and depending on your comfort, the labs and problem sets might take 1 hour (unlikely!) to 3–4 hours (more likely!) to 6–8 hours or more(yes, some were that challenging!). The personal investment you will need to make to complete the course is hefty. And if you want to come away with a comprehensive and not cursory understanding, each week may take even longer than 6 hours. There is a ton of material that you can dive into, if you desire.
Below are the primary resources provided by course instructors:
- Lectures: The highlight of each week is a recording of a previously live lecture given by the star of the course, Professor Malan. The production of these lectures is top-notch, and there is an entire team supporting the execution. Each lecture is about 3 hours long, so you can imagine that a lot of information is covered. A lecture includes a combination of theory, live coding demonstration, and a bit of theatrics using physical props or visual demonstrations. Actual Harvard students are attending via Zoom, and the professor engages students for Q&A fairly regularly. The lectures are available on YouTube and include chapters, making it easy to plan a stopping point if you can understandably not finish the lecture in one sitting. If you don’t watch these lectures, you will miss out on the most special part of this course.
- Notes: Pre-prepared notes which outline the most important details from each lecture are available. I used these for pre-reading before lectures and to follow along. They also act as a great reference while watching the lectures or during problem sets. Better than the notes I took while at college.
- Source code: In each lecture the professor will toggle between lecture slides and his own development environment where he will code live to demonstrate the concepts covered. This includes live errors which is useful to recognize that even experts can make simple mistakes and learn how to debug. All of the source code from his examples is available in PDF format and useful to refer back to when recalling how to write specific programming structures to complete the labs or problem sets.
- Short videos: These videos are supplementary to the lectures and revisit the core concepts from each lecture. Less of a production, the short videos are handled by the teaching assistants to Professor Malan. They are useful to identify the core concepts to focus on from each week and provide repeated exposure to said concepts.
- Weekly labs: This feature is new to the 2021 course, added January 1, 2021. They were used by Harvard students during seminar/discussion classes to ensure familiarity with the major concepts practiced in problem sets. They are similar to problem sets but much lighter in terms of actual work required. You are given an amount of source code and asked to fill in specific sections that have been left out. The learning and practice is very specific and relevant for completing the problem sets. Since I went back to the labs after completing the problem setsI found them quite simple and needed just 30–60min to complete each one. Unlike the problem sets, if you have trouble, there is a video to explain the full solution to you.
- Weekly problem sets: Besides the lectures, this is another highlight of the course. At the end of each week, you have to complete a problem set consisting of one or several coding challenges. The problem sets are quite comprehensive, and the documentation will introduce the context of the problem and the required specifications for your solution. Some weeks the problem set is divided into ‘less comfortable’ or ‘more comfortable’ allowing you to choose which path you want to take. You can always go back later and attempt the ‘more comfortable’ problem sets which are more challenging. Each problem set comes with a walkthrough video to introduce itself further. These problem sets are no joke. If you have no coding experience, they will definitely be challenging and test your abilities. While the problem sets test your ability to code, they also train you to think about creating solutions to problems in a new way which is one of the critical takeaways from this course. Furthermore, they may require you to be resourceful in utilizing a number of channels (any of the aforementioned resources, plus a few to be mentioned in a moment) to build your solution. There is no, single “solution of truth” for these problems, and you can build whatever program you want to meet the specifications. CS50x provides you with several programs specific to the course to help you refine your coding skills while attempting the problem sets including Style50 (a program that checks the style of your code), Debug50 (a tool for debugging), and Check50 (a program that checks your work). Check50 is especially important as it checks to ensure that your program meets the technical specifications required, so that you can receive passing marks.
- CS50 IDE: One of the key ideas of this course is abstraction and the abstraction of time-consuming tasks. CS50x greatly reduces the barrier to getting started by providing you with your own Integrated Development Environment (IDE) perfectly tailored to meet the needs of the class, abstracting away your need to do so. Besides lectures on YouTube, the IDE is where you should spend most of your time. In a way, having the CS50 IDE is like cycling with training wheels. Personally I used the IDE from the start and only moved to a third-party text editor towards the end of the class when I was comfortable with the vocabulary/commands, had a more advanced understanding overall, and was ready to take off the training wheels. No shame in that!
- CS50 Man pages: These aren’t specific to CS50x, but they are listed on the website. Man pages stands for “manual pages” and are detailed explanations of how to use the different libraries, functions, or methods that you will encounter during the course (and beyond). You’ll soon learn that learning to read technical documentation is extremely important for taking off the training wheels, digesting new collections of pre-written code, and applying them to your programs.
- Final project: This is the course capstone, and you are free to create any program you desire with several basic requirements. The project should take at least twice as long as a normal problem set and many students use this to showcase a personal interest or get their portfolio started. You can see a collection of past projects here.
- Supplementary lectures: There are two supplementary lectures on security and artificial intelligence that are just lectures. Each video is about 90 minutes and tangential to the main course but not required.
On the internet you may encounter materials from versions of CS50x from past years which look different. This is because the CS50x curriculum is constantly evolving and the site materials reflect the course that was taught at Harvard during the previous fall semester (CS50x/2021/ materials are from the Fall 2020 semester, CS50x/2020/ materials are from Fall 2019, etc.). You can go back and try to piece together parts of the curriculum which have been deprecated, but as far as I have found most of the material is the same from year-to-year but how the weekly topics are organized is different. A summary of recent changes can be found here.
Was the course challenging?
Absolutely. Unless you have prior experience with programming or have taken a CS course, learners will undoubtedly encounter difficulty at some point throughout the course. The reason for this is two-fold; first, each week introduces a new topic, and second, each topic is explored in depth.
Learners who are completely new to programming may want to take some starter courses to expose them to computer hardware and the main functions, how basic computer systems work, or programming basics. All of these topics are covered in the lectures, and you can complete the course without pre-work, but it will feel like a lot to take in and you may need to go back over course materials several times if you have never studied computers before. My prior experience with SQL and advanced Excel gave me some foundation for the course, but at the same time it was not really relevant at all, except for the SQL which one week is dedicated to.
In terms of the problem sets, you are immediately thrown into basic programming. The payoff of completing early problem sets is immense, however, the difficulty increases quickly. Weeks 0–2 are manageable, but your first big test will come at the end of Week 3 in the Tideman problem set. After that, Week 4 Recover problem set is also very challenging. Week 5 Speller problem set will likely be difficult, too, but not quite like Tideman or Recover . THIS IS OKAY! These problem sets cover some of the more challenging concepts of introductory computer science; recursion, memory allocation, linked lists, etc. Lots of students get stuck here as I’ve seen in the CS50 community groups, and I myself got stuck here as well. This is where you learn and develop your skill; by being resourceful, brainstorming a creative solution, breaking down the problem into lesser problems, or studying up.
Do you have other recommendations regarding this class?
I sure do.
First, treat this course like a CS class and not merely a course to learn a programming language. I said it before, this is a great class for learners who want a broad understanding or are looking to create a solid foundation which will enable them to propel a sustained interested in software development. It is about horizontal learning not vertical. The main topics you will be exposed to include C, Python, SQL, HTML, CSS, Flask, and basic computer science theory. There is enough to build a basic web-app, which you’ll do by the end of class, but it won’t be enough to make you marketable to hire. This class is about equipping you with knowledge and a new way of thinking, which you can then go apply and use to further develop your skills.
Second, take the time to layer your learning and supplement it with extra reading. There is so much content in this course, that you will easily realize just how much you don’t know. It will feel overwhelming. In order to help with retention, space out your exposure to the material. Take time to review the old lecture notes or re-watch the short videos. Each week jumps to a new topic, so at some point you will likely forget something that was covered in an earlier week. I would also find time to Google search explainers on key topics from other authors to learn the concept from a second angle and help round out your understanding. This was very helpful and also recommended by the Professor Malan.
Third, learn to read technical documentation. From everything I’ve gleaned, this is a skill in its own right. It will seem foreign in the beginning, because it is. But a huge part of programming and software development is the ability to self-learn and developers put a lot of effort into detailing how a program or function works in the documentation. It’s sort of an art, really. Once you learn how to think like a programmer, your skills become portable. You don’t have to know everything about a language or library when you start, you can search online for new resources, read over the technical documentation, and quickly gain a general sense of how to use the relevant code to your benefit. This is vital because you won’t ever write your entire program by yourself. You will undoubtedly rely on functions that have already been written by other people.
Finally, socialize your experience. This advice was given to me by a good friend who went through a coding bootcamp. Getting in the trenches with a cohort, sharing your successes and failures, and learning from others is the ideal experience. If you’re learning independently or learning at home, this is hard to replicate. To solve this, I have several recommendations: One option is to talk to several people you know that program, put your ambitions into words and share them with somebody. Then, update these people as you make progress, and you will begin to hold yourself accountable. A second option is to become integrated with programming community groups on the internet. There are many people just starting to learn, and you are not alone. CS50x has a list of CS50x community groups on different social media platforms that are vibrant and helpful. We have all stumbled at times, run into obstacles, or relied on someone else to help us get by. The community is there to help you out (just as long as you have made your own effort first!). You’ll feel the love, and then feel the desire to pay it forward. I mean, that’s what this article is, case in point.
You mentioned outside resources..which do you recommend?
Get involved with the different community groups on a platform of your liking. I joined the CS50 Discord server, CS50 Facebook, and began following programming threads on Reddit and Twitter. There are communities on every social media imaginable. I found Discord and Facebook to be good for course-specific content. I preferred Discord for help with labs and problem sets as each week has specific channels for discussion. Facebook seems to be more general, and there is a wider audience meaning you have all sorts of disparate questions raised. Reddit and Twitter were useful to become acquainted with the community at large and expose myself to conversations about trending topics. Twitter also has a number of influencers that share resource repositories.
Technical support can be found on StackOverflow, Google, or Github. No offense, but right now your skill level is probably so low that any problem or error you encounter has already been experienced by someone else. And they went on a forum to ask about that question. And another more experienced developer, or two, or three, or more, responded with a complete answer. There is a ton of information that exists online, if you can learn to find it. Google search is one of your best friends. Use it. One note about Github and StackOverflow, I did see that it was discussed whether sharing CS50 code on these sites is a violation of the course academic honesty policy. Personally, I did observe some existing solutions in times of need, but I made sure I gave each problem set a legitimate and extensive personal effort before looking elsewhere, and I did not plagiarize code that I could not comprehend myself. For me, completing this course was about personal growth and learning, but I also didn’t want to get stuck on one problem set for weeks as I observed some students do. Instead, I decided to strike a balance, based on my own judgment of what is acceptable and within my interpretation of the course honesty policy. All in all, you get what you put in. If you plagiarize work from StackOverflow or Github, you’re only hurting yourself.
Github and third-party text editors are tools related to this course, although they are not necessary for beginners. You can begin to build your GitHub repository from the get-go, but it is one more thing to learn so I personally waited until the class was finished and then added all my code. Third-party text editors are sort of a similar story. You can use them from the get-go, but it’s not required and may actually be more difficult since the CS50 IDE is such an incredible resource. In the same way, web hosting services like Heroku will be introduced at the end of the course, and really these tools all provide great lead-ins to new areas for exploration upon completion of the course.
One random resource that I stumbled upon, and actually enjoyed, was Fiverr (or similarly Upwork). For several topics that I found particularly interesting, I hired a freelancer for an hour to discuss with me in depth and with examples. This was actually quite a nice way to complement MOOC learning with something that is more personal and specific to you. It was great to be able to speak live and ask someone questions. Plus, freelancers emphasize customer satisfaction and will often go above and beyond the basic requirements.
Finally, I read a lot of Wikipedia and searched for videos on Youtube to round out my understanding and exposure to foundational concepts and get a feel for the historical context/development of programming. Honestly the more angles you can expose yourself to, the better you will be able to triangulate your own understanding and mature your interest.
Now that you’ve completed CS50x, what’s next?
As I mentioned before, CS50x is great for horizontal learning and I loved the course. I have chosen to continue my learning with Harvardx and enroll in CS50’s Web Programming with Python and Javascript course to continue building my knowledge about web applications. The course goes further on Python, introduces the Django backend framework, introduces user interfaces and Javascript, and touches upon some basic DevOps concepts such as CI/CD, scalability, and security.
Since there is a considerable amount of lecture/theory in the CS50 courses, I am also creating a list of one-day builds where I hack for a day (or until finished) to gain reps practicing my skills while simultaneously building my portfolio. There is an abundance of “classic” one-day build projects circulating the internet and these might include building an expense tracker, address book, or micro-blog, for example. Of course, the beauty of this course is that will the skills you develop you can build anything you think is interesting!
Thanks for taking the time to read my review of CS50’s Introduction to Computer Science. I hope you found it helpful, and if you have any questions or comments just leave them below!