1. You can only accomplish what is possible.
2. Just because you can do it is no reason to do it.
3. What you do and how you do it depends upon your goal.
4. Context modifies nearly everything.
5. What is good or bad depends upon the ultimate value.
Knowing the relevant context and deciding the ultimate value is the challenge. The rest is easy by comparison. Both context and values are hardly ever discussed when it comes to programming projects. The discussions mostly reduce to "look at this cool thing I did - want to do - plan to do." The past is considered to be irrelevant and the future does not exist. Its only the eternal NOW and the excitement of an out of context fantasy. In such fertile soil are the seeds of almost universal failure with vast cost over runs, endless schedule extensions, and delivery of less than promised projects.