On January 1st 2001, we move into our new home. Life is good. I’m now working on programming full-time. I’ve got a nice quiet home office. The Virtual Mall project is still going, but I’m no longer working on it full-time.
The Virtual Mall
My daughter Rachel, enjoying her new yard.
Mike – my successor – manages to negotiate a change to the design of the mall that’s more in keeping with the strengths and weaknesses of our engine.
This is actually good for the project. Those first few months of frustration and ghastly decisions had broken my will. I had been working on a project I didn’t believe in and didn’t care about. I never would have tried to negotiate a change to the design with Mr. Business because – based on my previous rejections – I didn’t think anyone would listen. Mike doesn’t have all of that baggage and he wasn’t present at that initial meeting where nobody wanted to hear “no”, so he’s willing to be candid about his concerns with the design.
I don’t know why John Business was willing to listen this time around. Maybe the cresting wave of the dot-com surge has scared him enough that he’s open to feedback. Maybe Mike persuaded him using superior social skills. Maybe Mr. Business has tried to use the product himself and realized the truth on his own.
Mike manages to push through countless changes. The can-of-beans design is gone. The strenuous effort to mimic the faults of the real world are abandoned. The mall space is scaled down to make the open areas less annoying to traverse, and the store space is expanded to make the aisles less claustrophobic and maze-like. The “all glass” motif is swapped out for something realistic and modern. The project ends up looking like a conventional upscale urban mall. By the graphical standards of the day, it’s gorgeous.
Normally I’d be upset if months of my work were thrown away like this, but in this case I’m delighted. I’d rather my contribution be erased than have the project roll forward with that terrible design.
Also, Mike’s efforts drive home just how much faster he is compared to me. He completes his re-designed mall in about half the time it took me to make the originalIn my defense, his conventional design was able to draw from our existing library of standard objects, and he’s able to re-use quite a bit of the store interiors that I designed. But he’s still running circles around me in terms of artistic output.. Not only is he faster, but his work has a certain aesthetic flair that I’ve never been able to achieve. I probably should have migrated to coding ages ago.
The Best Job Ever
There`s no way to convey the sheer joy of making a really well-designed program, so here`s a picture of blurry source code. I`m pretty sure this is a snippet from the Good Robot codebase.
Moving to coding hasn’t gotten me away from the project, of course. But now it’s much less all-encompassing. When I was making that gigantic glass can of beans, those assets were only ever going to be useful for that one project and did nothing to enrich the platform as a whole. But when I’m coding new features to support the mall, those features automatically become available to our general userbase.
For example, these days I’m working to figure out how the user can examine the products on the shelves using their sad little 800×600 monitors. The solution we’ve come up with is to give builders the ability to tag certain objects as “examine-able”. If you click and drag on the object, you’ll be able to turn it over and look at it from different sides. Optionally the object can be moved in front of the camera, to make it easy to see very small objects.
This is a good example of a feature that sounds simple in a meeting but immediately becomes complex when you try to implement it. Like, how fast should the object rotate when the user moves the mouse? The naive assumption is that you can simply use the existing mouse sensitivity settings and turn the object in the same way that the user turns their head when moving around. But now that I have a working demo to play with, I can see it feels wrong. It turns out that it really depends on the size and distance of the object. If you do “one speed for all objects” then large items (perhaps you’re examining something automobile-sized?) feel like they’re spinning out of control, while tiny objects can feel too slow.
Or to put it another way, it sort of “feels” like you’re reaching out with the mouse pointer and grabbing the closest part of the object. That bit of geometry that you grab ought to move at about the same speed as the mouse cursor. So when figuring out rotation speed, it really depends on how much of the screen the object fills.
If the object is moved in front of the camera for examinationYou can picture this as the user holding up the object in front of their face., then how far away should we place the object? Again, the naive solution is to simply look at the bounding sphere of the object and use that as a guide. Except, this won’t work for irregularly-sized objects that are much larger in one dimension than another. If you did this with (say) a rifle of some sort, then the user would be able to examine the muzzle and the stock up close, but the detail in the geometric center of the object – stuff like the grip, the trigger, and all the moving parts, the stuff you really want to see – won’t ever get very close to the camera. We can add the ability to zoom in and out, at the expense of adding a bunch of new controls that the user must be taught. Or we can try to automate the distance. Or maybe we should use the simple solution but allow the builder – which would be Mike in this case – to set the camera distance manually in the case of unusual items.
For the record, there aren’t any firearms in the virtual mall. But the rifle example does show that irregular objects will present a problem, and I’d rather make this feature correct now than come back and try to fix it later when an irregular object shows up.
|This is actually my private test world. I have no idea how a screenshot of it escaped into the wild. I suppose I must have opened the place to the public at some point? The world was just a collection of random test objects clustered around the entry point. Here you can see I was working on user-controlled colored light sources. It was 2001, and I was trying to catch us up to where Quake II was in 1997.|
One of the advantages of being a coder is that nobody really knows how long things take. Which means you can pad your schedule. Which means you’ve got some breathing room in situations like this when a seemingly-simple feature actually requires a bunch of exploration and design work before the real coding can begin.
In any case, I don’t mind this work. Sure, it’s for the mall. But this feature will also be available to all users. I don’t know if they’ll have a use for it, but you never know what they’ll come up with. This feature will potentially be useful independent of the mall itself. The same can’t be said for the giant can of beans I poured all that time into.
I work my way through my share of The List™, adding features for the mall, but also other non-mall features. This is fun work, and the freedom to experiment means I have the freedom to make sure I get things right. We finish the The List™, squash the bugs, do a release, make a new list, and start all over again.
I’m so wrapped up in programming these days that I lose track of the launch day for the mall. It’s not until weeks later that I realize it came and went.
If you build it, they won`t come.
In the end, most of my worries were for nothing. I didn’t need to be concerned about the texture download problems, the interface hassles, store integration, performance problems, or the navigation challenges. We aren’t buried in angry support tickets from confused users. All of my complaints about the user experience were pointless, because when the doors open nobody shows up. We built it, and they didn’t come. It quickly fizzles out and the story ends.
I was given a bunch of stock options at the start of this madness. It was supposedly worth over a million bucks when it was issued, but by the time I’m able to sell the shares they’re worth just enough to cover the debt we racked up while living in Boston. I’m not really upset about that. Sure, getting rich would have been nice, but it’s not like I “lost” a million bucks. The money was never real to begin with. Moreover, I don’t think I’ve ever done anything that was worth a million bucks. I’ve certainly never generated a million dollars worth of value to anyone. It just underscores the absurdity of the whole ordeal.
When the mall project formed, two companies were joined together in some sort of stock deal. Over the next couple of years, there will be a long-running lawsuit to undo this. I don’t understand the proceedings enough to relate them properly here, but it’s unpleasant, stressful, and puts the company under financial strain. We used the infusion of cash to expanded our staff during the last couple of years, and eventually we have to take the bitter pill and shrink back down to our pre-IPOInitial Public Offering. It’s what you call when a company begins offering shares of stock. size. The company doubled in size, which means half of us need to go. There’s no way to make that easy.
When the dust settles, we’re once again a modest, privately-heldWe’re no longer controlled by stock owners. The part of the company that has shares associated with it is taken away in the lawsuit. Business is weird., self-sustaining business with a small handful of employees.
If you’re old enough, you may remember that people were very confused about how our culture should acknowledge the event. Some people wanted to remove all references – including expunging images of the now-destroyed World Trade Center – from extant works, lest the image traumatize someone by reminding them of the event. Other people felt that doing so was like erasing the WTC from history and was disrespectful to the dead. You had a situation where people who wanted to honor the fallen were sometimes at odds with people who wanted to support the survivors. Both groups were well-meaning people with a good cause, but sometimes you ran into situations where you couldn’t please them both. On top of this was the fact that “the survivors” were not some monolithic group and nobody had the right to speak for them all. In general, it was a really good way to set well-intentioned people against each other.
See, there’s something odd I should mention about our software…
The program used the title bar of the window to show the user’s location. This took the form of:
Activeworlds – [name of world] at [coordinates] facing [compass direction]
|Once again, this image is thanks to this massive archive maintained by user Mauz.|
I have no idea if it hurt us financially, but it did result in some confusion and awkward conversations. I remember being present for a demo for a potential client. They looked up and saw Ground Zero in the title bar and they couldn’t not see it as a reference to the terrorist attacks. They thought we’d put that in the title bar as a way of honoring the dead or whatever. Even after explaining it to them twice, they still didn’t seem to get it.
Internally, we discussed changing it. It would be easy to rename Ground Zero to something like “World Origin” or whatever. The problem was that this would annoy our existing users. To them this would be one of those “pointless symbolic changes” that people were doing at the time. People were re-designing things, re-naming things, removing things, and generally doing lots of goofy stuff for no reason. As in, “Damn it, I can’t do anything to ease this pain and suffering, but I can make our company logo look slightly less like two buildings. Maybe that will help. Somehow.”
Do we favor our existing users, or change things to avoid offending potential newcomers? In the end, we elected to leave things unchanged. This was the solution I favored, although maybe it cost us some business. It’s hard to say.
So that was strange. Anyway. Back to 2001…
The Fatal Flaw
At first it looks like we escaped the dot-com craze without taking any serious harm. We certainly didn’t go under, which puts us in the minority. But after a few years I realize we took a nasty hit in terms of opportunity cost, and we’re never really able to recover. In 2003, Second Life is launched. We’ve fended off challengers before, but this time we’re just not up for it. Their technology is far ahead of ours. Their graphics are about two generations ahead of what we’ve got. And at this point in history, two graphics generations is a huge difference. They’ve got a powerful character builder while our users are stuck choosing their appearance from a fixed list of stock models. Their interface is integrated with the 3D view as part of the user’s HUD, while we’re stuck with all of these ugly Windows 95 style boxes.
I’ve been doing what I can. I make a particle engine that I’m really proud of. I add lots of new visual effects to modernize the client. But I’m still working with a 1999 level graphics engine. No shadows. No bump maps. No specular lighting. No shaders. Graphics cards are getting faster, but because of the way our engine is set up we’re having a hard time putting that power to use.
2004 comes, and it’s a watershed year for graphics. The one-two punch of Half-Life 2 and Doom 3 drives home the point of just how far behind we are. I’ve been using every trick I can think of, but there’s only so far you can get with smoke & mirrors. You can’t fake your way up the tech tree.
Five years ago we spent nine months migrating to a new graphics engine. When it was over, the software looked exactly the same. That was an unpopular outcome and the will just isn’t there to go through it again. We have a few token meetings and discuss doing an upgrade, but the truth is that there’s no easy answer. When it comes to how rendering pipelines work, 1999 has more in common with 1994 than 2004. Shaders have changed everything. Upgrading our graphics engine now would mean:
- We’d need to settle on a new engine. Just picking one is complex, time-consuming, expensive, and risky.
- After picking the engine, we’d need to go through another extended period of migration. This one would probably take even longer since the changes would be more extensive.
- It would be even more difficult to maintain the backwards compatibility that we depend on.
- Once the migration was done, we’d need to do even more work to give our users access to the new features.
- There would be a learning curve for our artists as they adapted to the new system.
We were flush with cash in 1999, but now times are lean and this particular task is just too big. Every year the jump gets a littler bigger, which means the job of migrating becomes a little more daunting.
This is the goodbye party for Roland`s last day with the company, sometime in 2002. His last email to me after he left urged me to "never stop learning". Good advice in general, but REALLY important in this field and at this time.
In my view, we spent too many years chasing e-commerce stuff. We made too many virtual meeting rooms, distance learning affairs, virtual training programs, and other trade show type stuff. (Not to mention the virtual mall!) Corporate clients are fussy and hard to please. They’ve never done this sort of thing before so they’re not sure what they want. Keeping them satisfied requires a lot of trial and error that often kept our programmers and our artists busy.
Even if I don’t like it, I can understand why the company went this way. Those jobs paid well. But taking them meant passing on things like keeping our technology updated. This left the field wide open for Second Life.
Between 1999 and 2004, our technology stagnated while Second Life got to be the sexy headline-generating darling I’d always wanted us to be. We took our eyes off of being a platform of social creativity and embraced something that ultimately dragged us down. The e-commerce jobs paid the bills in the short term, but prevented us from seeing to our long-term survival. From this point on, we’re going to gradually lose users. Not just to Second Life but also to stuff like World of Warcraft. We were an amazing technological marvel in 1997, but the idea of chatting with people all over the globe is no longer a novel experience. It’s commonplace, and we don’t have many things to set us apart from the competition.
I can’t prove that the dot-com boom killed the company, but from my viewpoint in the trenches that’s how it felt. For four years we shifted focus to e-commerce, and doing so created setbacks that we were never able to overcome. I admit it’s entirely possible that without those e-commerce jobs we would have run out of money back in 1998. It’s possible the road we took we the least-worst one. But I’m still sore about how things turned out, and I’d love to play through a re-do of history where we focused on our core audience and technology. I’d love to see an alternate timeline where our face-off with Second Life looked more like a battle between equals and less like World of Warcraft steamrolling Everquest. I don’t know if we would have come out on top, but it would have been really fun to try.
If you want to pick up the story of my life from here, you could read this series. I have one more entry in this series where I’ll look back on the dot-com madness and talk about how it’s impacted my writing and worldview today.
 In my defense, his conventional design was able to draw from our existing library of standard objects, and he’s able to re-use quite a bit of the store interiors that I designed. But he’s still running circles around me in terms of artistic output.
 You can picture this as the user holding up the object in front of their face.
 Initial Public Offering. It’s what you call when a company begins offering shares of stock.
 We’re no longer controlled by stock owners. The part of the company that has shares associated with it is taken away in the lawsuit. Business is weird.