EDIT: Answer from Professor Guibas:
from Leonidas Guibas guibas@cs.stanford.edu to
of the "Red-Black" term mailed-by cs.stanford.edu hide details 16:16
(0 minutes ago)
we had red and black pens for drawing the trees.
I believe the term first appeared in "A dichromatic framework for balanced trees" from Leonidas J. Guibas and Robert Sedgewick in 1978.
"Single Entry, Single Exit" was written when most programming was done in assembly language, FORTRAN, or COBOL. It has been widely misinterpreted, because modern languages do not support the practices Dijkstra was warning against.
"Single Entry" meant "do not create alternate entry points for functions". In assembly language, of course, it is possible to enter a function at any instruction. FORTRAN supported multiple entries to functions with the ENTRY
statement:
SUBROUTINE S(X, Y)
R = SQRT(X*X + Y*Y)
C ALTERNATE ENTRY USED WHEN R IS ALREADY KNOWN
ENTRY S2(R)
...
RETURN
END
C USAGE
CALL S(3,4)
C ALTERNATE USAGE
CALL S2(5)
"Single Exit" meant that a function should only return to one place: the statement immediately following the call. It did not mean that a function should only return from one place. When Structured Programming was written, it was common practice for a function to indicate an error by returning to an alternate location. FORTRAN supported this via "alternate return":
C SUBROUTINE WITH ALTERNATE RETURN. THE '*' IS A PLACE HOLDER FOR THE ERROR RETURN
SUBROUTINE QSOLVE(A, B, C, X1, X2, *)
DISCR = B*B - 4*A*C
C NO SOLUTIONS, RETURN TO ERROR HANDLING LOCATION
IF DISCR .LT. 0 RETURN 1
SD = SQRT(DISCR)
DENOM = 2*A
X1 = (-B + SD) / DENOM
X2 = (-B - SD) / DENOM
RETURN
END
C USE OF ALTERNATE RETURN
CALL QSOLVE(1, 0, 1, X1, X2, *99)
C SOLUTION FOUND
...
C QSOLVE RETURNS HERE IF NO SOLUTIONS
99 PRINT 'NO SOLUTIONS'
Both these techniques were highly error prone. Use of alternate entries often left some variable uninitialized. Use of alternate returns had all the problems of a GOTO statement, with the additional complication that the branch condition was not adjacent to the branch, but somewhere in the subroutine.
Thanks to Alexey Romanov for finding the original paper. See http://www.cs.utexas.edu/users/EWD/ewd02xx/EWD249.PDF, page 28 (printed page number is 24). Not limited to functions.
Best Answer
The etymologic history of computer jargon is well documented in the Jargon file (current version as of this writing is 4.4.8).
The specific term "Feature Creep" is listed as "New in 4.1.0" in the change log. 4.1.0 dates to March 12, 1999 and is defined as:
While this is the earliest use of the word in specific context, there are indications that the phrase existed earlier in some form.
The begining of each jargon file has a section on the various non-word aspects of the use of language by computer types.
In an early version of the Jargon file from 1981:
The "creeping featurism" entry suggests that the term may have been used, if not in that exact form of "feature creep".
Thus, language the term existed for certain in 1999 in the hacker (realize that the term "hacker" in the jargon file is a different group than it is today) community.
Indications that the phrase existed, though didn't formally enter the lexicon show up as early as 1981 and may have been common usage in the MIT and Stanford communities.
The concept of "feature creep" can be documented in 1975 as part of the Mythical Man Month. In one of the essays within this collection, "Second System Effect" is described. From the Wikipedia summary:
Realize the difference between the Mythical Man Month and the Jargon file likely represents two different cultures - the Mythical Man Month is from a project management perspective while the jargon file is more from the hacker/academic perspective.