I was asked by a colleague to explain clearly the difference between ordinary development and research and development (R&D) and was unable to do it. After reading Wikipedia, I still don't have the precise answer.
According to Wikipedia (slightly modified):
There are two primary models:
In one model, the primary function is to develop new products;
in the other model, the primary function is to discover and create new knowledge about scientific and technological topics for the purpose of uncovering and enabling development of valuable new products, processes, and services.
The first model is confusing. Does it mean that development (not R&D) consists exclusively in adding new features to a product, solving bugs and doing maintenance? What if something which was previously developed as a new feature becomes a separate product?
The second model is less confusing, but still, how to qualify whether something is new knowledge or existent knowledge which is just rediscovered?
Later, Wikipedia adds that ordinary development is different from R&D because of its:
nearly immediate profit or immediate improvement.
It's still not clear enough. How to qualify "nearly immediate profit"? What if a task has an immediate profit but requires heavy research? Or if it is basic but has uncertain profit, like the enforcement of a common style over the codebase?
For example, does it belong to development or R&D to:
Develop an engine which abstracts the access to the database, simplifying and shortening enormously the code of other applications (existent or ones which will be written in future) which should access to the database?
Establish a new service-oriented architecture for the entire organization of company resources, in order to move from a bunch of separate and autonomous applications to a set of well-organized, interconnected web services, like what is used by Amazon?
Design a new communication protocol to allow faster replication of data between two data centers of the company?
Conceive a new type of software testing while working on a specific product, knowing that this type of testing will improve/simplify the testing process?
Prove that Functional programming is more appropriate than OOP for a specific application, based on evidence, logic and previous experience?
Enhance the existent application by adding gestures on tactile screens, after doing studies and testing that shows that those gestures improve the productivity of the users by a ratio of at least 1.4 for a precise set of tasks?
Find a way to strongly enhance the Power usage effectiveness (PUE) of a data center?
Create a Domain-Specific Language (DSL)?
In short, how could I determine whether I'm doing R&D while working on something?