Self-studying computer science (#1051)
Topics/tags: For prospective students
Once in a while, a prospective student asks me what online CS courses
they should take before coming to Grinnell (or some other institution)
. My first response is to tell them that we don’t expect any
prior CS and design the major so that people with no background can
complete it, even if they don’t start CS in their first year at
Grinnell. Some wonderful majors have followed that path . And
when students come in with
prior knowledge, I’ve often
found that I have to unteach bad habits.
However, this year  folks may have some extra time in the summer, and, if they are going to study a bit of CS, I’d prefer that they approach it in the right way.
The right way is, of course, to start with Scheme (or one of Racket).
There are two traditional options, both of which are more of a traditional
self-study text approach rather than a MOOC or something like that.
For a mind-bending introduction to CS, I really like Structure and Interpretation of Computer Programs , which used to be the introductory textbook for MIT. It goes through a lot and requires a different way of thinking . It may be a few decades old, but it remains a relevant approach.
A slightly gentler introduction, but no less mind-bending, is How to Design Programs .
All of these use a programming language called
Scheme, which we
use in our introductory course. Not many undergraduate programs
use Scheme, but those that do find that it prepares students to
think about CS in different ways.
On that note, I suppose one could also try doing one of the online versions of CSC 151 as a self-study course. Prof. Eikmeier’s is a good place to start.
My most recent version was the first offering of a new variant of the course. I would not currently recommend it, but I link it here in case yo uwant to take a peek 
Two more languages that often get used in introductory CS are Python and Java. I don’t have particular recommendations for Python courses , but I can suggest two Java courses.
The intro Java programming course from Duke on Coursera is good. (There’s a way to sign up for free, it just takes a bit of poking around.)
But I recommend that mostly because I’ve been told it serves as a good introduction to a course from UCSD, (Once again, there’s a way to sign up for free.) What I like about the UCSD course, at least the last time I looked, is that it goes beyond traditional course material to help with more professional development activities.
It doesn’t hurt that I have incredibly high respect for the Duke team and the UCSD team.
Beyond Java , I know that a lot of people find the Harvard CS 50 course useful and interesting. I will admit that I have mixed feelings about the course. It has a wonderful infrastructure. But I find that it goes very fast and makes a lot of assumptions about what you can understand quickly.
I suppose I could look for some other recommendations. But that’s probably enough for now.
 One asked that just the other day, which is what inspired this musing.
 I don’t expect that that will ever happen again.
 This musing was written during the SARS-CoV-2 epidemic.
SICP, to those in the know.
 A core aspect of a liberal education.
HtDP, to a smaller group of those in the know.
 That reminds me. I need to work on a revised version of the old Mediacheme course. Maybe that could be the summer offering of CSC 151 (if there ends up being a summer offering of CSC 151).
 I understand that many people like Python because it gives you a lot of power and has a friendlier syntax than other languages. But I find that Python programmers develop bad habits.
 Also the name of a book by Bruce Tate.
Version 1.0 released 2020-04-17.
Version 1.1 of 2020-04-18.