Find results for

Tuesday 27th November 2012

by sophie

As I sit here working on a project in lieu of going to class for the umpteenth time, I realized with sudden clarity that perhaps the current way that Computer Science is taught in universities is not the optimal way. Large lecture halls, clunky languages– it’s a bad sign when even a die-hard “learning for learning’s sake” student skips class on a regular basis.

anyway, a few thoughts on how I would change the structure of Computer Science courses to maximize efficiency + interest and minimize pain:

STOP TEACHING JAVA.

Seriously. I have never, ever been required to interview in a specific language at any company (even the “big names”), and if the people you’re talking to are deadset on Java, you probably don’t want to work there anyway. C is a much, much better “lower” level language for really grasping the way programming works, and Python is a much, much more fun language if you want to lower the barriers to entry and get students making things right away.

MAKE GRADES ENTIRELY PROJECT BASED FOR NON-THEORETICAL CLASSES

For classes like data structures, advanced programming, OOP, etc., etc. students tend to learn a great deal more and invest much more time and interest in coding projects. These should be the heart of the course, and is what matters in “the real world”, anyway. No one’s going to give you a bonus for remembering the difference between inheritance and polymorphism: let’s face it, you’d take the 5 seconds to Google the
definitions and move on. Big projects, tight deadlines, collaboration: this is where the real learning is.

IF YOU MUST MAKE STUDENTS TAKE EXAMS, STOP ASKING LANGUAGE-SPECIFIC SYNTATICAL QUESTIONS

In my opinion, you should not administer written exams in technical classes (see above). However, if you must, for heaven’s sake, please, please do not ask us things like the difference between strcmp and strncmp. Sometimes coding by hand with pencil and paper is good practice for interviews, but the code should be judged for logic and not syntax. Exams should be theory-based. Technical evaluations should be project-based. EOM.

IF YOU MUST HAVE LECTURE COURSES, PLEASE LIMIT THE SIZE OF THE CLASS

Size matters. This one is a given. Of course small seminars are best, but it’s understandable that budget might not allow for it. Lectures for intro courses only, and please, please try to cap them: there is a huge difference in ambiance and quality of learning between a lecture of 50 and of 250. I’m talking to you, Columbia. When I’m in a room with 300 other students learning about the difference between * argv[] and ** argv I immediately want to fall asleep or eat.

THAT’S ALL I CAN THINK OF FOR NOW.

then again, it’s entirely my fault for taking up class time to write in English instead of C++.

P.S.: Shout out to everyone in AP lecture who’s on Facebook right now. Hello! Now I feel less guilty for skipping class. At least I’m “working” in the library.

P.P.S.: For the record, I do believe that Jae is a great professor and administers valid albeit perhaps too difficult exams. Personally, I enjoy tough exams (sink or swim time/everyone failed so I feel less bad for not studying). The main clincher here is a) the size of lecture (TOO BIG) and b) little grade weight on projects. Neither of these can really be blamed entirely on the professor, cough *administration* cough cough

P.P.P.S.: Yes, perhaps strcmp and strncmp + polymorphism are not the best examples, as esp. the polymorphism question is more theoretically important. But you get the gist of the idea.

P.P.P.P.S. It is probably true that if I took 10 minutes to edit my posts I would not have to use postscripts, but what’s the fun in that?

18 Responses to “how to make CS courses better”

Great post. I agree with alot of it. I have a degree in Computer Science graduate and now I oversee four teams of .Net developers who code in C# and C++ on LInux. We have a terrible time recruiting programmers so I am very invested in fixing the problem.

Other than Android I rarely come across anyone who is using Java, however, Java is a great language for teaching object oriented programming; C++ and PHP are not. Ruby (on Rails) or C# would be better in my view but I understand why the edu community has embraced Java. Moving from Java to C# is a snap. I don’t think the language is the problem. Either you like to code or you don’t.

As for lectures and exams universities are attempting to teach critical thinking and the ability to analyze and solve problems. I look a lot of EE classes and remember them being alot harder than the CS classes.

I like the smaller class sizes and more labs – possibly decoupled from lectures but the theory stuff is important. For example learning design patterns is critical.

The biggest problem for the head of IT is “too many programmers are heavily invested in language X and now language X is becoming obsolete and they can’t bear it.” We need to teach students how to analyze any language and adapt to it rather than be an expert in that language. Oddly enough this is the same issue in attempting to teach students how to be global citizens. How do you teach people how to listen and learn, assessing the differences and similarities between this new culture and the one they grew up with, and then be able to adapt to the new culture? Yes, we need expert Java folks and C folks, but then one day we don’t need them anymore. Do they (and we) know what to do when that day comes?

I’m just about to graduate from Berkeley EECS, and almost every interview is done in a specific language, which could simply be a problem with the job type I am applying for.

Java might not be the best low level language or the best introductory language, but it is useful for a variety reasons. It’s used so much in companies thanks to the JVM, so becoming familiar with it in school is helpful. It is strongly typed, which with an ide like eclipse makes writing code pretty easy. It’s great for OOP, while also good for threading.

I (nearly) totally agree with you. Sure, you screwed up on examples but you still have a point. Inheritance and polymorphism are fundamentals.

Projects: Those are the things which make people learn.
I’m an autodidact (had already some years of experience prior to university) and it’s quite shocking seeing courses in my country (italy, with lowercase initial).
Most of the courses are math, done at varying degrees of difficulty.
The few courses which do have some resemblance of other countries CS courses are taught in the worst possible way.
Professors in class talk about theoretic aspects, without giving any hint about how to actually do stuff.
The projects are valued at 20-30% of an exam but are the biggest issues which make people lose years of university and money.
I’m talking about people with a 30/30 (it’s a vote) who can’t actually code the project.
After 3 years, most of the people still don’t know how to write code. The few who are able to deliver something are those who worked in the past or those who spent a lot of extra time on their projects.

The people from other states of Europe which come here to study are shocked to see the absurd amount of theory we have to study and often fail exams (at least, I’ve had experience with only 3 abroad students). They said to do more practical stuff at home.
The students I knew didn’t get to an exam with a project (which are often blocked by 2 or 3 theoretical exams), but I had the chance to work with them on a personal project and they were much more prepared for work than italian students.

I’ve just one suggestion: don’t hire italians, unless they have proven their experience (with opensource project or previous works).

University here is really fucked up and it’s still suffering from being a branch of other courses.
Things are even worse with Engineering of Computer Science. Despite the name they have far less projects (a friend of mine which got into EoCS did only 1 project in 3 years, compared to the 7 we did at CS). People at EoCS usually fail because they can’t grasp the advanced math theoretical courses (which are common to all the Engineering courses).

Java: I’m fucking sick of java propaganda at my university.
Seriously, I’d rather have political propaganda than those idiotic professors telling me that “performance doesn’t count” or to use eclipse “because of all the awesome plugins which make everything easy”.
That may be true, but and no, I will not code your stupid project in Java, because I like to have app which start immediately and because I’d like to have a GUI which doesn’t suck on nearly every system!
Holy crap, there are a lot of awesome languages and build systems, I’d rather die than wait for Eclipse to load up or for using ant (which, btw, is pretty slow when compared to other build tools – I tried gradle on a fairly simple project and was amazed)
The worst thing is nearly everything they say is never tested by the students, because the projects are ridiculously small when compared to the matter.

We’re currently learning Java in our software development classes and I quite like it. Java is very similar to C# and a lot of the skills are transferable to Javascript and C++ as well. I don’t see what’s wrong with learning it in a Computer Science course.

There are some private schools that are set up like this – Neumont University (expensive, and ever pandering to get more money, but still an awesome hands on approach). As a kinetic learner, this was an awesome experience.

I studied CS in Germany and the first language you learn is Ansi C. You have to alloc your memory and do all the lower stuff by hand. Later in other courses you learn C#, Java etc. The mark in this courses depents on your implemented project. In theoretical courses like algorithms and data structures you can use your own pseudocode (if its understandable, I think your intepretation of whitespaces [1] will not count) if you have to explain it with code. The crowdest CS class was
about 20 students in bachelor courses and about 12 students in the master courses.

One of the best courses I took in college was a Common Lisp class. This was in the 2000′s too so it wasn’t that long ago! I think the course still exists – but I’m sad that in most places Java is taught over something like SICP + Scheme.

“No one’s going to give you a bonus for remembering the difference between inheritance and polymorphism: let’s face it, you’d take the 5 seconds to Google the definitions and move on. ”

It’s one thing to look up syntactical constructs online – it’s another thing to not understand common ideas. I wouldn’t hire a programmer that didn’t understand inheritance or polymorphism and had to use google to figure it out. That’s unacceptable to me. Googling the prototype for something like strncmp is totally okay – especially if the person doesn’t write C every day.

I’ll agree with you that exams should be theoretical and that teaching Java is horrible – but you absolutely have to understand core concepts without having to revert to google to figure it out. Your code will suffer greatly if you don’t.

You might be curious to know that Columbia is somewhat infamous in the CS world for its emphasis on Java. Other (good) schools do not do this. At Berkeley, I’ve taken classes that used Scheme (no longer taught, same class now uses Python), Python, C, Java, and C++. There are courses that use Ruby.