Я часто критикую технологии, которые кажутся мне неправильными, и в ответ получаю не только аргументы, но и откровенную злобу, обиду, и даже в морду.
Уколы в адрес технологий разрабы воспринимают на свой счет. Культ инструмента — очень странная штука, которую не объяснить логически. Одни говорят, что культ есть у всех, потому что
Чем бы оно ни было, я эту фигню не понимал никогда.
Сторонники культов кажутся мне непроходимыми тупицами. А я всегда пытаюсь понять, как тупицы стали тупицами, и почему тупицей не стал я. Начал думать и бам! — понял, что все-таки стал. Я тупица-культист, который восхваляет F#. И конечно за этим есть история.
Я начал карьеру как junior C# dev. Сырой тогда еще Xamarin, разработка под android. Первые шаги на первой работе были наполнены болью. Я в одиночку делал приложение по скриншотам и гифкам из iOS версии. Все билдилось через раз, проблем была куча, а единственный фидбек, который я получал — «а че не как на картинке?». Это был кошмар, и я быстро ушел.
Полгода учился дома разрабатывать, потом устроился в крупный аутстаф. Там все было как у людей — команда, менторы, экзамены, паттерны, кодревью, строгие линтеры, высочайшие требования к качеству, читаемости и производительности кода. Словом — взрослый подход. Я для себя точно решил — именно так и нужно работать. Но оказалось, это кошмар еще хуже.
Больше года мы целой командой делали модуль для инструмента, который работает с инструментами предназначенными для разработки инструментов. Возможно тех самых, которые нужны, чтобы мы делали модуль. Каждый день нас заставляли звонить то индийцами, то американцам, и отчитываться не понятно о чем.
В какой-то момент я заметил, что делаю все меньше и меньше, но ничего не меняется. На ломанном английском я откровенно врал: «ол паст вик ай серч фор баг. Стил ноу саксес. Вил континью»
«Ок, Фил, саундс грейт», говорили из-за океана.
Однажды в порыве стыда и отчаяния от своей бесполезности я пошел к начальству и попросил меня уволить, но мне зачем-то подняли зарплату. Про это я уже говорил. Мне не было ни смешно, ни радостно — это был убийственный сюр, как будто мир бесполезности победил мир логики.
Странное противоречие, но одновременно от скуки и супер-амбициозности я решил поиграть в крутого разработчика дома. В голове всегда роилась куча идей, как с помощью софтверных проектов сделать лучше мир и свой кошелек. Я все сделал как надо. ТЗ, архитектура, требования к системе, проект в VSTS. Все по-взрослому, прямо как у корпораций.
Нихера не получилось.
Решил — идея говно. Код на помойку, беру новую идею, бросаю, все повторяется несколько раз. Рассказываю коллегам, они недоумевают. Как же так? Ведь я же делаю все в точности так же, как и те, кто уже урвал свой кусок.
Человеку с моей самооценкой обычно легче жить, чем другим, но платить за это приходится дорого. Нужен качественный самообман, чтобы мириться со своими провалами. И я сказал себе: любой разработчик может сделать все, что угодно. Весь вопрос в том, как это будет сделано. И мои требования к этому «как» — слишком высокие. Они не подходят для домашних «стартапов» и они недостойны бесполезных бизнес-задач. Следующая мысль: «я не готов отказаться от своих стандартов качества». Даже если понадобиться сделать приложение, которое пердит по тапу на экран, я сделаю его настолько качественно и продуманно, насколько вообще могу.
В итоге я устроил локальный карго-культ бизнеса у себя дома. Притащил ритуалы, процессы, порядки, но не содержание. Просто поиграл в бизнес-разработчика без бизнеса, как папуас, который слепил из соломы взлетную полосу и вышки, а теперь ждет, что туда сядут железные птицы, как на соседнем острове у странных людишек.
Я писал невероятные кучи формального кода, которые не приближали меня к результату, а наоборот — я бродил вокруг и около. Моя карьера — это, блин, история фейлов и разочарований. Я плюнул на все, поставил на себе крест и просто смотрел на работе сериалы, пил по 16 чашек кофе и курил по пол дня.
Стукнувшись об самое дно, абсолютно случайно прочитал статью на Хабре про F#, попробовал, и такой: «Хм! Неплохо». Мой работодатель с удовольствием оплатил мне месяц обучения (он, правда, об этом не знает).
F# было не сложно изучать, у него тот же рантайм, что и у C#, а функциональный подход к программированию я и так ежедневно применял в TypeScript. И вот я понял, что могу перенести на F# любой свой проект. Оставим мой технический скилл за скобками, потому что скилл — штука относительная. В тех командах, где я работаю сейчас — я крутой, а в команде, скажем, разработчиков F# я мог бы претендовать, самое большее, на позицию помощника уборщицы.
Но на своем уровне я уже мог решать проблемы. Хотя в глубине души хорошо знал — ничего я не решу. Просто поворочаю мозгами и продолжу выкидывать знания на помойку. Я полностью растерял веру в разработку.
И в один из дней решил, что все это брошу нахрен. Была зима, холодно и темно. Я вышел из офиса на улицу, сел в тачку — она не заводится. Наконец двигатель затарахтел. Не знаю, что случилось раньше — то ли я почувствовал запах гари, то ли увидел дым. Потом из-под капота вырвалось пламя. Еще секунда, и я как псих бегаю по стоянке и ору всем, чтобы отгоняли свои машины подальше от моей.
Через пять минут паники и хаоса остался только старый обгорелый кусок дерьма и видюшки всяких оболтусов, которые потом набирали тысячи просмотров в местных «подслушано». Минус 30, я в осенней куртке человека, который собирался поехать домой в теплой машине. Задолбанный в конец, совершенно разбитый морально. Денег на такси нет, общественный транспорт для черни. Я пошел домой пешком, километров десять. Дома нужно помочь жене с ребенком, поесть, уложить их спать, сделать тысячу вещей. Но настает ночь, отвлекающие дела заканчиваются, отмазки тоже, и я остаюсь один на один с разочарованиями и бессонницей — я ни на что не годен, ничего ни с чем никогда не получится.
В этот худший вечер в жизни, еще толком не отогревшись, я решил дать себе последнюю попытку.
Я сел и решил писать маленький цифровой биом на F#, где юниты на машинном обучении будут взаимодействовать сами с собой, развиваться, а я буду крутить параметры и смотреть, во что они этот мирок превратят.
И да, возможно я тогда немного поехал рассудком.
Обычно я использую такую помесь нисходящего и восходящего подхода к проектированию. Описываю решение в общих чертах с помощью псевдокода. Затем начинаю реализовывать самые важные из деталей, которые, как самостоятельные модули, делаю уже наоборот. От деталей к общему.
Уже без псевдокода, я реализую пару тройку крупных модулей, и смотрю, а будет ли это все работать. Обычно, не работает, и я начинаю использовать итерации, повторяя этот процесс от начала и до конца до тех пор, пока оно не заведется. Но чаще просто забрасываю, итерации на пятой-шестой.
С F# я применил тот же подход. У меня было видение проекта, в общих чертах. В голове кирпичик за кирпичиком выстраивается реализация. Ты продумываешь один кейс за другим, и в какой-то момент понимаешь — все, ты уже знаешь, как это закодить. А потом садишься кодить, и понимаешь, что нет. Мысли не переносятся на ЯП, хоть тебе и казалось, что ты мыслишь как бы на нем. У меня так постоянно.
Но тут вышло по-другому. Я создал txt файл в VSCode, и написал псевдокод функции, которая описывает жизненный цикл моего приложения. И понял, что мой псевдокод — валидный F#. Ничего не нужно менять, я только что написал главную функцию проекта. Окей, поменял расширение у файла, добавил его в чистый солюшн. Вот есть функция жизненного цикла. Она принимает текущее состояние мира, штуку, которая его обрабатывает (собственно, сам мир) и выплевывает обновленное состояние, штуку, которая превращает состояние в набор параметров для ИИ и обратно, и сам ИИ, который получает свои параметры, и плюется принятым решением.
Дальше все просто. Взяли стейт, превратили его в ИИ параметры, скормили функции ИИ, результат превратили обратно в стейт, его в свою очередь отдали функции-игре, а результат отдали той же функции жизненного цикла. Божественная рекурсия, простой алгоритм, красивый код, весь GoF из коробки. Осталось реализовать все эти функции.
Но суть тут в том, что мне уже не нужно думать об архитектуре. Я пишу то, что у шарпистов-джавистов называется крутым термином Inversion of control container — функция, которая берет функцию жизненного цикла, и пробрасывает ей в параметры функции из моих модулей (II, Game). VScode подчеркивает ее красным, потому что ни модулей, ни функций в них еще нет. Но я получил главное — как только красные подчеркивания исчезнут, и проект можно будет сбилдтить — решение готово.
Просто беру, и по одному реализовываю эти модули, работая таким же образом. Весь проект — пять файлов. Файл с ИИ — 500 строк, много, но идиоматично. Прелесть подхода в том, что я смог написать рабочую функцию жизненного цикла — сердце моего приложения — не описывая больше ничего.
Вся архитектура — 10 строк кода, написанные за минуту. Никаких интерфейсов, абстрактных фабрик, Ioc-ов, всех этих DefaultInterfaceNameClass и прочей херни, которую мне в C# надо сделать еще до того, как я пойму, что я вообще хочу сделать. Ты берешь, и пишешь тупой код, который просто решает задачу, а он у тебя получается еще качественней, чем твои энтерпрайзные страдания на этих джавах-шарпах.
Я делал это, просто вбивая свои мысли в редактор, как будто я думал на F#. В местах, где на C# я бы писал план работы в комментах к коду, я фигачил работающие функции. Вместо описания десятков, а потом и сотен интерфейсов — один маленький файл с доменной моделью приложения. Сбилдил. Получил работающее решение. За ночь. С хорошим кодом, который потом не боялся показывать на собесах. Вот так просто.
Утром я написал на работу, что заболел, и погрузился с головой в проект на неделю, пока не понял, что идея-то моя — уже давно реализована и никому не нужна. Но я вернул себе веру, и это было главным.
Я не знаю, в чем тут дело — это F# охереннейшая технология, или просто она слишком хорошо подходит именно мне, или она создана именно для таких задач — какая разница? Важно то, что на тот момент я тонул, и мне нужен был спасательный круг. Жизнь кинула мне F#, и я выкарабкался. Теперь это для меня не просто бездушная технология — это огромный эмоциональный скоуп.
Когда кто-то при мне посмевается над F#: «Мертворожденная технология! Игрушка для задротов...» — тут же вспоминается зимняя темень, горящая тачка, сигарета, примерзшая к губам, подавленное состояние и F#, который меня из него вытащил. То есть, они как будто моего лучшего другана дерьмом обкидали. Моя реакция очевидна — мне обидно, и я зол.
Это выглядит странно со стороны, но если бы вы прожили тот день вместо меня, вы бы реагировали также. Думаю, что так у всех культистов технологий. Они влюбились в свои япы, потому что обстоятельства, при которых они с ними познакомились, очень остры лично для них. А я тут прихожу, и плюю им в душу. Ну и кто идиот? Я идиот. Надеюсь, больше не буду.
Если что, про F# тут.
Автор: fillpackart