Содержание
  1. Что такое хардкод простыми словами
  2. Почему хардкод — это плохо
  3. Пример хардкода: плохо → хорошо
  4. Хардкод и магические числа
  5. Как избежать хардкода: константы, конфиги и переменные окружения
  6. Когда хардкод допустим
  7. Частые вопросы о хардкоде
СправочникОбновлено · 09.2026

Что такое хардкод: избегаем плохого кода в программировании

28 декабря 2023 · 6 минут чтения

Хардкод (от англ. hard code, «жёстко закодировать») — это когда конкретное значение вписывают прямо в исходный код программы, вместо того чтобы вынести его в переменную, константу или конфигурацию. Пароль, IP-адрес, ставка налога, путь к файлу, число 151 в условии — если это «зашито» в код и меняется только правкой самого кода, перед вами хардкод. В большинстве случаев это антипаттерн: код становится жёстким, хрупким и опасным в поддержке.

Коротко, что важно понять о хардкоде:

  • это встраивание данных прямо в код вместо конфигурации или переменной;
  • главная беда — любое изменение значения требует править и пересобирать программу;
  • хардкод паролей и API-ключей — прямая дыра в безопасности;
  • лечится константами, конфиг-файлами и переменными окружения;
  • в прототипах и для настоящих неизменных констант он допустим.

Если вы только осваиваете разработку — например, через вайбкодинг в Cursor или в Claude Code, — понимание хардкода отделяет черновой скрипт от кода, который не стыдно отдать в прод.

Что такое хардкод простыми словами

Хардкод — это вставка конкретных значений напрямую в программу так, что изменить их можно только через правку кода. По определению из Википедии, это «практика встраивания данных непосредственно в исходный код программы или другой исполняемый объект».

Представьте номер телефона поддержки, вписанный в 15 файлов сайта. Меняется номер — программисту приходится искать и править все 15 мест и заново выкатывать сайт. Если бы номер лежал в одном конфигурационном файле, обновление заняло бы одну строку. Разница между этими двумя мирами и есть цена хардкода.

Глагол, который вы услышите в командах: «захардкодить», «это захардкожено». Значения, которые чаще всего хардкодят по неопытности, — числовые лимиты, ставки и коэффициенты, строки интерфейса, пути к папкам, адреса серверов и, что хуже всего, секреты.

Почему хардкод — это плохо

Хардкод считается антипаттерном не из вкусовщины, а из-за конкретных последствий.

  • Трудность поддержки. Захардкоженное значение живёт в коде, и чтобы его поменять, нужен программист, редактор и пересборка — вместо правки одной строки в настройках.
  • Дублирование и рассинхрон. Одно и то же число часто повторяется в разных местах. Поменяли в одном, забыли в трёх — получили плавающий баг, который тяжело поймать.
  • Низкая гибкость. Программа с зашитым путём C:\Program Files\App сломается, если пользователь ставит её на другой диск; код с зашитой папкой «My Documents» падает в локализованной Windows, где папка называется «Documenti».
  • Дыры в безопасности. Пароли и API-ключи, вписанные в код, утекают вместе с ним в публичные репозитории и создают скрытые бэкдоры. Это одна из самых частых причин компрометации проектов.

Именно за эти симптомы захардкоженный код часто разрастается в «спагетти-код» — запутанный и трудно поддерживаемый. Хардкодинг закономерно попал в список классических грехов разработчика на Хабре.

Пример хардкода: плохо → хорошо

Начнём с исходного примера — площади квадрата на Python. Сторона зашита прямо в функцию:

# Плохо: значение захардкожено внутри функции
def calculate_square_area():
    side_length = 5          # поменять размер = править код
    return side_length ** 2

print(calculate_square_area())

Стоит вынести значение в параметр — и функция становится переиспользуемой для любого квадрата:

# Хорошо: значение приходит снаружи
def calculate_square_area(side_length):
    return side_length ** 2

print(calculate_square_area(5))
print(calculate_square_area(12))

То же самое с бизнес-логикой. Скидка «0.9» в коде ничего не говорит читателю — это магическое число:

# Плохо
def final_price(price):
    return price * 0.9      # что за 0.9?

# Хорошо
DISCOUNT_RATE = 0.10        # скидка 10% постоянному клиенту
def final_price(price):
    return price * (1 - DISCOUNT_RATE)

На JavaScript типичный хардкод — «числа из воздуха» в таймерах и лимитах:

// Плохо
setTimeout(retry, 300);

// Хорошо
const RETRY_DELAY_MS = 300;
setTimeout(retry, RETRY_DELAY_MS);

Хардкод и магические числа

Магическое число — частный случай хардкода: числовой литерал без имени и объяснения прямо в логике (151, 0.9, 86400). Проблема не в самом числе, а в потерянном контексте: через месяц ни автор, ни коллега не вспомнят, что оно значит и можно ли его трогать. Лечение простое — дать значению имя-константу с единой точкой правды:

// Плохо: что за 151?
const caughtAll = (n) => n === 151;

// Хорошо: смысл виден, правится в одном месте
const TOTAL_POKEMON = 151;
const caughtAll = (n) => n === TOTAL_POKEMON;

Константы принято писать в ВЕРХНЕМ_РЕГИСТРЕ и держать вверху файла или в отдельном модуле — так их легко найти и поменять. Это и есть единый источник истины: правите число на одной строке, а не ищете его по всему проекту.

Как избежать хардкода: константы, конфиги и переменные окружения

Путь выноса значения из кода: от литерала к правильному месту хранения
Путь выноса значения из кода: от литерала к правильному месту хранения

Выбор инструмента зависит от того, что за значение вы выносите.

Тип значения Куда выносить Пример
Неизменное в рамках кода Именованная константа MAX_RETRIES = 3
Зависит от среды (dev/prod) Конфиг-файл (.env, config.json) URL API, порт, таймауты
Секрет (пароль, ключ, токен) Переменная окружения / секрет-хранилище DATABASE_URL, API_KEY
Текст интерфейса Файлы локализации (i18n) Строки под перевод

Секреты никогда не должны попадать в код. Вместо строки подключения с паролем внутри —

# Плохо: пароль в коде и в истории git
db = connect("postgres://admin:P@ssw0rd@10.0.0.5:5432/app")

# Хорошо: значение берётся из окружения
import os
db = connect(os.environ["DATABASE_URL"])

Сам DATABASE_URL задаётся в файле .env, который добавлен в .gitignore и не уезжает в репозиторий. Для разных сред — свои значения переменных окружения, а код остаётся одним и тем же. Практический порядок действий, когда наткнулись на захардкоженное значение: найдите литерал → дайте ему имя → решите, меняется ли он по среде (если да — в конфиг) → секрет ли это (если да — в переменную окружения). Этот путь показан на схеме ниже.

для id="промпт" блок о бесплатном курсе не обнаружен

Когда хардкод допустим

Бороться с хардкодом до фанатизма не нужно — иногда он оправдан:

  • Настоящие константы. Физические и математические величины (число π, число секунд в минуте, количество дней в неделе) не меняются — выносить их в конфиг бессмысленно, достаточно именованной константы.
  • Быстрые прототипы и одноразовые скрипты. Когда важна скорость проверки гипотезы, а код проживёт один день, ранняя параметризация — преждевременная оптимизация.
  • Значения, у которых по смыслу нет альтернатив. Номер версии, зафиксированный формат, служебные метки.

Граница простая: если значение может измениться, зависит от среды или является секретом — выносим. Если оно неизменно по своей природе и используется в одном месте — жёсткое значение с понятным именем допустимо.

Частые вопросы о хардкоде

Что такое хардкод простыми словами?

Это значение (число, строка, пароль, путь), вписанное прямо в код так, что изменить его можно только правкой и пересборкой программы, а не через настройки.

Почему хардкод считается плохой практикой?

Он усложняет поддержку, плодит дублирование и рассинхрон, снижает гибкость и создаёт риски безопасности, когда в код попадают пароли и ключи.

Чем хардкод отличается от магического числа?

Магическое число — частный случай хардкода: безымянный числовой литерал в логике. Хардкодом могут быть и строки, пути, секреты, а не только числа.

Когда хардкод допустим?

Для настоящих неизменных констант, в быстрых прототипах и одноразовых скриптах, а также для значений, у которых по смыслу нет вариативности.

Как убрать хардкод из кода?

Вынести значение в именованную константу; параметры среды — в конфиг-файл; секреты — в переменные окружения; тексты интерфейса — в файлы локализации.

Хардкод — не преступление, а сигнал: значение стоит вынести туда, где его удобно и безопасно менять. Освоить такие привычки письма кода помогает практика — в том числе с ИИ-ассистентами вроде Claude Code, которые подсказывают, где логику пора вынести из «зашитого» вида.


Читайте также

3 материала