I don’t think it makes sense to not think of generality options.
Often that helps us see a problem in more ways. Come at it from different directions. Generalizing mentally is map discovery,
But when it comes to implementation, any code that is there to enable unused generality is unused and unnecessary code. Any unused freedom of interface increases the chance of unintentional misuse or sleeper bugs.
The number of ways unnecessary code or loose constraints can be unhelpful is unlimited.
When it comes to optimizing, testing, maintaining, it is optimal to have the narrowest mission possible.
—
The exception is when designing a platform or library, with open ended reuse. Then value can genuinely be increased with greater applicability.
Then there will be generality vs. focused tradeoffs whose resolution will be very context dependent. On the subject matter and its potential market/users.
Often that helps us see a problem in more ways. Come at it from different directions. Generalizing mentally is map discovery,
But when it comes to implementation, any code that is there to enable unused generality is unused and unnecessary code. Any unused freedom of interface increases the chance of unintentional misuse or sleeper bugs.
The number of ways unnecessary code or loose constraints can be unhelpful is unlimited.
When it comes to optimizing, testing, maintaining, it is optimal to have the narrowest mission possible.
—
The exception is when designing a platform or library, with open ended reuse. Then value can genuinely be increased with greater applicability.
Then there will be generality vs. focused tradeoffs whose resolution will be very context dependent. On the subject matter and its potential market/users.