johnson@m.cs.uiuc.edu (07/08/90)
This article is a response to one by cliffhanger@cup.portal.com (Cliff Heyer).
First, let me say that I agree with Cliff's main point, that
building software is research and not construction. There are
some people for whom building software is construction. They
keep building the same software over and over again. These
people are mostly in data processing shops. They are the people
how should be using 4th generation languages. Or, put another way
/However, these guys should be reusing software instead of rebuilding
/it.
to which Cliff replied:
>Try it sometime, it's not as easy as you think.
He then went on to say why software reuse will not happen.
I am a Smalltalk programmer. Almost by definition, this means
that I reuse software everyday. Sometimes I reuse it in small
chunks, like a sequence or a set. Sometimes I reuse it in large
chunks, like a drawing package. I'm an academic, so I can't tell
you how I beat my competitors to market and make lots of money,
though I've heard plenty of commericial people who use Smalltalk
say that, and I know that my students tend to build their research
systems a lot faster than other faculty expect.
As you might think, I take a dim view of arguments that reuse
is impossible. Cliff's argument about the date validation function
assumed that the routine was not flexible enough and could not be made
more flexible because source was not available. This just implies that
either software has to be flexible enough or it has to be extensible,
i.e. you have to be able to extend it when needed. I share Cliff's
view that no one software package is going to be flexible enough to
meet everybody's needs, so that means that reusable software has to be
extensible. This is certainly no surprise to an object-oriented programmer.
Actually, I have never reused software without source. I am not sure
that I could, or that I would want to. Unlike Brad Cox, I think that
a successful reusable components business will depend on source code.
Although it is theoretically possible to document classes well enough
that they can be extended without access to their source, it seems much
more likely that people will just sell the source and not improve their
documentation standards. As people have explained, really good documentation
is as hard as or harder to write than good code. Current documentation is
good enough most of the time, and when it isn't I can read the source.
I think that many people, including Cliff, do not quite understand what
we mean by "building software from reusable components". We do not mean
that every line of the program is reused. Although my goal in creating
a class library is to make it so flexible that it can be reused without
further programming, that is an impossible dream. Even well developed
class libraries, such as those for user interfaces, require programming
to use. There are quite a few Smalltalk applications that do not require
any new user interface classes, but can be built entirely from the standard
classes. However, more often than I'd like, I have to make a subclass of
View or of Controller. In one sense, I'm still reusing software, because
a subclass inherits a lot of code from its superclasses. However, I
have to create new classes and write code for them, and so it is not
as simple as "plugging objects together".
Even when I don't have to write any user interface classes, I have to
write application classes and hook my objects up to user interface objects.
Thus, I always have to write code. Getting the user interface "for free"
means that I save a lot of time that I can use for building another system.
The purpose of software reuse is not to eliminate programming but to
eliminate *unnecessary* programming. Although some of what we do
when we design new systems is creative, some of it is routine, simply
regurgitating algorithms and data structures that we have learned
in the past. Software reuse lets us stop regurgitating. In other
words, it will eliminate that part of building software that is
predictable and so emphasize the creative part that is not predictable.
In that sense, object-oriented programming is going to make the problem
that Cliff mentions worse. However, it will greatly decrease the amount
of time that it takes to build software. Managers still won't know how
much time it takes to build software, but they will know that it takes
less time than it used to.
Reducing the time it takes to build software by an order of magnitude
can have a very big impact on the way one develops software. Iteration
and rapid prototyping are preached by the Smalltalk community because
they *can* build prototypes rapidly. I think that the managerial
implications will be profound, but I don't think anybody understands
them yet.
There are lots of unsolved problems with OOP and software reuse.
Writing reusable software is very hard, it is just reusing it that
is easy. We need to figure out how to make a marketplace for
components, since that seems to be happening very slowly. We need
to figure how to manage OOP projects, how to test OOP systems, how
to document them, etc. Thus, I am not claiming that OOP will solve
all your problems, but I do claim that it will give you a big enough
advantage that everybody will be using it in the future.
I'll finish with a story. I met a fellow on an airplane to San Francisco
who was a consultant with belt-way bandits. He was a Smalltalk programmer,
and he would build the prototypes that the belt-way bandits would use
when they were trying to sell the military on their project. He said
that he would spend the morning talking to his customer and spend the
afternoon building a prototype. The next morning, he would show it to
the customer, find what they didn't like, and make another iteration.
Most customers were completely blown away the first time he returned
with an executable prototype, since they expected another question and
answer session, not a demo. I imagine he has lots of repeat customers.
Ralph Johnson -- University of Illinois at Urbana-Champaign
mitchell@community-chest.uucp (George Mitchell) (07/09/90)
In article <39400113@m.cs.uiuc.edu> johnson@m.cs.uiuc.edu wrote:
`....
`The purpose of software reuse is not to eliminate programming but to
`eliminate *unnecessary* programming. Although some of what we do
`when we design new systems is creative, some of it is routine, simply
`regurgitating algorithms and data structures that we have learned
`in the past. Software reuse lets us stop regurgitating. In other
`words, it will eliminate that part of building software that is
`predictable and so emphasize the creative part that is not predictable.
`In that sense, object-oriented programming is going to make the problem
`that Cliff mentions worse. However, it will greatly decrease the amount
`of time that it takes to build software. Managers still won't know how
`much time it takes to build software, but they will know that it takes
`less time than it used to.
This emphasis on programming and building reflects much of what I think is
wrong about the way we usually view reuse. The major cost of software is in
maintenance, not development. The major cost of development is not in coding.
To gain the greatest benefit from reuse, we need to have components that can
be incorporated without alteration, without unit test, and without subsequent
maintenance. What needs to be available in the component market place is not
only code, but test data, warranties, and life cycle support.
--
George Mitchell, MITRE, MS Z676, 7525 Colshire Dr, McLean, VA 22102
email: gmitchel@mitre.org [alt: mitchell@community-chest.mitre.org]
vmail: 703/883-6029 FAX: 703/883-5519
jwg1@gte.com (James W. Gish) (07/10/90)
In article <112789@linus.mitre.org> mitchell@community-chest.uucp (George Mitchell) writes: > > This emphasis on programming and building reflects much of what I think is > wrong about the way we usually view reuse. The major cost of software is in > maintenance, not development. The major cost of development is not in coding. > To gain the greatest benefit from reuse, we need to have components that can > be incorporated without alteration, without unit test, and without subsequent > maintenance. What needs to be available in the component market place is not > only code, but test data, warranties, and life cycle support. This may be what we need, but with the possible exception of very general pieces of code, I don't think we're going to get very much of it. It is far too difficult as a designer/coder to envision how your code is going to be used in the future, either its context or the exact requirements imposed on it. When we write code, we usually do it with a particular context or application domain and framework (for example, error handling/reporting) in mind. However, when we go looking for code to use/reuse, unless the intended context and framework meet our requirements, we will have to adapt that code to our needs. We may want more or less functionality than the code provides, we may not be able to satisfy its requirements in one way or another. I have done a fair amount of programming in Eiffel over the past year or so. I like the language a lot. ISE, the suppliers of the Eiffel compiler, claim to provide a library of reusable classes. The folks at ISE have put a lot of work into the classes in an attempt to make them reusable. I've put a lot of hours into trying to use many of these classes. In many cases, in particular the graphics classes, it has been a difficult and time-consuming experience. Part of the problem is with the documentation, but even if the documentation were perfect, a fundamental problem exists: the designers had a particular model of computation, a particular style, a particular context, a particular application in mind when they put together these classes. Unfortunately, my model, my style, my context and specifically my use of these classes didn't exactly match what was provided. The question is, how do you overcome these differences? In some of the cases I found that changes in the language would have helped me make the adaptations necessary to the existing classes, even if I hadn't had the code - which Eiffel requires. However, no changes to the language/documentation could help me come to grips with some of the differences. In order to make use of these classes, I needed to make changes to the existing code. Failing that, I simply would have had to start from scratch (which, BTW, in retrospect would have saved me many painful hours). It's easy to say make it right, provide the test cases, documentation and everything I need to use it as is, but the reality is that none of us is omniscient enough to foresee how our code is going to be used, especially in the ever-changing world of computers and their expanding domains. So, for the foreseeable future I believe our best hope is in providing intelligent tools for assisting us in adapting code and associated artifacts including, for example, documentation and test cases, to new uses. -- Jim Gish (jgish@gte.com) Principal Investigator Software Reusability Project GTE Laboratories Inc.
mitchell@community-chest.uucp (George Mitchell) (07/11/90)
In article <JWG1.90Jul9174438@bunny.gte.com> jwg1@gte.com (James W. Gish) wrote: `In article <112789@linus.mitre.org> mitchell@community-chest.uucp (George Mitchell) writes: `> This emphasis on programming and building reflects much of what I think is `> wrong about the way we usually view reuse. [....] `It is far too difficult as a designer/coder to envision how your `code is going to be used in the future, either its context or the `exact requirements imposed on it. When we write code, we usually do `it with a particular context or application domain and framework (for `example, error handling/reporting) in mind.... ` `So, for the foreseeable future I believe our best hope is in `providing intelligent tools for assisting us in adapting code and `associated artifacts including, for example, documentation and test `cases, to new uses. This comment reflects what I feel is an improper emphasis on implementation. It is partly because of the pervasiveness of this mindset that the appraisal of the "foreseeable future" is probably quite correct. However, if we are able to look at reuse from the total life-cycle, it can be possible [in a domain ANALYSIS] to identify domain specific objects with standardized interfaces. It can also be possible to DESIGN objects that provide the minimum essential functionality which can be extended without object modification. In IMPLEMENTATION it can be possible to create code and documentation that will permit the object to be easily reused and maintained. In MAINTENANCE it can be possible to have a domain wide CM program and provide support to all users. Finally, in the user statement of REQUIREMENTS it can be possible to communicate the requirements for a new system (at least partially) in terms of the previously specified objects that will compose that system. -- George Mitchell, MITRE, MS Z676, 7525 Colshire Dr, McLean, VA 22102 email: gmitchel@mitre.org [alt: mitchell@community-chest.mitre.org] vmail: 703/883-6029 FAX: 703/883-5519
ejp@icd.ab.com (Ed Prochak) (07/11/90)
In article <JWG1.90Jul9174438@bunny.gte.com>, jwg1@gte.com (James W. Gish) writes: > In article <112789@linus.mitre.org> mitchell@community-chest.uucp (George Mitchell) writes: > > > > > This emphasis on programming and building reflects much of what I think is > > wrong about the way we usually view reuse. The major cost of software is in > > maintenance, not development. The major cost of development is not in coding. > > To gain the greatest benefit from reuse, we need to have components that can > > be incorporated without alteration, without unit test, and without subsequent > > maintenance. What needs to be available in the component market place is not > > only code, but test data, warranties, and life cycle support. > > This may be what we need, but with the possible exception of very > general pieces of code, I don't think we're going to get very much of > it. It is far too difficult as a designer/coder to envision how your > code is going to be used in the future, either its context or the > exact requirements imposed on it. When we write code, we usually do > it with a particular context or application domain and framework (for > example, error handling/reporting) in mind. However, when we go > looking for code to use/reuse, unless the intended context and > framework meet our requirements, we will have to adapt that code to > our needs. We may want more or less functionality than the code > provides, we may not be able to satisfy its requirements in one way or > another. > [experience with Eiffel deleted] > > It's easy to say make it right, provide the test cases, documentation > and everything I need to use it as is, but the reality is that none of > us is omniscient enough to foresee how our code is going to be used, > especially in the ever-changing world of computers and their expanding > domains. So, for the foreseeable future I believe our best hope is in > providing intelligent tools for assisting us in adapting code and > associated artifacts including, for example, documentation and test > cases, to new uses. > > -- > Jim Gish (jgish@gte.com) > Principal Investigator > Software Reusability Project > GTE Laboratories Inc. That is exactly why there will be different supliers of software components. Each supplier will conform to a standard interface, but the component from each supplier will have slightly different characteristics. You then pick the one that most closely matches you needs. The hardware analogy shows this: the designer picks -a memory chip from hitachi -a processor from motorola -a digital to analog converter from TI -LED's from HP -and so on... Whatever works use it! as my freshman Chemistry professor always used to say. To get all this to work in software requires: 1 documentation that reasonably describes the component (interface, performance, "power" requirements) 2 standard interfaces so replacing the component is possible with little or no change in the specific application code. Finally, let me say that the components catalog that has been described would contain components for every problem. We need to start small. And actually in some sense we have already started with components like: operating systems drivers and communications protocols standard libraries (e.g. stdio in C) The point being that no one is claiming to have the perfect components for all occasions. Hardware designers for embedded systems often have do deal with more than just digital circuitry. Even analog hardware has some standard compoments (op-amps, bridge rectifiers, power transisters,...) A friend, who is a hardware type, often described what he was doing as editing, whenever he was building a circuit.) So the hardware analogy is valid when we remember that hardware is more than just digital. (Pardon the inconvenience during our remodelling of the signature file) Edward J. Prochak (216)646-4663 I think. {cwjcc,pyramid,decvax,uunet}!ejp@icd.ab.com I think I am. Allen-Bradley Industrial Computer Div. Therefore, I AM! Highland Heights,OH 44143 I think? --- Moody Blues
paj@mrcu (Paul Johnson) (07/11/90)
In article <JWG1.90Jul9174438@bunny.gte.com> jwg1@gte.com (James W. Gish) writes: ...... [Quoted argument from mitchell@community-chest.uucp (George Mitchell) about components being re-used without alteration] >This may be what we need, but with the possible exception of very >general pieces of code, I don't think we're going to get very much of >it. It is far too difficult as a designer/coder to envision how your >code is going to be used in the future, either its context or the >exact requirements imposed on it..... >I have done a fair amount of programming in Eiffel over the past year >or so. I like the language a lot. ISE, the suppliers of the Eiffel >compiler, claim to provide a library of reusable classes. The folks >at ISE have put a lot of work into the classes in an attempt to make >them reusable. I've put a lot of hours into trying to use many of >these classes. In many cases, in particular the graphics classes, it >has been a difficult and time-consuming experience. Part of the >problem is with the documentation, but even if the documentation were >perfect, a fundamental problem exists: the designers had a particular >model of computation, a particular style, a particular context, a >particular application in mind when they put together these classes. >Unfortunately, my model, my style, my context and specifically my use >of these classes didn't exactly match what was provided. I am also an Eiffel programmer who likes the language (Note: I have no other connection with ISE) and I would like to argue with you about this. I agree with your comments on the ISE graphics classes: they seem to have been hacked together for the "GOOD" browser (which isn't: I use the Curses one). Extensions are difficult, partly because too much low level stuff for them is written in C (I find this worrying: it seems like any time Eiffel does something difficult and interesting, you find it implemented in C: perhaps this will be fixed in Eiffel 3.0. I see the need for SOME C to underlie the implementation, but Eiffel 2.2 seems to contain a great deal more than necessary). I disagree with your comments about re-use in general. It may be difficult for an author with a particular application in mind to envisage all possible uses for a proposed re-usable class, but I do not think it impossible to arrive at a reasonable subset. My own mental attitude when designing re-usable classes is to imagine that I had found the proposed class in a library and ask: what facilities would I expect it to have? IMNHO the emphasis for a re-usable class must be on the concepts it supports, not on the implementation or the currently envisaged application. When the need for a class or class framework within a project is identified, the design of that class or framework should become a separate project. Meyer writes of extracting and brushing up classes after an application is finished. I disagree, and I think that the Eiffel graphics library is an example of what happens when this approach is employed. None of this should be taken as Eiffel bashing, or even ISE bashing, and certainly not Meyer bashing. Eiffel is an excellent language and ISE and Dr. Meyer are to be complimented on it. Its just the approach to class design that I don't like, and I feel that some parts of the library reflect what I see as mistakes. Paul. NOTE: I am crossposting this to comp.lang.eiffel so as to give Dr. Meyer a chance to see it and reply. If you do follow up, please consider which group(s) should see your article. TNX. PJ. -- Paul Johnson UUCP: <world>!mcvax!ukc!gec-mrc!paj --------------------------------!-------------------------|------------------- GEC-Marconi Research is not | Telex: 995016 GECRES G | Tel: +44 245 73331 responsible for my opinions. | Inet: paj@uk.co.gec-mrc | Fax: +44 245 75244
cox@stpstn.UUCP (Brad Cox) (07/11/90)
In article <JWG1.90Jul9174438@bunny.gte.com> jwg1@gte.com (James W. Gish) writes: >In article <112789@linus.mitre.org> mitchell@community-chest.uucp (George Mitchell) writes: > >It's easy to say make it right, provide the test cases, documentation >and everything I need to use it as is, but the reality is that none of >us is omniscient enough to foresee how our code is going to be used, >especially in the ever-changing world of computers and their expanding >domains. So, for the foreseeable future I believe our best hope is in >providing intelligent tools for assisting us in adapting code and >associated artifacts including, for example, documentation and test >cases, to new uses. You've put your finger squarely on the difficulty of cleaning up our software act. But, like Fred Brooks in "No Silver Bullet", you are viewing our prison walls, the software crisis, as an immovable obstacle rather than an infinite force, an irresistable incentive to escape. So long as we avoid coming to terms with incentives for providing test cases, documentation, and "everything I need to use it as is", we'll be stuck in the software crisis, no matter how intelligent we make our code adaptation tools. Because code adapation tools don't come to terms with the real problem, bringing division of labor to bear on software. The solution, the "silver bullet" is so simple to state, but so difficult to apply. To wit, it is to change the *culture*, not the *technology*, for example by creating a marketplace where the *consumers* are empowered to reimburse those who do things right, rather than as today, for doing things *wrong*. An example of the wrong way is the cost+fixed fee system. An example of the right way is the U.S. Ordnance Bureau + Congress's determination to have guns with interchangeable parts, *nomatter the initial cost*, and nomatter the gunsmith's objections. -- Brad Cox; cox@stepstone.com; CI$ 71230,647; 203 426 1875 The Stepstone Corporation; 75 Glen Road; Sandy Hook CT 06482
jwg1@gte.com (James W. Gish) (07/12/90)
In article <112896@linus.mitre.org> mitchell@community-chest.uucp (George Mitchell) writes: > In article <JWG1.90Jul9174438@bunny.gte.com> jwg1@gte.com (James W. Gish) > (That's me) wrote: > `So, for the foreseeable future I believe our best hope is in > `providing intelligent tools for assisting us in adapting code and > `associated artifacts including, for example, documentation and test > `cases, to new uses. > > This comment reflects what I feel is an improper emphasis on > implementation. It is partly because of the pervasiveness of this > mindset that the appraisal of the "foreseeable future" is probably quite > correct. However, if we are able to look at reuse from the total > life-cycle, it can be possible [in a domain ANALYSIS] to identify domain > specific objects with standardized interfaces. It can also be possible > to DESIGN objects that provide the minimum essential functionality which > can be extended without object modification. In IMPLEMENTATION it can > be possible to create code and documentation that will permit the object > to be easily reused and maintained. In MAINTENANCE it can be possible > to have a domain wide CM program and provide support to all users. > Finally, in the user statement of REQUIREMENTS it can be possible to > communicate the requirements for a new system (at least partially) in > terms of the previously specified objects that will compose that system. > This would be a nice world to live in, but I don't think its terribly realistic. I think that this is a noble goal which we should continue to strive for, but I'm not convinced we will achieve it until we change some of our fundamental notions of software development. In particular, our idea of parts or components needs to be changed drastically of any kind of reasonable construction of parts to work like you want. Subroutines and parameters or even objects and methods as we know them today just DON'T cut it; they are just not easily composable. We desperately need some new ideas here. As far as domain analysis goes, the difficulty is that you don't just do a domain analysis and things are fine and stable from that point forward; domains evolve, and your standardized interfaces have to evolve along with the domains. Also, 'domains' are not something that you can easily define the boundaries of; I don't know of any that are completely self-contained. What ever you define your domain to be, it consists of many overlapping, co-dependent domains. The way to address this is to decide in what context, what model of computation, you want to use the results of your domain analysis. But context is related to the application(s) of interest in the domain. And here's the rub - new applications and technologies arise and, in effect, invalidate the requirements you made on your original domain analysis, further destabilizing your standard interfaces. But it is important to continue dreaming and striving... -- Jim Gish (jgish@gte.com) Principal Investigator Software Reusability Project GTE Laboratories Inc.
bertrand@eiffel.UUCP (Bertrand Meyer) (07/13/90)
From <558@argus.mrcu> by paj@mrcu (Paul Johnson): > > Meyer writes of extracting and brushing up > classes after an application is finished. What I wrote was, I hope, somewhat more nuance'. The observation to which Mr. Johnson refers is descriptive rather than prescriptive: many good reusable components have evolved from more specialized ones through a process of generalization. If you can write components that are reusable right from the start, then great. But an ``existence proof'' is required: you cannot be sure that a component is reusable until you have shown it to be at least usable. If the component's initial avatar was as an element of a specific but reasonably successful system, it has passed that first test - certainly not a sufficient condition, but a necessary one. The comment also has a more practical side. To develop good reusable components, it is certainly better to have as your official charter the development of reusable software components. Most people, however, work in a context where managerial concerns are more short-term; the decision makers want to see working programs more than they want to see high-quality reusable components. This is what (in published discussions of these topics) I have called the traditional ``project culture'', as opposed to the ``component culture'' fostered by object-oriented techniques. Since most people work in an environment where the project culture is the dominant one, the more modest approach to reusability - building up reusable components from specific ones, as opposed to more ambitious efforts having reusability as their avowed goal - may be the only practical one. I have seen it work quite well. I agree with Mr. Johnson that its success requires the designer to have a mental model of future component usage which goes beyond the original application. The only way to validate this model is to apply the components successfully to two or more widely different applications. -- -- Bertrand Meyer bertrand@eiffel.com
dwiggins@atsun.a-t.com (Don Dwiggins) (07/28/90)
In article <5351@stpstn.UUCP> cox@stpstn.UUCP (Brad Cox) writes:
The solution, the "silver bullet" is so simple to state, but so difficult
to apply. To wit, it is to change the *culture*, not the *technology*,
for example by creating a marketplace where the *consumers* are empowered
to reimburse those who do things right, rather than as today, for doing
things *wrong*. An example of the wrong way is the cost+fixed fee system.
An example of the right way is the U.S. Ordnance Bureau + Congress's
determination to have guns with interchangeable parts, *nomatter the
initial cost*, and nomatter the gunsmith's objections.
The motivation for interchangeable gun parts was pretty clear to the
consumers, e.g. the ability to make quick repairs in the field. What's the
consumer's motivation when the programs look the same to him/her, no matter
how they're built? Can we make a persuasive case that reusability leads to
faster/better/cheaper (especially when this case is in dispute among the
producers)?
--
Don Dwiggins "If you think training is expensive,
Ashton-Tate, Inc. try ignorance"
dwiggins@ashtate.a-t.com -- Derek Bok, Harvard U.
duncan@dduck.ctt.bellcore.com (Scott Duncan) (07/30/90)
In article <DWIGGINS.90Jul27174047@atsun.a-t.com> dwiggins@atsun.a-t.com (Don Dwiggins) writes: >The motivation for interchangeable gun parts was pretty clear to the >consumers, e.g. the ability to make quick repairs in the field. What's the >consumer's motivation when the programs look the same to him/her, no matter >how they're built? Can we make a persuasive case that reusability leads to >faster/better/cheaper (especially when this case is in dispute among the >producers)? I'd say that the motivation for customers of software would be a bit different since it isn't likely they could repair software in the field. However, there is a great desire on the part of software consumers, I believe, for customiz- able (in the field) software. Hence, offering a user modules that can be "re- uysed" with one another in different combinations might be a worthwhile con- sumer-oriented approach to reuse. I think folks often conceive of "reuse" as having to do with uncompiled, un- linked, unpackaged source code. But the example of command shell languages suggests, with the proper model of input/output, reuse (recombination to achieve customization) is quite possible at an executable, rather than a source, level. Speaking only for myself, of course, I am... Scott P. Duncan (duncan@ctt.bellcore.com OR ...!bellcore!ctt!duncan) (Bellcore, 444 Hoes Lane RRC 1H-210, Piscataway, NJ 08854) (908-699-3910 (w) 609-737-2945 (h))