I have been in software development for over ten years. I have taught computer science for over six years and before both of these, I was a software engineering student. The number one thing that I see that hampers development is not figuring out what problem the software is trying to solve. You must answer the what and the why before you can answer the how. What is the current problem? Why is it a problem? Often developers are told what to do, but not why. A project manager may say "Add a new image to the registration page" and a developer just goes and adds the new image. Sometimes this is just what the developer has to do, but sometimes that might not be the solution to the problem. Why do you want me to add a new image to the registration page? Perhaps the answer to that question is that not enough people are registering on the site. Are people not registering because they do not like the image on the page or could it be the 10+ fields that they must fill out in order to register? Maybe the image is not the problem, but the fact that users do not know what they are registering for. Maybe the solution to this problem is to add copy that shows the user the benefits of registering. What do they get from registering? This is a very simple example, but it gets my point across. Sometimes the solution (the how) comes from the what that comes from the why. Many times we may hear something like "The client is paying us so just do whatever they say". Sure, if someone is paying us we should do what they are paying us for, but our they paying us to do whatever they say or are they paying us for our expertise? Most clients would appreciate people trying to solve their actual problems instead of just blindly following directions. The next time you are told to do something try asking what problem will be solved by doing it.