Clojure's keyword namespacing convention Considered Harmful

Don’t do that. Don’t treat Clojure keywords as composite data structures. This is accidental complexity waiting to happen. Programmatic names are meant for humans to read, not for programs to interpret. Changing an attribute name should not be able to change the behaviour of your program. In Hickeyian terms: you’d be complecting naming with structure.

I include this into my personal list of Clojure don’ts. I’ve commited this mistake once or twice for the sake of conciseness (e.g., :a/b instead of [:a :b] or {:something :a :other-thing :b}) only to regret later for one reason or another.

Speaking of portability, do you have particular opinions about keywords vs strings as constants? I’ve recently converted all constants from keywords to strings (e.g, converted the values of :user/language from :en-US to "en-US"). By this change, I could eliminate all the code that keywordizes strings when I get them from browsers or stringifies keywords when I write them to database. Furthermore, it gave me a system-wide invariance that keywords never show up in entity values. The only downside is that strings don’t implement IFn unlike keywords, but this seems to me such a small price for big accidential complexity.