Почему путь к функциональному программированию лежит через императивщину
27 мая 2013
Недавно я получил от читателей блога несколько похожих вопросов. Дескать, я хочу стать программистом, и мне интересно исключительно функциональное программирование. С какого языка вы бы посоветовали начать и где найти материалы по нему? Так вот, по моему убеждению, суровая действительность такова, что ни один из функциональных языков не подходит на роль первого.
Нет, вы вполне можете осилить Erlang или иной функциональный язык. Проблема состоит в том, что вам будет нелегко найти работу, связанную с ФП, не имея практического опыта в программировании. Потому что обычно на функциональных языках начинают писать люди, вдоволь наевшиеся говна с императивными языками. А значит, они уже имеют некоторый, вероятно, довольно большой, опыт в программировании. Таким людям не интересно объяснять новичкам, например, как пользоваться Git или как устанавливать пакеты в Linux. Предполагается, что вы уже должны знать эти вещи.
Усугубляет ситуацию тот факт, что вакансий, связанных с ФП, сравнительно мало. Поэтому, как ни странно, если вам интересно ФП, я советую начать с поиска работы, связанной с императивным программированием. Благодаря этой работе вы наберетесь ценного опыта, который потом позволит вам пойти работать функциональщиком. Не думайте, что таким образом вы потратите время впустую. Программирование — это далеко не только языки. Это еще и базы данных, системы контроля версий, операционные системы, протоколы, алгоритмы, структуры данные, общение с людьми и множество других увлекательных вещей. Все это пригодится!
Возможно, вы беспокоитесь, что, начав с императивщины, вы будете хуже понимать ФП. Это не так. Во-первых, в наше время все программисты начинают свой путь с Basic, Pascal и других императивных языков. Вроде, еще никому это не помешало перейти на ФП. Во-вторых, ничто не мешает писать на императивных языках в функциональном стиле. Насколько я понимаю, в последнее время это даже становится модным. Программисты на Java — и те стараются по возможности не использовать наследование и писать чистые функции. Наконец, знание парадигм, отличных от ФП, не помешает, а напротив, поможет вам в освоении ФП.
Оказывается, что чистых функциональных языков на самом деле не бывает. Как, по всей видимости, и чистых объектно-ориентированных языков. Программа должна иметь побочные эффекты, иначе она ничего не делает и потому бесполезна. Следовательно, в любом функциональном языке есть элементы императивщины. Scala и OCaml — гибридные языки, в них есть как ФП, так и ООП. В SML есть ссылки. В Haskell есть монада IO. Clojure и другие лиспы — это на самом деле Python с макросами и нормальной многопоточностью. Erlang — вообще чистейший объектно-ориентированный язык, куда более чистый, чем, скажем, Java или C++.
Также следует отметить, что для того, чтобы начать по-настоящему ценить ФП, нужно на своем опыте ощутить все ужасы императивного программирования. Узнать, что это такое — пытаться исправить ошибку в модуле, состоящего из пяти процедур, каждая из которых состоит из 1000 строк кода на Perl. Само собой разумеется, все это — с изменяемыми данными, глобальными переменными и шестиэтажными иерархиями классов. А ошибка при этом заключается в наличии дэдлока, состояния гонки или утечки памяти.
Так с какого императивного языка программирования начать? Я бы советовал выбрать один из интерпретируемых языков — Perl, Python или Ruby. Какой именно выбрать — не имеет значения, они примерно одинаково ужасны. Эти языки интересны тем, что они в любом случае пригодятся вам для написания небольших скриптов, делающих за вас всякую рутинную работу. Кроме того, они активно используются в крупных веб-проектах вроде Яндекса, Рамблера, Mail.ru или LiveJournal. Не знаю, насколько вам понравится работать в одной из этих компаний, но ценного опыта вы там точно наберетесь сполна.
Возможно, вам не очень интересна веб-разработка. Тогда вам могут больше понравиться Java или C#. В первом случае вам будет намного проще перейти на функциональные языки под JVM, например, Scala или Clojure. C# имеет смысл выбрать, если вы очень любите продукты компании Microsoft и вам интересен язык F# или OCaml.
Настоятельно рекомендую ориентироваться на функциональный язык, который реально где-то используется. К таким языкам можно смело отнести Erlang, Scala и Clojure. Диалекты лиспа довольно похожи друг на друга, так что, возможно, выбрать один из них — неплохая идея. Ходят слухи, что где-то пишут на OCaml, но ни одной вакансии мне до сих пор не попадалось. Достоверно известно о существовании вакансий для программистов на Haskell, но в последнее время я плохо понимаю, как на нем можно что-то писать.
Haskell, тем не менее, интересен своей способностью ломать мозг. В хорошем смысле. Пописав с полгода на Haskell, вы бесспорно станете более хорошим программистом на Erlang, Java или на чем вы там пишите. Также в некоторых книгах по функциональному программированию приводятся примеры кода на Haskell. Таким образом, знать его, по всей видимости, не повредит.
Где искать вакансии, связанные с функциональным программированием? Скорее всего, не на HeadHunter, хотя на момент написания этих строк там была пара вакансий для программистов на Erlang. Ищите в списках рассылок, на тематических форумах, в социальных сетях, блогах и Jabber-чатиках, на всевозможных сходках функциональщиков, в кулуарах на IT-конференциях. Вакансии есть, не извольте сомневаться.
Конкретные материалы по ФП советовать не стану, так как тут все сильно зависит от выбора языка программирования. Книг по функциональному программированию очень много, притом, как на английском, так и на русском языке. На мой взгляд, в учебных материалах нет недостатка.
Ну и в заключение отмечу, что я не претендую на знание истины в последней инстанции. Возможно, именно сейчас где-то открылась вакансия хаскелиста с единственным требованием к кандидату — умение пользоваться Google, что обесценивает большую часть написанного выше.
Кстати, если вдруг вы ищите функциональщиков, мне кажется, комментарии к этой заметке будут неплохим местом для того, чтобы оставить ссылку на вакансию!
Метки: Работа, Функциональное программирование, Языки программирования.
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.