Fog Creek Software
Discussion Board




What's missing from CS curricula?

I'm wondering what's missing from computer science, software engineering, applied math, and other computer-related curricula?

Based on what I see posted most often here and elsewhere, it seems like graduates of these programs often don't get a good grounding in business fundamentals.  What else is missing?

Curious Student
Thursday, January 16, 2003

What's missing most from my curriculum is *actual* hands on experience.  The first 3 or so classes in the major are the typical algorithms and data structures classes, with lots of programming assignments that reinforce what's talked about in class, and I got the most out of those classes.  Then there are a whole slew of classes that are purely theoretical.  Now, I understand the need for theory classes, don't get me wrong, but how can you take a Principles of Programming Languages class without writing at least a rudimentary parser, or a Databases class without writing a single line of actual code, or take a Graphics class without finding out how a ray tracer is actually *made*.  It's been years since I wrote any code that doesn't fall under the category of "hobby".  Theory is wonderful, but we keep having bright students graduating that can't actually *do* anything with what they've learned, and it's terrifying, as now we're supposed to compete for these jobs instead of having them handed to us.

Patrick Lioi
Thursday, January 16, 2003

Damn, you beat me to it.

The best thing that a CS undergrad can do is do one or more large-scale projects that produce a completed artifact.  Sometimes you can get course credit for it, but do it anyway.  The experience maintaining code and trying to get it done on time and everything else will teach you a great level of pragmatism.

Business knowlege is secondary, although spending some time learning about the basic rules of business and how large public companies structure their balance statements can be useful.

Of course, I did quite a lot of college project work and I still consider myself to be many times better of a coder now that I've been in the workforce, working with bright folks.

I got greatly annoyed at my compilers class in college because all I learned was some compiler theory (which didn't make sense until I learned formal languages) and functional programming (which didn't make sense until I got over my revulsion a year or two later)  And this is a top-5 US CS school, too.

Oh yeah, and spending time with somebody who is quite opinionated and abrasive tends to make you more pragmatic and understand that there are quite a few cases where it's better to just make a decision and be done with it.

w.h.
Thursday, January 16, 2003

teaching computer science is logistically difficult. there are some mildly interesting theoretical aspects, but for the most part the cool thing about CS is that you can program computers to do something. writing programs is time intensive, and evaluating programs for correctness and style is also time intensive. In a typical college semester, where the class meets two or three times a week, and everyone has 3 or 4 other things to do at the same time, there just simply isn't enough time to do everything well.

The students don't want to actually have to program a compiler, and the instructors certainly don't want to have to grade 30-100 compilers a semester, so everyone sticks with the theoretical stuff, mainly because it is a lot easier to teach.

so what's missing? Time!

schooled
Thursday, January 16, 2003

Well, that, and if you can learn how to think in general and learn things on your own, you will  be able to do most anything that is required of you.

The main reason why a CS major should do one large project is to learn about how a project larger than a homework assignment works, not because it will crystalize the essence of a class.

w.h.
Thursday, January 16, 2003

Ditto above, plus there needs to be 4 years of lab, kinda like they do in engineering.

pole
Thursday, January 16, 2003

Real projects. Personal project management. Group project management. Creative thinking. Business fundamantals.

And in some unfortunate cases, python ;-)

fool for python
Thursday, January 16, 2003


What's missing from CS curricula? Real Life (tm).

How's this for a possible CS program:

Year 1: Basic programming skills
Year 2: Group development of large application.
Year 3: Maintenance of your own large application.
Year 4: Maintenance of another groups large application.

:)

Seriously, I've rarely (though it does happen) met a developer who had a real problem with learning programming languages, coding, etc. I've met MANY that don't know how to think, work with other people, act responsibly, organize themselves and/or others, etc.

Bruce Rennie
Thursday, January 16, 2003

Most programs should be broken up.

1.  software engineering.  This is where you learn how to build the next Excel or Quake.  As other people have said, lots of experience in programming would be the best training, just like they do in engineering schools.  Lots of labs, team projects, LEARNING POINTERS!

2.  computer science.  Pretty much how it is taught today.  theory.

(3?) Maybe a seperate business information systems track.

jeremiah
Thursday, January 16, 2003

>The students don't want to actually have to program a >compiler, and the instructors certainly don't want to have >to grade 30-100 compilers a semester, so everyone sticks >with the theoretical stuff, mainly because it is a lot easier >to teach.
>
>so what's missing? Time!

I don't agree with you.

My university has to courses devoted to compilers and several on formal languages.

During the first, which is taught during first year you write a simple compiler (variables, conditional and loop statements, procedures, types, arithmetic).

Second is a fourth-year course. Main project in this course is a full-fledged C compiler.

Pavel Levin
Thursday, January 16, 2003

Maybe computer science should be taught backwards (which is how most people learn programming from a non-academic background): Start off just getting things done.  No "theory" or "language design" and those kinda classes, just basic, actual programmer, where students must finish projects.  Then, slowly move them into more difficult projects where in depth knowledge is needed, so they actually see the need for knowing a quick sort. 

It seems like so many computer science students don't see the point of the theory, and so they kinda don't really get it.  OO made a ton of sense to me when I started learning about it, because for so long I had been doing procedural progamming in perl, C and vbscript.  I saw some cleanly written OO code, and it just clicked with me.  On the other hand, some of my "non-programmer" friends taking CS classes are getting spoon fed OO theory right off the bat, and they don't understand it, or understand the need for it. 

Vincent Marquez
Thursday, January 16, 2003

Then you run into the problems that physics profs run up against when they have to explain motion dynamics that are all based around differential equations without using differential equations because you haven't learned that yet.

Of course, after a certain level, diff eq and linear algebra converge.  So I guess after a certain point, you'd have to sit everybody down for 12 hours a day explaining absolutely everything at exactly the same time.

I don't like the idea of a seperate track for "real" CS vs. theoretical CS.  Too many grad students don't know enough about real coding and too many coders don't know enough about theory.

w.h.
Thursday, January 16, 2003

I agree with the sentiment expressed by Vincent. [CS] students need to understand why certains things are "better" (or "better suited") - simply telling them "this is better" isn't really good enough.

I had a similar experience when I was tutoring IT (business) students in software engineering. There was no pre-requisite to do ANY programming course before taking the software engineering paper. This meant that a lot of the students had never done any programming which made their job of understanding and learning a lot more difficult (and the job of the teaching staff). Write a few programs and you understand the need for things like source control, patterns, etc.

I also suspect the assignment they were set was flawed because: (1) they didn't have equivalent programming experience (ie. some had heaps of experience, some had none); (2) the scope of the project was perhaps not appropriate for 1 semester (too big) - I think they needed something small so they could complete it and they could use tools/techniques mentioned in class.

Walter Rumsby
Thursday, January 16, 2003

My school did a nice job throwing us into group development situations, and we did a real-world senior project with a team of 4 or 5, giving formal presentations of how we followed software engineering principles at each stage of the project.  I ended up coding in VB for the first time during this project (the school is C++ all the way through), loved it, and it's what I'm doing today.

If I had it to do over again, I wish I had taken a database theory and design class, and I wish an object-oriented analysis and design class were available.  This is all stuff that I've had to learn the hard way, and can't imagine getting a real job without knowing it.

ODN
Thursday, January 16, 2003

What's missing from the CS curricula, you ask?

Good software engineering classes.  Typically it is logistically difficult to design a large software project in one semester with a large (4 or 5 or more) students on a team.  This is difficult because of the limited time and also the professor of the classes needs to give each student a distinct grade.  With large groups, the professor has no knowledge of who is doing what work -- who is doing work and who isn't.  We were limited to groups no larger than 3 people just so that our prof could give more accurate grades.

If you want large project experience, get an internship somewhere.  My university pushed all of us in the college of engineering to go after internships and co-op opportunities.  I (and others) learned so much more practical project management and development skills in several months of working than what we ever could have learned in school.  My university went by the rule that you learn the theory in school and the practice in the intership.  If your school isn't big on interning, go ahead and try to find something.  I can't stress how valuable that experience is.

Design Patterns.  No one seems to teach classes with design patterns in mind.  Design patterns are some of the most useful tools that I and my co-workers use in our day-to-day work and I still find it amazing that no one is teaching something so useful.  This goes back to the fact that there are very few upper level software engineering classes -- just the place where design patterns should be covered.

infinity
Friday, January 17, 2003

I think that theoretical SE courses based on sommerville and pressman is a joke. teach the personal sofware process and let them understand that it can be scaled up if/when situation warrants.

Computability should not be taught with Turing (procedural paradigm) but with lambda calc - that way all CS graduates will be functional-literate as well.

Face it compilers is the epitomy of CS - all the theory (formal languages, etc) leads up to compilers. The next big level is code generation from higher level abstractions - state transition diagrams, generative programming, aspect oriented programming ... The theory to lead up to these is not formally taught.

Most assembly programmers ridiculed the idea of compilers initially. Time for CS to move on.

Karel
Friday, January 17, 2003

In my opinion the college courses should spend more time on theory, and less on programming itself.

You have to ask yourself why you are getting a degree in the first place. If it's just so they can teach you how to program, then frankly sit down with a pile of good books, and write programs. It'll take less than 3 years. If this is all they taught you then it'd be obsolete inside 10 years.

If you are there to learn stuff you can't easily learn from books (ie theory) then you're in the right place. Once you hit the work place, chances are all your training will be practical, not theoretical.  Your employer is training you for today, not 10 years from now.  So take the opportunity to learn as much theory as you can.  Not all of it will be useful in your first job, but 10 years from now you'll be better off.

As far as programming goes - well do that as well, in your own time. There are zillions of online, and offline resources that can help you learn programming. Apart from the very early Freshman months, programming should take a back seat....

Bruce
Friday, January 17, 2003

"If it's just so they can teach you how to program, then frankly sit down with a pile of good books, and write programs.  It'll take less than 3 years. "

Same can be said for learning theory. 

"If this is all they taught you then it'd be obsolete inside 10 years. "

Good programming never goes out of style.  Learning to program is different from learning VB.NET syntax.

"Your employer is training you for today, not 10 years from now.  "

And the number one reason why employers still prefer experience over education:  Most kids coming out of CS programs still can't program!

jeremiah
Friday, January 17, 2003

In most fields of an engineering type you have three separate skill sets Engineers, Technicians, and Mechanics.  The discussion here is of two flavors one is that the Colleges and Universities need to turn out either better engineers or technicians.  I would argue that most two to three year schools (junior/community colleges as they are called in the United States) can and do turn out  'Programmers',  people trained as software technicians.  CS programs are designed to teach fundamental theory of Computation not 'Digital Electronic Computer Programming'. I tend to agree with jeremiah's frist post that 4 year colleges and universities need to have three programs. SE, CS and Advance Technician Degrees.  I will be the frist to admit that this field is far from mature, but we need to do a better job learning and appling solutions from other more mature engineering fields.

A Software Build Guy
Friday, January 17, 2003

For some reason people are constantly talking about computer programming as some sort of immature engineering field. I am extremely curious as to why people think that computer programming has anything to do with engineering. On the face of it, I don't see any more connection between it and engineering than accounting or cabinet making.

I am curious!
Friday, January 17, 2003

Oh here is a further explaning of what I am trying to get across.  A pure Computer Sciencist is alot like a pure physists <sp?> to an EE/ME or a pure Chemist is to a Chemical Engineer.  And the the Computer Field Mechs are Field service and Tech support.

A Software Build Guy
Friday, January 17, 2003

You're all forgetting what computer science is.

Computer science is not computer programming. Computer science is not software engineering. It is more than that.

It is an extremely bad idea to be attempting to crank out computer science graduates who have lots of experience with software engineering at the expense of comprehension of other important fields.

The way I see it, most universities attempt to give a rigorous foundation in the basics/fundamentals (math, algorithms, computational theory) and then give you a good overview of most of the major topics. The goal is not to teach you a programming language and then have you do software projects for three years. Also, remember that the university is trying to give you a foundation of experience/knowledge that will enable you to keep yourself current by assimiliating new technologies and so forth relatively quickly.

Whenever you provide more experience with something, you have to take away from something else.

Also, remember that not all undergraduate (undergrad was implied by the type of responses I saw above) computer science students are planning on being programmers. Others are planning on being computer scientists -- i.e., researchers and so forth. For them, almost nothing but software projects -- as many replies clearly called for -- would be extremely disadvantagous.

It would be silly to think that many computer science professors haven't pondered this subject before. Most computer science programs are pretty mature and it's best to just trust their judgment.

Warren Henning
Friday, January 17, 2003

My father-in-law (an EE) told me that all of Engineering is simply discovering patterns and properly applying the patterns to a proplem.  In computer programming you need to defining the problem set and then discover an algorthim that will solve that problem set.  In other words you must define the problem and then apply a pattern to it.  This pattern is constrained by the abilities of ultimaly the Computer Hardware. (There are some things a computer just can't do) So you have to know and maintain the bondaries of the problem as well. Oh,  working with in constraints is another part of engineering.  So using this crude rule of thumb Computer Programming is a proto-engineering field.

A Software Build Guy
Friday, January 17, 2003

"It is an extremely bad idea to be attempting to crank out computer science graduates who have lots of experience with software engineering at the expense of comprehension of other important fields."

I advocated keeping the traditional computer science curriculum, but also adding a more practical oriented software engineering curricula.

"The goal is not to teach you a programming language and then have you do software projects for three years. "

You're simplifying it.  As I said above, teaching someone to program is different from teaching someone VB.NET.

"Whenever you provide more experience with something, you have to take away from something else."

Yeah.  But the same goes for all the other engineering disciplines.  Note that civil engineers spend more time in civil engineering labs than they do in physics courses.

"Also, remember that not all undergraduate (undergrad was implied by the type of responses I saw above) computer science students are planning on being programmers. "

Then they should undertake the traditional comp. sci. program!!

"It would be silly to think that many computer science professors haven't pondered this subject before."

They have.  There seems to be a lot of agreement that traditional CS education alone is lagging in many areas.

http://www.site.uottawa.ca/~tcl/edrel/
http://www.computer.org/software/articles/se-math.htm


"Most computer science programs are pretty mature and it's best to just trust their judgment. "

What a load of bullshit! 

jeremiah
Friday, January 17, 2003

What do you mean "the same goes for other engineering disciplines"? CS is NOT engineering.

I have nothing against some creating a "software engineering" degree as seperate from a CS degree, but CS should stay firmly theoretical.

My issue with most CS programs is that they have allowed concessions to commercial concerns - i.e courses in commercially valuable tools, rather that courses that might actually teach the students something fundamental.

And don't forget, there are plenty of technical colleges that have courses like "how to be a commercial programmer". Maybe you should be targetting them?

blah
Friday, January 17, 2003

Nice try, "blah"

I'm saying software engineering would involve tradeoffs, just like the other engineering disciplines.  You can change this to "other practical disciplines" if your mind is indeed as small as it appears.

Once again, blah, I'm not saying the traditional CS programs should be replaced by software engineering programs.

I don't get what you mean that I should target technical colleges.  I don't see anything wrong with the services they provide.

jeremiah
Friday, January 17, 2003

"It would be silly to think that many computer science professors haven't pondered this subject before. Most computer science programs are pretty mature and it's best to just trust their judgment."

You have GOT to be kidding me. Hell, I almost giggled when I read this.

I've seen professors who could barely tie their shoes, much less ponder a subject. Any subject.

What makes you think professors have any knowledge of real world software development?

Also, the old saw that university is supposed to teach you how to adopt new technologies is becoming pretty bogus, in my opinion. People who get into CS already have a tendency to absorb any and all new tech anyway.

Anyway, thanks for the laugh.

Bruce Rennie
Friday, January 17, 2003

For some reason people are constantly talking about nuclear physics as some sort of immature science field. I am extremely curious as to why people think that nuclear physics has anything to do with science. On the face of it, I don't see any more connection between it and science than accounting or cabinet making.

i is not a fissisist
Friday, January 17, 2003

Jeremiah - you've lost me. What are you suggesting?

The current CS programs vary, but at least the course I took was mostly theoretical, and in fact was part of the "School of Mathermatics" - nothing to do with engineering. You could argue not very practical either, but they seem to serve their purpose.

If you want courses aimed at producing programmers well suited to step straight into large scale commercial development knowing the tools of the day, technical colleges already provide these.

What is it that you want?

I didn't take a "practical software engineering" course, I took CS.

blah
Friday, January 17, 2003

"What are you suggesting?"

If you want to know what I'm suggesting, why don't you read my posts?

jeremiah
Friday, January 17, 2003

Oh please.  If you think technical schools can produce programmers, my boss has a bunch of resumes that he can send your way.

Bob Greene
Friday, January 17, 2003

From my posts:

I'm in favor of keeping a theoretical CS degree.
I think adding a "software engineering" degree could be useful.
Straight out commercial programming seems to me to be adequately covered by other institutes.

You violently disagree, and apparently I have a small mind :)

Perhaps you can help me out here and point out the flaws in my view.

blah
Friday, January 17, 2003

I'm tired of this, you haven't read my posts or you would see that I don't disagree at all with what you've listed.

jeremiah
Friday, January 17, 2003

But you just felt like sending me a little abuse?

Fair enough.

blah
Friday, January 17, 2003

The question is, do any of you *know* someone who's graduated from a Software Engineering department (not exactly what people here have proposed, but one that covers a year of intro to programming, then 3-4 years of design theories, methodologies, etc)?

Because I do, in fact I know a small cluster of such people from the same school.  Oddly enough, they seem to believe that because they know *how* to do UML diagrams, write good test cases, and use Rational software, they don't actually have to do it.  In fact, they run in fear from simple stuff like daily builds, explaining their designs to anyone else, regular use of source control, etc.

Perhaps my small sample is biased (in fact I'm sure it is in some manner), but it does tell me a few things.  Mainly: Four years, or even five, isn't enough to grasp theory, practice, and best practices.  Granted, the right people will keep learning outside of a university setting, as mentioned before.  Why people teach theory, I think, is that theory is the hardest / "least interesting" to grasp on your own time, while best practices are much easier to pick up (almost hard to avoid picking up!).

Graduate software engineering degrees, where people learn best practices, are starting to show up.  Not CS theory at the MS level, but design patterns, methodologies from agile to waterfall, requirements gathering, maybe a little bit of business stuff, maybe theory electives for people who weren't CS undergrads...  This, I think, makes sense, and there are a few out there.

I mean, we know CS is a new field because (unlike engineering) it's a four year program and (unlike all the other sciences == biology, chemistry, physics, etc.) you can make more than minimum wage soon after graduating from it. ;)

Mikayla
Friday, January 17, 2003

I recently went back to school as a 35 yo for CS/Math, having earned my degree in Aerospace engineering many years ago. I don't think there's anything in particular missing from the CS curricula. The thing that surprised me was the typical college student, more than anything. How quickly we forget what it was like to be 18-19, and juggling a pile of classes and a pile more distractions.

CS and math suffer more than most degrees from the almost universal max/min games that students play. As in, exactly how many days (or hours) before X do I need to start thinking about this to get grade Y. I'll be the first to admit that this was me at 18. But this is not how programming theory or math gets loaded into your personal toolbox. No amount of curricula twiddling is going to fix this reality.

Bottom line, there are two kinds of students ... the ones that really want to be there, and the ones that don't. The most important thing is that a CS professor (or any professor) refuses to teach down to appease the students that don't want to be there.

And its easy to tell if a prof is teaching down. My personal rule of thumb: you want to be in the section where more than half the class drops (as an undergraduate). My other rule of thumb, if the prof doesn't lecture on at least some meat on day one (and instead spends all the time going over BS about homework format or whatever) get the hell out. A prof that refuses to teach down will say something like, "ok, lets get right to it, we've got a LOT to cover this semester!" All the students that don't really want to be there groan, and grab their schedules looking for another section. We meed more classes with professors like THAT!

These days I'll sit through 4 or 5 sections of the same class at the start of the semester before deciding which one to go with. Taking a class for me now is a major investment (money, time away from my kids, my wife, my job). I NEED to have a good professor, and a good class or I burn out. And why-o-why didn't I understand this when I was 18.

Phil Aaronson
Friday, January 17, 2003

<i>Now, I understand the need for theory classes, don't get me wrong, but how can you take a Principles of Programming Languages class without writing at least a rudimentary parser, or a Databases class without writing a single line of actual code, or take a Graphics class without finding out how a ray tracer is actually *made*. </i>

Maybe the problem is with your program; in mine (University of Oklahoma) we did all of those.

Jason McCullough
Friday, January 24, 2003

*  Recent Topics

*  Fog Creek Home