Записки тимлида | Александр Пенкин
52 subscribers
239 photos
3 videos
4 files
104 links
Практические заметки тимлида. Как строить процессы, использовать AI и делать команды быстрее без бессмысленных митингов.
Download Telegram
Почему разработчики скрывают использование AI

Есть странная тема, о которой почти никто не говорит.

Многие разработчики уже используют AI в работе: пишут код, разбирают легаси, ищут ошибки, генерируют тесты, готовят документацию.

Но коллегам об этом рассказывают не всегда.

И дело не только в страхе выглядеть менее компетентными.

Разработчик может опасаться, что:

— ему просто начнут давать больше задач; 
— результат обесценят: «Это же AI сделал»; 
— любую ошибку модели запишут на его счёт; 
— использование AI сочтут нарушением негласных правил; 
— однажды спросят: «Если AI делает за тебя работу, зачем тогда нужен ты?»

Получается довольно токсичная конструкция.

Компания хочет повысить эффективность с помощью AI, но сотрудник не заинтересован показывать, насколько эффективнее он стал.

Поэтому AI используют тихо. Без обмена опытом, общих практик и честного обсуждения ошибок.

Так AI-native культура не появляется.

Она начинается не с покупки лицензий на очередной Copilot. Она начинается с безопасности: разработчик может открыто рассказать, где использовал AI, что получилось, что пришлось переделать и где модель ошиблась.

Пока это приходится скрывать, AI остаётся личным чит-кодом отдельных сотрудников, а не инструментом всей команды.
👍31
Когда монолит действительно пора делить

Сервис вырос до сотни модулей, сборка занимает вечность, а схему базы уже никто не помещает в голове.

Кажется, пора переходить на микросервисы.

Но размер сам по себе — слабый архитектурный аргумент. Большой монолит может годами оставаться удобным. А пять маленьких сервисов — превратиться в распределённый монолит, который падает по частям, а релизится всё равно целиком.

Я бы смотрел не на количество строк кода, а на то, живут ли части системы по разным правилам.

Вот несколько признаков.

Разные причины изменений

Одна часть меняется из-за требований бухгалтерии, другая — из-за экспериментов продуктовой команды, третья — при подключении новых партнёров.

Если изменения регулярно затрагивают только одну область, а остальные приходится собирать, тестировать и выкатывать за компанию, внутри монолита уже появились самостоятельные контуры.

Разные профили нагрузки

Каталог в основном читает данные. Биллинг обрабатывает транзакции. Генерация отчётов создаёт тяжёлую фоновую нагрузку.

Масштабировать весь сервис ради одного горячего участка дорого и неудобно. Особенно когда отчёт за прошлый квартал начинает конкурировать за ресурсы с оформлением заказов.

Разная скорость релизов

Одна часть продукта требует нескольких релизов в день. Другая меняется раз в месяц и должна проходить длинный цикл проверок.

Общий релизный процесс заставляет либо тормозить быстрый контур, либо принимать лишний риск в стабильном. Разделение позволяет каждому двигаться в своём темпе.

Разные владельцы

Если у компонентов есть отдельные команды, свои планы и ответственность за результат, общий код часто превращается в территорию постоянных согласований.

Но здесь важна оговорка: отдельный репозиторий ещё не создаёт автономность. Команда должна иметь возможность изменить, протестировать и выпустить свою часть без координационного совещания со всеми соседями.

Независимые failure domains

Падение рекомендаций не должно мешать оформить заказ. Ошибка в генерации документов не должна останавливать авторизацию.

Если части системы имеют разную критичность и должны отказывать независимо, техническая граница начинает приносить реальную пользу.

При этом вынести код в отдельный процесс недостаточно. Если сервисы используют одну базу, синхронно вызывают друг друга по длинной цепочке и релизятся только согласованным набором, failure domain остаётся общим. Просто теперь у него появился HTTP.

Именно поэтому аргумент «микросервисы сейчас делают все» ничего не говорит об архитектуре.

Разделение добавляет сетевые ошибки, контракты, наблюдаемость, версионирование, сложные тесты и новые сценарии отказа. За эту сложность стоит платить только тогда, когда она покупает независимость.

Не потому, что сервис стал большим.

А потому, что его части меняются, нагружаются, выпускаются, управляются и ломаются по-разному.
1
Если всё требует решения тимлида, это не контроль. Это очередь

Есть команды, в которых тимлид нужен буквально для всего.

PR ждёт его ревью.

Архитектурное решение — его мнения.

Новая библиотека — одобрения.

Разработчик хочет изменить API и тоже ждёт, потому что непонятно, имеет ли он право решить это самостоятельно.

Снаружи такая система может выглядеть как сильный контроль качества.

Фактически тимлид просто превратился в бутылочное горлышко.

Пока он доступен, процесс ещё как-то работает. Стоит ему уйти в отпуск, заболеть или провести полдня на встречах — решения начинают скапливаться в очереди.

Это опасный сигнал.

Задача тимлида не в том, чтобы лично принимать максимальное количество решений. Задача — построить систему, в которой большую часть решений команда может принимать без него.

Для этого нужны не красивые слова про автономию, а несколько вполне конкретных вещей.

Понятные границы решений

Команда должна знать, что она может решать самостоятельно, а что требует обсуждения.

Например:

— изменения внутри архитектурной области можно делать без согласования с тимлидом; 
— изменение публичного API требует отдельного обсуждения; 
— технический долг до определённого объёма можно брать без эскалации.

Ownership и реальные полномочия

Если у зоны есть владелец, он должен иметь право принимать решения внутри неё.

Ответственность без полномочий — это не ownership, а декоративное назначение виноватого.

Принципы вместо постоянных approvals

Хорошие архитектурные принципы позволяют принять десятки решений без отдельного согласования каждого.

Не «спросите тимлида, какую библиотеку использовать», а понятные критерии выбора: поддержка, безопасность, совместимость, стоимость эксплуатации.

Ясные точки эскалации

Команда должна понимать, когда решение выходит за её границы:

— высокий риск; 
— влияние на несколько команд; 
— необратимые изменения; 
— заметный рост стоимости поддержки; 
— изменение внешних контрактов.

У тимлида при этом остаётся контроль.

Просто контроль смещается с каждого отдельного действия на качество системы принятия решений: понятны ли границы, назначены ли владельцы, работают ли принципы, вовремя ли команда эскалирует риски.

На мой взгляд, это один из главных признаков зрелой команды.

Если без тимлида ничего нельзя решить, команда не автономна.

У неё просто очень медленный API.
👍2