Выбор языка программирования для новичков

Последние дни часто слышу вопросы “с чего начинать обучение будущему программисту”. Какие книги читать. На какие языки программирования смотреть. Про книги написано много, повторяться не хочется. А хочется сделать обзор языков программирования, которые, по моему мнению, актуальны в 2017-м году чтоб обратить на них внимание. Новичкам можно учить любой. Даже C++, который по праву считается одним из самых сложных. По всем языкам написаны книги, которые расчитаны на аудиторию, начинающую знакомиться с программированием. В языках нет какого-либо порядка по важности. Просто список.

  • C: Один из самых низкоуровневых языков. Достаточно прост. До сих пор один из самых используемых. Большинство команд линукса и системных утилит написано на C. Многие высокопроизводительные сервисы написаны на C (web: nginx, dns: bind). Если вы собираетесь программировать ради денег, т.е. делатель только то, за что вам платят деньги, не думаю, что когда-то вам понадобится что-то писать на C. Хотя я считаю, умение читать C необходимое условие для человека, который называет себя программистом. Этот язык очень подвержен ошибкам. Очень легко съесть всю память, просто забыв освободить неиспользуемую. Или допустить переполнение буфера, приводящее к удаленному выполнению произвольного кода на вашем сервере. Большинство проблем безопасности находится в программах, написанных на C и PHP.

  • C++: Один из самых сложных языков программирования. Я не знаю места, где бы в полной мере использовали C++. У всех какие-то соглашения о подмножестве языка, которое можно использовать: где-то запрещено использовать шаблоны, где-то отказались от исключений. Этот язык все-еще в тройке самый распространенных прикладных языков программирования. Если вы хотите писать на более-менее высокоуровневом языке, который имеет классы, много сторонних библиотек, и при этом вы хотите быть максимально близко к железу, то вам сюда. На C++ писать сильно проще (быстрее, компактнее), чем на C, но на нем можно допускать почти те-же ошибки, что и на C. Этот язык практически de facto стандарт при разработке игр.

  • Python: Скриптовый язык. Выполняется внутри виртуальной машины. Отсюда считается очень медленным. Хотя это не всегда правда. Python очень хорошо интегрируется с другими языками типа C, поэтому многие библиотеки на Python написаны на C. И если вы хотите написать какую-то программу, которая будет лопатить большие объемы чисел, то по факту вы будете пользоваться высокоуровневыми вызовами сторонних библиотек, которые написаны на C людьми с большими головами. И скорость обработки ваших данных будет такая, которую вы сами никогда не достигнете, даже используя C. Язык считается очень простым. Наверное, благодаря тому, что можно в 3 строчки написать свой веб-сервер, который будет раздавать файлики из какой-то директории. Или в пару строчек открыть файл, перелопатить его и преобразовать в другой файл. Очень лаконичный язык. Имеет огромное кол-во конструкций, которые позволяют кратко выражать сложные алгоритмы. Под Python написано огромное кол-во библиотек. Вы можете писать web-приложения, заниматься научными рассчетами, обучать нейронные сети или пользоваться ими. Практически все можно сделать с помощью Python’а. Язык считается идеальным для новичков. Многие университеты переводят программы обучения на Python. Но опасность этого языка, что он прячет от вас железо. Вы практически не задумываетесь о памяти или потреблении CPU когда программируете на этом языке. Многие люди, освоив Python и научившись писать на одном из web-framework’ов типа Django, навсегда зависают в этой экосистеме и при попытке написать какую-то другую программу, кроме web-приложения, оказывается, что не могу сделать даже простых вещей. Еще Python для меня один из самых сложных языков программирования. У него огромное кол-во конструкций и нюансов, если капнуть глубже. Я могу весь день на собеседовании гонять по Python’у. На Python нельзя сделать те-же ошибки, что и на C/C++. Вам не нужно освобождать память, за вас это делает виртуальная машина. Вам не нужно следить за переполнением буфера, за вас это делают реализации массивов и строк. Это идеальный язык, который можно использовать для написания небольших программ автоматизации, которые упрощают жизнь.

  • Java: Что-то среднее между C++ и Python. Как и в Python, вам не нужно задумываться про освобождение памяти, за вас это делает виртуальная машина. Как и в Python’е код выполняется в виртуальной машине. Но выполняется сильно быстрее, чем в Python, т.к. язык достаточно низкоуровневый. Синтаксически очень похож на C++, но имеет мало что общего с ним. Этот язык практически стандарт de facto в больших компаниях. Имеет развесистые фреймворки с хорошей коммерческой поддержкой. Считается самым используемым в мире языком по версии tiobe за 2017 год. Один из самый зрелых рынков. Достаточно легко найти работу. Последние версии Java начали идти в сторону модных тенденций функционального и реактивного программирования, поэтому его уже сложно назвать многословным языком для корпораций. Практически идеальный язык для написания серверных приложений. Инфраструктура вокруг языка наиболее развесистая из всех, что я знаю. Прекрасные IDE, средства мониторинка, средства сборки и разворачивания приложений. Много коммерческих компаний пишут программы, которые облегчают жизнь программистам на Java. Огромное количество источников информации: книги, статьи, конференции, курсы.

  • Go (AKA Golang): Относительно молодой язык от Google’а. Как и java/python имеет сборщик мусора. Т.е. вам не нужно следить за памятью, она очищается сама. Как и C/C++, язык компилируется в нативный код операционной системы. Т.е. в нем нет виртуальной машины и он исполняется очень быстро. Синтаксис похож на C. С точки зрения конструкции, очень бедный язык. Но очень простой. Google сознательно далали универсальный язык, который можно освоить за один вечер и свою первую полезную программу написать в первый день изучения языка. Многие его ругают за его простоту, которая выливается в многословность. Но язык прекрасно подходит для написания быстрых веб-приложений. Многозадачность и параллельность встроены в язык. Т.е. ваши программы могут выполняться на всех ядрах процессора просто, если вы будете писать идеологически правильно на Go, а не втупую переписывать на него программы с других языков. Часто Go расценивается как замена Python. Многие компании переписывают на Go части своих систем, написанных на Python, ради экономии ресурсов (серверов). Не знаю пока никого, кто бы переписывал в Java на Go.

  • JavaScript: Язык de facto, если вы пишете приложение для браузера. Т.е. если собираетесь работать с web’ом, то JavaScript нужно знать. Но нельзя знать только JavaScript. Некоторые люди пишут server-side приложения на JavaScript. Ничего не имею против такого подхода, но если вы знаете только JavaScript и пишите на нем все только потому, что не знаете других языков, это плохо. Больше мне нечего сказать про этот язык. Многие люди предпочли бы, чтоб этого языка не было вообще. Но факт остается фактом. Этот язык встроен в каждый браузер на земле. И пока это не изменится (а это никогда не изменится), JavaScript будет одним из самых популярных языков.

  • Rust: Современная замена C/C++. Лишен проблем этих языков таких как утечки памяти. В язык добавлено много интересных вещей из других миров. Исходных код компилируется в нативный. Виртуальной машины нет. Сборщика мусора также нет, т.е. работать должен без пауз на сборку мусора в отличие от Go. Также в отличие от Go язык более компактный. Это, наверное, единственный язык, который я бы не советовал учить в качестве первого. И дело даже не в его сложности (C++ тоже сложный). Просто язык слишком молодой. Мои первые попытки изучить его постоянно натыкались на какие-то несоответствия. Читаешь какую-то книгу, делаешь как написано, а оно не работает, т.к. многое уже поменялось. Раза с третьего дочитал книгу по Rust’у до конца и понял некоторые концепции. Экосистема вокруг языка тоже слабая. Но я верю, что перспективы у этого языка хорошие. И многие люди уже используют его как основной. Но комьюнити и источники для обущения пока самые слабые из всего, что перечислено выше.

Отдельными пунктами хотелось бы выделить языки Objective-C & Swift. Они вам понадобятся только в случае, если вы захотите писать что-то для Apple’овских железок (macOS, iOS, watchOS).

Итак, возвращаясь к вопросу какой язык учить первым? Я не знаю. Мое мнение по этому поводу меняется из месяца в месяц. Иногда мне кажется, что начинать нужно с Python’а. Потом после очередного собеседования человека, который в своей жизни не видел ничего кроме Python’а мне кажется, что нужно учить C, как самый примитивный язык. Это две крайности. На самом деле, я думаю программисту должно быть не важно на каком языке писать. Эта фраза регулярно проскакивает в разных статьях. Программист должен осознавать поставленную задачу, видеть архитектуру программы, которая решит эту задачу и просто реализовывать эту архитектуру на том языке, который по его мнению подходит лучше всего. Т.е. выходит, что вы должны знать все эти языки, чтоб в зависимости от поставленной задачи использовать наиболее подходящий.

На работе я активно использую 3 языка: Go, Python, JavaScript. Но вне работы я читаю какие-то статьи или книги по другим языкам. Иногда использую для своих проектов. Мне бы хотелось обладать знаниями во всех языках. К сожалению, к apple’овским Objective-C & Swift я еще не добрался. И не факт, что завтра у меня не появится проект, для которого я посчитаю нужных использовать Java или Rust и буду писать на них.

Мое субъективное резюме. Не важно какой язык вы выучите первым. Вы должны знать их все. Хотя-бы поверхностно.