Same as DoTheSimplestThingThatCouldPossiblyWork
Break project into small simple pieces. Each piece should be well-defined/commented, stand-alone and reusable. If those pieces are classess/functions, minimize use of globals at project level. Pass all input through function attributes. This way, you will see much more easily what each function uses or depends on, aiding its use it in some other project. And more reusable pieces are those that are well designed (for exact purpose), simple and easy to understand.
If you have a big project made of little, simple, understandable pieces, you will have no problem knowing it and changing it.
The best code I made was reused more than once in other projects, without changes. The worst code I made was used only in projects for which it was written initially. After that project, code was scrapped and never looked at again.
Expert programmers are those who write code even idiot programmers can understand. Idiot programmers are those who write code not even expert programmers can understand.
Isn't the real goal to make the right thing rather than the simplest thing that could possibly work?