Что такое декларативное программирование и где с ним сталкивается Backend-разработчик?

Ответ

Декларативное программирование — это парадигма, в которой вы описываете что хотите получить в результате, а не как этого достичь. Это контрастирует с императивным подходом (как в Go, C++, Java), где вы пошагово описываете алгоритм действий.

Основные примеры декларативных языков и технологий:

  1. SQL (язык структурированных запросов)

    • Вы описываете, какие данные вам нужны (SELECT name FROM users WHERE age > 30), но не указываете, как базе данных их искать, сканировать таблицы или использовать индексы. Это решает сама СУБД.
  2. HTML/CSS

    • HTML описывает структуру документа (что на странице есть заголовок, абзац, список), а CSS — правила его отображения (какого цвета должен быть текст, какие отступы). Вы не пишете код для отрисовки пикселей на экране.
  3. Языки конфигурации (IaC - Infrastructure as Code)

    • Terraform (HCL), Kubernetes (YAML), Ansible. Вы описываете желаемое состояние инфраструктуры (например, "нужен один сервер с такими-то параметрами и одна база данных"), а инструмент сам определяет, какие действия нужно выполнить, чтобы привести систему в это состояние.
  4. Функциональные языки

    • Языки вроде Haskell или Lisp часто относят к декларативным, так как программа состоит из описания функций и их взаимосвязей, а не из последовательности команд, изменяющих состояние.

Где с этим сталкивается Go-разработчик?

Хотя Go — это в первую очередь императивный язык, backend-разработчик на Go постоянно работает с декларативными системами:

  • Взаимодействие с базами данных через SQL.
  • Работа с DevOps-инструментами: написание YAML-манифестов для Kubernetes или Docker Compose, конфигураций для CI/CD.
  • Создание шаблонов: использование пакета html/template для генерации HTML-страниц, где сам шаблон является декларативным описанием итогового документа.

Ответ 18+ 🔞

Да ты посмотри, какая хуйня творится в мире! Сидишь ты, пишешь на Go, пошагово команды отдаёшь, как робот: "сделай это, потом проверь то, потом запиши сюда". А оказывается, есть целая вселенная, где ты просто заказываешь результат, как в ресторане — "мне салат, но без лука", а как повар там на кухне крошит, тебе похуй. Это и есть декларативное программирование, ёпта!

Вот смотри, живые примеры, чтобы не ебал мозг теорией:

  1. SQL — это ж классика! Ты пишешь: "Дай мне имена всех юзеров, которым за 30". И всё. Ты не бегаешь по таблицам с фонариком, не говоришь базе: "А теперь открой первую строку, посмотри возраст, если подходит — скопируй имя в ведро". Нет, ты просто заказал. А база уже сама решает, через какие индексы прыгать, в каком порядке данные жрать. Красота, блядь!

  2. HTML/CSS — вообще пиздец как декларативно. Ты пишешь в HTML: "тут будет заголовок, тут кнопка". В CSS: "а кнопка эта, блядь, пусть будет синяя и с закруглёнными краями". И браузер, этот долбоёб, сам всё рисует. Ты же не пишешь код, который говорит: "Начни с координат (10,10), нарисуй прямоугольник шириной 100 пикселей, залей его градиентом...". Представил? Да я бы с ума сошел!

  3. Вся эта DevOps-хуйня — Terraform, Kubernetes. Тут вообще цирк. Ты пишешь в YAML файлике: "Хочу 5 подов, чтобы у каждого было 2 гига памяти и они общались с этой базой". И всё. А система, эта мартышлюшка, сама бегает, смотрит — ага, сейчас только 3 пода, надо ещё 2 слепить. Или один сдох — она ему нового клонирует. Ты не управляешь процессом, ты объявляешь желаемое. Как король, блядь: "Хочу, чтобы в моём королевстве был мир и 5 подов!". А как именно паханы на местах этот мир обеспечивают — это их проблемы.

  4. Функциональные языки — Haskell там, Lisp. Это для совсем ебнутых, но идея та же. Ты больше описываешь, что такое "хорошо" и как данные связаны, а не как их тыкать палкой, чтобы они превратились в результат.

А где это всё Go-разработчику встречается, спросишь ты?

Да везде, сука! Хоть Go и язык императивный, "делай-раз-два", но он же живёт не в вакууме.

  • Базы данных — любой нормальный бекенд лезет в базу. И как он это делает? Правильно, пишет SQL-запрос — чистейшей воды декларативную хуйню посреди своего императивного кода.
  • DevOps и развертывание — если ты не конченый динозавр, то ты хоть раз видел эти deployment.yaml, docker-compose.yml. Ты в них и описываешь, ЧТО ты хочешь от кластера. Это и есть декларативная конфигурация, ебать её в сраку.
  • Шаблоны (templates) — пакет html/template в Go. Ты создаёшь файл, где декларативно описываешь: "Вот тут будет заголовок, вот тут список, а данные подставятся вот сюда". А потом просто выполняешь шаблон с данными. Ты не строишь HTML строку вручную через fmt.Sprintf, ты описываешь конечный вид.

Короче, суть в чём: как бы ты ни любил в Go всё контролировать и явно прописывать каждый шаг, мир вокруг тебя давно живёт по принципу "опиши цель и получи результат". И игнорировать это — всё равно что пытаться собрать IKEA, не глядя на картинку, а только читая текст "поверни деталь Б нахуй в сторону детали А". Иногда проще просто показать на картинку и сказать: "Хочу как тут, блядь!".