пятница, 4 марта 2016 г.

Scala

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

Собственно, Scala is awesome. Оосам. За 2.5 года (чуть более чем) профессиональной (100% и свободное время) понимаю, что это что-то иное, чем ... язык.

В принципе, язык и есть способ мышления. Все еще поражает, что у меня есть рост (хотя вру, не поражает), но рост есть.

Начал отличать здоровую от нездоровой функциональщины. Пока у нас в коде есть 2-3 кб нездоровой функциональщины. Нездоровая - это когда ты и твоя команда не понимает, как оно работает. В общем, у нас есть немного shapeless с небольшими включениями HList-ов. Базовую концепцию понять не сложно, но у нас кусок нездоровой. В принципе, я понимал, что это можно сделать магией, спросил на StackOverFlow, и получил кусок магии. Суммарно 2-3 дня вкуривания, и ... не помогло.

Еще в 2-3 местах хочется scalaz.Functor.lift, но не критично. По факту хочется лифтинга с базовой функции на коллекцию, что еще внутри параллелизм был. Одного метода вручную должно хватить.

Еще у нас есть имплициты (неожиданно, правда?), очевидно, у всех есть. А еще есть имплицит, который из одного имплицита достает что надо. То есть такой рекурсивный имплицит на один уровень.

Еще у нас есть 4Тб сырых данных и 9.5 млрд строчек там. Это так, что б померяться. Правда, это вся история, а не за сутки.

Еще у нас нет null-ов. Вообще. Zero. Хотя NPE был на этой неделе, но там запрос в легаси БД, где джоиняться 10 таблиц (какие-то дебилы писали), и на выходе где-то пусто оказалось. Но дальше этого null-ы не пройдут. ScalaStyle проверяет, что в коде нет слова null. И точка.

Еще у нас нет var-ов. Лукавлю, есть. Есть два итератора, и как-то внутри итераторов без стейта вообще сложно, особенно, если он нужен. И еще в одном/двух местах, но там не я, и надо выпиливать.

Еще понимаешь, что дело не в языке, а в людях/головах. Бывает отвернешься, смотришь коммит, а там на тебя смотрит Try[Option[List[String]]]. Или null, или var, однажды вообще break торчал. А ты такой, берешь лопату, и говоришь: "Не надо так". Потом идешь в continuous integration и добавляешь правило, что оно само следило за порядком.

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

Еще был кусок макроса. Но нашлась библиотека, которая состоит из этого макроса. Enum собирать в коллекцию. Тот же рефлекшн, только компайл-тайм.

Еще в одном месте доабстрагировались, что есть мини-OLAP, с иерархической агрегацией, и все это в N строчек кода. N - мало.

А еще я понимаю, что хвастаться - не хорошо.

А еще есть чудики, которые пишут, что язык ХХХ - говно, мы перешли на Go, и все стало круто. Другие, что компания, занимающаяся языком YYY произвела ребрендинг (поменяла название), что языку YYY - хана.

Из всего этого я понял, что мир не одномерен (читай, язык ХХХ - лучший), а как минимум трехмерен [команда, задача, технологии]. Но об этом кричат люди, которые даже не в команде.

В общем, не будьте плоскими. Можно считать это тостом.