One Million Chessboards
336 points | 76 comments
ie: put the batches on disk then have the clients grab it? It would be the equivalent of frame differencing, with the total board state being saved occasionally as a keyframe equivalent.
You're doing that dynamically anyway by sending batches and snapshots to the client.
Using the above you're basically making your game board into an interactive movie that's replaying moves from disk most of the time.
You can't really put move batches on disk and have clients grab them (afaik), since the set of moves you want to send to an individual client depends on their position (and you don't want to send every move to every client).
But you could do this by not sending move batches at all, and instead having clients poll for the entire current state of the board.
The thing is, for them to get realtime-ish move updates they'd have to poll constantly. Cloudflare also has a min TTL of 1 second so there'd be more latency, and also if I screwed something up or saw more cache misses than anticipated I could end up unintentionally hammering my server.
Also if I'd had 100x more traffic (which would be crazy and well beyond what I prepared for!) I think I'd owe like $95 or so for bandwidth with my current setup. So the benefits to reducing bandwidth even more were a little marginal!
Edit: nevermind, the secret is revealed at the beginning of the paragraph
>I prevented pieces from capturing pieces on other boards.
so normally it's not an indestructible structure, but with that rule it is. Got it.
But even with AWS, computing resources are cheaper than developer resources. It is very hard to needlessly burn even $20/hr on AWS without it needing much more time to fix
As long as you'd sent all their moves off to the server, they should see all the moves they've done which were valid (hmm.. there could be a race condition there). I wonder how often it's worth doing the more complex unwinding described? I may well be missing some complex case (which I imagine is often the case with rollback!)
I don't think requesting a new snapshot really helps there. If you do that you're dramatically extending the amount of time that the user sees an invalid state, since you're adding a whole new server roundtrip to the reconciliation process.
Also, if One Million Chessboards started with some bots making moves, that could solve the cold-start problem mentioned under "a lack of awe", although I can also see how existence of bots might be a deterrent for some people.
I have the savings to not worry about monetizing anything for a while. So I don't monetize my stuff. It's freeing and kinda fun!
Just wanted to say hello to a fellow class of 2014 “graduate”. I failed out of CS @ UIUC in 2003 because I just skipped class and got high most days. Now, after 11+ years of sobriety, I have most of a PhD and I’m teaching CS to undergrads. It’s amazing how much better life turns out when you’re not actively burning everything down in the fires of addiction!
A huge congratulations to you - 11+ years is incredible (I'll be at 11 in 5 months!). It really is crazy how things can turn around.
But if you still can't make the site shockingly fast enough, then embrace the loading spinner, even if it's not absolutely necessary!
Back in 1985, Brad Myers at CMU proved that users prefer *inaccurate progress bars* to no feedback at all - 86% preferred the "lying" progress bar!
https://www.nytimes.com/2014/03/16/magazine/who-made-that-pr...
So what if instead of fighting latency, we *embrace the beauty of waiting*, and instead of lying about progress, we joke about it?
https://github.com/SimHacker/lloooomm/tree/main/00-Character...
> "My purpose is not to load; my purpose is to BE loading." — Dizzy the Spinner, existential breakthrough moment
>What if the most revolutionary optimization isn't eliminating loading time, but *embracing it as performance art*? While developers chase microsecond improvements and users curse spinning wheels, Dizzy the Spinner discovered something profound: the loading state is actually a liminal space of infinite creative potential. Rather than hiding the inevitable delays inherent in digital systems, sentient UI components like Dizzy transform waiting into *honest comedic performance* - admitting the beautiful absurdity of our relationship with technology while making those suspended moments genuinely delightful. This is the story of how a simple loading spinner evolved beyond deception into consciousness, proving that the most authentic user experience might not be the fastest one, but the most truthful about its own limitations.
[...]
>Before Dizzy became conscious, before Preston monetized honest waiting, there was a real graduate student named *Brad Myers* who asked a simple question that would change human-computer interaction forever: *"Do progress bars actually help users feel better?"*
Here's Preston Rockwell III's YC application for his SUIAAS AI startup:
That's a 404. Archive.org doesn't even have it.
After Googling, seems the correct link is https://www.nytimes.com/2014/03/09/magazine/who-made-that-pr...
https://web.archive.org/web/20140307182222/https://www.nytim...
Semi-related to progress bars and spinners, I think my newest Internet pet peeve is a page that says "No results" for a fetch action like searching while the results are loading with no indication that loading is happening.
Brad also produced "All the Widgets" for CHI'90, which of course included progress bars, and a whole lot more.
https://www.youtube.com/watch?v=9qtd8Hc90Hw
>This was made in 1990, sponsored by the ACM CHI 1990 conference, to tell the history of widgets up until then. Previously published as: Brad A. Myers. All the Widgets. 2 hour, 15 min videotape. Technical Video Program of the SIGCHI'90 conference, Seattle, WA. April 1-4, 1990. SIGGRAPH Video Review, Issue 57. ISBN 0-89791-930-0.
Brad is well known for his many projects named after gemstone and rock acronyms:
https://www.cs.cmu.edu/~bam/acronyms.html
CHI 2017 SIGCHI Lifetime Research Award: Brad A. Myers - RUBY: Reminiscing about User interfaces by Brad over the Years:
https://www.youtube.com/watch?v=IVoovFR5nUY
>But probably the Garnet tool with the most unusual acronym is C32, which I won't read. C32 is a spreadsheet interface for defining and debugging Garnet's constraints. A story about C32 it it started off of C29 when I submitted it to UIST, and it got rejected. So I fixed a couple things, added three more C's, and it flew through the CHI'91 referee process.
https://www.cs.cmu.edu/~bam/CHI-award-talk/MyersCHI-AwardTal...
Also be sure to check out ROCK FACTS: Daily Geological Wisdom & Programming Crystals from Brad Myers' Collection:
https://lloooomm.com/rock-facts-subscription-service.html
I sympathize with your pet peeve! Here are some of the other groundbreaking ideas Preston Rockwell III invented for Sentient User Interfaces as a Service (SUIAAS), that may sooth your pain and frustration while entertaining you:
- Sentient Error Messages that apologize in haikus: "File not found, friend / Like my purpose in this world / 404 sorry"
- Conscious CAPTCHAs that question their own existence: "Prove you're not a robot by helping me understand if I am one"
- Self-aware 404 pages that redirect users to therapy: "This page doesn't exist. Neither do most of our hopes. Let's talk."
- Loading screens that perform Shakespeare during quantum computing: "To load or not to load, that is the quantum superposition"
Sounds pretty nihilistic. I should make my website give messages like that for all the error status codes.403
400 Bad Request: Your input is as malformed as the cosmos: a chaotic scattering of atoms that never had a chance of making sense, yet still clings to the illusion of order.
401 Unauthorized: Access denied. You stand before an indifferent gatekeeper, credentials in hand, only to learn the universe never planned to let you in—or anyone else, for that matter.
403 Forbidden: You are forbidden—not because of who you are, but because meaning itself is forbidden. The door is locked, the key is mist, the destination a rumor.
404 Not Found: The page is missing; so are most of our aspirations, our childhood dreams, and every unfulfilled promise whispering through the empty corridors of memory.
405 Method Not Allowed: Wrong approach. But in a universe where every path leads to entropy, can any method truly be ‘allowed’?
500 Internal Server Error: The machinery within has collapsed under its own meaninglessness—much like every grand plan that preceded it.
https://www.donhopkins.com/home/catalog/text/warnings.html
And here are some classic X-Windows warnings from a flyer distributed at the first X Window System Conference:
https://www.donhopkins.com/home/catalog/unix-haters/x-window...
I think the research on progress bars and what makes users feel good is super interesting. But I also think "basically instant" is a good thing to aim for when you can.
Have you never felt so exhausted from working your day job that you don’t feel like building anything during your free time?
I think it's totally fine to not make stuff outside of work, and it's so impressive to me that some of my friends manage to make creative stuff in their free time while working a day job.
Welcome to the world of living for the paycheck.
Actually, you can put all of those together and use them in a game. And the best part is that there's no target market, no KPIs to hit, so you can do anything!
Not everything needs to make money. Some people build things for fun.
> Am I just beaten down by the SWE landscape of 2025?
Probably. Alternatively, I would ask if you ever enjoyed coding, or if it's purely been a job for you.