Rather than being the tuxedo of a living user, this was a so-called
daemon,
a construct projected by autonomous software. In cyberspace, daemons had taken the place of menus and command-line interpreters. The GoMotion ants were daemons, too, though daemons of a much different order.
“Hello Kwirkey Debug,” said Russ. “I'm Russ and this is Jerzy. We want to set a breakpoint.”
“Which kind of breakpoint? At address, changed memory global, expression true, or hardware interrupt?” inquired the daemon. S/he spoke in a cool androgynous tone. Some goofing hacker had set the daemon's tux to morph-wander slowly about in a parameter space that let her/im vary between male and female and between fat and thin. As we watched, the daemon changed from a fat man to a muscular woman to a skinny manâbut all the while s/he was made of rippling, reflective chrome. Hackers were suckers for ray-traced chrome, also it was computationally cheap thanks to the new quaternion-based Mori-Kuzin hack, which had been the exclusive trade secret of Unisys for about a week until a phreak called Phineas Phage had broadcast the source code all over cyberspace.
“Break when the following expression is true,” said
Russ. “Squidboy's pincer intersects Dexter's chest.”
“Breakpoint is set,” said Kwirkey Debug.
“Reset and run,” said Russ.
The kitchen flickered as Kwirkey Debug reinitialized it. Now Squidboy was in his nest, and Dexter was coming in again. Kwirkey Debug stood off in a corner, staring at Dexter's chest.
Dexter Christensen glanced up at us, moving his head like a very old man.
“Wow! Are you startin' up the robot?” slurred Dexter. His voice was deep and grainy. The code ran substantially slower with the breakpoint on, so that Kwirkey Debug could be sure not to miss the exact instant when Squidboy hit Dexter.
“Hello Squidboy,” groaned Squidboy. He sounded like the cartoon voice of a giant octopus in an underwater treasure cave.
“Hi, Mr. Robot,” oozed Dexter. “Do you wanta play?”
“Wanta play?” mocked sepulchral Squidboy.
“Let's go in the living room,” drooled Dexter and reached out for Squidboy's pincer. Moving at a speed that was fast even under slo-mo, Squidboy swung his left arm forward in a hard, flat arc that ...
“Breakpoint,” said Kwirkey Debug. “Squidboy's pincer intersects Dexter's chest.”
Squidboy stood frozen in place with the tip of his left-hand manipulator poised daintily against Dexter.
“Show us a chart of Squidboy's attribute variables,” said Russ.
Kwirkey Debug gestured with two hands and a small chart sproinged into existence. On the left of the chart were the names I'd assigned to Squidboy's variables, and on the right were the variables' numeric values. We scrolled the chart up and down, looking things over.
“How about that variable there called
stroke_persist
,”
said Russ presently. “It's set to 4,294,967,289.” He paused gloatingly. “You jack-off.”
“Oh hell.”
Stroke persist
was supposed to be a small integer like three or minus eleven or something. It measured how hard Squidboy pushed against things. With a
stroke_persist
value of four billion, Squidboy's normal motions would become amplified so much that he must perforce slash into those around him. How had
stroke_persist
gotten to be four billion?
“Kwirkey Debug,” I said. “Please set a breakpoint for the following condition: Squidboy's
stroke_persist
is larger than four billion. Then reset and run.”
“Yes,” said Kwirkey Debug.
On the third run, the breakpoint tripped as Dexter reached for Squidboy's left hand.
“Show us the source code with the instruction pointer,” I said.
Another chart appeared, and *bingo* there it was, our breakpoint had kicked in right after an instruction that set
stroke_persist
equal to -7. This is what it was supposed to do; the 7 meant “move softly,” and the minus meant “you're using your left arm.” But Russ's Kwirkey translator had decided that
stroke_persist
was always to be a positive number, and if you view a thirty-two-bit representation of -7 as a positive number, you think it's 4,294,967,289.
I started trying to explain this to Russ, but instead of letting me finish he rudely yelled that using minus for “left-hand” had been a stupid trick in the first place, and that now it was worse than stupid, it was unusable
since Squidboy had three hands
. Funny I hadn't thought of that. I recovered by pointing out that Russ had no business assuming that all of Squidboy's state variables were positive integers. Russ countered that he needed to assume all numbers to be positive so that the ROBOT.LIB
calls could be made at maximum speed, thus guaranteeing that “his” code would run faster than the “kludgey” code for the Veep. He said that if I wanted to keep track of left, right, and middle, I should use a separate flag variable instead of trying to do it with negative numbers. I began to respond that . . .
“Let's go ahead and fix the first bug and see what happens next,” said Sun Tam quietly. Russ and I had been so absorbed in the Sphex's cyberspace, and in our quarreling, that neither of us had noticed when Sun sat down next to us.
“Edit code,” said Russ to Kwirkey Debug, and the silver figure produced what looked like a large pink rubber eraser. “I ONLY MAKE BIG MISTEAKS” was printed on the eraserâsome West West hacker's idea of a joke.
“This is too stupid,” I said. “I'll fix it on my own machine. Let's meet back here in an hour.” I went back in the pit and squeezed all the negative numbers out of my program. It was, as Russ had suggested, a matter of using a two-bit
hand_flag
variable to do what the minuses had done. I used
hand_flag
binary values 00, 01, and 10 to stand for, respectively, the pincer, the tentacle, and the humanoid hand. First the new code wouldn't compile (in my excitement I'd left out a “;”), then it compiled but crashed (I'd forgotten to rebuild one of the sub-modules with the new header file), and then *siiigh* my quick fix was done. I rushed back to the Sphex. Russ and Sun Tam were waiting.
Russ downloaded the new code and said, “Run.”
This time Squidboy and Dexter made it into the living room.
“Hi there,” said Perky Pat brightly. She was sitting in an armchair watching television. Walt was passed-out drunk on the couch, and Baby Scooter was lying on the floor gumming a filthy teething ring. The screen of the
virtual TV against the wall was painted with changing real-time network television. I could clearly hear the TV voices through the Sphex speaker. Just now a newscaster was saying that a judge had denied Stu's pretrial motion to have my venue moved out of Silicon Valley. “So Jerzy Rugby's state trial on charges of criminal trespass, computer intrusion, and extreme cruelty to animals is still scheduled to begin the week after next in San Jose,” the newscaster said. “Thursday, May 28. This network
will
be providing special coverage of that trial.”
I was so involved in listening to the TV that I wasn't watching when Squidboy veered too far around Baby Scooter, lost his balance, and fell onto Walt's neck. I looked just in time to see Walt's head come off and fall onto the floor. It made a nasty thump.
“Oh, no way!” I cried. “Squidboy didn't hit him
that
hard.”
“Let's just fix it,” said Sun Tam. “Kwirkey Debug, reset and run to the point where Squidboy passes Baby Scooter.”
This time there was nothing grossly wrong with any of the values in Squidboy's registers. We single-stepped the code forward, watching the numbers. The value of the
direction_angle
started doing something queer just before Squidboy fell over: it began oscillating irregularly between two, then four, then eight values, and then burst into what looked like totally random fluctuations.
“I recognize that behavior,” I said, talking quickly before Russ could start up with the insults. “That's the period-doubling route to chaos! No problem. It's because I use a nonlinear formula to damp the jitter out of
direction _angle.
I use a preset constant called FEEDBACK _DAMPER. But the damping's not working anymore. We're getting the opposite of damped feedback; we're getting
feebdack,
right, Russ? Ha, ha!” I was
feeling hackish and manic. “Well, that's just because the Adze is different from the Veep. All I need to do is tweak the FEEDBACK_DAMPER value. Kwirkey Debug, I want to edit the constant definitions file. And put away that stupid eraser.”
I changed FEEDBACK_DAMPER from 0.12 to 0.13.
“Compile, reset, and run.”
This time, instead of overavoiding Baby Scooter, Squidboy locked into a death spiral that wound around and around Baby Scooter until Scoot's geometry was churned into crooked fnoor.
“I thought you said you had the Adze code
wired
,” snarled Russ. “You fucking loser.”
“It's a chaotically sensitive system,” I cried. “I tweaked it specially for the GoMotion Veep with genetic algorithms. I'm not surprised it isn't working yet. Even though the Veep and the Adze use the same Y9707 chip, their sensors and effectors are different in hundreds of ways. They have
different bodies
.”
“Your control algorithms seem to be very sensitive,” said Sun Tam. “You change the second digit of FEEDBACK _DAMPER and Squidboy kills Scooter instead of Walt?”
“Yeah,” I said. “And maybe the value halfway in between will work. Say 0.125. But maybe not. Maybe FEEDBACK_DAMPER needs to be 0.124. The only way to find the right number is through trial and error. And even if you get one parameter right, you might need to change it again after you change some other parameter. You're searching a multidimensional chaotic phase space.”
“So you're telling us that robot software is impossibly difficult to program,” said Russ flatly. He looked sad. “And the Adze is never going to work.”
“It's not impossible,” I said. “It's just that we need to
use genetic programming to find the right parameter settings. That's why I made Sun Tam put up 256 Our American Homes. We'll use genetic programming and everything will be
fine
.”
“How?” asked Sun Tam.
“We put a Squidboy instance into each of the 256 Our American Homes, and select out, say, the 64 parameter sets that give the best behavior. Then we replace the worst 64 sets with mutated clones and crossovers of the genes in the top 64,” I explained. “And you leave the 128 medium-scoring guys alone, or maybe mutate them a little. On the next cycle some of the middle guys might do better than average, and some might do worse.” Russ was starting to grin. I was getting over. “So that we don't have to monitor it, we give all the Squidboys some simple machine-scored task. To begin with, the task will be walking into the living room without killing anybody. And once it can do that, we try a different task. The process works, I promise you.”
“Let's help him get it started, Russ,” said Sun Tam.
“Gronk,” said Russ.
We got it happening late that afternoon, and by the next morning, the parameters were such that Squidboy could follow Dexter around the Christensens' house without breaking anything or hurting anyoneâat least in the default Pat-sitting, Walt-sleeping, Dexter-roving, Scooter-teething test configuration. Now we needed to look for more difficult configurations.
I got Ben to come and see what we'd achieved so far. He was favorably impressed, though still very worried about our being ready for the product rollout scheduled for Tuesday, May 26, a mere two weeks away. Sun Tam got Ben to allocate wireless pro-quality cyberspace headsets for the three of us. We continued working in front of the Sphex, but now instead of the bogus shared look-through
Abbott wafer display, we had true immersion.
We set up a virtual office down on the asphalt next to the Our American Homes and began spending almost all our time there together in our tuxedos. I was an idealized Jerzy in shorts, fractal shirt, and sandalsâmy tux that I'd bought from Dirk Blanda. Sun Tam's tux showed a lanky gunslinger. Russ was a pagan hobbit with shades, a nun's habit, and seventeen toes.
Every now and then I'd look up into the cyberspace sky and see the spherical green-and-gray Netport node up there like a low-hanging harvest moon. Sometimes, when the hacking was getting old, I'd feel trapped. I was stuck in a parking lot by a field of tract homes in a boring part of San Jose. I would wish I could fly away to see what the GoMotion ants were doing, out there in the Antland of Fnoor. People said there were still GoMotion ants loose in cyberspace, but we weren't seeing any of them at West West.
To continue improving the Adze code, we began making the Our American Home test beds more difficult. We began breeding for bad Our American Homes. Each Our American Home setup could be described by its own parameter set, and we began selecting out the 64 Our American Homes that got the worst scores for their Squidboys, and at the same time singling out the 64 Our American Homes whose Squidboys did the best. And then we'd replace the parameter sets of the mellow 64 homes with mutated clones and blends of the parameter sets of the 64 worst Our American Homes, and let the 128 homes in the middle ride along for another cycle.
After a few days of this, the Our American Homes were pretty bizarreâlike imagine your worst nightmare of a subdivision to live in. In one house you could see Pat throwing dishes at Walt. In another, Dexter was taking a dump on the front steps. In another, a flipped-out Pat was
in the kitchen setting the drapes on fire. In another, drunk Walt hunted the robot with an axe. In another, Scooter was sitting on the ledge of a window holding a carving knife. And in each of the bad Our American Homes, a desperate Squidboy did his best to fit in. Some of the Squidboys did better than others, and those were the ones who would get bred onto the genes of the Squidboys who lost.