key elements of software development