software development challenges