Короткий ответ — нет, но развёрнутый сэкономит вам часы
Полноценная инспекция Фагана требует модератора, читателя, от двух до четырёх инспекторов и автора. Команда тратит два часа на проверку примерно 250 строк кода со скоростью 125 строк в час. Это восемь-двенадцать человеко-часов на небольшое изменение.
LLM может прочитать 250 строк менее чем за секунду. Он может выполнить чек-лист, отметить подозрительные паттерны и сформировать журнал дефектов до того, как какой-либо человек откроет файл.
Это не значит, что он может заменить команду. Это значит, что команда не должна начинать собрание, пока LLM не выполнит свою домашнюю работу.
Что LLM действительно может делать при инспекции Фагана
В инспекциях Фагана четыре различные роли. У каждой роли есть задача, которая по-разному соотносится с тем, что LLM может и не может делать.
Модератор планирует инспекцию, обеспечивает соблюдение входных критериев и удерживает собрание в рамках повестки. LLM может сгенерировать чек-лист, проверить, что тесты проходят до инспекции, и оценить время на основе количества строк. Он не может понять, что комната, полная инженеров, уходит в дизайн-дискуссию. Роль модератора социальна, а LLM не социальны.
Читатель перефразирует код вслух во время собрания, чтобы заставить группу обрабатывать логику со скоростью осмысления, а не со скоростью беглого просмотра. LLM может суммировать код, но не может заставить комнату людей замедлиться. Настоящая ценность читателя — социальное принуждение. У LLM нет рычагов воздействия.
Инспекторы находят дефекты, изучая код по чек-листам и с учётом знаний предметной области. Именно здесь LLM наиболее полезен. Он может проверять null dereferences, утечки ресурсов, необработанные пути ошибок и ошибки off-by-one быстрее любого человека. Он не устаёт. Он не пропускает скучные вспомогательные функции, потому что они выглядят безопасными.
Автор отвечает на вопросы и исправляет дефекты. LLM не может заменить автора, потому что он не писал код и не может проверить намерения.
Так что реалистичный ответ — не замещение, а замена роли. LLM может выступать в роли неутомимого предварительного инспектора, который берёт на себя механическую часть работы инспектора до того, как люди войдут в комнату.
Где LLM действительно помогают: фаза подготовки
Самая важная фаза инспекции Фагана — подготовка. Каждый инспектор изучает материал в одиночку до собрания. Исследования показывают, что подготовка выявляет примерно половину дефектов, обнаруженных в ходе всего процесса. Если LLM может усилить эту фазу, человеческое собрание становится короче и точнее.
Вот практический подход. Передайте LLM код, чек-лист, адаптированный под ваш язык, и промпт, который требует структурированного вывода. Используйте вывод LLM как отправную точку для человеческих инспекторов, а не как замену.
Промпт важнее модели. Размытый запрос вроде «проверь этот код» даст вам общие банальности. Структурированный промпт с чек-листом и форматом вывода даст конкретные дефекты, по которым можно действовать.
Ниже приведён скрипт на Python, который выполняет предварительную инспекцию на основе LLM с использованием API, совместимого с OpenAI. Он читает исходный файл, применяет чек-лист в стиле Фагана и выводит структурированный журнал дефектов.
#!/usr/bin/env python3
"""
LLM pre-inspection for Fagan-style review.
Produces structured defect log from a checklist.
"""
import argparse
import os
from pathlib import Path
def build_prompt(code: str, filepath: str, language: str) -> str:
checklist = {
"python": [
"Missing null/None checks before dereferencing",
"Unclosed file handles or missing context managers",
"Bare except clauses that swallow exceptions",
"Mutable default arguments in function signatures",
"Race conditions in shared mutable state",
"Missing input validation on public functions",
],
"typescript": [
"Non-null assertions (e.g., !) without justification",
"Missing await on async calls",
"Any types that should be narrowed",
"Unhandled promise rejections",
"Missing input validation on public functions",
],
"rust": [
"Unwrap or expect without comment explaining invariants",
"Missing error propagation where Result is returned",
"Unsafe blocks without safety comments",
"Clone on large data structures in hot paths",
"Missing input validation on public functions",
],
}
items = checklist.get(language, checklist["python"])
checklist_text = "\n".join(f" - {item}" for item in items)
return (
"You are a Fagan inspection assistant. Review the following code "
"against the checklist. For each defect found, output a JSON object "
"with keys: line, category, severity (minor/major/critical), description. "
"If no defect is found for a checklist item, omit it. "
"Be specific about line numbers and exact variable names. "
"Do not suggest fixes. Fagan inspections only log defects, they do not solve them.\n\n"
f"File: {filepath}\n"
f"Language: {language}\n\n"
"Checklist:\n"
f"{checklist_text}\n\n"
"Code:\n```\n"
f"{code}\n"
"```\n\n"
"Output strict JSON array of defects only. No markdown, no preamble."
)
def inspect_file(filepath: str, api_key: str, base_url: str) -> list:
"""Run LLM pre-inspection and return parsed defect list."""
from openai import OpenAI
path = Path(filepath)
code = path.read_text()
# Infer language from extension
ext_map = {
".py": "python",
".ts": "typescript",
".tsx": "typescript",
".rs": "rust",
}
language = ext_map.get(path.suffix, "python")
client = OpenAI(api_key=api_key, base_url=base_url)
response = client.chat.completions.create(
model=os.environ.get("INSPECTION_MODEL", "gpt-4.1-mini"),
messages=[
{"role": "system", "content": "You are a precise code inspection tool."},
{"role": "user", "content": build_prompt(code, filepath, language)},
],
temperature=0.2,
max_tokens=2048,
)
raw = response.choices[0].message.content.strip()
# Some models wrap JSON in markdown fences. Strip them.
if raw.startswith("```json"):
raw = raw[7:]
if raw.startswith("```"):
raw = raw[3:]
if raw.endswith("```"):
raw = raw[:-3]
raw = raw.strip()
import json
try:
defects = json.loads(raw)
if not isinstance(defects, list):
return []
return defects
except json.JSONDecodeError:
print("Warning: LLM returned non-JSON output:")
print(raw[:500])
return []
def main():
parser = argparse.ArgumentParser(description="LLM pre-inspection for Fagan review")
parser.add_argument("files", nargs="+", help="Source files to pre-inspect")
parser.add_argument("--api-key", default=os.environ.get("OPENAI_API_KEY"))
parser.add_argument(
"--base-url",
default=os.environ.get("OPENAI_BASE_URL", "https://api.openai.com/v1"),
)
args = parser.parse_args()
if not args.api_key:
raise SystemExit("Error: set OPENAI_API_KEY or pass --api-key")
all_defects = []
for f in args.files:
defects = inspect_file(f, args.api_key, args.base_url)
all_defects.extend({"file": f, **d} for d in defects)
if not all_defects:
print("No defects flagged by LLM pre-inspection.")
return
print(f"LLM pre-inspection found {len(all_defects)} defect(s):\n")
for d in all_defects:
print(
f"[{d['severity'].upper()}] {d['file']}:{d.get('line', '?')} "
f"({d['category']}) {d['description']}"
)
if __name__ == "__main__":
main()
Установите SDK OpenAI командой pip install openai, задайте свой API-ключ и запустите python inspect.py src/auth.py. Скрипт выводит структурированный журнал дефектов, который человеческие инспекторы могут использовать как отправной чек-лист.
Это не инспекция. Это подготовка. Дефекты всё ещё требуют человеческого суждения.
Что упускают LLM: дефекты, которые стоят реальных денег
Самые дорогие дефекты — это не синтаксические ошибки. Это неверные предположения.
LLM найдёт пропущенную проверку на null. Он не поймёт, что случай null никогда не должен произойти, потому что вышестоящий сервис гарантирует наличие поля, и настоящий баг в том, что ваша команда изменила контракт три недели назад и забыла обновить нижестоящий код.
LLM отметит необработанное исключение. Он не заметит, что обработчик исключения отсутствует, потому что автор предположил, что транзакция базы данных откатится автоматически, и это предположение ложно для конкретного уровня изоляции, который использует ваша команда.
Это дефекты уровня намерений. Они требуют знаний предметной области, исторического контекста и способности спросить: «Что автор предположил, что оказалось неверным?» У LLM нет доступа к недокументированным предположениям вашей команды. У него нет памяти об архитектурном решении прошлого квартала. Он не может посмотреть документ с требованиями и заметить, что код реализует неправильное требование.
Инспекции Фагана были разработаны именно для выявления таких дефектов. Человеческие инспекторы приносят разные ментальные модели и разные контексты. Когда они не согласны в том, что должен делать код, разрыв между их предположениями — это то место, где живут настоящие баги.
У LLM одна ментальная модель, и она обучена на публичном коде, а не на вашей кодовой базе.
Настоящий компромисс: охват против понимания
Предварительная инспекция LLM даёт вам охват. Она читает каждую строку, проверяет каждую функцию и никогда не отвлекается на уведомление из Slack. Это идеальный узкий инспектор.
Человеческая инспекция даёт понимание. Она связывает код со спецификацией, спецификацию со схемой базы данных, а схему с бизнес-правилом, которое изменилось на последнем планировании спринта. Это единственный способ найти дефекты, которые живут за пределами кода.
Компромисс — не человек против машины. Это глубина против широты.
Если вы замените команду инспекторов на LLM, вы найдёте больше дефектов на уровне синтаксиса и пропустите больше дефектов на уровне намерений. Чистый результат зависит от того, какие баги вас убивают. Если ваши производственные инциденты в основном — null dereferences и утечки ресурсов, LLM поможет. Если ваши инциденты в основном — неверная бизнес-логика и упущенные граничные случаи, LLM даст вам ложную уверенность.
Как проводить гибридную инспекцию на практике
Вот практический workflow, который использует LLM для того, в чём он хорош, и сохраняет человеческую команду для того, что могут делать только люди.
До собрания запустите скрипт предварительной инспекции LLM на коде. Дайте каждому человеческому инспектору вывод плюс исходный код. Потребуйте, чтобы они проверили или отклонили каждое замечание LLM во время индивидуальной подготовки. Это заставляет их изучить строки, которые они могли бы пропустить.
Во время собрания читатель по-прежнему перефразирует код вслух. Инспекторы по-прежнему поднимают вопросы. Но теперь они начинают с отобранного списка механических дефектов, уже прошедших триаж. Время собрания может сократиться с двух часов до девяноста минут, или команда может проверить больше кода за то же время.
У модератора появляется новая обязанность: отслеживать точность LLM. Зафиксируйте, сколько отмеченных LLM дефектов оказались реальными, сколько — ложными срабатываниями и сколько человеческих дефектов LLM пропустил. После трёх-четырёх инспекций вы будете знать, требуется ли настройка вашего промпта с чек-листом.
Это тот же процесс, который использовала NASA, когда экспериментировала с инспекциями с помощью инструментов в 1990-х. Автоматические проверщики находили простые дефекты, а сложные оставляли людям. Люди справлялись лучше, потому что не были мысленно истощены поиском простых.
Итог
LLM не может заменить полноценную команду инспекторов, потому что инспекция — это не просто чтение кода. Это структурированный социальный процесс, предназначенный для выявления разрывов между тем, что предполагал автор, и тем, что код на самом деле делает.
Что может LLM — так это сделать человеческую команду более эффективной, сняв механическую нагрузку. Он может играть пятую роль: неутомимого предварительного инспектора, который готовит поле боя до прихода людей.
Если вы пропускаете инспекции, потому что они слишком дороги, LLM не делает их бесплатными. Он делает их короче. Этого часто достаточно.
FAQ
Что такое инспекция Фагана?
Структурированный шестифазный процесс ревью, изобретённый Майклом Фаганом в IBM в 1976 году. Он использует чётко определённые роли (модератор, читатель, инспекторы, автор), обязательную индивидуальную подготовку и собрания с ограничением по времени для поиска дефектов до тестирования. Он последовательно демонстрирует уровень устранения дефектов от 60 до 90 процентов.
Может ли LLM заменить человеческого ревьюера кода?
Не для тех дефектов, которые имеют наибольшее значение. LLM ловит механические проблемы вроде пропущенных проверок на null и утечек ресурсов. Он упускает дефекты уровня намерений: неверные предположения о вышестоящих контрактах, недостающую бизнес-логику и несоответствия между кодом и требованиями.
Как интегрировать LLM в инспекцию Фагана?
Используйте LLM на этапе подготовки. Запустите его по чек-листу, передайте его вывод человеческим инспекторам до собрания и потребуйте, чтобы они проверили каждое замечание. Это сокращает собрание и улучшает концентрацию людей, не устраняя при этом человеческое суждение.
Что делает промпт с чек-листом для LLM эффективным?
Конкретность. Общие промпты дают общий вывод. Эффективные промпты называют точные категории дефектов, требуют структурированного вывода в формате JSON, запрещают предлагать исправления и просят указывать точные номера строк и имена переменных. Чек-лист должен соответствовать вашему языку и наиболее частым пропущенным вашей командой дефектам.
Попробуйте на одном файле
Выберите файл, который вызвал производственный инцидент в прошлом месяце. Напишите чек-лист из пяти конкретных типов дефектов, которые важны вашей команде. Запустите скрипт выше с этим чек-листом. Передайте вывод двум инженерам, которые не писали этот файл.
Сравните находки LLM с человеческими находками. Посчитайте пересечения. Посчитайте, что упустила каждая сторона. Этот разрыв — ваш ответ.