Computer Science vs. Computer Engineering?
Dan B asks: "Like many other students across America, I plan on attending college as a freshman next fall. I am very interested in computers (I only reload the Slashdot site every five minutes), but there is something that perplexes me: what major should I choose? It seems that many companies are looking for computer scientists, but would they be desperate enough to accept computer engineers? What is the difference anyway? Well, a college guidebook could tell you 'computer engineering deals mostly with hardware' and 'computer science deals mostly with software', but that isn't clear enough for me. I believe the Slashdot community would be best fit to offer a more in depth perspective on the two majors."
Computer engineers deal with logical bits and gates: they build the I/O that computer scientists talk to, and they design things to work better and faster than before. Computer scientists (of which I am a part) deal with the same type of information, but we deal with it on a different level: we study programming language theory, algorithms, data structures and the like. How do you contain that data? How do you sort it? Etc.
The voices in my head don't like you
If you are more interrested in writing Windows (Linux) Apps, Web stuff, or DB stuff, get a CSc degree.
If you want to work on embedded systems, or on DSP stuff, get a CEng degree.
If you aren't sure, get a CSc degree. If you aren't good at Math, get a CSc degree, a CEng degree is four years of math.
90% of jobs can be done by either a CSc or a CEng, and 5 years after you grad it won't really matter, it'll be your exerience that counts.
i started of in ceng and switched to csc... you need a _huge_ ego to do ceng.
First, unless you absolutely must, don't declare a major. Just take required classes your first semester to get them out of the way. If the school is large enough, every class will be offered nearly every semester anyway so you'll be in no danger of falling behind.
Second, talk to your advisor. This is invaluable. They will be able to explain the your different options (or point you to someone who can).
Third, as a quick guide. If you are interested in "computers" take an intro class that covers a wide range of topics so you'll get a feel for what's available. Also talk to fellow students who have related majors.
If you are interested in "programming" just go ahead and start in on the Computer Science major and decide on a concentration later. I would very strongly warn you against some kind of vo-tech, "we'll teach you VB and send you out into the world" type of major. Take the full science path--it's definitely worth it.
--
Non-meta-modded "Overrated" mods are killing Slashdot
Non-meta-modded "Overrated" mods are killing Slashdot
(Hey Ryan! Here's your proof!)
Well, semantically, CS deals with the "science" of computers, while CE deals with the engineering aspects. If the academic computer tracks stuck the the normal definitions, the CS track would stress algorithm development, mathematical analysis, computational theory, etc., while the CE track would stress creating software and hardware systems to solve problems in the real world.
In reality, there's very little difference between the two majors. Both will teach you basic computer programming, a little bit of hardware, and some of the supporting math. A CE degree will probably require you to take a few more engineering courses, while a CS degree might have some more math. Really, I would consider those two degrees interchangeable, with the specific education you get depending more on the school you attend than the name of the degree.
My personal opinion? Get a physics or math degree with a CS/CE double major/minor if you want very high-level technical programming jobs (in an engineering firm, for example) or if you want to do academic work. Get a CS/CE degree (don't really think it matters which) if you want to be a software engineer/software developer. If you just want to make some quick money and have no strong love for computers, get a quick certification. Note that these are just general guidelines... I know several great technical programmers who are entirely self taught, and I know one guy with a BS in CS and and MS in Math that can barely write a "Hello World" program in C.
Please for the love of God don't be asking which one will make you more money. People wonder why managers are farming out good jobs to India, it's because American kids are walking out of college and saying "Whaddya mean you're not gonna pay me $100k? What did I go to school for?"
www.HearMySoulSpeak.com
I'm currently a Computer Engineering student, so I think I have some qualifications to describe the difference.
A Computer Science major deals primarily with programming and algorithms. They write programs, Operating systems, high-level drivers, etc.
An Electrical Engineer deals primarily with hardware - logic gates, and designing hardware that will perform algorithmic computations. IE. they design chips. These are the guys who work for Intel, AMD, etc. They don't worry much about programming.
A Computer Engineer is an Electrical Engineer that specializes in programmable computer devices, and therefore programming. So a CompE is mainly an Electrical Engineer, but also does a great deal of programming. Some CompE's design hardware, others write extremely low-level software, drivers, etc. Computer Engineers quite often work in the embedded market, as they have the skills to do both the hardware and software engineering involved.
Think of an Electrical Engineer as a geek who designs computer chips with a minor in math.
Think of a Computer Engineer as a geek who designs computer chips with a minor in Computer Science.
Think of a Computer Science major as a geek who programs computers, and doesn't design hardware.
And, in my opinion, it's funner to be a CompE because you can be doing hardware on one project, then software on the next.
-- Sometimes you have to turn the lights off in order to see.
Don't listen to this. This is the reason that so much software sucks. And so many web pages. People that don't really understand programming and computers write ugly, kludgy code, and they're lucky when it works.
Computers are complex. You need to know a lot about everything. To write efficient programs you need to know how CPU's work. To make efficient CPU's you need to know how high level programming works. That's why a lot of CS and CE degrees differ by a small number of courses.
are you a dirtyfreak? I am.
I'm not sure whether this was a troll or not. Anyway..
There is a big difference between learning programming on the job en being an educated computer scientist.
I don't mean to downplay possible intelligence, speed, intuitiveness, adaptiveness, etc. of self-made programmers, but you just cannot replace a university degree computer science with work experience.
A good computer science curriculum includes mathematics (calculus, linear algebra, algebra, discrete math, logic, formal languages). No matter if you directly use this math after your education or not, you will be trained in logical thinking by having followed these courses. It makes you aware of current problems in computer science and mathematics and enables you to recognize such problems on the job so that you will not try to re-invent the wheel.
Furthermore you'll learn lots about how computers, networks, operating systems etc. actually work. Although you may know a lot about computer without having studied them in university, you'll be surprised how much new stuff you'll learn when studying computer science. I knew a lot about computers before starting my studies, but know I am able to build a 1 or more bit CPU by myself if it was necessary. I would use the book of course, but I know down to the digital logic level every detail of how a modern microprocessor works. As for computer networks: my programming assignment consist of building my own networking stack including ARP/RARP, IP (with fragmenting/assembling), UDP and a TFTP server and client on top of that. The only thing I get is the ethernet driver, I have to build the rest myself.
Even then, programming is maybe 25% of the complete curriculum.
There's no way you'll get this knowledge when just doing programming on the job 5 days a week, without formal studying of the subjects.
This is a typical manager/employer viewpoint.
Programming is much more like artistic composition within contraints (which happen to be mathematically related).
Way back when IBM needed to find the first programmers to code for their new computer systems, they searched for a professional field that matched the requirements for writing software.
Do you know who they actively sought? It was not mathematicians, it was musicians.
Music has a very structured/math like feel to it at the lowest level, but the true expression of music is not number crunching, but artistic expression within contraints.
As for your assertion that math grads make the best programmers, I think you have a far to narrow and biased view of the skills and talents required to produce good software.
I've watched a CS and EE department fight over how a computer engineering degree is defined, and what I really got out of it is that it depends on the professors that are in the department.
In general, a CE (computer engineering) degree is a digital design degree version of EE with a stronger emphasis on software and systems. Many schools though concentrate mostly on systems and software, while others are truly about architecture and hardware issues such as interfaces and integration. If there is a professors that teachs a lot of course on OS design, and none on the use of microcontrollers then it would be a very different degree from others, but a very valid degree.
I have a EE background with a strong emphasis in computer design and software due to a few professors with similiar interest. If CE was offered when I got my BS I probably would have been a fairly good fit for it. As a EE though I feel I got more of a background in the way things work than a CE, but no idea about higher level things like compiler design, OS (although I did work with real time executives), or computer graphics. So given that I'd say the following:
CS: If you are interested in programming languages, compilers, OS, graphics, and studies of general algorithms.
CE: If you like computer control, design, interfacing. In general a healthy mix of hardware and software leaning towards the later.
EE: If you want to know how all of the underlying technology works, but aren't interested in things like programming language design or databases. Up until a few years ago you could graduate from almost any EE program with very little programming, but this is changing quickly.
Most important though is to look at who teaches what courses and what their teaching and research interest are. If they are in stuff you don't like then you probably won't like the degree you'd get from them.
OK, i think there is a major assuption many people here are making: you can only learn software design theory and/or discipline in an accredited CS program.
Yes, programming can like compared to a skill.
Yes, self-trained programmers can pick up really bad habits.
Yes, good design and problem-solving techniques are often taught in a CS curriculums.
However, there is no reason these skills cannot be learned by intelligent and motivated individuals outside of the ivory tower.
Moreover, going through a CS program is not a guarantee that you will be a good software programmer or designer.
I'm a successful programmer and software architect that has created well-designed and reliable systems for businesses. And i got a B.A. in Anthropology. Programming used to be a hobby to me. I became more interested in it at the end of my college education. After that, i learned "on my own" and took a few more classes, and got into professional programming. I found that even for "professionals", you have to be continually learning new techniques and studying new ways to design things. My liberal arts education served me well in this. I think learning on your own really means learning from others through books and the internet, and doing your own self-created experiments.
I think if i were a CS major, i would have got a programming job sooner, but i would have to learn on my own to be as good as i am now anyway.
There are many ways you can reach the goal you want to acheive.