Какой язык программирования учить?

В последнее время мне довольно часто задают один и тот же вопрос: Какой язык стоит учить. И короткий ответ на этот вопрос будет “любой”.  Почему на самом деле любой? Во-первых я не знаю, чем вы конкретно хотите заняться. Я же не могу залезть вам в голову и посмотреть, что вам интересно. Хотите ли вы заниматься разработкой игр или сайтами или чем угодно. То есть если вы в начале вашего программистского пути, то вам действительно нужно сперва определиться с областью, которая бы вас занимала, скажем, так, на полгода как минимум. То есть что-то чтобы вас интересовало на столько чтобы вы могли всё своё свободное время уделять изучению. Я в своё время начинал с PHP, просто потому что я услышал что сайты можно программировать на PHP и никто меня не разубедил, а мне хотелось попробовать программировать сайты. Как я учил PHP это вообще отдельная история, потому что Github-a тогда не было и никто не делился. И не было никаких интересных курсов, которые можно было бы за три месяца пройти и потом написать какой-то маленький PHP сайт. Были разные каталоги, так называемых скриптов, скрипт для гостевой книги, скрипт магазина и тому подобное. Где мы могли просто найти какой-то готовый скрипт, положить его в определённую папку на сервере и вот у нас была бы готовая гостевая книга.

Если вы не определились с какой-то такой платформой, то есть, что вы хотите делать. Хотите ли вы писать игры, мобильные приложения, веб сайты, приложения для рабочего стола, там. Что угодно. Тогда, риская попасть под обстрел более старших коллег, я бы предложил изучить вам JavaScript. Но тут надо приготовиться  к тому, что бесплатного пирога здесь нет и JavaScript поставляется в комплекте с кучей, недоработок. О которых нужно знать и о которые постоянно спотыкаешься и если вы хотите понять о чём я говорю, вы можете погуглить «WTF Javascript» и вам сразу же всё станет ясно. Но штука в том, что JavaScript движется в сторону того чтобы стать платформой, а не быть просто языком. Но пока, если вы просто знаете JavaScript, вы можете написать Back-end и Front-end сайта, вы можете написать мобильное приложение, вы можете написать Desktop приложение под платформу Electron, вы можете написать расширение для браузера, вы можете написать практически всё что угодно, если вы знаете JavaScript.

Вообще что следует заметить, что какой-то серебряной пули нет. То есть нельзя сказать, что вот, если ты сейчас молодой программист или начинающий, ты инвестируешь пол года или год своего времени в изучение какого-то языка, то этот язык станет потом, или останется, чем-то большим. Или станет, чем-то большим и вы будете много денег зарабатывать или что-то ещё такое. То есть вообще ни каких гарантий здесь нет по этому вопросу. Понятное дело, что скорее всего PHP, JavaScript, Ruby, Java, C++ и тому подобные, мастодонты, будут ещё какое-то время на сцене.

Про какие-то новые языки сложно сказать, да и опять-таки, даже прогнозировать то, что языки останутся в деле, очень тяжело. Потому что был например язык ActionScript для Flash-а. Flash как платформа практически умер, его нет. То есть люди, которые делали ставку на ActionScript в своё время, они вынуждены сейчас переезжать на что-то другое. И скорее всего, что-то другое это JavaScript так или иначе, если они хотят остаться в сфере разработки, например сложных UI. Если они хотят остаться в сфере разработки игр, то они переезжают на Unity. Unity, на сколько я знаю это С#.

Опять так возвращаясь к тому, чем вы хотите заниматься, если вы хотите программировать игры, то скорее всего вам нужно что-то более хардкорное, что-то ближе к железу. Это скорее всего будет С. Я не знаю, для Android-а наверное хватит Java, хотя там по моему тоже есть Native Development Kit, который тоже С по большому счёту.

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

Из своего опыта, то есть, я успел поработать с языком Perl, PHP, Ruby, Python, Javascript, немножко потрогал Erlang, немножко потрогал Elixir, немножко потрогал Clojure, немножко Java, в университете делал немножко C.

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

Но какой бы язык вы не начали учить, наверное, рекомендация может быть только одна. Не зацикливаться на этом языке и не принимать те концепции, которые язык этот проповедует, как данность или как что-то, что нужно тащить за собой, например, во все другие языки. То есть чем хорош Ruby, не смотря на то, что это объектно – ориентированный язык в целом, но по комьюнити гайдлайнам Ruby, манипуляции с данными осуществляются в довольно таки функциональной манере. И вы научитесь как манипулировать данными, коллекциями данных не через for each, а через map и фильтры и тому подобные функции. И это потом позволит вам принести эти концепции в другие языки. Потому что например, я слышал, что люди которые приходят в Scala из Ruby, пишут более чистый функциональный код. Если же они приходят из Java, они так и пытаются притащить эти все методы обработки данных старой школы. Когда просто в цикле for each перебирается вся коллекция, как-то она там изменяется, что-то там подпихивается, что-то делается ещё. В общем такой винегрет.

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

Есть очень замечательная книга, которую все рекомендуют: Structure and interpretation of computer programs. Это был учебник массачусетского института технологий (MIT). И там как раз таки вам даётся набор задачек, предлагается вам использовать язык Lisp или Scheme, что в общем-то диалект Lisp, для решения этих задачек. И в общем, по отзывам, эта книга очень хорошо ставит мозги программиста. Если у вас есть некоторое количество свободного времени, я бы рекомендовал эту книгу почитать.

В общем в завершении темы, короткий ответ на вопрос “какой язык учить?”, “любой язык”.  Ответ посложнее:

  • Определись с тем, чем тебе интересно заниматься и немножко погугли эту тему, какие языки используются сейчас. Потому что ты выучишь сейчас, скорее всего в будущем тебе не понадобится.
  • Изучайте не языки как таковые, а те основополагающие принципы, которые эти языки несут и структурируйте эти принципы в своей голове, чтобы получить количество этих переносимых навыков и стать лучшими инженерами
  • Не зацикливайтесь на одном языке
  • Попытайтесь выполнить какой-нибудь маленький проект на языке, чтобы он у вас был на Github. Примером такого проекта, я недавно слышал, один парень делает RSS читалки. Прямо сайт, в который ты можешь добавить RSS подписки, у тебя там будет функция, которая будет к тебе новые статьи тебе подтягивать. Там будет небольшой web-интерфейс, чтобы эти RSS статьи можно было читать. Это, по-моему, супер мини приложение, которое можно придумать и на котором можно потрогать язык или платформу.
  • Ну и наверное самый последний момент, это задавайте как можно больше вопросов. Потому что, когда вы задаёте вопросы, вы скорее всего получате ответы. И только задавая вопросы и получая ответы и разрабатывая эти вопросы, можно наверное чем-то научиться.