Привет!
Начинаем публиковать разговоры со спикерами FPConf 2017. Павел Аргентов расспросил самого зажигательного евангелиста ФП и Haskell Дениса Шевченко.
В начале разговора — расскажи немного о себе.
Меня зовут Денис Шевченко. Я основатель сообщества ruHaskell. В данный момент тружусь Haskell-разработчиком в компании IOHK. Бывший С++-разработчик, ныне Хаскелист, начинающий ФП-евангелист и автор незаконченной книги “Haskell по-человечески”.
В мировом океане программирования ФП возвышается неприступным континентом, который все вокруг воспринимают как обитель для людей недостижимо умных. Этакая “Башня из слоновой кости”. ФП изучают, в серьезных вузах. В то же время есть тезис, что ФП может быть полезно для программистской вселенной в целом. Как бы ты эту полезность обозначил?
Уже нельзя не заметить, что интерес к функциональным языкам (например, к Haskell) в настоящее время растет. О них говорят всё больше, о них пишут всё чаще. Кроме того, функциональным языкам обучаются в том числе и в российских ВУЗах. Но что ещё важнее, и эту тенденцию я вижу последние года три — функциональное программирование перестает быть элитарным, каковым оно было много лет назад. Раньше да, это было что-то “слоновокостное”, небожительное, академическое и потому очень трудное для большинства простых людей. Сегодня, к счастью, это уже не так. Сегодня люди, входящие в мир ФП, начинают успешно использовать его в своих проектах, не имея при этом пресловутого Ph.D. по математике и прочих регалий. ФП не просто применимо на практике — оно великолепно применимо на практике. Например, я сам задействован в не самом стандартном, но очень практическом проекте, где успешно применяется ФП. Количество команд, которые используют Haskell не только в сложных, но и в обычных задачах, медленно, но неуклонно растет по всему миру. Функциональная парадигма дает конкретные преимущества, которые можно увидеть, измерить и потрогать.
В доступном мне для непосредственного наблюдения мире Ruby-веб-девелопмента сейчас есть очень много подвижек в сторону применения иммутабельности, компонуемости и чистых функций. Получаются интересные решения, которые делают код компактным, предсказуемым и доступным для разумного анализа. Получается, что ФП проникает в область, которая изначально была вотчиной процедурного программирования. Что ты можешь сказать о том, насколько ФП полезно для развития
В своё время я решил познакомиться с ФП именно для того, расширить свои горизонты и, в некотором роде, чтобы стать умнее. Да, ФП меняет сознание, и меняет сильно, ведь в его основе лежат идеи из математики. Есть знаменитый афоризм “Математику уже затем учить надо, что она ум в порядок приводит”. Функциональные концепции активно входят в мейнстрим-языки. Эти идеи действительно хороши, иначе зачем бы люди стали их использовать там, где их никогда не было? Взять, например, Java и C++. Миллиарды строк кода написаны на этих языках по всему миру. Зачем же они добавили те же лямбда-функции в C++? Просто люди поняли, что ФП-концепции хороши, причём хороши не потому, кто-то сказал об этом на модной конференции, а потому, что практика ежедневной разработки доказывает это. Хорошо, когда мы можем рассуждать о корректности кода. Хорошо, когда эту корректность можно достоверно проверить. Хорошо, когда мы знаем, что код не способен преподнести нам неожиданных сюрпризов. В этом смысле я абсолютно уверен, что ФП помогает развиваться программисту в целом, независимо от языка. Однако я не соглашусь с теми, кто слишком уж поет дифирамбы функциональному программированию. Изучение ФП не сделает из среднего разработчика гения программирования, но несомненно даст ему шаг в развитии, расширит горизонты и позволит, скажем так, правильнее рассуждать о насущных задачах.
С высоты своего трехлетнего опыта применения Haskell в живых проектах могу сказать, что Haskell может быть полезен программистам из мира императивных языков именно в том ключе, что он привносит ту самую математическую красоту в каждодневную практику. Как уже было упомянуто ранее, функциональное программирование, впитав в себя дух математики, отгородило себя аурой сложности и излишней теоретичности, и, как следствие, мифом о высоком пороге вхождения. Многие разработчики до сих пор думают, что Haskell плохо применим на практике (или же неприменим вовсе). Этот образ сегодня, хоть и медленно, но успешно разрушается. Haskell, оставшись чисто функциональным языком, показал свою применимость на практике. Дело и в его развитой экосистеме, и в его удобстве для решения широкого круга задач. Немногие из функциональных языков могут похвастаться столь большим количеством библиотек, а ведь это один из показателей, на который смотрят разработчики, интересуясь, можно ли использовать язык в реальном проекте. Haskell — живое доказательство того, что ФП великолепно подходит для production.
Какие можно привести конкретные примеры использования Haskell в живых проектах? Я слышал отличное определение: “Haskell — замечательный язык для написания кратких и корректных программ”. Насколько это определение рифмуется с тем, о чем ты расскажешь?
Историй успешного применения Haskell уже весьма много. В процитированном тобой определении мы можем смело заменить слово “краткие” на “очень большие”. Что же такое “очень большие” программы в случае Haskell? Приведу канонический пример — международный банк “Standard Chartered Bank” со штаб-квартирой в Лондоне. Работает он на рынках Азии и Африки. Значительная часть инфраструктуры этого банка реализована на Haskell. А началось всё с того, что в команду банка было нанято несколько очень серьезных Haskell-специалистов, таких как Дон Стюарт, который собрал вокруг себя команду крутых разработчиков. До этого вся инфраструктура была написана на C++, C# и Java. Команде Стюарта была дана возможность переписать часть инфраструктуры на Haskell. Было поставлено очень жесткое условие — гарантировать что инфраструктура на Haskell будет в пять раз дешевле в обслуживании и во столько же эффективнее, чем то, что написано сейчас. И в итоге у них получилось! Сегодня банк продолжает успешно работать с большой частью инфраструктуры, построенной на Haskell. Все мы слышим хайп вокруг Big Data и Highload, а ведь инфраструктура международного банка по самой своей природе — это и Big Data, и Highload. Если там может существовать Haskell, то говорить о неприменимости его в серьезном продакшене уже не приходится.
Второй пример — часть бэкенда Facebook написана на Haskell. Естественно, там есть и другие языки, тот же OCaml. Интересный пример — применение Haskell в модуле онлайн-спам-фильтра. Инструмент, написанный на смеси Haskell/C++, успевает обрабатывать до миллиона сообщений в секунду. Я не знаю точно, каков процент Haskell в этом инструменте, но я точно знаю что green threads из Haskell там массивно задействованы. Но самое главное — вовсе не обязательно быть Google или Facebook, чтобы получать преимущества от функционального языка.
Или взять другую хайповую тему — блокчейн-решения. Haskell на сегодняшний день показал себя как великолепный инструмент для реализации такого рода систем, о чём свидетельствует опыт нашей компании. Лично я считаю, что на сегодняшний день Haskell если не самый лучший, то уж точно один из самых лучших языков для реализации любых блокчейн-систем.
Твой доклад будет о блокчейн-системе, реализованной на Haskell с твоим участием. Расскажи, какие именно плюсы мы получаем в блокчейне от функциональной парадигмы — и от Haskell в частности?
У функциональной парадигмы в целом и у Haskell в частности есть несколько таких краеугольных камней, которые мы вспоминаем, когда нас спрашивают, что же там такого особенного, в этом вашем ФП. Есть несколько фундаментальных характеристик, особенно ярко выраженных в Haskell, и все они отлично ложатся на блокчейн-систему. Например, Haskell, будучи иммутабельным языком, великолепно распараллеливается и столь же великолепно выполняется конкурентно. И мы знаем, что в обычном веб-приложении параллельность не всегда важна. Однако каждый узел распараллеленной блокчейн-сети (а их число может измеряться сотнями миллионов) производит огромное количество вычислительной работы. Каждый узел должен следить за целым рядом независящих друг от друга задач, и мы бы хотели, чтобы он делал это максимально эффективно, причем с использованием минимума ресурсов. А ведь это как раз та область, в которой Haskell великолепно себя показал! В итоге такой узел делает очень много всего одновременно — и это не сводит с ума кулеры на вашем компьютере.
Далее, говоря о криптовалюте, мы подразумеваем надежность и безопасность. Когда идет речь об оперировании чужими деньгами в больших объемах, мы хотим, чтобы все работало надежно и стабильно. В этой стезе Haskell также показывает свои сильные стороны. Когда мы отправляем деньги, мы хотим быть уверены, что они уйдут адресату, а не кому-то другому, а потому мы хотим быть уверенными в корректности соответствующего кода. И вот тут-то академические преимущества Haskell — такие как сильная статическая типизация — ложаться на практику, и мы можем быть уверены в тех аспектах корректности кода, в которых никогда не могли бы быть уверены при использовании большинства других языков. Когда в нашем коде все функции, которые могут преподнести неприятные сюрпризы, строго отделены от чистых функций, мы можем рассуждать о коде так, как не могли бы в случае использования большинства других языков (языков, где в каждой функции может происходить все что угодно). Кроме того, мы можем надстроить над Haskell-кодом такие инструменты, как Liquid Haskell, что поможет нам сделать шаг в сторону зависимых типов, и в этом случае мы будем способны отлавливать еще большее число ошибок и не допустить их проникновения на продакшн.
О безопасности. Я не очень силен в аспектах криптозащиты, но могу сказать словами наших ресерчеров — авторов нашего протокола: “Мы хотим быть уверенными в том, что все, что написано в нашем whitepaper, будет точно реализовано. Что вся красивая математическая теория корректно ляжет на практику, на конкретное приложение.” Делая выбор, мы понимали, что одни языки подходят для этого лучше, другие хуже. Поэтому с самого начала было принято решение в пользу Haskell, и со временем мы многократно убедились в правильности этого решения.
В заключение, как мы можем мотивировать работать с ФП не только разработчиков, но и менеджеров и управленцев?
Самый главный мой посыл для рядовых разработчиков — не бойтесь! Функциональное программирование никогда не было страшным, и сегодня убедиться в этом просто, как никогда ранее. Попробуйте узнать, что это такое. На грядущей конференции 9 из 19 докладов будут посвящены языку Haskell. Это вызывает вопрос: почему люди из разных компаний используют один и тот же язык? Не бойтесь узнать о нем больше. Недавно я был на конференции в Саратове, и там многие рядовые разработчики интересовались Haskell. Я им давал тот же совет — не бойтесь, вы приятно удивитесь, что в Haskell нет ничего страшного. Самый главный посыл — не технический, а ментальный. Перестаньте бояться, как перестал в свое время я.
Интересно, что там же, в Саратове, языком Haskell интересовались и менеджеры, и генеральные директора. Главными вопросами были “Где взять Haskell-специалистов?” и “Сколько есть компаний в России, успешно применяющих Haskell в своём бизнесе?” Я сказал, что лично знаю пять таких мест. Мне ответили, что это катастрофически мало. И это так, но чуть ранее их было ровно ноль. И потому самый главный посыл для руководителей тот же — не бойтесь! Не бойтесь узнать больше о Haskell.
Да, есть страх о команде. Где и как искать людей? Если, например, Haskell-специалист уйдет, где найти нового? Хочу вас обрадовать: сегодня в России нанимать Haskell-разработчиков гораздо проще, нежели искать работу, связанную с Haskell. Людей, которые хотели бы использовать этот язык в каждодневной работе, гораздо больше, чем реальных вакансий. А потому любую такую вакансию немедленно замечают. Попробуйте перевести какую-то часть вашего проекта на функциональные языки, и оцените преимущества — технические, организационные.
А есть ведь и другой аспект, психологический. Многие разработчики хотели бы использовать функциональные языки не только потому, что они дают технические преимущества, но и еще и потому что это классно, это “just for fun”, как говорил Торвальдс. Многие руководители сталкиваются с проблемой мотивации. “Сидеть” на одном мейнстрим-языке год за годом — это надоедает. ФП — это в том числе и возможность привнести те самые fun и новизну в каждодневную работу. Именно благодаря новизне многие программисты хотят изучать и использовать такие инструменты. Поэтому повторю свой главный посыл руководителям — не бойтесь! Людей в России, интересующихся тем же Haskell и использующих его для своих исследовательских и тренировочных проектов гораздо больше, чем может показаться. Не бойтесь попробовать!
Интересно? Узнать у Дениса больше можно будет 2 декабря на FPConf, приходите!
Автор: vorona_karabuta