All programs require user documentation, otherwise they are not understandable.
For some programs, configuration may be necessary (or helpful) too; it really depends what program. (However, compile time configuration is sometimes better than run time configuration, depending on the specific details, probably.)
I do believe object-oriented programming is overused (although it is sometimes helpful, often it isn't).
Programs should be versatile, but this can be done without too much complexity; often just being able to combine with other programs that can do the other things, can be helpful, like UNIX systems with many programs can use pipes together, etc.