Пятничное чтиво
8 постов
Сегодня продолжим говорить про ИИ, постепенно разгребаю свои заметки после конференций.
1️⃣ Управление контекстом
Вторая идея, вокруг которой всё крутится после продуктовых инженеров, — управление контекстом.
ИИ нужен доступ к:
- требованиям;
- договорённостям;
- истории решений.
Значит, контекст нужно собирать в одном месте:
- либо переносить всё в Markdown;
- либо настраивать интеграции через MCP со всеми возможными системами.
Перед работой над задачей я иногда запускаю поиск по имейлам или перепискам в Teams, чтобы собрать дополнительный контекст. Сюда же мой прошлый пост про выгрузку всех созвонов. Требования можно хранить прямо в репозитории или дать ИИ доступ через MCP к Jira, Confluence и другим системам.
Иначе ИИ может покрыть код тестами, но не увидеть оригинальные требования — и покрыть даже невалидный сценарий.
2️⃣ Знания остаются в головах
Собирать контекст в одном месте — хорошо, но MCP для доступа к нашему мозгу, к счастью, ещё не придумали 🧠
В головах всё ещё хранится куча неочевидного контекста. Например:
- почему какое-то решение приняли несколько лет назад;
- какие есть негласные требования: например, что для системы оплаты даже минимальный регресс производительности недопустим.
Яндекс активно работает над этим направлением и складывает знания по проекту в RAG. Если запустили фичу, а она не взлетела, это тоже может попасть в базу знаний, чтобы ИИ учёл этот опыт в будущем.
Меня всё мучает мысль — написание кода обесценилось, а теперь нам нужно ещё и выгрузить знания из головы, чтобы нас было совсем легко заменить 😅.
Получается новый уровень job security: раньше можно было писать менее понятный код, а теперь — саботировать передачу неочевидных знаний ИИ.
3️⃣ Не всех нужно пересаживать на Git
Когда мы говорим, что весь контекст должен храниться в одном месте, хочется сразу дать всем Git и заставить писать Markdown. И мне кажется, это неплохая идея.
Но в Яндексе был отдельный доклад про то, что для базы знаний нужна прослойка, чтобы не обучать всех Markdown и Git. Продакты должны писать требования в удобной для них среде.
Интересная фраза из доклада:
Не нужно сажать космонавтов на трактора и трактористов на космолёт, а потом ждать, что все быстро разберутся.
Кажется, эту проблему должен закрыть docs as code, но я пока не изучал этот вопрос. А вообще ещё нужен автоматический аудит, чтобы требования не устаревали относительно кода.
В следующем посте поговорим о том, как ИИ меняет code review
А у вас в компании как с контекстом для ИИ?
🔥 — активно передаём контекст ИИ
👀 — худо бедно, что-то делаем
🤷♂️ — пытаюсь быть незаменимым
#ai #processes
Время продуктовых инженеров
Я последнюю неделю провёл в Москве и посетил Deep Tech Night и TeamLead Today.
И, честно говоря, в ИТ всё так быстро меняется, что немного не по себе.
После Deep Tech Night поговорил с разработчиками, и мне начало казаться, что нас очень скоро совсем заменят. Но потом вернулся на работу, открыл рабочие задачи, понял, что мы ещё не дошли до этого, и немного успокоился 😅.
Но как ни крути, если так и дальше будет продолжаться, то роль разработчиков изменится. Уже меняется.
1️⃣ Теперь недостаточно быть просто бекендером или фронтендером
Фронтендеров отправляют изучать бекенд, а бекендеров — фронтенд, чтобы человек мог сам закрывать всю фичу.
И в целом роли будут схлопываться.
Ценность самого кода сильно упала. Разработчики должны решать проблемы, а не просто писать код.
Кажется, так было и раньше, но теперь сложить лапки и сказать «моё дело таски делать» уже не особо прокатит.
2️⃣ Вместо того чтобы бесконечно уточнять требования, люди генерят прототипы
Если вы читали «Совершенный код», там говорится что-то вроде:
Если на этапе требований была допущена ошибка, то её исправление на этапе разработки будет стоить дороже.
Так вот, теперь эта ситуация немного меняется.
Знаете ситуацию: кто-то приходит и говорит «хочу реализовать вот такую штуку», а ты просто генерируешь прототип и спрашиваешь:
«Если вот так будет выглядеть — подойдёт?»
Мы в команде тоже решили идти в эту сторону. Как бонус во время прототипа понимаем, с какими проблемами столкнёмся при реализации.
3️⃣ Команды дробятся на микрокоманды
А иногда появляются человеко-департаменты, где весь департамент состоит из одного человека и весь цикл разработки может быть закрыт им же — от постановки задачи до выкатки.
Понятно, что это не всегда применимо и несёт за собой риски.
Но благодаря этому снижается время на передачу результата от PM к разработчику, а затем к тестировщику.
Хотя, конечно, нагрузка на разработчика повышается.
А помните, нам обещали, что ИИ избавит нас от рутины?
Думаю, программистов не заменят, но нам придётся эволюционировать во что-то немного иное — в продуктовых инженеров.
Я задумался об этом уже давно:
- Зачем мне нужен разработчик в команде, который просто закрывает задачи?
- Если он ждёт чётко описанных требований?
- Если он плохо тестирует за собой работу?
Код теперь и Claude с Codex пишут неплохо, особенно если есть чёткие требования. А решение задач в таком случае превращается просто в копирование постановки задачи в чат.
И ещё один момент, который мы там обсуждали.
Разработчики сами внедряют ИИ и тянут его в компании. Тем самым снижают потребность в разработчиках.
Сами себе копаем яму.
Но как ни крути, ИИ всё равно будет внедрён.
Поэтому лучше копать эту яму, чем плыть по течению и в итоге оказаться в ней.
А вы как считаете:
🔥 — лучше копать яму
👀 — давайте плыть по течению и продлевать прайм-эру программистов
🤷♂️ — сейчас токены подорожают и всё откатится
#ai #processes
🚀 Мама, я тимлид (и это не про книгу)
Последние пару лет я стараюсь подводить итоги года, а в этом году решил ещё и поставить цели на текущий год. Планы большие, и надеюсь, что хоть часть из задуманного получится реализовать. Но есть и кое-что, чего я не планировал.
У нас в компании происходят большие изменения, и пару месяцев назад я стал тимлидом .
Команда такая:
- тимлид (это я 🎉)
- продакт 👩💼
- 2 разработчика 👨💻👨💻
- 2 manual QA 🧪🧪
- 1 automation QA 🤖
И если я примерно понимаю, как руководить разработчиками, то с тестировщиками всё сложнее — я только погружаюсь в их процессы и стараюсь разобраться, как планировать их нагрузку. Такие перемены меня одновременно радуют, мотивируют и пугают 😅, но я думаю — справлюсь.
По счастливой случайности мне очень вовремя сделали предложение, от которого я не смог отказаться. Мне предложили бесплатно пройти курс «Команда. Инструменты управления» от Стратоплана. Я же, в свою очередь, буду писать честные отзывы после каждого блока обучения — примерно раз в месяц.
Так что, ксли вы задумывались о курсе для тимлидов, я смогу приоткрыть завесу и рассказать, как проходит обучение в Стратоплане и какой материал вас ждёт.
🎓 Немного о том, как проходит поступление на курс:
- Сначала ты получаешь доступ в личный кабинет.
- Там нужно выполнить домашнее задание — оно состоит из двух частей.
- В первой части ты описываешь свой запрос: чего именно хочешь от обучения, какие у тебя цели. Тренер оценил мой длинный список с текущими проблемами и ожиданиями от курса 😅
- Вторая часть — это кейс. Представь, что ты — руководитель руководителей проектов, и на одном из проектов случился форс-мажор. Нужно принять решение, как действовать в этой ситуации. Тут я, честно говоря, залип на пару часов — много неизвестных, куча нюансов, и в итоге приходится подключать фантазию. Но фишка в том, что правильных ответов там нет — важно, как ты рассуждаешь, как принимаешь решения.
- После этого назначается созвон с тренером. Можно задать все интересующие вопросы по обучению и обсудить свой кейс. Тут я понял, что с кейсом более-менее справился, но напридумывал себе коррупционных схем в организации, которые занесли меня немного не туда 🤣.
На самом деле, интересно снова почувствовать себя немного студентом. После смены роли у меня очень много вопросов:
- как планировать спринт
- как управлять людьми и мотивировать их
- как получать фидбек и правильно критиковать
Надеюсь, курс поможет заполнить мои достаточно большие пробелы в знаниях.
Обучение займёт 6 месяцев: раз в месяц, 3 дня подряд: в пятницу, субботу и воскресенье. Хорошо, что первое пятничное занятие выпадает на мой отпуск.
В общем, пожелайте мне удачи 🙏 и расскажите:
- Что бы вы посоветовали начинающему тимлиду?
- Что бы вы посоветовали самому себе, когда стали тимлидом?
- Каким вам хочется видеть своего тимлида?
#стратоплан
📝 Meeting Notes
1️⃣ Ситуация
Вы созвонились с продактом, дизайнером, коллегой по команде — о чём-то договорились. Через какое-то время он вас спрашивает:
«А почему реализовано вот так?»
Вы отвечаете:
«Мы с тобой об этом договорились».
А он в ответ:
«Такого не было, я такого не говорил».
2️⃣ Другая ситуация
Вы созвонились, о чём-то договорились, не записали, задачу отложили на пару дней — и уже не помните, о чём договорились. Приходится снова созваниваться и вспоминать, о чём же всё-таки говорили.
Знакомо?
✅ Решение: Чтобы не было подобных ситуаций, можно вести протоколы встреч, а затем отправляем тем, кто участвовал в обсуждении.
❓ Зачем вести протоколы?
- Чтобы не забыть. По исследованиям:
через 20 минут мы забываем 40%,
через час — 60%,
через день — 70%.
- Не исказить информацию с течением времени — ведь наш мозг безбожно врёт 😅
- Чтобы обратиться к заметкам в будущем и решить разногласия. Протокол встречи в какой-то степени имеет статус юридического документа.
- Чтобы сохранить информацию для отсутствующих на совещании, например, если коллега был на больничном.
- Передать информацию присутствующим — особенно актуально, если вы работаете в англоязычной компании, где у всех разный уровень английского.
- Люди будут ответственнее относиться, например, к срокам, которые они называют (но это не точно 😄)
✍️ Как писать протокол
- Должен быть кратким — меньше времени на написание, меньше времени на чтение.
- При этом важно не терять контекст — вы должны взглянуть на него со стороны и понять, о чём речь, через пару недель.
- Важно указывать, от кого поступила информация.
- Если было принято какое-то решение, нужно описать контекст — почему оно было принято и кем.
🗂 Мой формат
С протоколами у меня была такая же проблема, как была раньше с ведением заметок. Я не отделял в них заметки от задач, и всё смешивалось в одну неподдерживаемую кучу. Поэтому для себя я придерживаюсь следующего очень простого формата:
- Agenda
- Зачем встречаемся
- Список вопросов, которые нужно обсудить
- Notes
- Важная информация, которую следует зафиксировать
- Action Items
- Задачи, которые нужно сделать мне или другим членам команды
🛠 Инструменты
Мы мигрировали на стек Microsoft — Teams, OneNote и т.д.
Поэтому я просто веду заметки на одной странице в OneNote, к которой имеет доступ команда.
Если это встреча 1:1, я использую Obsidian, а затем отправляю свои заметки собеседнику.
---
🔗 Подробнее
- 📹 Видео — Meeting notes как средство коммуникации в проектной команде
- 📄 Текстовая расшифровка
А вы ведёте meeting notes? Поделитесь, как вы это делаете и какими инструментами пользуетесь
#process #management
🎧 Потеря потерь ...
Моим наушникам Sennheiser стало совсем плохо. Пару лет назад я перевернулся на электросамокате — сам отделался лёгким испугом, а вот наушники получили множество трещин и переломов. С тех пор держались на честном слове, и вот теперь окончательно сдался микрофон.
Взял на замену их собрата поменьше — EPOS PC 8. Коллеги говорят, звук отличный, и шумодав вполне годный.
Теперь думаю взять ещё одни наушники для офиса — вот не знаю, повторить покупку или попробовать что-то новое.
А вы какими наушниками пользуетесь? Расскажите — может, найду для себя идеальный вариант.
#about_me
🤖 Онбординг ИИ
Что происходит, когда в команде появляется новый сотрудник? Правильно — он адаптируется и старается писать код в соответствии с гайдлайнами, принятыми в команде. А помогают ему в этом документация, линтеры и ревью коллег.
По сути, ИИ — это ваш коллега, которому вы делегируете задачи, и ему тоже нужно объяснить, как писать код. И здесь как раз пригодится документация, которую никто из ваших коллег не читает 😄, но ИИ — будет.
Многие ИИ-агенты поддерживают формат "правила/инструкции", где можно описать стандарты и архитектуру проекта. Это, по сути, обычный Markdown-файл, который будет добавляться к системному промпту при каждом запросе.
- В Cline — это custom instructions
- В Cursor — rules
- В Copilot — instructions
- В Windsurf — rules
Названия немного отличаются — но суть одна.
Примеры
1️⃣ У меня Copilot упорно пытался использовать pnpm, пока я явно не указал использовать npm.
2️⃣ На работе мы используем BEM и префиксы для всех имён классов, чтобы избежать коллизий. Cline, конечно, этого не понял, пока я явно не задал это в инструкциях.
3️⃣ На выходных решил набросать MVP пет-проекта из бэклога. Сначала написал ТЗ с помощью ИИ, положил его в .github/instructions/requirements-instruction.md и попросил Copilot написать проект по ТЗ. Он справился, потребовались лишь небольшие правки. Теперь при любых изменениях он уже знает требования.
4️⃣ Можно попросить ИИ использовать conventional commits при генерации сообщений к коммитам.
Некоторые примеры — на скринах.
#ai #frontend
У меня есть проблема 😐
И заключается она в том, что я часто не могу насладиться отдыхом в полной мере.
Когда я ничего не делаю, я чувствую тихий голосок внутри. Он шепчет, что я теряю время, а мог бы:
- 📖 прочитать книгу
- 🎓 пройти курс
- 🛠️ начать ремонт
- 🏋️♂️ сходить лишний раз в зал
- и т.д.
Он не дает полностью расслабиться и насладиться выходными в полную силу.
Но при этом, если я займусь чем-то, то удовольствия тоже не получу, я только сильнее устану. Получается такой замкнутый круг, в котором я постоянно должен что-то делать, чтобы ощутить мимолетное удовольствие от достижения, а затем снова окунуться в работу с головой. Ещё ситуацию усугубляет "культ успешности", все рассказывают о своих достижениях, и кажется, что на их фоне ты какой-то лузер.
Как-то я не заметил, что в какой-то момент пропало то самое ощущение беззаботности. И кажется, что произошло это когда-то давно. Но ладно, с этим я более-менее научился справляться несколько лет назад.
Но аналогичная ситуация происходит, когда ты много работаешь, потом резко наступают выходные, а ты не можешь просто взять и остановиться. Тебя продолжает по инерции нести вперед, ты хочешь что-то делать дальше, несмотря на то, что сил нет. И тут требуется некоторое время чтобы наконец остановиться, перестать бежать, насладиться отдыхом и набраться сил перед новым стартом.
Обычно помогает выехать куда-нибудь, где можно сменить атмосферу и много гулять, но в этот раз я остался дома — и вот, это со мной и произошло. Я пытался доделать все дела до выходных, засиживался допоздна, а когда наступили выходные появилось опустошение и нервозность. В общем, только к середине второго дня получилось усмирить себя и отпустить ситуацию, а на третий тупо лежать и смотреть сериал.
Так вот, если вы чувствуете что-то такое — знайте, вы не одиноки 👋😄. И если не получилось отдохнуть в этот раз, то обязательно отдохните на следующей неделе. 😉
#about_me
🗿 Подводные камни при переходе с ES5 на ES6
Недавно мы с командой, наконец-то перешли с ES5 на ES6.
Всё прошло достаточно плавно, нам пришлось исправить всего несколько ошибок в рантайме. Почти все ошибки были в очень старых файлах, где были отключены проверки typescript с помощью @ts-nocheck.
Ошибка 1️⃣ — Action is not a constructor
Ошибка возникла в нескольких местах, где мы использовали стрелочную функцию в качестве конструктора. Раньше она не возникала, потому что стрелочная функция компилировалась в обычную function.
const Action = () => {}; // ES6
const action = new Action(); // Action is not a constructor
var Action = function () {} // ES5
var action = new Action(); // Всё ОК
Ошибка 2️⃣ — Функции, объявленные через let, больше не попадают в window
let openAction = function () {}
window.openAction() // window.openAction is not a function
// Раньше let заменялся на var и всё работало
var openAction = function () {}
window.openAction() // всё ок
Дело в том, что когда переменная объявляется глобально через var, она автоматически становится свойством глобального объекта window. Подробнее тут.
Ошибка 3️⃣ — Cannot access variable before initialization
Одна из ошибок случалась, когда мы пытались получить доступ к переменной promise до её инициализации.
class Queue {
executing;
run(thenable) {
const promise = new Promise(async (resolve, reject) => {
// пытаемся получить значние promise
while (this.executing != promise) {
// ...
}
// ...
});
}
}
// Cannot access 'promise' before initialization
new Queue().run(Promise.resolve())
Раньше, const превращался в var и ошибки не было. Это связано с понятием временной мертвой зоны TDZ, которая не возникает у переменных, объявленных через var.
Были и другие ошибки, но они по сути вариации или комбинации тех ошибок, что я привел выше.
👉 Кстатии, размер бандлов уменьшился процентов на 20.
#TypeScript #JavaScript