Учим языки программирования как иностранные
Вы задумывались, почему языки программирования так называются? Ведь поговорить на них невозможно. Они должны преобразовать задачу, поставленную человеком, в четкий алгоритм. Примерно так же работают дорожные знаки: они указывают водителю, где можно проехать, а где нельзя, нужно ли снизить скорость или можно разогнаться, разрешена ли парковка. Многие знаки прямо предписывают действия. Но никто не называет систему дорожных знаков языком.
Сходства и различия
На первый взгляд, между компьютерными и человеческими языками нет ничего общего. Изучение иностранных языков — гуманитарная область, а программирование — техническая специальность. Да и служат эти языки разным целям.
Самое существенное отличие между человеческими и компьютерными языками заключается в более высокой степени абстракции языков программирования. Они имеют дело не с объектами физического мира, а с отвлеченными понятиями, каждое из которых нужно сначала понять. Даже такой простой термин, как переменная, надо объяснять. А есть и более сложные — например, инкапсуляция и полиморфизм.
Иностранный язык всегда немного напоминает родной. Все люди живут в одном материальном мире. Часть слов мы можем усвоить сразу: table — стол, а cat — кошка. Некоторые более абстрактные вещи тоже понятны — как hello или good morning.
Встречаются и более сложные конструкции, смысл которых не очевиден — вряд ли новичок сумеет с ходу разобраться, почему how do you do означает «как дела?», а take care — «береги себя». В этих выражениях перевод отдельных слов мало что дает для понимания смысла. Подобные словосочетания лучше запоминать целиком, не вникая в их внутреннюю логику.
В языках программирования тоже есть элементы, которые понятны сразу — как операторы сложения (+) или умножения (*). Но существуют и конструкции, которые на первых порах приходится заучивать. Например, тег, открывающий код на JavaScript:
<script type="text/javascript">
Новичок может не понимать, как работает конструкция, почему необходима именно такая структура. Правильная стратегия — просто принять их как факт и включать в код механически. Сначала придется копировать шаблоны и структуры из учебных пособий, чтобы позже понять, как работает каждый элемент языка. Нарабатывая опыт и глубже изучая механизмы языка, мы начинаем деконструировать сложные структуры, чтобы включать их в свой код более осознанно и творчески.
Если приглядеться, можно найти еще больше сходств между человеческими и компьютерными языками. И те и другие имеют структуру и принципы, по которым работают, — иначе говоря, семантические и синтаксические правила. А еще у каждого языка есть словарный состав.
Словарный запас
Усвоить лексику иностранного языка непросто. Слова могут принципиально отличаться по звучанию от аналогов в вашем родном языке, и зачастую их приходится просто зазубривать. При этом для общения активный словарь должен включать порядка 400 слов — и этого хватит только для разговора на повседневные темы.
С языками программирования попроще. Выучить надо наименования ключевых слов, операторов и идентификаторов. Даже в самом богатом языке программирования их используется ограниченное количество.
Кроме того, большинство ключевых слов (if, void, while, for или print) взяты из английского языка. И если он вам знаком, будет просто запомнить их и увязать с новыми значениями.
Синтаксис
Но заучить слова мало — надо еще усвоить принципы, по которым они образуют языковые конструкции. Такие правила называются синтаксисом — он определяет структуру и форму языка.
В английском вопросительные предложения отличаются от повествовательных обратным порядком слов: «Mark will go to the park» и «Will Mark go to the park?». Только корректная конструкция даст вашему собеседнику понять, сообщаете вы ему новую информацию или ждете ответа от него.
Чтобы компьютер понял, чего вы от него хотите, надо знать синтаксис языка программирования. Неправильные синтаксические конструкции приводят к ошибкам при компиляции (если язык компилируемый) или при исполнении (если интерпретируемый). А еще — к неправильным результатам вычислений или ошибочным действиям. Простой и универсальный пример — скобки в математических расчетах, которые повышают приоритет части выражения.
result := a + (b * 2) / c
и
result := (a + (b * 2)) / c
Эти выражения дают разные результаты при одинаковых значениях переменных a, b и c.
Усвоить синтаксис — одна из самых сложных задач при изучении языка программирования с нуля. Вероятно, большую часть времени, затраченного на создание программы, вы будете исправлять ошибки компилятора, вызванные некорректным синтаксисом.
В человеческих языках много устоявшихся за века иррациональных конструкций. А компьютерные изначально проектировались так, чтобы исключить такие сложности. Ни в одном популярном ЯП вы не встретите ситуации, когда два ключевых слова используются в одинаковых ситуациях по разным синтаксическим правилам. Если в конце инструкции следует ставить точку с запятой, то так же надо поступать во всех инструкциях и во всех случаях. Каким бы сложным ни был программный код, какие бы редкие и особенные ключевые слова ни использовались в нем — завершать инструкцию будет всегда точка с запятой, а не другие символы.
Семантика
Если синтаксис отвечает за техническую корректность конструкций языка, то семантика — за смысловое наполнение. В человеческом языке это сложная область: у одного слова может быть много прямых, переносных и контекстуальных значений. А еще есть фразеологизмы с особой семантикой. Кроме того, человеческие языки тесно связаны с культурой — заучить слова и правила недостаточно, нужно знакомиться с историей и традициями.
В плане семантики языки программирования устроены значительно проще. Смысл ключевого слова не изменятся в зависимости от контекста, ситуации или культурного бэкграунда программиста. Семантика ЯП — это про осмысленность языковых конструкций, а в более широком смысле — про проверку правильности программ. Точнее, она используется для формальной верификации — то есть математического доказательства, что текст программы не содержит ошибок алгоритма и соответствует целям, ради которых создавался.
Главное — видеть цель!
Когда изучают иностранный язык, преследуют конкретную цель: общаться с зарубежными партнерами, подготовиться к путешествию, прочитать Шекспира и Гете в оригиналах.
Цель нужна и при обучении программированию: найти работу в IT, создать гениальное приложение или разработать программу для себя. Цель — это стрелка компаса, которая поможет ориентироваться в программировании.
Первый язык — самый сложный
Первый язык выучить сложнее всего — это справедливо в лингвистике, и в программировании. Вам встретится множество новых сложных концепций, усвоить которые может быть нелегко.
Сосредоточьтесь на изучении одного языка. Вы не сможете освоить сразу все — и даже пять самых популярных разом не осилите. Это не только трудно, но и непрактично. Вы ведь не стали бы одновременно изучать японский, немецкий и зулусский, не так ли? Так же нет смысла пытаться охватить сразу Python, Swift, Java и C++.
Выбирайте один и последовательно изучайте его. У всех языков общие принципы — когда вы их усвоите, новые языки будут даваться проще. Потребуется только знакомиться с новым «словарем» и синтаксисом.
Elementary. Hello, world!
Знакомясь с иностранным языком, вы прежде всего узнаете, как сказать «Привет». И чаще всего в первую очередь при изучении ЯП разбирают, как вывести на экран приветствие «Hello, world!».
Затем вы переходите к изучению начального словаря и базовых правил грамматики. В программировании аналогом будут простейшие понятия — переменные и их типы, методы, операторы и ключевые слова. Это кирпичики, из которых строится любая программа.
На этом этапе все совершают ошибки — и учатся на них. Важно экспериментировать с языком, «играть» с кодом, добавлять и убирать конструкции и элементы. Не бойтесь сломать код! Ошибки и сбои анализируйте и пробуйте исправить. Все это поможет лучше разобраться, как язык работает, и развить навыки в кодировании.
Intermediate
Достигнув среднего уровня, уже можно более свободно использовать иностранный язык — читать книги или смотреть фильмы, разговаривать с носителями языка.
Intermediate в программировании — это когда вы хорошо понимаете принципы, по которым язык функционирует, усвоили все необходимые понятия и можете ими свободно оперировать. И, конечно, уже способны написать программу. Вероятно, к этому времени вы напишете уже сотни строк работающего кода!
Но чтобы стать хорошим разработчиком, нужно освоить язык гораздо глубже. У вас уже есть фундамент знаний и представление о структуре языка. А главное — есть понимание, что именно нужно изучать. Ошибки все еще случаются, но решения вы ищете уже увереннее.
Наступает момент, когда знаний уже хватает, чтобы разрабатывать несложные проекты, но все еще недостаточно, чтобы взяться за что-то по-настоящему значимое. Можно почувствовать, что, несмотря на успехи, до профессионализма еще далеко.
Не отчаивайтесь! Помните, что это нормальная часть обучения. В начале пути вы быстро шли вперед — потому что постигали самые простые вещи. Чтобы приобрести более сложные навыки, требуется больше времени, и прогресс будет уже не таким быстрым. Запаситесь терпением. Если чувствуете, что топчетесь на месте, — дайте себе немного отдохнуть, чтобы не перегореть. Решайте задачи на своем нынешнем уровне, общайтесь с коллегами. А когда почувствуете силы — продолжайте совершенствовать знания и навыки!
Advanced
На этом уровне вы сможете свободно разговаривать с носителями языка. Понимание, что вы способны выразить любую мысль и чувство на иностранном языке, дает невероятное ощущение свободы общения.
С языками программирования — похожая история. Вы будете чувствовать себя уверенно с новыми проектами и задачами. Столкнувшись с очередной проблемой, не впадете в ступор и не броситесь судорожно искать решение. Опыт поможет сразу нащупать оптимальный путь. И даже в особенно трудных ситуациях вы будете точно знать, где искать помощь и совет, а все сложности будете воспринимать как приключение.
Но время почивать на лаврах в программировании не наступает никогда. Это область, которая развивается и меняется быстро. Стоит остановиться — и с трудом завоеванное мастерство начнет угасать. Самодовольный разработчик недолго остается востребованным специалистом.
Хорошая новость: когда вы достигнете этой ступени, уже сможете самостоятельно освоить практически любой язык программирования. И это невероятно круто. Потому что с иностранными языками это не работает: даже если вы свободно разговариваете на немецком, французском и суахили, для изучения китайского вам снова придется начинать с азов. А программисту потребуется только освоить немного понятий нового языка, запомнить его ключевые слова, бросить взгляд на синтаксические правила и несколько дней попрактиковаться в новой среде разработки.
Готовимся к первым шагам
Для тех, кто в начале пути, мы сформулировали несколько простых советов.
Не пытайтесь охватить сразу все
Нельзя заговорить на иностранном языке за неделю, как и написать серьезную программу, едва познакомившись с языком программирования. Исключение — опытные разработчики, для которых любой язык — просто еще одна форма, в которую без труда укладываются давно изученные понятия.
Начните с простых понятий и конструкций. Освойте базовый «словарь» — важнейшие ключевые слова языка. Изучите принципы синтаксиса. И двигайтесь дальше!
Возьмите учебник, а не документацию
Документация к языку — это хороший источник для программиста. Но в большинстве случаев она дает сжатую справочную информацию — это подходит тем, кто уже знает язык и умеет на нем программировать.
Начать изучение ЯП с документации — как взять толковый словарь и пытаться по нему освоить иностранный язык. Да, такой словарь может давать исчерпывающие описания и даже примеры применения слов, но он изначально написан на чужом для вас языке.
Вот почему важно найти хороший учебник или курс, который поможет структурировать материал и сделает его простым и интересным. Когда овладеете терминологией и начальными навыками, можно браться и за документацию.
Найдите наставника
Есть начинающие программисты, которые предпочитают осваивать язык своими силами. Мы снимаем шляпу перед этими отважными людьми, не боящимися трудностей. Но дело пойдет значительно быстрее, если рядом будет человек, который сумеет объяснить сложные понятия, покажет пример, поможет найти и исправить ошибки.
Погружайтесь в языковую среду
При изучении иностранного языка полезно общаться с его носителями. В идеале — погрузиться в языковую среду, отправившись за границу. Теоретические знания должны подкрепляться постоянной и интенсивной практикой.
В случае с языком программирования вы не можете пообщаться с «носителем» — машина вряд ли поддержит беседу. Но погружение в языковую среду возможно. Для этого нужно как можно больше практиковаться, писать и совершенствовать код. Беглость и уверенность в использовании языка достигаются только постоянной практикой.
Не бойтесь неудач
Никто не рождается со знанием языка — ни компьютерного, ни иностранного, ни даже родного. Поэтому нужно помнить, что на первых порах ошибки не просто возможны — они неизбежны.
Не опускайте руки: продолжайте трудиться, анализируйте промахи. Не бойтесь попросить помощи у других программистов — своего наставника, коллег или на форуме. Каждый из нынешних профессионалов когда-то был на вашем месте.
Практика, терпение, упорство и опыт — отличная формула для изучения языков программирования!