Yes, documentation is the key. Also, naming your tags appropriately is a very strong suggestion of mine. I'm working with a program now, where subroutines are run after every analog input, solenoid input, and even to the motors, where the setup is done, then a subroutine is done to take care of it. I did a little programming... where the subroutine to start or stop a motor is about 30 rungs long, I did it directly in the main program in about 10 rungs.
In the subroutines, you ARE NOT able to troubleshoot. I use them for stuff like alarms, but in the main program, you want to be able to track your logic. Also, here I am faced with the beginner's guide to UDTs; analog inputs start at "Analog[1]" and contain every alarm, timer, and whatnot. Motors start at "Motor[1]", and it just gets worse.
Labelling? You have to know where everything is in this program to find it. Tag names are used in the descriptions only. Lose those, and your goose is cooked. There is no organization of the control system. The major program revisions are "Analog", "Annunciator", "Motors", "Solenoids", and so forth. The sheer overhead that is unneeded in this program would make you cry.
Personally, with RSL5000, I like to label a section as to what it's for, such as "Sump Pump", "Dry Oil Tank" or "SAFE CHARTS" (that one is needed, but alas, I don't have it! Scattered throughout). There might be only one or two rungs in each section, but you will always, immediately, see what you need to see. I'm glad the PLC I have runs fast, but boy oh boy they could have hired someone like... me! when they did this job. There's a little documentation in the program, but it was done by a company that got fired during the middle of construction, and the fixes were done by someone else working with this system. I'm the programmer/maintainer now.
Yes, document it like crazy. If your PLC allows it, make your program tags mean something to someone else, as well.