[{"data":1,"prerenderedAt":342},["ShallowReactive",2],{"writing-index-ru":3,"writing-page-ru":279},[4,98,143,185,239],{"id":5,"title":6,"bars":7,"blurb":8,"body":9,"color":7,"contacts":7,"date":82,"dateModified":7,"description":83,"extension":84,"featured":85,"groups":7,"kicker":86,"meta":87,"metrics":7,"n":88,"navigation":85,"openTabs":7,"path":89,"progress":7,"readTime":90,"reading":7,"role":7,"rules":7,"running":7,"seo":91,"ships":7,"slug":92,"stack":7,"started":7,"status":7,"stem":93,"streak":7,"tag":94,"tagColor":96,"tagline":7,"tasks":7,"timeline":7,"topics":7,"week":7,"year":7,"__hash__":97},"ru\u002Fwriting\u002F014-matchpro-engine.md","Как я переписывал матчинговый движок matchpro",null,"Что я понял, три недели наблюдая за кликами рекрутеров.",{"type":10,"value":11,"toc":76},"minimark",[12,16,20,25,28,31,41,70,73],[13,14,15],"p",{},"▸ в центре · кейс — № 014 · 18 апр '26 · 8 мин",[17,18,6],"h2",{"id":19},"как-я-переписывал-матчинговый-движок-matchpro",[13,21,22],{},[23,24,8],"em",{},[26,27],"hr",{},[13,29,30],{},"три года matchpro матчил кандидатов с вакансиями по-ленивому — tf-idf по заголовкам с щепоткой правил. было нормально. не отлично. рекрутеры продолжали присылать мне скриншоты очевидных матчей, которые движок не находил. этой весной я сел и переписал всё целиком.",[32,33,34],"blockquote",{},[13,35,36,37,40],{},"«матчинг — это не поиск. поиск вознаграждает точность. матчинг вознаграждает ",[23,38,39],{},"интересную близость",".»",[42,43,44,52,58,64],"ol",{},[45,46,47,51],"li",{},[48,49,50],"strong",{},"выкинуть ранкер"," — данные оставил, модель удалил. начал с пустого ipynb.",[45,53,54,57],{},[48,55,56],{},"эмбеддить всё"," — резюме + текст вакансии → небольшая мультиязычная модель, кэш в pg_vector.",[45,59,60,63],{},[48,61,62],{},"пере-ранжировать по сигналам"," — локация, сениорити, годы в стеке. скучные фичи всё ещё побеждают.",[45,65,66,69],{},[48,67,68],{},"тень-прогон 3 недели"," — a\u002Fb по кликам рекрутеров. смотрел на дашборды больше, чем на семью.",[13,71,72],{},"цифры через 11 недель: качество матча 41% → 78%, время до первого клика 9.2с → 3.1с, трудоустройств в неделю 12 → 28, p95 latency 640мс → 180мс.",[13,74,75],{},"полный разбор — в \u002Fwork\u002Fmatchpro.",{"title":77,"searchDepth":78,"depth":79,"links":80},"",2,3,[81],{"id":19,"depth":78,"text":6},"2026-04-18","Как я переписывал матчинговый движок matchpro — что я понял, три недели наблюдая за кликами рекрутеров.","md",true,"кейс",{},"014","\u002Fwriting\u002F014-matchpro-engine","8 мин",{"title":6,"description":83},"014-matchpro-engine","writing\u002F014-matchpro-engine",{"label":95,"color":96},"длинный текст","var(--red)","Y1a_qRsAGhXruSGRgEhmMmNqiGbKNSA3DLxb_8ebrrs",{"id":99,"title":100,"bars":7,"blurb":101,"body":102,"color":7,"contacts":7,"date":128,"dateModified":7,"description":129,"extension":84,"featured":130,"groups":7,"kicker":131,"meta":132,"metrics":7,"n":133,"navigation":85,"openTabs":7,"path":134,"progress":7,"readTime":135,"reading":7,"role":7,"rules":7,"running":7,"seo":136,"ships":7,"slug":137,"stack":7,"started":7,"status":7,"stem":138,"streak":7,"tag":139,"tagColor":141,"tagline":7,"tasks":7,"timeline":7,"topics":7,"week":7,"year":7,"__hash__":142},"ru\u002Fwriting\u002F013-support-email.md","Почему я до сих пор отвечаю на каждое письмо в поддержку сам","Короткая защита того, что поддержку стоит делать осознанно.",{"type":10,"value":103,"toc":125},[104,107,110,114,116,119,122],[13,105,106],{},"№ 013 · 02 апр '26 · 4 мин · операции",[17,108,100],{"id":109},"почему-я-до-сих-пор-отвечаю-на-каждое-письмо-в-поддержку-сам",[13,111,112],{},[23,113,101],{},[26,115],{},[13,117,118],{},"каждый ответ уходит под моим именем. не общий ящик, не скрипт первой линии, не чат-бот с улыбающимся аватаром.",[13,120,121],{},"мне говорят, что это не масштабируется. правы — не масштабируется. в этом и смысл. поддержка — это место, где выясняется, какие из твоих умных фич ломаются во вторник утром у реального человека в реальном часовом поясе. я лучше прочитаю эти письма сам, чем еженедельный дайджест.",[13,123,124],{},"группа маленькая — осознанно. инбокс фаундера — это ров, а не статья расходов.",{"title":77,"searchDepth":78,"depth":79,"links":126},[127],{"id":109,"depth":78,"text":100},"2026-04-02","Почему я до сих пор отвечаю на каждое письмо в поддержку сам — короткая защита того, что поддержку стоит делать осознанно.",false,"операции",{},"013","\u002Fwriting\u002F013-support-email","4 мин",{"title":100,"description":129},"013-support-email","writing\u002F013-support-email",{"label":140,"color":141},"блокнот","var(--amber)","gahZ-O8cCmlAdSS4aafxyn_l7SLufaxkgd5aNDqyvkI",{"id":144,"title":145,"bars":7,"blurb":146,"body":147,"color":7,"contacts":7,"date":173,"dateModified":7,"description":174,"extension":84,"featured":130,"groups":7,"kicker":175,"meta":176,"metrics":7,"n":177,"navigation":85,"openTabs":7,"path":178,"progress":7,"readTime":179,"reading":7,"role":7,"rules":7,"running":7,"seo":180,"ships":7,"slug":181,"stack":7,"started":7,"status":7,"stem":182,"streak":7,"tag":183,"tagColor":141,"tagline":7,"tasks":7,"timeline":7,"topics":7,"week":7,"year":7,"__hash__":184},"ru\u002Fwriting\u002F012-shipping-silently.md","Как отгружать, когда никто не смотрит","Уведомления в Slack выключены. Клавиатура включена. Доверяй календарю.",{"type":10,"value":148,"toc":170},[149,152,155,159,161,164,167],[13,150,151],{},"№ 012 · 20 мар '26 · 3 мин · процесс",[17,153,145],{"id":154},"как-отгружать-когда-никто-не-смотрит",[13,156,157],{},[23,158,146],{},[26,160],{},[13,162,163],{},"в большинстве недель ничего драматичного не происходит. бэкенд-миграция выкатывается. опечатка исправляется. маленькая фича уходит за флагом к одиннадцати пользователям.",[13,165,166],{},"соблазнительно ждать аудиторию, прежде чем что-то делать. привязывать каждый релиз к лонч-твиту, рассылке, посту. тихие недели — это ровно те недели, в которые продукты на самом деле собираются.",[13,168,169],{},"календарь говорит отгружать в пятницу. значит, отгружаешь в пятницу.",{"title":77,"searchDepth":78,"depth":79,"links":171},[172],{"id":154,"depth":78,"text":145},"2026-03-20","Как отгружать, когда никто не смотрит — slack выключен, клавиатура включена, доверяй календарю.","процесс",{},"012","\u002Fwriting\u002F012-shipping-silently","3 мин",{"title":145,"description":174},"012-shipping-silently","writing\u002F012-shipping-silently",{"label":140,"color":141},"Tse6Eqxwg-drUY-h1fHYl2Y2hgYgTvcqlWCx3u64OMg",{"id":186,"title":187,"bars":7,"blurb":188,"body":189,"color":7,"contacts":7,"date":225,"dateModified":7,"description":226,"extension":84,"featured":130,"groups":7,"kicker":227,"meta":228,"metrics":7,"n":229,"navigation":85,"openTabs":7,"path":230,"progress":7,"readTime":231,"reading":7,"role":7,"rules":7,"running":7,"seo":232,"ships":7,"slug":233,"stack":7,"started":7,"status":7,"stem":234,"streak":7,"tag":235,"tagColor":237,"tagline":7,"tasks":7,"timeline":7,"topics":7,"week":7,"year":7,"__hash__":238},"ru\u002Fwriting\u002F011-postgres-only.md","Странные радости бэкенда только на postgres","Что происходит, если пять лет отказываться добавлять вторую базу.",{"type":10,"value":190,"toc":222},[191,194,197,201,203,219],[13,192,193],{},"№ 011 · 06 мар '26 · 6 мин · стек",[17,195,187],{"id":196},"странные-радости-бэкенда-только-на-postgres",[13,198,199],{},[23,200,188],{},[26,202],{},[13,204,205,206,210,211,214,215,218],{},"правило простое: если postgres умеет — делаем в postgres. очередь задач? ",[207,208,209],"code",{},"SELECT ... FOR UPDATE SKIP LOCKED",". полнотекстовый поиск? ",[207,212,213],{},"tsvector",". векторный поиск? ",[207,216,217],{},"pg_vector",". кэширование? материализованные вьюхи и крон. фиче-флаги? таблица.",[13,220,221],{},"звучит аскетично. так и есть. а ещё это пять лет, в которые меньше движущихся частей, одна история про бэкапы, один дашборд мониторинга, одна ментальная модель. в день, когда придётся добавить redis, я напишу по этому поводу грустную заметку. этот день ещё не наступил.",{"title":77,"searchDepth":78,"depth":79,"links":223},[224],{"id":196,"depth":78,"text":187},"2026-03-06","Странные радости бэкенда только на postgres — что происходит, если пять лет отказываться добавлять вторую базу.","стек",{},"011","\u002Fwriting\u002F011-postgres-only","6 мин",{"title":187,"description":226},"011-postgres-only","writing\u002F011-postgres-only",{"label":236,"color":237},"техническое","var(--green)","rDdWRSu_UEm7uBwD9-j5OMpa1Voasp_45fWBKqoF7mg",{"id":240,"title":241,"bars":7,"blurb":242,"body":243,"color":7,"contacts":7,"date":266,"dateModified":7,"description":267,"extension":84,"featured":130,"groups":7,"kicker":268,"meta":269,"metrics":7,"n":270,"navigation":85,"openTabs":7,"path":271,"progress":7,"readTime":272,"reading":7,"role":7,"rules":7,"running":7,"seo":273,"ships":7,"slug":274,"stack":7,"started":7,"status":7,"stem":275,"streak":7,"tag":276,"tagColor":277,"tagline":7,"tasks":7,"timeline":7,"topics":7,"week":7,"year":7,"__hash__":278},"ru\u002Fwriting\u002F010-year-limassol.md","Год утров в Лимассоле","Двенадцать месяцев письма в 6 утра, прогулок под рожковыми деревьями и один сломанный чайник.",{"type":10,"value":244,"toc":263},[245,248,251,255,257,260],[13,246,247],{},"№ 010 · 22 фев '26 · 5 мин · жизнь",[17,249,241],{"id":250},"год-утров-в-лимассоле",[13,252,253],{},[23,254,242],{},[26,256],{},[13,258,259],{},"свет здесь приходит рано и дёшево. я начал вставать в шесть, писать час, идти двенадцать минут к морю раньше, чем остальные берут в руки телефон.",[13,261,262],{},"через двенадцать месяцев рутина всё ещё рутина. чайник сломался в ноябре. рожковые деревья на месте. тексты в основном лучше. свет по-прежнему — лучшее, что есть на кипре.",{"title":77,"searchDepth":78,"depth":79,"links":264},[265],{"id":250,"depth":78,"text":241},"2026-02-22","Год утров в Лимассоле — двенадцать месяцев письма в 6 утра, прогулок под рожковыми деревьями и один сломанный чайник.","жизнь",{},"010","\u002Fwriting\u002F010-year-limassol","5 мин",{"title":241,"description":267},"010-year-limassol","writing\u002F010-year-limassol",{"label":268,"color":277},"var(--fg-2)","Z1cPnE_I5j95WaOse5YMmnK1KDLPv9JIKgO3Y202YQs",{"id":280,"title":281,"bars":7,"blurb":7,"body":282,"color":7,"contacts":7,"date":7,"dateModified":7,"description":331,"extension":84,"featured":130,"groups":7,"kicker":332,"meta":333,"metrics":7,"n":7,"navigation":85,"openTabs":7,"path":334,"progress":7,"readTime":7,"reading":7,"role":7,"rules":7,"running":7,"seo":335,"ships":7,"slug":7,"stack":7,"started":7,"status":336,"stem":340,"streak":7,"tag":7,"tagColor":7,"tagline":7,"tasks":7,"timeline":7,"topics":7,"week":7,"year":7,"__hash__":341},"ru\u002Fpages\u002Fwriting.md","журнал",{"type":10,"value":283,"toc":328},[284,287,290,297,299,302,320,323],[13,285,286],{},"— получай новые передачи",[13,288,289],{},"одно письмо, когда публикую. не чаще раза в месяц. без трекера.",[13,291,292,293],{},"rss · ",[294,295,296],"a",{"href":296},"\u002Ffeed.xml",[26,298],{},[17,300,301],{"id":301},"категории",[303,304,305,308,311,314,317],"ul",{},[45,306,307],{},"▸ кейс — 4",[45,309,310],{},"▸ техническое — 11",[45,312,313],{},"▸ операции — 8",[45,315,316],{},"▸ блокнот — 14",[45,318,319],{},"▸ жизнь — 5",[13,321,322],{},"архив · 2019 → сейчас",[13,324,325],{},[23,326,327],{},"между черновиками я сплю. можно и тебе.",{"title":77,"searchDepth":78,"depth":79,"links":329},[330],{"id":301,"depth":78,"text":301},"журнал, длинные тексты, блокнот. одно письмо на каждую новую передачу. без трекера.","▸ CH.05 — ЖУРНАЛ · ДЛИННЫЕ ТЕКСТЫ · БЛОКНОТ",{},"\u002Fpages\u002Fwriting",{"title":281,"description":331},[337,338,339],"№ 014 · 42 ПОСТА","ПОСТОВ·42","ПОДПИСОК·1.8k","pages\u002Fwriting","PVrOxZ-42B-HIQpXzCnFb0Pj1JVTq9obEuWtY8CMJiw",1777071043145]