In a discussion recently someone was asking for feedback on how to go about expanding a system to cover more use cases without clumsily breaking the abstraction. I had these thoughts:
Maybe questions to ask are:
- How easy is this to change later?
- How easy is this for others to use?
- Are there any fundamental scaling problems?
- Is the code reasonably DRY internally and across systems?
If those things are good, I'd say don't be too worried about an imperfect abstraction gradually growing. All useful software that is being built, by its nature, hasn't been built before. So your system will naturally grow to become unique and valuable, and it's impossible to know what that unique valuable design looks like before you build it.
John Bachir's Code Blog