
В этой статье отвечу на три вопроса:
-
Какие существуют виды языков программирования;
-
Почему нужно сначала изучить SQL;
-
Как учить SQL бесплатно.
Если вы только выбираете язык программирования или уже программируете, но не уверены в своём выборе — эта статья для вас. Мы рассмотрим, какие бывают виды языков программирования, почему данные — это основа любой программы, как эти данные хранятся и как с ними работать. В конце статьи я приведу 5 бесплатных ресурсов, которые сам использовал для изучения SQL.
Это моя первая статья на Хабре, так что буду рад вашим комментариям и замечаниям.
Навигация:
Об авторе

Никита
Автор курсов по программированию, Senior Backend разработчик. До IT открывал кофейни, обучал людей в ресторанах и занимался дизайном.
Я пишу про IT уже больше 2 лет в виде коротких заметок, которые можно прочитать за чашечкой кофе. Такие посты я называю «чашки кода». Сначала я рефлексировал о своём опыте в IT, затем писал про новости в этой сфере, а когда мне начали задавать одни и те же вопросы, я стал писать посты‑ответы. Три самых популярных вопроса были: «С чего начать программировать», «Какой язык выбрать» и «Как учить SQL». На все три вопроса я ответил в одном посте, который впоследствии я стал пересылать так часто, что даже запомнил ссылку на него. А сейчас пришла пора написать полноценную статью.
Виды языков программирования
Все языки программирования можно разделить на три группы: машинные, ассемблерные и высокоуровневые. С каждым уровнем мы добавляем абстракции от уровня «железа». Абстракция — это приём, при котором сложная система скрывается за понятным способом взаимодействия. Например, автоматическая коробка передач в машине добавляет нам простую абстракцию. Нам не нужно вручную переключаться между передачами — это происходит автоматически, за счёт абстракции. Другой пример: раньше люди делали фото на плёнку, проявляли её и получали фотографию. Сейчас есть полароиды, которые делают фото всего за одно нажатие кнопки и моментально печатают его. Такие механические действия скрыты за простой абстракцией.
В программировании абстракции встречаются постоянно. В высокоуровневых языках мы не думаем, как работает память компьютера, как конвертировать биты в символы и о множестве других проблем. Это накладывает ограничения. Например, скорость программы будет ниже, но процесс разработки — быстрее. Иногда абстракции не могут решить проблему, а наоборот усложняют понимание, о чём говорит Кевлин Хенни:
Любую проблему можно решить путём введения дополнительного уровня абстракции, кроме проблемы слишком большого количества уровней абстракций.
В итоге у нас есть три уровня языков программирования:
-
Высокоуровневые (High‑level) — языки, близкие к человеческому, обеспечивающие абстракцию от деталей «железа». Удобны для разработки сложных программ.
-
Ассемблерные (assembly) — низкоуровневые языки, представляющие машинные инструкции в читаемой форме. Зависят от архитектуры процессора: язык для MacBook с процессором Intel не будет работать на MacBook с процессором M.
-
Машинные (machine) — набор машинных инструкций, которые понимает процессор. Самый низкий уровень, напрямую взаимодействующий с «железом». Такой код будет в бинарном виде, то есть будет содержать только единицы и нули.

Машинные и Ассемблерные языки
Машинные языки появились в начале 1940-х. Тогда программисты писали программы напрямую, в виде наборов битовых команд, то есть в виде нулей и единиц. Работать было сложно. К концу 40-х годов появились первые ассемблерные языки, которые были понятны человеку.
Ассемблерный код при запуске переводится в машинный, а затем запускается компьютером. Таким образом, ассемблерный код тоже можно назвать абстракцией. А какое‑то время он даже считался высокоуровневым.
Любой код проходит несколько этапов, становясь ассемблерным, а затем машинным. Если вы пишите на С или Rust, то код будет преобразован в ассемблерный на этапе компиляции. На нём написанный код обрабатывается и подготавливается файл для его запуска. В итоге мы получаем машинный код, потратив немного времени на его обработку.
Формально, абзац выше содержит допущения, сделанные осознанно.
Некоторые языки могут пропускать этап ассамблерного кода, а некоторые используют интерпретацию или специальный вид JIT‑компиляции.
Современные разработчики давно не пишут на низкоуровневых языках. Вы можете не тратить время на этот вид языков программирования.


Высокоуровневые языки
В самых популярных рейтингах языков программирования — TIOBE Index, PYPL Index и RedMonk — топ-20 занимают высокоуровневые языки. Они делятся на несколько категорий: системные, скриптовые, специфические и эзотерические. Начать изучать программирование стоит с системных или скриптовых языков. Языки для специфических задач хорошо описывают своё предназначение названием. А эзотерические можно смело пропустить, как ассемблерные и машинные.
Эзотерические языки придумываются для развлечения или исследования возможностей программирования. В реальной разработке они не встречаются, а читать их обычно сложно. Эту категорию мы пропустим.

Системные языки предназначены для разработки программ, которые взаимодействуют напрямую с «железом» и системными ресурсами. Эти языки обеспечивают высокий уровень контроля над памятью и производительностью, поэтому они используются для создания операционных систем, драйверов устройств и высокопроизводительных приложений. Новые популярные языки, вроде Go или Rust, используются и для веб‑разработки.
Лично я рекомендую начинать программировать именно с языка C. Он небольшой, учит работать с памятью, а навыки программирования на нём актуальны в любом другом языке. Хотя многие начинают писать на C, немногие продолжают. Язык содержит мало абстракций, а доступ к памяти требует от разработчиков ответственности и внимательности, так что скорость разработки на нём низкая. Я начал программировать на С, затем перешёл на Python, а потом на Rust.



Скриптовые языки предназначены для автоматизации задач, управления программами и обработки данных. Обычно они интерпретируемые — это означает, что код выполняется напрямую без предварительной компиляции. Из‑за отсутствия компиляции такие языки могут содержать больше ошибок и выполняться медленнее, чем системные. Ответственность разработчика уже не в контроле ресурсов, а в качестве написанного кода. Может показаться, что порог входа в такие языки ниже, чем в системные. Однако, большое количество абстракций в языке требует большего времени на его изучение.
Скриптовые языки отличаются простотой синтаксиса и высокой гибкостью, поэтому они подходят для быстрого прототипирования. Благодаря скорости разработки и большому количеству разработчиков, такие языки используют как в стартапах, так и в крупных компаниях.
Самый популярный язык в мире — это Python. Это скриптовый язык который легко читать и у него широкий спектр применения. Если вы не писали раньше код, то Python или JavaScript — хороший выбор. Важный минус: после такого приятного языка вы вряд ли захотите писать на низкоуровневых, и возможно, вы всю жизнь будете использовать только один язык.


Языки для специфических задач решают конкретную проблему или используются в узкой области разработки. Например, вам нужен язык для размещения контента на веб‑странице, и HTML решает именно эту задачу. Можно возразить, что HTML — это язык не программирования, а вёрстки. Если хотите об этом поспорить, жду вас в комментарии.
SQL — тоже язык из этой категории. Он используется в сфере работы с данными. Изначально SQL создавался как язык конечного пользователя. Это означает, что он проектировался не для программистов или разработчиков. SQL предназначался для тех, кто работает с данными напрямую. Например, для аналитиков, менеджеров, исследователей и других специалистов, которым нужно быстро извлекать, фильтровать и анализировать данные.
SQL — абстракция доступа к данным. Нам не нужно понимать сложную логику работы самой базы данных или программирования на низкоуровневых языках. Это позволяет конечным пользователям сосредоточиться на работе с данными, а не на технических деталях их обработки.

Идея SQL заключалась в том, чтобы сделать его простым и понятным, и пользователи могли бы самостоятельно писать запросы. Со временем SQL приобрел черты полноценного языка программирования (например использование переменных, циклов и процедур). Это сделало его инструментом для разработчиков, аналитиков и специалистов технической поддержки.
Фундаментальный принцип языка SQL заключается в том, что он декларативный. Это значит, что программа описывает результат, который пользователь хочет получить. Альтернативой являются императивные языки программирования, где пользователь описывает алгоритм получения результата.
Объясню на примере: мама отправляет сына в магазин.
В декларативном языке, вроде SQL, сын получает список покупок:
-
молоко, 1 л
-
яйца 10 шт
-
батон хлеба
В императивном языке сын получает алгоритм:
-
Выйти из квартиры и закрыть дверь.
-
Спуститься по лестнице (или на лифте) на первый этаж.
-
Дойти до ближайшего магазина.
-
Взять корзину для покупок у входа.
-
Пройти к отделу с молоком, выбрать и положить в корзину 1 литр молока.
-
Найти отдел с яйцами и положить 10 штук в корзину.
-
Пройти к полкам с хлебом и взять один батон.
-
Дойти до кассы, оплатить покупки.
-
Вернуться домой с покупками.
Хоть SQL и является декларативным языком, алгоритм получения данных всё же есть. Программа, которая управляет данными, преобразует декларативный запрос пользователя в алгоритм получения этих данных и выполняет его. Такие системы называются Системы Управления Базами Данных.
SQL-СУБД
Любая программа состоит из данных и действий над этими данными. Данными могут быть личные данные пользователя, видео в социальных сетях или любая другая информация. Действия над данными тоже не ограничены: пользователя можно авторизовать по комбинации логина и пароля, а видео — конвертировать в другой формат. Данными могут быть и обычные числа, которые хранятся как результат вычислений.
У нас есть данные, с которыми мы делаем какие‑то действия. Эти данные нужно где‑то хранить. Хранить их можно в самой программе, но если она неожиданно выключится, то мы их потеряем. Вспомните, как в детстве вы играли в любимую компьютерную игру и вдруг слышали, что родители заходят домой. Вы быстро нажимали на кнопку выключения компьютера и ваш прогресс терялся. Или например, вы пишите дипломную работу в текстовом редакторе. Увидев, что в программе произошла ошибка, вам остается лишь надеяться, что вы недавно сохраняли работу. Во всех этих случаях данные хранились в самой программе и не были записаны на диск.
Долговременное хранение данных на диске — задача не такая простая. Простым решением было бы хранение данных в файлах. В таком случае, вам нужно придумать, как читать файлы, записывать их, искать в них информацию и многое другое. Самое популярное решение — хранение данных в реляционной базе. Технически, СУБД хранят данные в файлах. Например, SQLite хранит все данные в виде одного файла. СУБД предлагает нам абстракции: использование SQL позволяет нам легко работать с данными.
Вспомните заголовок этой статьи: «Прежде чем изучать любой язык программирования, необходимо изучить SQL». Какой бы язык программирования вы не выбрали, вам придётся хранить данные отдельно от вашего приложения. Для такого хранения с 1970-х годов используются реляционные базы данных. Работа с реляционной БД выполняется посредством SQL запросов. Я рекомендую сначала разобраться с хранением данных, а затем уже думать над тем, как с ними работать.
Бесплатные ресурсы
Изучить SQL можно бесплатно. Бесплатные материалы есть для любого уровня: начиная от простых запросов, заканчивая проектированием и разработкой новых СУБД. Я собрал 5 бесплатных инструментов для каждого уровня. Все эти инструменты я сам использовал для изучения SQL. Если вы только начинаете свой путь, вам нужно понять основы работы с SQL, а для этого необходима практика в запросах. Поскольку язык изначально задумывался как простой доступ к данным, то для простой работы не нужно изучать большое количество теории. Вам потребуется готовая база данных и задания, так что первые два ресурса именно про это.
-
Курс по SQL на степике
В нём есть как теория, так и практика. В курсе работаем с MySQL — одной из самых популярных версий СУБД. Так как синтексис запросов в SQL стандартизирован, вы сможете работать с любой реляционной БД после этого курса. Для приложений я рекомендую использовать PostgreSQL, но вы можете использовать даже SQLite. -
Дополнительная практика на тренажёре
Закрепляем основы и изучаем примеры запросов. В этом тренажёре практика на примере авиакомпаний, сервиса бронирования и базы данных института. Много заданий разного уровня сложности, отлично подходит чтобы закрепить основы и понять сценарии запросов в разных ситуациях. -
Инструмент для запуска БД и программ — Докер
Базу данных можно запустить локально на своём устройстве, но это не всегда удобно. Современный подход разработки предлагает использовать Докер для запуска приложения и зависимых сервисов. Обязательно изучите этот инструмент, если планируете развиваться как разработчик. -
Путеводитель по базам данных
Если БД вас заинтересовали и вы захотите изучить больше, то прочитайте книгу за авторством Комарова. В ней он рассказывает обо всех доступных видах баз данных, компромиссах при их использовании и об управлении базами данных.
Автор: By-Lazarev