Я растерял веру в разработку, выгорел, но меня спас культ инструмента



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

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

    Чем бы оно ни было, я эту фигню не понимал никогда.

    Сторонники культов кажутся мне непроходимыми тупицами. А я всегда пытаюсь понять, как тупицы стали тупицами, и почему тупицей не стал я. Начал думать и бам! — понял, что все-таки стал. Я тупица-культист, который восхваляет 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# тут.
    Поделиться публикацией

    Похожие публикации

    Комментарии 143

      +9

      Та же история — C#, энтерпрайз, клин код, абстрактные фабрики синглтонов, вера в Фаулера, мрак, безысходность.


      F# открыл для меня другой мир. Мир где всё логично (как матан) и просто (как LISP), но тем не менее функционально (во всех смыслах) и практично. И денег ещё за это платят больше чем за страдания на C#.


      Чем ещё хорош F# — это практичный язык, который не претендует на звание чистого, как Хаскель. В нём можно наговнокодить как в C#! И ещё он примазался к одной из крупшейних экосистем — .Net, что сразу снимает кучу головняка, интеграции, SDK, драйвера, БД, ОРМы и пр. Azure и Visual Studio идут в придачу (мало кто из ФП языков может похвастаться поддержкой таких IDE и облака).


      Но есть и минусы, самый большой связан с C# :) Он (C#) настолько хорош, то убедить бизнесы переходить с него — прям таки адски сложная задача. Стоит ли? Вопрос не праздный, ответа у меня нет, я-то уже перешёл и не испытываю проблем с поиском работы.
      А вот существующему бизнесу на C# вряд ли оправдано бросаться в пучины F#.

        +6
        > И денег ещё за это платят больше чем за страдания на C#.

        Вот кстати очень редко вижу вакансии на F#, они вообще существуют в достаточном объеме?
          +9
          Вот кстати очень редко вижу вакансии на F#, они вообще существуют в достаточном объеме?

          Меня это немного смущало когда я на HH.ru не нашёл (2017) ни одной вакансии на F#, но резюме выложил. А звонки-то пошли! Из известных компаний где есть F# в РФ — Касперский и Microsoft. Звонили иногда из соображений — "F#? really?". Знающие работодатели хотели меня видеть у себя на C# позициях, но за бОльшие деньги. В итоге я нашёл себе работу на чистом F#, хотя ни одной F# вакансии в РФ на HH.ru на тот момент не было.

            0
            Ваше резюме было заточено именно на F#-вакансии? Или в нем был также указан C# и сопутствующие технологии?
              0
              Ваше резюме было заточено именно на F#-вакансии? Или в нем был также указан C# и сопутствующие технологии?

              Никакой заточки, просто перечислил что знаю. У F# те же технологии.
              Но указано было F#/C# Developer, да.

          +1
          А может есть какой-то транслятор F# => C#? Пишешь на F#, а на работу отдаёшь что требуют, понятно что иногда он возможно будет странно выглядеть, но всё же.
            +5
            А может есть какой-то транслятор F# => C#?

            dotPeek :) Но качество трансляции не очень!

              +1
              надо улучшать! :)
                +3
                А вот недавно обсуждали в одном чатике такую задачу: транслировать код из одного высокоуровневого языка в другой, при этом генерируя максимально идеоматичный результат. Дак вот, в общем случае это красиво сделать нельзя, всегда будут костыли и допущения, а F# и C# как раз сильно отличаются. Увы!
              +2

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

                +2
                С одной стороны да.

                С другой если есть кусок, написанный «Ф шарпистом», которого никто в команде не понимает, то автобусный коэффициент возрастает очень существенно.

                Не считая времени на хлоивары «C# vs F#» на кухне, и различные взгляды на решение проблем «функциональный vs AdapterFacadeFactoryObserber»
                +1
                Тут есть, иногда работает: github.com/jindraivanek/cs2fs.
                Но вообще не надо таким заниматься — чтобы поймать F# надо думать как F#! :) А этот тул, например, переводит один к одному, когда в F# есть много штук, которые делают тоже самое, но короче, надёжнее, читабельнее, итп.
                  +2

                  Нет, я так понял, речь об обратном шаге — писать "короче, надёжнее и читабельнее", а потом сконвертировать, чтобы начальство схавало.

                  +1

                  Примеры трансляции
                  Компилятор генерирует очень много бойлерплейта.

                  +3
                  Но есть и минусы, самый большой связан с C# :) Он (C#) настолько хорош, то убедить бизнесы переходить с него — прям таки адски сложная задача. Стоит ли?

                  Долго для самого себя искал аргументы, чтобы перейти с C# на F# в продакшн, но не нашел достаточного количества. Какие факторы стали решающими для вас?
                    +2

                    Удачно опробовал F# на проекте с Akka.Net, но дальше меня внедрение языка не ушло)
                    Я не хотел полумер и стал целенаправленно искать работу на F#.
                    Оказалось что ее достаточно даже в РФ)


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


                    А вот захантить таких людей надо обязательно в любой проект на C#, они подтянут уровень кода и команды.


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

                    0
                    Чем ещё хорош F# — это практичный язык, который не претендует на звание чистого, как Хаскель.

                    Но чистота очень даже практична. "Не практична" у хаскеля как раз сырая экосистема. Как язык хаскель всё же куда проще, понятнее и практичнее чем его "аналоги" из JVM и .Net мира.


                    Вон те же линзы, которые изобрели в хаскеле, ИМХО, самое практичное, что есть в программировании. На втором месте в моём топе практичности монады + tagless final, которые очень упрощают тестирование и переиспользование кода. Ленивость тоже практичная штука с точки зрения "писать декларативный код и заранее не париться об оптимизации".

                      +1

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


                      Линзы и монады есть и в F#. В виду отсутствия HKT это просто чуть менее удобно, но это с лихвой окупается экосистемой.


                      Нет, хаскель хорош. Для обучения тому самому ФП, голову сломать, мышление поменять. Работать на нём — нет спасибо, у меня семья)

                        +2
                        которые вообще-то костыль для изменения вложенных иммутабельных структур, а никак не лучшее изобретение

                        Линзы это не костыль а first-class аксессоры (на самом деле линзы это даже более общая штука), которые покрывают куда более широкий спектр задач. Например линзами можно удобно разбирать сложные JSON и XML, структура которых заранее не определена. Кроме этого можно обходить сложные структуры и делать в них довольно сложные изменения и иметь при этом простой и лаконичный код. Ну и банальное обращение через призмы проще, чем исользовать огромный паттерн-матчинг.


                        Линзы и монады есть и в F#. В виду отсутствия HKT это просто чуть менее удобно, но это с лихвой окупается экосистемой.

                        Насколько я знаю в шарпе нет трансформеров монад и уж тем более нельзя писать штуки вроде таких:


                        foo :: (MonadWriter String m, MonadBar m) => Int -> m String

                        А это один из мощнейших инструментов для:
                        а) инверсии контроля, а соответственно тестирования и переиспользования кода
                        б) композиции разных алгебр в tagless final
                        в) контроля за эффектами по типу (поход в базу, запись в лог, генерация рандомного числа, етк)
                        Я бы не сказал, что это "просто чуть менее удобно".


                        Работать на нём — нет спасибо, у меня семья)

                        Так не кто не говорит вам, что вы должны сейчас же бросить свою работу и идти искать работу на хаскеле. Более того, никто не говорит, что вы вообще хоть что-то должны. Я даже не говорю что хаскель в целом "практичен". Я говорю, что чистота, если абстрагироваться от конкретного состояния IT индустрии — штука вполне себе практичная, а стремление к чистоте не делает что-то непрактичным. Хаскель, например, непрактичным делает малое сообщество, недостаток качественных библиотек и тулинга.

                          +5
                          Например линзами можно удобно разбирать сложные JSON и XML, структура которых заранее не определена.

                          Это всё от лукавого, гораздо проще разбирать неизвестные JSON и XML обычной динамикой, а не линзами. Вы не замечаете как Хаскель подсовывает вам заведомо более сложный и неудобный инструмент для простейшей задачи?


                          Насколько я знаю в шарпе нет трансформеров монад и уж тем более нельзя писать штуки вроде таких:

                          Я ж написал — HKT нет. И не уверен что будет.
                          Ещё в F# нет зав и лин типов. Хочется, конечно, но довольно редко.


                          Я бы не сказал, что это "просто чуть менее удобно".

                          А я бы именно так и сказал! Это действительно просто чуть менее удобно.


                          Например, Idris 2 Хаскелю насуёт по всем статьям, но что-то я не заметил чтобы хаскелисты бросили всё и на Идрис перешли массово) Хотя те же аргументы можно было применить и в обсуждении Haskell vs Idris.
                          Может кроме офигенных типов надо что-то ещё языку чтобы быть удобным?


                          Я говорю, что чистота, если абстрагироваться от конкретного состояния IT индустрии — штука вполне себе практичная, а стремление к чистоте не делает что-то непрактичным. Хаскель, например, непрактичным делает малое сообщество, недостаток качественных библиотек и тулинга.

                          Именно в этом мой поинт про семью и был. Вместо производства продукта, на Хаскеле я буду вынужден за 1 минуту нарисовать красивый хрустальный замок со всей мощью терката и оставшиеся 7ч59мин рабочего времени бороться с экосистемой. Я не люблю велосипеды, я не люблю кодить. Для меня это средство зарабатывания денег, поэтому чем меньше времени я трачу на решение задачи и доведения её до продакшна, тем больше времени у меня остаётся на личные дела.

                            +1
                            Например, Idris 2 Хаскелю насуёт по всем статьям, но что-то я не заметил чтобы хаскелисты бросили всё и на Идрис перешли массово) Хотя те же аргументы можно было применить и в обсуждении Haskell vs Idris.

                            Ну так насуёт. Библиотек действительно мало, пакетного менеджера нет (ipkg несерьёзно), баги в тайпчекере есть и немало.


                            Вместо производства продукта, на Хаскеле я буду вынужден за 1 минуту нарисовать красивый хрустальный замок со всей мощью терката и оставшиеся 7ч59мин рабочего времени бороться с экосистемой. Я не люблю велосипеды, я не люблю кодить.

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

                              0
                              Ну так насуёт. Библиотек действительно мало, пакетного менеджера нет (ipkg несерьёзно), баги в тайпчекере есть и немало.

                              Я слишком общо сказал про "по всем статьям". Я имел в виду только систему типов и всякие мозговзрывные вещи. Как хасель умеет в монад трансформер по сравнению с F#, так и Идрис умеет много чего по сравнению с Хаскелем.


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

                              облачные микросервисы, ETL.
                              На прошлой работе Azure, на новой тоже Azure.


                              У F# фора — все SDK для Azure уже написаны)

                                +1
                                внезапно, hackage.haskell.org/packages/search?terms=azure (8 items). Большинство, правда, давно не обновлялось, но по-моему тут уже эффект положительной обратной связи: если бы на хаскеле писало больше народу, то библиотеки к ажуре обновлялись бы почаще.
                                ЗЫ: про amazon вон 180 items, включая обновлявшиеся совсем недавно.
                                  0
                                  внезапно, hackage.haskell.org/packages/search?terms=azure (8 items). Большинство, правда, давно не обновлялось, но по-моему тут уже эффект положительной обратной связи: если бы на хаскеле писало больше народу, то библиотеки к ажуре обновлялись бы почаще.

                                  Ясно же что этого недостаточно. там только способов аутентификации в облаке с десяток. Managed ID, AD, Azure AD, OAuth, ApiKey и пр… Видов сервисов несколько сотен, а тут всего 8 либ.


                                  Очевидно что для работы с Ажуром на Хаскеле мне придётся велосипедить не один месяц.

                                    0
                                    ЗЫ: про amazon вон 180 items, включая обновлявшиеся совсем недавно.

                                    3050 пакетов
                                    https://www.nuget.org/packages?q=azure
                                    1109 пакетов
                                    https://www.nuget.org/packages?q=aws


                                    Экосистема всё ж не пустой звук.

                                      0
                                      ага, я в руби уже насмотрелся на миллиарды Готовых Библиотек (которые между собой не компонуются без существенного переписывания)
                                    +1
                                    Я имел в виду только систему типов и всякие мозговзрывные вещи. Как хасель умеет в монад трансформер по сравнению с F#, так и Идрис умеет много чего по сравнению с Хаскелем.

                                    А, ну это такое. ИМХО профит от перехода с F# на х-ль куда выше, чем с х-ля на идрис. Особенно с DataKinds, TypeInType и вот этим всем.


                                    облачные микросервисы, ETL.

                                    А, ясно. Я с облачками вообще не работаю просто. Мне вот какого-нибудь хупла, fgl или, не знаю, geniplate не хватать будет, думаю.

                            +1
                            "Не практична" у хаскеля как раз сырая экосистема.

                            А что в ней сырого? ghc — компилятор вполне себе продакшен-качества (например, на баги в gcc или clang я натыкаюсь сильно чаще). stack тоже к продакшену готов и, судя по дискуссиям, местами даже превосходит то, что есть в других языках. Профилирование кода есть. С тестированием всё просто шикарнейше. Библиотеки — ну, смотря для какой области. Для статистики R вон до сих пор уделывает всех, и ничего, никто ж не говорит, что все остальные языки не готовы.

                            +2
                            мне C# просто лёг на душу, красивый, интуитивно понятный и куда приятнее после дельфи.
                              0
                              По-моему, он даже после Джавы приятнее
                                +1
                                плюсую
                              +2
                              Ой, а для тех, кто в танке — «точечка нет» за пределы винды вышла в промышленных масштабах?
                                +2
                                Ой, а для тех, кто в танке — «точечка нет» за пределы винды вышла в промышленных масштабах?

                                Я для винды уже пару лет ничего не писал, всё кросс платформенное.
                                Даже не задумывался о "пределах винды", оно просто уже давно по умолчанию такое, вне виндовое.

                                  +2

                                  Asp.net core Xamarin и Unity давно запределами винды работают.

                                    0
                                    Переписали проект с .NET на .NET Core. Уже год в проде на линуксе в амазоне.
                                    Полет нормальный.
                                  +9

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

                                    0
                                    >весь GoF из коробки
                                    И все это на f#? Похоже, вы что-то не договариваете…
                                      +3
                                      accu.org/content/conf2013/Tobias_Darm_Effective_GoF_Patterns.pdf
                                      TL; DR: заиспользовав лямбды из C++11 и немного Boost, автор половину паттернов GoF просто выкинул, вторая половина сильно похудела (1 класс там, где было 2-3).
                                        0
                                        А вы думаете, я в исходном комментарии на что намекал? Ровно на тоже самое. Это сложно назвать GoF из коробки, потому что это уже другое.
                                          +2
                                          Просто реализация большинства этих паттернов на F# настолько тривиальна, что давать им отдельное название, и уж тем более посвящать целый раздел в специальной книге становится как-то неловко: чувствуешь себя тем самым академиком из башни слоновой кости. КДПВ: imgur.com/6c6mZ82
                                            0
                                            Я это понимаю. Поясню еще раз, потому что это очевидно осталось непонятым: когда вы пишете «GoF из коробки», это обычно означает, что реализация паттернов у вас есть готовая. А то, о чем вы рассказываете, это чуть иное — когда большая часть паттернов вам просто становятся не нужны.

                                            Вы тут некую тонкую грань не ощущаете? Нет? Ну и не надо, забудьте.
                                              +7

                                              Они не нужны, потому что де-факто содержатся прямо в языке, или я не так понял суть обсуждения?

                                      +4
                                      Такие душевные переживания по поводу разработки. «Вера в разработку» уже звучит как-то возвышенно. А ещё говорят, что программирование !== не творчество :)
                                        +7

                                        Некоторые люди говорят, что химия, физика и математика — не творчество. Зачем слушать необразованных людей? ;)

                                        +3
                                        Вызвало ассоциации с видео почти десятилетней давности…
                                        erlang-mnesia-video.ru
                                        ;)
                                          +9
                                          У меня почему то после прочтения этой статьи тепло и хорошо на душе. Спасибо. Душевно так.
                                            +2
                                            А где результат той самой недели?
                                              0
                                              :) теперь нужно попробовать хаскель
                                              и понять — что все это у людей в головах, а не в языке. Что на любом языке можно так же написать, если только правильно сформулировать для себя.
                                                +3
                                                А пробовал ли автор Kotlin?

                                                Я спрашиваю потому что рассказ похож на мои ощущения при переходе с Java на Kotlin.
                                                При этом я практически не потерял в качестве инструментария, в Intellij IDEA Kotlin поддерживается не хуже Java (только что IDE помедленнее ворочается).

                                                Вот тут есть пример как аналогичный код для F# выглядит на Kotlin
                                                discuss.kotlinlang.org/t/equivalent-kotlin-code-to-my-f-functional-code/6578
                                                  +3

                                                  Было бы странно если бы Котлин в idea поддерживался хуже, чем java. Все таки они его сами разрабатывают

                                                    0

                                                    Имхо таки Kotlin поддерживается похуже, чем Java, по крайней мере полгода назад. Натыкался на менее умную работу статического анализа вроде определения всегда ложных/истинных условий с арифметикой. Код на Java подсвечивается предупреждением, а после встроенной фичи конвертации кода в Kotlin сообщений не видно. Конкретных кейсов не сохранилось, поэтому и сейчас проверить не могу...


                                                    И это не странно: Java поддерживают в несколько раз дольше, поэтому и поддержать успели больше...

                                                      0
                                                      И это не странно: Java поддерживают в несколько раз дольше, поэтому и поддержать успели больше...

                                                      Просто дополнение:
                                                      Как по-мне, идея в принципе должна лучше поддерживать джаву и дело не столько в времени, а просто потому, что она изначально писалась именно под джаву. Основной упор был именно на джаву и она прожила с ней огромное количество времени. Какое количество инспекций и рефакторингов было написано под всевозможные версии, библиотеки, фреймворки, JEE и прочие радости жизни? Какое количество разработчиков пользуется котлином и какое джавой? Вопросы риторические.

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

                                                    Я думаю похожие эмоции были бы при переходе с Java на C#. Kotlin, пока что, немного приятнее, но имхо совсем немного. Но зато у C# нет проблем, которые идут только из-за jvm и не могут быть нормально решены без изменений именно там. Так что проба F# кажется более внушительным шагом. В jvm стеке, полагаю, стоит называть Scala, а не Kotlin.

                                                      0
                                                      Имхо, Kotlin намного свежее выглядит и пишется, чем C#. А про какие проблемы JVM (кроме проблемы с дженериками, которые частично решаются модификатором reified в Kotlin) идет речь?
                                                        +2

                                                        Да, я про дженерики и вспомнил, reified к сожалению применим только к инлайн ф-циям, ну оно и понятно почему. Ну а насколько Kotlin временно обошел C# не буду спорить. Если бы не грядущий c# 8 с nullability, то сказал бы намного. Классная фича, которая должна была быть с рождения, как в Kotlin.

                                                          +1

                                                          Генерики все же более общая проблема, например попробуйте на JVM реализовать class Foo : IFoo<Bar>, IFoo<Baz>. Пример немного искусственный, и в некоторых случаях может решаться введением промежуточных iFooBar : IFoo<Bar>, но не всегда.


                                                          Второе — в C# экосистеме очень много используется всевозможных анализаторов кода в рантайме. Самый типовой пример: генерация SQL-запроса из foos.Where().Select().ToList(). Это наверно можно сделать на хитрых стримах, но возможности экспрешнов намного шире. Например, я мигрировал на MongoDriver 2.0 и там отсутствовала функция Save (upsert по сути), ну я взял, расчехлил экспрешны, и сделал обобщённый код, работающий со всеми типами. Тут есть вся вкуснятина, включая формирование функции-темплейта, в теле которой заглушка заменяется реальным значением, переданным пользователем (IdConstantVisitor).


                                                          Третье — с появлением Roslyn очень распространены стали анализаторы кода на C#. Я не про анализ Java-кода всякими анализаторами, а про бытовые вещи. Например, тут человек просил в язык добавить модификатор видимости, чтобы делать белые/черные списки типов, которые могут вызывать некий код. Берем, тратим 20 минут, и анализатор реализующий функционал готов.


                                                          image


                                                          Ну и небольшой минусик лично от меня: аннотации. В C# почти всегда можно просто сделать goto атрибута и посмотреть, что именно он делает. А у меня коллеги-котлинисты постоянно жалуются, что висит десяток собак на классе или функции, и не понятно, что они вообще делают, и где правды искать.

                                                            0

                                                            Я вместо множественного наследования для одного интерфейса с определенного момента стал использовать nested classes. Мне понравилось. Доступ к членам классов есть, что еще от жизни надо?)

                                                              0
                                                              Аннотации не идиоматичны для котлина, если ваши друзья пишут на котлине и у них на классе висит десяток собак, то они на самом деле скрытные джависты.
                                                              Roslyn скорее фича C#, чем минус Котлина :) Я точно так же могу сказать что дескать в C# нет property delegate или инфиксных функций.
                                                              Про генерацию я не очень понял пример, можно поподробнее?
                                                                +1
                                                                Аннотации не идиоматичны для котлина, если ваши друзья пишут на котлине и у них на классе висит десяток собак, то они на самом деле скрытные джависты.

                                                                У них котлин со спрингом, и там этих собак тонны


                                                                Про генерацию я не очень понял пример, можно поподробнее?

                                                                Ну например вы пишете запрос
                                                                var foo = MyDb.Employee.Where(x=>x.Sex == Sex.Male).Select(x=>x.Salary).ToArray();


                                                                И он транслирует его в какой-нибудь SQL или в mongo-запрос, в зависимости от того, какое хранилище подключили.


                                                                Еще удобнее, когда где-то есть визиторы, которые этот экспрешн модифицируют, например, добавляют дополнительно Where(x=>x.AccessRights == GetAccessRightFromCookies()). То есть вы пишете обычные запросы, а где-то дополнительно навешиваются еще условия, что юзер получает только те данные, к которым имеет доступ. Или подменяется часть запроса, чтобы обработать некоторые случаи.

                                                        +8

                                                        Задело за живое. К сожалению с F# есть одна проблема. Если повезет то ты просто не поймешь что за язык, или будешь пытаться писать на нем ровно так же как пишешь на С# (ставя везде mutable). А вот если не повезет то ты поймешь насколько это крутой и насколько недооцененный язык. Ты уже заразился, для каждой задачи ты уже видишь два решения: C# стиль (с кучой мусора на интерфейсах и DI) или F# стиль. Давным давно я когда то влюбился в C# после нескольких язков и я был счастлив. А сейчас: хорошая зарплата, начальство, риск менеджмент, кадровая политика и т.д. и т.п. прибивают разработку гвоздями к C# но я уже несчастлив. Эта бесконечная вереница интерфейсов, скобочек и безумного количества мусорного кода с пробрасыванием интерфейсов, наследования от интерфесов, где у 99,99% интерфейсов всего одна единственная реализаця. Слава богу есть Resharper, который хотя бы хорошо автоматизирует генерацию этого адского, бесползеного, не приносящего никакой прямой пользы мусора. Но ты понимаешь что можно было бы идти по другому пути — пути где не надо было генерировать и поддерживать этот мусор и ты несчастлив что смалодушничал и выбрал более теплый, мягкий, безопасный путь бесконечного мусорного кода типичной Enterprise разработки.

                                                          +10
                                                          Попробуйте писать на C# без этого мусора. Я, например, пишу на C# в крупный проект в крупной команде, где не пишут интерфейс, когда есть только одна реализация, где в DI ничего нигде не регистрируется в коде (все автоматически), и все, что DI пробрасывает по умолчанию — Singleton. Я был счастлив найти команду, которая не пишет интерфейс под каждый чих, которая не считает SOLID манной небесной и единственно верным путем.
                                                            0
                                                            А юнит тесты как пишете?
                                                            На моём текущем проекте именно так ребята и писали несколько лет. В итоге у них у класса, который используется везде, для тестов есть метод GetDebugInstance, я не шучу. И чтобы протестировать одну строку приходится писать под 50-100 строк кода инициализации всего, что завязано друг на друга.

                                                            Я заменил ровно одно свойство на возвращение интерфейса вместо конкретного класса и юнит тест снова стал юнит. А вы как делаете?
                                                              0
                                                              Пишем только интеграционные тесты
                                                              +2

                                                              Я работал во многих командах где на C# так и пишут. Но опять таки, как было замечено выше, на C# писать в таком стиле это боль. Когда тебе сдают проект с 1,3 млн. строк кода, без тестов, без организации без структуры (ну и естественно со всеми нарушениями принципа SOLID и DDD). Это боль. Очень большая боль.


                                                              Все эти SOLID, DDD, DI, интерфейс на каждый чих и т.п. получили популярность в Enterpise секторе не из за того что разработчики страдают мазохизмом а из за того что они решают конкретную проблему больших проектов.


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


                                                              И почему думаете что SOLID и ФП несовместимы? Если довести SOLID принципы до абсурда то у тебя практически получится функциональный подход. (на самом деле не совсем так но это тема отдельной статьи).


                                                              Возьмем например букву S. (Принцип единственной ответственности). Одна функция одна ответственность. Схожий принцип I (принцип разделения интерфейсов) — один интерфейс — один метод — одна функция и т.д. по всем остальным принципам.


                                                              Посмотрите еще насколько проще воплощается DDD на F# по сравнению с реализацией DDD на C#.
                                                              https://fsharpforfunandprofit.com/ddd/
                                                              В больших проектах SOLID и DDD это манна небесная которая реально спасает разработку. Но на F# эти принципы соблюдать еще проще чем на C#

                                                                0

                                                                Да, автоматический DI + singleton его же средствами и концептуально получаются некие микромодули которые содержат связанную функциональность и могут декларировать через иньекцию в конструктор свои зависимости от других "модулей".
                                                                И я рад бы писать это на функциональщине, но ведь там придётся каррировать руками каждую функцию и пихать необходимые аргументы, вместо "модулей"-классов.


                                                                Например некая хранилка документов с возможностью создать/получить/удалить документ. Всем трём функциям нужен клиент к БД. В ООП+DI я добавляю его в конструкторе и использую в методах. В ФП мне нужно объявить его аргументом у всех трёх функций, потом из каждой функции сделать каррированую версию для использования в других местах (сразу скажу, что я не особо писатель на ФП, больше читатель. И много где пишут, мол, используйте каррирование и всё будет хорошо, но может быть я что-то упускаю?).

                                                                  +1

                                                                  Ну для начала вам никто не запрещает делать классы в ФП :)


                                                                  Но если хочется чистоты и фпшности (в описанном случае смысла вижу мало упарываться), то делаем одну функцию с параметром dbClient, которая возвращает рекорд (тупль) из 3х функций (create/read/delete), которые работают с этой db. Во все три уже будет вшит dbClient.


                                                                  Я бы так не делал.

                                                                    0
                                                                    классы в ФП

                                                                    Да в F# думаю оптимальным будет структуру приложения делать на классах/интерфейсах, а мощь ФП использовать локально внутри.
                                                                    Но вот в хаскеле классов нет :(


                                                                    которая возвращает рекорд (тупль) из 3х функций

                                                                    не, это упячка :)

                                                                      +2
                                                                      не, ну зачем сразу тупль. Надо либо record, либо экземпляр какого-то типа, который является инстанцией подходящего type class (это два подхода к реализации подобных вещей, у каждого есть плюсы и минусы, противники и сторонники, а по сути — баш на баш). Технически ничем не отличается от сишечных структур, содержащих функции.

                                                                      data DbClient = DbClient {
                                                                          create :: Entity -> IO (),
                                                                          read :: PrimaryKey -> IO Entity,
                                                                          delete :: PrimaryKey -> IO ()
                                                                        }
                                                                      
                                                                      realDb :: DbClient
                                                                      realDb = DbClient {
                                                                         create entity = ...
                                                                      }
                                                                      
                                                                      fakeDb :: DbClient
                                                                      fakeDb = DbClient {...}
                                                                      


                                                                      Технически, дальше вам никто не запретит написать
                                                                      -- объявляем класс (ну ладно, не класс, а структуру с методами)
                                                                      data SomethingInterestingDoer = SomethingInterestingDoer {
                                                                        dbClient :: DbClient,
                                                                        -- другие поля
                                                                        doSomethingInteresting :: IO ()
                                                                      }
                                                                      
                                                                      makeDbClient :: ConnectionString -> DbClient
                                                                      makeDbClient = ...
                                                                      
                                                                      -- экземпляр класса с реализацией методов
                                                                      something :: ConnectionString -> SomethingIntestingDoer
                                                                      somehting connStr = doer
                                                                        where doer = SomethingInterestingDoer {
                                                                          dbClient = makeDbClient connStr, -- это мы "добавили в конструкторе"
                                                                           doSomethingInteresting = do
                                                                              create (dbClient doer) newEntity -- а это мы используем dbClient
                                                                           }
                                                                      

                                                                      это 1-в-1 «оопэшное» решение. Только обычно так не пишут, если нет большой нужды. Обычно пишут проще:
                                                                      doSomething :: ConnectionString -> IO ()
                                                                      doSomething connStr = do
                                                                         let dbClient = makeDbClient connStr
                                                                         create dbClient myEntity
                                                                      


                                                                      (я тут игнорирую кучу деталей, на данном уровне абстракции непонятно кто такой ConnectionString, makeDbClient должен зависеть от реализации самого клиента, итд)
                                                                        +1

                                                                        Только в таком решении всё равно нет автоматического резолвинга зависимостей, "добавленных в конструкторе" :)
                                                                        Я видел какую-то реализацию автоматики на классах типов в хаскеле, но она работала за счёт того, что инстанс для каждого класса был один, но в такой реализации это в тестах довольно бесполезно.

                                                              0
                                                              так а какая замена скажем интерфейсам и DI в F# есть?
                                                                +1
                                                                так а какая замена скажем интерфейсам и DI в F# есть?

                                                                Ну для начала, в F# есть интерфейсы и DI :)
                                                                Но чаще всего можно обойтись partial apply.


                                                                Марк Симан (автор Dependency Injection in .NET) рассказал об этом на прошлом DotNext:
                                                                https://www.youtube.com/watch?v=xG5qP5AWQws

                                                                  0

                                                                  Во-первых, можно использовать все то же самое (но лучше этого не делать)
                                                                  Во-вторых, функции, особенно в F#, очень легко композируются.
                                                                  Если делать именно dependency injection, то для этого помогает partial application, т.е вы просто указываете в вашей функции аргументами все необходимые зависимости, а реальный инпут указываете в самом конце:


                                                                  let getUser getUserDtoFromDb mapUserDto userId =
                                                                      userId |> (getUserDtoFromDb >> mapUserDto) // пихаем айдишник в функцию
                                                                  //созданную на лету из наших двух с помощью оператора ">>"
                                                                  
                                                                  let getUserImpl = getUser MyRepo.getUser MyMapper.mapUser // передаем зависимости (2 параметра из 3 необходимых, и получаем функцию, которая принимает айдишник и возвращает юзера из базы

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

                                                                +4
                                                                Почти та-же самая история, только я к F# пришел из системной аналитики. Порой проще самому закодить чем объяснять как нужно. А когда изучил книгу fsharpforfunandprofit.com/ddd, то я начал чувствовать огромную легкость в выражении своих мыслей и реализации этого всего в коде.

                                                                У меня хороший опыт с R и я знаю что такое хороший DSL для работы с доменной областью, в R есть офигительная библиотека ggplot2 которая позволят описывать графики как ты хочешь их видеть, а не как они должны рисоваться, это очень удобно и легко. Ну и все библиотеки из tidyverse построены по этому принципу — предоставление удобного DSL для выполнения конкретной задачи.

                                                                Собственно понимание что на F# можно написать свой собственный DSL и решать свои задачи на нем меня в него и привело. И то, что я получил — это огонь.
                                                                  +2
                                                                  Когда МС попыталось оценить число программистов не на окладе — оказалось их было по всему миру как минимум 18 миллионов против 6 профессиональных миллионов. И эти 18 миллионов потому на 2005 год и существовали, что физик-теоретик не сможет за короткий срок объяснить программисту-профессионалу — как сделать правильно. Легче сделать самому. И ответственность за принятое решение тоже придётся нести самому. Советую посмотреть доклад старшего научного сотрудника доктора ф. м. наук РАН ВНИИ ЯИ (Троицк) Ткачёва Ф. В. со «Дня Оберона-2018», что проходил в Орле не так давно. Там вообще выступления есть очень сильные по этому поводу.
                                                                  +5
                                                                  Вот состояние прям как у меня сейчас :(
                                                                  Тебе за 30, семья, дети, ипотека, ЗП не хватает(и к сожалению повышать не собираются), ты являешься не официальным разрабом при отделе(хоть и очень крупной компании РФ), твой культ Delphi/Pascal, но сейчас пишешь(уже только иногда) для офисного планктона макросики, да инструменты на VBA(Excel), поддерживаешь те оставшиеся инструменты, которые остались после оптимизации отдела, при этом ты владеешь PHP(но не имеешь опыта, кроме домашних поделок), базовое понимание SQL и умение проектирования БД(с нуля) в My/MS SQL, способность с нуля создать/сопровождать многопользовательскую систему, как говорится «из подручных» и доступных, в наших бюрократических условиях, средств. Но все попытки перевода в специализированные отделы разрабов сводятся к отсутствию опыта именно вот по тем новомодным технологиям которые нужны именно сейчас, хотя время на освоение не более месяца хватит для адаптации к этим «яйцам», ну а тонкости с опытом.
                                                                  И вот сидишь и руки опускаются. У себя в отделе тебя ценят уважают, знают на что способен и как это оптимизировало процессы, но ЗП не могут поднять т.к. не от них зависит, а от долбанных стандартов и новой политики, нового руководства, а соседние отделы еще на этапе собеседования, смотрят на тебя как на студента-самоучку(выскачку) и впринципе опыт/умения не интересует т.к. это же Васик, не топовый язык. Вот тут руки и опускаются.
                                                                  Спасибо. Очень воодушевила Ваша история. )))

                                                                  П.С.: Сорри. Крик души…
                                                                    +1
                                                                    > базовое понимание SQL и умение проектирования БД(с нуля) в My/MS SQL
                                                                    впервые вижу такое в одном предложении))) умение создавать таблички и накидывать в них новые поля — это еще не умение проектировать БД)

                                                                    Попробуйте освоить какой нить новомодный язык программирования (типа Go или NodeJS), попрактикуйтесь в решении сколько нибудь серьезных задач, посмотрите как люди пишут производственные приложения или полистайте код на github. Сменить профиль IT не так сложно как кажется, поверьте.
                                                                      0
                                                                      NodeJs это не язык программирования, это платформа…
                                                                        0
                                                                        попрактикуйтесь в решении сколько нибудь серьезных задач,


                                                                        Серьезная задача — та, которая исходит от бизнеса, а не от графомании. Поэтому непонятно откуда брать эту самую задачу, если бизнесу все эти лампочки, процессоры, синлтоны с роутерами и пр. до фонаря, в отличие от проблем с клиентами и деньгами на счетах.
                                                                        0
                                                                        Может стоит уйти джуном в нормальную контору, где дадут возможность прокачаться разрабом? Если такое рассматривать, то лучше сейчас — к 40 будет куда сложнее. Брать проекты на стороне, не бояться отсутствия опыта и просто долбить в одно место, пока не заработает. Да, много времени уйдет, но результат будет. Все это говорю по личному опыту переквалификации из экономиста в web dev, потом в embedded electronics, потом обратно в web dev (не считая забегов в desktop, когда клиенты сильно просили).
                                                                          +1
                                                                          Опишу свою историю, может вас к чему-то подтолкнет.
                                                                          Я в 24 года, после работы экономистом-бухгалтером, пришел в крупный банк на непонятную позицию (в новом подразделении, то ли аналитик, то ли недоразработчик-писатель макросов на VBA). И так сошлись звезды, что после принятия меня на эту должность, одновременно с начальником (отдел-то новый), он оценил, что я не подхожу под эту должность (не знал SQL) и направил меня на 4 платных майкрософтовских курса по MS SQL и разработке DWH на нем. Через несколько месяцев, сразу после последнего моего курса начальника уволили, взяли другого, но и тот убежал через 3 недели. Я уже тоже готовился писать заявление (было абсолютно не понятно что от нас хотят, но чего-то требовали), но решил остаться и посмотреть что будет дальше.

                                                                          1. Следующие 7-8 месяцев я на практике изучал и игрался с MS SQL с правами админа. Параллельно работодатель оплачивал мне изучение языка C# на рабочем месте (как и у автора поста, работодатель про это не знал). Сначала писал легкие маленькие скриптики в MS SSIS, затем расширения для MS Excel. Ну и какую-то работу тоже работал.
                                                                          2. Перешел в не ИТ-компанию даже с небольшим повышением в зп (искал специально, нашел совсем не сразу, отшивали из-за высоких запросов по зп) на стажера-джуна на C#.
                                                                          3. Отработал там ровно 1 год и ушел в одну из крупнейших ИТ-контор в РФ на позицию middle+

                                                                          Итого, на то, чтобы мутировать из экономиста, умеющего немного говнокодить на VBA, в middle+ C# разраба, у меня ушло чуть больше полутора лет. Вам, полагаю, стоит приступать сразу к пункту 2.
                                                                            +1

                                                                            /offtop:


                                                                            Что за инвайт-рекурсия??

                                                                            image

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

                                                                              У меня, собственно, у самого такое же.
                                                                                0

                                                                                А зачем его на самого себя тратить то?

                                                                                  +1
                                                                                  Оно у всех ещё не приглашенных пользователей (т.е. Read & Comment) потратилось «на себя» автоматически.
                                                                            0
                                                                            Фатальная комбинация технологии и предметной области. Убирай вообще опыт из резюме, гооври что переучился из аналитика (всё-равно никто не знает кто это и что должны уметь).
                                                                            –13
                                                                            Так уж получилось, что «с детства» недолюбливаю .NET и все что с ним связано, особенно нелепо для меня выглядят решения реализованные с использованием .NET без контекста использования в среде Windows. Из текста статьи осмелюсь предположить, что автор до использования F# писал только C#, что в общем прискорбно.
                                                                              +6
                                                                              Зачем устраивать холивар, если ты зашел под пост о технологии с которой ты плохо знаком, веди себя как гость
                                                                              — rwx rwx r — -
                                                                                +8
                                                                                Более того, это первый комментарий у этого пользователя на хабре.
                                                                                Хотя зарегистрирован он в 2014 году.
                                                                                Т.е. человек насктолько не любит дотнет, что не удержался и прервал пятилетнее молчание только для того, чтобы об этом написать)
                                                                                Причём без каких-либо аргументов. Просто не люблю и всё тут)
                                                                                  –6
                                                                                  Я считаю, что такие инструменты как .NET равно как и Java с ее JVM уводят этот мир в бездну не оптимальности плодя монструозные приложения с детским кодом, но большим аппетитом к памяти и процессорному времени, которые потом считаются нормой. А потом мы видим статьи типа этой "Моё разочарование в софте". Да, не всем нравится писать приложения на не слишком дружелюбных языках типа C++, да и времени нет, все понятно. Но есть же такие творения как Go, которые еще вселяют надежду, что не все потеряно…
                                                                                    +4
                                                                                    Так и знал, что вы не удержитесь и всё-таки поведаете почему же вы так не любите дотнет)
                                                                                    Вы даже не замечаете насколько ваш комментарий нерелевантен по отношению к данной статье. Она ведь не про дотнет и даже не про F#. Она про то, как изучение нового языка/технологии/чего-то ещё может открыть второе дыхание у перегоревшего специалиста.

                                                                                    P. S.: Люблю Го, но вот за таких вот представителей его сообщества иногда стыдно.
                                                                              +2
                                                                              Как это все знакомо, годы спустя тоже к этому пришел: «Но настает ночь, отвлекающие дела заканчиваются, отмазки тоже, и я остаюсь один на один с разочарованиями и бессонницей — я ни на что не годен, ничего ни с чем никогда не получится.»
                                                                                +11

                                                                                Да хватит уже выгорать. Смотришь твиттер — этот выгорел, тот выгорел. Посты на три экрана. Проблема преувеличена.


                                                                                я пошел к начальству и попросил меня уволить

                                                                                А что еще делать начальнику? Надо не просить уволить, а увольняться. Иначе в его глазах вы выглядите как капризная телочка, которая не знает, что ей нужно. Насколько я понял, после этого вы не уволились, то есть подтвердили мнение начальника.


                                                                                Кодить по ночам — отстой. Это нехватка сна, нерподуктивный день и возбуждение перед сном. Снова кодинг ночью, и так по кругу.

                                                                                  +5
                                                                                  Проблема преувеличена.
                                                                                  депрессию вы, должно быть, тоже отрицаете?
                                                                                    +10

                                                                                    Я не писал, что отрицаю депрессию. Депрессию нужно лечить, бороться с ней. А ночной кодинг и примерзжая к губам сигарета этому не способствуют. Это инфантильный романтизм, упивание собственным страданием. Жаль, что на такое ведутся толпы людей. Срабатывает принцип "это обо мне", все считают себя тоже выгоревшими и пишут посты.

                                                                                      +1
                                                                                      Как же тогда быть с Z-73.0 по классификации ICD-10?
                                                                                        +2

                                                                                        Стоит заметить, что это не диагноз.


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

                                                                                    +5

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

                                                                                      +2
                                                                                      «Проблема преувеличена» — это газлайтинг с вашей стороны.
                                                                                        –2

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

                                                                                          +3
                                                                                          Отрицание значимости чего-либо для другого человека — это автоматически газлайтинг.
                                                                                            +7
                                                                                            Блин, «газлайтинг» сейчас растянули из очень редкого вида психологического насилидя до любого «ты не прав»

                                                                                            Я на 98% уверен что igrishaev абсолютно искренне не верит в выгорание. Что сказать, возможно он и правда не сталкивался с ним ни разу до того как первый раз прочитал, бывает.

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

                                                                                            Ну и в конце доля душевного стриптиза о том как у него мгновенно меняется настроение и мировоззрение от впечатлений за день(поданное под соусом будто это естественно и у всех так)

                                                                                            Меня от таких постов просто детонирует, нет ничего отвратительнее морализаторских постов от «богатых и здоровых» о том как «бедные и больные» всё придумывают, их проблемы не настоящие, а вот он-то герой все проблемы(которых у него не было) одной силой воли преодолел.
                                                                                      +5

                                                                                      И еще позвольте спросить — так вы пишете на F# в прод за деньги, или это хобби? Из поста это не понятно.


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


                                                                                      Спрашиваю, потому что знаю по опыту — даже самый экзотичный язык меркнет в повседневной работе. В моем случае это Clojure. Переключение на функциональный язык сперва окрыляет, но в итоге ты выигрываешь не так много, как думал сначале.

                                                                                        0
                                                                                        Спрашиваю, потому что знаю по опыту — даже самый экзотичный язык меркнет в повседневной работе. В моем случае это Clojure. Переключение на функциональный язык сперва окрыляет, но в итоге ты выигрываешь не так много, как думал сначале.

                                                                                        Не думали написать статью об этом в разрезе Clojure? Статей про этот язык маловато, а статей о промышленном использовании, с примерами и проблемами и вовсе не припоминаю.
                                                                                          +1
                                                                                          с примерами и проблемами и вовсе не припоминаю
                                                                                          «Зря слона ругаешь — не продашь»
                                                                                            0
                                                                                            Это так на вскидку: www.youtube.com/watch?v=iUC7noGU1mQ
                                                                                            Там ютутб еще пяток нормльных отчётов в рекомендациях выкатит точно.
                                                                                            +1
                                                                                            Пишу в прод. Полет отличный, минусов самой работы конечно не компенсирует, но минусов от ненавистного языка стало меньше.
                                                                                            +11

                                                                                            Я, конечно, понимаю, что тут поётся ода F#, но


                                                                                            Денег на такси нет, общественный транспорт для черни. Я пошел домой пешком, километров десять.

                                                                                            Для черни?

                                                                                              +4
                                                                                              Конечно же. Голубая кровь даже за два часа (10 км пешком) при температуре минус 30 не замерзает.
                                                                                              )))
                                                                                                +7

                                                                                                Очевидная самоирония, не?

                                                                                                  +2

                                                                                                  Неочевидная. 10 км пешком или 30 минут на общественном транспорте — лично для меня выбор очевиден.

                                                                                                  +1
                                                                                                  Очевидно, что автор описывает свои ощущение в момент ненависти к этому миру.
                                                                                                    0
                                                                                                    Предлагаю в ответ говорить F# для черни.
                                                                                                    +4
                                                                                                    Я растерял веру в разработку, выгорел, но меня спас проект, который я начал делать в качестве хобби
                                                                                                      +10

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

                                                                                                        +3
                                                                                                        Психотип автора не подходит для разработчика, скорее для автора стартапа, т.е. он занялся не своим делом, потому все ему выглядит тупо и уныло.
                                                                                                          +1
                                                                                                          Да черт возьми, как же Вы круто пишете!!! А данная статья вызвала у меня такие эмоции, как будто я читал ее не на рабочем месте в попыхах, пока прогружается среда, а дома с горячим чаем, удобно устроившись на диване)))
                                                                                                            +3
                                                                                                            Но ведь никто не заставляет вас слепо следовать книгам, C# поддерживает все парадигмы программирования и не он заставляет делать инструменты ради инструментов.
                                                                                                            Я пишу на C# уже 10 лет, но не столкнулся с тем что говорит автор и вы. Возможно потому что начал читать книги по нему, паттернам и подходам уже после того как дошел до middle уровня. В результате у меня есть набор библиотек применяя которые остается писать только чистую бизнес логику.
                                                                                                            Даже приведу пример из тестового проекта, ниже весь код микросервиса. Для понимания, это второй сервис в цепочке, отвечает за преобразование сырых данных во внутренний формат, принимает сырые данные по транспортному соединению от сервиса читающего данные с сайта, после преобразования передает следующему сервису который отвечает за планирование доставки готового документа.

                                                                                                            Program.cs
                                                                                                            namespace Adapter
                                                                                                            {
                                                                                                                class Program
                                                                                                                {
                                                                                                                    static void Main(string[] args)
                                                                                                                    {
                                                                                                                        BusinessApplication.Startup<AdapterService>(args);
                                                                                                                    }
                                                                                                                }
                                                                                                            }


                                                                                                            AdapterService.cs
                                                                                                            namespace Adapter
                                                                                                            {
                                                                                                                public sealed class AdapterService
                                                                                                                     : AdapterExchangeService<OriginalEntry, Document>
                                                                                                                {
                                                                                                                    protected override Document Convert(OriginalEntry incoming, Guid frameId)
                                                                                                                    {
                                                                                                                        Log.Debug($"New quote: {incoming.Title}");
                                                                                                                        var doc = new Document(frameId);
                                                                                                                        doc.Header = incoming.Title;
                                                                                                                        doc.Identifier.DateLabel = incoming.PublishTime.ToString("yyyyMMdd");
                                                                                                                        doc.Identifier.Timestamp = incoming.PublishTime.Ticks.ToString();
                                                                                                                        var paragraph = new Paragraph();
                                                                                                                        paragraph.Append(new Text(incoming.Content));
                                                                                                                        doc.Content.Sections.Add(new Section { Parts = new System.Collections.Generic.List<IContentElement> { paragraph } });
                                                                                                                        doc.DescriptiveMetadata.CopyrightNotice = "Bash.Im";
                                                                                                                        doc.DescriptiveMetadata.Created = incoming.PublishTime;
                                                                                                                        doc.DescriptiveMetadata.Language = "RUS";
                                                                                                                        doc.DescriptiveMetadata.Source = new Agency { Title = "bash.im", Url = "https://bash.im" };
                                                                                                                        doc.DescriptiveMetadata.Original = new Tag { Name = "href", Value = incoming.Link };
                                                                                                                        return doc;
                                                                                                                    }
                                                                                                                }
                                                                                                            }


                                                                                                            Это весь код сервиса, при этом, скомпиленное приложение умеет запускаться интерактивно и как служба, умеет устанавливать и удалять себя в системе. Регистрируется в service discovery и принимает данные от других сервисов, и передает данные после обработки дальше. Логируются все сбои и процесс работы. И т.д. Даже умеет горизонтально масштабироваться. И я не вижу аргументов по которым стоит менять язык. Но буду рад услышать ваши, чем плох такой подход, и чем спасет F#.
                                                                                                              0
                                                                                                              Не совсем понятно, в истории, где вы выгорели и попросили себя уволить, вы писали, что вы честно исследовали сложный баг, и просто длительное время никуда не продвигались. И это вызывало у меня сочувствие.

                                                                                                              Здесь же вы пишите «На ломанном английском я откровенно врал: «ол паст вик ай серч фор баг. Стил ноу саксес. Вил континью»»
                                                                                                              То есть, раз врали, значит вы ничего и не делали по задаче? Честно говоря, под таким углом это выглядит совсем по-другому.

                                                                                                              А если нет, то в чем ложь?
                                                                                                                +2
                                                                                                                Это выглядит странно со стороны, но если бы вы прожили тот день вместо меня, вы бы реагировали также. Думаю, что так у всех культистов технологий. Они влюбились в свои япы, потому что обстоятельства, при которых они с ними познакомились, очень остры лично для них.

                                                                                                                Как же я понимаю автора. В дни тяжёлой депрессии я просто беру свой старый проект на своём любимом языке программирования и просто пишу — один кусок, другой, придерживаюсь стандарта который беру за основу. Это ненадолго отвлекает и если заглушить в себе мысль "это никому не нужно", то можно просто помедитировать за написанием кода. Расслабляет лучше, чем алкоголь и всякие антидепрессанты

                                                                                                                  0
                                                                                                                  И вам я тоже хочу адресовать вопрос, что задал автору: «как должно быть, чтобы вы ощущали душевный подъем?»
                                                                                                                    +2

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


                                                                                                                    Как должно быть

                                                                                                                    Сложно на самом деле сказать. Это не какая-то определённая атмосфера или ритуалы. Просто я люблю программировать — мне нравится мой язык программирования, выбранный framework, нравится доходить до состояния осознания программы не как набора методов, классов, циклов и алгоритмов, а как непрерывного потока информации и данных, который я направляю в нужное мне русло. Из-за этого мне очень нравится Git — он напоминает реки кода, которые разливаются и сливаются вновь.


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


                                                                                                                    Так случилось, что слова автора...


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

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

                                                                                                                      0
                                                                                                                      Наверняка где-то за это благодарны и хорошо платят. Стоит узнать где :)
                                                                                                                        0
                                                                                                                        «здесь всё логично, строго и никакого хаоса» — до меня в текущем проекте работало 3 команды, в общем человек 50, хаос это мягко сказано, чтоб что-то понять надо выйти на 10й уровень.
                                                                                                                    –1
                                                                                                                    Может попробовать собрать совместимых разработчиков, придумать интересный проект и на себя поработать. Можно дело в несовместимом коллективе? Может именно в этой не совместимости и есть суть профессионального выгорания? Может хочется над чем-то глобальным, своим работать? Проблема выгорания и человеческой несовместимости самое главная проблема. И вот походу ее решение psycalc.github.io
                                                                                                                      +2
                                                                                                                      У вас получилась какая-то ложная дихотомия — либо «C# и уныние», либо «F# и процветание». И выходит как в известной картинке:
                                                                                                                      Спойлер


                                                                                                                      А на самом деле корень проблемы был в унылости работы, с ее энтерпрайзными подходами и унылыми задачами, а не в инструменте, которым эти задачи решались.
                                                                                                                        +2
                                                                                                                        «Я часто критикую технологии, которые кажутся мне неправильными, и в ответ получаю… в морду»
                                                                                                                        На кого рассчитан этот текст? За 25 лет в ИТ передо мной сменились десятки технологий и сотни людей, и я ни разу не видел человека способного за критику технологий дать в морду. Автор переигрывает.
                                                                                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                                            0
                                                                                                                            Возможно, чтобы было интереснее лучше идти в игрострой)
                                                                                                                              +1
                                                                                                                              И никто не написал про огнетушитель…
                                                                                                                                0
                                                                                                                                Для меня программирование это неведомый мир где общаются люди в серебристых одеждах на языках не похожих ни на один земной. Но очень интересно было следить за переживаниями автора. Хочется его спросить: автор, а что тебе нравится, что делает тебя счастливым? Какая деятельность?
                                                                                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                                                    0
                                                                                                                                    Я не сказать хочу, а узнать.
                                                                                                                                  –1
                                                                                                                                  А не хотите ли попробовать Perl?
                                                                                                                                    +2
                                                                                                                                    он же умер уже лет пять как, нет?
                                                                                                                                      +1
                                                                                                                                      Он как фортран. Думаешь умер, а реально без него полмира сломается.
                                                                                                                                        –2

                                                                                                                                        Именно. Как может умереть топовый язык?


                                                                                                                                        Даже если он и умер, то на мой век хватит. Он мне нравится, я его люблю: он прост и гибок. А всякое говно, которое приводят в примерах по поводу перл, можно писать на любом языке. Просто этих "примеров" на перл больше… =(

                                                                                                                                        0
                                                                                                                                        … и откопал Perl.
                                                                                                                                          –2

                                                                                                                                          Почему умер? я успешно на нём программирую уже лет, эдак, 15. По статистики ActiveState в последние годы активность проектов на Perl возросла.


                                                                                                                                          Вот например последние 2 года я переписывал проект построенный модуле Mason, первая версия которого вышла в 1998году!


                                                                                                                                          Очень даже хороший boost для бизнеса, когда всё работало годы и никто ничего не трогал. За это я и люблю Perl. Спасибо разработчикам за совместимость!


                                                                                                                                          Вообще не понимаю как люди верят в этот булшит по поводу "Перл умер", если он является топовым языком все эти годы...

                                                                                                                                        –1
                                                                                                                                        Обратите внимание что автор никому из вас не ответил в комментариях. И судя по содержанию статей которые он уже успел написать, автор профессиональный тролль(ИМХО) =)
                                                                                                                                          –2
                                                                                                                                          Какая-то «нездоровая» ситуация. Мне кажется автор выбрал не ту профессию
                                                                                                                                            0
                                                                                                                                            Что читать по F#?
                                                                                                                                              +1
                                                                                                                                              Что читать по F#?

                                                                                                                                              Можно начать отсюда:
                                                                                                                                              https://fsharpforfunandprofit.com/why-use-fsharp/


                                                                                                                                              По мнению подавляющего большинства F#истов, лучший сайт для обучения

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

                                                                                                                                            Самое читаемое