I don't understand how Rooklyn and Queens are indestructible structures? A rook can attack the structure and take pieces off the board if it's ok with sacking itself.
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.
While you definately need rollback I wonder if it would have been easier, if a player got into a conflict position, to just dump their state and grab it a fresh copy from the server?
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!)
eieio 13 minutes ago [-]
Yeah the big race here is that you've made a move (which might not be valid) and you're waiting on a response for that move - and you can receive other moves while you're waiting.
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.
commandlinefan 3 hours ago [-]
I love seeing efficient use of computing resources. As long as I've been coding, it's been sort of a mantra that "programmer time is more important than execution time" - leading to very inefficient implementations that waste not just processor time but user's time. I keep hoping that with the ongoing migration to "the cloud" that identifies the relationship between efficiency and real cost, there'll be a resurgence in proper optimization.
sph87 2 hours ago [-]
This is why I've started moving towards embedded. There is something really nice about being back on a chip with <1MB ram and a handful of Mhz. I know it's really just a leftward shift of a curve though. By the time I am getting ready to retire in 20 years these little 40mm devices will probably be running 500B parameter models.
freeone3000 3 hours ago [-]
We’ll shift it back with “distributed edge computing”.
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
pklausler 2 hours ago [-]
"computing resources are cheaper than developers up to some level of scaling" is more accurate.
mannyv 15 hours ago [-]
Could you save even more bandwidth by updating static data and letting Cloudflare cache/serve it?
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.
eieio 12 hours ago [-]
I thought about not pushing snapshot/move data over websockets - one of the systems-y friends I ran my architecture by brought this up while I was speccing the site out.
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!
ethan_smith 6 hours ago [-]
WebSockets with binary frames would likely be more efficient than HTTP polling for this use case, giving you real-time updates with less overhead than repeatedly fetching from disk via CDN.
dangoodmanUT 15 hours ago [-]
We did a very similar thing with UltimateArcade (shut down long ago) where we optimized everything to be single threaded. We had a pretty intense updates/s rate from players, and that got pretty crazy pretty fast. Actor models with single threads made things easy because we could skip locks and play with contigious chunks of memory, which as the author found, is pretty fast.
dvoros 10 hours ago [-]
Really-really nice article! I'm currently working on a single-process, in-memory, multiplayer game written in Golang. (: Happy and relieved to hear that it worked out for you and I might even borrow some ideas (e.g. I'm less worried about bandwidth, but Protobuf might still make sense). Thank you very much for sharing!
sehansen 3 hours ago [-]
I love the clearly Starcraft-inspired look of the statboxes for the pieces.
heroku 10 hours ago [-]
How about you can move to other boards, and you can only capture from the board you have moved into.
topato 15 hours ago [-]
I feel like I keep seeing one million checkboxes guy's experiments, and I wonder.... Where is the monetization? Is this just a FANGAM engineer with a lot of free time? Am I just beaten down by the SWE landscape of 2025?
eieio 12 hours ago [-]
Hi! I'm the guy.
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!
jkhdigital 4 hours ago [-]
I’m going to assume the savings were accumulated after you got sober? ;-)
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!
eieio 18 minutes ago [-]
Ha, yes, I was absolutely in the red a decade ago when I got sober.
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.
DonHopkins 8 hours ago [-]
How about doing One Million Radio Buttons instead of Checkboxes, then you wouldn't have to send as much state each update, and could run it on a smaller server! ;)
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!
> "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:
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.
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.
DonHopkins 36 minutes ago [-]
Thanks for the correction!
Brad also produced "All the Widgets" for CHI'90, which of course included progress bars, and a whole lot more.
>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:
>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.
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"
Sohcahtoa82 1 hours ago [-]
> Where is the monetization?
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.
jasonjmcghee 13 hours ago [-]
He mentions he worked at Jane Street for 7 years in his "what's my deal" section of his blog. It might have given him some space to have fun for a while - and just build stuff for the joy of building stuff.
helloplanets 3 hours ago [-]
A lot of people make small games just for fun, like any other creative hobby. Similar to: Making music, writing, drawing, 3d modeling, etc.
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!
RobotCaleb 14 hours ago [-]
Have you never made anything without trying to make a dollar on it?
mock-possum 12 hours ago [-]
No, I think the operative question is -
Have you never felt so exhausted from working your day job that you don’t feel like building anything during your free time?
eieio 15 minutes ago [-]
FWIW (I'm the author) my creative output was ~0 while I was working a 'normal' job. I worked really hard and didn't have much energy for tech stuff outside of work (especially since I wanted to live a life that included non-tech things!)
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.
maccard 9 hours ago [-]
I don’t think it is. I think it’s normal to feel that way sometimes in our line of work, but it’s not normal to always feel that way.
hombre_fatal 2 hours ago [-]
I think it's normal to always feel that way if you want to build things on the side but also don't aspire to be on the computer all day.
wiseowise 4 hours ago [-]
> it’s not normal to always feel that way.
Welcome to the world of living for the paycheck.
saagarjha 8 hours ago [-]
Sometimes, but not always.
01HNNWZ0MV43FF 10 hours ago [-]
Yeah but once I've been on break for a couple weeks my marshmallow unsquishes and I start making free stuff again
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.
One Million Chessboards
336 points | 76 comments
https://news.ycombinator.com/item?id=43825336
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.
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
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!
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:
https://lloooomm.com/YC-Application-SUIAAS-Complete.html
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.
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"
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.
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!
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.