I frequently receive enquiries – generally emails – from engineers who are interested in getting into embedded software. They ask about what they should study, what programming languages are necessary etc. I would like to be helpful and commonly send a reply to these queries. However, I thought that it might be helpful to encapsulate a little guidance in a blog posting …
First off, I am not so sure that I am the right person with whom to discuss just starting out. For me, this experience is a long time ago, which I wrote about here. Having said, maybe I can still give some advice. In the end, like any technical job, getting a position in an embedded software development team is a question of having a suitable skill set and some experience.
The question of experience is a tough one. How can you have experience when you are looking for your first job? Some employers are enlightened enough to appreciate this problem and accept that a certain number of recruits will be “green”. The best ways to get some experience are to get an internship [i.e. work for no money] or work on personal projects and ensure that you have a good story to tell.
Defining the skill set is a little less vague, though specific things are more applicable to some industries than others. Also, an embedded software development team is not comprised of a bunch of engineers who all have the same set of skills and knowledge; some will, for example, have more hardware interface experience, whereas others might know about networking protocols or the application area of the device. It is very unlikely that anyone would have all the necessary prerequisites for every aspect of a development project.
So, here is my stab at some of the key matters to address:
- Learn C. It is the most common language used to develop embedded software and provides a reasonable basis for learning other languages.
- You might want to familiarize yourself with some of the standards that focus on using C safely – like MISRA C.
- Learn something about real-time operating systems – maybe Linux too.
- Learn some of the basics of electronics. You do not need to be able to design chips, but understanding, for example, why your software might see a 0 [not a 1] when a button is pressed might be useful.
- Learn some assembly language. Even if you really or never code it assembler, it is useful to be able to read it.
Jack Ganssle has some interesting views on this topic.
Although you can attend classes in embedded development – there are a number of excellent companies out there – there are plenty of other resources available. Books are a possibility. Although I lay claim to authoring the first book on embedded software [in 1986 – not totally relevant now] and plan another next year, there are lots to choose from. Of course, there are countless online resources. A good place to start is embedded.com where I write frequently, along with many knowledgeable authors.
A specific growth area in embedded software is automotive systems. For the most part, the skill set is unchanged, but some familiarity with AUTOSAR and OSEK/VDE may be useful.
If you have any learning suggestions or need advice on a specific resource, do leave a comment or get in touch by email or via social media.