Is it “Use” or “Reuse”?

In software engineering, it is an old question whether you are “using” a component or whether you are “reusing” it. People tend to use these two terms interchangeably, annoying those among us who are trying to put precise meaning to terms. Alas, I don’t know of a good commonly accepted definition. I only know that “reuse” is an over-used term, mostly because “reusing” has more cache than “using”.

In (open source) copyright law, the textbooks distinguish between collective and derivative works. In a collective work, software components are put together as is, possibly with some glue code around them. In a derivative work of some component, the original component is modified (that is, its source code is changed). A derivative work can of course be used as part of a collective work.

To me it seems like a component used as part of a collective work is being used, and a component of which a derivate work is being created is being reused.

Thus, calling functions of some component in a collective work means using that component. Sub-classing a class and using its inheritance interface also means just using that class. Any form of linking or making dynamic calls, even to remote processes, are forms of using the respective component.

You are only reusing some component if you are changing its source code (or maybe some meta data) to adapt it to some unforeseen context. For that, you need to create a derivative of the component, as the lawyers would say. (I realize that lawyers may not agree on such a simple notion of derivative work, but then I’m not asking they decide over use vs. reuse. I’m only saying we should use the distinction between collective and derivate work to decide on use vs. reuse.)

Like this:

Related

3 Replies to “Is it “Use” or “Reuse”?”

The problem you are facing is not that people are unwilling to agree that there is a distinction between the two notions you are describing, but that they are unwilling to redefine the normal use of words.
In normal English vernacular, to use any tool simply means to employ it for some function. To reuse a tool means that it has been employed before for some function and is being employed again. It is natural then to speak of the use of a software library in another context from which it was originally created as “re-use”.
If we, as a software development community, are to formulate rules about when something should be “used” and when something is to be “reused” as Udi Dahan has attempted to do in his article “The Fallacy of Reuse”, we need to choose a vocabulary that helps rather than hinders the understanding of the ideas we are trying to communicate.
Therefore, we should say you may “use” or “reuse” a software component if you are employing its function without modification to the original code, but that you are “using portions of” or “using a modified version of” a software component if you have taken some library which has portions of beneficial functionality which need modification to be applied to a new context.

Hi, Anonymous: Thanks for the thoughts.
I agree that reinventing words isn’t a good idea and that we should follow established semantics as long as it makes sense. Here my take at “common sense/semantics”:
In everyday, non-computer-science terminology, we use something until it breaks. Then we give it to some recycling facility for the materials to be reused.
I think that’s what we do in software too. We use and use and use a library as we see fit and as the library reasonably permits. When we can’t do so any longer, because things keep breaking, we retrofit (“recycle”) the library by modifying it, thereby reusing it to form a new (derived) library. That new library then we can start using. That’s the same distinction between a collective and a derived work.
My best guess is that this is what you are saying too, except that your comment implies a much narrower context before one switches from using to reusing. I think as long as it ain’t broken (wrt intended use), you can’t reuse it.