A Shared namespace created for three value objects, containing 140 classes four years later.
what was actually in it:
genuinely shared Money, DateRange, EmailAddress
— 6 classes, used by every module
one module's code 41 classes, used by billing only
two modules' code 30 classes, which is a missing
module rather than shared code
utilities a StringHelper with 22 static methods
everything else classes nobody could place, moved
here to end a review conversation
A shared kernel needs an admission rule or it becomes the place things go when nobody wants to decide. The rule that worked was that a class enters only when at least two modules depend on it and neither owns the concept — which immediately disqualified the forty-one, and turned the thirty into a conversation about a module we had not named yet. The helper class was deleted into the classes that used it.