|For novel ideas about building embedded systems (both hardware and firmware), join the 27,000+ engineers who subscribe to The Embedded Muse, a free biweekly newsletter. The Muse has no hype, no vendor PR. It takes just a few seconds (just enter your email, which is shared with absolutely no one) to subscribe.|
By Jack Ganssle
Mike Anderson, a frequent speaker at the Embedded Systems Conference recently wrote about why embedded engineers in the US are losing their edge (http://www.todaysengineer.org/2008/Feb/help-wanted.asp). He feels CS departments are doing a poor job turning out graduates trained in the skills needed in firmware design. That's a complaint I've heard from many other sources, particularly from companies trying to hire embedded engineers.
In the olden days embedded folks were mostly EEs who picked up programming skills from their education or on the job training. Now my informal surveys show that, here in the US at least, around half of all firmware developers have CS degrees. Considering the time needed to obtain a EE degree (5 years is typical) and the expense (an additional year of school plus some universities now have a surcharge for engineering and science) it's reasonable to expect fewer EEs and more CS folks will be entering this field.
So I looked at course requirements mandated by the CS department at one large university. The results backed up Mike's assertions. Required classes in the major program are:
- Object-Oriented Programming I and II (in Java)
- Discrete Structures (in Java)
- Introduction to Low-Level Programming Concepts (no programming requirement I could discern)
- Computer Organization (a bare introduction to assembly but that appears superficial)
- Organization of Programming Languages (C, Pascal, ML, LISP, Prolog, C++, and Smalltalk - so many, it's hard to imagine a harried student would master any of them.)
- Algorithms (no apparent programming)
Numerous electives are required as well. As far as I can tell only one has a programming requirement. Classes offered include networking, security, databases, usability, formal grammars, numerical analysis, crypto and the like. There's a single class - which is not required - on software engineering with dated material (like chief programmer teams) that requires a significant amount of programming.
So a CS major graduates with a minimal exposure to assembly language, and no real C or C++ experience. She's basically a Java whiz who would be baffled by pointers, dynamic memory allocation, resource constraints, or many of the other critical issues faced by firmware folks.
In a recent poll on this site (http://embedded.com/pollArchives/showPoll.jhtml?surveyno=254401002) only 7% of respondents said they have used no assembly at all. 79% have used at least a couple of different assemblies. Though assembly is a diminishing part of our work, it's as essential as word processing.
The same school's EE department requires a C programming class, courses on signal theory, assembly language, and computer organization - even for students pursuing a specialization in power engineering or other non-computer aspect of electronics. Many electives target our work: DSPs, control theory, programming microprocessors, OS design, filters, and the like.
What do you think? Are CS departments missing the mark when it comes to preparing firmware developers for the real world?