Computer Science Classes I Would Like To See Offered

My friend Warren recently expressed a very “scorched earth” opinion of the standard Computer Science curriculum. He suggested that given the available of free CS courses (OpenCourseWare and the like) and experts at your fingertips (Blogs and Stackoverflow); wheres the value of a formal CS degree?  That lead me to think …. What are some classes that would be very interesting to take: [Even as an alumni of 2 CS programs, I would be interested]

  • Software Development Tools: A lot of classes mention tools, but not how to actually use and extend them. [Build systems, version control systems, formatters, emulators/virtualization]
  • Debugging: The goal of this class is to teach basic skills and then go through labs of finding/fixing bugs. Later, to write unit tests to verify the bugs.
  • Testing software: This would be a hands-on class to teach students how to write unit tests, implement mocks, test black box software, and write up reports on testing procedures. This would also the involve testing of embedded hardware and software, black box systems, functional languages, network services, concurrent software, and even components that lack a stable test environment.
  • Computer Vision: It’s just interesting, and visual, often you don’t hit this class until graduate school.
  • How to design an API/Surveying APIs: Let’s get rid of bad APIs. This would also be responsible for demonstrating the differences [good and bad] of available APIs.
  • Open Source: Not really a history of open source. But this is to take an open source project, and extend it. The goal of this project is to get students involved with working with one project, and demonstrating improvement to the project.
  • Marketing: How to market your work, or someone else’s software. This isn’t designed to replace developers with marketers, but it just helps the developer understand how their work is sold.
  • Automation: How to automate manual tasks with software. This could be with build scripts, batch scripts, testing automation software, or even simple system scheduling.
  • From hardware to software: The goal of this class would be 2 things. To create a small embedded device, and then go all the way up the chain to a working software client. This would involve writing a device driver, interfacing with hardware ports, and using the driver. The second part of this class would involve creating a simple processor either as a circuit or a manual build. http://blog.makezine.com/2009/10/03/building-a-cpu-from-scratch/
  • How Computer Science relates to [Field x, y or z]: This is more of an open ended suggestion. For example: Offer a class on Bioinformatics [It’s a class that combines biology, and computer science], combine a class on art and computer science (that’s more of visualizations though), history and CS [examine potential DSLs involved with history research], or even math and CS [shows the tools, and libraries that one can use in their application].
  • How to crack software/re-engineer a binary: [Probably with the permission of the publisher] Crack a copy protection system. Many students know about software cracks, but very few actually know how to create them or how they work. The goal of this class would to familiarize the student with how software is compiled, and can be reworked after compilation. Also, this would demonstrate how to protect their application as well.
  • Alternative Language Survey: Yes, this is technically a standard class. But I’d like to see one on functional languages, Groovy, BF, or even creating your own domain specific languages be taught.
  • Community Service: This really isn’t as altruistic as the title may imply. This is more of a class to create a software component [as a large group] for a member of a local community. This could be a small interesting game [example I worked with a group for a class], or working with a small company or individual to improve or sofware-ize their product. Elon’s CS department did this a while back with the game deflection. even taking an existing board game [with the original creator] and making  a software version. The goal of this class is to research market need, create something usable and getting their fellow peers involved in using it. This would help communicate to the rest of the students about some of the cool things that CS can produce.
  • Author selected: Get an author of a quality software related book to teach a class. Have John Skeet teach a C# class. Paul Graham teach a class on LISP. Brian Goetz to teach a class on Concurrency.
  • Hands on Software Optimization class: Take an open source system, and optimize it. This class would teach formal procedures on how to optimize an existing application to perform as quickly as possible, monitor, and document the improvements.

Last of all, these classes should be fun and engaging. If you’re not actively involving the student, don’t even bother trying these suggestions.

  • http://antipaucity.com Warren

    So, you’re looking for the Software Engineering equivalent of DeVry or digipen.com?

  • Eric Hydrick

    The deflection project (which was a senior seminar course) covered a lot of the items on that list ironically.

    • http://antipaucity.com Warren

      Every time I hear about that project, I feel like I was a little gypped by not double-majoring

      • Eric Hydrick

        I loved the design patterns class that followed, but I feel gypped for not signing up for that class junior year.

        • crash025

          Oh god… the milk and cookies video for MVC… epic!
          But that serves part of my point. Design patterns at other universities is a 3 class series… then they tell students read GoF.

    • crash025

      I’m sure it touched on it, but each of those were meant to be a class within themselves. When I talk about testing there I meant here are many of the technologies that testers use, not just “heres junit” have fun for the semester.  

      • Eric Hydrick

        I know, but I was just pointing out you can get a lot of experience doing these things through large-scale projects like Deflection. You lose breadth since you’re only using 1 tool to build a product, but you’re gaining a lot of invaluable, real-world experience of using all of these tools in real-life production. Given that the number of courses a student can take over the course of 4 years, having an “applied” course that covers the basics and forces students to use several tools for version control, time management/recording, automated unit testing, bug tracking and backlog management, etc. would be great for students. Once you get used to the basic principles, learning to use different tools becomes something you can pick up on the fly.

        I personally learn best by doing, so I’m heavily biased towards anything that has me sitting down and actually writing something.

  • Dean Schulze

    If you taught Maven under Software Development Tools you would have to add another semester to the degree program.

  • Ben Brunk

    Most of those topics are probably inappropriate for undergraduate CS students, quite frankly. They’re either too advanced, too topical, or too skills-oriented. I don’t think there are any shortcuts to learning advanced subjects relating to CS–you have to have the drive to do it yourself. I would also note that everything you listed can be learned without paying college tuition, including the “community service” part.

    • http://antipaucity.com Warren


      everything you listed can be learned without paying college tuition ”

      And that’s true of all of the more formal aspects of CS as a degree program, as well – so I guess that means we don’t need CS programs anymore.

      Just because it *can* be learned outside of a degree program doesn’t mean it should be at least *offered* inside the program (and for several of those topics, required at least in survey form)

  • http://profiles.google.com/erjablow Eric Jablow

    A semester-long version of the Tufte course on information design and presentation.

    Typesetting, both before and after the computing era.

  • http://www.facebook.com/people/Koos-Gadellaa/613983019 Koos Gadellaa

    Pray tell, how are these classes going to advance the students in a scientific community?
    None of these are for computer *science*.
    Maybe half of these could be given next to the theoretical counterparts (and them being mandatory hands-on sessions), but quite a few of the things you mention (tools, for example) are changing so frequently that setting up a course in them would require a lot of yearly updating (and adding, and removing). Honestly, I don’t want professors spending their time checking out the newest maven/eclipse/intelliJ/git/whatever, reading the new options, updating the course, testing the course, etc. The breadth and width of the landscape is simply too big to guide.

    what would you expect from a professor?

    • crash025

      In a scientific community many of these courses help students. I’m not advocating the replacement of courses, but the addition of some of those courses.  Just a few points on how these classes would help someone in the scientific community:
      . In regards to testing and debugging classes, I’ve seen fellow students and professors [in the research community that couldn't do this, nor had actually unit tested their code].
      . APIs: If you are building a service with your research, an API helps someone else use your service.  
      . Marketing… I’ve never seen a student properly market his or her research. Thats their job when presenting or talking about it, marketing. 
      . In the alternative language summary, I meant to add in Octave as well.. I guess you could throw in matlab [but that's not free]. 
      . Dev Tools: Many dev tools: aren’t even directly related to developing a project, they may manage a complex build process (ant, maven), the files associated for collaboration (ant, git, svn, etc)….

      I expect a professor, who is teaching to be aware of what is going on in the field in which most of their students will be entering. A three to five year refresh might be needed to be relevant.