Академический и инженерный разбор
Понятие объединяет объекты по признакам. Термин — языковой знак,
которым понятие выражено. Один термин может быть многозначным, а одно понятие
может иметь несколько названий.
«клиент»
├── пользователь продукта
├── организация-покупатель
├── HTTP client
└── приложение, вызывающее API
Фраза «клиент должен повторить запрос» без контекста почти гарантированно
создаст расхождение между документацией, кодом и поддержкой.
2. Содержание и объём
В традиционной логике у понятия различают:
- содержание — набор признаков, мыслимых в понятии;
- объём — класс объектов, к которым понятие применимо.
понятие «идемпотентная HTTP-операция»
содержание:
повторение одинакового запроса имеет тот же предполагаемый эффект,
что и один запрос
объём:
конкретные операции API, удовлетворяющие этому условию
Чем больше обязательных признаков мы добавляем, тем уже обычно становится
объём:
сервис
⊃ stateful-сервис
⊃ stateful-сервис с PostgreSQL
⊃ stateful-сервис с PostgreSQL и синхронной репликацией
Это называют обратным отношением содержания и объёма. Но не превращайте его в
механическую арифметику: признаки могут быть зависимыми, несовместимыми или
ничего не добавлять к уже заданному определению.
3. Единичные, общие, собирательные и пустые понятия
Единичное и общее
- единичное: «репозиторий
courses»;
- общее: «статический сайт»;
- собирательное: «команда», рассматриваемая как целое;
- пустое: класс, у которого в выбранной предметной области нет экземпляров.
Пустые классы важны. В современной логике из:
Все единороги проходят code review.
не следует:
Некоторые единороги проходят code review.
Универсальное утверждение истинно в модели без единорогов вакуумно. Многие
традиционные схемы квадрата оппозиции предполагали экзистенциальный импорт:
класс субъекта непуст. Эту предпосылку надо добавлять явно.
Распределительное и собирательное чтение
Команда подняла сервис за день.
Это не значит, что каждый участник поднял сервис за день. Перенос свойства
целого на каждого участника — будущая ошибка деления; перенос свойства частей
на целое — ошибка композиции.
4. Род, вид и видовое отличие
Классическое определение строится через ближайший род и видовое отличие:
Квадрат — прямоугольник с равными сторонами.
род видовое отличие
Инженерный пример:
Circuit breaker — механизм устойчивости, который временно прекращает вызовы
зависимости после достижения порога ошибок и затем контролируемо проверяет
восстановление.
«Механизм устойчивости» задаёт семейство, остальная часть отделяет circuit
breaker от retry, timeout и bulkhead.
Существенный и случайный признак
Для текущей цели существенен признак, по которому объект принадлежит нужному
классу. Цвет кнопки несущественен для понятия «идемпотентная операция», но
может быть существенен для понятия «контрол с достаточным контрастом».
Существенность зависит от модели и задачи. Ошибка начинается, когда локальный
признак объявляют природой объекта:
Все наши успешные сервисы написаны на Go; значит, Go — существенный признак
успешного сервиса.
Здесь технология, вероятно, смешана с размером команды, компетенциями,
нагрузкой и качеством эксплуатации.
5. Отношения между понятиями
flowchart LR
A["Совместимые"] --> A1["Тождественные
один объём"]
A --> A2["Подчинённые
S ⊂ P"]
A --> A3["Пересекающиеся
S ∩ P ≠ ∅"]
B["Несовместимые"] --> B1["Соподчинённые
виды одного рода"]
B --> B2["Противоположные
допускают промежуточное"]
B --> B3["Противоречащие
P и не-P"]
Противоположность и противоречие особенно легко спутать:
- «быстрый» и «медленный» — противоположности; между ними есть среднее;
- «закэширован» и «не закэширован» в фиксированный момент и в фиксированном
смысле — противоречащие признаки.
Из «решение не централизованное» не следует «решение децентрализованное», пока
не доказано, что шкала исчерпывается двумя вариантами.
6. Что такое хорошее определение
Определение отвечает на вопрос, как распознать принадлежность к классу.
6.1. Номинальное и предметное
- номинальное объясняет употребление знака: «SLO означает service level
objective»;
- предметное задаёт свойства объекта: «SLO — целевое значение измеримого
уровня сервиса на заданном окне».
Расшифровка аббревиатуры ещё не определяет сущность.
6.2. Явное, операциональное и рекурсивное
Явное:
Чётное целое — целое n, для которого существует k: n = 2k.
Операциональное:
Запрос считается успешным в этом отчёте, если сервер вернул 2xx не позднее
500 мс и асинхронная операция завершилась в течение 30 секунд.
Рекурсивное:
Пустой список — список.
Если xs — список, то cons(x, xs) — список.
Ничто другое списком не является.
Операциональное определение полезно для измерения, но не обязательно исчерпывает
понятие. «Интеллект = результат конкретного теста» удобно для исследования и
слишком узко для философского тезиса.
7. Правила определения
7.1. Соразмерность
Объёмы определяемого и определения должны совпадать.
Слишком широко:
База данных — программа, которая хранит информацию.
Подходит текстовый редактор.
Слишком узко:
База данных — сервер PostgreSQL, хранящий строки в таблицах.
Исключены другие реляционные, документные и встроенные системы.
Проверка: найдите ложноположительный и ложноотрицательный пример.
7.2. Отсутствие круга
Надёжная система — система, которая работает надёжно.
Скрытый круг:
Хорошая архитектура следует правильным архитектурным принципам.
Правильные принципы — те, которые создают хорошую архитектуру.
7.3. Ясность
Неизвестное нельзя определять через ещё менее известное:
Согласованность — отсутствие аномалий сериализуемости в префиксно-замкнутом
множестве историй.
Это может быть точной формулой для специалиста и бесполезным первым
определением для новичка. У определения есть аудитория.
7.4. Положительная форма
По возможности говорите, что объект есть, а не только чем он не является:
Микросервис — не монолит.
Определение допускает бесконечно много нерелевантных объектов. Отрицательная
граница уместна, когда отрицание и есть существенный признак: «нечётное число».
7.5. Существенный критерий
Senior-разработчик — сотрудник с должностью Senior.
Это определение записи в HR-системе, а не инженерной зрелости. Для карьерного
разговора нужны наблюдаемые зоны ответственности и уровень автономности.
8. Ошибки определения
| Ошибка |
Схема |
Диагностика |
| Слишком широкое |
D ⊃ X |
найдите объект, подходящий определению, но не понятию |
| Слишком узкое |
D ⊂ X |
найдите признанный экземпляр, исключённый определением |
| Круг |
X объясняется через X |
замените термины переменными и проверьте зависимость |
| Неясность |
неизвестное через более неизвестное |
попросите операциональный критерий |
| Метафора вместо границы |
«архитектура — скелет системы» |
спросите, что включается и исключается |
| Подмена значения |
термин меняет смысл по ходу |
перепишите каждое значение отдельным словом |
| Овеществление |
абстракции приписывают самостоятельную причинность |
найдите действующих людей, процессы и механизмы |
Овеществление
Рынок решил, что продукт не нужен.
«Рынок» не единый агент. Полезная декомпозиция: какие сегменты пользователей,
по каким каналам, при каких ценах не совершили какое действие?
9. Деление понятия
Деление раскрывает объём понятия через виды. У него есть:
- делимое понятие;
- основание деления;
- члены деления.
Запросы по результату:
успешные
клиентские ошибки
серверные ошибки
Основание — класс результата. Если добавить «мобильные запросы», основания
смешаются: мобильный запрос может быть успешным или ошибочным.
Правила деления
- Одно основание на шаг.
- Члены взаимно исключаются в выбранном смысле.
- Деление исчерпывает объём или явно содержит «прочее».
- Нет скачка: переходите к ближайшим полезным подклассам.
- Уровни не смешиваются: род не стоит рядом с видом вида.
Плохая таксономия инцидентов:
backend
frontend
PostgreSQL
критические
Здесь смешаны слой, технология и серьёзность. Один инцидент попадёт сразу в
несколько корзин, а отчёт потеряет смысл.
Хорошая модель хранит независимые фасеты:
layer: backend
component: database
technology: postgresql
severity: critical
cause: capacity
10. Дихотомия и ложная дилемма
Дихотомия делит класс по признаку P / не-P и поэтому формально исчерпывающа:
запрос аутентифицирован / не аутентифицирован
Но естественный язык часто подсовывает вместо противоречия противоположности:
либо переписываем систему, либо ничего не делаем
«Не переписываем целиком» включает модульную замену, strangler pattern,
обновление зависимостей, изоляцию legacy и множество других вариантов.
11. Классификация и цель
Классификация — не фотография «истинной структуры мира», а инструмент.
Классификация книг по автору хороша для библиографии; по теме — для обучения;
по формату — для склада. Нельзя объявлять одну ось естественно правильной без
цели.
В инженерии спрашивайте:
- Какое решение будет принято по этой классификации?
- Достаточно ли признак стабилен?
- Может ли объект иметь несколько меток?
- Что произойдёт с пограничным случаем?
- Кто и насколько одинаково будет классифицировать?
12. Практический разбор: «технический долг»
Определение:
Технический долг — всё, что разработчикам не нравится в коде.
Проблемы:
- субъективный критерий;
- слишком широкий объём;
- нет связи с будущей стоимостью;
- невозможно измерить решение.
Рабочая версия:
Технический долг — принятое или унаследованное техническое решение, которое
ускорило прошлую поставку либо возникло из ограничений, но теперь создаёт
повторяющуюся стоимость изменения, риск или эксплуатационные потери.
Операционализация:
карточка долга =
контекст происхождения
+ наблюдаемая повторяющаяся стоимость
+ затронутые изменения
+ риск бездействия
+ варианты погашения
Теперь можно спорить о приоритете, а не о вкусе.
13. Чек-лист
- Термин используется в одном значении?
- Указана предметная область?
- Есть критерий принадлежности?
- Определение не слишком широкое и не слишком узкое?
- Нет прямого или скрытого круга?
- Метафора дополнена проверяемой границей?
- Деление использует одно основание?
- Категории взаимно исключаются или допускают несколько меток явно?
- Все важные случаи покрыты?
- Пустой класс и пограничные случаи обработаны?
- Классификация помогает принять конкретное решение?
14. Задания
- Дайте два определения «готовой задачи»: для команды и для договора с
заказчиком. Объясните различия.
- Найдите ложноположительный и ложноотрицательный пример для определения
«микросервис — независимо развёртываемый сервис».
- Исправьте классификацию багов:
UI, backend, критический, регрессия,
Safari.
- Восстановите разные значения слова «платформа» в своём проекте.
- Объясните, почему «AI — система, которая ведёт себя интеллектуально»
является кругом без независимого определения интеллектуального поведения.
Источники
- Георгий Челпанов.
«Учебник логики», главы II–VI и XXIII.
- Аристотель. «Категории».
- Irving Copi, Carl Cohen. Introduction to Logic — традиционная работа с
терминами, определениями и классификацией.
- George Lakoff. Women, Fire, and Dangerous Things — почему реальные
категории часто не сводятся к набору необходимых и достаточных признаков.
Что дальше
Понятия становятся истинными или ложными не сами по себе, а внутри суждений.
Следующая глава разбирает четыре категорические формы, распределённость
терминов, квадрат оппозиции, отрицание и кванторы.
Суждения и квадрат оппозиции