Kleinrock: Absolutely. We see e-mail already on the handheld, as well as the ability to download business documents such as spreadsheets and PowerPoint presentations. We'll see the ability to handle the occasional videoconference on a handheld, as well as other media-rich communications. We are right on the threshold of seeing these multifunction devices. Of course, the human-computer interface is always a problem.
CW: How might that improve?
Kleinrock: Voice recognition is going to be really important. And there will be flexible devices where you actually pull out keyboards and screens and expand what you are carrying with you. Haptic technologies--based on touch and force feedback--are not yet here, but there's a lot of research going on. For example, with a handheld, you could display a virtual keyboard on a piece of paper and just touch that.
CW: You have warned that we are "hitting a wall of complexity." What do you mean?
Kleinrock: We once arrogantly thought that any man-made system could be completely understood, because we created it. But we have reached the point where we can't predict how the systems we design will perform, and it's inhibiting our ability to do some really interesting system designs. We are allowing distributed control and intelligent agents to govern the way these systems behave. But that has its own dangers; there are cascading failures and dependencies we don't understand in these automatic protective mechanisms.
CW: Will we see catastrophic failures of complex systems, like the Internet or power grid?
Kleinrock: Yes. The better you design a system, the more likely it is to fail catastrophically. It's designed to perform very well up to some limit, and if you can't tell how close it is to this limit, the collapse will occur suddenly and surprisingly. On the other hand, if a system slowly erodes, you can tell when it's weakening; typically, a well-designed system doesn't expose that.
CW: So, how can complex systems be made more safe and reliable?
Kleinrock: Put the protective control functions in one portion of the design, one portion of the code, so you can see it. People, in an ad hoc fashion, add a little control here, a little protocol there, and they can't see the big picture of how these things interact. When you are willy-nilly patching new controls on top of old ones, that's one way you get unpredictable behavior.