В этой статье отвечу на три вопроса:
- Какие существуют виды языков программирования;
- Почему нужно сначала изучить SQL;
- Как учить SQL бесплатно.
Если вы только выбираете язык программирования или уже программируете, но не уверены в своём выборе - эта статья для вас. Мы рассмотрим, какие бывают виды языков программирования, почему данные - это основа любой программы, как эти данные хранятся и как с ними работать. В конце статьи я приведу 5 бесплатных ресурсов, которые сам использовал для изучения SQL.
Предыстория
Я пишу про IT уже больше 2 лет в виде коротких заметок, которые можно прочитать за чашечкой кофе. Такие посты я называю "чашки кода". Сначала я рефлексировал о своём опыте в IT, затем писал про новости в этой сфере, а когда мне начали задавать одни и те же вопросы, я стал писать посты-ответы. Три самых популярных вопроса были: "С чего начать программировать", “Какой язык выбрать” и "Как учить SQL". На все три вопроса я ответил в одном посте, который впоследствии я стал пересылать так часто, что даже запомнил ссылку на него. А сейчас пришла пора написать полноценную статью.
Виды языков программирования
Все языки программирования можно разделить на три группы: машинные, ассемблерные и высокоуровневые. С каждым уровнем мы добавляем абстракции от уровня "железа". Абстракция - это приём, при котором сложная система скрывается за понятным способом взаимодействия. Например, автоматическая коробка передач в машине добавляет нам простую абстракцию. Нам не нужно вручную переключаться между передачами - это происходит автоматически, за счёт абстракции. Другой пример: раньше люди делали фото на плёнку, проявляли её и получали фотографию. Сейчас есть полароиды, которые делают фото всего за одно нажатие кнопки и моментально печатают его. Такие механические действия скрыты за простой абстракцией.
В программировании абстракции встречаются постоянно. В высокоуровневых языках мы не думаем, как работает память компьютера, как конвертировать биты в символы и о множестве других проблем. Это накладывает ограничения. Например, скорость программы будет ниже, но процесс разработки - быстрее. Иногда абстракции не могут решить проблему, а наоборот усложняют понимание, о чём говорит Кевлин Хенни:
Любую проблему можно решить путём введения дополнительного уровня абстракции, кроме проблемы слишком большого количества уровней абстракций.
В итоге у нас есть три уровня языков программирования:
Высокоуровневые (High-level) - языки, близкие к человеческому, обеспечивающие абстракцию от деталей "железа". Удобны для разработки сложных программ.
Ассемблерные (assembly) - низкоуровневые языки, представляющие машинные инструкции в читаемой форме. Зависят от архитектуры процессора: язык для MacBook с процессором Intel не будет работать на MacBook с процессором M.
Машинные (machine) - набор машинных инструкций, которые понимает процессор. Самый низкий уровень, напрямую взаимодействующий с "железом". Такой код будет в бинарном виде, то есть будет содержать только единицы и нули.
Машинные и Ассемблерные языки
Машинные языки появились в начале 1940-х. Тогда программисты писали программы напрямую, в виде наборов битовых команд, то есть в виде нулей и единиц. Работать было сложно. К концу 40-х годов появились первые ассемблерные языки, которые были понятны человеку.
Ассемблерный код при запуске переводится в машинный, а затем запускается компьютером. Таким образом, ассемблерный код тоже можно назвать абстракцией. А какое-то время он даже считался высокоуровневым.
Любой код проходит несколько этапов, становясь ассемблерным, а затем машинным. Если вы пишите на С или Rust, то код будет преобразован в ассемблерный на этапе компиляции. На нём написанный код обрабатывается и подготавливается файл для его запуска. В итоге мы получаем машинный код, потратив немного времени на его обработку.
Формально, абзац выше содержит допущения, сделанные осознанно. Некоторые языки могут пропускать этап ассамблерного кода, а некоторые используют интерпретацию или специальный вид JIT-компиляции.
Современные разработчики давно не пишут на низкоуровневых языках. Вы можете не тратить время на этот вид языков программирования.
Пример машинного кода:
101110000 00000001
Пример ассемблерного кода:
section .data
msg db 'Hello, World!', 0xA
len equ $ - msg
section .text
global _start
_start:
mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, len
int 0x80
mov eax, 1
xor ebx, ebx
int 0x80
Высокоуровневые языки
В самых популярных рейтингах языков программирования - TIOBE Index, PYPL Index и RedMonk - топ-20 занимают высокоуровневые языки. Они делятся на несколько категорий: системные, скриптовые, специфические и эзотерические. Начать изучать программирование стоит с системных или скриптовых языков. Языки для специфических задач хорошо описывают своё предназначение названием. А эзотерические можно смело пропустить, как ассемблерные и машинные.
Эзотерические языки: Такие языки придумываются для развлечения или исследования возможностей программирования. В реальной разработке они не встречаются, а читать их обычно сложно. Эту категорию мы пропустим.
Пример на языке brainfuck:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.
>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
Системные языки предназначены для разработки программ, которые взаимодействуют напрямую с "железом" и системными ресурсами. Эти языки обеспечивают высокий уровень контроля над памятью и производительностью, поэтому они используются для создания операционных систем, драйверов устройств и высокопроизводительных приложений. Новые популярные языки, вроде Go или Rust, используются и для веб-разработки.
Лично я рекомендую начинать программировать именно с языка C. Он небольшой, учит работать с памятью, а навыки программирования на нём актуальны в любом другом языке. Хотя многие начинают писать на C, немногие продолжают. Язык содержит мало абстракций, а доступ к памяти требует от разработчиков ответственности и внимательности, так что скорость разработки на нём низкая. Я начал программировать на С, затем перешёл на Python, а потом на Rust.
Пример на С:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
Пример на Go:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
Пример на Rust:
fn main() {
println!("Hello, World!");
}
Скриптовые языки предназначены для автоматизации задач, управления программами и обработки данных. Обычно они интерпретируемые - это означает, что код выполняется напрямую без предварительной компиляции. Из-за отсутствия компиляции такие языки могут содержать больше ошибок и выполняться медленнее, чем системные. Ответственность разработчика уже не в контроле ресурсов, а в качестве написанного кода. Может показаться, что порог входа в такие языки ниже, чем в системные. Однако, большое количество абстракций в языке требует большего времени на его изучение.
Скриптовые языки отличаются простотой синтаксиса и высокой гибкостью, поэтому они подходят для быстрого прототипирования. Благодаря скорости разработки и большому количеству разработчиков, такие языки используют как в стартапах, так и в крупных компаниях.
Самый популярный язык в мире - это Python. Это скриптовый язык который легко читать и у него широкий спектр применения. Если вы не писали раньше код, то Python или JavaScript - хороший выбор. Важный минус: после такого приятного языка вы вряд ли захотите писать на низкоуровневых, и возможно, вы всю жизнь будете использовать только один язык.
Пример на языке Python:
print("Hello, World!")
Пример на языке JavaScript:
console.log("Hello, World!");
Языки для специфических задач решают конкретную проблему или используются в узкой области разработки. Например, вам нужен язык для размещения контента на веб-странице, и HTML решает именно эту задачу. Можно возразить, что HTML - это язык не программирования, а вёрстки. Если хотите об этом поспорить, жду вас в комментарии.
SQL - тоже язык из этой категории. Он используется в сфере работы с данными. Изначально SQL создавался как язык конечного пользователя. Это означает, что он проектировался не для программистов или разработчиков. SQL предназначался для тех, кто работает с данными напрямую. Например, для аналитиков, менеджеров, исследователей и других специалистов, которым нужно быстро извлекать, фильтровать и анализировать данные.
SQL - абстракция доступа к данным, когда нам не нужно понимать сложную логику работы самой базы данных или программирования на низкоуровневых языках. Это позволяет конечным пользователям сосредоточиться на работе с данными, а не на технических деталях их обработки.
Пример на языке SQL:
SELECT name, age FROM users WHERE age > 30;
Идея SQL заключалась в том, чтобы сделать его простым и понятным, а пользователи могли бы самостоятельно писать запросы. Со временем SQL приобрел черты полноценного языка программирования (например использование переменных, циклов и процедур). Это сделало его инструментом для разработчиков, аналитиков и специалистов технической поддержки.
Фундаментальный принцип языка SQL заключается в том, что он декларативный. Это значит, что программа описывает результат, который пользователь хочет получить. Альтернативой являются императивные языки программирования, где пользователь описывает алгоритм получения результата.
Объясню на примере: мама отправляет сына в магазин.
В декларативном языке, вроде SQL, сын получает список покупок:
- молоко, 1 л
- яйца 10 шт
- батон хлеба
В императивном языке сын получает алгоритм:
- Выйти из квартиры и закрыть дверь.
- Спуститься по лестнице (или на лифте) на первый этаж.
- Дойти до ближайшего магазина.
- Взять корзину для покупок у входа.
- Пройти к отделу с молоком, выбрать и положить в корзину 1 литр молока.
- Найти отдел с яйцами и положить 10 штук в корзину.
- Пройти к полкам с хлебом и взять один батон.
- Дойти до кассы, оплатить покупки.
- Вернуться домой с покупками.
Хоть SQL и является декларативным языком, алгоритм получения данных всё же есть. Программа, которая управляет данными, преобразует декларативный запрос пользователя в алгоритм получения этих данных и выполняет его. Такие системы называются Системы Управления Базами Данных.
SQL-СУБД
Любая программа состоит из данных и действий над этими данными. Данными могут быть личные данные пользователя, видео в социальных сетях или любая другая информация. Действия над данными тоже не ограничены: пользователя можно авторизовать по комбинации логина и пароля, а видео - конвертировать в другой формат. Данными могут быть и обычные числа, которые хранятся как результат вычислений.
У нас есть данные, с которыми мы делаем какие-то действия. Эти данные нужно где-то хранить. Хранить их можно в самой программе, но если она неожиданно выключится, то мы их потеряем. Вспомните, как в детстве вы играли в любимую компьютерную игру и вдруг слышали, что родители заходят домой. Вы быстро нажимали на кнопку выключения компьютера и ваш прогресс терялся. Или например, вы пишите дипломную работу в текстовом редакторе. Увидев, что в программе произошла ошибка, вам остается лишь надеяться, что вы недавно сохраняли работу. Во всех этих случаях данные хранились в самой программе и не были записаны на диск.
Долговременное хранение данных на диске - задача не такая простая. Простым решением было бы хранение данных в файлах. В таком случае, вам нужно придумать, как читать файлы, записывать их, искать в них информацию и многое другое. Самое популярное решение - хранение данных в реляционной базе. Технически, СУБД хранят данные в файлах. Например, SQLite хранит все данные в виде одного файла. СУБД предлагает нам абстракции: использование SQL позволяет нам легко работать с данными.
Вспомните заголовок этой статьи: "Прежде чем изучать любой язык программирования, необходимо изучить SQL". Какой бы язык программирования вы не выбрали, вам придётся хранить данные отдельно от вашего приложения. Для такого хранения с 1970-х годов используются реляционные базы данных. Работа с реляционной БД выполняется посредством SQL запросов. Я рекомендую сначала разобраться с хранением данных, а затем уже думать над тем, как с ними работать.
Бесплатные ресурсы
Изучить SQL можно бесплатно. Бесплатные материалы есть для любого уровня: начиная от простых запросов, заканчивая проектированием и разработкой новых СУБД. Я собрал 5 бесплатных инструментов для каждого уровня. Все эти инструменты я сам использовал для изучения SQL. Если вы только начинаете свой путь, вам нужно понять основы работы с SQL, а для этого необходима практика в запросах. Поскольку язык изначально задумывался как простой доступ к данным, то для простой работы не нужно изучать большое количество теории. Вам потребуется готовая база данных и задания, так что первые два ресурса именно про это.
- Курс по SQL на степике: В нём есть как теория, так и практика. В курсе работаем с MySQL - одной из самых популярных версий СУБД. Так как синтексис запросов в SQL стандартизирован, вы сможете работать с любой реляционной БД после этого курса. Для приложений я рекомендую использовать PostgreSQL, но вы можете использовать даже SQLite.
- Дополнительная практика на тренажёре: Закрепляем основы и изучаем примеры запросов. В этом тренажёре практика на примере авиакомпаний, сервиса бронирования и базы данных института. Много заданий разного уровня сложности, отлично подходит чтобы закрепить основы и понять сценарии запросов в разных ситуациях.
- Инструмент для запуска БД и программ - Докер: Базу данных можно запустить локально на своём устройстве, но это не всегда удобно. Современный подход разработки предлагает использовать Докер для запуска приложения и зависимых сервисов. Обязательно изучите этот инструмент, если планируете развиваться как разработчик.
- Путеводитель по базам данных: Если БД вас заинтересовали и вы захотите изучить больше, то прочитайте книгу за авторством Комарова. В ней он рассказывает обо всех доступных видах баз данных, компромиссах при использовании и об управлении базами данных.
- Курс Intro to Database Systems: Возможно, вам захочется разработать и свою собственную базу данных или детальнее изучить особенности их реализаций. В таком случае, обратитесь к курсу по системам баз данных от университета "Карнеги Меллон". Курс на английском языке, на момент написания статьи, это самая актуальная информация о системах баз данных, которые я знаю.
Все ссылки оформил для вас одним постом в телеграме, сохраните себе: https://a_cup_of_code.t.me/311
Top comments (0)