Когда мы говорим о качестве кода, чаще всего упоминаем тесты, архитектурные паттерны, принципы SOLID или модные фреймворки. Но на самом деле ключевым фактором, который определяет, насколько эффективно будет работать команда, является когнитивная нагрузка.
Исследователь Zakir Ullin в своём «живом документе» cognitive-load напоминает простую истину: наш мозг способен удерживать в рабочей памяти всего ~4 элемента. Всё, что выходит за пределы этого лимита, превращается в путаницу 🤯. И, как показывает практика, именно лишняя нагрузка при чтении кода стоит компаниям больше всего времени и денег.
🌍 Внутренняя когнитивная нагрузка vs Внешняя когнитивная нагрузка
Важно различать два типа нагрузки:
- 🪨 Внутренняя когнитивная нагрузка (Intrinsic) — неизбежная сложность самой задачи. Например, распределённые транзакции или работа с криптографией всегда сложны по определению.
- 🎭 Внешняя когнитивная нагрузка (Extraneous) — лишние барьеры, которые создают сами программисты. Чрезмерное наследование, магия фреймворков, сотни «шаллоу»-модулей, где каждый вроде бы прост, но вместе они образуют лабиринт.
Именно с внешняя когнитивная нагрузка мы можем и должны бороться.
🔧 Практики снижения лишней когнитивной нагрузки
💡 Вводите промежуточные переменные
Вместо длинных логических условий с кучей && и || лучше завести переменные вроде isSecure, isValid. Такой код легче читать и обсуждать.
🚪 Используйте ранний возврат
Вместо вложенных if с десятком скобок проще проверять исключающие условия и выходить сразу. Это оставляет фокус на «счастливом пути».
🧩 Композиция вместо наследования
Глубокая иерархия контроллеров (SuperUserController -> AdminController -> UserController) превращается в ад. Композиция позволяет изолировать ответственность и избегать неожиданных эффектов.
📦 Глубокие модули вместо множества мелких
Здесь особенно интересно сравнение: проект с 80 «мелкими» классами оказался неподъёмным через год, а проект с 7 «глубокими» классами можно было быстро понять и доработать даже после долгого перерыва.
🖥 Снижение магии фреймворков
Когда бизнес-логика оказывается «спаянной» с конкретным фреймворком, любой новичок тратит месяцы на изучение «магии». Правильный путь — относиться к фреймворку как к библиотеке, держать core-логику независимой.
⚡ Личное мнение
Я часто вижу, как команды тратят время не на решение задач бизнеса, а на дешифровку чужих абстракций. Один из моих pet-проектов подтверждает опыт автора репозитория: поддерживать несколько больших модулей с простым интерфейсом гораздо проще, чем сеть «идеальных» микросервисов, где каждая новая фича задевает четыре сервиса одновременно.
Каждый дополнительный слой, каждая лишняя абстракция — это минус к эффективности команды. В итоге выигрывают те проекты, которые скучны и просты на первый взгляд. Недаром Instagram на старте держался на Python-монолите с Postgres — и это позволяло трем инженерам обслуживать миллионы пользователей.
🚀 Вывод
Когнитивная нагрузка — это не абстракция из учебников, а реальный фактор, определяющий успех проекта. Важно не количество принципов и красивых диаграмм, а то, насколько легко новому человеку понять ваш код. Если через 40 минут он уже вносит правки — значит, вы всё сделали правильно.
🔗 Источники:
- Репозиторий: github.com/zakirullin/cognitive-load