Looking back at my various blog postings, I’ve noticed that although I may be controversial on technical topics, I haven’t to date written anything that is controversial on a, shall I say, human side. Well no more Mr. Nice Guy, since today I intend to wade in on the topic of whether Embedded Systems should be programmed by Electrical Engineers or Computer Scientists. Regular readers will know I’m an EE (actually my degree is in EE & ME – but that’s another story) and so you won’t be surprised to hear that my usual preference is for Electrical Engineers. Although I am a (very) opinionated person, I’d like to think that most of my opinions have some basis in reality, and so here’s my opinion and its supporting observations…
The more embedded a product is, the better off you are with an EE, the less embedded it is, the better off you are with a CS.
So what’s the basis for this overblown, sweeping generalization and what exactly do I mean by ‘more embedded’?
Well, I consider a product to be highly embedded if it meets one or more of the following criteria:
- It has no or very simple user interfaces.
- It performs a lot of hardware type functions in software. For example a DSP that performs a lot of signal processing is essentially doing in software what was once done in hardware.
- It contains a lot of complicated hardware that needs extensive configuration and software support (For example a PowerQUICC processor).
By contrast, I consider a product to be lightly embedded if it meets either of the following criteria:
- It has a sophisticated user interface (especially if the interface is web based)
- It is database centric.
Evidently there exists products that meet the criteria for both sides of the dichotomy. For example, my new flat screen TV has a very sophisticated user interface, but I’m sure it does an extensive amount of signal processing.
If you accept this dichotomy, then it is evident that folks working on highly embedded systems really need to understand the hardware (since that’s what the product is about) whereas those working on lightly embedded systems need a good understanding of how to build large software systems. Having said this, my experience is that whereas EE’s (OK some EE’s) are able to quickly learn the principles of building large software systems, I’ve never yet met a CS major that had anything beyond a casual understanding of what’s really happening at the hardware level. I’ve seen this lack of knowledge (interest?) manifest itself in many ways. Examples include:
- Not knowing / understanding the Nyquist Sampling theorem
- Failure to realize that EEPROM / Flash have extraordinarily long write times
- Not realizing that sampling jitter can destroy the performance of a digital filter
What about the other way? Have I seen EE’s write 1000 line functions, and be completely clueless about principles such as data encapsulation? Absolutely! However, I have also seen EE’s successfully craft very large systems. As a result I’ve come to two basic observations:
- A deeply embedded system written entirely by a CS major will have major problems.
- A lightly embedded system written entirely by an EE major may have major problems.
On this basis, I prefer (slightly) to have EE’s work on embedded systems.
It doesn’t take a rocket scientist to conclude that perhaps the best approach is to have a team where the EE’s handle the hardware centric stuff and the CS’s handle the computer centric stuff. Indeed, this is the approach I see taken in most organizations.
As a final thought, although it is common to find EE majors that have gone back to college to get a Masters in Computer Science, I haven’t yet met a CS major that has gone back to college to get a Masters in Electrical Engineering.
