Earlier this year, I took advantage of one of the unique benefits at Harvard, and enrolled in "Introduction to Computer Science", aka CS50, through Harvard Extension School. I was hoping to understand more of the building blocks and fundamental concepts behind software. I've been largely avoiding this part of the tech ecosystem. I associated coding with the kind of solo technical work, just me and the computers, that I don't relish. Filling in some of the gaps with CS50 felt like a useful exercise, personally and professionally.
Before registering, I asked an advisor at the Extension School how many classes people usually take while working full-time. She said, "One," with great confidence. For me, this was definitely the correct answer.
CS50 covered programming in Scratch, C, Python, SQL, HTML/CSS/JavaScript, and Flask. This was a lot of material to digest over 11 weeks. Since I've tinkered with SQL and HTML enough to be dangerous, the homework for those topics only took ~15 hours per week. For the other topics, homework time was closer to 20 hours per week, plus lectures via YouTube, and mandatory Zoom discussion sections with teaching fellows and other students. This was a fully virtual class, and the students came from all around the world, with a range of ages and backgrounds. I attended several different discussion sections to get a sense of the teaching fellows, and settled on one who I found extremely helpful, and also good at managing discussion time.
This course has been taught and revised for decades, and it shows. Each lecture starts with simple concepts, metaphors, and references to the previous lectures. David Malan is an enthusiastic teacher, and he's quite committed to physical manifestations of concepts, like assembling students on a stage to illustrate the mechanics of bubble sort.
The course has a comprehensive "Academic Honesty" policy, which includes a ban on AI coding tools. There was one exception, cs50.ai, the custom "duck debugger", based on the rubber duck debugging approach. This coding assistant is designed to answer questions and review student code without providing direct answers. So if your Python script crashes, your C program won't compile, or your SQL query won't return the expected results, it will give you hints. The duck debugger will gently point you to a topic, or a class of functionality, or a section of your code, and recommend further investigation. To discourage dependence on the duck debugger, there is a system of duck debugger credits, which refresh over time, limiting students to approximately 5 questions every 5 minutes.
I've worked closely with software developers for most of my career, and I know the pain of local-dev-environment setup. CS50 provides all of the necessary functionality in a dedicated learning/coding environment, using a mix of GitHub Codespaces, Microosft VS Code, and a set of predefined VS Code extensions. All of this was accessible through a VS Code web interface, complete with a discrete filesystem, and automated version control through GitHub. There's a fair amount of public documentation: see https://cs50.readthedocs.io/cs50.dev/. The downside of this system was that it was tough to operate offline. I tried to set up a fully offline development environment, on trains, planes and automobiles, and, despite my enthusiasm and sysadmin experience, this was quite challenging.
The AI coding tool restriction was lifted for the final project, and I experimented with a handful of options. I had high hopes for running Ollama and qwen2.5-coder on my local video card, but I found the most useful functionality with GitHub CoPilot. Making a website with Python, SQLite, JS, CSS, and HTML, wrapped in Flask, was challenging, but I had completed a few complex web application assignments before the project. CoPilot dramatically accelerated my coding process, but it came with limitations. Even with access to all of my code and data, CoPilot was happy to ignore best practices. It would copy and paste code, or create entirely new functions for problems I had solved elsewhere in the application.
For my final project, I assembled a food/medicine/symptom tracker for folks with stomach ailments. The final project prep materials require a detailed set of features, broken into Good, Better and Best categories, providing a little morsel of product management. My hope was to complete all of the Good and Better features, and only tackle the Best category if time permitted. With all of the project preparation and guidance from the teaching fellows, I was very pleased to complete all of the Good, Better and Best features.
While I have a much better understanding of core concepts, like functions, variables, and loops, I think the focus on pseudocode is the thing I'll use most often. I'm a fairly logical, verbal person, and an annoying advocate for documentation. Pseudocode appeals to my interest in writing about and explaining my work, and I found it was incredibly helpful in application development.
I've occasionally taken stabs at scripting and programming – and I've had a copy of Learn Powershell In A Month of Lunches sitting on a bookshelf for many years. For me, the accountability and community that came with taking a class were quite helpful in furthering my understanding and practice, more so than anything I’d tried before.
There's a no-cost, no-deadlines option at www.edx.org/cs50, and virtually all of the Harvard CS50 lectures and slides are accessible for free. If any of this sounds interesting to you, I'd very much recommend CS50, in any of its various forms.