Developing embedded software is not as “simple” as it used to be. Creating a stand-alone device was and still often still is challenging for many development teams. In the IoT age where we are starting to connect absolutely everything, including toothbrushes, system complexity is skyrocketing. The traditional, disconnected developer is finding that there are several new challenges that they are facing that need to be addressed to be successful.
Challenge #1 – Connectivity
The first challenge that is facing developers is connectivity. It sounds simple but there are so many different ways to connect to the internet. Developers could connect through Wi-Fi, Ethernet, Cellular, LoRa, a Bluetooth bridge and many other potential sources. Each has its own advantages and disadvantages along with different software stacks that developers need to learn and understand to get the hardware working. This doesn’t even cover the other software considerations on what protocols to use such as UDP, COAP, TCP/IP and several others or whether to use multiple protocols simultaneously. There’s then the challenge of learning and using TLS and or MQTT and understanding how that all works when you throw in a server. Sure, developers can use pre-existing software stacks to help decrease the challenge, but they still need to understand what’s happening just in case something breaks or needs to be modified.
Challenge #2 – Over the Air-Updates
Now that the device is finally connected to the internet, we can remotely update its firmware which sounds like a great idea. With a stand-alone device, developers used to just post a new firmware image to a secure site and then email all their customers to “come and get it”! With the IoT, software updates are just expected to miraculously appear and be performed on their own. Even in a small deployment involving several thousand devices, developers need to figure out how to:
- Generate a firmware update job
- Secure their updates
- Validate they are coming from a trusted source
- Roll back the update if there is an issue
- Determine when it is appropriate to update a device.
This is all tricky business which can be time consuming that developers now need to understand how to do to successfully deploy their product.
Challenge #3 – Security
Connected devices are now well connected which means that anything else on the internet can see them as well. Developers now need to not just learn about how to connect but also how to secure their devices from security threats that are ever evolving and becoming more sophisticated. Security isn’t something that can just be added to a system at the end of the design cycle and its not something that can be learned overnight. Careful thought needs to be given into how the system is partitioned, isolated and what information needs to be protected. Developers need to clearly identify how secure their system needs to be. The security on an electric toothbrush will undoubtedly be far less than the security on a smart meter.
Challenge #4 – Debugging
As more and more teams build connected devices, complexity increases which means that the amount of time spent debugging with most likely increase as well. As open source software and other software packages are integrated together, strange and new behaviors will surely result in the system unless they have all been designed to work together in the first place. Embedded surveys have shown that developers on average spend 40% of their time debugging already! Debugging is a huge time sink and cost on every embedded project. For this reason, it’s important that developers understand all the debugging techniques available to them and how to prevent them in the first place.
Challenge #5 – The Rate of Change
It may have just been me, but for first ten years of my career, it felt like the way we designed embedded systems and the technologies that we used were relatively the same. Sure, a more powerful processor would come out each year, but the improvement was incremental. Within the last five plus years, there has been a big jump in the available technologies and what they need to do. It started with connectivity but its rapidly expanding to not just security but artificial intelligence and systems. Developers are starting to find that they technologies available are changing faster than they can learn them.
These are the major challenges that I see development teams struggling with as they start to transition from designing stand-alone devices to connected devices. These challenges certainly aren’t insurmountable, in many instances solutions already exist in a variety of forms. The trick becomes how developers and teams get up to speed and then maintain these new skills that every developer needs.
Are there other challenges that I’ve over looked? Please comment on the challenges you are facing in your design and what sources you are using to try to overcome them.