As I see and reviewing more code (Written by an amateur programmer to very senior developer) I noticed why they cannot come up with good names even though they are willing to do so and be able to spend little time and effort too.
They are two things:
1. They are not well-versed with the domain terms and vocabulary. They spend very little time on understanding it. They very soon bring the technical jargon in to their mind and starts thinking in implementing with it. In the initial phase of the project where the business requirements are discussed, they spend very less time in those discussions and starts thinking about tools and technologies can be used.
They eventually jump into the development and use the names of whatever at the time they know. Latter even if they become aware of the full business domain terms they don't really dare to touch the code and change the names. Then they forget it or ignore it and come under schedule pressure to add more code.
2. In some countries (e.g. India), English is taught as second or third language. Even somebody study in full English-medium still it is seldom used in day-to-day conversation and communication. They study it just for passing the exams. The problem is again with the strong vocabulary hence it becomes very hard to come up with good names very fast or immediately while they are programming.
They don't spend time in thinking for good, short, straight-forward, condensed names and they use whatever words they know and abbreviate the names by prefixing and suffixing with numbers, or omitting vowel (e.g. for customer to cstmr). They make lot of spelling mistakes also.