Как решить, хотите ли вы стать программистом
Буквально на днях сотрудники Mojang выпустили небольшой «симулятор программиста» — простенький и сугубо научно-популярный. Это не Colobot и даже не Human Resource Machine , и программировать эта игрушка никого не научит. Ее задача в другом: она неплохо показывает, что такое программирование, тем людям, кто про это вообще ни сном, ни духом.
Идея не могла пройти мимо меня — просто потому, что я сам программист. Нет, не отважный хакер из романов в жанре киберпанка и даже не разработчик компьютерных игр, а самый обычный прикладной программист, который сидит в офисе и выполняет задачи в духе «чтобы вот отсюда, отсюда и отсюда брало числа, пересчитывало их по вот этим формулам и выводило отчет». Между прочим, достаточно интересное занятие, и оно мне нравится.
Именно поэтому мне захотелось поддержать идею и помочь рассказать о программировании людям, в глаза кода не видевшим и не способным даже вообразить, что это такое. И специальный интерактивный тренажер, разработанный по мотивам Minecraft, послужит для этого прекрасной иллюстрацией, благо представление об основных понятиях программирования он дает верное.
Что такое программа?
Даже «Википедия» скажет нам, что компьютерная программа — это в первую очередь последовательность команд. Какую бы цель вы ни преследовали, задача сводится к тому, чтобы создать для компьютера четкую инструкцию, описывающую, что он должен сделать. Записав эту инструкцию на любом из языков программирования, вы и создадите программу.
► Согласно определению, это тоже программа. Просто с очень специфическим набором инструкций.
Это касается любой программы. Skype при помощи последовательности команд объясняет компьютеру, как принимать и отправлять звук и видео по сети. Cities: Skylines при помощи последовательности команд объясняет компьютеру, как рисовать город и как должны меняться его здания и кварталы с течением времени. Сайт «Игромании» при помощи последовательности команд объясняет серверному компьютеру, где взять текст статьи и как отправить его на компьютер читателя.
Интерактивный тренажер Minecraft демонстрирует это просто и наглядно: мы составляем последовательность команд, объясняющую персонажу Minecraft куда перемещаться, где уничтожать блоки, а где устанавливать. Нажав на кнопку «показать код», вы увидите, как эти команды выглядят в виде программного кода. Примерно так на самом деле выглядят «изнутри» все программы, разве что кода в них обычно намного больше.
Как мне написать свою программу?
Этот простой вопрос раскладывается на несколько сложных — настолько сложных, что программисты до сих пор ломают копья в попытках доказать, что их ответы самые лучшие и единственно верные. Чтобы понять, как писать программу, вы должны решить, на каком языке программирования она будет написана. А чтобы выбрать язык, нужно знать, что ваша программа будет делать и где использоваться.
► Код слева выглядит куда запутаннее, но это такой же JavaScript, как и справа.
Если вас интересует программа «как таковая», создайте на диске текстовый файл MyJavascriptTest.html и напишите там:
< script type=‘text/javascript’> alert(“Hello, world!”); < /script>
После этого откройте файл при помощи браузера.
Готово — вы написали на языке JavaScript последовательность из одной команды, объяснившую браузеру, что вам нужно показать всплывающее окошко с надписью «Hello, world!». Вы восхитительны.
Как мне выбрать язык программирования, и чем они вообще отличаются?
Язык программирования как раз и определяет вид команд, из которых вы будете составлять инструкции для компьютера. Выбирать язык стоит исходя из следующего критерия: насколько вам подходят его возможности и есть ли в нем инструменты, отвечающие вашим целям.
В одном языке, чтобы вывести на экран окошко, нужно дать команду «вывести окошко с текстом», в другом придется городить последовательность в духе «найди левый верхний угол экрана, отсчитай от него сто пикселей вправо и двести вниз, нарисуй прямоугольник триста на четыреста, напиши в центре текст, отступи вниз на тридцать пикселей, нарисуй другой прямоугольник, тридцать на пятьдесят, внутри него напиши «ОК», а после нажатия на маленький прямоугольник убирай с экрана большой и все его содержимое».
► Для одних языков вам понадобится инструментарий разработчика, с другими же можно работать в любом текстовом редакторе.
В каком-нибудь третьем языке окошки изначально нужно было рисовать как во втором, но кто-то еще десять лет назад написал, как должна выполняться команда «вывести окошко», и с тех пор все используют его код. О таком человеке говорят, что он написал библиотеку , а сами библиотеки можно (и нужно!) использовать при написании своих программ, чтобы каждый раз не тратить по нескольку недель на описание того, что вы подразумеваете под «окошком» и как это «вывести».
Например, тренажер Minecraft генерирует код на языке JavaScript. Сам по себе этот язык не знает, что означает, скажем, команда moveForward() , которую вы используете, чтобы сдвинуть персонажа на клетку вперед. Но игра использует библиотеки Mojang, и вот в них уже описано, какая именно последовательность инструкций скрывается за командой moveForward(). То есть вы используете готовую функцию из готовой библиотеки на JavaScript, чтобы сдвинуть персонажа на шаг вперед.
Нет, такое использование никоим образом не умаляет ваших заслуг как программиста, совсем наоборот. Люди, строящие водопроводы, пользуются готовыми трубами, а не начинают строительство с добычи руды — и это правильная организация работы. Вот и программисты выбирают языки, в которых есть нужные им инструменты и для которых есть нужные им библиотеки.
То есть чтобы, скажем, сделать игру, нужно накачать библиотек для выбранного языка, и валяй — пиши себе цепочки готовых команд?
По сути — да, именно этим программисты и заняты. Вопрос только в масштабах, ведь вы не найдете в стандартных библиотеках функций вроде «нарисовать моего персонажа» или «рассчитать, попадет ли выстрел в цель».
► Популярный игровой движок Unity считается одним из самых простых для освоения, но даже он за вас игру делать не будет.
Попробуйте представить, сколько инструкций на самом деле скрывается за той же moveForward()? Нужно определить, где находится персонаж и в какую сторону смотрит, откуда и куда он движется, можно ли ему сделать еще один шаг вперед, что случится, если он этот шаг сделает… Не говоря уже о том, что все это нужно правильно нарисовать на экране и учесть все варианты анимации.
Так что с одной стороны — да, бери и пиши, а с другой — писать обычно нужно много и всегда держа в голове, что именно нужно писать самому, а что уже написано и можно просто использовать.
Если проблема только в том, что описывать нужно много всего, почему программисты постоянно говорят о каких-то сложных алгоритмах?
Как правило, чем сложнее задача программиста, тем больше у нее вариантов решения и тем больше возможностей ошибиться — слишком много факторов приходится включать в расчет. Даже элементарную задачу «поделить число А на число Б» не стоит пытаться решить в одну команду: сначала стоит все-таки убедиться, что число Б — не ноль.
Интерактивный тренажер Minecraft замечательно демонстрирует это на примере лавовых ям. Простой алгоритм «шагнуть вперед, раскопать стену, повторить шесть раз» дает трещину, если учесть, что за стеной может быть не пол, а лава. Вот здесь и вступают в игру ветвления — они же условия , один из основных терминов программирования. «Шагнуть вперед, раскопать стену, если лава — то положить мостик».
► Обычно алгоритмы ветвления немного сложнее: после участка «если» часто нужен пункт «иначе». Но суть передана верно.
Чем шире разрастается программа, тем больше в ней таких проблемных мест — и код начинает ветвиться, обрастать вариантами «а что, если». Все это стоит умножить на двадцать, когда в дело включаются варианты взаимодействия с пользователем — неизведанные горизонты всевозможных «а что, если пользователь нажмет…» или «а что, если пользователь введет…» будут расширяться как вселенная.
Именно поэтому начинать писать программы можно вообще без компьютера: взять бумажку, ручку и нарисовать алгоритм программы, попытавшись учесть в ней все возможные «если». А уж хорошо написанный алгоритм легко реализовать почти на любом языке программирования.
С чего начинать изучение языка программирования?
Если это ваш первый язык, то с самых-самых основных понятий. Изучите, что такое переменные , какие бывают типы данных. Узнайте, как в языке применяются циклы и как выглядит условный оператор. Все это сильно поможет вам в будущем: эти термины, за редким исключением, применяются почти во всех распространенных языках программирования. Кроме декларативных , но это отдельный разговор.
► Тренажер Minecraft дает прекрасное общее представление о том, что такое циклы и в каких случаях левый вариант стоит заменять правым.
Для большинства языков есть подробные инструкции, которые проводят от простого к сложному. Начинают обычно с мелочей вроде «вывести надпись на экран» и дальше проходят про классическим задачкам: отсортировать по возрастанию последовательность чисел, сделать калькулятор…
Разобравшись с азами, ставьте себе маленькие задачки («нарисовать на экране часы, которые звонят каждые пятнадцать минут», «сделать систему обмена сообщениями по локальной сети») и разбирайтесь, как их можно выполнить на выбранном вами языке. Не стесняйтесь по любому вопросу консультироваться с сетью, но готовьтесь, что почти вся полезная и актуальная информация будет исключительно на английском языке — это специфика профессии, и никуда от нее не деться.
Рано или поздно вы решитесь начать делать программу своей мечты. Только учтите, что, сделав от силы два процента, вы поймете, что начали вообще не с того, и будете переписывать все заново. Так повторится по меньшей мере раз двадцать, и это тоже совершенно обычное дело.
Главный вопрос: когда я смогу сделать свой Fallout Online с открытым миром, фотореалистичной графикой и караванами?
На этот вопрос вы сможете ответить самостоятельно — сразу после того, как сделаете хотя бы «морской бой» по сети.
В конце концов, если бы программировать было так просто, программистов насчитывалась бы тьма тьмущая, не правда ли?