Despite claims of preparing people for the workforce, traditional computer science and engineering programs fall woefully short on providing students with practical hands-on experience.
As another academic semester draws to a close, I feel compelled to share more thoughts about how traditional institutions of higher learning are failing to train embedded programmers.
Writing software for embedded systems is not easy. Many folks with a degree in computer science or engineering may never be qualified. A deep understanding of computer hardware and specific I/O interfaces and devices is one requirement. Knowledge of and experience with programming techniques that hold up under soft or hard real-time deadlines is another. Willingness-even eagerness-to debug difficult interactions between software and hardware with limited visibility into a system is an absolute must.
The subject I teach, operating system internals, deals with some of these issues. I expect the students in my course to gain an understanding of real-time scheduling, multithreaded programming and synchronization, and device-driver writing. These skills would serve them well as embedded programmers-but one course is not enough to make them such.
Most of my students arrive with only a limited understanding of computer architecture! It's alarming that the bulk of graduate and senior undergraduate students studying computer engineering don't understand basic concepts like stack frames, interrupts, DMA, and cache. It's not that they haven't heard those words before; rather, they don't have any first-hand knowledge and, therefore, lack understanding of these extremely important concepts.
This is symptomatic of a larger problem with engineering education in general. Engineering students are not challenged in the right ways. They're challenged to understand computer architecture without designing a computer. They're challenged to understand operating systems without writing one. And they're challenged to understand multithreaded programs with only one freshman course in basic C programming behind them.
Why aren't engineering departments challenging their students to be engineers? Engineering is science in practice. Students are taught the basic science well-math, physics, chemistry, and so on-but they're not taught the practice.
By the time they get to their junior year, and throughout grad school, all students should be required to work on real projects-every semester, in every course. A little assembly and C programming here, a CPU design there, and some hands-on DSP work could go a long way toward preparing them for the world of work.
Without that first-hand experience, these folks aren't useful as engineers. Among the poor and outdated requirements for accreditation of engineering degree programs is a recent innovation that seeks to address this problem. In their senior year, all undergraduate students are now required to complete a “capstone project.” This involves working on a small team, with the assistance of an advisor, on a project of their own choosing.
While the capstone project is certainly a good idea, it's too little, too late. Because students working on these projects haven't had any practical experiences before, they rarely succeed in achieving much of anything. The capstone should be the last in a long string of hands-on projects-in all manner of courses along the way.
Thank you so much for your editorial on the current state of embedded systems training at the university level.
I currently work as an embedded systems software engineer and I am pursuing a B.S. in Computer Science from Cal State Monterey Bay where there is virtually no emphasis on systems design or architecture, much less on embedded systems. Example: CST (Computer Science and Technology) 336, which is an upper division computer architecture class, covers things like file system structure, a PCI bus versus an ISA bus, what RAM does, etc. Oh, I almost forgot the three days we spent covering logic gates and Boolean algebra.
As for programming, the university offers two C++ classes (both of which require only one mid-scale project, neither of which even touch upon threads), one Java course (which requires two mid-scale projects involving multi-threading), a Visual Basic course (the multimedia/graphic design majors have to take one programming class), and four database programming classes.
I understand that the university's main emphasis is on networking, but from a hardware perspective, the networking classes don't get past media, topologies and the OSI model.
Like students at most other universities, we are required to complete a “capstone project,” which is supposed to take two semesters (all of senior year) to complete. For many students, the capstone is the first project they work on where they don't have an instructor holding their hand the whole way through. The only “real world” skill that comes out of the capstone is project management (we're required to take a semester long “Capstone Planning” course where we have to provide and stick to a timeline).
I'm glad someone — an instructor, no less — has noticed the lack of training and preparation that higher learning institutes provide to their computer science students.
Note: for reader responses to this editorial, please click here .