Базовая семантика
Что именно моделирует PERT
Редактор использует модель «работа на дуге» (Activity-on-Arrow, AOA): прямоугольная вершина фиксирует достигнутое состояние, а направленная дуга показывает работу, переводящую проект в следующее состояние.
Диаграмма описывает не перечень поручений и не календарь, а логику достижения результата: какие состояния должны стать истинными, что для этого нужно сделать и какие результаты обязательны для начала следующей работы.
- границы проекта;
- работы и их результаты;
- непосредственные зависимости;
- параллельные ветви и точки слияния;
- ожидания и необязательные оценки времени;
- расчётные даты событий и критические работы.
- загрузку и выравнивание исполнителей;
- стоимость работ и бюджетные ограничения;
- праздники и календарные исключения;
- доступность оборудования и других ресурсов.
Мгновенно фиксируемое состояние проекта. Не выполняется, не занимает времени и не потребляет ресурсы.
Сплошная стрелка с действием. Обычно занимает время и создаёт результат.
Тоже сплошная стрелка: активной работы может не быть, но проект действительно ждёт.
Пунктирная стрелка без подписи. Имеет нулевую длительность и передаёт только логику.
Событие отвечает: «Что теперь стало истинным?»
Событие наступает после завершения всех входящих работ. Оно не описывает процесс и должно быть проверяемым: для него можно однозначно ответить «да» или «нет».
Разработка backendЭто процесс, а не достигнутое состояние.
Backend реализованРезультат можно проверить.
Хорошие названия: «Требования согласованы», «Контракт API утверждён», «Тестовое окружение готово», «Приёмочные испытания завершены», «Релиз опубликован». Избегайте формулировок «почти готово», «работа продолжается» и других состояний без однозначного критерия.
Реальная работа отвечает: «Что нужно сделать?»
Работа имеет начало и окончание, может занимать время, потреблять людей, деньги или вычислительные ресурсы и создаёт результат, зафиксированный конечным событием. Называйте её глаголом и объектом.
Ожидание занимает реальное время
Ожидание решения ревьюера, публикации приложения магазином, выдачи сертификата, открытия окна релиза или завершения операции у поставщика учитывается как реальная работа. В редакторе это сплошная дуга с положительной длительностью, даже если команда в этот период ничего не делает.
(Сборка передана на ревью)
── Ожидать решения ревьюера, 2–5 дней ──▶
(Решение ревьюера получено)
Фиктивная работа не является ожиданием
Фиктивная работа ничего не выполняет, не создаёт самостоятельный результат и не занимает времени. Она нужна, только если без нулевой связи сеть потеряет обязательную зависимость или добавит лишнюю.
(Backend готов)
── фиктивная связь, 0 ──▶
(Можно начинать интеграцию)
Не подменяйте неизвестную длительность нулём и не придумывайте оценки. Пустая длительность допустима; нулевая длительность — свойство фиктивной связи, а в редакторе её поле оставляют пустым.
Главный закон
Событие ждёт все входящие работы
Слияние дуг всегда означает логическое «И». После наступления события все выходящие работы получают право начаться и наследуют полный набор его предпосылок.
Событие в центре наступит только после обеих входящих работ. Поэтому C не может начаться после одной из них.
Все выходящие работы наследуют все условия события
Если из события «A и B завершены» выходят C и D, обе работы зависят и от A, и от B. Если C должна зависеть только от A, а D — от A и B, начинать их из одной вершины нельзя. Нужно сохранить отдельное событие «A завершена» и создать отдельное объединённое событие.
Лишний вход создаёт ложную зависимость
Каждая входящая работа становится обязательной предпосылкой для каждой выходящей. Поэтому объединение ветвей «на всякий случай» незаметно запрещает параллельное выполнение и искусственно увеличивает срок.
Событие — контракт состояния
Читайте вершину как утверждение: «К этому моменту завершено следующее: …». Для каждой вершины проверьте три свойства.
- 1Необходимость. Все ли входящие работы действительно нужны для наступления состояния?
- 2Достаточность. Достаточно ли завершить все входы, чтобы считать состояние достигнутым?
- 3Проверяемость. Можно ли однозначно подтвердить наступление события?
Несколько исходящих ветвей означают, что все они входят в проект и могут выполняться параллельно. Для выбора «A или B» сначала добавляется реальная работа выбора, а затем строится сеть выбранного сценария.
Когда план ещё не ясен
Стройте сеть как инструмент прояснения
Полный перечень работ заранее не обязателен. Для нового проекта он часто неизвестен, а попытка выдумать всё до построения сети создаёт ложную точность.
Начните с двух известных состояний
Зафиксируйте текущее состояние и ближайший или конечный результат. Промежуток между ними пока может оставаться крупным.
Понятно, какое изменение требуется.
Результат можно проверить у пользователей.
Идите от результата назад
Для целевого события спрашивайте: «Что должно быть истинно непосредственно перед тем, как этот результат станет возможен?» Перед публикацией могут потребоваться принятый релиз-кандидат, готовность продакшена и открытое окно релиза. Повторите вопрос для каждого найденного состояния.
Затем пройдите сеть вперёд
Для каждого события спросите: «Какие работы действительно можно начать сразу после его наступления?» Прямой проход показывает лишние зависимости, пропущенные ветви, слишком крупные работы и неточно названные состояния.
Сохраняйте неизвестное как неизвестное
Если способ достижения результата пока неясен, оставьте одну укрупнённую реальную работу. Разверните её позже, когда детали изменят понимание порядка, параллельности, риска или точки контроля.
(Требования согласованы)
── Реализовать интеграцию с провайдером ──▶
(Интеграция готова к приёмочным тестам)
Превратите неопределённость в работу исследования
Технический спайк, исследование или согласование — реальные работы, если они занимают время и создают решение.
(Требование к авторизации сформулировано)
── Провести технический спайк ──▶
(Допустимый способ авторизации выбран)
Не рисуйте несколько возможных реализаций как обычные параллельные ветви: сеть прочитает их как обязательные. Сначала покажите работу «Выбрать вариант», затем стройте выбранный вариант или отдельные сценарные диаграммы.
Проясняйте ближайший полезный горизонт
- ближайшие работы, по которым принимаются решения, показывайте подробно;
- среднесрочные участки оставляйте укрупнёнными;
- дальние участки уточняйте по мере появления информации;
- не раскладывайте проект до коммитов, файлов и отдельных тест-кейсов без управленческой причины.
Практический цикл построения
- 01Постройте грубый путь к результату.
Начните с нескольких крупных работ, чтобы появился связный путь от текущего состояния к цели.
- 02Найдите реальную параллельность.
Разведите работы в ветви, только если им не нужны результаты друг друга.
- 03Найдите обязательные слияния.
Объединяйте результаты перед работой, которой действительно нужны все входы.
- 04Уточните значимые внутренние зависимости.
Разделите крупную работу там, где промежуточный результат открывает новую ветвь или требует отдельной приёмки.
- 05Выполните обратный и прямой проходы.
Сверьте необходимые условия результата и возможность старта каждой работы.
- 06Повторяйте цикл.
Возвращайтесь к укрупнённым участкам, когда появляется новая информация.
Масштаб модели
Выберите полезную степень детализации
Детализация нужна не сама по себе. Она полезна, если меняет зависимости, показывает параллельность, открывает точку контроля или позволяет принять решение.
Работа слишком крупная, если скрывает важный результат
Разделите работу, если другая работа может начаться до её полного завершения, если часть результата передаётся другому исполнителю или принимается отдельно.
Разработать приложениеОдна дуга скрывает почти все полезные зависимости.
Утвердить API → реализовать backend и frontendКонтракт открывает параллельные ветви.
Работа слишком мелкая, если не влияет на сеть
Обычно не нужно выделять создание ветки Git, каждый файл и коммит, запуск каждой команды, каждую мелкую правку, сообщение или встречу без самостоятельного результата. Такая детализация затрудняет чтение, но не улучшает решения.
Оставляйте работу одной дугой, когда
- ✓Один набор входных условий.
Всем внутренним действиям нужны одни и те же предпосылки.
- ✓Один проверяемый результат.
Промежуточные состояния не используются другими ветвями.
- ✓Нет критичного ожидания внутри.
Внешняя задержка не требует отдельного контроля.
- ✓Порядок никому не важен.
Внутренняя последовательность не меняет остальную сеть.
События отражают готовность, а не процент
«Реализация выполнена на 50 %» редко является полезным событием. Хороший промежуточный результат можно передать или использовать: «Контракт API опубликован», «Авторизация работает в тестовом окружении», «Миграция совместима с предыдущей версией».
Если после первой части уже можно честно начать другую работу, между частями есть содержательное событие и крупную дугу следует разделить.
Типовые конструкции
Основные схемы зависимостей
Для каждой работы задавайте строгий вопрос: «Какие результаты обязательно должны быть готовы непосредственно перед её началом?» Порядок пунктов в плане сам по себе зависимостью не является.
Представьте, что предполагаемый предшественник ещё не завершён. Можно ли честно начать следующую работу?
Последовательность
B может начаться только после завершения A. Промежуточное событие называет именно тот результат A, который нужен B.
(Исходное состояние) ── Выполнить A ──▶ (A завершена)
── Выполнить B ──▶ (B завершена)
Разветвление и слияние
Работы после одного события имеют одинаковые условия начала и могут идти параллельно. Событие с несколькими входами ждёт завершения всех ветвей.
┌── Выполнить B ──▶ (B завершена) ──┐
(A завершена) ──────┼── Выполнить C ──▶ (C завершена) ──┼──▶ (B, C и D завершены)
└── Выполнить D ──▶ (D завершена) ──┘
Одна работа зависит от A, другая — от A и B
Сохраните событие A отдельно, чтобы C не получила лишнюю зависимость от B. В объединённое событие передайте A фиктивной связью.
(A завершена) ── Выполнить C ──▶ (C завершена)
└── фиктивная связь ──▶ (A и B завершены) ── Выполнить D ──▶
▲
(B завершена) ────────────────────┘
Собственные и общий последователи
C зависит только от A, D — только от B, а E — от A и B. Отдельные события сохраняют независимость, объединённое открывает общую работу.
(A завершена) ── Выполнить C ──▶ (C завершена)
└── фиктивная ──┐
├──▶ (A и B завершены) ── Выполнить E ──▶
┌── фиктивная ──┘
(B завершена) ── Выполнить D ──▶ (D завершена)
Частичное перекрытие работ
Если следующая работа начинается до полного завершения предыдущей, выделите реальный промежуточный результат. Фиктивная связь не создаёт готовность и не переносит время.
(Требования согласованы)
── Подготовить и утвердить контракт API ──▶ (Контракт API утверждён)
├── Реализовать backend ──▶
└── Реализовать frontend ──▶
Внешний результат
Внешний исполнитель или сервис не отменяет зависимость. Если без доступа, решения или данных нельзя продолжить, это состояние должно присутствовать в сети.
(Заявка отправлена провайдеру)
── Получить доступ к API ──▶
(Доступ к API получен)
Ревью и согласование
Ревью занимает время и создаёт результат, поэтому является реальной работой. Доработку показывайте вперёд новыми событиями, а не обратной стрелкой.
(Первичное ревью завершено) ── Устранить замечания ──▶ (Замечания устранены)
── Провести повторное ревью ──▶
Автоматическая операция
Сборка, миграция, автотесты, сканирование и развёртывание занимают время, могут завершиться неуспешно и создают проверяемый результат. Это реальные работы.
(Изменения объединены)
── Выполнить CI-сборку и тесты ──▶
(Сборка прошла CI)
Альтернативы и необязательные работы
Обычное разветвление означает «И», а не «или». Сначала выполните работу выбора, затем стройте выбранную ветвь или отдельную сценарную диаграмму.
(Варианты известны)
── Выбрать механизм авторизации ──▶
(Механизм авторизации выбран)
Ограничение общего ресурса
Если две работы технологически независимы, но их выполняет один человек, можно оставить ветви параллельными и учитывать загрузку отдельно. Соединяйте их последовательно, только если порядок уже принят как обязательный план.
Календарное ограничение
Отличайте календарь выполнения от реального ожидания. Если релиз действительно ждёт открытия окна, покажите ожидание сплошной дугой с положительной длительностью.
(Релиз-кандидат принят) ── Ожидать окна релиза ──▶ (Окно открыто)
── Выпустить релиз ──▶
Нулевая логическая связь
Когда действительно нужна фиктивная работа
Фиктивная работа требуется, когда без неё нельзя одновременно сохранить обязательную зависимость и не добавить лишнюю другой работе.
Пунктир, пустая подпись, нулевая длительность
Создайте обычную дугу, переключите стиль на пунктирный, оставьте название пустым и не задавайте длительность. В экспортируемых данных такая связь имеет стиль dashed и duration: null.
Признак необходимости
Предположим, интеграция требует готовности backend и frontend, а документацию API можно закончить после backend, не ожидая frontend. Нельзя начинать документацию из общего события «Backend и frontend готовы»: возникнет лишняя зависимость. Сохраните «Backend готов» отдельно и передайте его в событие начала интеграции пунктирной связью.
Тест удаления
- 1Мысленно удалите пунктирную связь.
- 2Определите, какая работа после этого сможет начаться раньше.
- 3Сравните получившееся разрешение старта с реальной логикой проекта.
Если удаление ничего не меняет, связь, скорее всего, избыточна.
Что нельзя изображать пунктиром
- ожидание ответа или окна;
- согласование и принятие решения;
- code review и тестирование;
- сборку, публикацию и развёртывание;
- получение доступа;
- технический спайк;
- исправление дефектов;
- резерв времени.
Не используйте пунктир и для неизвестности. Неясный участок остаётся крупной реальной работой или превращается в работу исследования.
Не минимизируйте число фиктивных связей любой ценой
Приоритеты таковы: правильная логика, однозначное чтение, возможность проверить зависимости и только затем компактность. Несколько понятных пунктирных связей лучше одной компактной, но ошибочной вершины.
Ограничение редактора: одна дуга на пару событий
У дуг в сервисе нет отдельных идентификаторов, поэтому две дуги с одинаковыми начальным и конечным событиями считаются дубликатом и блокируют импорт. Если две реальные работы имеют одинаковые условия начала и общий результат, проведите одну из них через дополнительное событие и добавьте необходимую фиктивную связь.
┌── Выполнить A ───────────────────────────────┐
(Можно начинать) ───┤ ├──▶ (A и B завершены)
└── Выполнить B ──▶ (B завершена) ── фиктивная ┘
Нумерация нужна сервису, но не логике
На самой диаграмме достаточно понятных названий. При сохранении сервис назначает событиям технические идентификаторы вида node_N; отдельный пользовательский реестр номеров и работ для небольшой сети не обязателен.
Структура и аудит
Как проверить готовую сеть
Правильный рисунок ещё не гарантирует правильную модель. Прочитайте каждую вершину и дугу как логическое утверждение, затем выполните обратный и прямой проходы.
Структурные правила
- ✓Один исходный и один итоговый результат.
Все обязательные ветви начинаются после старта и приводят к финишу.
- ✓Граф ацикличен.
Ни одна стрелка не возвращается в уже достигнутое событие.
- ✓Каждая работа встречается один раз.
Общий результат разветвляется после единственного выполнения работы.
- ✓Нет скрытых предпосылок.
Доступы, решения, окружения и внешние данные выражены структурой.
- ✓Нет лишних предпосылок.
Работа не ждёт ветвь, результат которой ей не нужен.
- ✓Нет потерянных ветвей.
Каждая работа имеет понятное отношение к итоговому результату.
Повторную работу нельзя показывать циклом. Разверните её вперёд: «Первичная проверка завершена» → «Устранить замечания» → «Замечания устранены» → «Провести повторную проверку».
Проверка без таблиц
- 01Прочитайте каждую вершину.
Фраза «событие наступает, когда завершены все входящие работы» должна совпасть с названием события.
- 02Проверьте каждую выходящую работу.
Можно ли начать её сразу после события, если не учитывать занятость людей и календарь?
- 03Проверьте каждое слияние.
Должна ли каждая последующая работа действительно ждать каждый вход?
- 04Проверьте каждое разветвление.
У всех ли выходящих работ полностью одинаковые условия начала?
- 05Удалите мысленно каждый пунктир.
Должна появиться конкретная ошибка — преждевременный старт или потеря условия.
- 06Пройдите от финала назад.
Найдите забытые внешние входы и ветви, которые не приводят к результату.
- 07Выполните прямой прогон.
Отмечайте, какие работы открываются после каждого достигнутого события.
Типичные ошибки
«Разработка функции» замените на «Функция реализована».
«Функция готова» замените на «Реализовать функцию».
Последующая работа получает лишнюю зависимость.
Работа открывается раньше обязательного результата.
Нулевая связь искусственно сокращает срок.
Обычная сеть считает обязательными обе альтернативы.
Технический шум скрывает условия старта и слияния.
Условие должно быть стрелкой, а не фразой «после получения доступа».
Ветви разведены, хотя одной не хватает общего результата.
Независимые работы поставлены цепочкой ради аккуратного вида.
Обратная стрелка делает событийную сеть логически неразрешимой.
Одинаковая пара событий не поддерживается сервисом; нужна промежуточная вершина.
Она обнаружит цикл, дубликат дуги, разрыв, несколько стартов или неверные ссылки, но не узнает, нужна ли конкретная зависимость в реальности. Смысловой аудит остаётся за автором и командой.
Развёрнутый пример
Небольшой программный релиз
Пример показывает, как работы выявляются прямо при построении сети, как сохраняется параллельность и где фиктивные связи объединяют разные наборы условий.
Уточнить границы
Исходное состояние — «Цель релиза определена». Итог — «Релиз опубликован».
(Цель релиза определена)
── Уточнить и согласовать требования ──▶
(Требования согласованы)
Развести независимую подготовку
После согласования требований параллельно готовятся контракт API, макеты, тестовое окружение и приёмочные сценарии.
┌── Подготовить контракт API ──▶ (Контракт API утверждён)
├── Подготовить макеты ────────▶ (Макеты утверждены)
(Требования согласованы) ─────┼── Настроить тестовое окружение ▶ (Окружение готово)
└── Подготовить сценарии ──────▶ (Сценарии готовы)
Собрать разные условия реализации
Backend требует контракта API и окружения. Frontend требует контракта API и макетов. Окружение нельзя добавлять в условия frontend, если оно ему не нужно.
(Контракт API утверждён) ── фиктивная ──┐
├──▶ (Можно реализовывать backend) ── Реализовать backend ──▶ (Backend готов)
(Окружение готово) ──────── фиктивная ──┘
(Контракт API утверждён) ── фиктивная ──┐
├──▶ (Можно реализовывать frontend) ─ Реализовать frontend ─▶ (Frontend готов)
(Макеты утверждены) ──────── фиктивная ──┘
Объединить всё необходимое для интеграции
Интеграция ждёт backend, frontend и тестовое окружение. Готовые приёмочные сценарии пока остаются отдельной ветвью.
(Backend готов) ────────── фиктивная ──┐ (Frontend готов) ───────── фиктивная ──┼──▶ (Можно начинать интеграцию) (Окружение готово) ─────── фиктивная ──┘ └── Интегрировать систему ──▶ (Интеграция завершена)
Принять и выпустить результат
Приёмочные тесты ждут интеграцию и сценарии. После принятия релиз-кандидата можно развернуть релиз.
(Интеграция завершена) ── фиктивная ──┐
├──▶ (Можно начинать приёмочные тесты)
(Сценарии готовы) ─────── фиктивная ──┘ └── Провести тесты ──▶ (Релиз-кандидат принят)
└── Развернуть релиз ──▶ (Релиз опубликован)
Что показывает пример
- полный реестр работ не требовался до начала построения;
- контракт API выделен как событие, потому что открывает две ветви;
- каждая работа получила только необходимые предпосылки;
- приёмочные сценарии готовятся параллельно реализации;
- пунктир используется только для объединения условий;
- каждое слияние читается как логическое «И».
Оценки и интерфейс
Добавьте время и соберите модель в редакторе
Оценки времени назначаются работам только после проверки структуры. Событие длительности не имеет, реальное ожидание имеет положительную длительность, фиктивная работа — нулевую.
Как сервис хранит и показывает длительность
Если заполнено ровно одно из трёх полей, редактор показывает это число как длительность.
Редактор применяет формулу PERT. Если заполнены только два поля, незаполненное технически принимается равным нулю.
te = (a + 4m + b) / 6
- a
- оптимистическая оценка
- m
- наиболее вероятная
- b
- пессимистическая
Для осмысленной PERT-оценки лучше указывать все три исходных значения. Единица измерения отдельно не хранится и не выводится, поэтому заранее договоритесь, что вся диаграмма использует, например, рабочие дни или часы.
Раннее время и критический путь
Раннее время события равно максимуму времени завершения всех входящих ветвей, потому что событие ждёт их все. Критический путь — самый длинный по времени путь от старта к финишу. Команда «График» записывает ранние календарные даты непосредственно в события, а критическим работам назначает красный цвет.
Даже точные оценки бесполезны, если событие объединяет лишнюю ветвь или работа открывается раньше обязательной предпосылки.
Работа в редакторе
- 1
Нажмите правой кнопкой на пустом месте и выберите «Создать событие».
- 2
Создайте исходное и целевое события, затем добавляйте ближайшие известные состояния.
- 3
Выберите «Создать работу» и укажите начальное и конечное события.
- 4
Сплошные дуги называйте действиями. Для фиктивной связи включите пунктир и оставьте подпись пустой.
- 5
Размещайте события слева направо и разводите параллельные ветви по вертикали.
- 6
При необходимости заполните длительности, используя одну согласованную единицу измерения.
- 7
Запустите проверку структуры и разберите каждое предупреждение до обсуждения диаграммы.
затем раскладка.
Не добавляйте события и фиктивные связи только ради красивого рисунка. Меняйте положение элементов, не меняя логику.
Технические правила сервиса
- строить сеть слева направо: начальное событие левее конечного;
- не создавать петли, циклы и повторяющиеся дуги между одной парой событий;
- использовать одну исходную и одну завершающую вершину для единого результата проекта;
- не проводить стрелку через карточку постороннего события;
- не использовать пунктирную дугу с названием или длительностью;
- не считать цвет заменой логической связи: цвет служит только визуальной пометкой.
Перед публикацией
Контрольная проверка диаграммы
События
- каждая вершина описывает достигнутое состояние, а не процесс;
- состояние можно проверить однозначно;
- название соответствует совокупности всех входящих результатов;
- событие не имеет собственной длительности.
Работы
- каждая сплошная дуга описывает действие или реальный интервал;
- у каждой работы есть понятный результат;
- одна работа не продублирована в разных ветвях;
- масштаб работы соответствует управленческой задаче.
Зависимости
- у каждой работы есть все необходимые и только необходимые предпосылки;
- выходящие из события работы имеют одинаковые условия начала;
- каждое слияние означает обязательность всех входов;
- параллельные ветви не используются для выбора;
- в сети нет циклов.
Фиктивные работы
- каждая пунктирная связь передаёт конкретное обязательное условие;
- её удаление приводит к понятной логической ошибке;
- подпись и длительность отсутствуют;
- пунктир не изображает ожидание, ревью или автоматическую операцию.
Полнота
- внешние входы, влияющие на старт, присутствуют в графе;
- все значимые ветви приводят к результату проекта;
- неизвестные участки укрупнены или представлены исследованием;
- по сети можно пройти от старта к финишу без скрытых условий.
Десять правил в короткой форме
- Вершина — состояние, дуга — работа.
- Событие наступает после завершения всех входящих работ.
- Все выходящие работы наследуют полный набор предпосылок события.
- Слияние и разветвление ветвей означают «И», а не «или».
- Фиктивная работа передаёт только логику и всегда имеет нулевую длительность.
- Ожидание, ревью, тестирование и автоматическая операция — реальные работы, если занимают время.
- Полный список работ заранее не обязателен: сеть уточняется итеративно.
- Детализируйте только там, где это меняет зависимости или решения.
- В сервисе между одной парой событий допустима только одна дуга.
- Сначала проверяйте логику, затем добавляйте время.
Материалы для углубления
- ГОСТ Р 56716-2015 «Проектный менеджмент. Техника сетевого планирования»
- GAO Schedule Assessment Guide
- Praxis Framework: Activity-on-Arrow diagram
- NASA Systems Engineering Handbook
- ASQ: Arrow Diagram