I have a somewhat formal process for this, which I teach to developers I&#x27;m mentoring:<p>First, you build a feature for the requirements you know you have, with support (possibly stubs) for the requirements you know you&#x27;re going to have in the next version.<p>When it&#x27;s time to implement the second version, you refactor as-needed to support the new requirements you have, with support for the requirements you know you&#x27;re going to have in the third version.<p>Do the same refactoring and support approach when you implement the third version.<p>By the time you get to the fourth version, you&#x27;ll generally find that you&#x27;ve already built all of the extensibility you&#x27;re going to need, and you&#x27;ll just be using that rather than refactoring anything.<p>I like this process because minimal effort is put into implementing any requirements you don&#x27;t need yet, while taking into account future requirements you know about so that you don&#x27;t build something that makes the future requirements very difficult to implement.