technical challenges in software development