Об изучении нового языка программирования

1
424
views

Перевод статьи «On learning a new programming language».

Когда я только начинал свой карьерный путь, книги с названиями вроде «Самостоятельное изучение C за 21 день» и «Изучи Java за 7 дней» были весьма популярны. Меня поражало, что люди их читают. Сам я никогда не думал, что мог бы выучить новый язык программирования так быстро.

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

Какой язык следует считать новым?

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

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

Мой учебный план в университете включал изучение C и C++. В общей сложности на них выделялась пара часов. Времени было мало, но достаточно, чтобы обучить нас основным концепциям: например, рассказать об указателях. Когда по работе мне пришлось изучать Java, я понял, что его синтаксис мне кажется знакомым. Разница в системах управления памятью меня не слишком волновала.

Аналогично, когда мне нужно было изучить JavaScript, синтаксис опять же показался мне знакомым. Циклы и оценка условий были те же, разве что не хватало типов и классов (на тот момент).

Впервые со значительными трудностями при попытке изучения нового языка я столкнулся, когда пытался овладеть Scala. Некоторые особенности этого языка были для меня совершенно новыми, например, вывод типов, изменчивость, for-comprehensions и имплицитные (неявные) параметры. Две последние концепции в то время показались мне довольно странными.

Замечу, что хотя теперь, благодаря Python, for-comprehensions мне понятны, неявные параметры я по-прежнему считаю плохой идеей.

Переход от Scala и Java к Kotlin был довольно простым. С моей точки зрения все эти языки были более-менее связаны между собой.

Но кажущаяся легкость испарилась, когда я попытался изучить Clojure.

Этот язык имеет другой синтаксис, родственный LISP: вместо function(param1, param2) в нем пишется (function param1 param2). Я довольно долго пытался его изучить, но и по сей день не могу читать код на Clojure, за исключением самого элементарного.

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

Когда говорят «изучить язык», что конкретно имеют в виду?

Еще одна проблема, связанная с книгами «Изучить Х за Y дней», — определение того, что имеется в виду под «изучить».

В предыдущем разделе я много говорил о синтаксисе. Если учитывать именно этот аспект, C, JavaScript, Scala и Java довольно похожи. Изучение синтаксиса это вопрос нескольких дней. Но язык это не только синтаксис.

Помимо него, учащийся должен познакомиться с библиотеками. Любое маломальски сложное приложение требует использования большого количества стандартных утилит (форматирование даты, HTTP-клиент и т. п.). Хотя синтаксис языка может предоставлять некоторый функционал, остальное ложится на плечи API. Эти API могут быть доступны «из коробки» (HttpClient в Java), через стандартную библиотеку (stdlib для Kotlin) или через сторонние библиотеки.

При этом следует учитывать разницу в экосистемах языков. Java предлагает более широкий выбор сторонних библиотек, чем C#. А в JavaScript библиотеки чаще меняются, чем в Java.

Но как бы то ни было, для изучения нового языка программирования нужно:

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

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

Но основная «улика» — разыменование локальных переменных в конце методов:

public void foo() {
  Object foo = new Object();      <1>
  // Work with foo
  foo = null;                     <2>
}

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

Кроме того, у каждого языка есть своя экосистема и инструментарий. И хотя «настоящие разработчики отладкой не занимаются», это одна из первых вещей, которые я изучаю при освоении нового языка программирования. Я знаю, как это делается в JVM-языках и JavaScript (во фронтенде). Код на Python я писал недостаточно, чтобы научиться дебажить, если, конечно, не считать вставку print-ов в код.

А если говорить об инструментарии, то отладкой дело ведь не ограничивается. Также следует узнать:

  • Какая(ие) IDE лучше всего подходит(ят) для разработки на этом языке? На освоение новой незнакомой IDE уходит куча времени.
  • Нужно ли освобождать память или в языке есть сборщик мусора?
  • Как запускается код? Интерпретируется он напрямую или вам нужно скомпилировать его? А может, что-то среднее, вроде того, как устроено в JVM или байт-коде Microsoft?

Изучение языка программирования имеет несколько аспектов:

  1. Синтаксис
  2. Библиотеки
  3. Написание идиоматического кода
  4. Окружающая экосистема.

Какой уровень навыков имеется в виду?

Наконец, стоит заострить внимание на том, какой уровень навыков подразумевает выражение «изучить язык». Два года назад мне понадобилось сделать маленькое, хотя и нетривиальное, обновление приложения на Python (Flask). Хотя я сталкивался с Python только один раз в жизни, да и то 15 лет назад, я сумел достигнуть цели — благодаря гуглопоиску. На код-ревью мои коллеги попросили меня использовать некоторые идиомы Python и исправить то, что заметил линтер. Знаю ли я Python? Нет, конечно. Но я все равно смог обновить готовое приложение, не изучая язык две недели.

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

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

Итоги

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

1 КОММЕНТАРИЙ

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

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

Please enter your comment!
Please enter your name here