Найти в Дзене
ZD Createch

Иностранные языки и языки программирования

Оглавление

Они ведь совсем разные! Или не совсем...? Давайте посмотрим, как даже небольший опыт в иностранных языках может помочь при изучении программирования.

Нулями и единицами разговаривать точно не понадобится
Нулями и единицами разговаривать точно не понадобится

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

В последние годы программирование стало одним из важнейших навыков во многих областях, помимо разработки программного обеспечения: исследователи естественных и социальных наук, специалисты по связям с общественностью и СМИ, бизнес-аналитики - люди всех профессий могут извлечь выгоду из обучения программированию и автоматизировать многие ежедневные задачи с помощью самописных компьютерных программ. Для кого-то это может стать подспорьем в повседневных делах, а для кого-то станет точкой прорыва в карьере, кто знает? Но самое главное, успешный запуск программы приносит несравнимое чувство достижения.

Для тех, кто стремятся заняться разработкой программного обеспечения и войти в сферу ИТ, обучение программированию имеет решающее значение: даже если нет цели программировать регулярно самостоятельно, понимание того, над чем в настоящее время работает команда, необходимо для хорошего менеджера. Однако, с «научиться программировать» обычно возникает проблема - с чего начать? Этот простой вроде бы вопрос, если вбить его в Google, обычно возвращает нам массу мнений, рекламы, а также многословные «невероятные» советы от гуру программирования, которые сводятся к «просто начните проект, я хз». Иногда бывает трудно отделить зерна от плевел.

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

Сходства и различия

Разумеется, любое сравнение лучше всего воспринимать с "щепоткой соли", поэтому, прежде чем мы погрузимся в аналогии и метафоры процесса обучения, имеет смысл провести различие между человеческими языками и языками программирования, и коснуться некоторых базовых вещей, о которых Вы, вероятно, уже слышали. Точка зрения никогда не бывает лишней, не правда ли?

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

Кто-то может приподнять бровь. А как насчет самого компьютера? Хорошо это или плохо, но компьютеры еще не настолько умны, чтобы «думать» в форме, близкой к человеческой.

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

Можно сказать, что язык программирования в некоторой степени ближе к пиджину - инструменту общения между двумя сторонами, который одновременно имеет особенности обоих языков, но не является родным ни для одной из сторон. Обычно в пиджине смешанные языки вносят неодинаковый вклад в разные аспекты: один дает больше словарного запаса, а другой - грамматики.

В случае языков программирования можно сказать, что понятные человеку слова составляют словарный запас, в то время как «грамматика» и логика ее организации - это компромисс между человеком и машиной, определенный человеческим гением.

По сути, любой язык программирования преследует более или менее одну и ту же цель: предоставить компьютеру точные и эффективные инструкции, оставаясь при этом понятными и удобными для людей. Стоит отметить, что контроль над машиной и удобство для людей - это два полюса, между которыми балансируют языки программирования. Чем больше контроля нам нужно (например, если нам нужно точно распределить ресурсы машины в игровом движке), тем больше нам нужно «думать» и писать, как компьютер. Чем больше нам нужно удобства (например, если мы разрабатываем нетребовательное, но очень большое приложение), тем меньше у нас контроля над ресурсами машины. Разные языки лучше или хуже подходят для разработки разных типов программного обеспечения и решения определенных задач, что является одной из причин, почему их так много. Возможно, вы слышали о так называемых языках программирования «высокого уровня» (Python, JavaScript) и «низкого уровня» (языки ассемблера, C, Rust). Первые зачастую очень близки к человеческим языкам, поэтому почти любой человек, знающий анлийский язык, может хотя бы предположить, что делает строка кода; в то время как вторые, низкого уровня, могут выглядеть чуждыми и пугающими. Можно сказать, что языки более высокого уровня «прячут» или «абстрагируют» больше машинных аспектов, чем языки низкого уровня, которые показывают больше. «Абстракция» - отличный способ мышления, помогающий понять всю аппаратную и программную архитектуру современных компьютеров. Я определенно рекомендую ознакомиться с замечательной книгой Эндрю Таненбаума, чтобы более подробно ознакомиться с этой концепцией.

Это влечет за собой второе важное отличие: в отличие от человеческих языков, языки программирования почти полностью состоят из повелительных и повествовательных конструкций. К сожалению, мы не можем использовать Java или Python, чтобы спросить компьютер: «Быть ​​или не быть?» или "Что такое любовь?" (но мы можем использовать их для написания программы, которая попытается связно ответить на эти вопросы!). «Делай это, не делай этого». «Если это произойдет, сделайте это вместо этого». «number - 5, а name- 'Джон Доу'». - это типичные директивы, которые мы формируем с помощью языка программирования, чтобы сообщить компьютеру, что делать. Когда мы запускаем нашу программу, строки понятного для человека кода становятся понятными для компьютера потоками команд с помощью специального программного обеспечения, которое «переводит» наш код для машины или «учит» ее интерпретировать его напрямую.

"Переводит", значит? Здесь мы приближаемся к сходствам. С небольшой натяжкой, мы можем сказать, что подобно человеческим языкам, языки программирования могут быть переведены.

Как мы заметили ранее, компьютеры недостаточно «умны», чтобы изучать языки и говорить на них так, как это делаем мы, люди. Поэтому чаще всего, код, который мы пишем, должен быть обработан, перед тем как компьютер запустит его. А как мы помним, языки программирования могут быть нацелены на разные задачи и различаться с точки зрения абстракции. Это отражено, в том числе, в двух группах языков программирования: интерпретируемых и компилируемых.

Первая группа может быть понята и запущена компьютером "на лету", если на машине установлена специальная программа (или набор программ), называемая «средой выполнения» (или "рантайм", от англ. runtime). Процесс выполнения такой программы похож на синхронный перевод: благодаря среде выполнения машина готова принимать команды и немедленно их выполнять. JavaScript и Python - примеры интерпретируемых языков.

Вторая группа, компилируемые языки, должны быть заранее «письменно переведены» в менее абстрагированный код, который может понять машина. В этом случае написание и выполнение программы становится немного сложнее, но скомпилированные языки обычно менее подвержены ошибкам, поскольку программа-компилятор помогает выявить возможные ошибки перед созданием исполняемого файла. C, C++, Java, Kotlin - все это компилируемые языки.

Кроме того, есть еще один процесс, который можно связать с «переводом», - это транспиляция. Если процесс компиляции предполагает перевод программы в другой уровень абстракции, более близкий к машине, транспиляция - перевод одного языка на другой на относительно том же уровне абстракции. Зачем это может быть нужно? Обычно это вопрос удобства. К примеру, некоторые языки, такие как JavaScript, вполне подходят для комфортной работы отдельного разработчика или небольшой команды: их не нужно компилировать, и результаты можно увидеть сразу. Однако разработка и сопровождение более крупного проекта может оказаться сложной задачей, поскольку инструменты разработчика JavaScript менее точны, чем инструменты компилируемых языков (даже несмотря на то, что в последние годы в экосистеме JavaScript произошли значительные изменения). JavaScript - это язык, обеспечивающий большую часть интерактивности веб-страниц в Интернете, и веб-проектах работа с ним неизбежна. Вот почему некоторые команды и отдельные разработчики предпочитают использовать при разработке другие языки, например TypeScript или C-Sharp, а затем транспилировать их в JavaScript.

Значит, языки программирования можно переводить? Может, они все-таки не такие уж разные? Это подводит нас к следующему пункту: переход навыков.

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

Если такой феномен существует среди невероятно богатых, сложных и ярких человеческих языков, что же говорить о языках программирования, строгих, искусственных и регулируемых человеком? Хорошее понимание одного языка программирования открывает двери для многих других: синтаксис и передовые практики могут быть разными, придется привыкнуть к некоторым особенностям, но общая логика и навыки (понимание переменных и циклов, знание алгоритмов и структур данных, нацеленность и способность писать эффективный, поддерживаемый код) могут быть применены в любом другом языке.

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

И, наконец, что не менее важно, пусть это и субъективно, но языки программирования отлично подходят для юмора. Как бы странно это ни звучало, Вы не поверите, но строки кода иногда могут затмить комедийное шоу, и все, что вам нужно увидеть, - это пара строчек. Так что, если шутки вашего любимого комика в последнее время начали иссякать, программирование обязательно принесет немного искры. Даже если Java или Python изначально не являются прямыми средствами коммуникации между людьми, мы все равно можем использовать их, сознательно или бессознательно, для шуток и веселья.

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

¡Hola!

Обычно, прежде чем мы приступаем к изучению иностранного языка, у нас должна быть определенная мотивация. Мы можем случайно услышать красивую песню, чьи загадочные слова очаровывают нас. Мы можем посмотреть интервью с международной кинозвездой, говорящей на ее или его родном языке, и начать мечтать поговорить с кумиром сами. Или мы можем обнаружить, что в ближайшие пару лет знание определенного языка гарантирует отличный счет в банке! Как насчет изучения языка одного из предков? Или просто для удовольствия, из-за определенной особенности?

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

Когда дело доходит до языков программирования, я бы посоветовал начать с чего-то похожего: взглянуть на несколько интересных приложений и провести небольшое исследование, какие языки они используют? Восхищены функциональностью какого-нибудь приложения для Android? Может быть, стоит взглянуть на Java и Kotlin! Большой поклонник продуктов Apple и хотите, чтобы Ваше имя было под одним из этих классных приложений в App Store? Тогда повезло, что у Вас такой крутой MacBook, поскольку он обеспечивает отличную поддержку Swift, основного языка для создания приложений для всех устройств Apple. Или, может быть, впереди большой исследовательский проект, требующий серьезного анализа? Тогда, наверное, стоит взглянуть на возможные варианты использования R и Python! Идея для веб-сайта на миллион? Присмотритесь к комбинации HTML, CSS и JavaScript. Или, может быть, Вы хардкорный инженер и DIY-энтузиаст, и не терпится автоматизировать все с помощью плат вроде Arduino ? Отличным выбором могут стать низкоуровневые языки, такие как C/C++ или Rust, с помощью которых можно создавать мощные встроенные программы!

Как и в случае с иностранным языком, в большинстве случаев нас мотивируют не огромные грамматические таблицы или вгоняющие в тоску упражнения по аудированию. Нами движет результат, умение пользоваться языком. Слушать музыку, читать книги, покорять деловые встречи. То же самое и с изучением языка программирования. Процесс обучения может (и, скорее всего, будет) утомительным и нудным. Но результат - невероятные приложения, которые Вы создадите, красивые веб-сайты, которые Вы сверстаете, или удивительные и глубокие аналитические инструменты, которые Вы освоите - это то, о чем нужно помнить и к чему нужно стремиться.

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

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

Вдохновляясь этим, сделайте глубокий вдох, и приготовьтесь произнести парочку «Hello world»-ов!

Écoute et répète

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

Найдите несколько простых обучающих видеороликов (лучшим вариантом будет ускоренный курс или супер-небольшой проект). Если у вас есть доступ к YouTube, это кладезь отличных руководств. Задайте простой и краткий вопрос: «Руководство по Python», «JavaScript crash course», «C++ for beginners». Поиск выдаст десятки видео разного уровня. Я бы посоветовал выбирать практичные и хорошо снятые ролики, без обещаний немедленных результатов и кликбейтных заголовков («C# за 5 минут с помощью этого простого трюка», вероятно, не лучший выбор).

Приготовьте «карандаши и бумагу» - редактор или рекомендованную IDE для языка, с которого Вы решили начать, хороший автор ролика обычно предлагает несколько ссылок или показывает, как настроить среду разработки, а затем: смотрите, повторяйте, пересматривайте, повторяйте еще раз. Внимательно слушайте и делайте заметки. Не беспокойтесь о том, чтобы понять все сразу, но внимательно запишите и старайтесь объяснять себе, что Вы делаете: присваиваете значения переменным, объявляете и вызываете функции.

В данный момент цель - не выучить наизусть все, с чем столкнулись: Вам нужно научиться говорить свои how-do-you-do (или скорее, hello-world), даже если вы не совсем понимаете каждый отдельный шаг.

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

Если Вы вошли в свою учетную запись Google, в какой-то момент лента YouTube начнет заполняться все большим количеством рекомендаций по выбранному языку и программированию в целом. Понравился стиль объяснения определенного автора? Подпишитесь на него или нее, посмотрите плейлисты и ссылки под видео, скоро папка закладок расширится полезными страницами.

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

Время грамматики!

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

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

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

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

Еще один отличный навык, который стоит освоить на этом этапе, - это привычка записывать непонятные места и искать их в Google. Если вопрос задан правильно, в результате обычно отображается большой список тем Stackoverflow и разного рода статей по вопросу. Не забудьте добавить в закладки полезные ссылки и периодически реорганизовывать свою «библиотеку» знаний, чтобы знать, какую тему и где можно найти, и какие ссылки нужно прочитать или перечитать в свободное время.

Не надо думать, что Вы списываете, когда ищете что-то. Ищущий в Google не самозванец, а киборг. Ну, в некоторой степени. По моему опыту, попытки выучить наизусть - не лучшая тактика в долгосрочной перспективе. В большинстве случаев достаточно просто не копировать код, а набрать его самостоятельно. Попутно попробуйте объяснять, что Вы пишете: используйте комментарии к коду и собственный голос. Взгляните на фрагмент кода и громко расскажите, что делают строки кода. Как бы Вы объяснили это своим коллегам? Лучшему другу? Ребенку? Попробуйте разные объяснения, используя все свое остроумие, особенно в сложных и запутанных вопросах. При таком способе повторения самые сложные понятия станут понятны естественным путем.

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

Magnum opus

К этому моменту Вы, вероятно, уже какое-то время разрабатывали учебные проекты, а теперь пришло время создать что-то более масштабное! Magnum Opus, если позволите.

Лично я считаю, что проектный подход - лучший способ учиться. Более того, проекты обычно хорошо смотрятся в резюме. Надеюсь, Вы помните, что вдохновило Вас на изучение выбранного языка и связанных с ним технологий. Вероятно, сейчас самое подходящее время для того, чтобы поставить более конкретную цель и начать (или продолжить?) составление списка технологий, которые могут пригодиться в Вашем проекте: фреймворки, библиотеки, базы данных. Я обычно делаю набор задач с соответствующими закладками в браузере.

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

Можно делать это параллельно с поиском технологий для собственного проекта. Хорошо структурированный большой учебный проект продемонстрирует передовые практики и поможет открыть для себя новые технологии. Более того, это определенно заставит глубже погрузиться в те части документации, которые Вы пропустили или предпочли просмотреть (и это действительно случается со всеми: соблазн велик).

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

Чем больше Вы читаете, слушаете, пишете и говорите, тем более красноречивым носителем языка становитесь. Чем больше Вы читаете и пишете, тем лучшим пользователем языка программирования становитесь. Практикуйтесь, выражайте себя и становитесь лучше с каждым сеансом программирования. И не забудьте взглянуть на некоторые ранние записи после того, как запустите свой Magnum Opus: это обязательно вызовет улыбку на лице.

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

Удачи Вам в этом чудесном путешествии!