I always start with an I/O point list. Then I create a list of alarms, and then a list of adjustments accessible to the operator. Finally I create a functional description that describes in text the sequence of operations and control functions for the system.
Then start writing the program. Use descriptive names for each coil, contact, etc. and lots of comments on each rung. The comments should relate back to the function description.
Group program functions. Put alarms in one section, and control in one section, etc. Keep logically related steps together. I avoid one shots and set/reset as much as possible because they can be hard to debug.