IoT projects can be complicated. Compared to a mobile or web application, connected physical products frequently involve a wider breadth of software, hardware, and people. The complexity of building an IoT product can quickly become overwhelming if not properly managed. Here are a few things that can help tame the chaos of an IoT project.
## 1. Nail the Basics
In some respects, IoT projects are a lot like any other software project. You’re going to build a few applications that work together to provide the desired capabilities. For example, consider a typical mobile application: You have the mobile app itself, back-end API and storage, and an administrative web interface. An IoT product is likely to have those same things, plus more.
The same practices that make a good mobile app help make a good IoT product. Make sure each application in the IoT ecosystem has nailed the basics:
- Automated tests
- Code stored in a version control system
- Automated builds and deployment
- Monitoring, logging, etc.
- Code and infrastructure that can be reasoned about
Applications that are individually built to a high standard are better citizens in the combined ecosystem of an IoT project. They cause fewer problems of their own, make testing easier to carry out, support the team when they need to track down and fix bugs, and keep the weight of maintenance from crushing forward progress.
## 2. Test Early; Test Often
In addition to automated unit and acceptance tests for each application, it’s important to test other aspects of the product throughout its development so you can identify potential problems early. Changes in architecture or broken assumptions have a broader ripple effect in IoT projects.
- Build development spikes to test technical assumptions
- Build simulators or stubs
- For the device so you can test out the applications
- For the applications so you can test the device
- For the back-end services so you can test the app and device
- Test the device in different physical environments where it’s likely to be used
- Test the system with different pieces in broken states
## 3. Use Standards for Communication
Whenever possible, use well-documented, well-supported standards for communication between different parts of the ecosystem–and then stick to those standards. Implementing a solution that “almost matches” a standard is bound to cause additional custom development down the road. Use well-tested code libraries where appropriate to implement the standards in your own applications.
Sticking to standards helps focus development on the areas that need to be custom—features that differentiate your product—rather than on the parts that don’t. And it opens the door to easier integration with outside products and services, which is a huge theme in the IoT space.
- OAuth or SAML for authentication
- BLE device profiles (e.g., GATT – Generic Attribute Profile, Environmental Sensing Profile)
- ZigBee or Z-Wave and their related standards
- TLS to protect HTTP traffic
## 4. Unify Product Ownership
At least one person needs to maintain a holistic product vision across all the different parts of the product: hardware, software, packaging, documentation, marketing, support, etc. This individual (or a small group of people, if absolutely necessary) should have the authority to make decisions, be easily accessible to the team, and be involved in regular status updates with the broad team.
## 5. Build a Cross-Functional Team
At the end of the day, everyone on the project team should be primarily concerned with the success of the project. The project team should be their primary allegiance, with all other allegiances subjugating themselves to the goals and vision of the project.
Firmware, mobile, web, and back-end developers should work together directly. It’s nice (but not required) if those distinctions can be broken down and developers can move between different parts of the application ecosystem as needs arise.
The design, engineering, development, marketing, and all other such teams should involve themselves in each other’s business as it pertains to the project. There are very few truly isolated decisions, and continuous involvement across teams promotes understanding, alignment, and innovation.
## 6. Centralize Documentation (Or at Least, Be Consistent)
Given a large, cross-functional team with many moving parts, knowing where to find documentation becomes even more critical. Store documentation, bug reports, and design artifacts in as few places as possible and ensure that everyone on the team has access.
If fragmentation is necessary, use web links or other methods to help the team navigate the data.
What steps have you taken to keep your IoT projects under control?