In Spring of 2024, a good friend contacted me saying heād heard of an opportunity to help finish an augmented reality bus tour of a Beijing park. Heād gotten the impression the California-based client were in a pinch, and said theyād mentioned by way of referral the names of some folks we both knew and respected.
In the past, Iād consulted on AR bus bids for both The Mill and IDEO, and from those I was well aware how many hard problems AR buses involved. I was very curious to find out how these folks had addressed them, and on our introductory call I told them as much. They demurred. This was my first warning not all was right.
We spoke briefly about the nature of the project and their need for help, and agreed Iād immediately try to get a work visa and come out to China for as long as I could spare - we determined itād be a month. Fortunately I found I still had a valid visa from a previous project, so I was good to head out immediately.
When I arrived I found the project in shambles. Multiple very junior developers were touching (binary, TouchDesigner) code and deploying straight to production via thumb drive, with zero version control. In fact, they didnāt know what version control was.
They were attempting to pull off AR effects on the transparent OLED windows of the bus without accounting for lens distortion, field of view, parallax, occlusion, etc., and were frustrated and mystified when things didnāt appear to line up. They were completely naive to what depth and scale cues are and how to deploy them.
Their gyroscopes had an axis flipped, and the pitch of the bus was producing an opposite reaction in the virtual content. GPS was highly unreliable (because China) and there was no workaround in place.
Their render pipeline was drawing everything - including their renders - to fullscreen quads, which were then used for basic compositing with alpha and re-rendered - all 35+ and counting layers, using alpha-to-transparency. Their (consumer, air-cooled) gaming PCās intake was exposed directly to the dusty air outside the bus. Their consumer OLED panels were roasting in the direct sun coming through the windows. Their ārackā was an MDF shelf in the passenger seat of the bus, which was bumping along on rutted dirt roads. Their ācodeā was the absolute worst kind of fucked-up node spaghetti, not a thought given to legibility or maintainability or standards - basically the reason people hate node-based programming.
They couldnāt deliver even the very basics of what theyād sold and worked on and delayed and cost-overrun for years, much less the exciting effects they kept promising the client.
They were carpetbaggers and dilettantes convinced by their own inexperience and the advice of a onetime VJ that they could pull off something Iād twice helped quote to be brought home by a cadre of hardened killers with shitloads of math and know-how at eye-watering prices. They were way way way over their heads and were in no way interested in updating their priors in light of the shit they were swimming in.
The quiet office rang with a still-unheard answer to their āhow hard could it beā: āfuck around and find out.ā They were in the deep dark forest of unknown unknowns, drowning in hubris.
I was, I fully believe, endlessly patient.
I suggested they measure the intrinsics of their lenses to flatten the image. I suggested they implement some (any) color science. I suggested they get a second (just one more) of each of the busā cameras, so I could work camera issues in the office and not on the bus, in the hot sun, sitting sideways on a bench seat with the keyboard in my lap and the mouse on my leg, using the ridiculous 3x OLED arrangement as a coding environment. I begged them to let me rebuild their render pipeline in a less psychotic way. I begged them to let me standardize their Windows builds before they rolled out this alpha template to the remaining ~20 buses, a process that had already begun.
I demanded they implement version control, and showed them how it would save time, not waste it, by making deploys to the bus from dev instantaneous and diffable, reversable, and how branches could keep feature dev off the stable build on the bus.
I agreed against my judgement and objections to drop these necessary things on a regular basis so I could build flashy gags that did nothing to address their root issues, or to accelerate dev āĀ sequenced particle effects and sparkly animations that were given to me not with animatics or storyboards or reference images but rather just a quick verbal explanation. I was exhorted to have them ready immediately for client review, often the same day, at which point the client repeatedly became openly upset to find out that the result was not what he expected, or thought they had agreed on.
When I realized this was happening I gently suggested the client could implement a process for new work āĀ one that moved inexorably from lower to higher fidelity with a fixed number of revisions and explicit client sign-off at each step.
I negotiated a touchy situation where I discovered one of their junior devs was secretly being abusive to one of the others.
I worked 11-14 hours a day for 24 days straight with no time off. We used my gear - my depth camera (I brought my own ā bringing everything is a habit I acquired in my previous life in showbiz), my laptop, my software keys. I came out of pocket for all expenses.
I had arrived with a massively inflamed wrist from a Muay Thai injury and working in this situation was excruciating. They knew this - they bought me some chinese tiger balm pads.
I missed the month of May with my 2-year-old kid. My wife cared for a 2-year-old alone.
Iād received a deposit for less than 1/4 of the contract amount. I did all of this on faith. The faith was that, as youāve surmised from the title, theyād pay me, and ā spoiler alert ā they did not. A few years later I can say for sure these people wonāt pay me the $35k they owe me.
The faith was that if they couldāt pay, theyād let me know because I was actively digging their asses out of a hole theyād dug, and doing so tirelessly and professionally, without complaint.
The faith was that if they didnāt pay, the legal system would enforce our California-law contract and make them pay.
I hired debt collectors - they did the usual nastygram process and eventually told me itād be unwise to sue - the debtors could simply close up shop dissolve the entity.
I would be holding this particular bag.
Now Iām aware this all sounds like a complaint, and I suppose you could say to this point that it has been. The constructive thing to do is to ask āwell what have we learned now that weāve touched the stove?ā
I learned:
- Someone in dire need of help who wonāt accept your help may be beyond help
- A contract is toilet paper
- If you take $35k off someoneās desk, thatās grand larceny. If you steal $35k of their work and time, thatās A-OK.
- End clients canāt tell the difference between these bozos and me. I donāt know what to do with that information but it feels bad.
- Trust your gut
- Trust your gut
FAQs:
- I normally build progress payments into contracts. I did not in this case because it was a dead sprint at only 3 weeks long. If Iām being honest, it felt openly mistrustful to demand progress payments in a period of time that short, and I was but a sweet Summer child back then
- They do not at all deny they owe me the money - beginning the week the payment was due they simply sent an increasingly incoherent series of explanations for why they didnāt have it but would next week, a creative writing exercise they dutifully maintained for 18 months after that
- I did not pay for my own flights thank god
- They ripped off everybody on this job, we are all in touch
- They may have been deluding themselves into thinking ājust one last thingā would result in payment from their client
- Their client was very very not happy, and rightly so
- Iāll happily tell you who they are - get in touch
- Trust your gut