software architecture challenges