Что такое функциональное программирование + почему оно делает вас лучше

Что такое стиль программирования?

Когда программист садится, чтобы начать новый проект, ему нужно принять несколько решений, главное из которых - как написать программу. Кодирование - это гораздо более творческий процесс, чем это принято называть. Программы могут быть написаны на множестве разных языков и стилей (известных как парадигмы) от скриптов новой длины до однострочных, столь же понятных, как крылатые.

Это основная причина дискуссий в кругах программистов. Нет однозначного ответа. Есть много способов решения проблем, и, в конечном итоге, пока проект завершен, не имеет значения, как он был выполнен. Выбор стиля основывается на опыте программиста и деталях проекта.

Единственный хороший проект - это завершенный проект.

Функциональное программирование (FP) - один из таких стилей. Более распространенными стилями являются императивное программирование и объектно-ориентированное программирование. Эти стили представляют собой набор правил, которым вы должны следовать. Если язык программирования позволяет вам следовать рекомендациям по стилю [x], этот язык называется языком стиля [x]. Языки могут включать несколько стилей (например, Python) или фокусироваться только на одном стиле, известном как чистые языки. Однако эти правила обычно не соблюдаются (применяются только некоторые чистые языки), и их соблюдение остается на усмотрение программиста, что аналогично ответственности писателя за хорошую грамматику.

Что такое Функциональное программирование?

Аналогия времени: представьте себе внутреннее пространство большого фабричного пространства. Большой, совершенно пустой, солнечный свет вливается в высокие окна. Это пространство будет использоваться для производства автомобилей. Конкретно автомобили Tesla.

Потому что автомобили Tesla - это круто.

Заводской надзиратель (наш заменяющий программиста) понимает, что есть несколько вариантов размещения заводских машин и рабочих.

Императивный надзиратель производил машину на заводской линии. Компоненты начинаются на одном конце линии, а автомобиль выходит на другом. Попутно рабочие выполняют каждый этап строительства. Следующий рабочий зависит от предыдущего рабочего и ожидает его завершения. Медленно растущая машина движется по линии, пока рабочие финишируют. Для небольших проектов это нормально, но для крупных проектов эта производственная линия становится медленной и тратит много времени рабочего.

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

Функциональный надзиратель разделит производственный цех на звукоизолированные помещения, соединенные конвейерными лентами. Рабочие в одной комнате совершенно не подозревают об остальной части этажа. Они получают компоненты на одном конце и выдают результат на другой конец. Рабочие не должны знать об изменении состояния машины. Они знают только о том, что происходит в окрестностях. Они гордятся тем, что хорошо производят что-то одно, без побочных проектов или переделок, только ванильный продукт. Они никогда не увидят готовую машину. С такой регламентированной и простой задачей поиск ошибок еще проще. Смотритель может проверить ошибки, просто подсчитав количество комнат, выводимых правильно. Кроме того, новый надзиратель мог посещать и понимать назначение каждой комнаты и порядок работы производственного цеха без каких-либо объяснений.

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

Почему вы должны это использовать?

Повышение производительности

Стиль функционального программирования позволяет создавать более короткие программы за более короткое время благодаря:

Большая модульность

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

Неизбежному электрическому самолету Tesla по-прежнему нужны колеса

Более легкое тестирование

Когда комната выполняет одну функцию и производит один стандартный вывод, становится тривиальным проверить, совпадает ли этот вывод с предыдущими выводами.

Более легкая отладка

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

Specflow. Не функциональный (C #) проект. Удачи найти там ошибку. Источник

TickSpeck. Эквивалентный функциональный (F #) проект. Гораздо более простые зависимости. Источник

Готово к будущему

Параллельное программирование

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

Асинхронное программирование

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

Это хорошо для тебя

Как программист

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

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

Миямото Мусаси - самурай 17 века. Автор книги пяти колец

Как человек

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

Начните использовать FP сейчас

В последние годы каждый новый выпуск основных языков программирования приближал их к рекомендациям FP. Как чистые языки, так и языки, в основном ориентированные на FP, находятся на подъеме. Конкурентоспособные стартапы выбирают FP для своей новой кодовой базы, а существующие компании переходят на нее, чтобы помочь решить большие проблемы (Twitter на пути к Scala).

Что тебе мешает?

Дальнейшее чтение

Сравнения C # / F # взяты из отличной презентации Рэйчел Риз на Jet. Смотрите это здесь.

Первоисточник для сравнений - Скотт Влашин, см. Его статью здесь.

Для более технического чтения ознакомьтесь с академической статьей Почему важна FP (Джон Хьюз, Университет Глазго).

Спасибо Дэвиду Бруксу, техническому директору Whisk, который выступил с отличным докладом Что такое функциональное программирование? Почему нам должно быть до этого дело? в Бирмингемских функциональных программистах, что послужило мотивацией для этой должности.

Спасибо, что закончили публикацию. Если вам понравилось, подпишитесь на нас в twitter или подпишитесь на нашу рассылку, чтобы всегда быть в курсе.

Если вы хотите сделать карьеру в области функционального программирования, посетите нашу новую доску вакансий.

Если у вас есть отзывы, мысли или идеи для будущих публикаций, свяжитесь с нами @Functionalworks.