

What's lacking in CS Degrees nowadays (Part 1) - jseliger
http://theshyam.com/2009/07/whats-lacking-in-cs-degrees-nowadays-part-1

======
aidenn0
I used to think that CS programs need reform for this very reason. Now I've
turned around completely.

Colleges are optimized for getting broad ideas and theories across. Theory of
computation, algorithms, etc. are necessary for programming.

The point this article makes is that those ideas and theories are not
sufficient for being a professional programmer. So what? Almost all
engineering fields require some sort of on-the-job training. For software
development, it's about writing maintainable code. I don't think this is
something that can be taught easily in a CS program, and you'd have to stop
teaching something else to do so (probably lots of something elses, since I
don't see how you could do it in one semester).

Furthermore, either the majority, or a substantial minority of CS PhDs can't
do this right, so it's strange to think that they will be able to teach this.

~~~
Xichekolas
Well really the issue is that the field needs to be split.

I too once thought my CS undergrad was worthless because it was all this
theory and no practice (at least not practice at inheriting bad code,
improving it, and leaving good code to someone else). But really the problem
was that I went into CS thinking I was going to get a degree in Software
Engineering. They are in fact very different things, and should be different
degrees in my opinion.

Just like there is a different degree for Math and Accounting, or Architecture
and Architectural Engineering, there is a pretty big gap between CS and
Software Engineering. Of course they have things in common, and could share
many introductory classes, but separating them would make it more clear up
front what you are getting yourself into, and make it more clear at the end
what you actually learned.

That said, I'm glad that separation hadn't happened when I was an undergrad. I
went into college thinking that I wanted to be a Software Engineer, and was
fairly disappointed to 'waste all my time' on this theory stuff. But now, a
few years after graduating, I find the theory much more engaging, and am going
back to grad school for more of it. If I had had the option of a Software
Engineering degree when I started, I might never have discovered the fun that
is CS.

~~~
ja27
Exactly. I see "Computer Science" degrees being used for 3 distinct purposes.

First is what I consider the primary use for a CS degree: researching the
science of computing. This includes all the specialties, from AI to Algorithms
to Databases to whatever, but it's different than the next two. A true CS
major should primarily be a research scientist but possibly a software
architect. Chances are good that a BS CS isn't that employable in that role
and would require graduate school for more depth.

Then there's software engineers that specialize in designing and delivering
software. There's certainly some overlap with the CS degree coursework.

Then there are computer programmers that just write code. These don't need a
4-year degree. They could be trained at junior colleges or even modern trade
schools.

So if I compare that three-fold path to electronics, the CS degree is closer
to a degree in physics, the software engineering degree is closer to a EE
degree, and the computer programmer went to soldering school (or was trained
on a wave solder machine). EE students take physics classes, but then branch
off into "applied physics" specialties.

~~~
aidenn0
The danger here is the temptation to neglect some of the CS things that are
important.

Analysis of algorithms is one of those things that is super important, yet it
requires some discrete math and theory of computation.

Strangely enough, the classes that were most useful to me now as a developer
were the more theory oriented ones. The "real-world" type classes were all
either out-of-date or just too ivory tower to apply.

------
mquander
I strongly disagree that universities should be trade schools whose objective
is to prepare students for the "industry." Aren't there loftier goals in life?

~~~
Xichekolas
I agree with you, but the reality is that most people go to college 'to get a
good job'. So most people expect college to train them for that job, and most
employers have come to expect people to hit the ground running.

My grandfather started working as a draftsman for a pipeline company after the
Korean War. He had nothing more than a high school diploma, and he said he
took the job because "it paid $3 an hour and I liked to draw". He spent the
first year being trained in a special facility the company had set up just for
that purpose. What company does that nowdays? I'm sure there has to be some,
but it's far from the norm.

~~~
scott_s
I think the expectation for any engineer fresh out of school is that they will
need some on-the-job training to learn how to be an engineer in practice.

~~~
timwiseman
Yes, but the key word is _some_. There is a major difference between expecting
someone to grow through experience and giving them some initial guidance and
training _on that specific job_ and teaching someone everything they need to
know in practice when they have some hazy idea of the background theory.

This is particularly true in software. I do not know about other companies,
but when I got my first "real programming job" I was given two weeks of on the
job training. That focused on things like that particular company's code
layout standard, naming conventions, an overview of the code base already
written for the piece I would be working on, and some of the HR/administration
requirements and procedures.

I was expected to know how to program already.

~~~
scott_s
"Programming" and "Software Engineering" are different things.

Are there any engineers in the audience - not software engineers, or even
computer engineers, but mechanical, electrical or civil engineers? My guess is
that there's about the same level of "what you learned in school is never
enough for practice" as with the "real" engineering disciplines, but I don't
have any experience with it myself.

~~~
timwiseman
_"Programming" and "Software Engineering" are different things._

Very true, but beside the point. My point is that while some exceptions do
exist, most companies expect you to start knowing how to do at least the
basics of your job.

I laid out my experiences when I was starting as a programmer to illustrate
the level of on-the-job-training common. That was the last job I had any
official OJT and the last one I had that was remotely entry level. Since then,
I haven't even been given that kind of official walk through the code and
their standards. I have been handed problems to solve and either given or
ended up writing their formatting standards/naming conventions.

Of course, I deliberately try to find jobs with small organizations or small,
insulated sub-organizations within larger companies since I think small teams
tend to work best, so YMMV.

As a side note (now I'm going off point a little bit), most people I talk to
do not currently consider "Software Engineer" an entry level position but
rather something worked up to after doing things like programming. This may
change if there was a more focused specialty in college.

------
sophacles
I find this to be sadly true. I work for a university, writing software for
research groups. I only have a Bachelor's degree, and many of the people I
work with are working toward's ph.d.s or already have them and are doing post-
docs. What they don't have is practical programming knowledge. I spent 3 hours
yesterday convincing a group of grad students that the just because the
library we are working with claims to be standards compliant does not mean
that it is. I even wrote code to demonstrate how the library was broken and
the simple steps to work around it. The other group members refused to believe
the real life results, because the documentation and some ph.d. (who wrote the
docs) said otherwise. The worst part of this is: it is not even a core bit of
the research, it should be simple to say: hey this 3rd party thing is broken,
but when we do foo, we get the behavior we want.

I firmly believe every CS degree should include a practical component such as
internships, or a demonstration of skills by working on OSS or similar. This
would not only help cement the theory, but also help with practical issues
like making code maintainable. Most current curriculums use throwaway homework
assignments, encouraging and reinforcing ugly code.

~~~
Maro
I agree... instead of trying to make up projects, schools should just send
students on internship gigs at the end of 3rd and 4th year.

~~~
Eastbeast314
I had 6 internships under my belt by college graduation and they taught me a
lot. However, by and large, I learned more about workplaces and teamwork than
about difficult programming situations. Internships, in most of my experience,
don't encourage really hard programming work.

I got that with my CS degree. The theory classes were 7 out of the 15 classes
I took, but the programming classes were just as intense. We did complex image
recognition in groups in Java the first year, tons of Scheme and Oz to learn
concepts, and then wrote a whole networking stack and basic Linux OS in C. The
latter two projects were significantly harder than anything I've done at an
internship and required teamwork and a great deal of self-teaching.

It may be that my experience was abnormal (the school had a small but
recognized CS dept), but I got the meat of my practical programming skills at
school (ignoring independent work for the sake of focused discussion).
Internships were certainly useful - but in my reflections I don't think they
increased my programming power, if you will, all that much compared to school.

------
CGamesPlay
I've been programming as a hobby for years, am now a junior in a CS program
and am consistently disappointed by the level of difficulty in my classes at
school. When we do have to program, the grading criteria is so loose that it's
difficult to fail at all.

~~~
tokenadult
Where are you majoring in CS?

What are the names of some of the classes you have taken in your program?

------
alexgartrell
For my Software Engineering class, we had to make a contribution to an open
source project. Firefox is about as "legacy system" as you get without
learning COBOL.

I think the better question is why didn't this guy seek out the MULTIPLE
opportunities to do "real" development (Open Source, _Good_ internships, etc?

It's not as if we're all (College CS Majors) twiddling our thumbs and being
useless all year long.

------
nwjsmith
I'm a CS undergrad, and I'm working building software in the 'real world' for
the summer. There's no way they could teach this kind of experience in the
classroom or with projects. I like the idea of OSS work as a course
requirement, but the only way to learn how to _really_ program is to _really
program_.

------
paulgb
I have mixed feelings about this. It sounds like the author's needs are better
suited to a degree in software engineering than computer science. A CS degree
is not a degree in programming or software development, even though that's the
path many people take.

~~~
lallysingh
Indeed. The specific stuff you get at a code review depends completely on who
else is on your team -- stuff that's great at one place is terrible at
another. It's stuff you pick up from the specific software industry you join
when you get out of school, web, embedded, desktop, whatever.

The stuff you learn in school is useful for any of these, and is the same for
all of them. Equally important, you can really tell who's been through those
courses or not, independent of how well their code fits the normal
maintainability or performance requirements. Higher-level concepts are just
lost on them, or, if they've managed to pick some of it up informally, so
intermangled with other conceptually-different topics that clear thinking and
analysis is nearly impossible.

------
amelim
Here is the link to Part 2 [http://theshyam.com/2009/07/what-could-be-done-to-
improve-cs...](http://theshyam.com/2009/07/what-could-be-done-to-improve-cs-
degrees-part-2/)

