Best major for operating systems/embedded systems programming?

<p>I'm applying to college next year and have interest in computer science. Though I was originally interested in applications software engineering, my interests have gotten lower and lower (lower in the sense of closer and closer to the hardware, with less layers of abstraction in programming) the more I've done private studies into the field. I am VERY interested in how operating systems work and are designed, and especially their relationship to the hardware. For similar reasons I am interested in embedded systems programming, instructing the hardware directly. I have yet to even comprehend how machine code becomes electrical impulses but the more I learn the more interesting it gets! I have always figured I would major in computer science but now I'm wondering if I should major in computer engineering? I want to learn assembly language, and C (and C++ of course). I want to have a good knowledge of the hardware so as to best optimize my low-level software to it. But at the same time I don't want to DESIGN the hardware. Only work closely with it through very low-level software design. Do I major in computer science? Computer Engineering? Major in one, minor in the other? Sorry this is so long, it's my first post and I appreciate any advice you have to offer!</p>

<p>You will learn C, C++, Assembly Language, Computer Architecture in both comp. sci. and comp. eng. The biggest difference between the two is that comp. eng. teaches electronics and hardware design. Comp. Sci. teaches database, artificial intelligence, computer security/cryptography, computer graphics. The curriculums vary depending on which school you go to, It seems that what you want is between both. </p>

<p>I don’t think you should minor in any because their is so much overlapn that most schools will not allow it. computer engineering is pretty much take 60-70% EE classes and 30-40% CS classes depending on the school. They are both good majors for embedded systems.</p>

<p>Either will work, if you can include the following courses: operating systems, embedded systems, computer architecture, digital systems.</p>

<p>However, if you want to focus mainly on software, you may want to choose computer science (which usually has a more software oriented curriculum) and include other useful courses like algorithms, networks, databases, security, and software engineering. A computer engineering curriculum is more likely to include additional electronics and integrated circuits courses.</p>

<p>Thanks for the response lightnin. I have heard that computer science majors have no idea what is going on “under the hood” so to speak, and that they are taught computer science with so much abtraction that their working knowledge of hardware is dismal. That is an outcome that scares me. But at the same time I am leaning compsci because computer engineering seems to be too much EE (as you said) and I’m not interested in designing CPU’s or the circuitry. Are my impressions accurate?</p>

<p>You shouldn’t minor in comp science. Do computer engineering or comp sci, either will get you to your goal. Since you don’t want to DESIGN the hardware, comp science sounds like a no brainer. You will have to take extra classes as an engineer like Physics II (electromagnetism) and Diff Eq. Save the heart ache and learn how to optimize your code to the specified hardware.</p>

<p>CS have zero knowledge of electricity and know less hardware than comp eng. but a comp science will give better skills for software. I am currently a CS major myself and we do learn hardware but not as in depth as a comp. eng. Yes, you impressions are right compt eng is mostly EE. I think you should go with CS since you were originally going to major in software engineering which is a subset of CS</p>

<p>That would be the guys in the next cubicle row (the BSP / bring up / HAL group where BSP is board support package, ie. device drivers and stuff, hardware abstraction layer, and bring-up meaning they receive the Fedex box with the boards and they bring up the OS on the new hardware). </p>

<p>They’re largely EE’s with decent C++ and rarely assembly language. The main guy is a BSEE / MSCS whose purpose in life seems to be to turn the blinky light on and off a few times. He also writes device drivers and other board support goodies. </p>

<p>They work very closely with the vendors and the hardware design group, and have a very solid understanding of configuring open source platform software to our needs (i.e. LTIB on Linux). </p>

<p>Their main devil on a regular basis appears to be device drivers for multimedia, i.e. how to get various drivers from various vendors or home-made to play nicely with each other. Fairly tedious work if you ask me.</p>

<p>As far as Operating Systems, well, we rolled our own a decade or two ago and it still works (one guy wrote it) but where the money really goes is the abstraction layer we use - so we can build and test code on Win32 or straight Linux and then when the board blinks ready we’re ready too. For OS work you should have an understanding of open source real time or sort-of real time embedded OS’s (QNX, Linux, Wind River, Windows CE, et al). But we rarely touch the source of the OS- the BSP team does drivers for our specific devices, packages everything with a red bow and passes it on to the middleware team (the people who do all the software that actually does something useful :)) or the user experience team (pretty graphics and user interface team). I’m mostly in the last team with occasional dives into the middleware realm.</p>

<p>The board team reads schematics and uses hardware debuggers and analyzers. Hard as it may sound to believe they rarely use assembly language unless we’re talking hard real time like robot control and the like. Spend an hour looking at assembly of any decent microprocessor and you’ll run for your life.</p>

<p>All this for pretty powerful (1+ GHz, several GB memory) consumer electronic devices that are usually internet enabled via Bluetooth and cellphone and/or wifi.</p>

<p>I think you will be fine with a CS degree. Many CS programs have “tracks” which serve to ensure that your higher level CS electives give you some in-depth knowledge in a certain area. For example:</p>

<p>“The systems and networking track provides students with a deep understanding of the interaction of software and hardware in computer systems and networks. Students completing this track will have acquired working knowledge of the analysis, design, and construction of complex systems software. Besides the core courses, students may take advanced courses in the areas of computer system design, computer architecture, networking, Internet technology, and parallel and distributed computing.”</p>

<p>If you look at the college websites and visit colleges you might be able to form an opinion about their strengths. Look at the career service information to see what types of companies recruit heavily. You want to make sure that companies involved in systems and networking come to the college. If the college only touts its HCL or gaming prowess it may not be the best one for you.</p>

<p>turbo93- thanks for that insight into your company! Writing drivers is of some interest to me and I still don’t know exactly what I’ll do after college. </p>

<p>Lookin, Lightnin and Chris- I think you guys are right and I’ll go into computer science. And Chris I’ve seen some good looking tracts, and some ones lacking so I guess I’ll have to step up my college search. There are a lot of schools whose computer science program looks more like a software engineering program and that’s all so I will defiantly avoid those…</p>

<p>One last thing - the way the industry works is sort of interesting. Because of very short cycle times and the need for cost containment, in most cases the approach taken is simple. Start with a preferred hardware vendor, Freescale, Renesas, TI, Qualcomm, et. al. They have reference design hardware which should give the designers a good start. Also they have device drivers and HAL software distributions for their favorite OS’s. These are usually some flavor of Linux, QNX, Windows Something, and so on. The hardware vendors also have week-long type classes with exotic names (and costs) that assume the student understands everything up to that point and teach device drivers for such and such. The open source activities have really helped here to keep things simple.</p>

<p>The higher level crowd (middleware and UX) really don’t see any of those so it is imperative the low level stuff works. There is gold coin to be made for supporting such stuff, as the more esoteric the more the coin if you get my drift.</p>

<p>There is a hybrid major, computer science and engineering. It’s just what you want, you can learn OSes, assembly, compilers, systems, the electronics of it all from the transistors up, etc., without learning any more electrical engineering than is necessary for computer systems.</p>

<p>[Undergraduate</a> Programs | CSE Department at the OSU](<a href=“http://www.cse.ohio-state.edu/ugrad/csecurr.shtml]Undergraduate”>http://www.cse.ohio-state.edu/ugrad/csecurr.shtml)</p>

<p>Arizona State has a similar program. That’s a good point. Schools have hybrid options for hardware and software. Sounds like the perfect fit for you. Check your in state options if they have something similar</p>

<p>[Computer</a> Systems Engineering | School of Computing, Informatics, and Decision Systems Engineering](<a href=“http://cidse.engineering.asu.edu/forstudent/prospective-students/computer-systems-engineering/]Computer”>Home - School of Computing and Augmented Intelligence)</p>

<p>[Bachelor</a> of Science in Computer Science and Engineering | Engineering Plaza](<a href=“http://plaza.eng.uci.edu/degree-program/cse]Bachelor”>http://plaza.eng.uci.edu/degree-program/cse)</p>

<p>And CSE programs can be ABET-accredited, so don’t worry that it’s phony.</p>

<p>I got your drift turbo thanks… and CSE definitely looks promising unfortunately I’m having trouble finding it in the MA area but I’ll keep looking.</p>