I’ve mentioned before that I’m on the executive board for the Association for Computing Machinery (ACM), which is the undergraduate computer science group on campus. This semester, we wanted to focus on providing for the undergrad community that which they weren’t getting from the department. We talked to a bunch of students, took a couple of surveys, and found out that what students wanted was three fold: they wanted to learn technical skills that they weren’t necessarily getting in their theory classes, they wanted to meet more people in the department earlier in their careers, and they wanted to get to know the faculty and graduate student population and learn about their research and side projects.
Almost every week, we recruited a different speaker for our meetings. Many students contacted me with ideas for these hangouts, and so we had a nearly unending stream of student-led workshops, which we tried to make interactive and relevant. With Marshall’s help, we got a senior manager from Amazon Web Services to talk about the dizzying array of services they offer, and for our last presentation of the semester, we had Norman Ramsey, an associate professor who does research in programming languages and functional programming, talk about the new introductory computer science course he’s designing.
The motivation for creating a new introductory course comes from a lot of different places but the main idea is this: an introductory course should challenge the minds of the students taking it while simultaneously developing a love for the discipline and the work. The list of desired outputs from the course includes an understanding of basic programming fundamentals, such as abstraction and recursion; a focus on programming to solve a problem, which encompasses the idea of data-driven programming, or creating solutions that fit the problem, as well as developing systematic methods to solve problems and develop software; and the ability to document a program once it’s created, emphasized with the idea of contracts—statements about what a program will do; for example, the plus sign (+): given two numbers, it will return their sum.
The goal of the course is stated:
...a course in problem-solving by computer, where students will learn to solve problems ‘starting from a blank page,’ and that will be available to every student who is motivated to work hard, regardless of background.
Generally speaking, if I handed someone a computer and said, “write a program,” they would have no idea where to start. The ‘blank page’ basically means that by the end of the course, a student should be able to create an entire program from scratch, without any instructor-provided templates. The second half means that even if you haven't spent the past 10 years in your parent's basement taking apart computers, you can still succeed in and enjoy the class.
These are all admirable goals for a programming course. The new design seeks to implement these using the Design Recipe, which is a systematic method of software development created by the folks at Rice University. It’s part of a larger educational series called Program by Design that has been developed and tested for nearly 15 years and is widely regarded as successful among colleges and universities.
Here’s the real reason this course is exciting: it’s going to have the BEST projects. The new program differs from the old one because there’s less of a focus on working out technical details and more on solving big, real-world problems. In that vein, the projects are going to focus on various applications of computer science in the real world, which means that by the end of the course, not only will students have an understanding of program design principles, but also an idea of how they could use those skills in the future.
The course plans haven’t been finalized yet, so there’s no guarantees that any specific project will be in the final curriculum. With that disclaimer in mind, let me seduce you with possibilities. Visualizations are a concrete, intuitive ways of determining whether your code does what you expect it to do. Try writing a system to simulate plant growth—you’ll know it doesn’t work if the flowers are stuck underneath the dirt. Want more nature? Imagine how useful it would be to determine the species of a tree based on a photo of it, when the only detail you can discern is the structure of the branches. A machine learning project could classify trees based on that structure, given a set of training data—pictures of trees of known species. Think about that nifty thing on Google Translate detects what language you’re typing in the box. That’s exactly another machine learning project: determine what language a document is written in. There are tons of other ideas being thrown around right now (GPS calculator! Scrabble game! DNA manipulation! Guitar synthesizer! Navigate the surface of the earth!); rest assured, students would be working on interesting, relevant projects they can get excited about.
So, Baby Jumbos, how does this apply to you? You have the opportunity to take this course next fall. Students enroll in the intro to CS class for a whole bunch of reasons: some are on their way to a major, some think it would be fun to try out before graduation, and some need a math credit. If you’re in either of the latter categories, I’d strongly recommend this course. It’ll be super fun, you’re gonna have awesome teaching assistants (ahem) and with any luck, you’ll realize that computer science is the field you’ve been searching for all along.
Course description is available here: scroll down to COMP 50-PSS Problem Solving through Software Design. Post a comment or tweet at me if you have other questions about the course or CS in general!