Учебное пособие по Terraform для начинающих: инфраструктура как код от первого файла до модулей

  1. Главная
  2. Блог
  3. DevOps

DevOps

Учебное пособие по Terraform для начинающих: Инфраструктура как код от первого файла до модулей

Изучите Terraform без облачной учетной записи и неожиданных счетов. Начните с локальных файлов, чтобы понять план, применение и состояние, а затем переходите к реальным облачным ресурсам, модулям и рабочему процессу, безопасному для команд.

10 мин чтения
Учебное пособие по Terraform для начинающих: инфраструктура как код от первого файла до модулей

Главное

  • Terraform создает и изменяет инфраструктуру из текстовых файлов, которые вы можете хранить в Git.
  • Основной рабочий процесс init, plan, apply и plan показывает изменения до того, как они произойдут.
  • В файле состояния записано, чем управляет Terraform. Защитите его и никогда не передавайте в Git.
  • Используйте модули для повторного использования шаблонов и удаленного состояния с блокировкой при работе в команде.

Щелчок по облачной консоли подходит для одного сервера. Он перестает работать, когда вам нужна одна и та же настройка в процессе подготовки и производства или когда кто-то спрашивает, кто изменил правило брандмауэра в марте прошлого года. В этом руководстве по Terraform для начинающих показан лучший способ: описать свою инфраструктуру в коде и позволить инструменту воплотить ее в жизнь.

Большинство учебных пособий начинаются с облачной учетной записи, что увеличивает риск выставления счетов еще до того, как вы что-либо узнаете. Начнем с провайдера Terraform local, который просто создает файлы на вашем компьютере, поэтому ошибки ничего не стоят. Эти примеры и образец вывода являются стандартными иллюстрациями, которые мы не использовали для этой статьи, а точные формулировки зависят от версии.

Что такое Терраформ?

Terraform — это инструмент «инфраструктура как код» (IaC) от HashiCorp. Вы пишете файлы конфигурации на HCL, языке конфигурации HashiCorp, описывая желаемый конечный результат. Затем Terraform решает, что нужно создать, изменить или удалить, чтобы добиться желаемого.

Он взаимодействует с платформами через плагины, называемые провайдерами. Существуют поставщики для AWS, Azure, Google Cloud, Kubernetes, GitHub, Cloudflare и многих других, поэтому вы можете использовать один рабочий процесс для всех них.

Следует знать одну вещь: в 2023 году HashiCorp перевела Terraform на лицензию Business Source. Затем сообщество создало OpenTofu, форк с открытым исходным кодом, который использует очень похожие команды и конфигурацию. То, что вы узнаете здесь, во многом применимо к обоим.

Почему инфраструктура как код?

Вопрос Ручная работа с консолью Терраформировать
Кто что изменил? Трудно узнать История Git
Можем ли мы скопировать стадию в производство? Осторожное нажатие Повторное использование кода
Что даст это изменение? Ты узнаешь потом terraform plan показывает вам первым
Может ли кто-нибудь просмотреть это? Не легко Обычный запрос на вытягивание
Аварийное восстановление Зависит от памяти людей Воссоздание из кода, а также резервные копии данных

Terraform также является декларативным. Вы утверждаете, что «серверов должно быть три», а не «создайте сервер три раза». Если два уже существуют, он добавляет один. Сценарий, который просто повторяет свои шаги, может в конечном итоге создать еще три.

Установить Терраформ

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

terraform -version

Создайте пустую папку для проекта. Terraform считывает каждый .tf файл в текущей папке, поэтому одна папка соответствует одной конфигурации.

Ваша первая конфигурация

Создайте файл с именем main.tf:

terraform {
  required_providers {
    local = {
      source  = "hashicorp/local"
      version = "~> 2.5"
    }
  }
}

resource "local_file" "greeting" {
  filename = "${path.module}/hello.txt"
  content  = "Hello from Terraform\n"
}

Посмотрите на блок resource, почти все, что вы пишете, имеет эту форму. local_file — это тип ресурса, а greeting — ваше собственное имя для него внутри конфигурации. Вместе они образуют его адрес: local_file.greeting. Аргументы внутри описывают то, что вы хотите.

Рабочий процесс: инициализация, планирование, применение

терраформирование инициализации

Это подготовит папку и загрузит запрошенных вами поставщиков. Запустите его один раз при запуске и снова при каждом добавлении поставщика или модуля. Он также создает файл .terraform.lock.hcl, в котором записаны точные версии поставщика. Зафиксируйте этот файл в Git.

terraform init

план терраформирования

Это сравнивает ваш код с тем, что существует, и показывает запланированные изменения, ничего не трогая:

terraform plan

# local_file.greeting will be created
+ resource "local_file" "greeting" {
    + content  = "Hello from Terraform\n"
    + filename = "./hello.txt"
  }

Plan: 1 to add, 0 to change, 0 to destroy.

Изучите символы, потому что вы прочитаете много планов:

Символ Значение
+ Создать
~ Обновление на месте
- Уничтожить
-/+ Уничтожить и воссоздать

применить терраформирование

Это снова отобразит план, запрашивает подтверждение и вносит изменения:

terraform apply

Появятся типы yes и hello.txt. Теперь снова запустите terraform plan. Он не должен сообщать об изменениях, поскольку реальность уже соответствует вашему коду. Это свойство, при котором его повторное выполнение не приводит к дальнейшим изменениям, называется идемпотентностью.

Изменение и разрушение

Отредактируйте строку content и запустите terraform plan. Terraform замечает разницу и предлагает изменения. Для этого ресурса он заменяет файл. Обратите внимание на замены в реальной инфраструктуре, поскольку воссоздание базы данных может означать потерю данных.

Затем удалите hello.txt вручную и запланируйте заново. Terraform замечает, что он отсутствует, и предлагает воссоздать его. Разница между вашим кодом и реальностью называется дрейфом, и ее обнаружение является одним из основных преимуществ этого инструмента.

Чтобы удалить все, чем управляет эта конфигурация, запустите:

terraform destroy

Переменные и выходные данные

Жестко закодированные значения не позволяют повторно использовать код. Входные переменные делают конфигурацию гибкой, а выходные возвращают полезные значения:

# variables.tf
variable "environment" {
  type        = string
  description = "Deployment environment"
  default     = "dev"

  validation {
    condition     = contains(["dev", "staging", "prod"], var.environment)
    error_message = "Use dev, staging or prod."
  }
}

# main.tf
resource "local_file" "config" {
  filename = "${path.module}/${var.environment}.txt"
  content  = "environment=${var.environment}\n"
}

# outputs.tf
output "config_path" {
  value = local_file.config.filename
}

Задайте значения в командной строке или сохраните их в файле с именем terraform.tfvars, который загружается автоматически:

terraform apply -var="environment=staging"

Использование local_file.config.filename в выводе также определяет, как ресурсы ссылаются друг на друга. Terraform читает эти ссылки, чтобы определить правильный порядок создания объектов.

Терраформировать государство

После подачи заявки вы найдете файл с именем terraform.tfstate. Это запись того, чем Terraform управляет, сопоставляя ваш код с реальными объектами. Без него Terraform не знал бы, что local_file.greeting — это конкретный файл.

Здесь важны три правила:

  1. Никогда не передавайте состояние в Git. Оно может содержать пароли и другие секреты в виде обычного текста.
  2. Не редактируйте его вручную. Используйте такие команды, как terraform state list и terraform state mv.
  3. Используйте удаленный сервер для командных проектов. Общий сервер хранит состояние централизованно и блокирует его, поэтому два человека не могут подать заявку одновременно.

Вот типичный бэкэнд, использующий Amazon S3, с заранее созданной корзиной:

terraform {
  backend "s3" {
    bucket       = "my-company-terraform-state"
    key          = "shop/prod/terraform.tfstate"
    region       = "ap-south-1"
    encrypt      = true
    use_lockfile = true
  }
}

Совет: Начинайте каждый проект с .gitignore, исключая .terraform/, *.tfstate, *.tfstate.* и любые *.tfvars файлы, содержащие секреты.

Настоящий облачный ресурс

Рабочий процесс не меняется при переходе в облако. Вот корзина S3 на AWS. Сначала проверьте цены и уничтожьте все, что вы создадите во время тренировки:

provider "aws" {
  region = "ap-south-1"
}

resource "aws_s3_bucket" "reports" {
  bucket = "my-unique-reports-bucket-2026"

  tags = {
    Environment = var.environment
    ManagedBy   = "terraform"
  }
}

Terraform получает учетные данные из настроек AWS CLI или переменных среды. Никогда не записывайте ключи доступа в файл .tf.

Модули

Модуль — это просто папка с файлами Terraform, которую вы можете вызывать с помощью различных входных данных. Он работает во многом как функция, позволяя вам один раз определить шаблон и использовать его повторно:

project/
  main.tf
  modules/
    reports_bucket/
      main.tf
      variables.tf
      outputs.tf
module "staging_reports" {
  source      = "./modules/reports_bucket"
  environment = "staging"
}

module "prod_reports" {
  source      = "./modules/reports_bucket"
  environment = "prod"
}

В общедоступном реестре Terraform также есть готовые модули, но прочитайте их, прежде чем полагаться на них, и закрепите версию. Не создавайте модули слишком рано. Подождите, пока вы не повторите шаблон хотя бы дважды.

Безопасный командный рабочий процесс

  1. Создайте ветку и измените файлы .tf. Если вам нужно освежить знания, ознакомьтесь с нашим руководством по Git для начинающих.
  2. Запустите terraform fmt и terraform validate.
  3. Откройте запрос на включение с прикрепленными к нему выводами terraform plan для проверки.
  4. После утверждения примените сохраненный план из одного контролируемого места, в идеале — из конвейера.

Сохранение плана гарантирует, что вы примените именно то, что было проверено:

terraform plan -out=tfplan
terraform apply tfplan

Это естественным образом вписывается в CI/CD и GitHub Actions. Terraform обычно выделяет кластер, а такие инструменты, как Kubernetes, затем запускают приложения поверх него.

Распространенные ошибки

  • Подача заявки без прочтения плана. Один -/+ в базе данных может оказаться очень дорогим сюрпризом.
  • Сохранение состояния на одном ноутбуке. Потеряйте этот ноутбук, и Terraform потеряет контроль над вашей инфраструктурой.
  • Внесение изменений в консоль вручную. Они вызывают дрейф, и следующее применение может их отменить.
  • Использование незакрепленных версий. Закрепите версии поставщика и модуля, чтобы обновления выполнялись намеренно.
  • Использование одной огромной конфигурации. Разделение по среде или системе ограничивает ущерб от любой ошибки.

Итоги

Теперь вы увидели идеи, лежащие в основе почти всех работ Terraform: объявить ресурсы, просмотреть план, применить его и защитить состояние. Практикуйтесь с поставщиком local до тех пор, пока рабочий процесс не станет естественным, а затем управляйте одним небольшим реальным ресурсом в учетной записи бесплатного уровня. Включайте удаленное состояние и модули, если в проекте участвует более одного человека или более одной среды.

Часто задаваемые вопросы

Для чего используется Терраформ?

Terraform используется для создания и управления инфраструктурой, такой как серверы, сети, базы данных и DNS, путем описания ее в коде, а не настройки вручную.

Терраформ бесплатен?

Terraform CLI можно использовать бесплатно в соответствии с лицензией Business Source, хотя условия ограничивают некоторые конкурирующие виды коммерческого использования. HCP Terraform имеет платные уровни, а OpenTofu имеет открытый исходный код.

В чем разница между Terraform и Ansible?

Terraform в основном предоставляет инфраструктуру декларативно. Ansible в основном настраивает программное обеспечение на существующих машинах. Многие команды используют оба варианта: сначала Terraform, а потом Ansible.

Что такое файл состояния Terraform?

Это запись, сопоставляющая вашу конфигурацию с реальными ресурсами. Terraform использует его для разработки изменений. Он может хранить секреты, поэтому храните его в надежном месте и не допускайте попадания в Git.

Нужно ли мне знать программирование, чтобы изучить Terraform?

Не совсем. HCL прост и декларативен. Понимание платформы, которой вы управляете, например сети AWS, обычно сложнее, чем сам язык.

Продолжайте учиться

Работайте с Stack Quora

Нужна помощь с тестированием, WordPress или SEO?

Мы помогаем командам выпускать лучшее программное обеспечение и развивать свои сайты. Расскажите нам, над чем вы работаете, и мы предложим четкий следующий шаг.

Продолжайте читать

Больше руководств по тестирование, искусственный интеллект и современные разработки

Понравилась эта статья? Выберите тему и сразу приступайте к нашим новейшим руководствам.

Искусственный интеллект

Объяснение галлюцинаций искусственного интеллекта: почему языковые модели все выдумывают и как их уменьшить

Галлюцинации ИИ объяснили: что это такое, почему языковые модели их создают, распространенные типы, как уменьшить их с помощью заземления и подсказо…

Читать статью →
DevOps

Объяснение переменных среды: файлы .env, секреты и правильно выполненная конфигурация

Переменные среды объясняются на примерах Python, которые мы запускали: их чтение и установка, почему каждое значение является строкой, файлы .env, н…

Читать статью →
Разработка ПО

Объяснение ограничения скорости API: алгоритмы, заголовки и обработка ошибок 429

Ограничение скорости API объясняется с помощью проведенного нами моделирования: сегмент токенов, фиксированное окно, скользящее окно, 429 ответов, з…

Читать статью →
Автоматизация тестирования

Издевательство в Python: unittest.mock, патч и ошибки, из-за которых тесты лгут

Издевательство на Python с помощью unittest.mock, протестировано: Mock и return_value, Side_effect, исправление использования имени, спецификация и …

Читать статью →
Тестирование ПО

Объяснение покрытия кода: покрытие линий или ветвей и что на самом деле означает 100%

Покрытие кода объяснено с помощью реального запуска покрытия.py: покрытие строк, ветвей и условий, чтение отчета, почему 100%-ное покрытие все еще м…

Читать статью →
Базы данных и SQL

DELETE, TRUNCATE и DROP в SQL: различия, откат и когда использовать каждый из них

Объяснение DELETE, TRUNCATE и DROP на примере протестированного SQL: что каждый из них удаляет, откат, триггеры, сброс идентификаторов, скорость и ч…

Читать статью →
Базы данных и SQL

Объяснение представлений SQL: создавайте, используйте и избегайте ловушек, с примерами

Представления SQL, объясненные с помощью запросов, которые мы выполняли: создание представления, результаты в реальном времени, скрытие столбцов, пр…

Читать статью →
Разработка ПО

Интерфейс TypeScript и тип: реальные различия, протестированные с помощью компилятора

Интерфейс TypeScript против типа, проверенный реальным компилятором: что могут делать оба, что может делать только один, слияние объявлений, расшире…

Читать статью →
Разработка ПО

Объяснение Python *args и **kwargs: гибкие функции с понятными примерами

Python *args и **kwargs, объясненные с помощью кода, который мы запускали: упаковка и распаковка, порядок параметров, аргументы только по ключевым с…

Читать статью →
Разработка ПО

Лямбда-функции Python: синтаксис, реальное использование и когда их не следует использовать

Лямбда-функции Python, объясненные с помощью кода, который мы запускали: синтаксис, сортировка с помощью ключа, карты и фильтра, замыкания, ловушка …

Читать статью →
Искусственный интеллект

Что такое ИИ-агенты? Как они работают: можно запустить простой цикл агента

Что такое агенты ИИ? Простое руководство по циклу агента, инструментам, памяти и ограничениям, с небольшим циклом Python, который мы запустили, реал…

Читать статью →
DevOps

Мониторинг и наблюдаемость: реальная разница с журналами, метриками и трассировками

Объяснение мониторинга и наблюдаемости: известные и неизвестные сбои, журналы, метрики и трассировки, пошаговое руководство по инцидентам при оформл…

Читать статью →
DevOps

Docker Volumes против Bind Mounts: правильное сохранение данных контейнера

Объяснение томов Docker и монтирования привязки: почему исчезают данные контейнера, именованные тома, монтирование привязки, tmpfs, примеры создания…

Читать статью →
Автоматизация тестирования

TDD против BDD: ключевые различия, одна функция, созданная для обоих способов, и когда использовать каждый

TDD и BDD объясняются с помощью одной функции скидки, созданной в обоих направлениях: красно-зеленый рефакторинг с кодом, который мы запускали, сцен…

Читать статью →
Тестирование ПО

Пользовательское приемочное тестирование (UAT): процесс, контрольный список и реальные примеры

Приемочное тестирование пользователей объяснило: кто его проводит, чем оно отличается от контроля качества, семиэтапный процесс, шаблон тестового сц…

Читать статью →
Базы данных и SQL

Объяснение значений NULL в SQL: IS NULL, COALESCE, NULLIF и ловушки, которых следует избегать

Значения SQL NULL объяснены с помощью запросов, которые мы выполнили: трехзначная логика, IS NULL, COALESCE, NULLIF, как агрегаты, соединения и сорт…

Читать статью →
Базы данных и SQL

Оператор SQL CASE WHEN: синтаксис, реальные примеры и распространенные ошибки

SQL CASE WHEN объяснен с помощью запросов, которые мы выполняли: простые формы и формы для поиска, порядок условий, повороты с помощью SUM, трюки CO…

Читать статью →
Разработка ПО

Что такое JWT? Веб-токены JSON, объясненные на рабочем примере

Что такое JWT? Объяснение JSON Web Tokens: три части: токен, созданный и измененный в коде, который мы запускали, JWT и сеансы, хранилище, токены об…

Читать статью →
Разработка ПО

Объяснение цикла событий JavaScript: стек вызовов, микрозадачи и таймеры с примерами

Цикл событий JavaScript объясняется с помощью кода, который мы запускали: стек вызовов, очереди задач и микрозадач, почему setTimeout 0 не является …

Читать статью →
Разработка ПО

Генераторы Python и объяснение доходности: экономьте память с помощью реальных примеров

Генераторы Python и доходность, объясненные с помощью кода, который мы запускали: как они приостанавливаются и возобновляются, измеряют экономию пам…

Читать статью →
Искусственный интеллект

Что такое вложения? Простое объяснение векторов и косинусного сходства

Что такое вложения? Простое руководство по векторам, косинусному подобию и семантическому поиску с небольшим примером, который мы использовали, общи…

Читать статью →
DevOps

Сине-зеленое и канареечное развертывание: различия, компромиссы и как выбрать

Объяснение сине-зеленого и канареечного развертывания: как каждый из них работает, стоимость, риски и откат, стабильное группирование пользователей,…

Читать статью →
Автоматизация тестирования

Ненадежные тесты: что их вызывает и как их исправить навсегда

Ненадежные тесты объясняются на демонстрациях, которые мы запускали: основные причины, способы подтверждения и диагностики, правильные исправления в…

Читать статью →
Тестирование ПО

Нагрузочное тестирование и стресс-тестирование: различия, метрики и примеры k6

Объяснение нагрузочного и стресс-тестирования: что доказывает каждое из них, тесты на всплески и выдержки, важные метрики, почему средние значения в…

Читать статью →
Тестирование ПО

Тестовый пример и тестовый сценарий: ключевые различия, примеры и когда использовать каждый

Объяснение тестового случая и тестового сценария: четкие определения, параллельная таблица, одна функция сброса пароля, взятая из сценариев в случаи…

Читать статью →
Базы данных и SQL

Оптимизация SQL-запросов: чтение планов выполнения и исправление медленных запросов с указанием времени

Оптимизация SQL-запросов проверена на миллионе строк: читайте планы выполнения, добавляйте правильные индексы, исправляйте неразмещаемые фильтры, ис…

Читать статью →
Базы данных и SQL

SQL UNION против UNION ALL: различия, примеры и проверка производительности

SQL UNION и UNION ALL объяснены с помощью запросов, которые мы выполнили: дубликаты, правила, которым следуют оба, реальная ошибка данных, измеренна…

Читать статью →
Разработка ПО

Учебное пособие по API JavaScript Fetch: GET, POST, обработка ошибок и тайм-ауты

Учебное пособие по API JavaScript Fetch, протестированное на локальном сервере: GET и POST, почему не выдается ошибка 404, многоразовый помощник, ст…

Читать статью →
Разработка ПО

Обработка файлов Python: чтение, запись, CSV, JSON и pathlib с примерами

Обработка файлов Python объясняется с помощью кода, который мы запускали: открытые режимы, чтение больших файлов, CSV, JSON, pathlib, двоичные файлы…

Читать статью →
Разработка ПО

Классы и объекты Python: учебник ООП с реальными примерами

Классы и объекты Python, объясненные с помощью кода, который мы запускали: __init__, методы, атрибуты класса и экземпляра, наследование, свойства, м…

Читать статью →
Искусственный интеллект

Что такое большая языковая модель? Как работают LLM, объяснено без шумихи

Что такое большая языковая модель? LLM объясняется простым языком: токены, встраивания, внимание, обучение, температурные и контекстные окна, крошеч…

Читать статью →
DevOps

Команды Linux для начинающих: основное руководство по терминалу с примерами

Команды Linux для начинающих, сгруппированные по задачам: навигация, файлы, просмотр журналов, grep, каналы, разрешения, процессы и архивы, с практи…

Читать статью →
Автоматизация тестирования

Selenium vs Playwright: ключевые различия, сравнение кода и что выбрать

Сравнение Selenium и Playwright: архитектура, ожидание, поддержка браузера и языка, отладка, одинаковый тест в обоих инструментах, советы по миграци…

Читать статью →
Тестирование ПО

Разделение эквивалентности: метод проектирования тестов, объясненный на рабочих примерах

Объяснение эквивалентного разделения: как найти действительные и недействительные разделы, рабочие примеры для возрастов, паролей и купонов, проведе…

Читать статью →
Тестирование ПО

Серьезность и приоритет в тестировании программного обеспечения: различия, матрица и реальные примеры

Объяснение серьезности и приоритета при тестировании программного обеспечения: четкие определения, четырехсторонняя матрица с примерами, шкалы уровн…

Читать статью →
Базы данных и SQL

Учебное пособие по подзапросам SQL: типы, коррелирующие подзапросы и EXISTS с примерами

Руководство по подзапросам SQL с выполненными нами запросами: скалярные подзапросы, IN, FROM и SELECT, коррелированные подзапросы, EXISTS, ловушка N…

Читать статью →
Базы данных и SQL

Объяснение транзакций SQL и ACID: COMMIT, ROLLBACK и уровни изоляции

Транзакции SQL и ACID, объясненные с помощью банковского перевода, который мы выполнили: COMMIT, ROLLBACK, точки сохранения, блокировки, уровни изол…

Читать статью →
Разработка ПО

Git Commands Cheat Sheet: The Commands You Actually Use, With Examples

Шпаргалка по командам Git, сгруппированная по задачам: настройка, промежуточный этап, ветки, удаленные устройства, тайник, история и исправление оши…

Читать статью →
Разработка ПО

Объяснение промисов в JavaScript: then, catch, Promise.all и распространенные ошибки

Обещания JavaScript, объясненные с помощью кода, который мы запускали: состояния, цепочки then и catch, обработка ошибок, Promise.all, allSettled, R…

Читать статью →
Разработка ПО

Учебное пособие по словарю Python: методы, примеры и общие шаблоны

Учебное пособие по словарю Python с кодом, который мы выполнили: создание, чтение и обновление словарей, ключевые методы, слияние, понимание, шаблон…

Читать статью →
Искусственный интеллект

Что такое РАГ? Генерация с расширенным поиском, объясненная на рабочем примере

Что такое РАГ? Retrieval-augmented generation explained step by step: indexing, chunking, embeddings, retrieval, a small working Python example, eva…

Читать статью →
DevOps

Учебное пособие по Terraform для начинающих: инфраструктура как код от первого файла до модулей

Учебное пособие по Terraform для начинающих: начните без облачной учетной записи, изучите инициализацию, планирование и применение, затем переменные…

Читать статью →
DevOps

Docker и Kubernetes: ключевые различия, как они работают вместе и что вам нужно

Объяснение Docker и Kubernetes: что делает каждый из них, одно и то же приложение работает с обоими, сравнение Docker Compose и Swarm, изменение doc…

Читать статью →
Автоматизация тестирования

Учебное пособие по Pytest для начинающих: фикстуры, параметризация и реальные примеры

Учебное пособие по pytest для начинающих с тестами, которые мы запускали на pytest 9.2: утверждения, фикстуры, параметризация, conftest, маркеры, tm…

Читать статью →
Тестирование ПО

Жизненный цикл тестирования программного обеспечения (STLC): 6 этапов, критерии входа и выхода, пример

Объясняется жизненный цикл тестирования программного обеспечения: шесть этапов STLC с критериями входа и выхода, результаты, пример проработанной фу…

Читать статью →
Разработка ПО

Git merge vs rebase: отличия, примеры и когда что использовать

Git merge vs rebase с реальным выводом log, сравнительной таблицей, золотым правилом rebase и безопасным рабочим процессом для команды.

Читать статью →
Разработка ПО

Генераторы списков в Python: синтаксис, примеры и когда их избегать

Генераторы списков в Python: синтаксис, фильтры, if-else, вложенные циклы, измеренное время и случаи, когда обычный цикл for лучше.

Читать статью →
Базы данных и SQL

SQL JOIN: объяснение с примерами (Inner, Left, Right, Full)

Разберите SQL JOIN шаг за шагом на примерах таблиц и запросов: INNER, LEFT, RIGHT, FULL, CROSS и SELF, а также частые ошибки и советы по производите…

Читать статью →