В этой статье отвечу на три вопроса:

  • Какие существуют виды языков программирования;

  • Почему нужно сначала изучить 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 занимают высокоуровневые языки. Они делятся на несколько категорий: системные, скриптовые, специфические и эзотерические. Начать изучать программирование стоит с системных или скриптовых языков. Языки для специфических задач хорошо описывают своё предназначение названием. А эзотерические можно смело пропустить, как ассемблерные и машинные.

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

Пример на языке brainfuck
Пример на языке brainfuck

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

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

Пример на языке С
Пример на языке С
Пример на языке Go
Пример на языке Go
Пример на языке Rust
Пример на языке Rust

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

Скриптовые языки отличаются простотой синтаксиса и высокой гибкостью, поэтому они подходят для быстрого прототипирования. Благодаря скорости разработки и большому количеству разработчиков, такие языки используют как в стартапах, так и в крупных компаниях.

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

Пример на языке Python
Пример на языке Python
Пример на языке JavaScript
Пример на языке JavaScript

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

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

SQL — абстракция доступа к данным. Нам не нужно понимать сложную логику работы самой базы данных или программирования на низкоуровневых языках. Это позволяет конечным пользователям сосредоточиться на работе с данными, а не на технических деталях их обработки.

Пример на языке SQL
Пример на языке SQL

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

Фундаментальный принцип языка SQL заключается в том, что он декларативный. Это значит, что программа описывает результат, который пользователь хочет получить. Альтернативой являются императивные языки программирования, где пользователь описывает алгоритм получения результата.

Объясню на примере: мама отправляет сына в магазин.

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

  • молоко, 1 л

  • яйца 10 шт

  • батон хлеба

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

  1. Выйти из квартиры и закрыть дверь.

  2. Спуститься по лестнице (или на лифте) на первый этаж.

  3. Дойти до ближайшего магазина.

  4. Взять корзину для покупок у входа.

  5. Пройти к отделу с молоком, выбрать и положить в корзину 1 литр молока.

  6. Найти отдел с яйцами и положить 10 штук в корзину.

  7. Пройти к полкам с хлебом и взять один батон.

  8. Дойти до кассы, оплатить покупки.

  9. Вернуться домой с покупками.

Хоть SQL и является декларативным языком, алгоритм получения данных всё же есть. Программа, которая управляет данными, преобразует декларативный запрос пользователя в алгоритм получения этих данных и выполняет его. Такие системы называются Системы Управления Базами Данных.

SQL-СУБД

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

У нас есть данные, с которыми мы делаем какие‑то действия. Эти данные нужно где‑то хранить. Хранить их можно в самой программе, но если она неожиданно выключится, то мы их потеряем. Вспомните, как в детстве вы играли в любимую компьютерную игру и вдруг слышали, что родители заходят домой. Вы быстро нажимали на кнопку выключения компьютера и ваш прогресс терялся. Или например, вы пишите дипломную работу в текстовом редакторе. Увидев, что в программе произошла ошибка, вам остается лишь надеяться, что вы недавно сохраняли работу. Во всех этих случаях данные хранились в самой программе и не были записаны на диск.

Долговременное хранение данных на диске — задача не такая простая. Простым решением было бы хранение данных в файлах. В таком случае, вам нужно придумать, как читать файлы, записывать их, искать в них информацию и многое другое. Самое популярное решение — хранение данных в реляционной базе. Технически, СУБД хранят данные в файлах. Например, SQLite хранит все данные в виде одного файла. СУБД предлагает нам абстракции: использование SQL позволяет нам легко работать с данными.

Вспомните заголовок этой статьи: «Прежде чем изучать любой язык программирования, необходимо изучить SQL». Какой бы язык программирования вы не выбрали, вам придётся хранить данные отдельно от вашего приложения. Для такого хранения с 1970-х годов используются реляционные базы данных. Работа с реляционной БД выполняется посредством SQL запросов. Я рекомендую сначала разобраться с хранением данных, а затем уже думать над тем, как с ними работать.

Бесплатные ресурсы

Изучить SQL можно бесплатно. Бесплатные материалы есть для любого уровня: начиная от простых запросов, заканчивая проектированием и разработкой новых СУБД. Я собрал 5 бесплатных инструментов для каждого уровня. Все эти инструменты я сам использовал для изучения SQL. Если вы только начинаете свой путь, вам нужно понять основы работы с SQL, а для этого необходима практика в запросах. Поскольку язык изначально задумывался как простой доступ к данным, то для простой работы не нужно изучать большое количество теории. Вам потребуется готовая база данных и задания, так что первые два ресурса именно про это.

  1. Курс по SQL на степике
    В нём есть как теория, так и практика. В курсе работаем с MySQL — одной из самых популярных версий СУБД. Так как синтексис запросов в SQL стандартизирован, вы сможете работать с любой реляционной БД после этого курса. Для приложений я рекомендую использовать PostgreSQL, но вы можете использовать даже SQLite.

  2. Дополнительная практика на тренажёре
    Закрепляем основы и изучаем примеры запросов. В этом тренажёре практика на примере авиакомпаний, сервиса бронирования и базы данных института. Много заданий разного уровня сложности, отлично подходит чтобы закрепить основы и понять сценарии запросов в разных ситуациях.

  3. Инструмент для запуска БД и программ — Докер
    Базу данных можно запустить локально на своём устройстве, но это не всегда удобно. Современный подход разработки предлагает использовать Докер для запуска приложения и зависимых сервисов. Обязательно изучите этот инструмент, если планируете развиваться как разработчик.

  4. Путеводитель по базам данных
    Если БД вас заинтересовали и вы захотите изучить больше, то прочитайте книгу за авторством Комарова. В ней он рассказывает обо всех доступных видах баз данных, компромиссах при их использовании и об управлении базами данных.

  5. Intro to Database Systems
    Возможно, вам захочется разработать и свою собственную базу данных или детальнее изучить особенности их реализаций. В таком случае, обратитесь к курсу по системам баз данных от университета «Карнеги Меллон». Курс на английском языке, на момент написания статьи, это самая актуальная информация о системах баз данных, которые я знаю.

пост в телеграмме
пост в телеграмме

Все ссылки оформил для вас одним постом в телеграме, сохраните себе: https://a_cup_of_code.t.me/311

Комментарии (35)


  1. voidinvader
    12.02.2025 16:36

    Господи, какой бред.


    1. aboutmurena
      12.02.2025 16:36

      sql потом java и только потом лень учить язык програмирования


    1. By-Lazarev Автор
      12.02.2025 16:36

      Что именно? Развиваться и изучать новое?


      1. voidinvader
        12.02.2025 16:36

        Речь в статье была совершенно про другое.


        1. By-Lazarev Автор
          12.02.2025 16:36

          Так а что бред то? Изучать SQL? Хотелось бы понять мысль. Я встречаю проблему, что люди учат языки программирования, но не изучают работу с БД. Поэтому и появилась эта статья, если объясните что показалось бредом то мне это поможет


          1. fire64
            12.02.2025 16:36

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

            Вы же пытаетесь показать, что умение строить грамотные SQL запросы - это вообще краеугольный камень программирования и без этого там нечего делать...

            Хотя по факту это нужно далеко не всегда и не всем...

            В целом складывается впечатление, что публикация написана с целью рекламирования курсов или телеграмм канала.


            1. By-Lazarev Автор
              12.02.2025 16:36

              Понял! Спасибо за ответ, жаль что сложилось такое мнение. Запомню для следующего поста


              1. Genrehopper
                12.02.2025 16:36

                Можете и в этом посте убрать ссылки на свой телеграм, раз это не являлось целью написания поста)


            1. adeshere
              12.02.2025 16:36

              > Вы же пытаетесь показать, что умение строить грамотные SQL запросы - это вообще краеугольный камень программирования и без этого там нечего делать...
              Хотя по факту это нужно далеко не всегда и не всем...

              Да, квантор всеобщности в статье явно лишний.

              > Почему нужно сначала изучить SQL;

              Да-да. Обязательно!

              Расскажите геофизикам, которые хранят гигабайтные данные в собственных специфических базах, или сейсмологам, ориентированным на Mseed,что их жизнь пуста и бессмысленна без знания SQL. И почему в их программах (где действительно используются очень нетривиальные алгоритмы, сильно выходящие за пределы обычных курсов) этот самый SQL является тем краеугольным камнем, без которого нет смысла даже и начинать. Да половина из тех, кто всю жизнь успешно и эффективно работает с этими данными, и пишет для этого не только собственные программы, но зачастую и алгоритмы (которые нормальному фронтэндеру в страшном сне не приснятся), даже такого слова не слышали ;-)

              Надеюсь, тут не нужно намекать, почему?

              ;-)


          1. voidinvader
            12.02.2025 16:36

            Бред - это советовать СНАЧАЛА изучать SQL, а ПОТОМ уже продуктовый ЯП. Во-первых ничего не мешает делать это параллельно (SQL + ЯП), закрепляя на реальном проекте, пусть и личном. Во-вторых, SQL многим нужен на уровне базового CRUD. В-третьих, SQL уже давно не догма для хранения данных. Тем более что я сам уже несколько лет не пишу на SQL в продуктах, а юзаю ORM. Чистый SQL мне нужен только для запросов непосредственно в базу, например, для поиска ошибок.

            На небольших проектах серьёзная оптимизация запросов не нужна, а на крупном проекте оптимизацией SQL занимается специалист по SQL, которому ваши советы точно не нужны.


            1. By-Lazarev Автор
              12.02.2025 16:36

              Спасибо, теперь понятно! Учитывая ваш пример с использованием ORM нужно тоже понимать базовый SQL. С этого я и советую начинать, а затем изучать ЯП или изучать дальше БД если это интересно человеку. Но я понял, что сейчас возникает другое ощущение от статьи, спасибо за разъяснения!


  1. aboutmurena
    12.02.2025 16:36

    если представить что sql это современый basic то почему нет - вполне логично


  1. jhoag
    12.02.2025 16:36

    Для такого хранения с 1970-х годов используются реляционные базы данных.

    Фронтендеры и системные программисты набегают через три...


    1. By-Lazarev Автор
      12.02.2025 16:36

      Я тоже подожду тут


  1. Dhwtj
    12.02.2025 16:36

    В целом согласен

    Императивное программирование - зло.

    SQL довольно простой способ окунуться в декларативное программирование


    1. By-Lazarev Автор
      12.02.2025 16:36

      Спасибо за поддержку!


      1. Dhwtj
        12.02.2025 16:36

        Зато особо нервный кто-то мне за это минус залепил


    1. aboutmurena
      12.02.2025 16:36

      да возможно как первый язык за счёт логика первого порядка будет оптимален если не запутаться в реализациях pl - психануть и ломанутся в java которая уже выжмет все соки


  1. GrandTourism
    12.02.2025 16:36

    Удивляюсь токсичным комментам... Прекрасная статья для дискуссии.


    1. By-Lazarev Автор
      12.02.2025 16:36

      Спасибо! Этого и хотелось бы, но видимо заголовок слишком агрессивный получился


  1. danilasar
    12.02.2025 16:36

    Автор курсов по программированию, Senior Backend разработчик. До IT открывал кофейни, обучал людей в ресторанах и занимался дизайном.

    Очень сомневаюсь, что Senior Backend разработчики занимаются написанием статей такого сорта. А вот то, что тс является автором курсов и что целевая аудитория публикации --- вкатыши (как, полагаю, и сам тс), очень хорошо ощущается)

    Наглядное сравнение декларативной и императивной парадигм, думаю, новичкам действительно полезно, весь остальной материал выглядит... сомнительно.


    1. aboutmurena
      12.02.2025 16:36

      если не знаешь какой брать то бери ананасовый


      1. DoctorRoza
        12.02.2025 16:36

        точнее будет, хода нет - ходи с бубей!


  1. HemulGM
    12.02.2025 16:36

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

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


    1. aboutmurena
      12.02.2025 16:36

      програмист-сопровождения обязан знать sql и разбираться в хранимых процедурах тк сами програмы это просто интерфейсная оболочка с запросами (при печати формам просто скидываются команды sql по которым они заполняются) - иначе он просто сисадмин: умениее ковырять базу в которой большая часть кода продукта будет реализована важнее чем остальное - то-что синтаксис sql достаточно понятный да даёт представление о данных и програмировании наверное правда лучший первый язык програмирования - жаль sql не достаточно стандартизирован да надо будеп определятся эскюэль или сиквел


      1. Vitaly48
        12.02.2025 16:36

        програмист-сопровождения обязан знать sql

        Меня очень триггерят такие категоричные высказывания.

        Вы же понимаете что программирование не ограничивается бэкендом? Ну т.е. есть много других областей где sql вообще не нужен, например мобильная разработка, системное программирование, программирование микроконтроллеров или gamedev.


        1. aboutmurena
          12.02.2025 16:36

          поэтому и написал программист-сопровождения когда специалист сидит на объекте клиента да вникает почему после выгрузки с терминала инвертаризации обрубаются граммы в весах - а это в хранимой процедуре кто-то за тридевять земель опечатался на всю планету да приходится резко кастылить пока делают апдейт


      1. HemulGM
        12.02.2025 16:36

        Если программисту-сопровождения необходим SQL он его будет знать (должен знать). Это никак не противоречит моим словам.

        И SQL не является языком программирования, это язык описания запросов. Специализированный язык. Он никак не поможет в изучении программирования как такового (возможно только для декларативных языков в какой-то степени). Так что нет, SQL не лучший первый язык.

        Для справки, PL/SQL - это не SQL.


  1. profFortran
    12.02.2025 16:36

    SQL изучается при необходимости. Если ты не работаешь с СУБД, нахуа тебе SQL?