Навыки реальных инженеров: .agents-каталог от Matt Pocock
Разбор навыков, которые действительно важны для инженеров, и как они отражены в открытом каталоге .agents от Matt Pocock. Практические советы без воды.
Что такое .agents и зачем он нужен
Как возник проект и кто его создаёт
Этот каталог — инициатива одного человека, но с амбициями покрыть реальную боль. Matt Pocock — разработчик TypeScript и React, автор популярных библиотек и обучающих курсов. В 2023 году он задумался: почему при найме инженеров так много шума о дипломах, сертификатах и «правильных» путях, а на деле работает тот, кто умеет решать задачи?
Результат — открытый репозиториторий .agents, где каждый может добавить свою «карточку навыков». Это не HR-портал и не трекер достижений. Это просто список того, что действительно пригодилось в проде.
Пример структуры одной такой карточки:
yaml# .agents/frontend/react.md
name: React
level: expert
years: 5+
projects:
- name: "Интерфейс для аналитики"
description: "SSR + Suspense + кастомные хуки"
repo: "https://github.com/example/analytics-ui"
skills:
- "Оптимизация рендеринга (useMemo, useCallback)"
- "Работа с состоянием (Redux Toolkit, Zustand)"
- "Тестирование (Jest, React Testing Library)"
Кто добавляет — решает каждый. Но есть модерация: мусье, вроде «знаю CSS», отсекают.
Почему навыки важнее учёждений на практике
Две минуты, и вы поймёте суть. Вместо диплома MIT или сертификата AWS вы видите: «Настроил Kafka-кластер на трёх нодах, обеспечил репликацию и мониторинг через Prometheus». Это конкретика, а не абстракция.
С практической точки зрения, работодателю всё равно, где вы учились — в университете или на кухне у подруги. Важно, чтобы вы могли ответить:
«Да, я сталкивался с гонками в БД. Использовал транзакции и уровень изоляции Repeatable Read. Вот конфиг:»
sqlBEGIN ISOLATION LEVEL REPEATABLE READ;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
Или:
«Да, ловил утечку памяти в Node.js. Было связано с замыыканиями в цикле. Вот как починил:»
js// Было
for (var i = 0; i < items.length; i++) {
setTimeout(() => console.log(items[i]), 100);
}
// Стало
for (let i = 0; i < items.length; i++) {
setTimeout(() => console.log(items[i]), 100);
}
Это и есть суть .agents: не «я умею», а «вот что сделал». Без воды, без шаблонов. Только результат, который можно проверить.
Если мы посмотрим на типичный профиль из каталога, он выглядит так:
yaml# .agents/devops/kubernetes.md
name: Kubernetes
level: advanced
certifications: []
projects:
- name: "Миграция микросервисов на k3s"
description: "Сократил latency на 40%, настроил autoscaling по CPU и очередям"
repo: "https://github.com/example/k8s-migration"
skills:
- "Helm-чарты с собственными плагинами"
- "Настройка RBAC и NetworkPolicy"
- "Отладка подов через kubectl exec и logs"
Никаких сертификатов. Только опыт, который работает.
Ключевые навыки, которые выделяет каталог
Работа с LLM и агентами: не просто промпты
С практической точки зрения, большинство инженеров, с которыми я работал, подходят к LLM как к «умному поисковику». Вбивают запрос, получают ответ, копируют. Это работает для трёх строк кода, но рушится, как только нужно построить архитектуру.
Настоящий навык — это умение структурировать диалог. Не «напиши API на FastAPI», а:
Контекст: мне нужен REST API на FastAPI с асинхронной PostgreSQL-базой.
Требования:
1. JWT-аутентификация через /auth/login
2. CRUD для сущности "проекты" (Project: id, name, owner_id)
3. Защита эндпоинтов через Depends
4. Alembic миграции
5. Pydantic схемы для валидации
6. Docker Compose для dev-окружения
Выведи структуру проекта и код для app/main.py, app/models/project.py, app/schemas/project.py.
Такой подход даёт предсказуемость. LLM не гадает, а работает с чётким контрактом.
Ещё один признак опытных инженеров — итеративная отладка диалога. Я видел, как коллеги тратят часы, пытаясь «допилить» один промпт, пока LLM не выдаст идеальный код. А опытный инженер сразу разбивает задачу:
- Сначала — архитектура и структура проекта.
- Потом — модели данных.
- Потом — эндпоинты по одному.
- В конце — тесты и Docker.
Каждый шаг — отдельный запрос с контекстом предыдущего. Это как писать код по шагам, а не сразу «всё в один файл».
Агенты — это ещё один уровень. Не «пусть сам разбирается», а «агент получает цель, а я контролирую промежуточные состояния». Пример из моей практики:
yaml# .github/workflows/deploy.yml
name: Deploy via agent
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run deployment agent
uses: matt-pocock/agents-deploy@v1
with:
target: production
dry-run: false
notify: slack
Здесь агент не «сам делает всё». Он получает конкретную задачу, а я задаю рамки: куда деплоить, как уведомлять, что логировать.
Системное мышление и отладка в реальном времени
Когда сервер начинает падать в проде, LLM не спасёт. Нужно видеть картину целиком.
Опытные инженеры сначала спрашивают: «Что изменилось?». Потом — «Где именно тормозит?». Потом — «Какие метрики растут?».
Пример из жизни: в одном из кластеров Proxmox нагрузка на одну ноду взлетела до 80+ CPU. Вместо того чтобы сразу рестартовать сервисы, я посмотрел:
bash# Кто конкретно жрёт CPU
ps aux --sort=-%cpu | head -10
# Анализ вызовов в реальном времени
perf top -p $(pgrep -f 'my-app')
# Сетевые задержки между нодами
ping -c 10 node-2.internal
Оказалось, один контейнер в цикле читал файл с NFS-тома, и из-за бага в ядре каждый read вызывал soft lock на 200 мс. LLM не подскажет это. Только системное мышление + инструменты.
Отладка в реальном времени — это не «поставь breakpoint». Это:
bash# Следим за логами в реальном времени
journalctl -f -u my-service
# Анализируем трафик на уровне пакетов
tcpdump -i eth0 port 5432 and host db-node-1
# Мониторим изменения файловой системы
inotifywait -m -r -e modify /var/log/myapp/
И ключевой момент: не гасите пожар, а выясняйте почему загорелось. Я когда-то видел, как коллега 20 минут ловил утечку памяти в Go-сервисе, а потом обнаружил, что проблема в json.Unmarshal в цикле без decoder.Reset(). LLM мог бы подсказать про decoder.Reset(), но только если вы знаете, что именно ищете.
Каталог .agents отражает это: не «как написать промпт», а «как построить процесс, где LLM и агенты работают по правилам инженера».
Как использовать .agents на практике
Интеграция с существующими workflow
Когда я впервые увидел каталог .agents от Matt Pocock, подумал: «Ну и ещё один набор скриптов в npm-пакете». Оказалось, что речь о структурированном подходе к описанию агентов — их целей, инструментов и поведения. Именно это нужно, когда агент не просто выполняет задачу, а должен вписываться в ваш пайплайн.
Вот как я подключил .agents к своему текущему стеку: Docker Compose + GitLab CI + Ansible для конфигураций.
Сначала установил пакет:
bashnpm install -D @agents
Затем создал структуру в репозитории:
.agents/
├── agents.yaml
├── tools/
│ └── gitlab-ci.ts
└── prompts/
└── code-review.md
Файл agents.yaml описывает агента, который будет проводить код-ревью:
yaml# .agents/agents.yaml
version: "1.0"
agents:
- name: code-reviewer
description: "Проверяет PR на соответствие стандартам и безопасности"
model: gpt-4o
tools:
- gitlab-ci
prompts:
- path: ./prompts/code-review.md
Инструмент gitlab-ci.ts — это TypeScript-модуль, который интегрируется с GitLab API:
ts// .agents/tools/gitlab-ci.ts
import { defineTool } from "@agents/core";
export default defineTool({
name: "gitlab-ci",
description: "Интеграция с GitLab CI для запуска агентов в пайплайне",
async run({ context }) {
const { mergeRequest } = context.gitlab;
// логика взаимодействия с MR
}
});
В .gitlab-ci.yml добавил шаг:
yaml# .gitlab-ci.yml
stages:
- review
code_review:
stage: review
image: node:20
script:
- npx @agents run code-reviewer --context=gitlab
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
Теперь каждый merge request автоматически проходит проверку агентом. Если он находит уязвимость или нарушение стиля — пишет комментарий прямо в MR.
Главное здесь — не «подключить и забыть», а понять, где агент заменяет рутину, а где требует человеческого надзора. У меня .agents работает на уровне CI, но не заменяет финальное одобрение. Это предсказуемо: агенты хороши для масштабирования, но не для принятия решений вместо команды.
Как не потеряться в море агентов и инструментов
Через год после внедрения .agents у меня было уже семь агентов: один для ревью, три для тестирования, два для документирования и один «универсальный». Поначалу казалось, что это удобно. Потом началось — агенты стали конфликтовать друг с другом, писать противоречащие друг другу комментарии, запутывать коллег.
Решение простое, но неочевидное: не все агенты должны быть активными одновременно.
Я ввёл понятие «агент-контекст». Каждый агент работает только в рамках определённой задачи, и его инструменты активируются по необходимости.
Пример конфигурации:
yaml# .agents/agents.yaml
agents:
- name: test-runner
description: "Запускает тесты и анализирует покрытие"
model: gpt-4o-mini
tools:
- docker
- jest
triggers:
- on: push
branches: [main]
- on: manual
label: "run-tests"
Здесь агент test-runner срабатывает либо при пуше в main, либо по ручному триггеру. Никогда не запускается автоматически на merge request — чтобы не дублировать работу code-reviewer.
Также я стал использовать агрегатор агентов — один «кооринатор», который распределяет задачи:
yaml# .agents/agents.yaml
agents:
- name: orchestrator
description: "Распределяет задачи между специализированными агентами"
model: gpt-4o
tools:
- agent-router
rules:
- if: task.type == "review"
then: run code-reviewer
- if: task.type == "test"
then: run test-runner
Это как переключатель на мойей лаборатории: один вход — и только нужный сервис включается. Остальные ждут.
И, конечно, логирую всё. Каждый запуск агента записывается в Loki:
yaml# docker-compose.yml
services:
loki:
image: grafana/loki:latest
volumes:
- ./loki-data:/loki
command: -config.file=/etc/loki/local-config.yaml
А в prompts/code-review.md добавил инструкцию:
md<!-- .agents/prompts/code-review.md --> Ты — строгий, но справедливый ревьюер. Не пиши водянистых фраз. Если находишь проблему — сразу указывай строку и предложение исправления. Если всё чисто — скажи кратко: «Одобрено».
Когда агенты стали понятны по назначению и не пересекались — работа стала предсказуемой. Как в моей сети: каждый кабель на своём месте, и никто не путает eth0 с eth1.
Что не так с традиционными подходами к обучению
Почему курсы не заменят практику с .agents
Скажу прямо: большинство онлайн-курсов по DevOps и инфраструктуре — это как инструкция к IKEA, где все выглядит по-красивому, но в реальности ты сам разбираешься с багами, которые никто не описывал. Я сам проходил курсы по Docker и Kubernetes в 2015-м — теорию усвоил за выходные, а на продакшене сражался с overlay-сетями и DNS-проблемами ещё три месяца.
Вот что обычно предлагают курсы:
bash# «Курс по Docker» — типичный пример
docker run -d --name webapp nginx
А в реальности вы сталкиваетесь с тем, что:
bash# Реальная жизнь — ваш контейнер падает через 3 часа
docker inspect webapp
docker logs webapp
# Оказывается, проблема в том, что nginx не может писать в /var/log
# потому что в продакшене volume монтируется с опцией ro
Курсы не покрывают такие сценарии, потому что они не могут учитывать каждую специфику вашей инфраструктуры. Они дают «рабочее» решение, которое ломается в реальном мире.
Каталог .agents подходит иначе. Вместо того чтобы давать готовый рецепт, он показывает, как люди решают реальные проблемы. Например, вместо «как запустить PostgreSQL в Docker», вы видите, как кто-то настраивает репликацию с учётом ограничений своего облака, или как обходит проблему с правами доступа в Kubernetes-подах.
Это как разница между тем, чтобы научить кого-то менять колесо по инструкции, и тем, чтобы показать, как опытный механик диагностирует прокол на ходу — понимаешь не только «что делать», а и «почему так происходит».
Как .agents помогает не просто копировать, а понимать
Когда я впервые увидел .agents, подумал: «Ну ещё один каталог конфигов». Но почитал — и понял, что это не про копирование, а про понимание принципов.
Вот типичный пример из каталога. Вместо того чтобы просто дать docker-compose.yml, автор объясняет, почему выбрал именно такую архитектуру:
yaml# docker-compose.yml — упрощённый пример из .agents
version: '3.8'
services:
app:
image: node:18-alpine
volumes:
- ./app:/app
- /app/node_modules
environment:
- NODE_ENV=production
restart: unless-stopped
networks:
- backend
db:
image: postgres:15-alpine
volumes:
- db_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
environment:
POSTGRES_DB: ${DB_NAME}
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
restart: unless-stopped
networks:
- backend
volumes:
db_data:
networks:
backend:
driver: bridge
Но в комментариях к этому файлу автор пишет, что выбор node:18-alpine связан с размером образа — в продакшене это критично для времени деплоя. А restart: unless-stopped — не просто «чтобы не падало», а стратегия обеспечения доступности при перезагрузке хоста.
Вот это и есть суть .agents. Вы не просто копируете конфиг — вы видите, зачем каждая строка. Это как если бы в учебнике к IKEA не просто давали инструкцию, а объясняли, почему деталь №4 именно в этот уголок, а не в другой.
С практической точки зрения, это меняет подход к обучению. Вместо того чтобы запоминать «как сделать», вы учитесь задавать правильные вопросы: «Почему именно так?», «Что будет, если изменить этот параметр?», «Как это поведёт себя в продакшене?»
Именно поэтому я рекомендую .agents тем, кто хочет не просто «научиться», а научиться правильно.
Часто задаваемые вопросы
Как добавить свою карточку в .agents-каталог?
Склонируйте репозиторий, создайте файл по пути .agents/<stack>/<skill>.md и заполните шаблон YAML, указав название, уровень, годы опыта и список проектов с краткими описаниями и ссылками на репозитории. После этого сделайте pull‑request; модератор проверит, что описание содержит конкретные достижения, а не общие фразы вроде «знаю HTML». Если всё в порядке, PR будет merged и ваша карточка появится в каталоге.
Требуется ли подтверждение навыков от третьих лиц или достаточно самооценки?
В .agents акцент сделан на demonstrable experience, поэтому достаточно собственного описания конкретных задач и результатов, которые вы можете показать в открытых репозиториях или документировать в коммитах. Модерация не требует сертификатов или рекомендаций, но отсекает записи, где нет никаких доказательств (например, только «умею пользоваться Git»). Чем более детально вы опишете, что именно делали и какой эффект получили, тем выше шанс, что карточка пройдёт проверку.
Как работодатели могут использовать .agents при найме?
Работодатель может искать в каталоге нужные технологии и сразу видеть уровень и реальные проекты кандидата, минуя этап анкетирования о дипломах. Это позволяет быстро составить shortlist на основе demonstrable skill set, а затем в интервью сосредоточиться на глубине понимания и подходе к решению задач. Всё это сокращает время на первичный скрининг и повышает шансы найти человека, который уже решал аналогичные проблемы в проде.
Есть ли ограничения по уровням (beginner, intermediate, expert) и как их определять?
Уровни задаются самим автором карточки, но они должны соответствовать фактическому опыту: beginner — до года практической работы с технологией, intermediate — от года до трёх лет с участием в продакшн‑проектах, expert — три и более лет, включая архитектурные решения, оптимизацию и менторство. Если уровень явно завышен без соответствующих проектов в списке, модератор может попросить уточнить или понизить оценку. Цель — сохранить полезность каталога для тех, кто ищет реальную компетенцию.