I find naming discipline very important in reducing type uncertainty. If I call something &#x27;user&#x27; I better be referring to the same thing every time, at least within a single namespace, package or library.<p>As one thing gets more specific, it gets a more specific name. Like a map representing the database record for a user would get `user-record`.<p>For aggregates or abstract things, Its ok to use `m` and `coll` if referring to any map, or any collection. `n` if referring to any number, and so on.<p>But having conventional names like `user-coll` for a collection of users, or `user-set` for a set makes a big difference.<p>It all comes down to reducing the number of things names can mean and therefore improving the likelyhood of your brain inferring the type of an argument, or what a function says it will return.<p>This is something I have gotten better at as I have grown as a Clojure programmer (previously only worked in static languages like C#&#x2F;F#&#x2F;Haskell&#x2F;C etc). I used to just take or return the exact structure I needed without thinking if it was transient or anonymous. I now make sure I can name everything a function takes, and returns.<p>Use constructor functions to reify new domains and name them (nouns), or document them with Prismatic schemas.<p>Hopefully that&#x27;s not too hand-wavy.