9 шагов к освоению любого языка программирования

0
5338
views

Перевод статьи «The 9-Step Plan For Becoming Dangerous In Any Language».

Photo by Xiong Yan on Unsplash

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

Люди изучают языки программирования по многим причинам. Например, когда:

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

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

Почему я считаю, что могу давать советы?

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

Сейчас мой путь в «языкознании» выглядит так:

  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 доступен и отлично подходил для работы с веб-серверами, которой я занимался в свободное время.

Я не включаю в список родственные языки (например, TypeScript), которые тоже изучал попутно.

Мне бы не хотелось пробудить в ком-то синдром самозванца, так что скажу еще кое-что.

  1. Я не какой-то там гений программирования. Разные языки я знаю на очень разных уровнях. Некоторые, как мне кажется, знаю вообще очень плохо: я изучал их только в той мере, какая была необходима для выполнения конкретной задачи.
  2. Я убежден, что хорошо знать можно только то, чем пользуешься постоянно. Например, я довольно долго работал с Objective-C, но это было давно. Если вы прямо сейчас попросите меня написать «Hello, World» на этом языке, мне придется гуглить или рыться в записях. Да, то, что вы знали и забыли, можно быстро восстановить в памяти. Но никто не занимается ежедневным повторением языков, которыми больше не пользуется: в жизни есть вещи поинтереснее.

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

1. Следование принципу Парето

Формулировку возьмем из Википедии: «20% усилий дают 80% результата, а остальные 80% усилий — лишь 20% результата».

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

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

Но лично мне нравится поговорка «Jack of all trades, master of none, oftentimes better than a master of one» (приблизительно можно перевести как «специалист широкого профиля, не имеющий узкой специализации, зачастую бывает полезнее, чем узкий специалист», — прим. перев.).

За время своей карьеры вы постепенно придете к пониманию, что никакой язык не является универсальным, подходящим для всех случаев жизни (хотя JavaScript и Python приближаются к этому), так что все равно придется учить несколько.

Photo by XPS on Unsplash

2. Не упускайте из виду принципы программирования

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

  1. SOLID (принцип единственной ответственности, принцип открытости/закрытости, принцип подстановки Барбары Лисков, принцип разделения интерфейса, принцип инверсии зависимостей).
  2. KISS («Придерживайся простоты»).
  3. YAGNI («Тебе это не понадобится»).
  4. DRY («Не повторяйся»).
  5. Композиция важнее наследования.
  6. Разделение ответственности.
  7. Избегай преждевременной оптимизации.
  8. Рефакторинг, рефакторинг, рефакторинг.
  9. Чистый код лучше, чем хитроумный код.
  10. Бритва Оккама (Преимущества перевешивают недостатки?)
  11. Принцип наименьшего удивления (При выборе имен надо следить за тем, чтобы они отражали сущность объектов).
  12. Закон Деметры (Разделение ответственности между классами).

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

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

«Если у меня будет 6 часов на то, чтобы срубить дерево, первые 4 я потрачу на заточку топора».

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

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

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

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

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

Под «основами» я подразумеваю некоторые основные идеи, присутствующие в каждом языке:

  1. объявление переменных и констант
  2. типы данных
  3. функции
  4. комментарии
  5. контроль потоков
  6. структуры данных
  7. часто применяемые методы и функции для работы со строками (массивами, объектами)
  8. регулярные выражения.

По мере накопления опыта вы начнете видеть общие паттерны и на этом успокоитесь. А вот этого не надо! Хотя else/if и варианты switch могут быть легкими для понимания, научиться использовать их на практике с учетом всех мелких различий может быть не так просто.

Последние три пункта списка я выделил особо. Пункты 6 и 7 очень важны для работы. Возможно, вы это и так знаете, но практически всё хранится в каких-либо структурах данных. Изучить, как хранятся данные и какие методы есть в языке для манипуляций с данными — существенная часть освоения языка. Здесь вам поможет изучение документации, о котором мы говорили в предыдущем пункте.

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

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

Использование REPL

(Прим. ред. Techrocks. Из Википедии: «REPL — форма организации простой интерактивной среды программирования в рамках средств интерфейса командной строки. В такой среде пользователь может вводить выражения, которые среда тут же будет вычислять, а результат вычисления отображать пользователю»).

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

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

Онлайн-ресурсы для практики в алгоритмах

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

  1. https://www.hackerrank.com/
  2. https://coderbyte.com/
  3. https://exercism.io/
Photo by Remy_Loz on Unsplash

5. Как можно раньше учитесь тестировать свой код и тестируйте его почаще

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

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

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

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

6. Изучите, как в вашем языке работает менеджмент пакетов

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

Если вам приходилось пользоваться хоть одним из них, вы должны понимать, насколько это важно.

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

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

7. Поищите Awesome-репозитории на GitHub, связанные с вашим языком

Оригинальный репозиторий awesome — это невероятный ресурс для поиска связанных репозиториев для отдельных языков и технологий. Раздел Programming Languages — настоящая сокровищница со ссылками на потрясающие ресурсы по языку.

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

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

Photo by Amin Hasani on Unsplash

8. Практика. Build your own X

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

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

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

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

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

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

Среди созданных мной CLI-инструментов были:

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

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

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

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

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

9. Научитесь чтению файлов и записи в файлы

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

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

Эпилог

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

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

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here