<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Все публикации подряд на Хабре [expanded by feedex.net]</title><link>https://habr.com/ru/articles/</link><description>Все публикации подряд на Хабре</description><atom:link href="https://feedex.net/feed/habr.com/ru/rss/articles/all/" rel="self"/><lastBuildDate>Tue, 11 Aug 2026 05:31:06 +0000</lastBuildDate><item><title>А вы всегда пьёте коньяк на завтрак или только по выходным? Часть 2</title><link>https://habr.com/ru/articles/1043094/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1043094</link><description>&lt;noscript&gt;&lt;img src="https://rap.skcrtxr.com/pub/pix/74f2e3da-7469-404e-b84b-e39195e3a83a" alt=""&gt;&lt;/noscript&gt;
&lt;noscript&gt;&lt;img src="https://rap.skcrtxr.com/pub/pix/103a5853-d089-4779-8034-b6a1bd8bccfe" alt=""&gt;&lt;/noscript&gt;
    &lt;div id="mount"&gt;&lt;div id="app"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;svg height="24" width="24"&gt;Обновить&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;article&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;a href="https://habr.com/ru/users/sonyarybak/" rel="nofollow"&gt;&lt;div&gt;&lt;img alt="" height="24" src="https://habrastorage.org/r/w48/getpro/habr/avatars/3b1/d74/861/3b1d748614ce0a911bd22615114230c0.jpeg" width="24"&gt;&lt;/div&gt;&lt;/a&gt;&lt;span&gt;&lt;a href="https://habr.com/ru/users/sonyarybak/" rel="nofollow"&gt;sonyarybak&lt;/a&gt;&lt;span&gt;&lt;time datetime="2026-08-11T05:31:06.000Z" title="2026-08-11, 05:31"&gt;2 минуты назад&lt;/time&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;svg height="24" width="24"&gt;Уровень сложности&lt;/svg&gt;&lt;/span&gt;&lt;span&gt;Простой&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;svg height="24" width="24"&gt;Время на прочтение&lt;/svg&gt;&lt;/span&gt;&lt;span&gt;7 мин&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div lang="ru"&gt;&lt;div id="post-content-body"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;Привет всем, я – Соня Рыбак, IT HRD. Продолжаю свою подборку крутых понятий и терминов, которые первый раз узнала работая в айти. Они полезны не только для работы, но и для жизни. Добавляйте в комменты свои. &lt;a href="https://habr.com/ru/articles/988380/" rel="noopener noreferrer nofollow"&gt;Ссылка на часть 1.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Эти термины я регулярно собираю в рубрике «Коньяк по утрам» в своём Telegram-канале &lt;a href="https://t.me/rybaksofya" rel="noopener noreferrer nofollow"&gt;HR for tech&lt;/a&gt;. Итак, погнали.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. Ложная дихотомия&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Ложная дилемма, чёрно-белое мышление — это логическая ошибка и манипулятивная тактика, при которой из множества вариантов предлагаются только два (обычно крайних), игнорируя промежуточные или иные альтернативы. Этот приём сужает выбор, вынуждая принять одну сторону, часто ложно представляя одну из альтернатив как приемлемую, а другую — как неприемлемую. Мир не чёрно-белый. &lt;em&gt;Наш коньяк с этой полки.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. Hero culture&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Корп среда, которая держится на подвигах отдельных ребят, готовых работать по 60 часов в неделю и спасать все в последний момент. Личное самопожертвование это круто. &lt;/p&gt;&lt;p&gt;Признаки такой культуры: регулярные авралы, незаменимость людей, отсутствие процессов. Вася все знает помнит придет починит, поощрение выгорания, смотрите Федя работает в отпуске или на больничном, молодец! &lt;/p&gt;&lt;p&gt;Лечится надежностью. Если для успеха нужен герой чаще это хреновые процессы. Netflix специально строил систему так, чтобы падение сервисов было рабочим сценарием, а не катастрофой.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. Эффект Линди&lt;/strong&gt;&lt;br&gt;Чем дольше живет технология, тем дольше она еще проживет. SQL существует почти 50 лет. С огромной вероятностью будет жить еще 50. Старые технологии часто безопаснее новых.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. Преимущество второго игрока &lt;/strong&gt;&lt;br&gt;Статистика шахмат говорит о преимуществе первого хода. Белые выигрывают чуть чаще, чем черные, 52-56 процентов.&lt;/p&gt;&lt;p&gt;Но в бизнесе не обязательно быть первым. Иногда выгоднее быть вторым. Google не был первой поисковой системой. Были AltaVista, Yahoo, Lycos. Но Google посмотрел на их ошибки и сделал лучше. То же с iPhone. Смартфоны уже были. Apple сделал первый нормальный. &lt;/p&gt;&lt;p&gt;Компания-гигант может позволить стартапу первым потестить новую нишу, если идея выстрелила, гигант заходит на рынок со своими ресурсами, фиксит недочеты пионера и захватывает долю рынка.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5. Эвристика доступности&lt;/strong&gt;&lt;br&gt;Ментальная ловушка. Мы оцениваем вероятность события, насколько легко примеры этого события приходят в голову. Если можно быстро что-то вспомнить, мозг делает вывод: легко вспомнилось, значит, это правда.&lt;/p&gt;&lt;p&gt;Я дико боюсь летать на самолетах, больше чем ездить на машине. Репортажи об авиакатастрофах из сми пугают, они легко всплывают в памяти, страшно. Ошибочно кажется что это часто. Хотя по статистике это самый безопасный транспорт.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6. Bus factor&lt;/strong&gt;&lt;br&gt;Проектная метрика. Сколько участников команды должны исчезнуть, грубо, попасть под автобус, чтобы проект остановился из-за нехватки знаний.&lt;/p&gt;&lt;p&gt;Bus factor = 1: критическая ситуация, проект зависит от одного эксперта. Его уход, болезнь, увольнение, отпуск, парализует проект. Чем выше число, тем лучше. Значит, что знания распределены между многими людьми, и уход одного человека не станет катастрофой.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;7. Гемба (Gemba)&lt;/strong&gt;&lt;br&gt;Термин из Toyota. Реальное место, где происходит работа и создается ценность. Руководители должны понимать ситуацию из первых рук, а не из отчетов.&lt;/p&gt;&lt;p&gt;Тимлид смотрит, как именно пользователи взаимодействуют с интерфейсом, или садится рядом с разработчиком, чтобы понять боль процесса.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;8. It works on my machine&lt;/strong&gt;&lt;br&gt;У меня на компьютере все работает. Мем в разработке, когда код успешно выполняется у программиста, но ломается в тестовой или в проде. Симптом плохой настройки процессов и разницы в окружениях.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;9. Single source of truth &lt;/strong&gt;&lt;br&gt;Один источник истины. Принцип организации данных, вся информация или вид данных хранится в одном месте. Не копировать данные в разные таблицы, а все системы обращаются к одному источнику. &lt;/p&gt;&lt;p&gt;Нет споров чья таблица правильнее, данные актуальны, быстрее принимаем решения. Git как единственное место актуального кода. Figma, когда изменение цвета кнопки в одном мастер-компоненте меняет его во всех макетах.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;10. Петли положительной обратной связи&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Процесс, в котором результат действия усиливает само это действие. &lt;/p&gt;&lt;p&gt;Банковская паника: люди боятся, что банк закроется → массово снимают деньги → у банка реально заканчиваются деньги → паника усиливается.&lt;/p&gt;&lt;p&gt;Социология: богатые богатеют, бедные беднеют. Успех дает доступ к ресурсам, которые позволяют достигать еще большего успеха.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;11. Fake it til you make it&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Веди себя так, будто уже можешь — пока реально не сможешь. В мягких навыках работает хорошо. Главное, не фейкать, например, в хирургии. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;12. Вопрос важнее ответа&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Метод Сократа: он не давал готовых ответов, а задавал вопросы и через них люди сами приходили к истине. Если задаешь плохой вопрос, получаешь быстрый, но бесполезный ответ.&lt;/p&gt;&lt;p&gt;‘Как нам увеличить выручку?’ Звучит умно, но ни к чему не ведет.&lt;br&gt;‘Где мы теряем деньги прямо сейчас?’ — уже действие.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;13. Not invented here (NIH syndrome)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Культура, когда команда отвергает чужие идеи, продукты потому, что они созданы не ими. Мы сделаем лучше. Сделаем свой message broker, не будем брать Kafka. У нас свой путь, нам не нужны чужие фреймворки OKR.&lt;/p&gt;&lt;p&gt;Оправдано, когда: у вас уникальные требования, внешние решения не масштабируются под вашу нагрузку, критична безопасность и контроль.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;14. Move fast, break things&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Двигайся быстро, даже если по пути что-то сломаешь. Девиз раннего Facebook. Скорость важнее совершенства.&lt;/p&gt;&lt;p&gt;Ты выпускаешь сырой продукт, сразу получаешь обратную связь от реальных пользователей и исправляешь ошибки на ходу. Позже Цукерберг сменил лозунг на более зрелый: Move fast with stable infrastructure. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;15. Shadow IT&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Теневое IT, когда компания официально работает в Teams, но команда переписывается в Telegram, хранит файлы в личном Google Drive и ведет задачи в Notion без ведома IT депа.&lt;/p&gt;&lt;p&gt;Риски: утечка данных, проблемы с безопасностью, зоопарк из сервисов. Индикатор того, что сотрудникам неудобно работать с официальными инструментами.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;16. Tribal knowledge&lt;/strong&gt; (племенное знание)&lt;/p&gt;&lt;p&gt;Знания в голове у Валеры. Критически важная информация известна только определенным людям, нигде не зафиксирована. Валера ушел, все встало.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;17. Bikeshedding&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Закон Паркинсона о тривиальности. Тратим уйму времени на обсуждение фигни, вместо сложного и важного. Чем проще тема — тем больше людей в нее приходят → тем дольше спор.&lt;/p&gt;&lt;p&gt;На совещании по строительству атомной электростанции вопрос безопасности реактора обсуждают 5 минут. Зато 3 часа спорят, в какой цвет покрасить сарай для велосипедов (bike shed).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;18. Луддиты&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Так называли английских рабочих в начале 19 века, которые громили станки, потому что боялись остаться без работы из-за машин. &lt;/p&gt;&lt;p&gt;Сейчас это когда любую новую технологию встречают не давайте разберемся а в режиме ‘запретить, отключить, сжечь’. &lt;/p&gt;&lt;p&gt;AI, автоматизация, новые инструменты, плохо, раньше Excel был духовнее. И уберите это сатанинское колесо от моего отдела.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;19. GSD  &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Get Shit Done. Стиль работы, где человек просто берет и делает. &lt;/p&gt;&lt;p&gt;Из стартапной среды, где ценят не управленческий туман, а людей, которые реально делают.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;20. Pomodoro  &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Техника тайм-менеджмента, делишь задачу на короткие отрезки, 25 минут работаешь только над одной задачей, потом 5 минут отдыхаешь. &lt;/p&gt;&lt;p&gt;После 4 таких подходов делаешь длинный перерыв на 15–20 минут.&lt;/p&gt;&lt;p&gt;Придумал студент Франческо Чирилло. Он занимался с кухонным таймером в форме помидора, отсюда и название. &lt;/p&gt;&lt;p&gt;Не пытайтесь героически сесть и сделать все сразу, а спокойно делайте задачу короткими кусками. Без чатов, почты и душевных метаний.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;21. Сбитый летчик&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Лучшие годы позади. Метафора для описания очень успешного человека, чьи лучшие результаты, слава, большой доход остались в прошлом. &lt;/p&gt;&lt;p&gt;Часто используют, когда обсуждают бывших звезд рынка. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;22. Окно Овертона  &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;То, что вчера казалось немыслимым, со временем начинают спокойно обсуждать, потом принимать, а потом считать нормой.&lt;/p&gt;&lt;p&gt;Автор Джозеф Овертон, президент Центра Политики.&lt;/p&gt;&lt;p&gt;Отношение к однополым бракам в США, от табу к законному. Или сначала работа по вечерам это бардак, потом ты гибкий, потом синьерный, и вот ты отвечаешь в чатах в 22:43, как так и надо.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;23. Реверс-инжиниринг  &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Разбор готовой системы, продукта или решения, чтобы понять, как оно устроено внутри. Не строишь с нуля, а идешь от результата назад к механике.  &lt;/p&gt;&lt;p&gt;Смотришь на команду, которая нанимает крутых, и раскручиваешь назад. Как у них описаны роли, кто интервьюирует, как устроена оценка, где отсеивают.&lt;/p&gt;&lt;p&gt;Не у них просто сильный бренд, а раскурчивашь из каких шагов собран этот результат.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;24. Темные паттерны  &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Приемы в интерфейсах и процессах, которые подводят тебя к выгодному для компании, но не всегда честному выбору.  &lt;/p&gt;&lt;p&gt;Легко подписаться и хрен как отписаться. Большая яркая кнопка ‘да’, а маленькая серая ‘нет, я хочу страдать дальше’.  &lt;/p&gt;&lt;p&gt;&lt;strong&gt;25. Перекладывать JSON&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Выражение про работу, где внешне все выглядит технично и сложно, а по сути ты просто гоняешь данные из одной системы в другую.  &lt;/p&gt;&lt;p&gt;Часто так иронизируют над задачами без настоящей инженерной глубины. Но в целом это принижение работы бекендеров, как если говорить, что работа актера это открывать рот.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;26. Переставлять кровати в борделе&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Крылатая фраза про эффективный менеджмент. Бесполезная имитация бурной деятельности (ИБД).&lt;/p&gt;&lt;p&gt;Когда меняют структуру, названия отделов, роли, но не трогают настоящую проблему.&lt;br&gt;Был отдел подбора, стал talent acquisition hub.&lt;br&gt;Были долгие согласования, остались долгие согласования. &lt;/p&gt;&lt;p&gt;Когда бордель перестает приносить прибыль, нужно менять персонал, а не переставлять кровати.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;27. Если надо объяснять, то не надо объяснять&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Хороший жизненный маркер свой-чужой.. &lt;/p&gt;&lt;p&gt;Если у людейт нет базового совпадения по контексту, культуре, ценностям, то любые долгие разговоры будут мимо. &lt;/p&gt;&lt;p&gt;Принцип общего контекста. Единый понятийный аппарат. Фразу часто приписывают поэтессе Зинаиде Гиппиус. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;28. Культура без поиска виновных (Blameless culture)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Культура, где ошибки разбирают без охоты на виновных. Не “кто сломал”, а “почему система позволила этому случиться”. &lt;/p&gt;&lt;p&gt;Это не значит, что ответственности нет. Она есть. Просто фокус не на публичной порке, а на улучшении системы.&lt;/p&gt;&lt;p&gt;Если за ошибку сразу наказывают, люди быстро учатся не говорить правду. А без правды процессы не чинятся.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;29. Закон Мерфи (Закон подлости)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Шуточный эмпирический принцип.&lt;/p&gt;&lt;p&gt;Если что-то может пойти не так, оно обязательно пойдет не так, причем в самый неподходящий момент. Если код может упасть во время демо — он упадет именно в этот момент. Бутерброд всегда падает маслом вниз.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;30. Happy path&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Основной успешный сценарий.&lt;/p&gt;&lt;p&gt;Это путь, в котором пользователь делает ожидаемые действия, система отвечает как задумано, и человек без ошибок доходит до нужного результата.&lt;/p&gt;&lt;p&gt;Кандидат получил письмо, перешел по ссылке, выбрал слот, пришел на интервью, интервьюер оставил фидбек, рекрутер сделал следующий шаг. &lt;/p&gt;&lt;p&gt;Happy path нужен, чтобы описать нормальное рабочее флоу. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;31. Ад зависимостей (Dependency hell)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;В разработке: обновили одну библиотеку, сломались три другие. Потом выяснилось, что четвертая больше не поддерживается, а пятая конфликтует с безопасностью.&lt;/p&gt;&lt;p&gt;Или HR ждет финансы, финансы ждут юристов, юристы ждут руководителя, руководитель ждет СЕО, СЕО в самолете.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;32. Кипятить океан&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Пытаться собрать мнения всех миллиона пользователей перед запуском одной кнопки. Давайте опросим фокус-группу из 50 человек&lt;/p&gt;&lt;p&gt;&lt;strong&gt;33. Технооптимисты и технопессимисты&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Технооптимисты верят, что технологии в целом делают жизнь лучше. Технопессимисты, наоборот, ждут от технологий рисков: люди разучатся думать, автоматизация ухудшит качество, AI всех заменит, раньше было надежнее. Уберите это адово колесо от моего отдела.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Соня Рыбак — HRD, пишу про найм, карьеру и продуктовый HR для инженерных команд. Мой &lt;a href="https://t.me/rybaksofya" rel="noopener noreferrer nofollow"&gt;телеграм-канал HR for tech: @rybaksofya&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;/&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;img alt="Хабр Карьера Курсы" src="https://habrastorage.org/webt/qq/ey/pn/qqeypn-py71suynxbusbakjdfjw.png"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Хабр Курсы для менеджеров&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt; Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать! &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">sonyarybak</dc:creator><pubDate>Tue, 11 Aug 2026 05:31:06 +0000</pubDate><guid>https://habr.com/ru/articles/1043094/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1043094</guid><category>терминология it</category></item><item><title>Мир, рассчитанный на рост, заканчивается</title><link>https://habr.com/ru/articles/1068952/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1068952</link><description>&lt;div&gt;&lt;div&gt;&lt;svg height="24" width="24"&gt;Обновить&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;article&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;a href="https://habr.com/ru/users/Alex-sulimov/" rel="nofollow"&gt;&lt;div&gt;&lt;img alt="" height="24" src="https://habrastorage.org/r/w48/getpro/habr/avatars/216/e5d/d51/216e5dd512d1670307fe64c9d2c5612d.jpeg" width="24"&gt;&lt;/div&gt;&lt;/a&gt;&lt;span&gt;&lt;a href="https://habr.com/ru/users/Alex-sulimov/" rel="nofollow"&gt;Alex-sulimov&lt;/a&gt;&lt;span&gt;&lt;time datetime="2026-08-11T05:30:06.000Z" title="2026-08-11, 05:30"&gt;3 минуты назад&lt;/time&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;svg height="24" width="24"&gt;Уровень сложности&lt;/svg&gt;&lt;/span&gt;&lt;span&gt;Простой&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;svg height="24" width="24"&gt;Время на прочтение&lt;/svg&gt;&lt;/span&gt;&lt;span&gt;6 мин&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Мнение&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div lang="ru"&gt;&lt;div id="post-content-body"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;Некоторые графики объясняют происходящее лучше, чем десяток книг с прогнозами. Вот, например.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/3b2/558/aea/3b2558aea7c61f62163d07120ab00f67.jpg" alt="Структура коэффициента демографической нагрузки. Европа, 1950–2023. Число иждивенцев на 100 человек в возрасте 15–64 лет, с разбивкой на молодых (0–14) и пожилых (65+). Источник - https://t.me/sterngang" title="Структура коэффициента демографической нагрузки. Европа, 1950–2023. Число иждивенцев на 100 человек в возрасте 15–64 лет, с разбивкой на молодых (0–14) и пожилых (65+). Источник - https://t.me/sterngang" width="1619" height="971"&gt;&lt;div&gt;&lt;figcaption&gt;Структура коэффициента демографической нагрузки. Европа, 1950–2023. Число иждивенцев на 100 человек в возрасте 15–64 лет, с разбивкой на молодых (0–14) и пожилых (65+). Источник - &lt;a href="https://t.me/sterngang" rel="noopener noreferrer nofollow"&gt;https://t.me/sterngang&lt;/a&gt;&lt;/figcaption&gt;&lt;/div&gt;&lt;/figure&gt;&lt;p&gt;Это структура демографической нагрузки в Европе с 1950 года. В 1950-м на сто человек трудоспособного возраста приходился 41 ребёнок и 12 пожилых. В 2023-м - 24 ребёнка и 31 пожилой. Сама нагрузка почти не сдвинулась: 53 иждивенца тогда, 55 сейчас. Перевернулась её структура.&lt;/p&gt;&lt;p&gt;Раньше большинство тех, кого содержало работающее общество, только собирались войти в экономику. Теперь всё большая доля иждивенцев из неё, наоборот, выходит. За этим сдвигом проявляется смена модели, на которой держится почти всё, что мы считаем &lt;strong&gt;устройством нормальной жизни&lt;/strong&gt;.&lt;/p&gt;&lt;h3&gt;Наша цивилизация расчитана под постоянный приток людей&lt;/h3&gt;&lt;p&gt;Большинство привычных институтов сложились в эпоху, когда население росло, а вместе с ним росло число работников, потребителей, налогоплательщиков, студентов и покупателей квартир. Каждое следующее поколение всегда оказывалось достаточно многочисленным, чтобы заместить предыдущее и продолжить расширение системы.&lt;/p&gt;&lt;p&gt;На этом допущении построено больше, чем кажется. Пенсионной системе нужны следующие поколения работающих; государству нужны следующие налогоплательщики; строителям нужны новые семьи и чтобы у тех было побольше детей; университету необходимы новые студенты. Даже классическая корпоративная структура повторяет демографическую пирамиду: широкое основание из исполнителей, слой менеджеров - поменьше, и совсем немного людей наверху. И работает она ровно до тех пор, пока снизу стабильно подходит достаточно людей.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;А людей становится меньше.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;При этом дело не в сокращении населения как таковом. Если людей стало на 10% меньше, а производительность выросла на 30%, общество спокойно может стать богаче. Критично другое - это соотношение поколений. Когда на место ста уходящих работников приходит не сто новых, а семьдесят, меняется сама механика экономики.&lt;/p&gt;&lt;h3&gt;Человек становится дефицитом&lt;/h3&gt;&lt;p&gt;Десятилетиями бизнес охотился прежде всего за капиталом: рабочую силу при разумной цене почти всегда удавалось найти. В стареющем обществе это разворачивается. Дефицитом становится практически любой квалифицированный человек, точнее специалист, которого нельзя подготовить за квартал. Например, инженер, врач, технолог, разработчик, преподаватель, …&lt;/p&gt;&lt;p&gt;И здесь нынешняя волна ИИ выглядит иначе, чем в привычной тревожной рамке. Мы привыкли спрашивать, сколько рабочих мест уничтожит искусственный интеллект. А для стареющего мира важнее обратный вопрос: сколько рабочих мест благодаря ему вообще не придётся заполнять? Если компании сегодня нужна тысяча сотрудников, а через двадцать лет подходящих специалистов ощутимо меньше, у неё два выхода либо бесконечно конкурировать за людей, либо научиться делать ту же работу силами семисот.&lt;/p&gt;&lt;p&gt;В такой экономике &lt;strong&gt;роботы и ИИшка уже даже сегодня не столько конкуренты человеку&lt;/strong&gt;, сколько способ компенсировать его отсутствие. Сейчас мы боимся, что технологии оставят людей без работы. Через двадцать лет вполне можем переживать, достаточно ли быстро автоматизируемся, чтобы закрыть нехватку рук и голов.&lt;/p&gt;&lt;h3&gt;Стареет не только производство, но и спрос&lt;/h3&gt;&lt;p&gt;Возраст населения задаёт и структуру потребления. Молодой человек покупает образование, жильё, мебель, автомобиль, товары для детей. С возрастом в корзине растёт доля медицины, фармацевтики, ухода, финансовых услуг. Поэтому старение это не только пенсионная проблема, но и огромное перераспределение спроса между рынками, и для бизнеса из него следует неуютный вопрос: &lt;strong&gt;не только кто наш клиент сегодня, но и сколько таких клиентов останется через пятнадцать лет.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Показательнее всего недвижимость. Кажется очевидным: меньше людей и должно быть дешевле жильё. Но одновременно с сокращением населения идёт его концентрация в крупнейших городах. В итоге малые города пустеют (про &lt;a href="https://www.mk.ru/politics/2026/08/10/stalo-izvestno-skolko-dereven-v-rossii-ischezlo-za-god.html" rel="noopener noreferrer nofollow"&gt;деревни&lt;/a&gt; вообще без слез не сказать), а квартиры в больших агломерациях становятся всё менее доступными. Демография неотделима от географии.&lt;/p&gt;&lt;h3&gt;Капитал стареет вместе с людьми&lt;/h3&gt;&lt;p&gt;Основные накопленные активы естественным образом сосредоточены у старших поколений. Но чем дольше живут люди, тем позже капитал переходит к следующему поколению. Человек начинает работать в двадцать с небольшим, а существенную часть семейных активов получает ближе к шестидесяти. Возникает разрыв: биологически новое поколение давно взрослое, но значительная часть собственности всё ещё закреплена за предыдущим.&lt;/p&gt;&lt;p&gt;Это объясняет часть межпоколенческого конфликта лучше, чем разговоры о «неправильной молодёжи». Если жильё относительно доходов заметно подорожало, отказ от ранней покупки квартиры не обязательно инфантильность, а иногда рациональная реакция на изменившиеся условия. То же и с карьерой: если люди дольше остаются профессионально активными, руководящие позиции освобождаются медленнее, и &lt;strong&gt;карьерная лестница превращается в карьерную очередь&lt;/strong&gt;. Нежелание молодого специалиста десятилетиями ждать следующей ступени это возможно, не про «культуру поколения», а про то, что система стала двигаться медленнее.&lt;/p&gt;&lt;h3&gt;Старение придёт и в политику&lt;/h3&gt;&lt;p&gt;Если молодых относительно меньше, а старшие многочисленнее и дисциплинированнее ходят на выборы, средний избиратель стареет. Значит, политический вес смещается к вопросам пенсий, медицины, социальных гарантий, стоимости жилья и сохранности накоплений. (Можно обойтись без теории заговора - обычная математика голосования.)&lt;/p&gt;&lt;p&gt;Но &lt;strong&gt;возникает конфликт горизонтов. &lt;/strong&gt;Последствия решений по госдолгу, инфраструктуре, образованию и пенсиям десятилетиями будут нести те, у кого сегодня меньше всего политического веса. И это уже не вопрос демографии, а вопрос способности институтов принимать долгосрочные решения, то, что стареющим демократиям даётся всё труднее.&lt;/p&gt;&lt;h3&gt;Самым ценным ресурсом становится продуктивная жизнь&lt;/h3&gt;&lt;p&gt;Важно! &lt;strong&gt;Старение не равно упадку.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Ключевой вопрос это не сколько человеку лет, а сколько лет он остаётся здоровым, обучаемым и экономически активным. Здоровый семидесятилетний инженер и семидесятилетний человек, которому нужен постоянный уход - для экономики две разные ситуации. Поэтому здравоохранение неожиданно становится частью базовой инфраструктуры производительности, а не только статьёй социальных расходов.&lt;/p&gt;&lt;p&gt;То же и с образованием. Если профессиональная жизнь длится пятьдесят лет, то модель «получил профессию в двадцать и работаешь до пенсии» ломается. А заместить всех новым молодым поколением не выйдет: его просто недостаточно. Значит, переучивать людей в сорок, пятьдесят и шестьдесят перестаёт быть благим пожеланием и становится экономической необходимостью.&lt;/p&gt;&lt;h3&gt;Бизнесу придётся сменить формулу роста&lt;/h3&gt;&lt;p&gt;В XX веке рост бизнеса почти автоматически означал рост штата: больше клиентов значит больше операций, и значит больше сотрудников. При дорогом и дефицитном человеческом труде выигрывает другая модель - больше клиентов при почти неизменном числе людей. Поэтому ИИ, автоматизация, стандартизация процессов, ДМС и управление знаниями перестают быть просто способами приподнять маржу. Они становятся способом масштабироваться в принципе.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Отдельная история это сохранение знаний. &lt;/strong&gt;Когда большая возрастная когорта уходит из профессии, компания теряет не только сотрудников, но и накопленный опыт. Почему продукт устроен именно так? Почему для этого клиента действует исключение? Почему десять лет назад приняли именно такое архитектурное решение? Часто ответы существуют только в голове у нескольких человек. И корпоративная память (документация, базы знаний, ИИ-инструменты работы с ними) превращается в критическую инфраструктуру.&lt;/p&gt;&lt;h3&gt;От роста людей — к росту производительности&lt;/h3&gt;&lt;p&gt;Всё это не приговор: мир может, но не обязан стать беднее. Он переходит к другой модели.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Новая формула может звучать как-то так:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;меньше работников, значит дороже человеческое время, значит больше автоматизации, значит выше производительность.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;В этой логике преимущество бизнеса это умение делать больше меньшим числом людей. Преимущество государства это дольше сохранять человека здоровым и продуктивным. Задача образования - переучивать человека многократно за жизнь. Роль технологий это экономить человеческий труд там, где людей физически не хватает. Под этим углом ИИ, роботизация, война за специалистов, миграция, рост расходов на медицину, пенсионные реформы и кризис доступности жилья перестают выглядеть независимыми сюжетами: все они разворачиваются на фоне одного медленного изменения.&lt;/p&gt;&lt;p&gt;Стоит уточнить,&lt;strong&gt; что именно дорожает. &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Дефицитом становится не человек вообще, а определённая часть того, что он делает. Всё, что поддаётся регламенту и воспроизводится по запросу, машина рано или поздно подхватит и хорошо, что подхватит: рук на это всё равно не хватит. &lt;/p&gt;&lt;p&gt;Но есть работа другого рода - удерживать проект, которого ещё нет, годами; верить в свои решения; возвращаться и возрождать начатое, если ты видишь в этом потенциал. Нести смысл через время: репутацию, доверие, институцию - то, что не пишется по запросу, а вынашивается. И чем дефицитнее человеческое время, тем яснее, что беречь его стоит именно для этого.&lt;/p&gt;&lt;p&gt;Мы прекрасно умеем жить в мире, где каждое следующее поколение многочисленнее предыдущего. И почти не понимаем, как должны работать экономика, компании и государство, когда всё наоборот.&lt;/p&gt;&lt;p&gt;Демография меняется медленно и в этом и ловушка. Когда сдвиг становится очевидным, исправить его быстро уже нельзя: человек, который выйдет на рынок труда через двадцать лет, должен сначала родиться.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Поэтому главный вопрос ближайших десятилетий, возможно, звучит не «сколько людей останется на Земле». А так: как устроить мир, в котором человек становится дефицитом?&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;img alt="Хабр Карьера Курсы" src="https://habrastorage.org/webt/qq/ey/pn/qqeypn-py71suynxbusbakjdfjw.png"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Хабр Курсы для менеджеров&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt; Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать! &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Alex-sulimov</dc:creator><pubDate>Tue, 11 Aug 2026 05:30:06 +0000</pubDate><guid>https://habr.com/ru/articles/1068952/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1068952</guid><category>демография</category><category>старение населения</category><category>рынок труда</category><category>искусственный интеллект</category><category>автоматизация</category><category>производительность труда</category><category>дефицит кадров</category><category>миграция</category><category>человеческий капитал</category><category>экономика будущего</category></item><item><title>BLIS: недостающую среднюю ступеньку построили тридцать лет назад</title><link>https://habr.com/ru/articles/1069058/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1069058</link><description>&lt;div&gt;&lt;div&gt;&lt;svg height="24" width="24"&gt;Обновить&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;article&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;a href="https://habr.com/ru/users/nonpareil_coder/" rel="nofollow"&gt;&lt;div&gt;&lt;img alt="" height="24" src="https://assets.habr.com/habr-web/release_2.339.0/client/img/avatars/189.png" width="24"&gt;&lt;/div&gt;&lt;/a&gt;&lt;span&gt;&lt;a href="https://habr.com/ru/users/nonpareil_coder/" rel="nofollow"&gt;nonpareil_coder&lt;/a&gt;&lt;span&gt;&lt;time datetime="2026-08-11T04:36:55.000Z" title="2026-08-11, 04:36"&gt;56 минут назад&lt;/time&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;svg height="24" width="24"&gt;Время на прочтение&lt;/svg&gt;&lt;/span&gt;&lt;span&gt;8 мин&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Туториал&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div lang="ru"&gt;&lt;div id="post-content-body"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;&lt;em&gt;Часть 3 цикла о программировании Apple Scalable Matrix Extension (SME2). &lt;/em&gt;&lt;a href="https://habr.com/ru/articles/1066766/" rel="noopener noreferrer nofollow"&gt;&lt;em&gt;Часть 2&lt;/em&gt;&lt;/a&gt;&lt;em&gt; обнаружила, что у лестницы обучения SME отсутствует середина: руководство на один тайл внизу, нечитаемые промышленные ядра наверху — и ничего между ними, там, где строится настоящий GEMM. Эта часть — о фреймворке, который уже занимает эту ступеньку, и о том, почему перенос на новейший матричный движок оказался упражнением «заполните пропуски».&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Оглавление-договор.&lt;/strong&gt; В этой части мы начнём с тупика, в который приводит голый цикл &lt;code&gt;FMOPA&lt;/code&gt;; затем покажем, какую часть GEMM BLIS уже построил за нас; после этого разберём пять циклов BLIS и место микроядра внутри них. Финал главы должен сделать дальнейший план конкретным: что именно нужно добавить для Apple SME, а что уже относится к готовой «мебели» фреймворка.&lt;/p&gt;&lt;p&gt;Расскажу о лучшем часе, потраченном на весь этот проект, — часе, который я провёл, &lt;em&gt;не&lt;/em&gt; написав ни строчки кода.&lt;/p&gt;&lt;p&gt;У меня работал цикл с FMOPA — четырёхстрочное ядро из части 1, накапливающее внешние произведения в ZA. Оно перемножало две матрицы. В качестве BLAS оно было при этом совершенно бесполезно: ни альфы и беты, ни возможности прибавить результат к существующей матрице C, ни обработки транспонирования, один тип данных — и производительность, падавшая с обрыва, едва матрицы вырастали из кэша L1. Всё, чего, по словам части 2, не делает учебное руководство, моё ядро тоже не делало. Я стоял ровно там, где должна быть недостающая средняя ступенька, держа в руках атом — и никакой лестницы.&lt;/p&gt;&lt;p&gt;Инстинкт в такой момент — начать строить наружу: написать цикл блокирования под кэш, затем процедуру упаковки, затем слой многопоточности, затем эпилог с альфой и бетой, затем краевые случаи, затем второй тип данных — и так несколько месяцев, в конце которых у вас будет, если вы очень хороши и очень удачливы, посредственная повторная реализация того, что уже существует. Потому что оно действительно уже существует. Середину лестницы выточили в 1990-х и оформили во фреймворк в 2010-х, и в ней есть гнездо, по форме в точности совпадающее с моим атомом.&lt;/p&gt;&lt;p&gt;Этот фреймворк — BLIS. Прежде чем хвалить его вслух, покажу форму, из которой эта похвала следует: &lt;em&gt;понимание его структуры — единственная причина, по которой остаток цикла короток&lt;/em&gt;. Стоит увидеть форму BLIS — и «перенести GEMM на SME» перестаёт быть проектом и становится анкетой для заполнения.&lt;/p&gt;&lt;h3&gt;Озарение: одно ядро, а всё остальное — мебель&lt;/h3&gt;&lt;p&gt;Вот наблюдение, на котором построен BLIS; оно принадлежит Кадзусигэ Гото и было формализовано Филдом Ван Зи и Робертом ван де Гейном из Техасского университета в Остине. Возьмите любую высокопроизводительную реализацию GEMM — для x86, для POWER, для ARM, для дюжины умерших архитектур — и прищурьтесь. Все они — &lt;em&gt;одна и та же программа&lt;/em&gt;. Все упаковывают операнды в удобные для кэша панели; все разбивают три цикла по M, N и K на блоки так, чтобы нужные данные находились в нужном уровне кэша в нужное время; все опираются в основании на маленькое, вручную настроенное ядро, умножающее узкий срез A на узкий срез B. Блокирование одинаково. Упаковка одинакова. Порядок циклов одинаков. &lt;em&gt;Единственное&lt;/em&gt;, чем великий GEMM для AVX-512 отличается от великого GEMM для NEON, — крохотное ядро в самом основании и горстка чисел, описывающих размеры кэшей. Одинаковость — это всеобщее; архитектуры — его особенные обличья; крохотное ядро в основании — единичное, в котором всё различие и умещается.&lt;/p&gt;&lt;p&gt;И BLIS делает очевидную — задним числом — вещь: записывает всю эту одинаковость &lt;em&gt;один раз&lt;/em&gt;, на переносимом C, а различия выставляет в виде небольшого набора точек подключения. Переносимая часть — которую статьи о BLIS называют «макроядром», вместе с окружающими его циклами, — огромна, тонка, и трогать её никогда не приходится. Она ведает объектным API, интерфейсами CBLAS и Fortran, транспонированием, нормализацией порядка хранения, блокированием под кэш на трёх уровнях, расписанием упаковки, многопоточностью и граничными случаями, когда размеры матрицы не кратны ничему удобному. Это тысячи строк самого выстраданного знания в вычислительной математике, и перенос на новую архитектуру переиспользует его &lt;em&gt;целиком&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Вы поставляете мебель, которая встаёт в гнёзда:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Микроядро&lt;/strong&gt;: умножить одну упакованную микропанель A на одну упакованную микропанель B, накопить результат в крохотном тайле C размером MR×NR, применить альфу и бету. Вот сюда идёт ваш цикл с FMOPA.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ядро упаковки&lt;/strong&gt; (необязательно — есть эталонное): переставить блок A или B в непрерывную, дополненную нулями раскладку, которую микроядро хочет потреблять потоком.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Таблицу чисел&lt;/strong&gt;: размеры регистрового тайла MR и NR и размеры кэш-блоков MC, KC, NC.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Это и есть весь перенос. Микроядро — несколько сотен строк, размеры блоков — пять целых чисел, а всё остальное делает BLIS. Когда я говорю, что остаток цикла — «заполнение пропусков», это те самые пропуски. Они по-прежнему интересны — матричный движок достаточно необычен, чтобы заполнить их хорошо стоило настоящего труда, о чём и рассказывают части с 4 по 7, — но объём работы ограничен так, как реализация GEMM с нуля не бывает ограничена никогда.&lt;/p&gt;&lt;h3&gt;Пять циклов, снаружи внутрь&lt;/h3&gt;&lt;p&gt;Чтобы разместить пропуски, нужна картина гнезда циклов BLIS. GEMM в BLIS — это пять вложенных циклов, обёрнутых вокруг одного микроядра, и каждый цикл существует, чтобы угодить своему уровню иерархии памяти. От внешнего к внутреннему:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Цикл 5 (NC), по N.&lt;/strong&gt; Нарезать задачу на столбцовые панели B шириной NC. Каждая панель — то, что потребит один проход через остальную машину.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Цикл 4 (KC), по K.&lt;/strong&gt; Нарезать размерность K на отрезки длиной KC. Столбцовая панель B высотой KC (размером NC×KC) теперь &lt;strong&gt;упаковывается&lt;/strong&gt; в непрерывный, размещённый в кэше буфер: этот блок будет переиспользоваться снова и снова, поэтому его стоит реорганизовать. Упакованная панель B живёт в диапазоне кэшей L3/L2.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Цикл 3 (MC), по M.&lt;/strong&gt; Нарезать A на строковые панели высотой MC. Блок A размером MC×KC &lt;strong&gt;упаковывается&lt;/strong&gt; в собственный непрерывный буфер, рассчитанный на L2/L1. Этот упакованный блок A будет многократно проходить сквозь упакованный блок B.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Цикл 2 (NR), по упакованной панели B.&lt;/strong&gt; Обходить упакованный блок B полосами шириной NR — по одной микропанели B.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Цикл 1 (MR), по упакованной панели A.&lt;/strong&gt; Обходить упакованный блок A полосами высотой MR — по одной микропанели A. Пара (MR, NR) выбирает один регистровый тайл C, и мы вызываем &lt;strong&gt;микроядро&lt;/strong&gt;: пропустить панель A размером MR×KC через панель B размером KC×NR, накопив KC внешних произведений в регистрах, а затем обновить C.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Прочтите это изнутри наружу — и получится рассказ о переиспользовании данных. Микроядро удерживает тайл C в регистрах (в нашем случае — в ZA) на протяжении всей редукции по KC, так что C записывается в память один раз, а не KC раз. Упакованный блок A подобран так, чтобы оставаться в L2 и переиспользоваться на каждой NR-полосе B. Упакованный блок B подобран так, чтобы оставаться в L3 и переиспользоваться на каждой MC-панели A. Каждый байт упаковывается потому, что его предстоит прочитать много раз; каждая граница цикла — уровень кэша. Здесь нет ничего специфичного для x86, ARM или SME. Это специфично для &lt;em&gt;устройства памяти&lt;/em&gt;, а оно у всех общее.&lt;/p&gt;&lt;p&gt;И выигрыш для наших целей: две вещи, делающие эту схему быстрой на конкретной машине, — ровно те две вещи, которые BLIS предлагает вам подключить. Регистровый тайл (MR, NR) и микроядро определяют, как вы используете вычислительный блок; кэш-блоки (MC, KC, NC) — как вы его кормите. SME меняет то, чем регистровый тайл &lt;em&gt;является&lt;/em&gt; — это массив ZA, а не набор векторных регистров, — но не меняет того, что регистровый тайл есть то, во что сводит результат самый внутренний цикл. Гнездо подходит.&lt;/p&gt;&lt;h3&gt;Почему это правильный фреймворк именно для матричного движка&lt;/h3&gt;&lt;p&gt;Есть и более глубокая причина, по которой BLIS подходит SME, помимо «это хороший фреймворк для GEMM». Центральная абстракция BLIS: микроядро накапливает обновление ранга 1 на каждом шаге по K в размещённый в регистрах тайл C. Оглянитесь на часть 1: FMOPA и &lt;em&gt;есть&lt;/em&gt; обновление ранга 1 — внешнее произведение, — накапливаемое в размещённый в регистрах тайл по имени ZA. Контракт микроядра BLIS и инструкция SME, никогда не встречавшись, описывали одну и ту же операцию.&lt;/p&gt;&lt;p&gt;На SIMD-машине микроядру BLIS приходится &lt;em&gt;имитировать&lt;/em&gt; внешнее произведение: транслировать один элемент A на весь вектор, умножать на вектор B и повторять это MR раз, синтезируя обновление ранга 1 из операций FMA ранга 0. Этот синтез — неказистое, вечно стеснённое нехваткой регистров сердце каждого SIMD-ядра GEMM. На SME синтез исчезает: оборудование выполняет обновление ранга 1 само, одной инструкцией, в регистровый файл, созданный служить тайлом C. BLIS тридцать лет притворялся, что векторные регистры — это матричный аккумулятор. SME просто делает это правдой. Тридцать лет она была правдой лишь в возможности — записанной в контракте; кремний сделал её действительной. Вставить микроядро SME в гнездо BLIS — не согласование несовместимого; это абстракция, наконец получившая оборудование, которое она всё это время описывала.&lt;/p&gt;&lt;p&gt;По той же причине таблица размеров блоков — то место, где живёт интересная &lt;em&gt;настройка&lt;/em&gt;. Поскольку ZA огромен — регистровый тайл 32×32 одинарной точности против тайлов порядка 8×8, которыми располагает ядро на NEON, — числа MC/KC/NC, приводящие его в равновесие, не похожи ни на что в стандартных конфигурациях ARM. В части 4 мы увидим, что KC стремится быть &lt;em&gt;огромным&lt;/em&gt; (2048): весь смысл гигантского аккумулятора ZA в том, что он никогда не выгружается в память, поэтому редукция по K ограничена лишь тем, сколько упакованных данных A и B удаётся удержать в кэше. Фреймворк тот же; числа, заставляющие его петь, — новые.&lt;/p&gt;&lt;h3&gt;Что BLIS даёт вам, конкретно, для переноса на Apple SME&lt;/h3&gt;&lt;p&gt;Сделаем утверждение «заполните пропуски» конкретным, потому что это сквозная нить всего дальнейшего. Вот полный список того, что работа над Apple SME добавляет в BLIS, — а всё, чего &lt;em&gt;нет&lt;/em&gt; в этом списке, BLIS уже сделал:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Субконфигурация (&lt;code&gt;applesme&lt;/code&gt;), которая регистрирует ядра и, что принципиально, &lt;strong&gt;распознаёт оборудование во время выполнения&lt;/strong&gt; — SME2 для ядер одинарной точности, дополнительный признак &lt;code&gt;FEAT_SME_F64F64&lt;/code&gt; для ядер двойной точности — и молча оставляет эталонные ядра BLIS, если нужного кремния нет. (Сага о флагах компилятора из части 1 тоже живёт здесь.)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Четыре микроядра GEMM, по одному на тип данных: &lt;code&gt;sgemm&lt;/code&gt; (часть 4), &lt;code&gt;dgemm&lt;/code&gt; (часть 5) и два комплексных ядра (часть 6).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ядро упаковки, использующее сам ZA как машину транспонирования (часть 7).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Таблица размеров блоков, в которой MR и NR &lt;em&gt;выводятся во время выполнения&lt;/em&gt; из потоковой длины вектора, так что один и тот же двоичный файл адаптируется к любому будущему SVL.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Обратите внимание, чего в списке нет. Никакой логики альфы и беты в циклах — микроядро применяет их на уровне тайла, а BLIS дирижирует. Никакой обработки транспонирования — BLIS нормализует порядок хранения до того, как ядро увидит данные. Никакой многопоточности — BLIS распределяет внешние циклы по ядрам процессора, и (оговорка об общем движке из части 1) потолок задаётся оборудованием, а не чем-либо, что пишем мы. Никакой прослойки CBLAS, никакого интерфейса Fortran, никаких дополнительных циклов подчистки краёв. Всё это — мебель, и вся она поставлена.&lt;/p&gt;&lt;p&gt;Регистрируя ядро, вы также сообщаете BLIS один бит предпочтения: хочет ли это ядро видеть матрицу C в памяти по строкам или по столбцам? Наши ядра SME вычитывают результат из ZA столбец за столбцом, поэтому объявляют предпочтение столбцового порядка, и BLIS подстраивает C под него. Один логический признак — и фреймворк корректно выбирает порядок хранения для любого вызывающего кода. Такова фактура всего переноса: небольшие, локальные декларации того, чего хочет оборудование, — и фреймворк, который уже продумал последствия.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Вывод.&lt;/strong&gt; Среднюю ступеньку лестницы SME — упаковку, блокирование под кэш, полный контракт BLAS, многопоточность, обработку краёв — не нужно изобретать: BLIS и есть эта ступенька, причём с тех времён, когда самого оборудования ещё не существовало. Его основополагающее наблюдение: каждый GEMM — одна и та же программа, за вычетом одного маленького ядра и пяти чисел размеров блоков; а контракт его микроядра (накапливать обновления ранга 1 в размещённый в регистрах тайл C) — &lt;em&gt;в точности&lt;/em&gt; то, что делает внешнее произведение SME. Перенос сводится к трём действиям: напишите ядро, заполните таблицу, объявите, чего хочет оборудование. Следующие четыре части — эти пропуски, заполненные; и именно в том, чтобы заполнить их хорошо, скрывалось всё удовольствие.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Далее: микроядро sgemm, целиком. В части 4 мы разбираем ядро одинарной точности 2VL×2VL по винтикам: как аккумулятор 32×32 отображается на четыре тайла ZA, почему цикл по K расшит по два, и загружает данные мультивекторными инструкциями SME2, как альфа и бета применяются при чтении ZA столбец за столбцом — и один флаг (&lt;/em&gt;&lt;code&gt;&lt;em&gt;beta == 0&lt;/em&gt;&lt;/code&gt;&lt;em&gt;), с которым нужно обращаться осторожно, иначе значения NaN просочатся в свежую матрицу.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;img alt="Хабр Карьера Курсы" src="https://habrastorage.org/webt/qq/ey/pn/qqeypn-py71suynxbusbakjdfjw.png"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Хабр Курсы для бэкендеров&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt; Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать! &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">nonpareil_coder</dc:creator><pubDate>Tue, 11 Aug 2026 04:36:55 +0000</pubDate><guid>https://habr.com/ru/articles/1069058/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1069058</guid><category>BLIS</category><category>GEMM</category><category>SME2</category><category>Apple Silicon</category><category>микроядро</category><category>кэш-блокинг</category><category>упаковка данных</category><category>высокопроизводительные вычисления</category><category>линейная алгебра</category><category>BLAS</category></item><item><title>Удивительный ответ 403 при доступе через некоторых провайдеров</title><link>https://habr.com/ru/articles/1069056/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1069056</link><description>&lt;noscript&gt;&lt;img src="https://rap.skcrtxr.com/pub/pix/76ddeb35-1032-490a-8a2f-4fbb3972b5d0" alt=""&gt;&lt;/noscript&gt;
    &lt;div id="mount"&gt;&lt;div id="app"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;svg height="24" width="24"&gt;Обновить&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;article&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;a href="https://habr.com/ru/users/diakin/" rel="nofollow"&gt;&lt;div&gt;&lt;img alt="" height="24" src="https://habrastorage.org/r/w48/getpro/habr/avatars/0eb/e84/f6b/0ebe84f6b2134967a05894cbcaa51a96.jpg" width="24"&gt;&lt;/div&gt;&lt;/a&gt;&lt;span&gt;&lt;a href="https://habr.com/ru/users/diakin/" rel="nofollow"&gt;diakin&lt;/a&gt;&lt;span&gt;&lt;time datetime="2026-08-11T04:27:11.000Z" title="2026-08-11, 04:27"&gt;1 час назад&lt;/time&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;svg height="24" width="24"&gt;Уровень сложности&lt;/svg&gt;&lt;/span&gt;&lt;span&gt;Простой&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;svg height="24" width="24"&gt;Время на прочтение&lt;/svg&gt;&lt;/span&gt;&lt;span&gt;1 мин&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Кейс&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Recovery Mode&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div lang="ru"&gt;&lt;div id="post-content-body"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;На днях внезапно обнаружил, что с домашнего компа мой сайт &lt;a href="https://wenda.rip" rel="noopener noreferrer nofollow"&gt;https://wenda.rip&lt;/a&gt; стал выдавать ответ 403.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/d36/aca/f4d/d36acaf4d6f5464b879c68f8a2410ade.png" width="602" height="331"&gt;&lt;/figure&gt;&lt;p&gt;Помыкавшись и не добившись результата с .htaccess, написал в поддержку &lt;a href="http://reg.ru" rel="noopener noreferrer nofollow"&gt;reg.ru&lt;/a&gt;, но там сейчас завал (на Хабре писали что у всех по какой-то причине, но я забыл). Проверил доступ на работе - все нормально. Подумал, что наверное где-то закешировалось. Почистил кэш, все равно норм.&lt;br&gt;Зашел дома с телефончика через WiFi - ответ 403. Отключил WiFi, зашел через Мегафон - страница открылась! Что за на ???&lt;br&gt;Полез проверять через сервисы, например &lt;a href="https://dostupno.net" rel="noopener noreferrer nofollow"&gt;https://dostupno.net&lt;/a&gt;&lt;/p&gt;&lt;pre&gt;&lt;code&gt;Source Response Time HTTP Code Status
mobileMoscow Megafon 1 0.85 sec 200 OK
mobileMoscow Megafon 2 0.66 sec 403 OK
mobileMoscow Megafon 3 0.85 sec 200 OK
Moscow Kornet  0.65 sec 200 OK
Moscow Link  0.64 sec 403 OK
Moscow Rostelecom 1 0.59 sec 200 OK
St. Petersburg, Point 1 0.64 sec 200 OK
St. Petersburg, Point 3 1.34 sec 200 OK
St. Petersburg, Point 4 1.31 sec 200 OK
St. Petersburg, Point 5 0.87 sec 403 OK&lt;/code&gt;&lt;div&gt;&lt;a href="https://sourcecraft.dev/" rel="nofollow"&gt;&lt;img&gt;&lt;/a&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p&gt;Ах, удивительное дело!&lt;br&gt;Причем другой сайт, на том же хостинге, например ... ну неважно.. открывается нормально.&lt;br&gt;Что бы это могло быть?&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;img alt="Хабр Карьера Курсы" src="https://habrastorage.org/webt/qq/ey/pn/qqeypn-py71suynxbusbakjdfjw.png"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Хабр Курсы для всех&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt; Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать! &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">diakin</dc:creator><pubDate>Tue, 11 Aug 2026 04:27:11 +0000</pubDate><guid>https://habr.com/ru/articles/1069056/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1069056</guid><category>403 Forbidden</category></item><item><title>Три месяца спустя: стемы, которые убивали вкладку, и синхрон, который меня чуть не доконал</title><link>https://habr.com/ru/articles/1069052/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1069052</link><description>&lt;div&gt;&lt;div&gt;&lt;svg height="24" width="24"&gt;Обновить&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;article&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;a href="https://habr.com/ru/users/MrPikasso/" rel="nofollow"&gt;&lt;div&gt;&lt;img alt="" height="24" src="https://habrastorage.org/r/w48/getpro/habr/avatars/c04/5f0/2ae/c045f02aebee453c46992912b28fcf43.jpeg" width="24"&gt;&lt;/div&gt;&lt;/a&gt;&lt;span&gt;&lt;a href="https://habr.com/ru/users/MrPikasso/" rel="nofollow"&gt;MrPikasso&lt;/a&gt;&lt;span&gt;&lt;time datetime="2026-08-11T04:08:22.000Z" title="2026-08-11, 04:08"&gt;1 час назад&lt;/time&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;svg height="24" width="24"&gt;Уровень сложности&lt;/svg&gt;&lt;/span&gt;&lt;span&gt;Простой&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;svg height="24" width="24"&gt;Время на прочтение&lt;/svg&gt;&lt;/span&gt;&lt;span&gt;8 мин&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Кейс&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div lang="ru"&gt;&lt;div id="post-content-body"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;Год назад я &lt;a href="https://habr.com/ru/articles/1047538/" rel="noopener noreferrer nofollow"&gt;рассказал, как из боли «песни разбросаны по чатам» вырос сервис для команд прославления&lt;/a&gt;: PHP на дешёвом хостинге, React, деплой по FTP руками. В конце той статьи было три обещания одним абзацем — сделаю стемы, синхронизирую сцену, перееду с shared-хостинга. Все три оказались на порядок сложнее, чем звучали.&lt;/p&gt;&lt;p&gt;Эта статья — про то, что было дальше. Честно, с провалами. Про то, где я бился неделями, где всё падало и где приходилось заходить по пять-семь раз, прежде чем получилось.&lt;/p&gt;&lt;p&gt;Сразу оговорюсь: сами нейросети для разделения на дорожки и распознавания аккордов — не мои. Я использую &lt;strong&gt;API Moises&lt;/strong&gt;. Всё остальное — доставка, движок, синхрон, продукт — моё, и об этом ниже.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/53f/61e/817/53f61e81726610e43b02dd5f0b590270.png" width="2986" height="2034"&gt;&lt;/figure&gt;&lt;h3&gt;Стемы: семь заходов, шесть провалов&lt;/h3&gt;&lt;p&gt;В первой статье это была одна строка: «сделаю через Replicate». На деле я перебрал &lt;strong&gt;семь провайдеров разделения аудио&lt;/strong&gt;, и шесть из них отвалились — каждый по-своему.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Локальный Demucs.&lt;/strong&gt; Красиво в теории, невозможно на практике: на дешёвом хостинге нет GPU и лимит 120 секунд на запрос, а Demucs на CPU думает минутами. Не вписался ни разу.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Replicate.&lt;/strong&gt; Работает, но платно за секунду GPU — и отдаёт &lt;strong&gt;только&lt;/strong&gt; дорожки. Ни аккордов, ни битов. А музыканту нужен разбор песни, а не папка с WAV.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://fal.ai" rel="noopener noreferrer nofollow"&gt;&lt;strong&gt;fal.ai&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt; Первый, кто реально доехал до прода. Те же минусы: только разделение, платно, максимум 6 дорожек. Зато именно на нём я впервые уронил весь сервер (об этом ниже).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://LALAL.AI" rel="noopener noreferrer nofollow"&gt;&lt;strong&gt;LALAL.AI&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt; Один проход — два трека. Чтобы получить 8 дорожек, надо гонять файл по кругу и платить за каждый круг. Для бесплатного продукта экономика не сходится вообще.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Свой GPU-сервис.&lt;/strong&gt; Топовое качество, десятки моделей — и отдельная инфраструктура с видеокартой, очередями и счётом за простой. Для одного разработчика — рано.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://Music.ai" rel="noopener noreferrer nofollow"&gt;&lt;strong&gt;Music.ai&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt; Вот где было по-настоящему обидно. Официальный платный API, который умеет всё сразу — и стемы, и аккорды, и секции. То, что нужно. Но задачи &lt;strong&gt;воспроизводимо&lt;/strong&gt; падали с &lt;code&gt;INTERNAL_ERROR&lt;/code&gt; через &lt;strong&gt;65–120 минут&lt;/strong&gt; ожидания. Полтора часа — ради ошибки. Поддержка молчала. И да, за эти попытки я платил своими деньгами. Ключ от него теперь закомментирован на всех серверах, и в правилах проекта отдельной строкой висит «перед деплоем проверь, что он закомментирован» — чтобы случайная конфигурация не увела трафик обратно на этот дорогой и нестабильный путь.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Победил седьмой — &lt;strong&gt;API Moises&lt;/strong&gt;. Он за 3–8 минут отдаёт сразу весь пакет: 7–8 дорожек, аккорды с таймингом, биты, темп, тональность и секции (куплет/припев/бридж).&lt;/p&gt;&lt;p&gt;Одно правило, которое я вынес кровью и записал в проект отдельным пунктом: &lt;strong&gt;одно не отменяет другого&lt;/strong&gt;. Пришли дорожки, а аккорды не распознались — показываем дорожки. Пришли аккорды, а разделение упало — показываем аккорды. Пользователь не должен видеть пустой экран из-за того, что одна операция из трёх не сложилась.&lt;/p&gt;&lt;p&gt;И маленькая победа, которая окупила всю возню: когда одну и ту же известную песню разбирает пятая команда подряд, платить за пятый разбор — глупо. Сделал дедупликацию по &lt;strong&gt;содержимому&lt;/strong&gt; файла (хеш самих байтов): один и тот же трек опознаётся, кто бы и когда его ни залил, результат копируется мгновенно, кредит не списывается.&lt;/p&gt;&lt;h3&gt;Как я уронил весь сервер шестью дорожками&lt;/h3&gt;&lt;p&gt;Первая схема доставки казалась разумной: пусть PHP сам качает дорожки из хранилища и отдаёт их браузеру. Единая точка, никаких чужих доменов.&lt;/p&gt;&lt;p&gt;Это была катастрофа.&lt;/p&gt;&lt;p&gt;PHP-воркер занят &lt;strong&gt;всё время&lt;/strong&gt;, пока играет дорожка — пять-семь минут. Шесть дорожек — шесть занятых воркеров. А пул воркеров на дешёвом хостинге — две-три штуки. Итог: &lt;code&gt;503&lt;/code&gt; &lt;strong&gt;на весь сервис&lt;/strong&gt; — чат, расписание, песни. Аудио убивало вообще всё.&lt;/p&gt;&lt;p&gt;Ту неделю я до сих пор помню. Сначала все шесть дорожек падали мгновенной ошибкой — оказалось, кэш пытался скачать 50 МБ в темп &lt;strong&gt;до&lt;/strong&gt; первого отданного байта, и nginx рвал соединение. Потом 503 на всё. Потом Chrome начал блокировать часть дорожек, потому что я создавал шесть &lt;code&gt;&amp;lt;audio&amp;gt;&lt;/code&gt; разом. Каждый вечер — новый корень.&lt;/p&gt;&lt;p&gt;Вывод, который я записал заглавными буквами: &lt;strong&gt;PHP отдаёт JSON со ссылками один раз, дальше браузер общается с хранилищем сам.&lt;/strong&gt; Ни один воркер не участвует в передаче аудио.&lt;/p&gt;&lt;p&gt;А дальше — контринтуитивная деталь, из-за которой я сделал, замерил и &lt;strong&gt;откатил&lt;/strong&gt;. Логика говорит: убери посредника, будет быстрее. Я убрал прокси — телефон стал качать напрямую из хранилища. Стало &lt;strong&gt;в разы медленнее&lt;/strong&gt;: ~98 секунд против ~10–15 через мой сервер. Оказалось, мой VPS и хранилище — в одной сети провайдера, и он работает не лишним хопом, а ускорителем. Коммит отката так и назвал: «прокси быстрее, чем напрямую».&lt;/p&gt;&lt;p&gt;И вишенка: уже потом я на проде написал в конфиге nginx один адрес литералом вместо переменной. nginx резолвит такие адреса при старте, резолв ушёл не туда — и не поднялся &lt;strong&gt;весь сайт&lt;/strong&gt;, а не «раздел со стемами». Час паники. Мораль: конфиг сервера — тоже код, и ломается так же тихо.&lt;/p&gt;&lt;h3&gt;Движок: три поколения и один упрямый iPhone&lt;/h3&gt;&lt;p&gt;Задача звучит просто: восемь дорожек, играть синхронно, с mute/solo/громкостью на каждую, с перемоткой и сдвигом тональности. В Safari на iPhone. Она оказалась самой долгой историей проекта.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;V1 — в лоб.&lt;/strong&gt; Скачал, декодировал, играю. Работает — на трёх дорожках. Дальше арифметика убивает: несжатый звук — это ~10 МБ на минуту на дорожку. Пятиминутная песня × 8 дорожек ≈ 400 МБ в памяти. iOS убивает вкладку.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;V2 — умнее.&lt;/strong&gt; Декод в фоновом потоке, звук «перемещается» (не копируется) в аудио-поток, память живёт там. 8 дорожек заиграли на iPhone. Я выдохнул. &lt;strong&gt;Зря.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Через неделю пришла та самая песня — медли на 704 секунды. Play → вкладка умирает. V2 всё ещё декодировал каждую дорожку &lt;strong&gt;целиком&lt;/strong&gt;, а на 12 минутах это снова ~2 ГБ. Я честно исключал по одному: код тот же? — да, контрольные суммы совпадают. Доставка виновата? — перенёс файлы, краш не изменился. Прод виноват? — склонировал на тест, &lt;strong&gt;тоже&lt;/strong&gt; краш. Значит — сама песня. Длина упиралась в память.&lt;/p&gt;&lt;p&gt;Прежде чем изобретать, я час просидел над минифицированным бандлом чужого зрелого плеера (6.4 МБ) — просто чтобы понять, как &lt;strong&gt;они&lt;/strong&gt; держат длинные треки. Ответ был в одной функции: плеер &lt;strong&gt;не хранит песню целиком&lt;/strong&gt;. Буфер стартует с пяти секунд, растёт по требованию, старое выселяется. В памяти — только окно вокруг того места, что играет сейчас.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;V3 — окно.&lt;/strong&gt; Я взял принцип, а реализацию сделал свою, на нативном WebCodecs: декодирую только кусок вокруг текущей позиции, старое выбрасываю. Память — ~100 МБ вместо двух гигабайт, и &lt;strong&gt;не зависит от длины песни&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;И вот тут началось самое муторное — старт. Первая версия честно качала файл целиком: играет, но стартует &lt;strong&gt;две минуты&lt;/strong&gt;. Вторая тянула только нужные кусочки по сети — старт за секунду, но звук &lt;strong&gt;рвался&lt;/strong&gt;: восемь дорожек в очереди за сетью не успевали. Вокал играет ровно, остальное захлёбывается. Победил только третий, гибридный вариант: быстрый старт по кусочкам &lt;strong&gt;плюс&lt;/strong&gt; тихая фоновая докачка всего файла в память. Как только дорожка целиком в памяти — сеть больше не нужна, играет ровно.&lt;/p&gt;&lt;p&gt;Итог на телефоне: &lt;strong&gt;12-минутный медли, 8 дорожек — играет без краша, старт ~4 секунды вместо двух минут.&lt;/strong&gt; На это ушли недели.&lt;/p&gt;&lt;p&gt;Перемотка добила отдельно: жмёшь — и дорожки гаснут одна за другой до полной тишины. Три независимых бага в одной кнопке, три вечера. А самая обидная история — &lt;strong&gt;сдвиг тональности, который тихо исчез&lt;/strong&gt;. Настоящий сдвиг высоты звука был написан только в V1. В V2 и V3 метод остался — но пустой, ничего не делал. А подпись аккордов менялась всегда (это другой модуль). Снаружи выглядело идеально: тональность на экране едет, звук — нет. И никто не замечал, потому что глазами всё работало. &lt;strong&gt;Урок дорогого стоит: когда новая реализация вытесняет старую, сверять надо не то, что методы на месте, а то, что они реально делают.&lt;/strong&gt;&lt;/p&gt;&lt;h3&gt;Почему пришлось уехать с дешёвого хостинга&lt;/h3&gt;&lt;p&gt;Дешёвый хостинг был идеален для медиатеки: пришёл короткий запрос — ушёл короткий ответ. Обе новые фичи сломали ровно эту модель, потому что обеим нужно &lt;strong&gt;держать соединение открытым&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Убийца — синхронизация Live Pro. Телефон музыканта висит на соединении с сервером до 8 секунд, ожидая, куда двинулся лидер. Команда из шести человек — шесть таких соединений по кругу. На пуле в две-три воркера этого хватает, чтобы сайт целиком отдавал &lt;code&gt;503&lt;/code&gt; — ни чат, ни расписание. Долгое соединение на shared-хостинге не «медленное», оно несовместимо по построению.&lt;/p&gt;&lt;p&gt;Так я переехал на свой VPS. Он тут же принёс собственные проблемы — хостер режет исходящую почту (пришлось слать через HTTP API), тот самый nginx-литерал, грабли деплоя. Но это проблемы, которые &lt;strong&gt;можно&lt;/strong&gt; починить, потому что сервер твой. На дешёвом хостинге стена была «нельзя», а не «сложно».&lt;/p&gt;&lt;h3&gt;Live Pro: три дня, за которые я почти всё возненавидел&lt;/h3&gt;&lt;p&gt;Вот главная битва. Лидер играет разбор песни с телефона в общий звук; у каждого музыканта свой телефон, и на нём должно быть &lt;strong&gt;то же самое в то же время&lt;/strong&gt; — тот же аккорд, та же доля, та же секция.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/07f/d7b/9ef/07fd7b9ef766727dc5d7834258ab62f0.png" width="2672" height="1674"&gt;&lt;/figure&gt;&lt;p&gt;Первое, что я понял, — и это сэкономило мне недели: &lt;strong&gt;синхронно играть звук у всех в наушниках через веб нереально.&lt;/strong&gt; Bluetooth добавляет 100–400 мс плавающей задержки ниже уровня кода, кварц в телефонах дрейфует, железо не калибруется — а музыканты слышат рассинхрон уже на 20–30 мс. Поэтому звук — из одной точки (телефон лидера в микшер), а синхронизирую я &lt;strong&gt;картинку&lt;/strong&gt;: аккорд, долю, секцию, положение в песне.&lt;/p&gt;&lt;p&gt;Дальше — три дня охоты, двенадцать багов, и почти каждый со своим ложным объяснением. Расскажу те, где было по-настоящему больно.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Часы, которые врали на 25 секунд.&lt;/strong&gt; Телефоны не знают точного времени относительно сервера — у одного из тестовых iPhone расхождение было &lt;strong&gt;−25 секунд&lt;/strong&gt;. Пришлось мерить это расхождение отдельно, как маленький NTP.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;«Клиент разъезжается» — а виноват был сервер.&lt;/strong&gt; Стартуем вместе, через минуту фолловер откатывается назад, разрыв растёт: 21 секунда, 50 секунд. Я неделю искал баг у клиента. Оказалось — &lt;strong&gt;защита на сервере&lt;/strong&gt;: он не принимал «момент» старше 60 секунд и тихо переписывал его на «сейчас», ломая мою пару чисел. Симптом кричал «клиент», виноват был сервер.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Я чинил не тот звук.&lt;/strong&gt; Пользователь пишет: «аккорды спешат на полторы-две секунды». Я меряю экраны — совпадают до 25 мс. Меряю ещё раз — совпадают. Разгадка пришла с вопросом «а куда выведен звук?»: оба телефона играли &lt;strong&gt;в свои динамики&lt;/strong&gt;, и человек стоял у того, чей звук отставал by design. Формально всё работало как задумано — а пользователю было плохо. С тех пор у фолловера звук принудительно на паузе.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;LTE травит часы.&lt;/strong&gt; На видео с двух телефонов было видно: к концу песни один убежал на 4 секунды. Телеметрия показала, что расхождение часов прыгало +0.8 → +3.7 секунды. На LTE отправка встаёт в очередь на секунды, все замеры приходят кривыми — и я их безоговорочно применял. Пришлось добавить фильтр: замер, пришедший по плохой сети, &lt;strong&gt;выбрасываем целиком&lt;/strong&gt; и держим старый — устаревший в сотни раз точнее отравленного.&lt;/p&gt;&lt;p&gt;Итог, которым горжусь: экраны лидера и музыкантов совпадают в пределах &lt;strong&gt;±15 мс&lt;/strong&gt; — заметно меньше, чем разброс между живыми людьми, играющими вместе.&lt;/p&gt;&lt;figure&gt;&lt;img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/4db/920/14d/4db92014dc5aa69e6440da2bded5460d.png" width="2676" height="1672"&gt;&lt;/figure&gt;&lt;p&gt;Но главный вывод не про числа. Половину этих багов я сначала объяснил &lt;strong&gt;неправильно&lt;/strong&gt; — и каждое неправильное объяснение стоило бы дня работы не туда. Runaway списал на один параметр — оказалось, другое. «Спешат аккорды» списал на данные — замер показал, что данные ровные, а слушали старую версию. Поэтому я перестал верить ушам и глазам на репетиции и построил себе приборы: стенд, который прогоняет весь алгоритм без телефонов; тесты против живого сервера; телеметрию, которая пишет, какая версия кода реально исполняется. Скучно было писать — окупилось на второй же жалобе.&lt;/p&gt;&lt;h3&gt;Отдельная боль: тесты, которые врали, и код, который возвращался&lt;/h3&gt;&lt;p&gt;Четыре раза подряд я деплоил фикс, просил проверить — и получал «не работает». Каждый раз это было правдой ровно наполовину: &lt;strong&gt;открытая вкладка на сцене не подхватывает деплой.&lt;/strong&gt; Музыкант не перезагружает страницу, браузер исполняет старый код сколько угодно долго, а я делаю ложные выводы и «чиню» уже починенное. Апофеоз — когда арифметика симптома идеально совпала со старым багом, а телеметрия потом показала: лидер просто крутил сборку без фикса. Пришлось научить вкладку саму замечать, что вышло обновление, и сверять версию перед каждым тестом синхрона.&lt;/p&gt;&lt;p&gt;И совсем показательная история — &lt;strong&gt;аккорды, которые «улетают».&lt;/strong&gt; Песни хранятся как две строки: аккорды над словами, выровненные пробелами. При смене тональности аккорд меняет длину (&lt;code&gt;C&lt;/code&gt; → &lt;code&gt;A#&lt;/code&gt;), и если сохранять число пробелов, а не позицию, — каждый следующий аккорд уезжает вправо, и вся строка расползается. Я это починил. А потом оно &lt;strong&gt;вернулось&lt;/strong&gt; — рефакторинг тихо вернул старую логику, потому что фикс &lt;strong&gt;нечем было сторожить&lt;/strong&gt;. Полетели те же жалобы от всех команд разом: «опять слетело», «все устали». Чинил второй раз — уже с тестом, который падает, если кто-нибудь снова так сделает. &lt;strong&gt;Фикс без теста — это временный фикс.&lt;/strong&gt; Разница между «починил» и «починил, чтобы осталось» — ровно один тест.&lt;/p&gt;&lt;p&gt;(Кстати, метроном на длинной песне тоже норовит уплыть — если гнать его по обычному таймеру. Спасает только привязка к реальному времени звука и постоянная сверка с ним; но это уже детали, разверну в комментариях, если интересно.)&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/article&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;img alt="Хабр Карьера Курсы" src="https://habrastorage.org/webt/qq/ey/pn/qqeypn-py71suynxbusbakjdfjw.png"&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Хабр Курсы для бэкендеров&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt; Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать! &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">MrPikasso</dc:creator><pubDate>Tue, 11 Aug 2026 04:08:22 +0000</pubDate><guid>https://habr.com/ru/articles/1069052/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1069052</guid><category>стемы</category><category>Приложение для музыкантов</category></item></channel></rss>