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

Есть много причин для изучения нового языка, в том числе (но не ограничиваясь ими):

  1. Вы начинаете программировать.
  2. У вас есть личный интерес к новому языку.
  3. Работа или учеба требует от вас изучения нового языка.
  4. Создавать с использованием технологий, которые лучше всего поддерживаются на другом языке.

В сегодняшнем посте мы рассмотрим некоторые эмпирические уроки, которые я извлек из постоянного увлечения искусством изучения языков.

Какие у меня полномочия для того, чтобы быть экспертом в этом вопросе?

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

Мое путешествие по изучению языка до сих пор выглядело так:

  1. Начиная с университета, требовалось изучить Java, Python, C, C #, C ++, R, Assembly и Haskell на разных этапах (в зависимости от предмета). Каждый из них был выбран не лично, а по требованию.
  2. Моя первая работа в университете была разработка для iOS. Первоначально для этого требовалось изучение Objective-C, а позже и Swift.
  3. Моя первая работа вне университета была в веб-разработке. В то время это означало добавление JavaScript и PHP к списку языков, которые мне пришлось освоить на протяжении многих лет.
  4. Когда я начинал свою нынешнюю работу в Culture Amp, мне иногда приходилось писать на Ruby, Elixir, Elm, ReasonML и Kotlin. Это также, вероятно, прекрасное время, чтобы заявить, что ничто из этого не является моей сильной стороной, но, безусловно, было обязательным требованием в течение моего короткого срока пребывания в должности.
  5. Я проявил личный интерес к изучению Golang и Rust, потому что, давайте посмотрим правде в глаза, Rust супер крутой, а Golang был доступным и отличной альтернативой для работы с веб-сервером, которую я выполнял в своих личных проектах.

Вышеупомянутое не включает другие DSL или расширенные наборы языков (например, TypeScript), которые мне пришлось выучить на этом пути.

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

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

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

Надеемся, что некоторые из этих уроков помогут вам в вашем собственном путешествии.

От всей души следуйте принципу Парето

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

Принцип Парето (также известный как правило 80/20, закон немногих жизненно важных или принцип разреженности факторов) утверждает, что для многих событий примерно 80% последствий происходят от 20% причин.

Когда дело доходит до изучения языков, я перефразирую этот принцип следующим образом: «Овладение языком на 20% означает 80% того, для чего вы хотите его использовать».

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

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

Держите в уме главные принципы

Хотя этот пост не будет углубляться в «Первые принципы», он должен быть в первых рядах того, что вы используете, чтобы понять, какие варианты выбора вошли в разработку языка.

Некоторые из первых принципов программирования, на которые я часто ссылаюсь на моем веб-сайте с заметками разработчика, включают:

  1. SOLID - принцип единой ответственности, принцип открытия-закрытия, принцип замещения Лискова, принцип разделения интерфейса, принцип инверсии зависимостей
  2. Поцелуй - Keep It Simple Stupid
  3. СУХОЙ - не повторяйся
  4. ЯГНИ - Тебе это не понадобится
  5. Композиция ›Наследование
  6. Разделение проблем
  7. Избегайте преждевременной оптимизации
  8. Рефакторинг Рефакторинг Рефакторинг
  9. Чистый код ›Умный код
  10. Бритва Оккама - перевешивает ли выгода стоимость?
  11. Принцип наименьшего удивления - именование не должно вызывать удивления в том, что оно делает.
  12. Закон Деметры - разделение ответственности между классами

Хотя я не буду вдаваться в подробности здесь, определенно стоит прочитать их, а также испытать их самостоятельно. Также важно понимать, что эти первые принципы применимы не ко всем языкам, и вы должны понимать, «где, когда и почему» их применять.

Ознакомьтесь с языковой документацией

«Дайте мне шесть часов, чтобы срубить дерево, а первые четыре я потрачу на то, чтобы точить топор».

Авраам Линкольн говорил о подготовке. Сегодня это мудрый совет в мире программирования. Прежде чем углубляться в изучение языка, ознакомьтесь с официальными языковыми ресурсами.

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

Это будет невероятно удобно для следующего шага, когда вы намочите ноги.

Если вы владелец Mac, подумайте об инвестициях в Dash. Это мой ресурс goto, особенно когда я начинаю изучать язык, и имеет отличную интеграцию с некоторыми IDE, такими как VSCode.

Изучите базовый уровень и практикуйтесь, практикуйтесь, практикуйтесь

Когда я говорю о «базовой линии», я говорю о некоторых основных идеях, общих для каждого языка:

  1. Объявление переменных и констант
  2. Типы данных
  3. Функции
  4. Комментарии
  5. Поток управления
  6. Отладка
  7. Структуры данных
  8. Общие методы и функции для работы со строками / массивами / объектами
  9. Регулярные выражения

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

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

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

Чтобы ускорить изучение базовой линии, я воспользуюсь двумя невероятными инструментами, чтобы попрактиковаться: язык REPL (чтение-оценка-печать-цикл) и онлайн-ресурсы для отработки алгоритмов.

Используйте REPL

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

REPL - ваш лучший друг для быстрого начала понимания таких вещей, как типы данных и простые короткие методы.

Используйте онлайн-источники для отработки алгоритмов

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

Ряд сайтов в Интернете или наборов задач, которые вы можете найти локально, могут помочь вам в практике:

  1. Https://www.hackerrank.com/
  2. Https://coderbyte.com/
  3. Https://exercism.io/

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

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

Научитесь тестировать рано и часто

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

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

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

Что произойдет, если вы попытаетесь сделать что-то подобное на динамическом языке, таком как JavaScript, Ruby или Python? Удалось ли вам уловить эти крайние случаи?

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

Что касается часто - как только вы поняли, как писать модульные тесты, пишите их как можно чаще.

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

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

Узнайте, как управление пакетами работает для вашего языка

Bundler, Cargo, Yarn, NPM, Cocoapods, PipEnv, NuGet, Gradle, Hex. Что у всего этого общего? Все они являются ключевыми инструментами для установки пакетов и управления ими в различных языковых экосистемах.

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

Я сделаю этот раздел кратким, но постараюсь узнать, какие инструменты для управления пакетами есть в вашем языке.

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

Я также настоятельно рекомендую проверить ресурсы, которые приведут вас к наиболее популярным проектам и пакетам для этого языка. Такие вещи, как библиотеки синтаксического анализа JSON / YML, популярные серверы, популярные служебные библиотеки и т. Д. Это подводит меня к следующему пункту.

Посмотрите репозиторий Awesome GitHub для этого языка

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

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

Эти ссылки могут включать (но не ограничиваются ими):

  1. Приложения
  2. Инструменты разработки
  3. Библиотеки
  4. Блоги
  5. Ресурсы
  6. Подкасты
  7. Люди, за которыми нужно следить

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

Это подводит меня к последнему (и самому замечательному):

Создайте свой собственный X

Пришло время применить все, что вы уже узнали, и начать разбивать некоторые проекты.

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

Приведенные примеры могут быть привязаны к конкретному языку, но, тем не менее, это невероятные ресурсы.

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

Создайте инструмент командной строки

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

Инструменты интерфейса командной строки, которые я создал для проектов, включают такие вещи, как:

  1. Боты-парсеры
  2. Средства визуализации PDF
  3. Генераторы счетов
  4. Генераторы кода
  5. Интерактивные новости через интерфейс командной строки
  6. Инфраструктура устойчива / рушится

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

Узнайте, как читать / писать файлы

Во время учебы в университете это были самые недооцененные навыки. Они законно потратили на это меньше пяти минут в моем введении в класс программирования и привели нелепый пример написания простого .txt файла.

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

Создайте веб-сервер

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

Эпилог

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

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

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

Ресурсы и дополнительная литература

  1. Потрясающе - репозиторий GitHub
  2. Создайте свой собственный X - GitHub Repo
  3. Википедия
  4. Мои заметки разработчика - Первые принципы

Изображение предоставлено: Дланор С

Изначально опубликовано в моем блоге.