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


Жизнь, штука короткая, и ты не можешь просто изучить все. Даже все необходимые для работы вещи ты не можешь изучить действительно глубоко — тебе тупо некогда. Это создаёт большую проблему — приходится тщательно выбирать, что изучать. В свое время я выбрал учить F#. Это был долгий путь, недавно мы с основателем русскоязычного F# сообщества рассуждали на подкасте о причинах, и мне казалось, что я сделал прагматичный выбор.


F# — functional first язык, а это значит, что мои несчастные джуновские мозги, которые привыкли наследовать собаку от животного, и инкрементить ей количество лап в рантайме, прилично закипели. Я в упор не понимал, зачем мне приложение, которое не имеет изменяемого состояния, зачем мне переменные, которые не переменные, и почему я не должен использовать классы — ведь они так изящно описывают человеческий мир в терминах языка программирования.


Дело в том, что F# отлично суппортит функциональную парадигму, так же хорошо, как и императивную, объектно ориентированную. Грубо говоря, F# содержит все, что есть в C#, и добавляет к этому десятки других фич.


А это для меня выразительность языка — это самое важное. Насколько много у тебя способов выразить процесс из реального мира в коде, настолько и хорош ЯП. Есть старая мантра, что одну и ту же программу тысяча программистов напишет тысячей разных способов. Каждый из этих способов будет по-своему хорош. И идея тут в том. что у нас достаточно творческая работа. Всегда можно написать ПО лучше, чем оно уже написано.


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


Как выразить? Вот таким говнокодом:


public sealed class Data {
  public string Id { get; }

  public string Name { get; }

  public Data(string id, string name) {
    this.Id = id;
    this.Name = name;
  }
}

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


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


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


Большую часть этих проблем C# не позволяет решить с помощью автоматизации. Да, есть всякие аутомапперы, но если ты их используешь, лишаешься значительной части компайл тайм гарантий. Я мог бы использовать вместо класса структуру и получил бы автоматизацию сравнения, копирования, и почти ушёл бы от перечисления всех свойств.


Но у структур другая проблема — структуры в C# имеют конструктор без параметров по умолчанию, и это конструктор нельзя ни убрать, ни переопределить. А значит, мне придётся повсюду проверять все поля всех инстансов на null/default value. Ну, и ловить баги, конечно.


В F# проблема с таким кодом решается вот так:


type Data = {
  Id: string
  Name: string
}

Всё. Конструктор есть, иквалз из коробки по значению, копирование бесплатное. Получить новый инстанс с измененным именем — два пальца. Смотрите.


{ data with Name="newName" }

Эта штука из F# называется рекорд. Они крутые, но они не решают всех проблем в программировании. Ничто не решает. Но проблем то долбаная бесконечность, и чем больше фич в языке, тем больше шанс, что очередная проблема не испортит мой день. Ребята, которые пилят C# тоже так подумали — они завозят рекорды в C# 9. Точно так же, как несколько лет назад они завезли туда кортежи — после того. как увидели, насколько круто эти кортежи работают в F#.


А знаете что? Ну его нахрен. Я знаю, что вам насрать и вы уже точите свои контраргументы. Мне тоже насрать. Никому не нужны эти прагматичные доводы. Дело вот вообще не в этом.


Я задумал статью, которая всех убедит писать на F#, начал думать над какими-то аргументами, писать какие-то сниппеты с кодом, и всё такое. А потом понял, что лично я пишу на этом языке просто потому, что мне это нравится. Я становлюсь от этого радостным, и в какой-то момент это стало единственным, что имеет для меня значение.


Мы — разработчики, мы должны автоматизировать. Бизнес процессы, человеческие процессы, свою работу. Когда я не могу что-то автоматизировать, это значит, что я дерьмовый разработчик. И я бесконечно устал себя чувствовать таким.


Когда я с кем-то это обсуждаю, мне говорят одно и то же. Бизнес, Фил. Решай проблемы бизнеса, проблемы людей. Мать вашу, а чем я по-вашему занимаюсь на работе?! Всю свою взрослую жизнь я блин беру, и решаю долбаные проблемы бизнеса и проблемы долбаных людей. Да, мне насрать и на тех и на других, но мне ещё никто не говорил, что мой код говно, и я плохо решаю эти проблемы. Так какого хрена тогда я не могу искать какой-то смысл и для себя тоже? Мне до смерти надоел этот непрошибаемый прагматизм, когда говорят, что если что-то не приносит денег, и не решает проблемы людей, то не стоит тратить на это время.


Всю свою идиотскую жизнь я убеждался в одном — прагматизм не работает. Люди делают вещи не из прагматичных соображений. Чуваки из сообщества F# занимаются этим сообществом, переводят книги, тратят уйму времени — не потому что они подсчитали, что это выгодно. Они блин просто чувствуют кайф, потому что делают важную для самих себя вещь. В свободное от вашей сраной работы время.


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


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


Но все, что связано с настоящей работой вызывает отвращение. C# кормит меня уже семь лет. И кормит хорошо. Но я его искренне ненавижу. Может быть, для других разрабов невозможность автоматизировать какую-нибудь мелочь — просто досадная неприятность, но меня от этого буквально выворачивает. Когда мне в коде нужно по сто раз перечислять a.x = b.x, a.y=b.y — я чувствую себя несчастным, законченным идиотом. Любой недостаток сишарпа — напоминание для меня, что моя работа говно, жизнь из-за этого тоже говно, и программирование как индустрия — королевство говна.


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


Я уверен, если я бы писал на F# на работе, было бы такое же ощущение. Но пока это не так, F# решает огромное количество нерешаемых для C# проблем, я сижу, и программирую, не испытывая дискомфорта. Я поработал в больших и маленьких компаниях, я делал важные и не важные проекты. Где-то есть люди, которым мой код сильно улучшил жизнь, где-то есть такие, которые костерят меня на чем свет стоит.


Но меня это все не волнует. Меня волнует простое разрабовское счастье, кейс, когда ты уселся писать код — и от этого ты счастлив. И именно так работает программирование с использованием F#. Для меня.


Смотрите мой подкаст с основателем F# сообщества.