I have a two step process for building a software system; I haven't got to the second step in practice, but some day...
Step 1: Build a proverbial "ball of mud", adding things left and right until all the shifting requirements are met.
Step 2: Write a minimal description of all the logic from scratch, by surveying the existing code, and then, essentially, write an interpreter for it.
If I got to step 2, and did a good job, future projects would become much easier.