Software success comes from deeply understanding the real, often mundane, people-centered problem before chasing shiny technologies, using prototypes to learn the problem, and opting for generic solutions when appropriate.