The shared kernel that became a dumping ground

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.