This fall, I've had the pleasure and privilege of teaching a course on operating system internals at the University of Maryland. In so doing, I've come to see that our current system of training engineers to do embedded systems work is flawed.
At most colleges and universities, the job of educating engineers is split along hardware/software lines. The faculty of an electrical engineering department generally educates future hardware designers, while an unrelated group of faculty in a separate computer science department educates future programmers. There is rarely any cooperation between the two departments, nor are students in one program encouraged or required to take courses in the other. A few “crossover” courses, like the operating system class I'm teaching to EE majors, are insufficient preparation for the world of work. The fact is that the largest demand for engineers these days is for those who can think and work on both sides of the hardware/software boundary. This is true nowhere more so than in our industry.
Companies designing embedded systems need programmers who can port operating systems, write device drivers and board support packages, and help debug hardware. They also need hardware designers who can write software for the systems they create (of course, increasingly, the hardware design looks like software too). Even if an individual engineer won't need to write software and design hardware, he will usually be part of a team that does both. And teams need to be able to think collectively and communicate easily about issues that affect both sides of a system's design and implementation.
It is clear that what our colleges and universities need is a proper system for training embedded software professionals. To fulfill the needs of industry, they need to graduate a much larger number of software engineers who are capable of understanding hardware and interfacing directly to it, and hardware engineers who can apply software engineering techniques to their digital designs.
Many schools have already merged the two departments into a single EE-CS department, or borrowed faculty and courses from each curriculum to create a computer engineering degree program. But is either approach really working? Without a focus on the actual skill-sets and integrated knowledge required by industry, these new degree programs are too often simply “six-from-column-A and six-from-column-B” quick fixes.
Bringing together two departments full of people who have long segregated themselves is easier said than done. Just imagine the Democratic and Republican parties agreeing after yet another record low voter turnout that a more centrist third party is essential for the future of democracy in this country. Then imagine them trying to somehow jointly fashion that new political party. That's not unlike the challenge now facing the administrators of electrical engineering and computer science departments everywhere. But it's about time that challenge is taken up.