Моя программистская карьера началась бесхитростно - там, куда взяли. Взяли делать бэкенд на Джаве. Ладно. Все равно я не знал, о чем надо мечтать. Потом немножно Питона. Распределенные системы. Erlang. Щепотка Perl-а. Последние два года программирую интерфейсы. Расчет был, конечно, что я приду на все готовое - разберусь и пойду дальше. Как бы не так. Готового, на самом деле, нигде не было. Всегда превозмогание. Молодая индустрия. Ладно. Но вот странно, как люди этого не ощущают. Есть метания. Мода. И люди прям всей головой и сердцем отдаются. Может, это только у самых шумных, конечно, но каждое новое веяние как последнее. Не хватает какой-то скромности, умеренного энтузиазма.
Я помню энтузиазм по поводу XML-я. Потом тот же энтузиазм по поводу Java-аннотаций. Я еще думал: окей, мы пишем по-другому, но пишем-то то же самое. Неужели это может чью-то жизнь изменить? Верили, что может.
Hibernate помню, и эти убойные аргументы: а что если мы базу данных захотим поменять? И все верили, и шли на поводу, и полностью всё приложение переписывали, лишь бы не было SQL-я. Да, трудно становилось через какое-то время, и начиналась борьба не за код, а за выживание, с самим Хибернейтом. Но никто трезво на это не смотрел, казалось, что если проблемы, это мы недопонимаем и надо еще бороться. Естественно, консультанты, рекомендации, best practices.
Помню, как мечтали о JavaEE, и я тоже мечтал. Оказалось, что это тот же Хибернейт, только нужно еще раз все переделать. Переделать, чтобы получилось так же. Наивные были, молодые. О чем больше всего говорят, то и используем. Смешно - где сейчас Хибернейт, а где SQL, да?
Помню безумие вокруг Inversion of Control, помню как читал гайд к Guice, в котором писали: «сейчас мы вам объясним, как надо писать программы. Скорее всего, вы обнаружите во время рефакторинга, что одно тянет за собой другое, и чтобы внедрить IoC, вам понадобится переписать весь код. This is a good thing». Это this is a good thing очень въелось мне в память, я отчетливо в тот момент почувствовал, что нас всех дурят. Но где было мое смутное ощущение, и где лидеры индустрии. Оказалось, лидеры тоже бывают голые.
Помню нездоровый энтузиазм по поводу ООП. Были долгие внутриконторские споры, как правильно делать иерархию классов. Какой паттерн применить. Оказалось, паттерны нужны пару штук на всю архитектуру, а пишу я сейчас на языке без иерархий вообще. Тогда это было немыслимо.
Или вот: в ООП меня очень смущал вопрос «Paper.writeWith(Pen) или Pen.writeOn(Paper)». Тогда мне казалось, что ООП пригодно для всего, пóлно, следовательно правильный ответ существует, просто я не до конца разобрался, и нужно напрячься. Сейчас я расслабился, вижу, что у каждой концепции есть границы, когда что-то в нее не лезет, это проблемы концепции, а не того, что в нее запихивают. Это нормально. Даже если очень хочется быть адвокатом какой-то идеи, честность, хотя бы перед собой, важнее. Не надо мутить воду. Если функция удобнее класса - берите функцию. В этом больше честности и смысла, чем в следовании OOP-way. Нет никакого OOP-way. Нет никакого Java-way, Ruby-way, NodeJS-way, FP-way, microservice-way, Docker-way, не надо приносить им жертвы. Концепция это инструмент, а не религия или образ мысли. И не надо доставать ключи из словарей через Promise.
Но крестовый поход длится и по сей день. Концепции новые, адвокаты все такие же.
Читал на днях:
How do you approach this problem with Rx? Well, to start with, (almost) everything can be a stream. That’s the Rx mantra.
Then we will have created a beast called “metastream”: a stream of streams. Don’t panic yet. A metastream is a stream where each emitted value is yet another stream.
Flatmap is not a “fix” and metastreams are not a bug, these are really the tools for dealing with asynchronous responses in Rx.
Сравните с
гораздо более адекватным:
Note: It is usually best to use signals as little as possible. When it comes to writing nice modular code, you should primarily use normal functions and values. If you find yourself stuck with a signal of signals, ask yourself “how can I model this explicitly with functions and values?”
Вот человек
тоже адекватно пишет (лучше всю статью прочитать) про то, что если вы придумали асинхронный IO, то как его не маскируй, получится не очень:
People in the Node community have realized that callbacks are a pain for a long time, and have looked around for solutions. One technique that gets a bunch of people excited is promises, which you may also know by their rapper name “futures”.
But, honestly, it’s like the difference between being punched in the gut versus punched in the privates. Less painful, yes, but I don’t think anyone should really get thrilled about the value proposition.
Такой трезвый взгляд очень важен, но важность понимаешь не сразу, нужен опыт в пять-десять лет, чтобы видеть, как работает общественное мнение и мода. Люди склонны путать новый способ делать вещи с деланием новых вещей. Я только рад, когда новые концепции помогают решать новые проблемы. Но, пожалуйста, давайте не искать проблем там, где их нет, и не усложнять то, что мы решать уже умеем. С аскетичным арсеналом можно сделать многое, а проблемы, когда понадобятся, сами нас найдут.