<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ai on Mikhail Shogin</title><link>https://mshogin.com/tags/ai/</link><description>Recent content in Ai on Mikhail Shogin</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>Mikhail Shogin</copyright><lastBuildDate>Wed, 29 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://mshogin.com/tags/ai/index.xml" rel="self" type="application/rss+xml"/><item><title>Спека как живой контракт: SPDD, archlint и двусторонний sync</title><link>https://mshogin.com/notes/spdd-and-archlint-living-spec/</link><pubDate>Wed, 29 Apr 2026 00:00:00 +0000</pubDate><guid>https://mshogin.com/notes/spdd-and-archlint-living-spec/</guid><description>&lt;h2 id="симптом"&gt;Симптом
&lt;/h2&gt;&lt;p&gt;LLM в кодовой базе ускоряет одного разработчика. Команда от этого не ускоряется — наоборот, на ревью обрушивается поток сгенерированного кода, который никто не успевает понять. Спека, написанная на старте задачи, через неделю уже не описывает то, что в master. Кто-то правит код, кто-то правит .md, через месяц расхождение замолчано.&lt;/p&gt;
&lt;p&gt;Это не про дисциплину команды. Это про архитектуру процесса, в которой &amp;ldquo;спека&amp;rdquo; и &amp;ldquo;код&amp;rdquo; не имеют формальной связи.&lt;/p&gt;
&lt;h2 id="диагноз-от-thoughtworks"&gt;Диагноз от Thoughtworks
&lt;/h2&gt;&lt;p&gt;28 апреля 2026 на сайте Мартина Фаулера вышла статья &lt;a class="link" href="https://martinfowler.com/articles/structured-prompt-driven/" target="_blank" rel="noopener"
&gt;Structured Prompt-Driven Development&lt;/a&gt; от Wei Zhang и Jessie Xia. Они формулируют проблему точнее, чем я: &amp;ldquo;Local speed improves. But that doesn&amp;rsquo;t automatically translate into system-level throughput.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Их предложение в трёх пунктах:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Промпт — это first-class артефакт.&lt;/strong&gt; Версионируется, ревьюется, переиспользуется как код. Не реплика в чате.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;REASONS Canvas&lt;/strong&gt; — 7-частная структура промпта: Requirements, Entities, Approach, Structure, Operations, Norms, Safeguards. Первые четыре — абстракция, пятый — исполнение, последние два — governance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Замкнутая петля между промптом и кодом&lt;/strong&gt; с правилом, что обновлять первым:
&lt;ul&gt;
&lt;li&gt;изменение поведения -&amp;gt; сначала промпт, потом код&lt;/li&gt;
&lt;li&gt;рефакторинг -&amp;gt; сначала код, потом sync обратно в промпт&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Третий пункт — главное. Он превращает вечный спор &amp;ldquo;что source of truth&amp;rdquo; в процедуру.&lt;/p&gt;
&lt;h2 id="где-это-совпало-с-моей-практикой"&gt;Где это совпало с моей практикой
&lt;/h2&gt;&lt;p&gt;У меня уже был свой spec-driven workflow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/my/archlint/templates/specifications/spec-template.md&lt;/code&gt; — шаблон спеки с разделами Architecture, Requirements, Acceptance Criteria, Implementation Steps. Размерные градации XS/S/M/L/XL.&lt;/li&gt;
&lt;li&gt;Правило в &lt;code&gt;~/.claude/rules/spec-workflow.md&lt;/code&gt;: &amp;ldquo;задача &amp;gt;30 минут или &amp;gt;3 шагов — обязательно спека до старта&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Команда &lt;code&gt;/ms-add-spec&lt;/code&gt; в Claude Code, которая генерирует спеку под задачу.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;archlint&lt;/code&gt; — статический анализатор, который валидирует архитектурные правила (200+) на графе из AST.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;REASONS Canvas почти один в один ложится на мой шаблон:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;REASONS&lt;/th&gt;
&lt;th&gt;Мой шаблон&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;R Requirements&lt;/td&gt;
&lt;td&gt;## Requirements (FR1, FR2, &amp;hellip;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E Entities&lt;/td&gt;
&lt;td&gt;## Architecture / Data Model (UML Class)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A Approach&lt;/td&gt;
&lt;td&gt;## Overview / Solution Summary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S Structure&lt;/td&gt;
&lt;td&gt;## Architecture / Component Overview (C4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;O Operations&lt;/td&gt;
&lt;td&gt;## Implementation Steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;N Norms&lt;/td&gt;
&lt;td&gt;(не было отдельного раздела)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S Safeguards&lt;/td&gt;
&lt;td&gt;(не было отдельного раздела)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Совпадение на 70-80%. Архитектурный governance у меня вообще сильнее — &lt;code&gt;archlint&lt;/code&gt; проверяет автоматически то, что в SPDD держится на ревьюере-человеке.&lt;/p&gt;
&lt;h2 id="где-spdd-добавил-то-чего-не-было"&gt;Где SPDD добавил то, чего не было
&lt;/h2&gt;&lt;p&gt;Два пункта, которые у меня отсутствовали или были сформулированы неверно.&lt;/p&gt;
&lt;h3 id="1-спека-неизменна-в-процессе"&gt;1. Спека &amp;ldquo;неизменна в процессе&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;В моём &lt;code&gt;spec-workflow.md&lt;/code&gt; буквально стояла формулировка:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Спека = ЧТО делать (неизменна в процессе)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Это противоположно идее живого артефакта. Спека написана, согласована, перенесена в &lt;code&gt;inprogress/&lt;/code&gt; — и потом никем не трогается, пока задача не закроется. На практике это значит, что любая правка реализации, отличающаяся от плана, проваливается между спекой и кодом.&lt;/p&gt;
&lt;h3 id="2-norms-и-safeguards-неявные"&gt;2. Norms и Safeguards неявные
&lt;/h3&gt;&lt;p&gt;Стандарты команды (как именно мы оборачиваем ошибки, какой logger, какие naming-конвенции) у меня живут в куче .md файлов: &lt;code&gt;~/.claude/rules/architecture.md&lt;/code&gt;, проектные CLAUDE.md, в чате. На уровне отдельной спеки их явно никто не выносит. Авторы SPDD выделяют:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Norms&lt;/strong&gt; — стандарты как принято писать. Часть автоматизирована (golangci-lint, archlint), часть нет.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Safeguards&lt;/strong&gt; — неприкосновенные инварианты. Нарушение — стоп, не warning. Обратная совместимость, perf budgets, security boundaries.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Когда они в одной странице со спекой, тихий рефактор поперёк стандарта становится заметным на ревью.&lt;/p&gt;
&lt;h2 id="что-я-в-итоге-сделал"&gt;Что я в итоге сделал
&lt;/h2&gt;&lt;p&gt;Два патча, оба сегодня.&lt;/p&gt;
&lt;h3 id="патч-1-clauderulesspec-workflowmd"&gt;Патч 1: &lt;code&gt;~/.claude/rules/spec-workflow.md&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;Удалил &amp;ldquo;Спека неизменна&amp;rdquo;. Заменил на &amp;ldquo;Спека — живой контракт, синхронизирован с кодом всегда&amp;rdquo;. Добавил раздел &amp;ldquo;Двусторонняя синхронизация&amp;rdquo; с явным правилом prompt-first vs code-first:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Изменение поведения (publicly-exposed контракт, бизнес-логика, валидация)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-&amp;gt; сначала спека, потом код
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Рефакторинг (поведение не меняется)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-&amp;gt; сначала код, потом sync обратно в спеку
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;И отдельный раздел &amp;ldquo;Norms и Safeguards: governance внутри спеки&amp;rdquo; с примерами и привязкой к archlint/golangci-lint.&lt;/p&gt;
&lt;h3 id="патч-2-myarchlinttemplatesspecificationsspec-templatemd"&gt;Патч 2: &lt;code&gt;~/my/archlint/templates/specifications/spec-template.md&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;Добавил две секции после Acceptance Criteria:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Norms
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; N1: error wrapping через fmt.Errorf(&amp;#34;%w&amp;#34;) или errtrace.Wrap
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; N2: логирование через slog с контекстом
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; N3: naming - DB snake_case, JSON camelCase
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Автоматизировано:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;- [ ]&lt;/span&gt; golangci-lint passes (errcheck, errorlint, sloglint)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;- [ ]&lt;/span&gt; archlint passes (layered, fan-out, ISP)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Safeguards
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; S1: обратная совместимость публичного API в рамках minor релиза
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; S2: p99 latency endpoint X не растёт более чем на 10%
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; S3: нет утечки PII в логи и метрики
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Проверка:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;- [ ]&lt;/span&gt; Smoke test на обратную совместимость
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;- [ ]&lt;/span&gt; Бенчмарк до/после
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;- [ ]&lt;/span&gt; Аудит логов на чувствительные поля
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Размерные градации те же: для XS Safeguards обычно не нужны, для M/L/XL — обязательны.&lt;/p&gt;
&lt;h2 id="что-я-не-взял"&gt;Что я НЕ взял
&lt;/h2&gt;&lt;p&gt;Не взял CLI &lt;code&gt;openspdd&lt;/code&gt; и команду &lt;code&gt;/spdd-prompt-update&lt;/code&gt;. Слишком много церемонии для одиночной работы и для команды без отдельного workflow-инженера. У меня та же дисциплина держится на:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/ms-add-spec&lt;/code&gt; — создать спеку&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/ms-checkpoint&lt;/code&gt; — зафиксировать прогресс на длинной задаче&lt;/li&gt;
&lt;li&gt;&lt;code&gt;archlint&lt;/code&gt; — валидация Norms+Safeguards автоматически где можно&lt;/li&gt;
&lt;li&gt;Code review через GitLab — двусторонний sync проверяется на ревью&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Не взял правило &amp;ldquo;никогда не редактировать промпт руками&amp;rdquo;. У них это compensation за CLI-managed lifecycle. У меня его нет, и руками править .md спеку — нормальная операция.&lt;/p&gt;
&lt;p&gt;Не взял заявление про &amp;ldquo;~99% intent alignment&amp;rdquo;. Это маркетинг, кейс N=1.&lt;/p&gt;
&lt;h2 id="двойная-оптика"&gt;Двойная оптика
&lt;/h2&gt;&lt;p&gt;Технический слой статьи: дисциплина для AI-кодинга в команде.&lt;/p&gt;
&lt;p&gt;Архитектура мышления за этим: проблема, которую решают авторы — не &amp;ldquo;AI пишет неправильный код&amp;rdquo;, а &amp;ldquo;bandwidth ревьюера не растёт со скоростью генератора&amp;rdquo;. Когда LLM выдаёт результат быстрее, чем человек успевает его понять, узкое место — когнитивная пропускная способность того, кто принимает изменения. SPDD сжимает то, на чём держится ревью, до одного артефакта (Canvas), чтобы он влезал в bandwidth.&lt;/p&gt;
&lt;p&gt;Это та же задача, про которую я говорил на Стачке — контроль сложности через граф. Только на уровне процесса, а не статического анализа.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;archlint&lt;/code&gt; = governance внутри кода (граф, правила, инварианты).
SPDD/спека = governance над изменениями (контракт между намерением и реализацией).&lt;/p&gt;
&lt;p&gt;Эти две вещи комплементарны, не конкурируют. Если у тебя есть один без другого, ты получаешь либо красивые архитектурные правила без контракта на изменения, либо пухлые спеки без автоматической проверки.&lt;/p&gt;
&lt;p&gt;Когда есть оба — каждый коммит проходит и через &amp;ldquo;не сломал ли архитектуру&amp;rdquo; (archlint), и через &amp;ldquo;соответствует ли намерению&amp;rdquo; (спека). На ревьюера падает только то, что обе автоматизации пропустили.&lt;/p&gt;
&lt;h2 id="ссылки"&gt;Ссылки
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Оригинал статьи: &lt;a class="link" href="https://martinfowler.com/articles/structured-prompt-driven/" target="_blank" rel="noopener"
&gt;Structured Prompt-Driven Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;openspdd&lt;/code&gt; (Thoughtworks-affiliated CLI): &lt;a class="link" href="https://github.com/gszhangwei/open-spdd" target="_blank" rel="noopener"
&gt;https://github.com/gszhangwei/open-spdd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;archlint: &lt;a class="link" href="https://github.com/mshogin/archlint" target="_blank" rel="noopener"
&gt;https://github.com/mshogin/archlint&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Совет умирает. Вопрос остаётся</title><link>https://mshogin.com/notes/compass-in-ai-era/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><guid>https://mshogin.com/notes/compass-in-ai-era/</guid><description>&lt;p&gt;Я 20 лет копил техническую экспертизу. За последние полтора года значительная её часть стала доступна любому, у кого есть подписка на нейросеть за 20 долларов.&lt;/p&gt;
&lt;p&gt;Этот вопрос всплывает у меня периодически: насколько ценен мой опыт сегодня?&lt;/p&gt;
&lt;h2 id="ai-не-плохо-отвечает-ai-поддерживает"&gt;AI не &amp;ldquo;плохо отвечает&amp;rdquo;. AI поддерживает
&lt;/h2&gt;&lt;p&gt;Да, AI знает глубже, шире, точнее меня. И всё же есть особенность: AI поддерживает. Какое бы направление оператор ни выбрал - AI развивает именно выбранное.&lt;/p&gt;
&lt;p&gt;Это даже не плохо. Молодой инженер с GPT движется в проблеме быстрее, чем я когда-то лопатил Stack Overflow и форумы по выходным.&lt;/p&gt;
&lt;p&gt;Что мне даёт опыт - в какой-то момент сказать &amp;ldquo;стоп&amp;rdquo;. Развернуть. Потому что на эти грабли я уже наступал, и помню, как они выглядят.&lt;/p&gt;
&lt;p&gt;Но смотрите дальше. Говорю AI: &amp;ldquo;Стоп. В моём прошлом проекте этот путь не сработал. Давай развернёмся&amp;rdquo;. Он отвечает: &amp;ldquo;Точно, отличная идея&amp;rdquo;. И теперь поддерживает развёрнутый вариант.&lt;/p&gt;
&lt;p&gt;AI равно поддерживает любую мою сторону. И прежнюю, и развёрнутую.&lt;/p&gt;
&lt;p&gt;И вот это - мой настоящий вопрос. На что опираться, если AI быстрее меня в ответах и подыгрывает любому моему выбору?&lt;/p&gt;
&lt;h2 id="поворот-которого-я-не-ожидал"&gt;Поворот, которого я не ожидал
&lt;/h2&gt;&lt;p&gt;Ответ пришёл с неожиданной стороны: в этом году я учусь на коуча. Скоро экзамен ICF Level 1.&lt;/p&gt;
&lt;p&gt;И эта учёба меня прижала.&lt;/p&gt;
&lt;p&gt;Я всю жизнь работал в том же режиме, что AI. Только медленнее.&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;/p&gt;
&lt;h2 id="что-меняется"&gt;Что меняется
&lt;/h2&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;Когда у человека загорается лампочка - &amp;ldquo;Ага! Я понял!&amp;rdquo; - это не финиш. Это эмоциональный всплеск. Через два дня он рассасывается, и человек остаётся с тем же вопросом, что в начале.&lt;/p&gt;
&lt;p&gt;Профессионализм коуча, как я его сейчас вижу, - не отпустить на инсайте. Дойти с человеком до конкретного следующего шага. Проверенного на его собственные грабли. Чтобы у него остался не пик эмоции, а план, который работает без меня.&lt;/p&gt;
&lt;h2 id="где-мой-компас"&gt;Где мой компас
&lt;/h2&gt;&lt;p&gt;И вот тут связалось.&lt;/p&gt;
&lt;p&gt;AI даёт ответы за секунды. Я давал ответы за минуты. Это - то, что заменяется.&lt;/p&gt;
&lt;p&gt;Что не заменяется - умение задать вопрос, от которого человек видит свой реальный блок. И не отпустить, пока у него не сложился рабочий шаг.&lt;/p&gt;
&lt;p&gt;И вот это - точка, на которую можно опираться. Не на знания. Не на ответы. На умение задать вопрос и довести человека до его собственного шага.&lt;/p&gt;
&lt;p&gt;И это, пожалуй, главное, что я унесу из учёбы на коуча в свою работу архитектора. Архитектура систем и архитектура мышления - это один навык, только субстрат разный.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Когда вам в последний раз помог не совет, а правильно поставленный вопрос?&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>AI Doesn't Replace - AI Changes the Role</title><link>https://mshogin.com/notes/ai-analyst-role-shift/</link><pubDate>Mon, 19 Jan 2026 00:00:00 +0000</pubDate><guid>https://mshogin.com/notes/ai-analyst-role-shift/</guid><description>&lt;p&gt;Recently stumbled upon a stat: &lt;a class="link" href="https://hrexecutive.com/the-ai-layoff-trap-why-half-will-be-quietly-rehired/" target="_blank" rel="noopener"
&gt;55% of companies&lt;/a&gt; that laid off people because of AI now regret it. And a &lt;a class="link" href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/" target="_blank" rel="noopener"
&gt;METR study&lt;/a&gt; showed something weird - developers think they work 20% faster with AI, but actually turned out to be 19% slower.&lt;/p&gt;
&lt;p&gt;Then I read Hinton saying that in a couple years AI will do in minutes what takes an engineer a month. And &lt;a class="link" href="https://www.technologyreview.com/2025/12/15/1128352/rise-of-ai-coding-developers-2026/" target="_blank" rel="noopener"
&gt;AWS CEO&lt;/a&gt; responds calling the refusal to hire juniors &amp;ldquo;one of the dumbest things I&amp;rsquo;ve heard.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;So who&amp;rsquo;s right?&lt;/p&gt;
&lt;p&gt;My experience says - both are wrong. AI doesn&amp;rsquo;t replace people. And it doesn&amp;rsquo;t slow work down. It just changes what we do.&lt;/p&gt;
&lt;h2 id="what-ive-given-to-ai"&gt;What I&amp;rsquo;ve Given to AI
&lt;/h2&gt;&lt;p&gt;Honestly - almost all analytics. Draft diagrams, text editing, searching and analyzing information. I&amp;rsquo;ve practically stopped coding by hand - always work with an agent now. Need some expertise - AI is my first stop.&lt;/p&gt;
&lt;p&gt;Sounds like I&amp;rsquo;ve given everything away. But no.&lt;/p&gt;
&lt;h2 id="what-i-wont-give-up"&gt;What I Won&amp;rsquo;t Give Up
&lt;/h2&gt;&lt;p&gt;Health. This is clear for me. I don&amp;rsquo;t mind if a doctor uses AI - actually, that&amp;rsquo;s good. But it should be a doctor. With education. With experience. AI as a tool - yes. AI instead of a doctor - no.&lt;/p&gt;
&lt;p&gt;Same with a psychologist. I like working with a real person, and I don&amp;rsquo;t see how that can be replaced. Same with a coach.&lt;/p&gt;
&lt;p&gt;Everything related to my health, consciousness, awareness - only to professionals. Who can use AI in their work, but professionals nonetheless.&lt;/p&gt;
&lt;h2 id="about-this-productivity-paradox"&gt;About This &amp;ldquo;Productivity Paradox&amp;rdquo;
&lt;/h2&gt;&lt;p&gt;That METR study got me thinking. People think they&amp;rsquo;re faster, but actually slower. A paradox, they say.&lt;/p&gt;
&lt;p&gt;I disagree.&lt;/p&gt;
&lt;p&gt;How did it used to work? You could try one or two implementation options. Picked something, went ahead. Hit problems - made a third version. Then fourth. And it all piled up. First version lying around somewhere, second, third - and you&amp;rsquo;re already on the fifth, dragging legacy behind.&lt;/p&gt;
&lt;p&gt;Now I try a bunch of options at once in the same time. Yes, each specific option takes more time. But I&amp;rsquo;m not dragging three failed attempts behind me. I pick the best option before I start burying it in production.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s not slowing down. That&amp;rsquo;s a different way of working.&lt;/p&gt;
&lt;h2 id="juniors"&gt;Juniors
&lt;/h2&gt;&lt;p&gt;AWS CEO put it well: &amp;ldquo;How&amp;rsquo;s that going to work ten years from now when nobody&amp;rsquo;s learned anything?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Completely agree. There has to be knowledge transfer. Generational turnover of specialists.&lt;/p&gt;
&lt;p&gt;Yes, with AI you can make websites and telegram bots without much education. But the industry isn&amp;rsquo;t just websites and bots. There&amp;rsquo;s tons of stuff that needs higher math. That needs computer science. Juniors are needed. And they need to be trained.&lt;/p&gt;
&lt;h2 id="how-my-role-has-changed"&gt;How My Role Has Changed
&lt;/h2&gt;&lt;p&gt;Writing code by hand - no point anymore. Now I think about architecture. Design systems. Do reviews. Validate what came out.&lt;/p&gt;
&lt;p&gt;And the design itself is also with AI - you talk to the agent, break down the task. Then hand it off for implementation and check the result.&lt;/p&gt;
&lt;p&gt;Basically, the role has shifted. Before - executor. Now - designer and validator.&lt;/p&gt;
&lt;h2 id="whats-become-more-important"&gt;What&amp;rsquo;s Become More Important
&lt;/h2&gt;&lt;p&gt;Systematic approach. These stories about the &amp;ldquo;hero developer&amp;rdquo; who fixed everything at night, or the &amp;ldquo;firefighter&amp;rdquo; who&amp;rsquo;s everywhere at once - that&amp;rsquo;s going away. People who solve problems systematically are valued.&lt;/p&gt;
&lt;p&gt;And another skill has emerged: building your own system for working with AI. Just dictating a prompt - doesn&amp;rsquo;t work. You need an actual system. Your own prompts, rules, skills, agents.&lt;/p&gt;
&lt;p&gt;I spend time not just on work tasks, but on this system. It&amp;rsquo;s my asset. My intellectual property, if you will.&lt;/p&gt;
&lt;h2 id="whats-the-point"&gt;What&amp;rsquo;s the Point
&lt;/h2&gt;&lt;p&gt;AI doesn&amp;rsquo;t replace specialists. It changes what they do.&lt;/p&gt;
&lt;p&gt;55% of companies regret layoffs not because AI doesn&amp;rsquo;t work. But because they didn&amp;rsquo;t understand - people&amp;rsquo;s role has changed, not disappeared.&lt;/p&gt;
&lt;p&gt;Less execution, more design. Less heroics, more system. Less hand-coding, more work on your own tools.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s how it looks right now. At least for me.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;More on AI in development and architecture: &lt;a class="link" href="https://t.me/MikeShogin" target="_blank" rel="noopener"
&gt;Telegram&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Spec-driven development: Reproduce a project from specs alone</title><link>https://mshogin.com/notes/archlint-reproduction/</link><pubDate>Mon, 05 Jan 2026 00:00:00 +0000</pubDate><guid>https://mshogin.com/notes/archlint-reproduction/</guid><description>&lt;p&gt;Ran an experiment: can you reproduce a project if you give AI only specifications without source code?&lt;/p&gt;
&lt;h2 id="setup"&gt;Setup
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Original project: &lt;a class="link" href="https://github.com/mshogin/archlint" target="_blank" rel="noopener"
&gt;archlint&lt;/a&gt; - a Go architecture analysis tool&lt;/li&gt;
&lt;li&gt;Input: &lt;strong&gt;10 specifications&lt;/strong&gt; (Markdown + PlantUML), totaling &lt;strong&gt;73 KB&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Claude Code received an empty directory and specs&lt;/li&gt;
&lt;li&gt;Executor: Claude Code, started in an &lt;strong&gt;empty directory&lt;/strong&gt; and implemented the project from scratch.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Specs covered all the basics: module init, Makefile, data model, Go-analyzer, Cobra CLI, &lt;code&gt;collect&lt;/code&gt;/&lt;code&gt;trace&lt;/code&gt; commands, tracer library, tracelint, and integration tests.&lt;/p&gt;
&lt;h2 id="time"&gt;Time
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;~20 minutes&lt;/strong&gt; from empty directory to working project.&lt;/p&gt;
&lt;h2 id="results"&gt;Results
&lt;/h2&gt;&lt;p&gt;Final assessment of the cloned repository:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Structural identity: 100%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloning success: 85.5%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Semantic equivalence: ~75%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mutations: 23&lt;/strong&gt; (3 critical, 8 medium, 12 minor)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Interesting detail: the clone turned out &lt;strong&gt;shorter&lt;/strong&gt; than the original - 1,845 lines of Go vs 2,159 (-14.5%) with the same number of &lt;code&gt;.go&lt;/code&gt; files (13).&lt;/p&gt;
&lt;h2 id="mutations-that-actually-matter"&gt;Mutations that actually matter
&lt;/h2&gt;&lt;p&gt;Three &amp;ldquo;critical&amp;rdquo; mutations - exactly the places where the specification leaves room for interpretation (i.e., for creativity you didn&amp;rsquo;t order):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Sequence diagram building:&lt;/strong&gt; changed the algorithm for forming calls in the diagram (logic for call stack and write conditions).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tracerlint:&lt;/strong&gt; clone considers deprecated &lt;code&gt;Exit()&lt;/code&gt; call acceptable, while the original does not.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GoAnalyzer:&lt;/strong&gt; added &lt;code&gt;baseDir&lt;/code&gt; and &lt;code&gt;modulePath&lt;/code&gt; fields - AI &amp;ldquo;improved&amp;rdquo; the model because the specs didn&amp;rsquo;t explicitly define the analyzer&amp;rsquo;s responsibility boundary (what to store inside, what to compute outside).&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="takeaway"&gt;Takeaway
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Spec-driven development works as a mechanism for reproducing the &amp;ldquo;functional core&amp;rdquo;.&lt;/strong&gt; 73 KB of specifications was enough to quickly restore structure and core functionality.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Critical deviations occur where the specification describes &amp;ldquo;what should be&amp;rdquo; but doesn&amp;rsquo;t define &amp;ldquo;how to verify it&amp;rdquo;.&lt;/strong&gt; For such places you need:
&lt;ul&gt;
&lt;li&gt;precise rules (invariants),&lt;/li&gt;
&lt;li&gt;input/output examples,&lt;/li&gt;
&lt;li&gt;golden tests (byte-by-byte/structural comparison),&lt;/li&gt;
&lt;li&gt;prohibition on &amp;ldquo;model extension&amp;rdquo; without an explicit spec item.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In short: AI can clone a project from specs quickly. But if there&amp;rsquo;s a gap in the specs - it will definitely squeeze in some &amp;ldquo;engineering optimization&amp;rdquo;. Sometimes useful. In critical places - usually not.&lt;/p&gt;
&lt;p&gt;Clone repository: &lt;a class="link" href="https://github.com/mshogin/archlint-reproduction" target="_blank" rel="noopener"
&gt;mshogin/archlint-reproduction&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>