Пока я готовлю статью про обучение, мне пришло в голову написать небольшой очерк о программировании и как я его вижу. Человек, который никогда не сталкивался с этим явлением, представляет написание программ как нечто ужасающе сложное и непонятно. Какой-то код, какие-то языки еще и всё это в компьютере, который сам по себе — большая загадка.
Если постараться объяснить простыми словами, программирование — это написание некоторых сценариев на специальных языках, которые сообщают компьютеру, что он должен делать. Сценарии в данном случае — это почти как написание обычных историй, но с поправкой на то, что сюжет может быть нелинейным. Например: Вася вышел за хлебом, он шел какое-то время и вдруг споткнулся и упал. Падение героя является некоторым событием, которое мы должны описать. Допустим, в нашем сценарии Вася при падении может потерять деньги, а может остаться с ними. Возможность потери денег, в нашем случае, — некоторое новое, внешнее условие. И мы проверяем, случилась ли она (потеря), или нет. Если неприятность произошла, то в конце нашей истории Вася оказывается без хлеба, в противном случае всё хорошо и герой сыт.
Или можно привести еще пример классической компьютерной программы, но на примере охранника. Допустим его зовут Григорий, и он должен каждые 5 минут смотреть, не подъехала ли к воротам вверенной ему территории машина. Если она здесь, то он в голове запускает какой-то новый сценарий действий, например проверку документов или содержимого багажника, или еще чего-то. Давайте теперь заменим нашего охранника компьютерной программой. Мы пишем сценарий, который раз в 5 минут проверяет при помощи камер, не подъехала ли машина. Если подъехала, то он показывает водителю сообщение о том, что необходимо показать в камеру документы. После того как документы распознаются, программа отправляет данные в какой-то внешний ресурс, где они обрабатываются и присылают обратно ответ — впускать или нет эту машину на территорию. Как вы видите из этого примера, мы, по сути, описали программу, которая заменяет действия охранника при определенном строго формализованном сценарии.
По своей сути, программирование — это попытка описать при помощи специального языка все возможные сценарии, которые могут произойти в рамках нашей задачи, и обработать все возможные ошибки. Это сделать очень непросто, и в некоторых случаях просто невозможно. Собственно, эта самая сложность и обуславливает появление багов, взломов и прочих неприятностей. При этом, чем сложнее программа, тем большее количество потенциальных ошибок она может в себе заключать. Это логично исходит из того, что чем больше сценариев мы пытаемся описать, тем запутаннее и сложнее они становятся.
Теперь про языки программирования. Компьютер — это по свой сути очень мощная вычислительная штука. Она проводит какое-то невозможно огромное количество математических операций в секунду и при помощи одних лишь вычислений показывает нам картинки на экране, обрабатывает текст и т.д. То, что при помощи математики можно будет записывать музыку или создавать картины, было предсказано еще в 19 веке. Весь 20 век шло развитие этих идей. И вот мы дошли до той точки, в которой находимся — без компьютеров мы жить не можем. При этом вычисления проходят по примерно одному сценарию — посчитал, запомнил результат в ячейке памяти, извлек данные из неё, прибавил к другим, перенес на жесткий диск или передал через Интернет другому компьютеру. Уточню, все вычисления происходят в двоичной системе исчисления, это там, где есть только нули и единицы.
Первые программисты вручную описывали движение этих самых нулей и единиц. Они вручную указывали, куда помещать данные от промежуточных вычислений. Это было крайне неудобно, и спустя некоторое время начали появляться ассемблеры. По сути, это семейство низкоуровневых языков программирования, которые имели свои особенности, зависящие от электронных схем конкретных компьютеров. Ассемблеры — это первые языки, которые имели в себе человекочитаемые команды. Например, программист мог явно указать операцию сложения или присвоения данных в переменную.
Но и ассемблеры были сложны для понимания, а самое страшное, что они не обладали единым стандартом. Тогда ученые информатики и инженеры стали создавать другие языки программирования — более высокого уровня. Они создавались в виде программ на тех же ассемблерах, и были ближе к естественной речи человека. На мой взгляд, идея создания максимально семантически близкого к естественному языку, но при этом максимально эффективного языка программирования, достигла своего пика с появлением C и C++. Можете себе представить, но почти все популярные сегодня языки программирования, так похожие на естественную речь, и позволяющие легко описать программы про Васю и Григория, написаны на них.
Сейчас массовое программирование свелось к тому, что мы просто описываем формальное поведение нашего компьютера, без контроля железа и вычислений. Мы, по сути, занимаемся прописыванием сценариев. Если хотим заниматься чем-то более научным и сложным, то обращаемся к C и С++. Но на этих языках описывать поведение Васи и Григория сложно. Лучше выбрать Python или JavaScript. Сейчас знание языка программирования в своей массе сводится к пониманию синтаксиса и грамматики — прямо как в ситуации с английским, русским или другими естественными аналогами.
Благодаря этому сейчас порог вхождения в профессию крайне невысок. Сложности начинаются тогда, когда мы вынуждены обращаться напрямую к железу нашего компьютера. Но на самом деле, чтобы получать нормальную зарплату и неплохо жить, достаточно просто уметь описывать сценарии по типу примеров про Васю и Григория. Ну а если хочется получать много денег и быть востребованным и желанным на рынке специалистом, придется обращать внимание на C и C++. Но это необязательно.
Кстати, хочу уточнить. Многие вышеуказанные вещи я сознательно упростил, так как если углубляться в подробности, то можно ненавязчиво уйти в написание целой книги, а это всё-таки просто небольшой очерк.