Methods for Software Prototyping

advertisement
Methods for Software Prototyping
Software stakeholders, testers and end-users find it very difficult to express the real
requirements. It is almost impossible to predict how a system will affect end product, how the
software will interact with other existing systems and what user operations should be automated.
Careful requirements analysis along with systematic reviews of the requirements help to reduce
the uncertainty about what the system is intended to do and how it will perform. Therefore, there
is no real substitute for trying out a requirement before committing to it. Trying out a
requirement is possible if a prototype of the system to be developed is established.
A function described in a specification may seem useful and well defined. However, when that
function is used with functions, the users often find that their initial concept was incorrect or
incomplete. System prototypes allow stakeholders and users to experiment with requirements
and to see how the system supports their concepts and ideas. Prototyping is a means of
requirements validation. Users discover requirements errors, omissions and specifications early
in the software life cycle process.
Software prototyping and hardware prototyping have different objectives. When developing
hardware systems, a prototype is normally used to validate the system design. An electronic
system prototype may be developed using off-the-shelf components before investment is made in
expensive, special-purpose integrated circuits to implement the production version of the system.
A software prototype is not normally intended for design validation but to help develop and
check the reality of the requirements for the system. The prototype design is usually different
from that of the final system.
Six benefits of developing a prototype early in the software life cycle process are:
1. Misunderstandings between software developers and users may be identified as the
system functions are demonstrated.
2. Missing user services may be detected.
3. Difficult-to-use or confusing user services may be identified and refined.
4. Software development staff may find incomplete and/or inconsistent requirements as the
prototype is developed.
5. A working, but limited, system is available quickly to demonstrate the feasibility and
usefulness of the application to management.
6. The prototype serves as a basis for writing the specification for a production quality
system.
According to Ince and Hekmatpour the principal purpose of prototyping is to validate
software requirements, software prototypes also have other uses (Ince and Hekmatpour, 1987):
1. User training: A prototype system can be used for training users before the final system
has been delivered.
2. System testing: Prototypes can run back-to-back tests. This reduces the need for tedious
manual checking of test runs. The same test cases are submitted to both the prototype and
the system under test. If both systems give the same result, the test case has not detected a
fault. If the results are different, this implies that the tester should look in more detail at
the reasons for the difference.
One way to view prototyping is as a technique of risk reduction. A significant risk in software
development is requirements errors and omissions. The costs of fixing requirements errors at
later stages in the process can be very high. Experiments have shown that prototyping reduces
the number of problems with the requirements specification and the overall development costs
may be lower if a prototype is developed. (Boehm et at. 1984)
A process model for prototype development is shown in Figure 1. The objectives of prototyping
should be made explicit from the start of the process. The objective may be to develop a system
to prototype the user interface; it may be to develop a system to validate functional system
requirements; or it may be to develop a system to demonstrate the feasibility of the application to
management. The same prototype cannot meet all objectives. If objectives are left implicit,
stakeholders, management or end-users may misunderstand the function of the prototype.
Consequently, they may not get the benefits that they expected from the developed prototype.
Figure 1. Process Model for Prototype Development
The next stage in the process is deciding what to put into and. perhaps more importantly, what to
leave out of the prototype system. Software prototyping is expensive if the prototype is
implemented using the same tools and the same standards as the final system. Thus, it may be
decided to prototype all system functions but at a reduced level.
Alternatively a subset of system functions may be included in the prototype. Normal practice in
prototype development is to relax the non-functional requirements. These may include
requirements like response time or memory utilization. Error handling and error management
may also be ignored or may be minimal unless the objective of the prototype is to establish a user
interface. Standards of reliability and program quality may also be reduced.
The final stage of the process model is evaluating the prototype. Ince and Hekmatpour suggest
that this is the most important stage of prototyping. Provision must be made during this stage for
testers and user training. Also, the prototype objectives should be used to derive test plans and
user scripts for evaluating the prototyped system. Stakeholders, testers and users need time to
become comfortable with the new system and to become familiar with the normal modes of
usage. Once they are using the system as they expect it to operate, they then discover
requirements errors, omissions or additional features they would like added.
In today's environment one major technical problems associated with prototyping involves the
need for rapid software development. However, there are non-technical, managerial problems,
which may make it difficult to use prototyping in some organizations:
•
Planning, costing and estimating a prototyping project is outside the experience of many
software project managers.
•
Procedures for change and configuration management may be unsuitable for controlling
the rapid change inherent in prototyping. However, if there are no change management
procedures, evaluation is difficult; the evaluators are trying to assess a constantly
changing system.
•
Managers may exert pressure on prototype evaluators to reach swift conclusions about
the prototype. These may result in inappropriate requirements.
A common argument against prototyping is that the cost of prototyping represents an
unacceptably large fraction of the total development costs. It may be more economic to modify a
finished system to meet unperceived needs than to provide an opportunity for stakeholders and
users to understand and refine their needs before the final system is built.
This may be true for some systems but effective prototyping increases software quality. It can
give software developers a competitive edge over their competitors. In the 1960's and 1 970's, the
US and European automobile industries did not invest in quality procedures. They lost a great
deal of their market share to higher quality Japanese automobiles. This is an illustration of how a
"build it cheap and fix it later" philosophy can be extremely expensive in the long term.
Although prototyping is now a well-established approach, there is little reported information
about the costs of prototyping and its influence on total system costs. An early study was
reported by Gomaa (1983) who describes the advantages of developing a prototype for a process
management and information system. Prototype development costs were less than 10% of the
total system costs. In the development of the production-quality system, there were no
requirements definition problems. The project was completed on time and the system was well
received by users. Bernstein (1993) has also reported user satisfaction and a reduction in
development time of 40% more recently.
Prototyping is a key technique in the spiral process model for risk evaluation. By developing a
prototype, requirements and design risks can be reduced. Short-term additional costs may result
in long-term savings as requirements and design decisions are mitigated during the prototyping
process.
Prototyping in the software process
It is difficult for stakeholders and the end-users to anticipate how they will use the new software
systems and how it will respond to support their everyday work. If these systems are large and
complex, it is probably impossible to make this assessment before the system is built and
installed on the target system.
One way of tackling this difficulty is to use an evolutionary or iterative approach to systems
development. This means giving the user a system, which is incomplete, and then modifying and
augmenting it iteratively, as the user requirements become clearer. Another decision might be
made to build a "throwaway" prototype to help requirements analysis, validation, tester and user
to establish their needs. After evaluation, the throwaway prototype is discarded and a
production-quality system built.
The distinction between these two approaches is that evolutionary prototyping starts out with a
limited understanding of the system requirements and the system is augmented and changed as
new requirements are discovered. There may never be a system specification document. The
software systems developed by the evolutionary approach may be unspecified. This may be that
the system and software engineers don't understand or know all the process and ramifications of
the system they are trying to automate. For example, it is impossible to specify many types of
Artificial Intelligent system because we don't understand how people solve problems. By
contrast, the throwaway prototype approach is intended to discover the system specification so
that the output of the prototype development phase becomes the specification from which the
requirements are derived from.
The important differences between the objectives of evolutionary and throw-away programming
is:
•
The objective of evolutionary prototyping is to deliver a working system to end-users.
•
The objective of throwaway prototyping is to validate or derive the system requirements.
In the evolutionary case, the first priority is to incorporate well-understood requirements in the
prototype then move on to the requirements that are unclear. In the throwaway prototype, the
priority is to understand requirements that are unclear. The system engineers therefore start with
those requirements that are not well understood. Requirements, which are straightforward
probably don't need to be prototyped.
Evolutionary prototyping
Evolutionary prototyping is based on the idea of developing an initial implementation, exposing
this to user comment and refining this through many stages until an adequate system has been
developed Figure 2.
Figure 2. Evolutionary prototyping
Evolutionary prototyping is one realistic way to develop systems where it is difficult or
impossible to establish a detailed system specification document. The key to success in the
evolutionary prototyping approach is to use techniques, which allow for rapid system iterations.
Suggested changes may be incorporated and demonstrated as quickly as possible. This may mean
using high level programming language such for software development. Special-purpose
environments and integrated software tools may be used to support and accelerate the
development process.
An important difference between evolutionary prototyping and a specification-based approach to
development is in verification and validation. Verification is only meaningful when a program is
compared to its specification. If there is no specification, verification is impossible. The
validation process should demonstrate that the program is suitable for its intended purpose rather
than its conformance to a specification.
The systems adequacy is not measurable and only a subjective judgment of a program 5
adequacy can be made. This does not invalidate its usefulness; human performance cannot be
guaranteed to be correct but we are satisfied if performance is adequate for the task in hand.
There are three problems with evolutionary prototyping, which are particularly important when
large, long-lifetime systems are being developed:
1. Existing software management structures are set up to deal with a software process model
that generates regular deliverables to assess progress. Prototypes usually evolve so
quickly that it is not cost-effective to produce a great deal of system documentation and
schedules.
2. Continual change tends to corrupt the structure of the prototype system. Maintenance is
therefore likely to be difficult and costly. This is particularly likely when the system
maintainers are not the original developers. The development teams are hardly ever
responsible for system maintenance.
3. It is not clear how the range of skills, which is normal in software engineering teams, can
be used effectively for this mode of development. Small teams of highly skilled and
motivated individuals have implemented the systems developed in this way.
These three problems do not mean that evolutionary prototyping should not be used. It allows
systems to be developed and delivered rapidly. System development costs are reduced. If the
stakeholders and users are involved in the development, the system is likely to be appropriate for
their needs. However, organizations that use this approach must accept that the lifetime of the
system will be relatively short. As its structure becomes unmaintainable, it must be completely
rewritten.
Throwaway prototyping
A software process model based on an initial throwaway prototyping stage is illustrated in Figure
3. The throwaway prototyping approach extends the requirements analysis process with the
intention of reducing overall life cycle costs. The principal function of the prototype is to clarify
requirements and provide additional information for managers to assess process risks. After
evaluation, the prototype is thrown away. It is not used as a basis for further system
development.
Figure 3 Throwaway prototyping
The process model in Figure 3 assumes that the prototype is developed from an outline or
abstract system specification, delivered for experiment and modified until the stakeholder or user
is satisfied with its functionality. At this stage, a conventional software process model is entered;
a specification is derived from the prototype and the system re-implemented in a final production
version. Components from the prototype may be reused in the production-quality system.
The stakeholders and end-users should resist the temptation to turn the throwaway prototype into
a delivered system. The reasons for this are:
1. Important system characteristics such as performance, security, robustness and reliability
may have been ignored during prototype development so that a rapid implementation
could be developed. It may be impossible to tune the prototype to meet these nonfunctional requirements.
2. During the prototype development, the prototype will have been changed to reflect user
needs. It is likely that these changes will have been made in an uncontrolled way. The
only design specification is the prototype code. This is not good enough for long-term
maintenance
.
3. The changes made during prototype development will probably have degraded the system
structure. The system will be difficult and expensive to maintain.
Rather than derive a specification from the prototype, it is sometimes suggested that the system
specification should be the prototype implementation itself. The instruction to the software
contractor should simply be "write a system like this one". There are also several problems with
this approach:
1. Important features may have been left out of the prototype to simplify rapid
implementation. It may not be possible to prototype some of the most important parts of
the system such as safety-critical elements.
2. A prototype implementation has no legal standing as a contract between customer and
contractor.
3. Non-functional requirements such as those concerning reliability, robustness and safety
cannot be adequately tested in a prototype implementation.
A general problem with throwaway prototyping is that the mode of use of the prototype may not
correspond with the way that the final delivered system is used. The tester of the prototype may
be particularly interested in the system and may not be typical of system users. The training time
during prototype evaluation may be insufficient. If the prototype is slow, the evaluators may
adjust their way of working and avoid those system features, which have slow response times.
When provided with better response in the final system, they may use it in a different way.
Incremental development
An incremental development model combines the advantages of evolutionary prototyping with
the control required for large-scale development projects was developed by Mills et al (1980).
This incremental development model (Figure 4) involves developing the requirements and
delivering the system in an incremental fashion. As a part of the system is delivered, the user
may experiment with it and provide feedback to the system developers. Incremental
development is a key part of the Cleanroom development process.
Figure 4. Incremental development
Incremental development avoids the problems of constant change, which characterize
evolutionary prototyping. An overall system architecture is established early in the process to
act as a framework. System components are incrementally developed and delivered within this
framework. Once these have been validated and delivered, neither the framework nor the
components are changed unless errors are discovered. User feedback from delivered
components however can influence the design of components scheduled for later delivery.
Incremental development is more manageable than evolutionary prototyping as the normal
software process standards are followed. Plans and documentation must be produced for each
system increment. It allows some user feedback early in the process and limits system errors, as
the development team is not concerned with interactions between quite different parts of the
software system. Once an increment has been delivered. its interfaces are frozen. Later
increments must adapt to these interfaces and can be tested against them.
A problem with incremental development is that the system architecture has to be established
before the requirements are complete. This means that the requirements tend to be constrained by
the architecture that is established. Another, non-technical problem is ihat this approach to
development does not fit well with established contractual models for software developers.
Contracts for the development must be flexible and established before the requirements are fixed.
Many organizations that use traditional engineering models for software procurement find it
impossible to adapt to the form of contract, which this approach requires.
Prototyping techniques
System prototyping techniques should allow the rapid development of a prototype system. As
staff costs are the principal software costs, rapid development means that prototype costs are
minimized. It also means that feedback from the stakeholder's users can be obtained early in the
overall software process.
There are a number of techniques, which have been used for system prototyping. These include:
•
Executable specification languages
•
Very high-level languages
•
Application generators and fourth-generation languages
•
Composition of reusable components.
These prototyping techniques are not mutually exclusive. They can be used in combination. One
part of the system may be generated using an application generator and linked to reusable
components that have been taken from existing systems. Luqi (1992) describes this mixed
approach, which was used to create a prototype of a command and control system.
Executable specification languages
If a system specification is expressed in a formal, mathematical language, it may be possible to
animate that specification to provide a system prototype. A number of executable formal
specification languages have been developed (Lee and Sluizer, 1985; Henderson and Minkowitz,
1986; Gallimore et al., 1989). DilIer (1994) discusses techniques of animating formal
specifications written in Z.
Developing a prototype from a formal specification is attractive in some ways as it combines an
unambiguous specification with a prototype. There are no additional costs in prototype
development after the specification has been written. However, there are practical difficulties in
applying this approach:
1. Graphical user interfaces cannot be prototyped using this technique. Although models of a
graphical interface can be formally specified (Took, 1986), these cannot be systematically
animated using current windowing systems.
2. Prototype development may not be particularly rapid. Formal specification requires a detailed
system analysis and much time may be devoted to the detailed modeling of system functions,
which are rejected after prototypes evaluation.
3. The executable system is usually slow and inefficient. Users may get a false impression of
the system and compensate for this slowness during evaluation. They may not use the system
in the same way they would use a more efficient version. Users may therefore define a
different set of requirements from those, which would be suggested if a faster prototype was
available.
4. Executable specifications only test functional requirements. In many cases, the nonfunctional characteristics of the system are particularly important so the value of the
prototype is limited.
The developers of functional languages which have been integrated with graphical user interface
libraries and which allow rapid program development have addressed some of these problems.
A functional language is a formal language where the system is defined as a mathematical
function. Evaluation of that function (which is obviously decomposed into many other functions)
is equivalent to executing a procedural program. Miranda (Turner,1985) and ML (Wikstrom,
1988) are practical functional languages, which have been used for the development of nontrivial prototypes.
Functional languages might also be classed as very high-level languages are discussed next.
They allow a very concise expression of the problem to be solved. Because of their mathematical
basis, a functional program can also be viewed as a formal system specification. However, the
execution speed of functional programs on sequential hardware is typically several orders of
magnitude slower than conventional programs. This means that they cannot be used for
prototyping large software systems.
Very high-level languages
Very high-level languages are programming languages, which include powerful data
management facilities. These simplify program development because they reduce many
problems of storage allocation and management. The language system includes many facilities,
which normally have to be built from more primitive constructs in languages like Pascal, Ada,
C++ and Java. Examples of very high-level languages are Lisp (based on list structures), Prolog
(based on logic), Smalltalk (based on objects), APL (based on vectors) and SETL (based on
sets).
Very high-level dynamic languages are not normally used for large system development because
they need a large run-time support system. This run-time support increases the storage needs and
reduces the execution speeds of programs written in the language. If performance requirements
can be relaxed for the prototype, then the overhead of the runtime support is acceptable.
As well as the application domain, there are other factors, which should influence the choice of
prototyping language:
1. The interactive features of the system to be prototyped. Some languages, such as
Smalltalk and 4GLs, have better support for user interaction than others.
2. The support environment that is provided with the language. In this respect, Lisp and
Smalltalk has far better environments than alternative languages. Outside the business
domain, where 4GLs are common, these have been the most widely used prototyping
languages.
One of the most powerful prototyping systems for interactive systems is the Smalltalk system
(Goldberg and Robson, 1983). Smalltalk is an object-oriented programming
language, which is tightly integrated with its environment. It is an excellent prototyping language
for three reasons:
1. The language is object-oriented so systems are resilient to change. Rapid modifications
of a Smalltalk system are possible without unforeseen effects on the rest of the system.
Indeed, Smalltalk is only suitable for this style of development.
2. The Smalltalk system and environment is an inherent part of the language. All the objects
defined in the environment are available to the Smalltalk programmer. Thus, a large
number of reusable components are available that may be incorporated in the prototype
under development.
3. Some versions of the language are now packaged with a support system (Visualworks)
which partially automates the construction of user interfaces for interactive systems. This
is a screen-drawing package for graphical interfaces such as those supported by user
interface management systems.
A class of wide-spectrum programming languages, proposed as prototyping languages
are REFINE (Smith et al., 1985), EPROL (Hekmatpour, 1988), and LOOPS (Stefik et al.,
1986).
A wide-spectrum language is a programming language, which combines a number of paradigms.
Most languages are based on a single paradigm. Pascal is an imperative language, Lisp is based
on functions and lists, Prolog is based on facts and logic and so
on. By contrast, a wide-spectrum language may include objects, logic programming and
imperative constructs. However, the practical problems of developing efficient implementations
of wide-spectrum languages have meant that few commercial language products are available.
LOOPS is the only language in this category that is widely used.
As an alternative to using a wide-spectrum language, is the use of a mixed-language approach to
prototype development. Different parts of the system may be programmed in different languages
and a communication framework established between the parts. Zave (1989) describes this
approach to development in the prototyping of a telephone network system. Four different
languages were used: Prolog for database prototyping, Awk (Aho et at., 1988) for billing, CSP
(Hoare, 1985) for protocol specification and PAISley (Zave and Schell, 1986) for performance
simulation.
There is probably no ideal language for prototyping large systems. This is because; different
parts of the system are diverse. The advantage of a mixed-language approach is that the most
appropriate language for a logical part of the application can be chosen, which speed up a
prototype development. The disadvantage is that it may be difficult to establish an interface,
which will allow multiple languages to communicate.
Fourth-generation languages
Evolutionary prototyping is now commonly used for developing business systems. These rely on
the use of fourth-generation languages (4GLs) for system development. There are many 4GLs
and their use usually reduces the lifecycle time for system development.
Fourth-generation languages are successful because there is a great deal of commonality across
data processing applications. In essence, these applications are concerned with updating a
database and producing reports from the information held in the database. Standard forms are
used for input and output.
At their simplest, 4GLs are database query languages such as SQL (Date and Darwen ~ 1993).
4GLs may also package a report generator and a screen form design package with the query
language to provide a powerful interactive facility for application generation (Figure 5). Some
spreadsheet-type facilities may also be included. 4GLs rely on software reuse where common
abstractions have been identified and parameterized. Routines to access a database and produce
reports are provided. The programmer need only describe how these routines are tailored and
controlled.
Figure 5
Fourth-generation languages are generally used, often in conjunction with CASE tools, for the
development of small to medium-sized systems. The end-users may be involved in the
development or may even act as developers. This can result in systems, which are poorly
structured and difficult to change.
The vendors of 4GL products claim that system maintenance is simpler because application
development time is rapid. The developed applications are usually much smaller than the
equivalent COBOL programs. Rather than worry about structuring the system for maintenance,
requirements changes are implemented by a complete system rewrite.
Using 4GLs for developing data processing systems is cost-effective in some cases, particularly
for relatively small systems. However, 4GLs are slower than conventional programming
languages and require much more memory. In an experiment in which Sommerville (1996) was
involved, rewriting a 4GL program in C++ resulted in a 50% reduction in memory requirements.
The program also ran 10 times faster than before.
There is no standardization or uniformity across fourth-generation languages. This means that
users may incur future costs of rewriting programs because the language in which they were
originally written is obsolete. Although they clearly reduce systems development costs, the effect
of 4GLs on overall life cycle costs for large DP systems is not known. They are obviously to be
recommended for prototyping but the lack of standardization may mean that total life cycle cost
savings may be less than anticipated.
Some CASE toolsets are closely integrated with 4GLs. Using such systems has the advantage
that documentation is produced at the same time as the prototype system. The generated system
should be more structured and easier to maintain. These tools may generate 4GL code or may
generate code in a lower-level language such as COBOL. Forte (1992) describes a number of
tools of this type in a brief survey of fourth-generation languages.
4GL-based development can be used either for evolutionary prototyping or may be used in
conjunction with a method-based analysis where system models are used to generate the
prototype system. The structure that CASE tools impose on the application means that
evolutionary prototypes developed using this approach should be maintainable.
Composition of reusable components
The time needed to develop a system can be reduced if many parts of that system can be reused
rather than designed and implemented. Prototypes can be constructed quickly if you have a
library of reusable components and some mechanism to compose these components into systems.
The composition mechanism must include control facilities and a way of interconnecting
components. This approach is illustrated in Figure 6.
Figure 6, Composition of reusable components
Prototyping with reusable components involves developing a system specification by taking
account of what reusable components are available. These components are taken from a
repository and put together to form the prototype system. This approach is usually most suitable
for throwaway prototyping as the specification may not be exactly what is required. The
prototype demonstrates what is possible. The reusable components may be used in the final
system to reducing the development cost.
Perhaps the best example of this approach to prototyping is found in the Unix operating system.
The features of Unix, which make it particularly suitable for prototyping with reusable
components, include:
Various shell programming languages (Rosenberg. 1991), which may be used as the
composition mechanism for reusable components. Unix shells are command languages,
which include looping, and decision constructs. They provide facilities for combining
commands, which operate on files, integers and character strings.
A set of functions that have been designed so that they can be combined in various ways.
Functions usually rely on simple character stream interfaces, which mean that they are
easy to connect. Examples of these functions are grep (a paffern matcher), sort (a sorting
program), and we (a word counter).
Its command interconnection mechanism (pipes) combined with its model of files and I/O
devices as character streams. This makes it easy to connect functions to each other and to
files and peripherals.
However, prototyping-using Unix is limited because the granularity of the software components
is relatively coarse. The function of the individual components is often too general-purpose to
combine effectively with other components. Furthermore user interface prototyping using the
shell is limited because of the simple I/O model adopted by the Unix system.
Prototyping using reusable components is often combined with other approaches using very high
level or fourth-generation languages. The success of Smalltalk and Lisp as prototyping languages
is due to their reusable component libraries and to their built-in language facilities.
User interface prototyping
Graphical or forms-based user interfaces have now become the norm for interactive systems. The
effort involved in specifying, designing and implementing a user interface represents a very
significant part of application development costs. The user must take part in the interface design
process. This realization has led to an approach to a design called user-centered design (Norman
and Draper, 1986), which depends on interface prototyping and user involvement throughout the
interface design stage.
Design means the "look and feel" of the user interface. Evolutionary prototyping is used in the
process. An initial interface is produced, evaluated with users and revised until the user is
satisfied with the system. After an acceptable interface has been agreed on, it then may be reimplemented, although if interface generators are used this may not be necessary. Interface
generators allow interfaces to be specified and a well-structured program is generated from that
specification. Thus the iterations inherent in exploratory programming do not degrade the
software structure and re-implementation is not required.
Interface generation systems may be based around user interface management systems (Myers,
1988) which provide basic user interface functionality such as menu selection, object display and
so on. They are placed between the application and the user interface and provide facilities for
screen definition and dialogue specification. These facilities may be based on state transition
diagrams for command specification (Jacob, 1986) or on formal grammars for dialogue design
(Browne, 1986). A survey of tools for user interface design is given by Myers (1989).
Very high-level languages like Smalltalk and Lisp have many user interface components as part
of the system. These can often be modified to develop the particular application interface
required. Fourth-generation language systems usually include screen definition facilities whereby
picking and positioning form fields can define screen templates.
From a software engineering point of view, it is important to realize that user interface
prototyping is an essential part of the process. Unlike the prototyping of system functionality, it
is usually acceptable to present an interface prototype system specification. Because of the
dynamic nature of user interfaces, paper specifications are not good enough for expressing the
user interface requirements.
References
Aho, A. V., Kemighan, B. W. and Weinberger, P. J. (1988). The Awk Programming Language.
Englewood Cliffs NJ: Prentice-Hall [149, 710]
Bemstein, L. (1993). Get the design right! IEEE Software, 10 (5), 61-3 [140]
Boehm, B. W., Gray, T. E. and Seewaldt, T. (1984). Prototyping versus specifying a multi-project
experiment. IEEE Transactions on Software Engineering, SE. 10 (3), 290-303 [139]
Browne, D. P. (1986). The formal specification of adaptive user interfaces using command language
grammar. In Proc. CHI'86, Boston, 256-60 [152]
Date, C. J. and Darwen, H. (1993). A Guide to the SQL Standard, 3rd edn. Reading MA: Addison-Wesley
[534,708]
Diller, A. (1994). Z: An Introduction to Formal Methods, 2nd ed. New York: John Wiley and Sons
[146,190]
Forte, G. (1992). Tools fair: out of the lab, onto the shelf. IEEE Software, 9 (3), 70-9 [150]
Gallimore, R. M., Coleman, D. and Stavridou, V. (1989). UMIST OBJ: a language for executable
program specifications. Comp. J., 32 (5),413-21 [146]
Goldberg, A. and Robson, D. (1983). Smalltalk-80. The Language and its Implementation. Reading MA:
Addison-Wesley [148, 215]
Gomaa, H. (1983). The impact of rapid prototyping on specifying user requirements. ACM Software
Engineering Notes, 8 (2), 17-28 [140]
Hekmatpour, S. and Ince, D. (1988). Software Prototyping, Formal Methods and VDM. Wokingham:
Addison-Wesley [148, 163]
Hoare, C. A. R. (1985). Communicating Sequential Processes. London: Prentice-Mall [149, 168]
Jacob, R. (1986). A specification language for direct-manipulation user interfaces. ACM Trans. on
Graphics, 5 (4), 318-44 [152]
Lee, S. and Sluizer, 5. (1985). On using executable specifications for high-level prototyping. In Proc. 3rd
mt. Workshop on Software Specification and Design, 130-4 [146]
Luqi (1992). Computer-aided prototyping for a command and control system using CAPS. IEEE
Software. 9 (1), 56-67 [146]
Mills, H. D., O1Neill, D., Linger, R. C., Dyer, M., and Quinnan, R. E. (1980). The management of
software engineering. IBM Sys. J., 24 (2),414-77 [144]
Myers, B. (1988). Creating User Interfaces by Demonstration. New York: Academic Press [152,558]
Myers, B. (1989). User-interface tools: introduction and survey. IEEE Software, 6 (1), 15-23 [152]
Norman, D. A. and Draper, S. W. (1986). User-centered System Design. Hillsdale NJ: Lawrence Erlbaum
[152, 323]
Smith, D. R., Kotik, G. B. and Westfold, S. J. (1985). Research on knowledge-based software
environments at Kestrel Institute. IEEE Trans. on Software Engineering, SE-ll (11), 1278-95
[148]
Stefik, M. J., Hobrow, D. G. and Kahn, K. M. (1986). Integrating access-oriented programming into a
multiparadigm environment. IEEE Software, 3 (1), 10-18 ~ 148]
Took, R. (1986). The presenter-a formal design for an autonomous display manager. In Software
Engineering Environments (Sommerville, I., ed.). Stevenage: Peter Perigrinus, 151-69 [146]
Turner, D. A. (1985). MIRANDA: A non-strict functional language with polymorphic types. Proc. Conf.
on Functional programming and Computer Architecture, Nancy, France, 1-16 [147]
Wikstrom, A. (1988). Standard ML Englewood Cliffs NJ: Prentice-Hall [147]
Zave, P. (1989). A compositional approach to multiparadigm programming. IEEE Software. 6 (5); 15-27
[123, 148]
Zave, P. and Schell, W. (1986). Salient features of an executable specification language and its
environment. IEEE Trans. on Software Engineering, SE- 12 (2),3 12-25 [149]
Download