1. A computer-implemented method for facilitating development and maintenance of a software program, comprising: obtaining a role associated with a dependency of a consumer in the software program on an interface, wherein the role specifies that the consumer calls or implements the interface, and wherein the role is obtained from a definition file that is separate from source code files for the software program; obtaining a compatibility policy for the interface from the definition file, wherein the compatibility policy corresponds to a module that provides the interface and comprises a reverse dependency constraint that specifies one or more allowable versions and a second role associated with the one or more allowable versions for the consumer, wherein, based on the second role, the reverse dependency constraint specifies that one of callers of the interface or implementers of the interface can depend on the interface; and using the role and the compatibility policy to manage use of the interface by the consumer in the software program by: when the second role specifies a caller of the interface, allowing the consumer to use the interface only when the role specifies that the consumer calls one or more functions of the interface and the consumer expresses a dependency on a version of the module that matches the one or more allowable versions, and when the second role specifies an implementer of the interface, allowing the consumer to use the interface when the role specifies that the consumer implements the interface and the consumer expresses a dependency on a version of the module that matches the one or more allowable versions.