Software maintenance consists of fixing problems, adding features, or migrating to new environments. Consequently it can take the shape of hourly work, a project within an existing system, or new design.

If the person(s) performing software maintenance are not the same as those who designed and implemented it, a considerable learning curve can be expected. A reverse engineering or re-engineering effort, whose size is inversely proportional to the amount and quality documentation is required to avoid hit or miss fix attempts which often don't work and can degrade the project's quality.

A somewhat dated but still relevant discussion of software maintenance is available here.