Someone reading the PROCEDURE DIVISION will assume that a variable means just what its name suggests. If the name suggests nothing, the reader will have to either guess or spend a lot of time on a tedious investigation. If the name seems meaningful but is in fact misleading, the consequences are even worse.
There are several reasons why people use meaningless or cryptic names:
This reason is somewhat defensible. For example, a code generator may translate a record layout from Assembler to COBOL. Using the resulting gibberish as a copybook may make maintenance more manageable in a multi-language application.
In practice, typing time is a small fraction of a programmer's workday. At best, short names don't save much. At worst, they are a false economy, because they may force us to spend more time figuring out how the code works.
Rarely is there any reason to fit more than two data names on the same line (main exception: when one of them is subscripted). Unless your code is deeply indented, probably because of excessive nesting, there's almost always enough room.
For the occasional exception, it's no big deal to continue a statement on the next line.
Six months after you write the program, it may be difficult to remember that PCS meant "previous class of service".
One general ledger program used to contain a variable named, for no discernable reason, "BEANO". Go figure.
(It is probably no coincidence that the same program was a ghastly mess in many respects, and quietly corrupted the books for years before a subtle bug was found amid the spaghetti code.)
What if you switch compilers? Or upgrade to a new release? There may be a different collection of reserved words, colliding with one of your data names.
You can't predict what will become a reserved word, but you can avoid possible candidates. For example, I would never name a variable SELECTION. It's just a little too close to SELECT (an SQL operator, and a reserved word in COBOL II).
One simple rule is to include a hyphen in every data name. Few reserved words include hyphens, and WS-SELECTION is unlikely ever to become a reserved word.
Items in WORKING-STORAGE can benefit from the same treatment. For example, you might have a table, each element of which has ten subfields. Apply a distinctive prefix to each name in the table: TAB-WTN, TAB-USOC, and so forth.
I often use a prefix of LINK- for items in the LINKAGE SECTION, unless they are in copybooks.
Other, more specialized suffixes may be useful in a particular context.
Don't even use a word which is commonly misspelled, like calendar, receive, or occasion. Or misspell.
Other common pairs of opposites include min/max, start/stop, old/new, and next/previous.
(Main exception: names that differ only in their prefixes, such as JKR-CUST-CODE and JKO-CUST-CODE. We can expect the reader to pay attention to prefixes, whose sole purpose is to distinguish among similar variables.)
Be especially wary of characters that look alike:
Avoid data names with similar meanings. For example, don't have both REC-NUM and NUM-REC. It's too hard to remember which is which.
Don't hesitate to use abbreviations sanctioned by long usage: EOF for End Of File, SSN for Social Security Number, or whatever is common within your industry or your application. Anyone reading your program should be expected to recognize them.
Where there is no standard and familiar abbreviation, be reluctant to invent your own, especially if the abbreviation would appear in only a few places.
Don't abbreviate just to save one or two keystrokes. ORDER-FL is only a little shorter than ORDER-FILE, but it is significantly more obscure -- and sooner or later somebody will get a compile error because he forgot to abbreviate.
When you do abbreviate, be consistent, both within a program and across the application. Don't force someone to try to remember whether a variable is WS-CLASS-OF-SERVICE, WS-CLS-SVC, WS-CLS-SERV, or WS-COS.
Avoid abbreviations that might be misunderstood. For example, don't use REC to mean "receive". Instead, use RECV, so that it won't be confused with "record".
When possible, use abbreviations which you can pronounce. For example, use CURR-DATE instead of CRNT-DTE. It's easier to read and easier to discuss over the phone.
For a simple binary switch, the 88-levels should have identical names, except that one of them should contain 'NOT' somewhere.
For a flag with more than two possible values, give the 88-level names a common prefix -- long enough to make them highly distinctive.