Connect Me — párování pro speed dating
Platforma v Rails 8, která odbaví celou online speed dating akci — a vážený model párování pod ní.
Problém
Online speed dating páruje lidi v podstatě náhodně a pak doufá. Chtěl jsem zjistit, jestli to model postavený na psychologické literatuře umí lépe — a co obnáší odbavit celou akci od registrace přes kola, video a hodnocení až po výsledky, aniž by u toho někdo hlídal hodinky.
Model párování
Sedm vážených faktorů dávajících přesně 100 bodů: attachment, sdílené hodnoty, osobnost, styl řešení konfliktu, jazyky lásky, životní styl, společné zájmy. Šest oboustranně vyhodnocovaných deal-breakerů shodí dvojici na nulu ještě před samotným skórováním. Nejvíc si stojím za tím, že každá dimenze dostane matematické zacházení, které si zaslouží, místo jednoho univerzálního skóre podobnosti — absolutní žádoucnost u Big Five tam, kde to má oporu v meta-analýzách, párová blízkost u tolerančních pásem, kosinová podobnost u jazyků lásky, Jaccard u zájmů.
Modelovat selhání, ne jen podobnost
Člen za attachment je interakce, ne vzdálenost: penalizuje úzkostně-vyhýbavou dvojici, kterou literatura označuje za konkrétní vzorec selhání. Styl konfliktu dělá totéž pro vzorec demand–withdraw. Nad tím sedí hybridní kolaborativní filtrování — bonus podle lidí, které jsi už ohodnotil kladně, spočítaný třemi SQL dotazy bez N+1. Optimalizátor přiřazení si nejdřív spočítá počet permutací a přepíná mezi vyčerpávajícím hledáním s garantovaným globálním optimem a greedy heuristikou, když je úloha moc velká — férovost je zakódovaná přímo do aritmetiky skóre, takže kdo jedno kolo vynechal, má v dalším partnera jistého.
Aby to běželo bez obsluhy
Celý životní cyklus akce žene jedna background úloha, která se sama přeplánovává — start, párování, video, hodnocení, pauza, další kolo, uzavření — a znovu se zařadí s odkladem. Každá větev je pojištěná proti vykonání mimo pořadí. Rails 8 a Solid trojice všude, takže nikde žádný Redis. Start kola pošle jednu globální zprávu plus payload pro každého uživatele zvlášť, takže identita dvojice se nikdy nerozešle celé akci. Video jede na managed WebRTC v soukromých místnostech pro dva s krátkodobými tokeny a resolver stavu odolný vůči odpojení tě po refreshi vrátí tam, kde jsi byl.
Jak to vzniklo
328 commitů, jediný autor, půl roku. 364 RSpec testů přes modely, služby, úlohy, mailery a requesty, žádný přeskočený. RuboCop plus Brakeman a bundler-audit jako blokující brány v CI. Docker image přes Kamal 2 na Hetzner VPS, zero-downtime, Let's Encrypt. Kompletní čeština a angličtina včetně mailerů, které obalují I18n.with_locale, protože úlohy běží mimo request.