How do you approach designing software that must be highly modular and easily updated without breaking core device functionality?