RICK HAYES-ROTH
Naval Post-Graduate School
Rick Hayes-Roth has been an active researcher and innovator in the use of information technology and artificial intelligence for 30 years. He has served as: a research program director at the Rand Corporation; a principal investigator on Department of Defense projects; a co-founder of Teknowledge, a pioneering applied AI company; and chief technology officer for software at Hewlett-Packard. The focus of his research is on enabling people and machines to share information and make better and faster decisions, especially in time-stressed, critical operations.
As a software technology researcher, where, in general, do you see the field of software development going?
I see the field of applications expanding dramatically, so that the technologies, methods, and frameworks will also need to expand. As software spans from tiny embedded devices to global enterprise systems, from human-centered devices to autonomous vehicles, the tools we will use will need to match this diversity and range of scales. In particular, while we have focused mostly in the past on small to medium systems, which could be built by a few dozen people, we will increasingly want to address problems that leverage hundreds or thousands of contributors, in efforts such as grid computing or worldwide Internet-based activities. I mention such very large scale efforts only to emphasize an arena where knowledge and understanding are particularly lagging. In short, I think the volume the field must address will continue to increase faster than our ability to supply reliable and efficient engineering practices.
What do you view as the most exciting new developments in the world of advanced software engineering?
I'm most excited by three very different capabilities: (1) program synthesis; (2) evolutionary programming; and (3) community-based environments. Program synthesis is the oldest of the three, but I have felt for some time that we're on the threshold of routinely practical automatic generation of software. Positive results have been in hand for the last decade, but the efforts need a 10x to 100x increase in investment and trained people to make this be a routine part of the field.
Transformation-based approaches coupled with design synthesis by theorem provers are both ready to go, albeit mostly in small companies and university labs. As for evolutionary programming, it seems to me that we've already demonstrated a crossover from novelty to practicality. We have enough computing power to generate and test good designs and some good programs routinely. This approach will certainly continue to gain traction as computing power increases and we develop better off-the-shelf code-generating environments.
Finally, I believe that communities of people are beginning to show that they can quickly assemble to author software that exploits the community knowledge, passion, and interests in sharing. The Wikipedia is a well-known example where people merely author Web pages for human consumption. Efforts have begun to use broad community input to develop over knowledge bases that machines themselves can use, as for natural language understanding. Of course, open source communities have already demonstrated the benefits of pooling efforts for conventional software.
What areas of software engineering — in general — could be most improved?
Given the broad range of interesting application areas and the range of scales of valued systems, there are countless areas where improvements are needed. I will suggest one general paradigm where I see a significant shortcoming in software engineering in general. That concerns resource-limited decision-making systems. As examples, think of systems to process intelligence data in an effort to detect significant threats early or, as another example, systems to support disaster relief and recovery. You could also think about smaller systems such as controlling autonomous vehicles or alerting individuals about events they consider significant. In all of these cases, it's impossible to achieve perfect performance, and often impossible even to define it.
We want systems that do a very good job when faced with excessive amounts of information, much of it uncertain. The systems will commit "errors," but we ask only that they keep these to a reasonable level while continually doing the most important things well. Most systems today would be more useful and usable if they embraced "error" and imperfection as unavoidable qualities. Security, for example, can't be provided perfectly, and efforts to achieve perfect security often compete with the needs to share information among collaborating agencies and governments. So, nearly all complex systems will need to recognize the need to trade-off between multiple competing objectives.
The best systems will necessarily recognize the need to prioritize tasks, focus attention, and allocate resources accordingly. This requires a range of mechanisms, most of which are difficult to implement in current software and algorithms. As just one example, we may want most programs to be capable of giving you their best answer whenever the system decides it can no longer afford to expend resources on them. Such "any time algorithms" are extremely rare, and we have few techniques today for creating such algorithms routinely. More generally, we should expect a re-engineering of further systems around the need for them to give "good enough" answers as quickly as required, much the way people can when asked.
How do you balance your twin hats as educator and scientist?
The purpose of knowledge, it seems to me, is to improve the lot of people and our environment. If science is the process of finding that knowledge, education is one of the best forums for transmitting that to others. In my own case, I enjoy the opportunity to participate in the graduate-level education of U.S. and allied military officers, government employees, and some civilian contractors. At least as far as government-led initiatives go, these people can be expected to play leadership roles in recognizing problems, identifying opportunities, and conceiving and implementing solutions. Since so many opportunities rest on our ability to implement ambitious information systems, I see my roles as scientist and educator as being two halves of an effort to empower and enlighten a future generation of people who should bring vision and managerial talent to many of the most important software projects. Thus, the two roles are essential parts for one mission, helping others understand what we ought to be able to accomplish with our technology if only we'd approach the engineering challenges appropriately.
As a teacher how do you convey to your students the importance of staying attuned to new developments in software engineering — both today and throughout their careers?
I make my students read many books and articles, in part, to accustom them to the torrent of interesting, relevant, and useful information that bears on their professional objectives. I hope to instill in them an understanding of the remarkable world we all live in today, where information is plentiful and almost everything one can imagine wanting already exists, waiting for you to find it.
Of course, unique complex systems don't already exist for each new constituency, but most of the technological components they require can be found on someone's shelf. So when capabilities are plentiful, it's important to learn to read and search, to find what you need and to keep abreast of general capabilities. Of course, there's always a trade-off between finding out what already exists and spending time determining what's needed or imagining novel things that could change the landscape. There's no decision-procedure for determining the optimal allocation of time across those three activities, however. So, the right balance is necessarily left for each of us to explore.