Design from zero to achieve simplicity; don’t endeavour to reduce the complex.
I use this heuristic in software engineering for both code and project level tasks. I apply it to all tasks; whether they should take a couple of hours or several months to complete.
Systems have realities: design, constraints, and behaviours. Some are written down, some are unintentional, and some we’ll never discover. We want to make a significant change to a software system. Our goal is to design a simple solution. One way of doing this is to list all of these complex realities of the system and design around it. But which of these realities are relevant to our task? What about those we don’t know about? We risk bringing unnecessary complexity into the design.
“We can’t solve problems by using the same kind of thinking that we used to create them” - Einstein
Set aside the perceived complex realities of the system and design from zero. Apply first principles thinking to the problem at hand. From this, simplistic designs emerge. Entertain these designs - how would you implement them? Only now the complex realities of the system come into play. Consider only those realities which are relevant to the design at hand. Verify and validate that those realities are indeed real. Experiment and iterate on the designs until a solution emerges. It may be a simple solution, or a complex solution containing the fewest or most acceptable verified complex realities of the system.