Naming things is hard because a proper name imparts the essence of the thing you're naming. To understand the essence of the thing, you have to understand what role it serves, what else it interacts with, and what part of that is interface and what is implementation.
Naming is identifying concepts that matter—and occasionally realizing that the thing you just wrote, but can't name, is not a thing that should exist. It's part of understanding what your system really is and what it does.
The naming part, the mapping of words to objects, is easy. What's hard is breaking down a system into parts with obvious names.