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

Как же ответить, зачем нужна Кложа? Чем подкрепить точку зрения? Примерами из жизни.

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

Сидели в офисе, работали, устали. Захотели почесать языком. Коллега пожаловался на функцию map в Питоне, и пошло-поехало. В итоге мы вышли на функциональное программирование и работу с данными в ФП-стиле. Заспорили, как лучше обходить коллекции.

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

Я сначала не понял, почему это именно задача – в том смысле, почему над ней нужно думать. Совершенно рутинная вещь, два редьюса. Первый собирает все рейты по возрасту, второй считает среднее. Вот и все.

Можно свести два в один, как-то оптимизировать, но не суть. Главное, что кложурист вообще не видит здесь проблемы. Задача уже решена в уме, достаточно написать код в репле.

Три строчки: входные данные, промежуточный результат, итоговая свертка.

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

Если бы я писал этот текст полгода назад, то поместил бы едкий абзац с травлей. Но сейчас я только сочувствую. Нормально решить эту проблему в Питоне нельзя. Мапы и редьюсы там кастрированные, в третьей версии редьюс вообще спрятали в недра библиотек. Во всяких Гоу ничуть не лучше.

Понимаете, нет инструмента! А нет инструмента, нет и понимания, что чего-то не можешь. Будешь сраться в чате, доказывая, что твой язык клевый. А как же ты узнаешь как эффективно работать с данными, если в языке ничего для этого нет? Замкнутая система.

По аналогии со словом: если нет слова, значит, нет целого домена в сознании. Этой пустоты не видно изнутри, ее можно увидеть только со ступени выше. Я искренне верю тем, кто пишет, что ему и так нормально. Верю, нормально. Человек ко всему привыкает. Мы раньше и массив по i,j обходили и считали это нормальным. Но это не оправдание лени и нежеланию учиться.

Заглянем на StackOverflow. Каждый второй вопрос по Кложе связан с трансформацией данных. Типичный пост выглядит так: гайз, у меня вектор векторов мап, надо перевести в мап векторов мап. Как это сделать? И пример данных: что на входе, что на выходе. Автору кидают комбо из мап-редьюса, и вопрос закрыт.

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

Дело не в том, что в Кложе трудно обрабатывать коллекции. Наоборот, это сильнейшая ее сторона. Разница в том, что на этот раз автора заставили делать это правильно. Отсюда ломка.

Вспомним, как мы работаем с данными в императивном языке? Скажем, обходим список словарей. Начинается педерастия. Создаются списки и словари для накопления промежуточных данных. Код пробегает по коллекции три раза, хотя достаточно одного. Данные мутабельны, одни и те же ключи словаря перетираются.

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

В Кложе нельзя так, просто нельзя. В ней есть изменяемые коллекции и стейт, но это высокая планка. Язык так устроен, что если ты взялся что-то менять, то подружись сперва с неизменяемостью.

Вы, наверное, скажете, что на вашей работе не нужно возиться с коллекциями. Но у меня коллекции постоянно. В кложе нет классов, объектов, наследований и всей мишуры. Все данные, неважно откуда их взяли – из файла, базы или сети – это комбо из векторов и словарей. Их нужно колбасить из одного вида в другой. Постоянно. Почти весь код – это операции с коллекциями.

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

Возвращаясь к вопросу из заголовка – Кложа нужна затем, чтобы научиться работать с данными. Чтобы при одном только виде коллекции мозг автоматом выдавал комбо из map, reduce и filter.

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

Нет трудности в том, чтобы сесть за Кложу на недельку и повтыкать, как работать с данными. Мир после этого станет другим.