Can you become a firmware engineer(embedded software engineer) through bootcamp?
Hey everyone
I'm trying to find a bootcamp for software developer and i stubbled on to firmware engineer. I got very interested in that topic. I heard that firmware need to know both software and hardware so I was wondering can you still be able to become a firmware engineer without a college degree but by going through a boot camp. If Yes does any one have some good boot camps that they can say postive thing about. Thank you every one!
29 comments
[ 3.9 ms ] story [ 74.1 ms ] threadFor starters, the tools are generally terrible compared to things like Jetbrains or vscode. Each chip vendor has a preferred environment (i.e. Segger for Nordic stuff) or you have to buy something expensive like IAR and they all have quirks. The Ti toolset for bluetooth stuff is a nightmare.
Next, you need to be an excellent C programmer and it helps to have some experience with assembler. You will need that for debugging. If you struggle with pointers or memory addressing or anything like that you will suffer.
Next, you need a good understanding of concepts like interrupts, how data is stored i.e how memory is used for different data. Plus each RTOS is different so while strategies for how you do things are similar, the available tools can be unique to the vendor.
On top of that, you will likely have to work with the hardware engineers on how the chip is set up, which pins are attached to what, how they are attached and other concepts like SPI and other means of getting data in and out.
There is a lot to learn, you need to learn by doing and hopefully with an experienced mentor available. There is nothing like stack overflow to help either, the chip vendors run their own forums and try to help but largely on a custom board you are on your own.
So, no bootcamp could even come close.
Embedded system, you increased something from a two byte unsigned int to four bytes? Does it still fit on the device ordo I need to change the area in memory where my program is being loaded, do I still have enough space for the stack, was I disciplined about my mallocs and frees and always make the right size etc. Beginners can make a fair fist of a web app because you can screw up royally and it will still work.
Start with the basic skills you'd need for any software like data structures and algorithms. But you'll actually need to know it for the job, not just for the interview.
Add extra low-level computer systems skills.
Add electronics skills.
Depending on the application, you might also need to know control systems, signal processing, communications theory, hardware security, or computer architecture, for example.
Then add the engineering math/physics knowledge for the specific domain.
It adds up. If you can't do those things, all of those problems need to already be solved, simplified, and polished for you. At that point, you've avoided firmware engineering and gone right back to application development.
Firmware dev you end up working on obscure proprietary systems where you don't have the luxury of just Googling every problem because there isn't a ton of devs working on the same thing as you.
There are no shortcuts.
- Insane debugging: you have to debug extremely low-level failures with very limited visibility (e.g. no operating system to catch your segfaults) and proprietary or complex tools.
- A hard language made harder: C is difficult to get right, but embedded C (no dynamic memory, lots of bitwise operations for MMIO register writes, targeting exotic architectures, etc) is even more difficult.
- Extreme constraints: The products you work can have constraints like safety certification, minimal power utilization, or ultra low latency response. Meeting those constrains often means having to deeply understand hardware.
You have a tiny computer with some built-in interfaces. These days it almost always is a SOC and the documentation is often 300-500 pages.
Then you typically have some additional chips connected. Simple ones might have a 10 page doc, complex ones 100+ pages.
And you have your bespoke designed circuitry.
All of these things communicate over a variety of circuits, which generally are susceptible to electrical noise and transmission line effects. At typical frequencies everything over a couple of inches is a transmission line.
Then there are design errors, especially during prototyping.
So when you have a "bug" you need to track down whether the problem (and it can be one or more of the following) is in your code, the interfaces, the wiring, in your understanding of the documentation and of course the documents have errors as well.
Then to further add to your woes, your code edit, compile, download to flash can take several seconds for each iteration. And the flash wears out after say 10,000 iterations.
It's sort of like writing Linux drivers for custom hardware, but without the Linux libraries, or Linux.
Nearly all jobs I’ve seen related to firmware dev have been senior level, requiring many years of experience particularly in the domain the company operates in. I imagine there’s also a significant amount of knowledge that’s behind an NDA or is just not accessible to anyone outside the field. My hunch is that new talent is mostly obtained through university sourcing, but I could be wrong.
Of course, I’m not the one to tell you to just give up and settle, but if I were you I’d try to find a slightly less broad target and make a plan to hit it. If you fail, you fail and likely have achieved swaths of useless knowledge though.
Have you spent any time doing Arduino projects? While not representative of real-world firmware work, Arduino is very accessible/cheap and will teach your transferable skills (e.g. C programming for interfacing with HW). I'd encourage you to really put some time in before you commit to anything embedded - because the amount of jobs and the range of companies you can work at is much, much lower than "mainstream" development (say, building web applications).
[1] https://embeddedartistry.com/beginners/
That being said, there are accelerated CS undergrad degrees out there that may help you break into the field in the fewest number of calendar months. Though at the end, there's a good chance you wind up doing web dev anyway.
Of course you could always have an Arduino based course. But for anything non-trivial you will quickly need some electronic test equipment and the skills to use them well. You only need to browse the Arduino forums to realise how hard it is to learn all the inter-related material.
Any organisation providing a bootcamp style course would need to invest in considerable amount of test equipment, provide lab bench space and hire suitably qualified instructors.
Having said that, there are lots of videos on YoutTube that explain various topics. You might want to read me reply to @runawaybottle for an idea of some of the topics you might need to become familiar with.
What I have noticed is that job postings for dedicated embedded/firmware programmers paid about half what I was already making, so I never put that on my resume.
So I think you're misguided: nobody's going to give you a job as a junior embedded engineer (since they would have to supervise you and debug your code, or face a failed $$$$ hw project), and even if they did, you'd earn half what a CRUD developer can make.
But if you're going down that road, learn the linux tool chain, including how linux boots.
You can find the IBM DOS era BIOS listing manual on ebay.
My guess is that CRUD product companies have much lower marginal cost of production (just server costs) than hardware so they can afford to pay more.
Note that even in SV it's very common to lay off the entire eng. team after a chip is taped out or a product is shipped. You'll see eng. managers desert like rats on a chip about 4-6 weeks before finish, then all the ICs get their final all-hands about a month later.
The exceptions are if the software toolchain is not done, or if you're a "customer engineer" - then the software budget gets more time. (Smart hw companies start both the hw and sw at the same time, but if they don't, then the sw will not be finished when the hw is ready. Oops.)
So stick to CRUD and sw-only companies, folks.
That said, as embedded processors like the raspberry pi get cheaper I am seeing more jobs in embedded Linux, which may require less direct electronics experience.
I would say an electrical engineering degree is the best way, or maybe just read the entire "Art of Electronics" and try to do some personal projects like a robot! There are no easy shortcuts I'm afraid.
I absolutely love doing embedded work, but unfortunately it was hard to find good remote jobs! If you are in a tech city there are many more opportunities. Good luck!
Figure out a project you'd like to do. Make it happen using the dev board. Ie buy input and output devices, perhaps on breakout boards. Once you're comfortable with this, learn PCB design software; there are some OK free ones like KiCad. Design and order some custom boards. Learn to solder parts their assembly service doesn't have, or won't install.
As an aside to proficiency, there's something rewarding about making a program that has no noticeable latency due to lack of conflicting priorities, and bloat associated with web and GPOS programming.
I did it some time ago, the board they use is pretty cheap and it could be a good starting point. Disclaimer: - I did this course (or similar, but same professors and same university) online some years ago, so I assume it has been updated. - I do not get any benefits, monetary or otherwise, for promoting this course or for new enrollments. I just recommend it based on my personal experience.
> Debug using oscilloscopes, logic analyzers, and software instrumentation
We have logic analyzers for just 10 bucks? Wow that's much more affordable than I thought. I thought both need like hundreds of bucks.