Nebojša Stojiljković has been a firmware engineer at ARS since 2015. He mostly works from home but sometimes he also happens to drop by the company. That’s why colleagues jokingly say about him: “They say he exists, but no one has seen him yet!” The director still keeps one desk for him because he hopes that he will get bored with working from home.
In addition to programming, Nebojša is also interested in network and system administration. He has taken the initiative to continuously improve the company’s IT system and network and system infrastructure.
Read below what his job looks like.
1. What is the job of a firmware engineer? What does firmware development mean?
A firmware engineer is a person who develops specific low-level software that runs on microcontrollers. Firmware is therefore a type of software whose purpose is primarily the implementation of the basic functionalities of electronic devices, such as controlling digital inputs and outputs, working with memory, communicating with sensors and other functions. In addition to these functions, firmware often includes some more complex components, such as network protocols, communication with cloud servers, etc. A firmware engineer must have excellent knowledge of electronic devices and computer systems and must be able to develop high-quality and stable firmware.
In simple language, firmware is a component that is the link between hardware and software. One well-known example of firmware is the BIOS in PCs.
Firmware development involves designing, implementing and testing the program code used in electronic devices. This may include the following activities:
- Requirements analysis: The firmware engineer must understand the client’s requirements, as well as the hardware capabilities of the device, and propose an optimal solution.
- Design: After analysing the requirements, we approach the design. This part of the job often feels like idle work because it’s more about thinking and trying than typing code.
- Implementation: After we have come up with a solution, all that remains is to type it in one of the programming languages.
- Testing: Finally, when the code has been typed, it needs to be thoroughly tested so that no error creeps in.
It should be emphasized here that these four steps are not clearly separated nor are we doing them separately. Today, it is probably a utopia for a client to give us a 200-page requirements document, which is then analysed for three months, and then the architecture is developed for another two. Much more often, these are small cycles of analysis, design and implementation of a few weeks each with the hope the client will not tell us that they actually want something else, which in my career has actually been a very common case. You simply have to get used to the fact that the client most often does not know what he wants, and even more often what is physically possible. It’s up to us to help him find out.
2. What skills must a firmware engineer have or develop?
A firmware engineer must:
- have a good knowledge of computer languages, primarily C, and C++ and assembler are also useful.
- also have solid knowledge of electronics, or he must at least be able to read and analyse electrical schematics.
- know various low-level communication protocols such as SPI, I2C, UART, CAN, USB.
- know microcontroller architecture, or at least be ready to read instructions, which are often 1000 or more pages long.
- have knowledge of operating systems for microcontrollers such as FreeRTOS, Zephyr eCos and Linux.
- know some wireless protocols such as BLE, WiFi, 6LoWPAN, ZigBee, xBee, etc.
- know some basic algorithms and know how to implement them.
- know and understand firmware debugging principles and technologies.
- if working in an embedded Linux environment, should also know POSIX, yocto, buildroot OpenWRT and other Linux development tools.
- have an excellent knowledge of git.
- be able to face technical challenges and find solutions for them.
- have communication skills and the ability to work in a team.
This list could probably go on and on, because there are at least 100 operating systems alone, C++ is probably impossible to learn completely and different problems and challenges keep piling up every day. On top of that, in the firmware world, almost every project is unique and different from the previous one, so the work never becomes routine. Therefore, in order to be a good firmware engineer, he must first of all be very persistent and very thorough. A good firmware engineer reads the documentation for everything he doesn’t know and is prepared for the fact that templates are practically non-existent.
3. What are the trends/predictions when it comes to firmware?
Some of the emerging trends in the field of firmware are:
- Increased use of open-source firmware: More and more electronic device manufacturers are turning to open-source firmware, which allows users to access the source code and modify it as needed.
- Increased use of multi-core microcontrollers: More and more devices are using multi-core microcontrollers, which allows multiple functions to be executed in parallel and thus increases the performance of the device.
- Increased use of machine learning: Machine learning is increasingly being used in firmware development to improve device performance and provide better functionality.
- Increased use of cloud technologies: Cloud technologies are increasingly being used to store data and provide additional functionality to devices, requiring firmware customization to support this.
These are trends that will affect firmware development in the future and require firmware engineers to be able to adapt to new technologies and develop firmware that supports them.
4. What is the demand for firmware engineers? Is this the profession of the future? Where are firmware engineers employed?
As for this profession, we will see an upward trend both in demand and in the profitability of the job for at least next 10 years. Demand has been growing for years and the supply is nowhere near meeting the demand, and that trend will continue at least for the foreseeable future. Why is that so? A firmware engineer needs at least three or four years and a lot of effort to master only basic technologies, while for that same time in the world of web development, people become practically seniors.
I would like to add that this profession is intended for a specific breed of people who like to deal with exotic technologies, who don’t mind slow and gradual progress, and for those who are ready for the fact that their code will not work for most of the time and that most of the time they will not have any idea why. In short, this is an ideal job for those who work patiently and without panic.
5. What does your job at ARS look like?
Currently, I am working for a client whose primary business is drinking and industrial water filtration. I am working on devices that monitor the consumption of filters, in order to plan their production in the coming period. Specifically, I am currently working in the C programming language and using the FreeRTOS operating system. Before that I had a very interesting project based on Linux where I was in charge of the final integration of the system. There I mainly used Bash to automate some processes and I wrote some code for the Linux kernel. In some next project, I’ll probably do something completely different.
The programming language I use is almost exclusively C, although C++ is also used for firmware development, and recently RUST is also gaining popularity. In addition to C, I also know Bash as well as Python. I have worked on projects from the simplest ones, through FreeRTOS, Zephyr and all the way to complex systems based on Linux. Most of the projects I worked on were related to IoT, usually related to AWS or Azure Cloud.
When I can choose, I use Linux for work, both professionally and at home, which makes me a Linux enthusiast. If I may mention, I use Arch and type in vim, because I can ;). I think Linux is much more suitable for firmware development, because most of the tools work naturally on Linux and the interaction with the hardware is simpler. Unfortunately, many young engineers come from the Windows world and they are used to working and playing games on it and switching to Linux is often quite thorny and painful for them, so they decide to keep on suffering with Windows.
As for programming languages, I really like to code in C. C is over 50 years old and has withstood the test of time, although every ten years a replacement is “found” for it, which as a rule fails. C is a small-format language, with only about thirty words that make up the syntax, and yet it is powerful enough to write very complex algorithms and, after all, entire operating systems. Along with it, as I mentioned, I often use Bash to write scripts that help me do things faster and sometimes Python.
6. Why do you love your job?
I love my job because it’s challenging and that’s what really drives me. I have always liked to deal with exotic and less popular things, and that’s why I chose the work I do today. Very often a new project requires learning new technologies and I don’t find it difficult. I actually look at my job as if I have to accept a challenge or solve a problem, even though the path to the solution can sometimes be frustrating.
7. When was a time you really made a mistake at work?
Yesterday, and probably today. I make mistakes like everyone else, every day. It often happens that when I see my code from a few years ago, I think “I was so stupid”. But errors in firmware development are generally not catastrophic and can be fixed, unless we accidentally burn something. It hasn’t happened to me often, but I can’t say it didn’t happen at all. An incorrectly written firmware code can physically damage the device and sometimes it does.
8. What do you like most at ARS?
Many things are good at ARS, otherwise I wouldn’t have stayed for 7 years in the same company. Firstly, we cultivate informal relationships, we are open to each other, and we hang out privately, outside of work. In addition, I have the possibility to work remotely, so I moved most of my work to the village where I live now. In addition to all that, as I am an amateur in network and system administration, ARS is like a mini-laboratory for me where I can apply my knowledge in those areas.
9. What training, education and coaching have you attended at ARS?
At ARS, everyone gets the training they need. I would not like to list individual trainings, because each new project requires a different technology and learning never stops, and ARS is a company that nurtures and supports that.
10. Who are you in private?
When I’m not working in the company, I mostly deal with some of my hobbies, which I have more than I can manage. I moved to the countryside, so I am interested in gardening, curing meat and wine production, and when the weather is bad I play chess on the Internet, unfortunately quite badly. One day I plan to start a very small apiary. Besides that, I collect and read books, mostly science fiction, but I also have a nice collection of “serious” literature. I’m not immune to good comics either. When I can choose, I listen to good music, from jazz to metal. Also, I stay as far away from social networks as possible, so I don’t have any. I prefer to see my friends in person when I can.