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
Give up now! If you "only reload the Slashdot site every five minutes" you will have no time for your classes and it would be a waste of money to go to college! =D
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!)
You can become a computer programmer anytime. It's like carpentry, you learn on the job.
You can become a physicist anytime. It's a science like Computer Science, which is like carpentry, you learn on the job.
You don't learn CS on the job. You may learn some programming, but that is a far cry from CS theory.
Real Computer Scientists don't use computers.
Dancin Santa
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.
'fraid I've no grand advice other than to suggest you take the myth of a SW labout shortage into account.
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.
Any good course in these subjects will contain a fair bit of programming along the way, with the benefit that they won't tell you how to do it. You'll get a good grounding in critical thinking and methodological approaches to solving problems, and you get to teach yourself programming to do the course work, which is how 90% of real-world code gets written - i.e. to solve a problem.
Disclaimer: I am a Maths graduate. I didn't take the programming options because they cut into my drinking time too much.
--
#include "stdio.h"
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.
The fields of computer science (CS), computer engineering (CE) and electrical engineering (EE) are very inter-related.
In a nutshell, CS is pure math/software (do NOT think CS is just programming), EE is pure hardware (from to atomic level up), and CE is basically a blend.
CS majors have very little hardware (I think one, maybe two digital logic courses is all).
EE major have very little software (a little assembler in a uP course, and one or two C/Java courses).
CE people do both. For example, at the University of Waterloo CE program, hardware and software is basically equally split, with a slight emphasis on hardware.
The problem is that, while CS and EE are basically the same everywhere, CE is _not_ the same everywhere.
Keep in mind that while a CE (and even EE, to some extent) can easily move into most programming jobs, a CS will find it difficult, at best, to move into hardware fields. CE/EE also have the advantage of understanding how hardware works, so are often preferred for writing low-level code (such as drivers), and will be better at debugging said code on a product.
If you like hardware and hate software, choose EE. If you don't like hardware, choose CS. If you like both, choose CE.
FYI, I am currently in a computer engineering program, but I had considered myself destined for computer science for all but the last bit of high school. I have zero regrets about choosing CE or CS (I know quite a few CS majors).
Be a liberal arts major. You can become a computer programmer anytime. It's like carpentry, you learn on the job.
Don't listen to this!! The absolute worst people I've programmed with have been these sorts of people... who think they can slack through college and the "pick up this programming thing" on the job. They absolutely lack the discipline of programming, don't plan their programs out well enough, and lack the insight into useful algorithms and methods to make programs work. These sorts of people will become managers and lack the knowledge of true software engineering to manage effectively.
If you want to get into programming, go into Computer Science. If you want to get into the hardware engineering for computers go into Electrical Engineering, since I feel the "Computer Engineering" degree doesn't go into great depth in either CS or EE (or so the programs I've been exposed to have been)
1.3L, 3 moving parts, 280 HP, no Turbos, wanna Race? RotaryNe
I am a 4'th year Computer engineering major.
I've had to deal with the same questions as you and it boils down to how passionate you are about certain aspects of the computer world. Be advised this is not the be-all end-all of advice.. but it may help you:
a) Do you love hardware? Do you long to learn how your motherboard works? How a CPU is built? How do you create those chips on your motherboard? Do you find electronics interesting?
b) Do you love programming? Do you strive to solve complex programming issues? Do you write tools or programs in your spare time?
If you agree with A, choose Computer engineering.
If you agree with B, choose computer science. Computer science, in most programs, is MOSTLY programming theory, with very little hardware.
Choosing route A will lead you to learn basics about computer science, but as well how computers were first designed, to how complex today's chips are, and methods on how to design them. You will do far less programming than a CS major, but you should still come out with the ability to write good programs, as well as hardware design.
There are degrees which combine the best of both software and hardware, being a Canadian I can only point out two examples. These are both Engineering examples.
Sysyms & Computing at University of Guelph
Systems Design Engineering at University of Waterloo
The typical "CS is software, CE is hardware" is rather vague and almost stereotypical, but I think it's reasonably accurate.
As far as software courses go, the core courses here include Java, data structures and algorithms, an OS course, and a software engineering course. 4th year elective courses include AI, database, distributed systems programming and more software engineering courses
I myself graduated from CS at Waterloo a few years back. (For those who don't know, Waterloo is, deservedly or not, arguably or not, Canada's most reputable university for computer-related studies. It's a couple of hours drive from Toronto.)
I agree that CE is a bit broader than CS, but I'd disagree that CE is simply a superset of CS (as somebody else, not you, has stated).
At Waterloo, the difference is not just one of focus, but of administration: CS is part of the Mathematics faculty, and CE is a part of the Engineering faculty. I understand Waterloo is one of the few universities that has an entire faculty devoted to math.
The CS curriculum there includes very math-like subjects such as computing theory and abstract machines like Turing machines and finite state machines. And obviously, there are more pure math courses.
P.S. From one Waterloo alumnus to another (soon-to-be), get ready for lots of letters from UW begging for money...
--
Accountability on the heads of the powerful.
Power in the hands of the accountable.
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.
As far as the suggestion about the liberal arts degree. If you pick up a degree in English or Philosophy or some other liberal arts area, I think you better prepare yourself for the future. A lot of the work that is done by people in IT doesn't require you to have a CS degree. You can learn on the job, employers will send you to MCSE or Linux training, etc. and you can pick up certificates. When the computer market takes a downturn (as it is at the moment, at least in the dot-com sector, cross your fingers Slashdot :) ), the ability to move into completely different fields may outweigh the advantages of being an "expert" in the field you were working in (and yes, I was just laid off from a dot-com where I had been working for 4 years, so I know a little about this).
Don't worry about what looks good to HR, whatever you do. People in HR are idiots when it comes to hiring. They take a laundry list that is sometimes given to them by the person you'd actually work for, but oftentimes they just steal stuff from other companies job postings. The HR types can't tell the difference between CS, CE, and the hole in their ass. If all you're worried about is impressing HR, save your money, spend a couple thousand on getting a few of those certificates with the fancy letters (MCSE, DBA, A+, etc.) and you'll get a job.
As far as what you do in school, pick the major that you enjoy the most and that you'll actually finish. If you go into CS because it will look good for clueless HR types and you hate programming, you won't be a very good programmer and you may not even get your degree (it's easy to get burned out). A degree in a "non-profitable" major is better than no degree because you can then go back to school for your Master's, when you really start to learn about the subject at hand.
And besides, even in the technological future, the world will always need people who know how to write...
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.
And you just cannot replace work experience with a university degree in computer science. If given the opportunity to hire someone with four years of professional programming experience or someone with a four year CS degree, I will take the person with the experience. I don't need someone who knows language theory, calculus, and how to how to reinvent network stacks. I need someone with practical experience related to the work they will be assigned. I have seen degreed engineers completely blow projects because they lacked the professional experience to be successful. They did not understand schedules, budgets, or office politics. One spent days reinventing something rather than just purchasing a commercial library. He thought it would save us money!
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.
What makes you think that universities are able to attract skilled computer science professionals to teach there? Most professors make a pittance compared to what a talented software engineer can make in the private sector.
I dropped out of college to take a software engineering job. I learned far more in that job than I would have ever learned in college. The professors and instructors that I had in college knew less about software/firmware engineering than I did and some of them were downright incompetent. The inefficient, brute-force programming demonstrated by some of them is probably to blame for the code bloat that has caused common business applications to require 650MB CD-ROMS as distribution media.
While it would be absurd to condemn all degreed engineers or college professors, assuming that people with college degrees in computer science will be better software engineers is equally ludicrous.
Actually, the curriculum for a computer engineer or computer scientist can vary greatly from one university to another. At the University of Illinois, for example, the computer science department is in the college of engineering. This means that we CS guys go through the same physics and math as all the other engineers in our college. This translates to five plus semesters of math, all the physics you can stand (and then some), chemistry... well, you get the idea. There is also a great deal of theory in general ideas of computer science as opposed to just straight coding. Computer architecture courses are also a big part of the curriculum. Computer science and computer engineering are different, though related, paths. I think it would be a mistake to say one or the other was inherently more difficult than the other.
Ask Slashdot: Computer Science vs. Sex?
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: why can't I get any? It seems that many companies are looking for computer scientists, but would any girls be desperate enough to accept one? What is the difference anyway? Well, a college guidebook could tell you 'computer engineering deals mostly with hardware' and 'girls deal mostly with shopping and makeup', 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 options."
--
--
"I personal[ly] think Unix is "superior" because on LSD it tastes like Blue." -- jbarnett