Hacker News new | ask | show | jobs
by WorldMaker 497 days ago
> Has any of you organized or participated in a virtual book club before? What was your experience, any challenges that you faced or features that were missing?

It's funny, but my "winter hobby project", between myself and my junior developers GitHub Copilot and whiskey, has been trying in the nerdiest way possible to convince my Book Club to switch from a Ranked Choice voting that was still a bit too much first-past-the-post (but easy to model in a Google Sheet) to trying the Schulze method [1], which is fascinatingly more robust and which provides some niceties like "vote on everything as 1-5 [stars/hearts/dolphins/what have you]" (encouraging lots of ties to get the most interesting "beatpath winners") with the ability to save those ranks between voting rounds because the ranks are personal and not "points". As a voting method, it also gives us a bit more flexibility to "predict"/plan for more than one winner at a time (many of our members use public libraries with long lead times to borrow books, so we like to plan two or three books ahead). But also as a voting method that encourages ties, it still allows for surprises/serendipity and changing minds/shifting winds.

Ever since ModernBallots [2] shut down (RIP) it's been increasingly harder to convince people to try the Schulze method for voting. For one thing the Wikipedia rabbit hole is full of way too much complexity of the intricacies of voting methods in general and the math looks way harder than it is. While I wouldn't want to do the math by hand, it's a really simple algorithm from a computer science standpoint: convert one user's ballot's ranks into an adjacency matrix representing which item (book) beats with other item (book) [1 for edge, 0 for no edge], add adjacency matrixes together (you get an adjacency matrix where the edge weights are number of ballots), then run a simply modified Floyd-Warshall on the matrix to find the widest paths (ranking the items by most widest paths to fewest). Floyd-Warshall is a classic, simple "textbook" digraph algorithm. So much so that GitHub Copilot knows it quite well. (I recall it came up three or four times in my own college experiences.)

While I've been working on this, so far I've been intentionally specializing it for this particular book club. I'm trying to keep it fun for myself and worrying about generalizing it into a product (such as a potential replacement for ModernBallots) has intentionally been something I've tried to avoid to keep from burning out on it. (Kudos to you on doing it and shipping a first version of it.)

I have been building it in the open, for a variety of reasons: https://github.com/WorldMaker/jocobookclub/

I think it's a cool codebase. The main site is SSG (to GitHub Pages), progressively enhanced with web components and some HTML templates for those web components. The API site is sent to Deno Deploy, using Deno KV as the database, and using Deno Queues for the vote calculation work which is probably overkill for the club's current scale but the engineering effort behind it felt like a good idea and makes me happy. The slowest loading things right now on the site are the Font Awesome icons in use to keep it fun/visually interesting, and as the number of icons in use stabilizes I expect to more cleanly subset it and drop that into the SSG build as well.

You can even browse the public (static) parts of the site: https://worldmaker.net/jocobookclub/

You won't see the actual voting tools light up, though without logging in, and for hopefully obvious reasons (small, private club) the registration links are restricted to invite-only. Maybe I should take a screenshot of them at least, to include in the README, but so far I haven't thought much about the public facing aspects of the codebase like that as it is still mostly for the benefit of myself and the club members.

In general, we probably don't talk about voting methods enough and first-past-the-post is too easy a default and too accidental a fallback even when you think you are doing something smarter like a Ranked Choice ballot. Sometimes the more complicated you try to make those rules, the less effective they are in reality. It's been one of my nerdier obsessions for a long time. I used to use ModernBallots a lot to try to convince people to stop using SurveyMonkey or Google Sheets and simple counts for something a little smarter and a lot wilder that finds answers that everyone collectively don't always realize they all mostly agree on/with.

[1] https://en.wikipedia.org/wiki/Schulze_method

[1] https://modernballots.com