Fog Creek Software
g
Discussion Board




I wasn't a CS / EE major, so what am I missing?

I was surprised how few other Humanities and/or Social Science degree-holders responded to this thread:

http://discuss.fogcreek.com/joelonsoftware/default.asp?cmd=show&ixPost=83163&ixReplies=14

I'm self-taught as a programmer and, for all intents and purposes, never took a comp sci class.

On one hand, I've always had this nagging feeling that I missed something that a formal education in comp sci. would have offered.

On the other, I'm not convinced that I'm really worse off for not knowing functional programming beyond tweaking my .emacs file, never having programmed in Assembly and being in ignorance of the formal proofs behind sorting algorithms?

I would imagine there's no "right" answer, and it's a balance between the two -- some academic comp sci is useful, some isn't. The problem is knowing what falls into which category.

JoS readers who do have a Comp Sci, EE or related degree: what do you think I -- a software programmer -- should look into and why? (Book recommendations are fine too. God bless Amazon marketplace and their used textbooks.)

Joe Grossberg
Wednesday, November 5, 2003

As a EE, the answer is

"nothing"

The only thing I got out of EE that's applicable to software development is how to work truth tables.

I learned more about software in my 11th grade Pascal class than my four years of EE.

That's why I'm so cynical about the job openings that require a BSEE - IMHO they're piling on the crowd, not really understanding what they're demanding.

Philo

Philo
Wednesday, November 5, 2003

As a CS major:

"A few things"

One of the first assignments I had out of college was to fix the output of a program that took 2 days to run in production.

Well, it's kind of hard to test a program when even your test data takes an hour to complete. So I broke out a profiling tool that we had worked with in college. I was able to get the entire program to run in about 20 minutes instead of 2 days. The person who wrote the original program had around 15 years of experience.

So for that case schooling won out over experience. I'm sure you could learn about profilers and code optimization on your own.

I also learned enough about C++ and OOP to pick up a few books like Design Patterns and be able to understand what the big deal was.

A few of the useful books I've read:
UML Distilled - Fowler
Refactoring - Fowler
Patterns of Enterprise Architecture - Fowler
Java Performance Tuning - Shirazi
Design Patterns - Gamma, etc...
Agile Software Development - Martin

Right now I mainly do enterprise applications so those are the books I find most useful.

I'm surprised Phil finds the EE degree useless. We did a lot of proofs and problem solving in my math and physics classes. Knowing how to find the coefficient of friction on an accident scene isn't directly applicable to programming, but the skill of extracting information from a problem set is kind of like reading/refining a requirements document.

NathanJ
Wednesday, November 5, 2003

I picked up a CS degree several years after completing a philosophy degree, these were the textbooks of my favorite classes:

Discrete Algorithmic Mathematics by Maurer, et al
Data Structures and Algorithm Analysis by Weiss
Database System Concepts by Silberschatz, et al
Operating System Concepts by Silberschatz, et al
Computer Organization and Design by Patterson, et al


Wednesday, November 5, 2003

"I'm surprised Phil finds the EE degree useless. We did a lot of proofs and problem solving in my math and physics classes"

...math and physics classes that are required of ANY engineering or physics majors. But the job openings don't say "BSCS or engineering degree required" - they specifically ask for *electrical* engineering. My reply was regarding the uniquely "E" part of "EE".

I suspect most non-EE's still think that learning the ways of trons and holes gives one some kind of godlike awareness of what's happening on the motherboard when one writes a linked list. It ain't so. ;-)

Philo

Philo
Wednesday, November 5, 2003

I don't think most CS degrees offer a whole lot of added benefit from what you get out in the workplace or from reading the right websites.  But it is no waste of time for those that have been through it:  Big-O notation is very useful concept, and knowing what data structures have which Big-O property for which operations is essential to properly choosing data structures and algorithms for a program where efficiency is of any concern.  It's good to have boolean algebra drilled into you a little, seems to come most in handy when trying to find the negation of something complex.  I like that I was shown how the crude reduction of a CPU works.  I was exposed to some good things in school, but never really learned them outright.  I was exposed to threads, sockets, and functional languages; but not to any sort of proficiency.

I think I took 2 software engineering classes and they were both a waste of time.  We did a bunch of Booch method diagrams and such (not so useful now that UML rules diagram land), actually I really like data flow diagrams.

I took a really good computer math elective that covered splines and over-fitting and floating point epsilon and such.  I wish I had had 2 or 3 semesters of it, to really learn those lessons well.  It's rare to get lessons like "You can write a formula that perfectly models last year's stock prices, but if you ask it to do this year's it will give you complete garbage."  I think vector algebra is really important to programs with any sort of intensive calculations.

Thinking back on it, it seems like most of school was getting a well rounded scientific education: 3 semesters hard science, a ton of math, some statistics.  They should have dropped some of the high math for some more applied math, specifically financial math, IMO.

I didn't learn a stitch of user interface programming, and never wrote a very big program in school at all.

Keith Wright
Wednesday, November 5, 2003

As far as the EE part, though my degree is a BSEE, my major was computer engineering.  I feel like the biggest thing I took away was learning how modern computers really work in detail.  I want to believe it's helped me as a programmer, though it's hard to know if all that time wouldn't have been better spent reading software engineering books or something.
I think the reason some employers require a BSEE is that it generally demonstrates that you can do something "hard", even though the specific knowledge it implies may not be directly relevant.

Ken
Wednesday, November 5, 2003

Then why not aerospace or marine engineering? Or astrophysics? All very hard...

Like I said, I believe it's a misguided thought of "computers have circuitry..."

Doesn't mean I don't take advantage of it. :-)

Philo

Philo
Wednesday, November 5, 2003

That's a good point, though I do remember a lot of the consulting companies who recruited at my school did generally look for people with engineering degrees of any kind, regardless of the type of job.  I imagine this type of requirement is more common for recent grads who don't have experience.  For software jobs that require several years experience, I agree the BSEE requiremant doesn't make a heck of a lot of sense.  But then I often think many of the requirements listed for software jobs don't make much sense.

Ken
Wednesday, November 5, 2003

I have both a BSCS and a BSEE.  That's how my school used to do Computer Engineering.

As you might guess, the CS provided much more practical programming experience.  You learn much more about ALL of the various components of CS (language theory, OSes, compilers, data structures and algorithms, etc.).  It's very hard to do that sort of academic learning at a job or on your own.  I know some people can do it, but it's much easier when your classwork makes you.

As for EE, I disagree with Philo, but only to a point.  There are two main divisions of EE, digital and analog.  The analog stuff (electromagnetism, circuit analysis, etc.) is pretty worthless in CS.  The digital stuff, like binary logic can be pretty useful. 

It also depends on what type of programming you are going to do.  I did real-time embedded stuff for the first 5 years of my career, so my EE knowledge came in very handy.  It helps to know what's going on when you hook up a logic analyzer to a board to see why your code isn't properly twiddling some device.

David
Wednesday, November 5, 2003

One more point - EE is definitely much harder than CS.  You have to pick up many more difficult concepts and apply them.  So, even though the work isn't DIRECTLY applicable to a degree in programming, if you make it through, it says something about you.  Sort of like working out for four years - you're gonna be pretty buff at the end.

David
Wednesday, November 5, 2003

I'm an EE graduate.

I've had some work acquaintances tell me at times that the value I added to the work I produced was "an engineer's touch".

When I pressed them on exactly what they meant, the response was generally that I was unique among co-workers in that I was a compulsive problem-solver to the core, and that I had "learned how to learn" - how to take semi-theoretical knowledge or basic technology and assemble something much more complex and useful from the individual pieces.

Shifting the perspective to my own viewpoint... one thing I did early in my career was transition from hardware work (long design cycles, not able to see results, only able to run computer models to simulate) to software development (opposite to hardware in every listed regard.) I felt that writing software was MUCH easier than hardware design because I could see fairly quickly what I was doing.

In later years, as I have professionally descended from big company valhalla to lame-o skunk works, I find that people without any degrees have a much, much harder time with simple principles like decomposition of functionality. An engineer in any branch generally learns that large things are built up out of smaller things. The people without this kind of "learned instinct" don't seem to understand that to reach a goal, the smallest units must be constructed out of building blocks and then fitted together.

Also, I find that informally educated people tend to not appreciate the costs of complexity. Spaghetti code and overengineered monstrosities come to mind.

I'm not saying that engineers or college educated people are infallible. Many use the title as a crutch to justify entitlement or prima donna behaviors and quite a few produce much crappier work than the best of the informal bunch. I'm just saying that it's always appeared to me that it is less of a stretch to get working, highly complex code out of an engineer or a computer scientist than it is out of someone who learned exclusively by doing.

PS: as I was writing this I was WELL AWARE of my viewpoint-relative bias. I am the center of the Ptolemaic solar system of my own creation, everyone else sux. hah hah ;-)

Bored Bystander
Wednesday, November 5, 2003

The groupies.

Hardware Guy
Wednesday, November 5, 2003

"Many use the title as a crutch to justify entitlement or prima donna behaviors"

Not me, buddy!

Philo, Esq.
BSEE, JD, MCSD

Philo
Wednesday, November 5, 2003

If I had to suggest a "short form" CS degree, I'd say that the benefits of the following classes more than justify the time and money:

Data Structures & Algorithms (Big O notation, comparing algorithms, data structures, and context)
Operating Systems (synchronization, process management)
Discrete Mathematics (graph theory comes up more than you'd imagine).

For someone with lots of work experience, the more direct programming classes are a bit redundant.  When I went back to school for CS, fearing that I was missing something at work, those three classes gave me the most bang for my buck.

Justin Johnson
Wednesday, November 5, 2003

Hopefully a broader vision than most people will
get on their own. Most people i interview with
CS or EE degrees aren't any good anyway.
Shove me through an art school and i still
won't be an artist.

son of parnas
Wednesday, November 5, 2003

You must not have seen what passes for art these days.  I don't think art schools teaches anyone how to be artists these days.  I guess we can be thankful that most CS programs try to teach you the trade to some degree.

Keith Wright
Wednesday, November 5, 2003

Most good engineering educations will teach you how to think and solve problems.  Programmers do not have the monopoly on these sort of things.

A good CS degree will teach you a lot of the finer points of programming that you don't pick up in practice.  Forcing you to write a lot of algorythms and analyze them instead of letting you use a standard library or copy it out of a reference text helps.  Forcing you to write your own database instead of just using an off-the-shelf one will help you understand better how it all fits together.

It's like coding assembly.  I can't point out 10 different ways that my code is better because I understand what happens underneath the covers, but because I understand the lower levels of abstraction, I will be able to better evaluate multiple options for coding something.

Flamebait Sr.
Wednesday, November 5, 2003

A couple other topics that it's well worth having gone to school for:

State machines. I use these ALL THE TIME, and would never have been able to figure it out on my own.

Building on that: Lexical analysis and parsing. I can't count the number of times I've seen "I want to use a regular expression to match this" questions come up, when when they really needed was a simple parse, not a regular expression.

Chris Tavares
Wednesday, November 5, 2003

I did a BS in math, and took a lot of CS courses (no ee)

worthwhile CS coursework:

theory of computation (state machines, etc)

the course i took based on SICP

hardware organization (something I would have
considered too mundane to figure out on my own)

compilers



worthless CS coursework:

both my freshman datastructures and algorithms courses
(the first course was basically remedial programming 101, and the algorithms course was similarily too easy)

networking course (I learned more reading cisco training materials)

software engineering course (what the? I can't remember doing anything in this course, and I got an A. I think we had to draw some boxes with lines pointing to each other, and an "outline")

ktm
Wednesday, November 5, 2003

These days art is a response to art in previous
days.  I am guessing you find the french
classical period real "art," but i would say
it is boring and formulaic, only showing
a mastery of technique.

son of parnas
Wednesday, November 5, 2003

Interesting comments about graph theory and state machines.  I've never come across a programming problem that I've used either.  I've probably encountered problems where one of them could have been applied, but I just never looked at them that way.

Mind sharing some examples to open my eyes?

Builder
Wednesday, November 5, 2003

I don't have degrees in CS or EE, so I don't know if my comments qualify.

There are two things that I got from my time in University:

* Learning how to think
* Learning how to learn.

Presumably these don't change much between disciplines.

Computer programming is such a large field that there is room enough for everybody who is or can become competent.

I only know the very basics of writing a compiler. I'd like to think that I could learn how to write a compiler if the need arose. It won't because, rather than write one myself, I'd either hire someone to do it, or acquire an existing product. That does not reduce my competence in any amount. Probably the person who is experienced in compiler writing would have to learn what I know in order to be able to do my job.

In todays climate, we need people who are intelligent enough to pick up what they need as quickly as possible. We should place as much emphasis, if not more, on people who are intelligent and motivated enough to learn how to do things which they cannot at present do. These are not qualities that are acquired through any University degree program.

Much of programming is "cross-discipline", meaning that you need both experience in programming as well as experience in the area where the software is used.

At my present job, we have a fair mix of both types: people who have BSCS and are picking up the industry experience, and people like myself with industry experience who are ramping up the computer programming expertise. Both types are required to run a successful business.

AnMFCAndJavaProgrammer
Wednesday, November 5, 2003

Simulations, real-time control...

Rick
Wednesday, November 5, 2003

"Interesting comments about graph theory and state machines.  I've never come across a programming problem that I've used either.  "

A login page on a website.

ktm
Wednesday, November 5, 2003

Modems require state machines to handle them.

Philo

Philo
Wednesday, November 5, 2003

I did EE with one year of CS plus a masters in another field.

The math was useful for the sort of work I do, but could have come from any science or arts program. In EE, number systems and binary logic are one useful topic that it must be tricky to master if you just come across them on your own.

The programming in the CS was great fun, and it's what sent me in my current direction, but it was useless, really. I learnt all my development and software engineering afterwards, on my own.

The statement someone made that CS teaches how to specify problems is silly. All courses teach the same concept, and most in a much better way. From what I've seen in industry, I think narrowness is a big problem for CS grads. Not sure why.

Looking at things now, I think useful training for development includes one or two years of math, business or CS combined with any sustained training program of three or more years, regardless of the field it's in. For harder problems, research degrees are sometimes useful. Coursework higher degrees can indicate lack of learning ability.


Wednesday, November 5, 2003

State machines come up all the time. Any time you need to implement a communications protocol. Complex changes in behavior over time can often be modeled (and implemented as) a state machine. Granted, they probably don't come into play much in the typical data-entry application, but get into any kind of real time stuff and they're everywhere.

As for parsing, any kind of text recognition. I spent some time doing developer tools, so of course I needed to know parsing there. Also, you know the perennial "How do I write a regular expression to match an email address?" question? The reason that using regexs to do this are so hard is that email addresses are not a regular language, so regexes *cannot* match email addresses.

On the other hand, it's maybe two-dozen lines of YACC code to get an address parser that can handle anything RFC 822 can throw at it.

You wouldn't know the difference, or when to apply the different techniques, without that boring computability class. ;-)

Chris Tavares
Wednesday, November 5, 2003

Anyone doing any non-trivial development learns state machines, whether they know the term or not. I must also say that I have done so much parsing you wouldn't believe. Learnt it all myself. I don't see what the fuss is but I do gather that some people have trouble with it. And I'm not talking about using libraries.


Wednesday, November 5, 2003

Asynchronous parsing is where you see a lot of state machines.

christopher baus (www.summitsage.com)
Wednesday, November 5, 2003

Game programming also involves a lot of state machines, typically used to control the behavior of objects and creatures in the environment.

T. Norman
Wednesday, November 5, 2003

To answer the original question:

Go to the web site of a university with a reputable CS program, and look through their course catalog for the descriptions of the courses required for a CS degree (if it's not downloadable, find another university with a downloadable catalog).

T. Norman
Wednesday, November 5, 2003

"There are two things that I got from my time in University:

* Learning how to think
* Learning how to learn."

That's primary school level stuff though. If you had to wait to University to learn that, it shows a serious failing of the school system.

Sum Dum Gai
Wednesday, November 5, 2003

I took my first degree in Computer Engineering, which is a blend between CS and EE.

I don't know if CS gives you all that much value above self study, but I think an engineering degree certainly does.

One of the biggest reasons is that you get to play with and learn on equipment that most people will not have at home.  You can easily buy your own PC and set up compilers and software development tools on them.  For a bit more money you can even play with clustering and fail over etc. especially now with so much Free software around.

Far fewer people are likely to have things like signal generators, logic analyzers, spectrum analyzers, in-circuit emulators, EPROM burners and so on at home.

Knowing how to use these tools may not be all that handy for the database folk, but they can be invaluable when you are trying to figure out whether you set up the memory registers wrong and that's why you are getting the wrong bits in the upper segment of your accesses to external memory.  Or the black box you are talking to is actually sending data in little endian order with a 32 byte preamble where you expected big endian and a 24 byte preamble etc.

The other thing about an engineering education is that it grounds you in the real, physical world more than most degrees (both CS and arts).  You never forget that the math and symbols you are manipulating are approximations to real phenomena.  I find that with "high level" software, the abstrations can add up pretty quickly.  I find that even CS people will tend to do things like assume motors stop moving immediately after you send out a command to it (kind of a binary view of the world I guess :)

The reason you'd want to do this at school instead of through self study is because (other than not having the equipment for experiments on your own) it is mentally very tough!  I know a lot of people who self study programming or software design, but I don't know anyone who learned system control theory, or digital signal processing by themselves.  It takes a lot of discipline to do that without the pressure of exams.

Last, going to engineering school gives you domain knowledge that would be hard to gain otherwise.  Being a self taught programmer is kind of like being a self taught electronics tinkerer.  You may be able to build circuits and programs to do what you want, but it's extremely difficult to study things like the aforementioned DSP, communications and information theory on your own, but thy are things you need to know, or at least to understand the key concepts of when you are writing software for things like mobile telephony, image and voice/sound processing, machinery/automation control and so on.

So really, it all comes down to the kinds of jobs you want to do...  Banking middleware, degree is probably only moderately useful.  Automative electronics, probably pretty useful.

radius
Wednesday, November 5, 2003

I taught myself digital signal processing. One just needs the following book:

http://www.amazon.com/exec/obidos/tg/detail/-/0201634678/qid=1068091974/sr=1-1/ref=sr_1_1/102-9978736-0899325?v=glance&s=books

and a copy of matlab.

Most electrical engineers don't learn DSP, either, because most textbooks used at universities are truly awful.  It isn't impossible to learn this stuff on your own, but it does require discipline. And it helps to have a math degree (I did),  because math degrees are much harder than either CS or Engineering degrees, anyway. :-P 

ktm
Wednesday, November 5, 2003

I've also learnt some pretty hard stuff on my own, in a field like DSP but a bit different. Maybe we could get over this idea that it's only possible to learn stuff if you've got exams coming up?


Thursday, November 6, 2003

One of the best things that I took away from school had nothing to do with the coursework, really. 

Having a lot of time to spend talking things over with very sharp people turned out to be enormously valuable for me.  Used to be that you could walk into the students' lounge at almost any hour and find folks in there talking over one interesting problem or another.  You could listen in or join the huddle and brainstorm with them.  Sometimes there'd be several of these little clusters in there kicking an idea or a problem around.  Picked up a lot of little tidbits that you couldn't get from a textbook or lecture, learned a lot about interacting with peers, and saw a lot of different approaches to problem solving in action.  The best thing, though, and I'm not afraid to admit it, was that it was always a lot of fun, even when locking horns with someone holding an opposing view.

Maybe that's why I come here, though I must confess that the experience was more enjoyable and more educational in person.

fond memories
Thursday, November 6, 2003

The most practical thing I got out of my compsci honours degree was getting to do this series of projects: 1) write a formal specification for an abstract machine 2) write an interpreter for the language of that machine 3) write a compiler from a simplified subset of pascal to that machine language.

Putting all three things together in a very concrete way and learning by doing were very valuable.

What you gain from doing a PhD is much more difficult to assess because what you might be doing can vary a lot.

Dafydd Rees
Tuesday, November 11, 2003

*  Recent Topics

*  Fog Creek Home