To save content items to your account,
please confirm that you agree to abide by our usage policies.
If this is the first time you use this feature, you will be asked to authorise Cambridge Core to connect with your account.
Find out more about saving content to .
To save content items to your Kindle, first ensure no-reply@cambridge.org
is added to your Approved Personal Document E-mail List under your Personal Document Settings
on the Manage Your Content and Devices page of your Amazon account. Then enter the ‘name’ part
of your Kindle email address below.
Find out more about saving to your Kindle.
Note you can select to save to either the @free.kindle.com or @kindle.com variations.
‘@free.kindle.com’ emails are free but can only be saved to your device when it is connected to wi-fi.
‘@kindle.com’ emails can be delivered even when you are not connected to wi-fi, but note that service fees apply.
Software engineering encompasses the tools and methods for defining requirements for, designing, programming, testing, and managing software. It consists of monitoring and controlling both the software processes and the software products to ensure reliability. Software engineering was developed primarily from within the computer science community, and its use is essential for large software development projects and for high-assurance software systems such as those for aircraft control systems, nuclear power plants, and medical devices (e.g., pacemakers).
The reader may wonder at this point why a book on verification and validation in scientific computing includes a chapter on software engineering. The reason is that software engineering is critical for the efficient and reliable development of scientific computing software. Failure to perform good software engineering throughout the life cycle of a scientific computing code can result in much more additional code verification testing and debugging. Furthermore, it is extremely difficult to estimate the effect of unknown software defects on a scientific computing prediction (e.g., see Knupp et al., 2007). Since this effect is so difficult to quantify, it is prudent to minimize the introduction of software defects through good software engineering practices.
Software engineering is as much about teamwork as it is about technology. This introductory textbook covers both. For courses featuring a team project, it offers tips and templates for aligning classroom concepts with the needs of the students' projects. Students will learn how software is developed in industry by adopting agile methods, discovering requirements, designing modular systems, selecting effective tests, and using metrics to track progress. The book also covers the 'why' behind the 'how-to', to prepare students for advances in industry practices. The chapters explore ways of eliciting what users really want, how clean architecture divides and conquers the inherent complexity of software systems, how test coverage is essential for detecting the inevitable defects in code, and much more. Ravi Sethi provides real-life case studies and examples to demonstrate practical applications of the concepts. Online resources include sample project materials for students, and lecture slides for instructors.
This chapter reviews the application of Description Logics to software engineering, following a steady evolution of DL-based systems used to support the program understanding process for programmers involved in software maintenance.
Introduction
One of the first large applications of Description Logics was in the area of software engineering. In software, programmers and maintainers of large systems are plagued with information overload. These systems are typically over a million lines of code, some approach fifty million. The size of the workforce dedicated to maintaining these enormous systems is often over a thousand. In addition, turnover is quite high, as is the training investment required to make someone a productive member of the team. This seems, on the surface, to be a problem crying out for a knowledge-based solution, but understanding precisely how Description Logics can play a role requires understanding the basic problems of software engineering “in the large”.
Background
The three principal software maintenance tasks are pro-active (testing), reactive (debugging), and enhancement. Central to effective performance of these tasks is understanding the software. In the 1980s, cognitive studies of programmers involved in program understanding [Soloway et al., 1987] revealed two things:
Programmers typically solve problems by realizing “plans” in their programs. This seems to tie the notion of program understanding to plan recognition [Soloway et al., 1986].
Delocalized plans (plans which are not implemented in localized regions of code) are a serious impediment to plan recognition, for both humans and automated methods [Soloway and Letovsky, 1986].
In high school I took the only introductory computer courses that were offered, because my older brother had taken them years earlier. He would bring home pictures that he had generated with the computer and allowed me to color them. So I decided that when I got to high school, I would take computer courses so I could create pictures on the computer, too. Although I wasn't very interested in coloring pictures by the time I got to high school, I did take computer courses, and discovered that my brain seemed to work well in the logical world required by computers.
In college, I made computer science my major, and received a BS/CS from SUNY/Buffalo in 1986, and a MS/CS from SUNY/Buffalo in 1987. But at first, I discovered that I didn't know the first thing about computer science, and there were so many subfields that I didn't know what I wanted to do. After taking courses in graphics, compilers, vision, operating systems, and artificial intelligence, I found two areas interesting. The first was artificial intelligence, a hot field at that time. It seemed really futuristic to program computers that could mimic humans, and I did my master's work in that area.
At the same time, I discovered the world of operating systems, and UNIX in particular. I had to use a new UNIX machine for some of my coursework, and I quickly discovered the wonderful social aspects of the system, particularly the “talk” and “write” programs.
This chapter provides some basic background on selected topics in software engineering. This should be useful for those readers whose background is primarily in basic science and engineering, who may have not been previously exposed to this type of material. This chapter is meant to complement the introduction to mathematical topics presented in Chapter 8.
In the preceding chapters we have concentrated on the details of the Spark language. In this chapter, we look at a broader picture of how Spark might be used in the context of a software engineering process. The Spark 2014 Toolset User's Guide (Spark Team, 2014b) lists three common usage scenarios:
Conversion of existing software developed in Spark 2005 to Spark 2014
Analysis and/or conversion of legacy Ada software
Development of new Spark 2014 code from scratch
We start by examining each of these scenarios in more detail, discussing the interplay between proof and testing, and then presenting a case study to illustrate some issues arising when developing new Spark 2014 code from scratch.
Conversion of Spark 2005
Converting a working Spark 2005 program to Spark 2014 makes sense when that program is still undergoing active maintenance for enhanced functionality. The larger language and the enhanced set of analysis tools provided by Spark 2014 offer a potential savings in development time when adding functionality to an existing Spark 2005 program.
As Spark 2014 is a superset of Spark 2005, the conversion is straight forward. Section 7.2 of the Spark 2014 Toolset User's Guide (Spark Team, 2014b) provides a short introduction to this conversion. Appendix A of the Spark 2014 Reference Manual (Spark Team, 2014a) has information and a wealth of examples for converting Spark 2005 constructs to Spark 2014. Explanations and examples are provided for converting subprograms, type (ADT) packages, variable (ASM) packages, external subsystems, proofs, and more. Should you need to constrain your code to the Spark 2005 constructs but wish to use the cleaner syntax of Spark 2014, you may use pragma Restrictions (Spark 05) to have the analysis tools flag Spark 2014 constructs that are not available in Spark 2005.
Dross et al. (2014) discuss their experiences with converting Spark 2005 to Spark 2014 in three different domains. AdaCore has a Spark 2005 to Spark 2014 translator to assist with the translation process. At the time of this writing, this tool is available only to those using the pro versions of their GNAT and Spark products.
We illustrate a simple example of converting a Spark 2005 package to Spark 2014. The package encapsulates a circular buffer holding temperature data, for example, from an analog to digital converter.
Design and quality are fundamental themes in engineering education. Functionalprogramming builds software from small components, a central element of gooddesign, and facilitates reasoning about correctness, an important aspect ofquality. Software engineering courses that employ functional programming providea platform for educating students in the design of quality software. This pearldescribes experiments in the use of ACL2, a purely functional subset of CommonLisp with an embedded mechanical logic, to focus on design and correctness insoftware engineering courses. Students find the courses challenging andinteresting. A few acquire enough skill to use an automated theorem prover onthe job without additional training. Many students, but not quite a majority,find enough success to suggest that additional experience would make themeffective users of mechanized logic in commercial software development. Nearlyall gain a new perspective on what it means for software to be correct andacquire a good understanding of functional programming.
The major cause of the software crisis is that the machines have become several orders of magnitude more powerful! To put it quite bluntly: as long as there were no machines, programming was no problem at all; when we had a few weak computers, programming became a mild problem, and now we have gigantic computers, programming has become an equally gigantic problem.
Edsger Dijkstra
The software crisis
The term software engineering originated in the early 1960s, and the North Atlantic Treaty Organization sponsored the first conference on the “software crisis” in 1968 in Garmisch-Partenkirchen, West Germany. It was at this conference that the term software engineering first appeared. The conference reflected on the sad fact that many large software projects ran over budget or came in late, if at all. Tony Hoare, a recipient of the Turing Award for his contributions to computing, ruefully remembers his experience of a failed software project:
There was no escape: The entire Elliott 503 Mark II software project had to be abandoned, and with it, over thirty man-years of programming effort, equivalent to nearly one man’s active working life, and I was responsible, both as designer and as manager, for wasting it.
In his classic book The Mythical Man-Month, Fred Brooks (B.4.1) of IBM draws on his experience developing the operating system for IBM’s massive System/360 project. Brooks makes some sobering reflections on software engineering, saying, “It is a very humbling experience to make a multimillion-dollar mistake, but it is also very memorable.”
Considering the great number of agent-oriented methodologies that can be found in the literature, and the fact that each one defines its own concepts and system structure, one of the main challenges in agent-oriented software engineering (AOSE) research is how to make these methodologies interoperable. By defining concepts used in a specific domain in a non-ambiguous way, meta-modelling may represent a step towards such interoperability. Consequently the main objective of the AOSE TFG (Technical Forum Group) is to establish a strategy for identifying a common meta-model that could be widely adopted by the AOSE community. This paper sums up the approach used by this TFG which consists of (i) studying and comparing the meta-models related to some existing methodologies (ADELFE, Gaia, INGENIAS, PASSI, RICA and Tropos) in order to find commonalities and (ii) giving a clear and basic definition for the core concepts used in multi-agent systems for relating and positioning them in a unified MAS meta-model. The first proposal, set up by the working group, for this unified meta-model then concludes this paper.
Agent-Oriented Software Engineering (AOSE) is rapidly emerging in response to urgent needs in both software engineering and agent-based computing. While these two disciplines coexisted without remarkable interaction until some years ago, today there is rich and fruitful interaction among them and various approaches are available that bring together techniques, concepts and ideas from both sides. This article offers a guide to the broad body of literature on AOSE. The guide, which is intended to be of value to both researchers and practitioners, is structured according to key issues and key topics that arise when dealing with AOSE: methods and frameworks for requirements engineering, analysis, design, and implementation; languages for programming, communication and coordination and ontology specification; and development tools and platforms.
Based around a theme of the construction of a game engine, this textbook is for final year undergraduate and graduate students, emphasising formal methods in writing robust code quickly. This book takes an unusual, engineering-inspired approach to illuminate the creation and verification of large software systems. Where other textbooks discuss business practices through generic project management techniques or detailed rigid logic systems, this book examines the interaction between code in a physical machine and the logic applied in creating the software. These elements create an informal and rigorous study of logic, algebra, and geometry through software. Assuming prior experience with C, C++, or Java programming languages, chapters introduce UML, OCL, and Z from scratch. Extensive worked examples motivate readers to learn the languages through the technical side of software science.
The 7th Annual Knowledge-Based Software Engineering Conference was held at the McLean Hilton at Tysons Comer, in McLean, Virginia, on Sept. 20–23, 1992. This conference was sponsored by Rome Laboratory and held in cooperation with the IEEE Computer Society, ACM SIGART and SIGSOFT, and the American Association for Artificial Intelligence (AAAI).
I grew up in a very traditional, military family. Girls became young ladies, married at an early age (before they were 20 years old), and had children. They did not learn mathematics or science, and certainly didn't go to college. Every time we got into a discussion about college, my parents would ask, “Why waste four years in college, and all that money, if you're just going to get married and have children?”
When I was about seven years old, these restrictions made me decide that being a girl was basically a bad thing but that fortunately, I was really a boy. So I dressed like a boy, played “army” and “fort” with boys, and did well in school—especially in science and math. To this day, I'm not sure how I managed to act like a boy for so long without my parents putting a stop to it. But they didn't. I finally relinquished my boyhood a few years later, but by then I was headstrong and adamant that I could do things girls weren't supposed to do.
All through high school I continued to earn straight A's, and participated in a number of sports. A teacher dropped a couple of hints that completely formed my choice of college and major. Once he said, “I think you'd be good at computer science.” Weeks later he commented, “Cal Poly at San Luis Obispo has a good computer science program.”
Every building, and every computer program, has an architecture: structural and organisational principles that underpin its design and construction. The garden shed once built by one of the authors had an ad hoc architecture, extracted (somewhat painfully) from the imagination during a slow and non-deterministic process that, luckily, resulted in a structure which keeps the rain on the outside and the mower on the inside (at least for the time being). As well as being ad hoc (i.e. not informed by analysis of similar practice or relevant science or engineering) this architecture is implicit: no explicit design was made, and no records or documentation kept of the construction process.
Logic programming is a programming paradigm with potential to contribute to software engineering. This paper is concerned with one dimension of that potential, the impact that experience with developing logic programs can have on software design. We present a logic programming perspective on programming patterns, systematic program development, design for provability, and the paradigm of meta-programming.
Self-organizing software systems are an increasingly attractive approach to highly distributed, decentralized, dynamic applications. In some domains (such as the Internet), the interaction of originally independent systems yields a self-organizing system de facto, and engineers must take these characteristics into account to manage them. This review surveys current work in this field and outlines its main themes, identifies challenges for future research, and addresses the continuity between software engineering in general and techniques appropriate for self-organizing systems.
Atmospheric scattering of outdoor nighttime electric illumination produces the principal component of background sky luminance that seriously affects ground-based optical astronomy. The sources for this scattering are Tight emitted skyward directly from luminaires, and light reflected off the ground and other illuminated objects. Careful illumination engineering can thus significantly reduce background sky luminance in two ways: 1) by providing outdoor electric lighting equipment that controls the directions in which light is emitted, and; 2) by proper design of outdoor lighting systems which make efficient use of the east amount of light. Recent developments in applied mathematics and computer software have produced computational tools that are being used to design lighting equipment and lighting systems. The software system for luminaire design significantly reduces the cost of this process by eliminating the need for extensive prototyping and provides for inexpensive experimentation with new designs. The system for outdoor lighting calculations permits the design of highly controlled lighting systems that eliminate glare and upward directed light while providing light appropriate for the visual task. These two software systems are described, along with examples of their use in areas that directly affect astronomical observations.