>At Mudd, this course is taken by almost every first-year student—irrespective of the student’s ultimate major—as part of our core curriculum. Thus, it serves as a first computing course for future CS majors and a first and last computing course for many other students.
This is a great thing to offer students and I wish my University had made this a part of the curriculum. Somehow I managed to have practically zero exposure to computer science or programming until after graduation--only to discover that I find it immensely challenging, interesting, and rewarding. I probably would have switched majors if I'd taken this class Freshman year.
I think it's a good idea, but fwiw it's not CS-specific. Harvey Mudd's idea isn't that CS is so uniquely important that everyone should take it, but rather than everyone should take a lot of things, regardless of major, and CS is one of those things. The curriculum is designed with a philosophy of fairly broad education, kind of in line with a liberal-arts college ideal, but with more of a STEM flavor. I was a CS major there, and only maybe 1/3 of my total course hours were CS: the split is roughly 1/3 in your major, 1/3 Common Core, and 1/3 "HSA" (humanities, social-science, and the arts). [1]
The technical part of the Common Core is currently: 1 course biology, 1 course CS, 1 course engineering, 1.5 courses chemistry (0.5 is a lab), 2.5 courses physics, 0.5 course elective lab, 3 courses mathematics.
I didn't know "technical liberal-arts" colleges really existed. That's cool. As a student at a more traditional liberal-arts college[1], it's something I've thought about before.
[1] albeit one with a massively growing CS curriculum that is on track to be its own major, instead of part of the math department
FWIW, Harvey Mudd is part of the Claremont Consortium of five small liberal arts colleges, and it considers itself a liberal arts college: https://www.hmc.edu/about-hmc/
> We’re also unique because we are a liberal arts college.
Traditionally, the "liberal arts" include mathematics and physical sciences alongside arts, humanities and social sciences.
The course covers signals and systems. We talk about ways of modeling physical and electrical systems (or any other system really) as combinations of smaller components, and use the characterizations we derive of the smaller systems to characterize behavior of the larger ones. We use tools like the fourier transform to simplify the analysis.
When I took it ~25 years ago it was called Intro to Systems Engineering, and covered the foundational principles of control systems design and analysis of linear dynamic systems. A lot of Laplace transforms, first- and second-order differential equations, relationships between time-domain and frequency-domain behavior, etc.
The things I learned in the basic engineering course that really stuck with me were convolution, the sampling theorem, and the Fourier transform. That knowledge has been invaluable.
The University of British Columbia also has something similar, CS110 which uses a subset of Racket (Beginning/Intermediate/Advanced Student Language) to teach core CS concepts to a wide range of students.
Interestingly there is a common tie between Mudd and UBC: Maria Klawe (a truly inspirational woman). I would t doubt she had her part in both these courses.
Just based on her timeline at UBC, I don't think she would have. CS 110's first pilot offering was in 2009 (I was one of a few dozen students to choose it over the existing CS111) whereas she left the department in 1995, and the school in 2002 (between those she was involved in the faculty of Science as a whole). At most, she would have been part of the early planning stages or discussions of the course, although perhaps she could have been an informal advisor through the years after her departure.
As a general rule, college presidents don't get involved in course creation--even at small colleges like Harvey Mudd. In this case it would have been hard for her to have had a part since the course was created before she arrived.
I can say that I really appreciate what was done in CS110. I learned about a bunch of topics that would have been taught later on in other curriculums like recursion, graphs, lambda calculus, first class functions, and even implemented minmax. Granted, I took the pilot offering which has since been scaled down (lowest common denominator of student and such) but there were a lot of concepts which just couldn't have been taught efficiently with something like Java, which has a lot more syntax to learn before even being able to get to the meat of the course.
That said, the course is definitely not for everyone. People that taught themselves other languages before coming to UBC generally found it to be too easy at first, wrote the course off as being stupid, then started lagging slowly as time went on and more advanced topics got introduced. I've TAed the course a few times, and have seen that come up a lot. Also, of course, the people that just couldn't grasp the concepts in the course. But overall, it was a fairly well-attended class, with lots of people from across the school (it counted as as a computation course for Arts majors and was easier than Calc 3 :) ). Really cool to see the different ways people would approach a problem.
As a former student of CS5 (the class), I must say it was spectacularly well-run, fun, and educational. Zach Dodds, one of the authors of this book, was a particularly brilliant and inspiring professor.
While I'm an advocate for practical eduction, I'm equally an advocate for understanding the principles of your field. This book will much less vocational than your typical code-school/academy/etc and instead focus on building a foundation with which you can build upon.
I highly recommend this as a great primer to computer science.
Beautifully written text. I also really like the idea of an intro course but am, probably like many others, struggling with how to present the topics in an interesting (and practical) way without missing the theoretical beauty of computer science.
This course reminds me a lot of the Berkeley course posted a month ago, if anyone wants to see the discussion there: https://news.ycombinator.com/item?id=9838196. From what I can tell, the coverage is almost the same, except that the Berkeley course pretty much trades computer architecture for declarative programming and some other briefly-covered topics like machine learning, map reduce, concurrency, etc.
The prime sieve algorithm in chapter 3 is not the real sieve of Eratosthenes. Which is kind of funny because the person who pointed this out to the FP community is also a professor at Harvey Mudd.
Ran Libeskind-Hadas is an amazing teacher. He really got us exicted about stuff in theoretical computer science. I was actually dissapointed in my advanced algorithms class in grad school because Prof Ran already taught us everything except for skip lists during his enrichment sessions in the summer of 2006.
Mudd Alumni here. I had the pleasure of being a student of Professor Ran Libeskind-Hadas and Zach Dodds (who are two of the authors of this book). Amazing group of professors!
Before we move to CS for all, can we at least solve the problem of Computer Literacy for all!?
There's a huge population of people who simply cannot effectively use a computer. Can we fix that first?
Otherwise we're leaving them behind and that's not right.
Computer literacy and computer science are two different things with two very different pedagogical objectives.
Often times, when people say "computer literacy", they mean popular software competency. It often means ad-hoc comfort with specific software interfaces and solutions.
So if I've learned the steps necessary to attach files into Gmail, browse in Safari, download and remove apps, use Dropbox, and so on, then I'm considered computer literate. At one time, employees were expected to type in DOS commands. Now command line is considered hacker territory.
Almost everyone in the world is living very high away from computer science, and instead they are living in the world of corporate designers. They are living in a world where people at Apple build app experiences called "Mail", "Calendar", "Reminders", and you swipe left to delete. Soon you'll be asking Cortana or Siri to do things for you.
In that designer world of proprietary software and aesthetic trends, what does computer literacy mean? It sounds like a class on Microsoft Word or Outlook. It sounds like a class on how to use the App Store.
Those of us in computing sometimes tend to forget that there's a whole world of people for whom computers are not a passion, they are simply something they have to deal with whether they like it or not.
I know MD's who have no love or interest in computers at all. No interest in becoming "computer literate" as defined by people like us. These are not dinosaurs. Yet, some of them live in a world where pen-and-paper are more efficient and safer than paging through text boxes in a shitty UI on an equally shitty medical data entry program.
Some of them couldn't scan-and-email a document if their lives depended on it. They screw-up sending links to websites and have crap spread all over their computers rather than organized in a sensible way within a directory structure.
This is either a case of literacy or one where computers and UI design still have a lot to be desired before any human being can walk-up to a computer and get things done. And, BTW, this isn't a Mac vs. PC issue as these people are equally clueless regardless of platform.
I know music teachers who can barely send email and school teachers who get flustered within anything more complex than an iPad.
None of these people are stupid.
And, to some extent, I am not sure anyone needs to actively pursue a "solution". Most of this will resolve itself with generations of people who grew up with computers. Sad to put it that way, but I think there might be a degree of truth in that.
I've made this comment multiple times: I told my son that his generation is likely to be the last to actually drive a car. It is almost guaranteed that his kids will have no need to drive a car and will, instead, use fully automated vehicles. A human driving a car might become a recreational activity. Two hundred years ago nobody would have though of running or jogging as a recreational activity. Today we do.
The point is, things change, some are left behind and some adapt.
> And, to some extent, I am not sure anyone needs to actively pursue a "solution". Most of this will resolve itself with generations of people who grew up with computers.
Well then we should speed it up somehow. People die due to shoddy writing and missing/unindexed/unsearchable paperwork by MDs. Revoke the licenses of those who refuse to join the 21st century.
This aversion to software you describe may just be an age / generational thing, because I've noticed that almost all "older" people have issues with technology.
I think that being a med school student today probably means osmosis of cultural information from other med students, including student solutions like Google Drive and Dropbox, as well as Tinder. Along the way, that probably means comfort with email, chat, downloading apps and files, browsing, buying, PDF reading, and so on.
> Before we move to CS for all, can we at least solve the problem of Computer Literacy for all!?
This is only "CS for All" Harvey Mudd students; I don't think real computer illiteracy problem there.
> There's a huge population of people who simply cannot effectively use a computer. Can we fix that first?
If you mean to shift topic from what "CS for All" means in the title to "CS for All in the world", obviously, that inherently requires solving Computer Literacy for all. So, yes, we can solve that first, if we can solve either at all.
If you mean "CS for All" in the sense actually used in the title, then, demonstrably, no. Since the source linked from the title is the solution to "CS for All" in the sense used in the title, and yet, as you note, Computer Literacy for all (in the broader sense of "all" that you wish it solved for) is not solved.
This. I believe very strongly in the importance of touch-typing. I went to an inner city school for elementary and high school. And when I arrived at university computer science I felt like I was light years behind my peers. A lot of that stemmed from not being able to type as fast as them. Hunting and pecking typing while trying to wrap your head around making abstractions and recursion is enough to make anyone frustrated.
I completely disagree with this. Despite being a fast typist when I first started high school from years of computer use, I still consider my typing class to be one of the best bang-for-the-buck classes I took in terms of what I have gotten out of it since graduating.
My form was not perfect before taking the class. I would often do something slightly weird with my right hand where my it would "walk" to slightly incorrect positions to reach keys that my other hand should be hitting.
My typing teacher put covers over the keyboard so we couldn't see our hands and then had us do typing drills. She would strictly enforce that we maintain our hands on the correct home-row position, wrist positioning, etc.
After a semester of this class, despite an initial drop in my speed, I can now touch type correctly and my speed is now faster than ever.
I work with professional programmers who hunt and peck and it drives me crazy. For something that you interact with daily and is the instrument of your profession, taking an hour a day for a few months is a no brainer to perfect your form.
I would like to suggest touch typing tool TypingStudy for everyone who think he wants to improve his or her efficiency. Strongly suggested - http://www.typingstudy.com
My elementary school (circa 1998) struggled to teach me touch-typing with both in-person instruction and Mavis Beacon. I also tried learning at home. It was fruitless.
How did I actually learn to touch-type? AOL Instant Messenger.
agreed, for me it was a few years earlier with BBSes in the early/mid 90's after High School... When you have to not only type for you conversations, but add in commands to send direct and channel messages, you get fast, or you don't chat.
I could already touch type sloppily in the 90s when I took a keyboarding class in Gr 9. The class taught me proper hand/wrist positioning to avoid strain which I attribute to helping me avoid wrist problems over the years. Of course I also taught myself how to program the 90s typewriters so I could create macros and slack my way through the rest of the semester.
I don't think it mattered in programming classes that I could touch type, just meant I could multi task distractions easier like being on IRC during lectures and appearing to be paying attention.
I don't think this is a solvable problem, especially when people just don't care. There are plenty of resources from websites to youtube videos to teach users how to be more computer literate. But instead of learning, people would rather watch someone unbox candy on youtube.
"... people would rather watch someone unbox candy on youtube."
That made me laugh out loud. Then it made me sad again.
Look, I get we can't all know everything. I mean, we can't all be mechanics, right? But every driver should know how to check their fluids, air, etc. Maybe change a tire.
Same with computers. I don't think everyone should have to learn to code. I think that's not an ideal scenario. But I do think everyone should be computer literate for some basic definition of computer literate.
This is exactly what I rant to people. Working IT support at a library where I sometimes help out patrons on public computers, it boggles my mind that many people still don't know how to do simple things like double-click or copy text.
We've changed our policy where we don't provide instructional services anymore, only tech support, because it would take up so much of our time trying to teach basic concepts.
Why not approach a local user group to offer to do tutorials one Saturday a month? I know a lot of guys at Linux user groups in particular would be willing to help... they may not like helping with mac/linux as much, but many would be happy to do so just the same.
I tend to think computer literacy is the wrong approach. I think the right approach looks like "interfaces that don't require literacy" (one of the reasons why I think human-quality NLU for command & control systems are going to be amazing). Most people don't need most of the functionality of a computer.
Great--I think every student should take a CS class!
That said, this course suffers from so many CS courses.
1. It's too wordy!
2. As usual, I don't like the layout.
3. Funnel your subjects. (I'll give that a B.)
4. Funnel your paragraphs, or eliminate most of them?
5. Most people(students) find this material extremely dry. Introductory books should be "tight"! They should go through numerous edits? Take out every non-essential word?
6. I haven't yet read an introductory CS text that gets it right?
7. As to exercises? Try to use excercises that the student might have some immediate interest in, or can use in their daily life?
For example, instead of some cute game example, show the student how a simple reminder application is programmed? How Google works?(just the basics). Or, how their spellcheck program works?
8. If I was going to write a introductory computer course,
after explaining the hardware(that's usually sitting in front of them), I would explain an how operating systems stores their information--"The use, and location of Folders."
I would want my students competent in the Command Line before we did any Programming. I would want them to know they can have two folders named the same, but located in different sections of the hard-drive. I would want them competent in finding them, and manipulating them.
I was too hard with my review--sorry! I was doing some yard work and felt really quilty. I know getting across computer science concepts/theories is terribly difficult.
Part of my anger is I don't have a good grasp of CS theory, or why we do someting a particular way? I can get things done, but I'm missing the bigger picture--in many instances?
My education into CS has just been following many steps, and listening to videos. I will go back to this free book, and give it a full read. Sorry to the Authors. I was in a bad mood?
I think it's probably solid feedback if you include more tangible action items. What's an example of wordiness in the text? What would be a better phrasing? What don't you like about the layout? Why?
Don't feel back about feedback :) Suggestions for improvement are always helpful, especially if you also include the stuff you do like.
No offense taken! We value feedback. We've refined the book over the years based on feedback from undergraduates from the schools where this course is taught, but we also value other perspectives.
> 7. As to exercises? Try to use excercises that the student might have some immediate interest in, or can use in their daily life? For example, instead of some cute game example, show the student how a simple reminder application is programmed? How Google works?(just the basics). Or, how their spellcheck program works?
Yes! I agree wholeheartedly. I took an intro to CS course at UBC which is similar to this (I talked about it in a comment thread above) and this was a big thing I loved about having new exercises created specifically for that course. I got to create space invaders (I found that super fun), newer years create a snake game. In addition, I created a simple graph crawler which used Google a lot as a way to tie in what we were creating with what Google does. Now, they create part of a client-server application which resembles Twitter or an IM program. We also created a minmax algorithm for pawns which was really cool since it showed how an NPC could ostensibly be made in a game, although that has been dropped since. It's all really cool examples that simplify something that exists in real life, and really helps engage students a lot more.
What if colleges started offering this as an alternative to the basic MS Word class most schools make everyone take? Then people who didn't know how to use a computer would be too intimidated by it, but students who already knew the basics could move on to this more interesting course.
You should still be able to test out, though. That way, if you're totally uninterested, you can test out of the MS Word class and move on.
I think there are enough students sufficiently interested in computers that they'd check out the harder course if its name didn't sound too obscure.
Mine does. They called it "Intro to Computers" but it was really just a giant ad for MS Office. The only part of it that most people wouldn't already know was the Access databases... which they had in the curriculum for some reason. I don't know of anyone who actually uses it at work.
At least they let you test out. The only reason I know Access is in the curriculum is that I BSed my way through that part of the test. Probably the reason it was there was so more people would have to spend money on taking the class.
I'm a current UC San Diego student. It's awesome to see our faculty featured here, particularly Christine Alvarado. She has a fantastic reputation within our CS department and I'm really glad to see she's doing great things and getting recognition outside UCSD as well!
This looks like it would make for a very nice course -- a good middle ground between the hardcore practical course ("let's learn C") and the hardcore theoretical course ("let's do denotational semantics with Scheme" -- or whatever).
This is a great thing to offer students and I wish my University had made this a part of the curriculum. Somehow I managed to have practically zero exposure to computer science or programming until after graduation--only to discover that I find it immensely challenging, interesting, and rewarding. I probably would have switched majors if I'd taken this class Freshman year.