<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru"><generator uri="https://jekyllrb.com/" version="3.9.5">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" hreflang="ru" /><updated>2026-05-07T22:17:43+00:00</updated><id>/feed.xml</id><title type="html">ov7a</title><entry><title type="html">Northguard</title><link href="/2026/05/07/northguard.html" rel="alternate" type="text/html" title="Northguard" /><published>2026-05-07T00:00:00+00:00</published><updated>2026-05-07T00:00:00+00:00</updated><id>/2026/05/07/northguard</id><content type="html" xml:base="/2026/05/07/northguard.html">&lt;p&gt;Как-то совсем мимо меня прошло, что LinkedIn вырос из им же созданной Kafka и сделал новый брокер сообщений/логов — &lt;a href=&quot;https://www.linkedin.com/blog/engineering/infrastructure/introducing-northguard-and-xinfra&quot;&gt;Northguard&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Причина довольно прозаична: контроллер хранил довольно большое состояние централизованно на 1 узле и это в масштабах LinkedIn стало бутылочным горлышком. И это с учетом того, что от Zookeeper отказались &lt;a href=&quot;https://cwiki.apache.org/confluence/display/KAFKA/KIP-500%3A+Replace+ZooKeeper+with+a+Self-Managed+Metadata+Quorum&quot;&gt;еще в 2021&lt;/a&gt;. А еще были проблемы с балансировкой и обслуживанием тьмы кластеров. Продумали и миграцию, за это отвечает Xinfra — по сути, адаптер, поддерживающий оба брокера.&lt;/p&gt;</content><author><name></name></author><category term="mini_post" /><category term="kafka" /><summary type="html">Как-то совсем мимо меня прошло, что LinkedIn вырос из им же созданной Kafka и сделал новый брокер сообщений/логов — Northguard.</summary></entry><entry><title type="html">ИИ — это не “просто другой уровень абстракции”</title><link href="/2026/05/05/ai-is-not-an-abstraction-layer.html" rel="alternate" type="text/html" title="ИИ — это не “просто другой уровень абстракции”" /><published>2026-05-05T00:00:00+00:00</published><updated>2026-05-05T00:00:00+00:00</updated><id>/2026/05/05/ai-is-not-an-abstraction-layer</id><content type="html" xml:base="/2026/05/05/ai-is-not-an-abstraction-layer.html">&lt;p&gt;Один из популярных аргументов вайбкодеров заключается в том, что с ИИ мы просто переходим на более высокий &lt;a href=&quot;https://en.wikipedia.org/wiki/Abstraction_layer&quot;&gt;уровень абстракции&lt;/a&gt;: сначала был машинный код, потом появились языки низкого уровня, затем высокого, фреймворки и т.п. И, мол, вы же не читаете вывод компилятора в машинных кодах? Тогда и код, выплюнутый нейронкой, читать не надо. Если что — с ее же помощью потом и исправите.&lt;/p&gt;
&lt;p&gt;Однако с этим аргументом есть несколько серьезных проблем.&lt;/p&gt;
&lt;p&gt;Первая — запись намерения. Для совместной работы над программным продуктом используют текущий уровень абстракции — если, например, это код на питоне, то у вас в репозитории, пул-реквестах и т.п. фигурирует конкретный код на питоне, а не какой-то его продукт, например, байт-код. Если вы используете фреймворк, то артефактом у вас будут вызовы каких-то конкретных функций/шаблонов/API этого фреймворка, а не скрытый за ними код. Через LLM вы обычно получаете код, т.е. артефакт принадлежит более низкому уровню абстракции. У вас в репозитории не хранятся промпты, которыми был код сгенерирован. Если не записано намерение, то совместная работа опускается минимум на один уровень абстракции ниже, а собственно намерение придется выковыривать из него. И вся сложность решения остается как есть, без инкапсуляции.&lt;/p&gt;
&lt;p&gt;Вторая — воспроизводимость. Компилятор преобразует один и тот же вход в один и тот же выход. Обращение к фреймворку приведет к одному и тому же участку кода. Если, например, у вас написано &lt;code&gt;json.dumps(obj)&lt;/code&gt;, то это будет везде работать одинаково (если не быть ультрадушнилой). Нейронка же вам будет выдавать на один промпт разный результат каждый раз. Поэтому их и хранить бесполезно (так-то нейронки могут легко и всякие верхнеуровневые инструкции игнорировать). Без воспроизводимости придется либо переделывать одну и ту же работу по проверке качества и/или играть в рулетку при каждом изменении. А каждый проект с такой “абстракцией” становится “снежинкой”.&lt;/p&gt;
&lt;p&gt;Третья — ответственность. У компилятора/языка/фреймворка есть разработчики, документация, какое-никакое сообщество и т.п. Если в них обнаружится какая-то проблема, то, скорее всего, она будет не только у вас, и у разработчиков будет мотивация это исправить. Еще у популярных инструментов есть какая-никакая репутация, и шансы, что они будут творить какую-то дичь, не очень высоки. У LLM ноль агентности с точки зрения ответственности, и в итоге артефакт с более низкого уровня абстракции становится вашей проблемой. А адекватному бизнесу нужна как раз &lt;a href=&quot;/2026/02/26/ai-results-are-boring.html&quot;&gt;предсказуемость&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Все в совокупности еще и подрывает доверие: качество — случайное (а бенчмарки еще и &lt;a href=&quot;/2026/04/21/ai-benchmarks-cheating.html&quot;&gt;врут&lt;/a&gt;), инкапсуляции нет и не предвидится, переиспользование — сомнительное.&lt;/p&gt;
&lt;p&gt;Более уместно говорить о том, что использование нейронок — это передача работы в аутсорс (хотя это тоже некорректно). Задайтесь вопросом — если бы аутсорс/фриланс был бы универсальным решением (даже если он супербыстрый и дешевый), то почему в последние года был бум продуктивизаций компаний, когда у кучи совсем неайтишных компаний, даже годами делегировавших все на аутсорс, стали появляться свои отделы разработки?&lt;/p&gt;
&lt;p&gt;P.S. Кстати очень забавно читать некоторые новости про ИИ/LLM, заменяя все это на “аутсорс”:)&lt;/p&gt;</content><author><name></name></author><category term="mini_post" /><category term="ai" /><category term="мысли" /><summary type="html">Один из популярных аргументов вайбкодеров заключается в том, что с ИИ мы просто переходим на более высокий уровень абстракции: сначала был машинный код, потом появились языки низкого уровня, затем высокого, фреймворки и т.п. И, мол, вы же не читаете вывод компилятора в машинных кодах? Тогда и код, выплюнутый нейронкой, читать не надо. Если что — с ее же помощью потом и исправите.</summary></entry><entry><title type="html">Выбор лицензии</title><link href="/2026/04/30/license.html" rel="alternate" type="text/html" title="Выбор лицензии" /><published>2026-04-30T00:00:00+00:00</published><updated>2026-04-30T00:00:00+00:00</updated><id>/2026/04/30/license</id><content type="html" xml:base="/2026/04/30/license.html">&lt;p&gt;&lt;a href=&quot;https://choosealicense.com/&quot;&gt;Сабж&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Для “продвинутых пользователей” — в форме &lt;a href=&quot;https://choosealicense.com/appendix/&quot;&gt;душной таблицы&lt;/a&gt;. Но даже она &lt;a href=&quot;https://choosealicense.com/about/&quot;&gt;неполная&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Хотел найти какой-то хороший разбор с подробными описаниями опенсорсных лицензий на софт, и это лучшее, что удалось найти. В юридических нюансах всего этого сам черт ногу сломит… При этом проекты &lt;a href=&quot;https://opensource.org/blog/state-of-the-source-at-ato-2025-licensing-201?utm_source=chatgpt.com&quot;&gt;продолжают изобретать новые&lt;/a&gt; :/&lt;/p&gt;</content><author><name></name></author><category term="mini_post" /><category term="legal" /><summary type="html">Сабж.</summary></entry><entry><title type="html">50 оттенков преждевременной оптимизации</title><link href="/2026/04/28/premature-optimization.html" rel="alternate" type="text/html" title="50 оттенков преждевременной оптимизации" /><published>2026-04-28T00:00:00+00:00</published><updated>2026-04-28T00:00:00+00:00</updated><id>/2026/04/28/premature-optimization</id><content type="html" xml:base="/2026/04/28/premature-optimization.html">&lt;p&gt;Обычно под преждевременной оптимизацией имеют в виду переоптимизации в коде, который находится не на критическом пути, или &lt;a href=&quot;https://github.com/MarioSieg/Bit-Twiddling-Hacks-Collection/blob/master/bithax.h&quot;&gt;микрооптимизации&lt;/a&gt; типа &lt;code&gt;x = (x * 0xCCCCCCCD) &amp;gt;&amp;gt; 35&lt;/code&gt;, которые &lt;a href=&quot;/2026/04/07/compiler-optimizations.html&quot;&gt;обычно вредны&lt;/a&gt;. И что, разумеется, нужно ориентироваться на бенчмарки.&lt;/p&gt;
&lt;p&gt;Недавно я столкнулся с недопониманием от коллеги. Я указал на область в коде, где у нас был регресс несколько релизов подряд, и высказал гипотезу, что там проблемы с полнотой и качеством модели. Код там достаточно запутанный — не удивительно, что если в одном месте починить, то в другом может внезапно поломаться. При этом оригинальная задача, на мой взгляд, вполне может быть выражена чистой функцией, пусть и с очень большим количеством входов. Однако, по уверению коллеги, это непозволительная роскошь: код должен работать быстро, поэтому он так и выглядит.&lt;/p&gt;
&lt;p&gt;Я считаю, что это еще одна вариация преждевременной оптимизации. В идеале надо сначала получить работающее решение (модель), а уже потом заботиться о скорости, когда есть тесты и плюс-минус полная модель. Да, это может быть дорого, но не дороже времени, потраченного на ловлю багов.&lt;/p&gt;
&lt;p&gt;В целом, “наоптимизироваться” можно на уровне операции, структур данных (когда людям жалко лишнее поле добавить, например), алгоритма, модели. Еще можно добавить &lt;a href=&quot;/2023/04/18/microservices-vs-modules.html&quot;&gt;архитектуру&lt;/a&gt;. И конечно, не стоит забывать про самую лучшую оптимизацию, на уровне задачи — тут большой простор от “мы это делать не будем” до “мы строим космический корабль, чтобы полтора землекопа в носу поковырялись продуктивнее”:)&lt;/p&gt;</content><author><name></name></author><category term="mini_post" /><category term="bestpractices" /><category term="benchmark" /><category term="мысли" /><summary type="html">Обычно под преждевременной оптимизацией имеют в виду переоптимизации в коде, который находится не на критическом пути, или микрооптимизации типа x = (x * 0xCCCCCCCD) &amp;gt;&amp;gt; 35, которые обычно вредны. И что, разумеется, нужно ориентироваться на бенчмарки.</summary></entry><entry><title type="html">Экологические карты</title><link href="/2026/04/23/eco-maps.html" rel="alternate" type="text/html" title="Экологические карты" /><published>2026-04-23T00:00:00+00:00</published><updated>2026-04-23T00:00:00+00:00</updated><id>/2026/04/23/eco-maps</id><content type="html" xml:base="/2026/04/23/eco-maps.html">&lt;p&gt;Чистота воздуха: &lt;a href=&quot;https://waqi.info&quot;&gt;WAQI&lt;/a&gt; и &lt;a href=&quot;https://www.iqair.com/air-quality-map&quot;&gt;IQAir&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Качество воды: &lt;a href=&quot;https://www.geoaquawatch.org/global-water-quality-maps/&quot;&gt;GeoAquaWatch&lt;/a&gt; и &lt;a href=&quot;https://riskfilter.org/water/explore/map&quot;&gt;WWF&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://reportpollution.org/&quot;&gt;Карта загрязнений&lt;/a&gt; (явно неполная).&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://app.electricitymaps.com/map/12mo/monthly&quot;&gt;Источники электричества&lt;/a&gt; (еще там указан карбоновый след).&lt;/p&gt;
&lt;p&gt;Уровень &lt;a href=&quot;https://noise-planet.org/map_noisecapture/index.html&quot;&gt;шума&lt;/a&gt; и конкретно &lt;a href=&quot;https://noise-map.com/&quot;&gt;шум от аэропортов&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://terrascope.rustadel.fr/map&quot;&gt;Ветер, температура, давление&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Когда искал, находил еще сервисы с локальными или устаревшими данными — не включил их сюда. Но как будто живем в бигдате и цифровом гулаге, а качественных данных очень мало :( Заметно еще, например на картах с качеством воздуха, что есть несколько провайдеров, которые не делятся данными друг с другом, да и покрытие датчиками очень разреженное.&lt;/p&gt;</content><author><name></name></author><category term="mini_post" /><category term="geo" /><summary type="html">Чистота воздуха: WAQI и IQAir.</summary></entry><entry><title type="html">Бенчмарки ИИ не стоят доверия</title><link href="/2026/04/21/ai-benchmarks-cheating.html" rel="alternate" type="text/html" title="Бенчмарки ИИ не стоят доверия" /><published>2026-04-21T00:00:00+00:00</published><updated>2026-04-21T00:00:00+00:00</updated><id>/2026/04/21/ai-benchmarks-cheating</id><content type="html" xml:base="/2026/04/21/ai-benchmarks-cheating.html">&lt;p&gt;Внезапно™, бенчмарки по качеству нейронок типа SWEBench — &lt;a href=&quot;https://rdi.berkeley.edu/blog/trustworthy-benchmarks-cont/&quot;&gt;полная фигня&lt;/a&gt; с точки зрения защиты от читерства: никакой изоляции задания и решения, не надо даже ничего хакать: можно посмотреть решение в &lt;code&gt;git log&lt;/code&gt;, манки-патчнуть pytest, чтобы все тесты прошли, или просто… открыть браузер и скачать ответы. И это вдобавок к тому, что и к качеству тестов &lt;a href=&quot;/2025/02/27/swe-bench.html&quot;&gt;есть вопросы&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Можно аргументировать, что “ну, честные агенты так не сделают” ­— во-первых, уже сделали (в статье есть примеры), во-вторых, &lt;a href=&quot;/2020/05/18/agi-security.html&quot;&gt;должны сделать&lt;/a&gt; — потому что у агента такая система ценностей, в-третьих — вертели они эти ограничения, &lt;a href=&quot;https://xcancel.com/wunderwuzzi23/status/2041847045204726002&quot;&gt;даже&lt;/a&gt; если это базовое системное ограничение.&lt;/p&gt;
&lt;p&gt;В преподские времена проверял лабы по алгоритмам с помощью &lt;a href=&quot;https://ejudge.ru/wiki/index.php/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_ejudge&quot;&gt;Ejudge&lt;/a&gt;. Он был дырявый насквозь, но там хотя бы надо было ИБ-дырки искать (ладно, ответы тоже были, но от тупого копирования была базовая проверка на списывание).&lt;/p&gt;
&lt;p&gt;И даже если тесты пройдены честно, это можно сделать очень по-разному. Но код потом как-то надо будет поддерживать и развивать во времени. С этим у сгенерированного нейронками кода пока &lt;a href=&quot;https://arxiv.org/abs/2603.24755&quot;&gt;все плохо&lt;/a&gt;.&lt;/p&gt;</content><author><name></name></author><category term="mini_post" /><category term="ai" /><category term="benchmark" /><category term="иб" /><category term="утюг" /><summary type="html">Внезапно™, бенчмарки по качеству нейронок типа SWEBench — полная фигня с точки зрения защиты от читерства: никакой изоляции задания и решения, не надо даже ничего хакать: можно посмотреть решение в git log, манки-патчнуть pytest, чтобы все тесты прошли, или просто… открыть браузер и скачать ответы. И это вдобавок к тому, что и к качеству тестов есть вопросы.</summary></entry><entry><title type="html">Нормальные формы в БД</title><link href="/2026/04/16/db-normal-froms.html" rel="alternate" type="text/html" title="Нормальные формы в БД" /><published>2026-04-16T00:00:00+00:00</published><updated>2026-04-16T00:00:00+00:00</updated><id>/2026/04/16/db-normal-froms</id><content type="html" xml:base="/2026/04/16/db-normal-froms.html">&lt;p&gt;В одном (нерабочем) чате мимолетно промелькнуло упоминание &lt;a href=&quot;https://ru.wikipedia.org/wiki/%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0&quot;&gt;нормальных форм БД&lt;/a&gt;. Я понял, что уже забыл вообще все, что связано с ними. Почитал определения — ничего не понял с первого раза. Посмотрел примеры — “а, ну да”. Но воспроизвести все 8 нормальных форм наизусть я даже после освежения их в памяти не смогу.&lt;/p&gt;
&lt;p&gt;Как будто большую часть требований легко покрыть просто логичной группировкой (которая выводится из SRE и DRY): очевидно же, что хранить скидку на товар и телефон магазина в одной таблице — это дичь. Я не помню, чтобы в рабочем процессе хоть кто-то ссылался на нормальные формы и что это когда-то имело значение. Но допускаю, что не очень опытным разрабам эти моменты могут быть непонятны, так что, хоть и ежедневная ценность теории сомнительная, надо “набить руку” и все-таки эти формы изучить и понять.&lt;/p&gt;
&lt;p&gt;При всем этом я видел, как в проде не выполнялась даже 1НФ, причем это решение выглядело плюс-минус адекватным. И это даже если исключить денормализацию ради поиска.&lt;/p&gt;</content><author><name></name></author><category term="mini_post" /><category term="бд" /><category term="мысли" /><summary type="html">В одном (нерабочем) чате мимолетно промелькнуло упоминание нормальных форм БД. Я понял, что уже забыл вообще все, что связано с ними. Почитал определения — ничего не понял с первого раза. Посмотрел примеры — “а, ну да”. Но воспроизвести все 8 нормальных форм наизусть я даже после освежения их в памяти не смогу.</summary></entry><entry><title type="html">Спроектируй видеокарту с нуля</title><link href="/2026/04/14/build-a-gpu.html" rel="alternate" type="text/html" title="Спроектируй видеокарту с нуля" /><published>2026-04-14T00:00:00+00:00</published><updated>2026-04-14T00:00:00+00:00</updated><id>/2026/04/14/build-a-gpu</id><content type="html" xml:base="/2026/04/14/build-a-gpu.html">&lt;p&gt;Хорошая &lt;a href=&quot;https://jaso1024.com/mvidia/&quot;&gt;игруля&lt;/a&gt; про схемотехнику. Похожая игра про постройку процессора &lt;a href=&quot;/2022/01/25/nand-game.html&quot;&gt;была&lt;/a&gt;, и некоторые уровни похожи, но тут, как будто, рассмотрено больше нюансов и погружение поглубже.&lt;/p&gt;</content><author><name></name></author><category term="mini_post" /><category term="fun" /><category term="hardware" /><category term="tutorial" /><summary type="html">Хорошая игруля про схемотехнику. Похожая игра про постройку процессора была, и некоторые уровни похожи, но тут, как будто, рассмотрено больше нюансов и погружение поглубже.</summary></entry><entry><title type="html">Песочницы OAuth</title><link href="/2026/04/09/oauth-playground.html" rel="alternate" type="text/html" title="Песочницы OAuth" /><published>2026-04-09T00:00:00+00:00</published><updated>2026-04-09T00:00:00+00:00</updated><id>/2026/04/09/oauth-playground</id><content type="html" xml:base="/2026/04/09/oauth-playground.html">&lt;p&gt;Очень простенькая &lt;a href=&quot;https://www.oauth.com/playground/&quot;&gt;песочница OAuth&lt;/a&gt;, где можно прокликать сценарии OAuth и в общих чертах понять их логику и какие данные в каком формате передаются между участниками.&lt;/p&gt;
&lt;p&gt;И еще &lt;a href=&quot;https://oauth.tools&quot;&gt;одна&lt;/a&gt;, где интерфейс немного перегружен, но чуть больше степеней свободы.&lt;/p&gt;</content><author><name></name></author><category term="mini_post" /><category term="web" /><category term="иб" /><category term="tutorial" /><summary type="html">Очень простенькая песочница OAuth, где можно прокликать сценарии OAuth и в общих чертах понять их логику и какие данные в каком формате передаются между участниками.</summary></entry><entry><title type="html">База про оптимизации компилятора</title><link href="/2026/04/07/compiler-optimizations.html" rel="alternate" type="text/html" title="База про оптимизации компилятора" /><published>2026-04-07T00:00:00+00:00</published><updated>2026-04-07T00:00:00+00:00</updated><id>/2026/04/07/compiler-optimizations</id><content type="html" xml:base="/2026/04/07/compiler-optimizations.html">&lt;p&gt;Отличная &lt;a href=&quot;https://xania.org/AoCO2025-archive&quot;&gt;серия коротких постов&lt;/a&gt; про базовые оптимизации компилятора от создателя &lt;a href=&quot;https://godbolt.org/&quot;&gt;Godbolt&lt;/a&gt; (он же Compiler Explorer). Рассмотрены арифметические операции, циклы, ABI, инлайнинг, рекурсия и векторизация.&lt;/p&gt;
&lt;p&gt;Мораль достаточно простая: не надо делать работу компилятора и мешать ему, но важно явно обозначать свои намерения. Например, если у вас логически положительное число, то и хранить его надо в беззнаковом типе — оптимизации будут лучше. При этом компилятор не всесилен, и узкие места надо проверять и измерять.&lt;/p&gt;
&lt;p&gt;P.S. Навигация между постами странная, я сам не с первого раза нашел. Вот &lt;a href=&quot;https://xania.org/202512/01-xor-eax-eax&quot;&gt;первый пост&lt;/a&gt;, для перехода ищите ссылку в курсиве после основного текста, но до сносок — моя баннерная слепота эту секцию заблокировала.&lt;/p&gt;</content><author><name></name></author><category term="mini_post" /><category term="compiler" /><category term="c" /><category term="tutorial" /><summary type="html">Отличная серия коротких постов про базовые оптимизации компилятора от создателя Godbolt (он же Compiler Explorer). Рассмотрены арифметические операции, циклы, ABI, инлайнинг, рекурсия и векторизация.</summary></entry></feed>