In the UNIX tree, directories serve two purposes: differentiate categories of files and differentiate their location in the network. Files of the ``executable'' category from all applications are stored in six directories: /bin, /usr/bin, /usr/local/bin, /sbin, /usr/sbin and /usr/local/sbin2, where the criteria of choice to determine which of those six directories is used for a given file is basically its physical location (local or remote). Still, some programs are installed in other locations than those dictated by the above rules. For instance, the File System Hierarchy standard has an arbitrary list of which executable files should be stored at the /bin directory.
Some programs assume that certain files are stored in specific locations (for example, /lib/cpp, /usr/bin/python). This is a source of incompatibilities, even between different Linux distributions that follow the traditional model of directories. But the biggest problem caused by this approach is the difficulty in the removal of programs, since files of different applications are mixed in the same directories and different files from a single application are spread throughout a number of directories.
The solution used by companies and organizations that develop Linux distributions in order to maintain a correspondence between individual files and applications is ``package managing'', that is, installing and removing software using a program that maintains a database that relates existing files in the system to the applications from which they were originated. The main limitation of this method is the fact that installation of applications from source code generates inconsistencies in the database.
A common practice is to keep the /usr hierarchy maintained by the package manager and target the installation of programs compiled locally to /usr/local. This keeps the database consistent, but does not solve the issue on how to remove programs installed from source.
The UNIX hierarchy standard defined an extra directory, /opt, to allow groups of applications to be installed separately from the rest. This can be considered an acknowledgment of the existence of the problems enumerated above. Further, this causes a conflict of criteria in the standard itself.