#65 Прожарка: Стоит ли писать на Spring Boot в 2026? | Валерий Жила
Друзья, привет. Это подкаст организованное программирование. Я его ведущий Кирилл Макевнинс. Сегодня у меня в гостях Валерий Жила. Валера у нас инженер из Германии. Enterprise суровый Java, всё как полагается. И сегодня мы с Валерой поговорим про Сprмбotд. А сразу, наверное, хочется сказать, что я давно планировал серию постов, не постов, в смысле видеопостов, можно так сказать, да, подкастов на тему вообще фреймворков. И не с точки зрения того, что нас придут просто послушать люди, которые уже этим фреймворком владеют, да, и такие типа да или нет, нет, вы неправильно всё говорите. А с точки зрения того, как на это смотрят другие люди, которые пишут на чём-то своём, и насколько их может это заинтересовать, они подумают, что стоит этот фреймворк попробовать изучить или вообще даже, господи, прости, изучить новый язык эт фреймворк и внедрить его в своей работе или там для своих каких-то проектов. Я надеюсь, что у нас это получится, поэтому постараемся с одной стороны рассказывать всякое разное, но при этом не копать в глубину, которая интересна только специалистам. Ну и фактически, наверное, сегодня вот первый такой будет заход, да, потому что мы вот берём конкретно именно Спрингб как, наверное, самый популярный, по крайней мере, на текущий момент фреймворк. И, кстати, если помнишь, Женя Борисов, собственно, предрекал, что, по-моему, если я не ошибаюсь, он мне в подкасте говорил, что он скоро уйдёт и всё будет писать за нас. И в чём я пока сомневаюсь. Привет. Привет. М. Я так понимаю, что ты тоже пока сомневаешься, что и нас заменят. Хотелось бы верить, но сложно сказать, да, на текущий момент. [музыка] Смотри, у тебя довольно суровая интерпразная история, да, в которой много-много спрингбута. Можно в двух словах как-то это охарактеризовать, но чтобы было понятно, там объёмы трафика, размеры проектов, количество, не знаю, попоинтов, нагрузка, монолит микросервиса. Что там ещё? Какие слова важно сказать? Да, там, где я сейчас работаю, у нас на этом продукте, на одном продукте где-то до 200 разработчиков. И понятно, ну ещё там опсы, безопасники, много-много много других людей, но вот люди, которые там берут кодерские задачи, чек 200, это такой скоп сервисов тоже
местами это монолиты, местами микросервиса. То есть, э, надо понимать, что это инфраструктура эволюционировала, наверное, лет 205, может даже больше в сегодняшнем виде. И чётко видно, когда что было популярным или что когда было переписаным. Но это, да, это пару сотен уникальных сервисов. Там сколько инстансов, я не скажу. Ну, в какой-то мелочи могут быть тысячи инстансов, если нужно. Это да. Объёмы трафика, то, да, и это B2B контекст. Это не B2C, где у тебя там миллионы клиентов и скачивание в App Store. Это большие клиенты с очень большим трафиком, там, не знаю. Ну, при этом у клиентов будет, ну, у одного как бы бизнеса, B2B будет там, не знаю, там максимум тысяча, несколько тысяч клиентов, но каждый из них может гонять трибайты данных. Ну, не в секунду, но быстро. Да, да, да, не секунду, да, условно, в день, в несколько дней. То есть вот вот так вот то объёмы, да? То есть, ну, не знаю, много MQ, много базданных какие-то могут быть, гигабайты самые большие. Ну, наверное, если не считать какие-то архивные системы, то там десятки Трабайт режи, то есть сырых данных. А, но надо понимать, что тоже что за данные. В основном это данные сигналов городов и энергосетей. То есть это там какие-то числа или сигналы, вектора. А, то есть это не там не видео, условно. Угу. Слушай, а вот знаешь, наверное, первый вопрос, который задам. В какой-то момент действительно Enterprise, Java - это были, ну, слова синонимы в каком-то смысле, да? А потом у ну альтернатив особо не было. Есть те, кто сидели на макрософтских технологиях, есть, кто сидели на Джаве, остальное где-то там вокруг, немножко в других местах, да. Ну, где-то для скорости. О'кей. C++ Но в целом всё-таки основные вот эти языки и в какой-то момент го начал врываться. Мне просто хочется, знаешь, узнать, поскольку вот столько лет не было ли такого внутреннего ощущения желания, что так хорош, давай как все, переписывать на го будет лучше. На самом деле не возникал. То есть у нас иногда порываются плюсы, приписывать на раз, а конкретно у наскейса для goюзкейсы были, возможно даже есть, но добавлять новый язык во весь этот стек где уже намешана куча языков. То есть, да, действительно, какие-то продукты у нас там джавовские под капотом будут сишные, C++сплюшные либы, где-то будет ещё там питон использоваться, где-то там ещё более старые языки в совсем древних частях, но ко всему этому ещё голда кинуть. Угу. Ну, это так просто интересно, потому что, а, особенно более, наверное, такие молодые разработчики, хотя ты супермолодой разработчик, да, вот в этом Дада. Но при этом всё равно есть ребята, которые приходят такие: "Блин, вот Java там этот старьё сидит. Давайте сейчас мы тут немножко эх молодёжного, модного, гошного". Ну просто интересно, что у вас этого не происходит. О'кей. И Спрингбд же не сразу появился. Ты имеешь в виду, что в какой-то момент новые сервисы на нём начали делать и переписывать старые, правильно? Эти, да, точнее, да. Начну с этой стороны. Джавовские изначально были джавовские сервисы и самописные библиотеки, как, наверное, было в тысячах миллионах компаний по всему миру. Потом какие-то из них начали замечать спринговыми библиотеками. И вот получился такой микс чистая Java, Java и самописный аля Spring и Spring. И вот только в последние, наверное, года три, собственно, всё время, как я там работаю, мы начали очень много где выкидывать старые часто спринговые или чисто джавовские вещи и использовать спрингт на этом, ну, точнее, даже не выкидывать, а модернизировать или, ну, там в зависимости от изначального сервиса. И большую часть нового мы пишем на спринбуте. О'кей. Сейчас мы начнём немножко по косточкам сбн. Господи, почему букву сказал разбирать. И давай просто немножко сравним. То есть вот когда мы говорим про Springбot, это фреймворк, грубо говоря, который стоит плюс-минус в одном ряду. Ну, то, что решает те же задачи, да, там есть много нюансиков. А, но в целом а с какими фреймворками, то есть мы можем их сравнить, потому что я услышал, ты сказал, что на FastI пишешь. Можешь ли ты сказать, что Ну нет, я не могу его то, я точно не могу справать бут с Fast API. Fast API для меня это там, не знаю, какая какой-то Sprint MVC или кусочки Sprint Security, но Fast API не решает всего спектра. А Fast API даже тебе, ну, не запускает, Fast API не запускает веб-сервер. То есть ты Fast API используешь её в каком-то внешнем там UVкоorрне, как он называется. То есть Да, FPI - это маленький кусочек Спрингбта. Я думаю, что Springbot частично похож на NestgS. Вот определённые параллели между ними есть. А, и для Ноды и сегодня, ну, сегодня ещё кваркус есть, да? То есть понятно, они конкуренты, они буквально работают на одном поле. Ну, точно его надо назвать. Ну да, мы про конкурентов Спрингбута, про его производительность и вот всякие проблемы чуть попозже, наверное, поговорим тоже. Точно есть в мире cшарпа аналоги там, но я на 100, то есть я в какой-то момен и я вообще ну не знаю, что сейчас вот номер один в мире США, если честно, но там точно тоже своя. Ну, это, кстати, я тут немножко, наверное, доуточню, потому что у тебя всё-таки чуть более такой джавовый взгляд на это, ну, привыкший к тому, что у тебя такой фреймворк, который, ну, что уж говорить, в каком ещё фреймворке по То есть, если мы берём конкретно Spring Security, у тебя книжки пишут по этой штуке, и без поллитра там не разобраться. Такого, конечно, ни в одном другом фреймворке, наверное, особо нет, кроме того же, может быть, шарпа. Но если говорить просто про решение типовых вебовских задач, ну, чтобы просто у людей не складывалось ощущение, что ты спринбут используешь только когда у тебя там, не знаю, ты букинг строишь, да? А он в базе, и мы сейчас тоже поговорим про отличие от спринга, ведь вполне, ну, доступный. То есть у тебя там три строчки и у тебя уже открылось что-то в браузере, да? Соответственно, ты там набросал, и в принципе, если тебе не очень надо и ты не очень хочешь, ты можешь не нырять даже во все эти сложные штуки и не ставить их. Поэтому с точки зрения типа я конкретно хочу сделать какое-то веб-приложение, Снbot прекрасно подходит, да, и он в этом плане абсолютный конкурент. Label Rails, Jang Festpi. Хотя тот ближе, наверное, к микрофреймворкам, который вообще ничего кроме роутинга-то особо и нет, да. А потому что в таком случае можно уже экспресс туда впихивать и флас какой-нибудь, да, это вот того уровня. Они там по производительности отличаются ещё чему-то, но в целом не я в том числе к тому же рассказываю, почему. Потому что вот по этим фреймворкам мы тоже будем идти, потому что между ними есть там типа какой-то выбор. А то, что Java тоже иногда не выбирают по разным причинам. а-а, производительность памяти или там сложность найма программистов. Ну, какие-то есть штуки, которые, кстати, сейчас мы с тобой обсудим. Но прежде чем вот в это нырять, смотри, есть ведь история какая интересная. То есть вот вы как бы постепенно в это шли, начали использовать, но ведь, во-первых, есть спринг, а есть спрингб. И вот это для очень многих людей, я уверен, ну, вообще не очень понятная штука, что это такое. Я, кстати, сегодня буду, скорее всего, использовать Я часто говорю Спринг, имею в виду СНБ. Потому Но я я предложил бы уйти ещё на шаг назад и обсудить, почему появился Спринг и какие цели он выполняет, и уже какие проблемы решал Спрингб, потому что иначе понять сложно. Вот. То есть изначально мир каким был? Ну, с динозавроле Да, да, да, да, да. В нулевые, наверное. Я не знаю, я в детский сад ходил, но я видел на старых проектах и мне деды рассказывали, что люди писали на чистой джаве. А ты, да, ты пишешь на опшном языке, ты выстраиваешь себе иерархии классов, ты делаешь какие-то структуры данных, но самая большая проблема - это не написать класс был, который решал спринт, а связатель и запуск приложения был связан. Ну, то есть у тебя там вызывался меa и там начиналась совершенно ужасная инициализация на пару тысяч строк кодов больших проектах или больше, где, ну, тебе там надо построить, ну, там уже сложные объекты, включали в себя какие-то фабрики, которые наследовались от чего-то. В общем, выстроить и связать всю программу было огромной боль. А, ну очень много, что люди, что люди писали, было довольно типовым. Люди ходили в базу данных, люди отвечали на запросы, там с МQ общались безопасностью, там мониторинг выстраивали. То есть это, во-первых, были типовые вещи, во-вторых, очень, ну, вот какой самый популярный паттерн программирования, кого ты назовёшь, да, первым делом люди назовут Синлтон. Люди хочешь любили очень многие вещи в Джаве, писали синглтоны. И в итоге ты выстраива связывал гигантскую структуру инициализации этих синглтонов и по вот такую таким касками. Что сдела делали люди дальше? Люди делали фреймворки у себя маленькие в компании, которые облегчали эту жизнь, облегчали жизнь, как-то всё инициализировали на аннотациях. Что сделали люди из Спринга? Они сказали: "Слушайте, а давайте мы ведём такую тему". Ну не они это придумали, но вот этот инверсия контроль. который тебе нужен для того, что вот в солиде последняя буква D - это что у нас? Dependency inversion. Так, и как раз эти это инверсия контроля в спринге, то есть ты прописываешь свои бины в спринге, ты прописываешь как бы просто ты прописываешь свои объекты, которые тебе нужны, и декларативно прописываешь, как они должны быть связаны. И вот эту проблему первую решал Спринг. Второй проблему, которую он решал - это создание библиотек или фреймворков, там они уже были на разном уровне, где решали все типовые задачи. То есть был какой-то спрингта для работы с базой мета, был сн secюрити, был там, не знаю, спринт актуатор, много-много много платилось фреймворка, которые решали типовые задачи. Вот тут мы дошли до того, зачем нужен спринг. Он ещё много чего делал, но это для меня две основные вещи. Но если мы посмотрим на то, как уже вот дальше мы пришли в точку, где у нас Spring делает нашу джавовскую программу, собирает, а мы её пакуем в какой-то вебархив и стартуем в каком-то внешнем веб-сервере там, тонко. Я правильно понимаю, что ты сейчас просто к Буту хотел переходить? Я бы вот тут паузу сделал, да? Я бы паузу сделал. Короче, это очень забавная вещь, я тебе честно скажу. Вот. Скажем так, я там разработкой давно занимаюсь, да, там с 2007 года за деньги уже. А так в целом раньше начал. И Джавы там не было долгое время, хотя, знаешь, как она была в книжках, то есть я умел читать код, понимать, но вот эта вот идея там и чистый код вышел давно, и другие книжки, и там Джава везде было много, но в какой-то момент начал писать и могу тебе такую вещь забавную сказать. Вот эта вот штука, которая для джавистов является какой-то естественной. Ну, то есть они это как проблему такую рассказывают. Вот у нас есть много, значит, э, я не хочу даже слово класс объекта говорить, потому что обычно это даже не используется, да, есть много частей, когда осущны, которые надо вот так вот связать и чтобы что-то получилось. И это некая такая фундаментальная проблема. Все страдают. И вот, значит, спринг появился и захватил мир. И вот мы живём все под спрегом. Я всегда в этот момент немножко просмея про себя смеюсь, потому что я по знаешь, в каком смысле? Я понимаю, что люди, которые не из мира Джавы, они вообще не поняли проблему. Знаешь почему? Потому что если это нишй шарп, в котором похожая ситуация, то у тебя ты берёшь питанистов, рубистов, джавистов, тайпскриптеров, гоферов, там, кто там ещё растх, они вообще этого не понимают. То есть типа: "А у нас тогда что аналогом является? А как мы вообще живём? А что мы делаем?" И ты увидишь, что этого нигде нет в таком виде практически. То есть оно, если есть, то только локально, например, на уровне какого-то фреймворка. Кстати, из этого можно даже поржать. Очень хорошо это видно на примере фронтда. Вот у тебя есть React, да? Ну где сприн? Как концепция, где, да? То есть ну ладно, о'кей, на уровне пропсов, но это общая концепция, то есть инверсия контроля - это вообще древнейший принцип. Она не про классы, не про объекты, не про сборку, да, она просто про передачу, да, а сверху вниз по флоу программы. А вот когда речь идёт про инверсию прямо зависимостей, вдруг выясняется очень смешная вещь, которую ты, я думаю, знаешь. А Angular- единственный фреймворк во фронтде, в котором это является ядром самого фреймворка. Вопрос, почему? Потому что его сделали Java программисты, то есть Angнгулар первый сделали джаavвисты, которые в Гугле работали, и, соответственно, они это туда привнесли. И единственный, я просто по опыту ещё сабесов могу сказать, что если ты в принципе заведёшь тему вокруг инверсии и у тебя из фронтендеров только ангулярщики тебя поймут, и они реально у них терминология есть такая, остальные просто даже не поймут, о чём ты говоришь. Я к чему всё это рассказываю? К тому, что я бы хотел с тобой немножко остановиться, чтобы как раз вот всё-таки попытаться, раз уж мы про это заговорили, а кто-то, может быть, скипнет, если он это понимает, или это ему покажет слишком скучно, но мне кажется, как будто стоит немножко остановиться, чтобы раз и навсегда это объяснить, типа, почему остальные от этого не страдают, а джависты от этого страдают и так страдают, что для них это является вот просто венцом, так сказать, творения всего, что они делают. Это был вопрос. Это такой, да, на дискуссионный, потому что я понимаю, что у тебя ответа готового нет. А у меня тоже есть какие-то мысли на эту тему. Ну вот ты в Питоне работаешь, там же никто не начинает с того, что вот тебе, что все питонисты говорили: "Вот эта штука для инверсии, всё вокруг неё фастпи строй". Да и для меня это большая проблема, питон, потому что я Да, и они тебя не понимают, правильно? Ведь ты им говоришь, они тебя не понимают, о чём ты вообще? Я думаю, во-первых, вот мы оставим питон, да, вот будем в этих двух языках на секунду. Угу. Всё-таки в моём личном мире программы на Питоне, если это часто или научный код, ну там научный, аишный, дата аналитика, вот вся вот эта, то есть такой WR only код, который один раз пишется и больше его никто не читает. он нужен для какого-то результата, не тот, который ты не собираешься 10 лет поддерживать или или больше, либо у тебя проекты, которые требуют высокого темпа изменения, м большого такого, ну, где ты выигрываешь от этой динамики питона, но где вот эта вот динамичность языка ограничивает скоп твоего проекта. Я могу себе представить гигантский проект на Джаве, в котором будет бесконечно слоёв абстракции. А, ну на Питоне мне очень некомфортно в проекте, который там, не знаю, выходит там, не знаю, даже там за 100 файл. Вот. И в Джаве как раз вся больше версия контроля в том, что тебе нужно написать код, который тебе будет удобно тестировать и будет возможность его долгое время поддерживать и расширять. В Питоне для меня всегда, ну, как-то с этим проще, ниже ставки. Но это потому что тут, видишь, не совсем честное сравнение, потому что питон динамический, даже при том, что они типы тянут, можно всегда сказать, что, ну, там как бы не нужно, программы бывают маленькие, но мы с тобой берём, например, тайpesрипт. Вот на тайпскрипте у тебя программы на 2 млн строк, на 3че, это вообще уже норма, потому что берёшь какую-нибудь Фигму, берёшь какие-нибу Ну вот всё, что там в браузере, да, это вообще не шутки. Это объёмы, на которых, ну, типа на Питоне программа в 5 млн строк - это, конечно, ай-ай-ай. Хотя, кстати, в букинге он пёл. Сколько там миллионов строк у них на перле? Живые же. Но что-то они там сами накалякали, да, вот чтобы это работало. И там и в таких системах тоже этого нет, по крайней мере, массово. То есть всё равно это как-то так не распространяется. Поэтому статичность языка и вот эти объёмы как будто бы не совсем ответ. Вот что я хотел и почему я это сказал. То есть если бы было дело только в этом, наверное, мы бы во всех компилируемых языках, которые на которых пишут большие проекты, увидели тенденцию такую. Какой именно к? Ну вот появление чего-то типа спринга и что все об этом говорят и говорят, что как о некой фундаментальной проблемы, как в Джаве, да, что типа сначала был спринг, после этого появились программисты, да, там, ну, то есть типа как самая важная часть всей системы, я думаю. Во-первых, если мы снова возвращамся к питону или к JS, это языки намного более демократичные, что ли. То есть ты там, ну, на Pon, там, на на ноду, на JavaScript человек либо пишет её куда-то выкладывает, и ты ей пользуешься. А Java для Enterprise, то есть изначально какая была гонка? Была гонка Спринга и Java Java, которую спецификацию делал с Oracle. То есть компании боялись базироваться на спринге и, ну, какие-то даже сегодня какие-то финтехи банки используют Javaе. Ну, потому что у тебя официальная поддержка там от компании, которая которая он владеет, которая владеет языком, ну, владела раньше. Аа в Питоне, Джеси такой проблематики для с моей точки зрения, никогда не было. То есть на ней не писали системы, для которых для обязательств по поддержке которым нужны толпы юристов такого. Они более мутабельные данные, они более свободные, да. А давай я, э, у меня есть такая гипотеза небольшая, попробую её высказать на тему того, чтобы всё-таки люди поняли, потому что вот мне кажется, мы говорим, говорим, может не до конца понятно. Здесь о чём вообще речь идёт, да? Что мм когда программисты работают с программой, допустим, у тебя есть там отдельный коннект к базе. Это, ребята, я к вам обращаюсь, кто нас слушает, да, у вас есть отдельный там логер, у вас есть отдельная, а, штука для работы с там с очередьми, ещё какая-нидь внешняя система и так далее. И все эти фигни, они мало того, что требуют своей какой-то собственной инициализации всегда, так они ещё друг с другом как-то должны соединяться и использоваться. И вот если у вас как бы нету клея никакого для этого, то у вас будет просто э куча рукопашного кода, который всё это отдельно где-то инициализирует. А вот дальше вопрос: а как он это собирает? Например, вот есть у вас программа там на чём-нибудь джанки какой-нибудь, и у вас какой-то появляется внешний, а, штука для APIв, там куда-то вам надо ходить, и у него есть стейт, его надо инициализировать. Так вот, когда у вас это никак не реализовано, нет поддержки чего-то аля типа спринга, а, которая всё это может собрать, у вас по сути всё превращается в набор глобальных переменных. У вас, например, вы, э, банально в каком-нибудь модуле создаёте переменную, которую импортируете в любом файле, имеете к ней прямой доступ и она, соответственно, куда-то ходит. То же самое касается соединения с базой, то же самое всего. И у вас получается, что либо это решается средствами самих языков, ну, как в Пайthне, да, ты прямо в файле создал connect DB и пошёл импортировать его в других местах. Всё, вопрос решён. Гово, куда проще-то? Да, но при таком подходе а ну а в других языках синглотоны. И, кстати, в Джаве, да, да, вот ты сказал про синглотоны. Собственно, там так нельзя сделать. Поэтому единственный способ - это, по сути, в статику пихать и отовсюду этот доступ иметь. И к чему, собственно, это приводит? Вот на самом деле все вот, да, даже вот несмотря на то, что ты говоришь, это там для entтерпрайз нужно. Понятно, что люди, которые понимают, как это работает, да, они это ощущают и в общем-то на прикладном простом коде, когда вдруг оказывается, что у тебя не одно не один контакт в базе данных, а два. Вдруг оказывается, что для работы с этим апи в тестах тебе нужно подменять реализацию или тебе нужны другие параметры. Вдруг оказывается, что у тебя, ну, опять же, подмены там очень много при разных условиях. И в итоге выясняется, что вот это вот всё соединение, оно, как правило, если программисты делают таксяк, оно всегда приводит к проблемам. Ты такой в какой-то момент оказываешься в том, что, блин, у меня сейчас readй надо разделить, у меня надо пишку тут одну, тут вторую, тут третью. В рубе, кстати, часто так бывает, потому что там как раз, знаешь, как очень многие клиентские библиотеки, они как раз потому что не принято делать инверсию, они часто идут уже с заранее готовым там аля типа модуль, в котором в статическом свойстве уже лежит типа объект, которым ты можешь пользоваться. И для джависта это звучит, наверное, просто что вы вообще о чём говорите? Но для прикладного чувака, который просто какой-то веб-сайт мутит, вполне нормально. Ты просто его сразу взял, и получается, что люди, может, этого не замечают, но у них вся программа пропитана глобальными переменными, которые вот так вот. А если ты ещё их меняешь и через них меняется какой-то стейт, это превращается, конечно, в кашу. И вот, собственно, Спринг, он это что делает? Он как бы говорит: "Хорош, давайте не будем пользоваться глобальными переменнами. У вас же по сути, особенно в джавовом мире, где всё только через классы, у вас получается, мы, грубо говоря, придумываем граф зависимости между вот этими всеми объектами. Мы сами их все и мы сами этот граф собираем. Это очень, знаешь, на что похоже? А вот тот, кто в опшных языках собирал деревья, когда newde передачи туда, ну вот знаешь, как представь, что GCX, но но в чистом JS-коде без самого GSX, сразу становится понятно, что это такое, какую-то проблему решает, потому что писать такой код даже хотя бы для пяти объектов, это просто какой-то кошмар. Ты просто такой там эти инстансы этих сюда прокинул, тра-та-та-та-та, а, но какие-то плюсы даёт. То есть у тебя, во-первых, ты с объектами работаешь нормальными, у тебя может быть несколько инстансов. Ты можешь задавать вот это, знаешь, не очевидная вещь для людей, которые с этим не работали. Лайкл, типа создавать на каждый запрос или иметь один экземпляр, там пересоздавать и так далее. Короче, в конечном итоге эта штука, она действительно помогает сделать так, что у вас система становится гибче с точки зрения подмены и всего остального, особенно когда её за тебя сделали. Ты только что Да, я с этим полностью согласен. С одним маленьким ног. Ты только что сказал вот слово объекты, что ты можешь как бы инициализировать одни объекты, используют другие объекты. И Спринг делает ситуацию ещё лучше. Ты используешь не объекты для инициализации, ты используешь их интерфейсы. Вот это делает эту подмену возможной и очень удобной. Да, понятно, что на уровне имплементации, в смысле на уровне смыслов, я это имею в виду, что в этом смысле появляется подмена. Ты с помощью конфигурации можешь сказать: "Я использую сейчас один интерфейс". В смысле сейчас одну реализацию, завтра я использую другую, и у тебя всё type save, всё компилится. Самое забавное, кстати, что сам спринг невозможно сделать без этого рефлексии, рефлексии. То есть он сам требует очень динамического природы языка. А в Джаве её выше крыши, кто не знает, всё можно обжектом делать. и вы получаете питон, если упрощать. Ну, немножко покастить придётся, но по факту вы можете сделать его динамическим языкам языком, да. Вот я надеюсь, что получилось. Ребят, напишите, пожалуйста, в комментариях, понятно или нет. Мне просто, знаешь, хотелось вот раз и навсегда людям объяснить, потому что даже если джависты начинают про это говорить, это настолько непонятная проблема для неджавистов, что они никогда эти объяснения не воспринимают. Типа, ну, это какие-то ваши заморочки, нам это не надо. Надо. Я в тех же рельсах внедряю, например, э Dependency Injection, потому что, ну, просто тупо никак. А знаешь, почему, кстати, это прокатывает? Я могу сказать, а потому что если ты берёшь большинство языков, э, в духе опять же джез и всего остального, у тебя суперразвит манки патчинг. Ты же в Джаве так не сделаешь, когда ты можешь просто напрямую там прототип поменять или в рубе открытый класс, ты просто берёшь и любой класс переписываешь. Тебе даже доступ к нему иметь не надо. В Пайтоне же то же самое. Ты можешь просто взять и сделать подмену. Поэтому большинство библиотек, даже там для МОКа, для подмены запросов и так далее, они либо берут на низком уровне меняют какие-то ядро языка, либо умеют внедряться в существующие библиотеки. Ты же, наверное, это видел. Кстати, в Джаве это не принято. То есть, например, ты берёшь иног какой-нибудь в Джессие для подмены HTTP запросов, и у него тупо внутри встроены самые популярные библиотеки. То есть он такой: "Я аксио могу подменить?" Такой: "О, класс". И всё. И поэтому можно не задумываться об этом. Ну, опять же, до поры до времени у тебя там появляются всякие сайд-эффекты. Чем сложнее система, тем хуже. Ну ладно, в общем, это, короче, спринг. И он это решает. То есть и, кстати, что тут ещё важно? Спринг-то без бута используется, ведь правильно? Да, он использовался, но сегодня для меня начинать проект на чистом спринге без спрингбта. У тебя должен быть у тебя должны быть какие-то требования внешние, которые ээ то есть я бы ну для мене в 90% случаев, где тебе, где ты не пришёл на проект и тебе прокторинг, потому потому что и это имеет смысл, но для меня это беда с башкой. То есть потому что SpringБ решает такое количество проблем и вопросов, ээ, на спринге решать после использования Спрингбта просто, ну, ну кажется чем-то фундаментально, неправильным, да. Ну, и плюс, правильно я понимаю, всё равно у тебя в конечном итоге, как ни крути, даже если это интравеб, у тебя всё равно веб, то есть у тебя HTTP, у тебя запросы, тебе нужны контроллеры, тебе нужна тамка, да. И коммуникации с внешним миром её тоже много. Дада. Да, да. А спринг он вообще не про это. То есть там, естественно, это не история про готовые какие-то такие инструменты. Хорошо. И соответственно у нас появляется ещё что ещё? Ну, я имею в виду там секюрити какой-нибудь и так далее. То есть у тебя я имею в виду секюрити в смысле вебовская, то есть именно заточка secюрити делает это. Ну, ну там рест-контроллеров нет. Там у тебя нету делать это, да? А мне казалось стринга. Всё, я понял. Ты имеешь в виду, что я почему-то думал, что спрингб в какой-то момент стал это заменять. Или ты имеешь ви, что он просто в конечном итоге просто конфигурацию всего этого добра упростил? Да, это было в спринге. То есть если вот мы там, не знаю, откроем сайт Спринга и посмотрим спринговые фреймворки, вот весь, то есть что входит в спринг? Там пару десятков точно наберёт, но у тебя в основном Spring Data есть, Spring Data есть, Springbot что-то там, не знаю, Data Starg. То есть это это как автоконфигуратор, который тебе А то есть ты не должен писать классы или там мелем. ты используешь две-три какие-то важные там пропрети, то есть там, не знаю, в конфиге прописываешь вещи заранее обозначенными ключами, то есть ты только свой урол своей базы данных вставляешь, там, не знаю, пароль передаёшь из переменной окружения, говоришь, сколько тебе нужно коннекшн. То есть ты можешь очень всё тонко настраивать, но ты это настраиваешь не кодом, а конфигом. Причём для простых приложений тебе надо, ну, буквально одно один два параметра обозначить и всё. Если опять же на контрасте говорить, это как раз не является для, как мы уже говорили, людей из других фреймворков вообще проблема. Они говорят: "Да мне вообще ничего настраивать не надо, у меня всё работает". Просто скорее речь идёт, что надо сравнивать правильно. То есть спрингб сравнивать именно со спрингом, да? Потому что в спринге всё это есть, но ты пойди засета приложение, которое просто ходит в базу, круто обычно делает. Там количество вот этих вот соединений, то есть спринг даёт функциональность такую, но он сам за тебя это не делает, да? И получается, что неважно, XML, не XML - это тоже опять особенность Джавы. Смысл в том, что тебе надо все эти части склеить, и ты задолбаешься. Ты будешь неделю сидеть читать докуда это всё делать, чтобы в конце выдать там крут э по созданию юзеров, например. Можно так упростить это? Я бы не стал. То есть это было бы так на уровне спринга. То есть Спринг когда-то раньше раньше раньше вот делался этим. Потом Спринг начал делаться там конфигурациями и бинами. Там аннотация бин. А потом Спринг начал себе просто работать аннотациях. Обычный Спринг, не Спрингбot. Угу. И вот уже на этом моменте, когда добавляется SpringБot, аа, скажем так, у тебя добавляется очень-очень много ещё удобств уже к довольно удобным версиям последнего Спринга. М, понятно. Автоматическая компра один из них. И ещё важная вещь, что меня бесило, что меня бесит в ну, в в обычном спринге, тоже не знаю, насколько это подходит для всех-всх кейсов, но классическим способом использования спринга веб- это является там создание веб-архива. То есть ты билдишь какое-то какое-то приложение, которое запускает какой-то внешний сервер. Springbot bootстрапит внутри себя сервер и запускает как бы себя сам. То есть ты веб-сервер из Спрингбта запускаешь просто запустив Jar. И это очень удобно. Если то, ну сегодня ты так думаешь о всех приложениях, ты хочешь сказать: "Запусти это". И, ну, там, не знаю, в Кубере, ну, запусти имидж с этим. То есть тебе не надо поднимать, тебе не надо приписывать внешний веб-сервер. Пожалуйста, мне меня интересует, какой порт в нём. Да. Всё остальное идёт извне. А если бы нужно было в докере ещё прописывать то, как должен подниматься сам веб-сервер со всеми подробно. Ну, наверное, это где-то надо. Это, наверное, точно много где надо, но это оверкил для любого сервиса. Это неудобно. Ну да, но это не хочется как-то постоянно про это говорить. Такая типа особенность именно вот спринговая, потому что опять же, если мы берём те фреймворки, которые я упоминал, там, конечно, людей бы тоже было удивление, что какой-то сервер нужно отдельно. Они у тебя там, ну, ты просто стартуешь приложение. У тебя, как правило, кстати, это на френте? Так, нет, я имею в виду бэкэндовые фреймворки. У тебя, например, берёшь ты там RILS или Laravel или там, не знаю, Symphony или Phenix на этом. У тебя же веб-сервер - это, как правило, приложение, это просто пакет на этом же языке, поэтому он просто тупо ставится как зависимости, и он уже там сконфигурирован. То есть тебе просто говорят вот вот такую команду выбираешь и она у тебя стартует. Ес не отменяет того, что перед ним надо инжинк ставить, но это по другим причинам. У тебя там медленные клиенты, раздача статики и другие всякие истории. Но а сама эта история, конечно, стартует без необходимости что-либо делать. Понятно. Хорошо. Давайте мы добрались непосредственно до спрингвута, да, у нас там всё аннотациями, всё само конфигурируется, удобство, всё классно, но всё равно не всё. А потому что, э, например, одно из отличий, которым сталкиваются сразу люди, которые пишут на спринбуте, при том, что потенциально там очень много возможностей, вот мы говорили уже спринкрити и всякие другие вещи, которые часто в других местах отсутствуют, но там нет такой базовой штуки, как миграция из коробки. Ну, ликвибез берёшь и да, но но его нет из коробки, потому что опять же мы сравниваем с другими ребятами, которые просто берут любой фреймворк, и у них миграции, они даже не представляют, что это может быть отдельным продуктом. Ну тогда тоже это не совсем правда, потому что если мы вот есть Spring Date, так Угу. Угу. У тебя ты в Springdata можешь себе в JPI в JPA прописывать обы Ну твоя JAVM и она тебе может делать миграцию. У меня есть миграции. Они не всегда удобны, не всегда оптимальны на тяжёлых проектах. Но, пожалуйста. Ты хочешь сказать, что у меня сгенерирует файлик с SQLм up down? Я думаю, что при подключении к твоей базе данных он добавит тебе новые поля, если это будет совместимо. Хмм, это надо фактчек. Я этим мало пользуюсь, но очень я я я я готов ставить на то, что Spring Data JPA, по крайней мере, может из тити делать миграции. Ну, под миграции мы имеем в виду не в смысле, да, да, настройка там есть, что типа синхронизировать базу, но это немножко другое. Я имел в виду прямо реально нормальная генерация файлов, там, возможно, запуска отдельно. То есть тебе всё равно что-то снаружи надо подключать. Это вот, наверное, с ходу того, что я как человек, который пишу тоже на разных фреймворках, могу заметить в отличие Спрингбута. И, кстати, этому нет разумного объяснения в том плане, что это просто какая-то специфика. Я, да, ты не поверишь, я вчера ехал на машине, пока там детей в школу провожал, и как раз думаю, дай-ка я спрошу, а по какой я во-первых спрашивал в принципе кто стоит за Спрингбд и почему. Я узнал, что ВМР там стоит, да, за ними. А второе и я спрашивал, кстати, на чём они зарабатывают. И второе, я спрашивал про миграции. Я прямо допытывал чат GPT. В конце концов, он там тоже сдался. Он говорит: "Ну, типа, вроде да, просто вот исторически так сложилось, что они решили этого не делать и как бы всё". Хотя всё остальное там, наверное, по сути есть. А о чём мы говорим? А, смотри, вот ты работаешь сейчас в спрингбте, да? Что там есть? Для того, чтобы люди понимали, что такой же обычный фреймворк, у вас классический роутинг. Если вы смотрите на роутинг на любом сейчас фреймворке, который вы им пользуетесь, он будет, ну, просто такой же там с микроскопическим изменением, да? У вас есть классические обработчики, у них есть response request, там много аннотаций, правда, это Java, да, у вас там есть всякие разные вещи, которые упрощаются. Ну, потому что в других местах просто у тебя передались параметры какие-то. Здесь у тебя аннотация, аннотация, аннотация. Опять же, ты можешь писать на спринтбуте, если мы говорим про базовые, ну, базовый там какой-то веб-сервер, тебе нужно понять, как тебе, а, то есть ты даже можешь связывать BN без аннотаций, если у тебя есть конструктор, тебе это не нужно, тебе нужно сказать аннотации, что твой класс содержит вот для рутинга эти аннотации иметь. То есть ты делаешь аннотацию на point. И ты вначале включаешь спримговое приложение. И если у тебя там уже дальше более сложный там доступ к ПД, там будут свои аннотации. Но на самом деле, если мы вот хотим сделать какой-то не знаю, контроллер, который Jсоёт, у тебя там будет буквально две аннотации, который будет буквально там однаконтроollллер, вторая там что это get point, всё. Да. Да. Ну я просто к тому, что это некая особенность такая, то есть оно у всех выглядит примерно так же визуально, то есть даже если сравнишь просто именно отличие джава кода, что очень многие вещи делаются на аннотациях. Примерно так же, как, например, в Пайthне принято там какие-то декораторов чаще использовать, потому что в других языках их нет. Да. Если посмотреть, как работает СНБ и питоновские декораторы, мы увидим, что это практически те же яйца, только в профиль. Да. Дадада. Да. Именно поэтому я и говорю, что те языки, в которых это есть, там это прямо активно используют, а в других чуть меньше. Но единственное, кстати, вот ты постоянно бин-бин-бин говоришь. Тут опять, наверное, давай немножко пояснение людям дадим, потому что проблематика сама непонятная. То есть типа очём мы вообще говорим, почему тебе как как что это такое, почему тебе это вдруг понадобилось. Я говорил про объекты, потом я сказал про синглтоны. Не всегда синтон, но он сейчас упрости. Чтоб, чтобы заказать у фреймворка объект как по какому-то классу или по своему интерфейсу, он его должен откуда-то взять. И вот Bin - это контейнер с объектом, который Спринг тебе может выдать. Он называется бин - это не какой-то термин. Это просто немножко странный, наверное, юмор джавистов на на ранних этапах, потому что, ну, вот Java, Java, кофе, вот всё вот это вот дело бин кофейный бок. Вот. И то есть Bн - это контейнер с объектом, который спринг может использовать под капотом, чтобы его в другой бин включить. Давай по попробуем теперь это со стороны других людей. То есть, грубо говоря, сейчас речь идёт о чём? У вас помимо того, что есть просто requве, response, который у вас и так приходит в ваш обработчик, да, где вы там что-то записали, казалось бы, ну всё, я с этим работаю. Просто речь идёт о том, что, как правило, чаще всего в нормальных приложениях у вас помимо этого нужно ещё миллиард всего. Например, вам нужно доступ к логеру, вам доступ к базе, доступ к внешним каким-то штукам. Вам, в конце концов, вы там сервис для работы со страйпом написали, вам нужен этот объект. Это как раз то самое, о чём мы с самого начала говорили, да, про сприн, что есть универсальный общий механизм. И этим отличается, кстати, очень сильно с Джавовы все приложения, что вот Валера так говорит, как будто я как раз хочу это подчеркнуть, что для тебя это и для любого джависта это просто база. Ну, ты хочешь объект, у тебя есть некий единый способ. В других фреймворкав такого физически нет. У тебя, например, ты фактически у тебя каждая библиотека - это свой собственный мир. Ты такой хочешь поставить себе в джангу какую-то штуку, и она такая: "Ну вот, надо создать объект." И такой: "О'кей, где я его создам и куда я его положу?" Ну ты какие-то файлики там в инициализации фигарить начинаешь, да? Вот там, а если тебе их несколько надо, ну, что-то сидишь и придумываешь. То есть здесь такой проблемы просто не существует. У тебя все знают, что вот мы подбины. Но это опять же в том случае, когда тебе это надо. Если мы говорим, что мы сейчас вот просто пишем минимальный и аля Hello World, но у вас действительно будет там из серии реквест принял, как везде его записал, а обратно его вернул. И на этом всё. То есть у нас там три строчки. Поэтому, несмотря на то, что мы рассказываем, ба крутость мне вот лично всегда нравится, когда я на Спрингбте пишу какие-то небольшие вещи, что тебе не нужно ничего этого знать, тебе не нужно ничего специально делать, чтобы начать его использовать. Тебя никто не заставляет там, а теперь изучим. Хотя, кстати, иногда это пугает, я тебе честно скажу. Ты такой пишь какой-нибуд, да, контроollр или MVC, ты понимаешь, что там что-то на фоне адовое происходит, но я понятия не имею, что достаточно поймать ошибку в этом что-то и ты вот начинается вот это вот с спринговский ктретрейс на там 200. Да, да, да, да, да, да, да. Так что в этом плане это сложно. А скажи, насколько легко, вот у тебя есть ребята, которые приходят, не были знакомы со спрингом и такие ты им говоришь: "Вот проект на спринге". Да, вообще есть такие кейсы. Да, да, есть. Чаще всего это люди, которые выходят из универа, попадают там на джиновские позиции или там работали это в компании или на других продуктах, и они там, кто нам нравится, хайрин прямо к себе поближе и ну пересаживаем на спринг. Ну на спринг будет, на спринг опять же для меня это спринг будет, понял, да. И ну кусочек за кусочком начинаешь показывать. То есть, ну, иногда надо там с джуном, если это твой джун, ээ, посидеть пару раз, чтобы объяснить. Но на самом деле люди очень быстро схватывают. Это не есть сложный концепт. Вот. А скажи, что самое является для них два вопроса, наверное, самым сложным? Вот что прямо надо объяснять, и они сами не доходят или делают это неправильно? И что является наоборот для них эффектом вау, когда они такие: "О, так можно было?" магия вот это вот dependency inversion и dependenc injection. То есть, когда я просто скажу, смотри, ты тут пишешь компонент или сервис и где нужно, просто используешь это в конструкторе и всё тебе и больше тебе ничего не надо делать. Он сам создался, сконфигурировался, и оно есть, да? Ты потом делаешь оговорки: "Хорошо, смотри там на разных моментах лайфсайкла там тоже". Вот. Вот мы сказали даже важно бин, да? Прелесть бина какая ещё? В отличие от обычного класса, ты можешь в спринге прописывать вот спринговый. То есть чаще всего используется, что должно происходить после того, как объект создан и что должно происходить перед его уничтожением. То есть вот у тебя на обычный джавовский объект ещё добавляются как бы обязательные темплейты вот для как бы постконстракта и там предестроя. И это тоже очень важно, например, для какого-тоful shutdдау. Вот так вот, отвечаю на изначальный вопрос. Магия этого и потом, наверное, второе часто у людей, ну, там не озарение, но почему, как нет, так не может быть. Когда используется Spring Data с G с JPA, ты можешь писать JPA репозиторий, то есть, ээ, методы для доступа к базы. данных и тебе достаточно, ну, ты пишешь, как бы ты не ты не прописываешь имплементацию, ты пишешь только сигнатуры, и тебе не надо писать имплементацию, она генерируется самостоятельно. Я про Java JPA data JPA я хочу с тобой прямо отдельно чуть поговорить, прямо чуть попозже, да, но то, что там действительно у тебя вот это тоже момент магии такой, да, да, да. Потом ты понимаешь, как на самом деле это регрется, но да, я про это прямо у меня есть отдельный топик вот конкретно про репозиторий, про генерацию этих методов. Мы с тобой сейчас поговорим. Да, смотри, знаешь, что сразу хочется сказать, кстати, к вопросу обучении и пониманию опйти вот в универе то, что учат, если человек не имеет прямо продакшн опыта, то есть он в универе не занимается, вот прямо устроился куда-то и работает, то, как правило, люди теоретически могут рассуждать на тему полиморфизма, наследований, инкапсуляции, любых слов, которые мы из ОП берём. Но когда они сталкиваются первый раз с этой штукой, вдруг, ну, вдруг, э, часто для них становится открытием, что это на самом деле обозначает. То есть у них как бы есть большой разрыв э между реальностью и тому, что они учили на в теории, когда им это говорили, потому что это немножко абстрактно звучит. Вот ты это видишь или не видишь? То есть я имею в виду, когда они это видят, вот эти вот эту инверсию, что возможность прокинуть, что чёрт, а я себе это не так представлял или, блин, у меня что-то перевернулось в голове, и они такие: "А вот оно как реализуется". Вот мы тут полиморфим-то и замутили с инверсией зависимости, да, я думаю, что сильно зависит от людей, потому что иногда приходят студенты, машины, которые всё это, да, и так замечательно знают и иногда ещё много чего могут рассказать. Но в целом я, наверное, знаю, ну, у меня кейс немецких университетов, там обычно Тейли Тума, у тебя очень много практики. То есть без Я даже часто, когда людям помогал по учёбе, говорил, что смотрите, чтобы сдать этот предмет, предмет был парадигмы программирования, в конце нашего бакала региона, вам неплохо пару лет поработать где-то, иначе вы его не сдадите. У вас просто нет шансов. Ну, понятно. То есть они спрай правдой. То есть хорошо, тогда обратный вопрос как раз, который я задал. А а что наоборот является для них, фу, плохо сделано или я не понимаю, что за фигня? Вот какая часть в Спрингбуте? Бизнес-логика, которая дальше за этим следует. А говнокодеры, короче, всему про всему. Нет, это не не говнокодеры, а вот ты объясняешь какую-то вещь, которая в требованиях. Угу. Там, ну, не знаю, часть спецификации. И она может быть логична внутри этой спецификации, но у людей возникает вопрос, почему? И у меня он тоже часто возникает, например, вот маленький одноминутный пример. Мой сегодняшний пример, мой трёхчасовой митинг до сегодняшней записи, поэтому у меня такие синяки под глазами. Энергосистема, многие вещи из этого критическая инфраструктура сильно регулируются Германии и Евросоюзом в целом. Ну, блин, понятно, почему. И для этого есть определённый вайpры, где описывает там, вот сегодня мы безопасность обсуждали, очень много безопасности. Вот в эту неделю на неё выпало много безопасности. Именно как выстраивать связи между твоими там какими-то изолированными монолитами, там распределёнными, но он премами и cloud. И вот в этом вайpйпере сегодня мы увидели, что написано, что на каждый вид каких-то безопасных соединений, использования, шифрование сертификатов тебе нужен фолбек, который должен быть автоматически всегда доступен, если там сертификаты по отваливаются. Вот ты читаешь это на полном серьёзе, и сначала ты думаешь, что Угу. Вот, то есть такие вещи из реального мира, которые грязные, где ты не можешь говорить: "А у вас вы не можете залогинить, но там всё взорвётся после этого". Ну, то есть ты где-то должен всё равно делать скидку на реальный мир, в котором всё не так радужно, как в ваших инженерских абстракциях, потому что, ну, софту иначе нельзя на рын Да. А в фреймворке всё остальное убирают случайную сложность, а необходимая сложность она самая весёлая. Вот он реальный мир. Да, она самая весёлая. И сколько ты хочешь сказать занимает примерно у таких ребят? Ну, видишь, блин, тут немножко хак, что-таки, да, вкатывание. Сколько? Я так бы сказал, человек знает джаву. Человек о'кейно знает джаву. Человек понима условно каком-то уровне, да, то есть какое-то оп в голове, возможно не там и человек не знает все паттерны, человек не знает, как ДВМ работает, но вот пользоваться можно. какой-то опыт есть и там не знаю какое-то количество тысяч десят там 10.000 кода написал уже наш услов не очень много для Джавы сгенерил скорее можно так сказать это сего вот это сейчас так хотя тоже мы ещё можем прийти в конце у меня есть тезис что вот чем мне не нравится сприн и так это то что на них ужасно вайп-кодит то есть вот эпиienс ужасный ну относительно других языков вот а человек в это вкатиться может довольно быстро потому что вот если открывать сайт спрингавиде там адаптеры под спринга есть библиотека под Netflix Я под кавку под под под под вот есть популярная технология, скорее всего, у Спринга есть к ней адаптер и и любой клауд практически. Это всё учить человеку не надо. Тебе это надо учить, если это используешь на вашем проекте. Но само ядро понять, ну, блин, это вопрос неделя для меня, скорее всего. А потом и то недели для человека, которому с нуля надо поднимать очень-очень много концептов. Но этому человеку кто-то может это нормально объяснять. Это тоже важно, чтобы человек головой бетон и пол не бился. сам в одиноч, да, лучше биться с другом. Вот. А вот дальше сндета. Ну вот я мало проектов, где не используются сндейта там или Spring MVC. Они это маленькие кирпичики, которые ты надстраиваешь над своим опытом. Потом в какой-то момент такой: "Блин, на этом проекте нам нужна безопасность". Идёшь разбираться. Ну если ты хоть что-то знаешь о безопасности, идёшь там Сприн Security разбираться, потом думаешь: "Нам нужен там мониторинг". идёшь, смотришь, что есть спринге, то есть ты по ходу усложнения своих ээ не знаю тасок идёшь и смотришь, что в спринге, как спринг решает это, но это не значит, что надо брать вот такую вот книжку с описанием всех фреймворков, садиться и вот пока не прочитал, нельзя написать первых. Это не так. Наоборот, наоборот. Я хочу сказать, что да, в принципе, все, конечно, фреймворки на базовом уровне достаточно простые, но Спринг, учитывая его сложность в целом, если всё посмотреть, он очень хорошо справился с этой задачей. то, что тебе вначале реально просто ничего не надо. Но зато потом всегда так весело, когда такой: "Так, хорошо, мне тут надо разобраться немножко с авторизацией." Там даже банально, ну, типа current usю usеer, у которого есть там пароль, какой-то метод нотификации, ты такой: "Ага, user details там, тра-та-та". Открываешь, закопался в этом секьюрити. Я имею в виду, вот если ты как бы с ним постоянно не работаешь в большом количестве и но при этом ты понимаешь, что о'кей, а в каком ещё фреймворке, на каком языке у тебя есть штука, которая может решить там любую задачу. у тебя там УАФ и всё что угодно, да, из коробки. Блин, это очень сильно, ребят. То есть, если вот у вас, а, мне кажется, это же тоже связано с энтерпрайзностью, да, когда у тебя сингл сайоны, когда у тебя вот сложные всякие штуки, у тебя какая-нибудь киклоки, я на думаю, да, всё есть, просто оно вот так вот всё вместе с А потом вы кого-то купили или вас кто-то купил, и вам надо ещё ваши два две разные вселенны ещё совместить. Да, это я просто не представляю, как на чём-то другом делать. Тут, наверное, стоит, можно, да, такой подвести итог, выделить, что всё, что касается enterprise с запроса, а это в первую очередь, что у нас? Это секьюрити, да, и всё вокруг всяких компласов, требований и так далее, спринг, мне кажется, номер один э из коробки. Ну ладно, давай так. Мы, я знаю, что всегда приходят шарписты и говорят: "У нас всегда это было 1.000 лет назад, и мы лучше всех". Согласен. Я C#ARP единственный язык, кроме Джава, который не учитываю в этой всей истории. А вот конкретно кроме C#ARP Java, наверное, единственный, кто вот так вот глубоко и серьёзно всё это интегрировал. Да. Хорошо, давай про ОМ. Я сейчас, знаеш что, понял? Я ещё хотел тебя спросить, на самом деле, про котлин. Ну давай сейчас мы эту вставочку сделаем. Актуален для вас котлин в рамках Спрингбута? Для вас в рамках моей работы скорее нет. Он у нас нигде не используется в продакшене. Я пользовался котлином на других проектах, но котлин для меня всё равно что-то из мира мобилок больше. Его в Германии, собственно, очень мало. Ну, не хочу без какого-то списка цифр говорить, это сложно сравнивать, но, ну, я бы зашёл на какую-то биржу, посмотрел бы количество открытых вакансий по этому языку, и я удивился бы, если бы разница была меньше, чем в 10 раз. То есть, ну, скорее речь про то, что даёт ли он какие-то, а, возможности, которые реально помогают, потому что, ну, Java, во-первых, сильно развивается очень быстро. В каком году? Мы с перспективе какого года спрашивали. Дада. Да. Ну, был какой-то момент, тенденция, то есть я могу так сказать, лет 10 назад, когда, может чуть меньше, когда была активная прямо вот эта история, что о Котлин сильно приезжает Джаву, там очень много концептов, берём и потом вдруг Java начала полгода, блин, версия, полгода версия, полгода версия, и они в себя так много вообрали и столько сделали, что, в принципе, не считая, наверное, асинхронности, да, ну, во многом ты не не сильно-то выиграешь, кстати, да, спринт будет замечательная синхронность. Ну это всё, тебе даже думать об этом не надо, да? Да. Ты просто делаешь аннотацию асинхронно и всё. И оно плюс в плюс в Джаве неплохая асинхронность сама по себе. Она может быть слишком экспрессивная с этими фьючерами, но в Джаве не худшая синхронность. Хотя, о'кей, ладно, она самая вербозная. Ну, тут ещё такой момент, да, то есть как бы, наверное, поскольку у нас нет большого опыта там написания на котлине на спрингбуте, разницу мы большую не скажем, но предположим, что скорее всего это не сильно что-то даёт. Я Секунду, секунду. Вот тут надо факт фактом. Ты можешь писать на Скрингбде и на котлине. А я именно про это говорю. Да, был тонденция перехода именно потомуло в самом языке, а в том, что позволил бы, например, ну, типа гораздо там компактней, но просто мой личный опыт, я подозреваю твой, и вообще тебе котлин мало что даст именно в самом спринбуте, чтобы у тебя прямо было прямо меньше кода и круче. То есть всё, что я видел, всё, что я сам пробовал, ну, блин, там код почти не меняется. У тебя обёртка очень маленькая. Она фича. Ну, как я это понимаю, да, я там как в тот момент ходил, наверное, класс во второй, но как-то изучаю историю IT. Вот Котлин появился вот вошёл как-то набрал популярность на этапе седьмой Джавы, то есть когда в Джаве не было нормальной функциональщики, да, и это была боль и потом они вот могли развиваться всё нагонять это восьмой Джаве появилась функциональчина. А если мы сейчас смотрим, ну, там в продакшене двадцать первое, где-то там уже там двадцать пятое Джава, ну, хорошо, двадцать первое Джава используется. Очень-очень многие фичи популярных языков уже есть в самой Джаве. Одной вещи я бы ещё по Яквально вот одной бы ещё вещи пожелал для Джавы и по объективным причинам её там никогда не будет. Это Safety. Всё. Да, это правда. А, но это уже такой очень фундаментальный дизайн, который так вот невозможно. Да, это не это, это не то, что что-то. Ох, блин, надо поменять. То есть это, если бы хотели, поменяли бы за, не знаю, за неделю бы написали, добавили, но это сломали просто весь мир. И в целом в Джаве это, ну, не совсем возможно. Предотвлещая просто возможно хейт, просто хочется сказать, что скорее речь про позиционирование сменилась. То есть котлин сначала был как более зрело, в смысле, как более продвинутое молодёжное Java. И это на самом деле почти ушло. И поэтому сейчас скорее, по крайне мере, то, что я слышу про Котlн и, кстати, буду подкаст на эту тему делать, это всё-таки то, что у них там мультиплатформа есть.
СНБ котлин тут ну вряд ли ну ладно сейфти может быть для кого-то настолько вот прямо кайф что они скажут нет ребят только ради этого мы котлин воткнём вполне может быть разумным доводом а хорошо но при этом знаешь что ещё хотел сказать вот э когда это кстати касается и тоже и вообще многих других любят часто всё-таки вот смотрите многопоточность там собеседование без многопоточности поджави, скорее всего, вообще не встречается, да, там всегда любят гонять. Ну, вообще есть такая тенденция, что люди, когда готовятся к Джаве, там, блин, многопоточка, все дела. Но на практике вот ты, когда пишешь, неважно, берёшь ты Го, берёшь ты Спринг, берёшь то, у тебя все эти рутины, все эти возможности, которые есть, они в дефолте не используются. То есть для того, чтобы тебе прямо вот реально в это нырять, ну, типа ты такой пошёл там прямо по тредами управлять, ну, это надо, чтобы были какие-то особые задачи. То есть у тебя сам Ну такого не а зачем? То есть такого и не будет. А я об этом и говорю. Да-да-да. Просто те, кто с этим не работал, может сложится впечатление, что ты вот открыл и тут же ты сразу с этим столкнулся. Ну потому что обычно про это часто говорят. Но по факту нет. По факту у тебя просто обычный код, обработчики, и ты просто херачишь. Пришёл реквест, что что-то сделал, респонс, может что-то в бэкграунде сделал, как бы и то это всё встроено, да, на уровне самого фреймворка, да. А если ты хочешь уже отдельно в каком-то потоке запустить ещё 10, ты у тебя есть для этого удобные в Джаве достаточно удобные экзекьюторы, в которых ты размещаешь лямды, делишь, да? Или ты или ты это делаешь на уровне правильных стримов писать вот прямо newтре там тред финиш, да? Это кто? Это только в университете, да? В университете это, ну, то есть в университете говорят это есть, это было, так было давно, мы учим экзекьютеры. То есть, ну, там и и но, то есть, даже в универ, ну, ну, может, где-то было когда-то давно, но это не Я бы не сказал, что для меня это часть языка. Это как вызовы к Дживен для меня практически. Да-да. Да, это слишком низкоуровнево. Сделать надёжный код на таких примитивых. Это, ну, если ты либу какую-то, наверное, пишешь, но но не на Так зачем я не буду, ну, то есть в в чём можно подумать, как бы мне обозначить правильно мои перемены, чтобы у меня там, не знаю, треды, ходя в кэш, знали, что им надо пройти в рам, а не в свой кэш. То есть такие вещи остаются в многопоточности. Но почему не посыпать немножко этого синтактического сахара по поводу поверх этих изначальных джаволовских? Будет ли там какой-то выигрыш? Я сомневаюсь. Ну там в 01 миллисекунду. Ну да, да. Это не совсем про Джаву, про Го. Просто это было на днях. Там чувак написал тред, типа, зачем вам библиотека по кэширова? У него вот как сделать лёгкое кэширование в го. И что-то так разлетелось, там его обосрали со всех сторон. Типа у тебя тут, значит, йдиition, там то всё пятое десятое. Но я так понял, что он троллит людей. Но в целом, как бы, сама идея, он классно показал, что на всех таких ребят, которые на низком уровне говорят: "Да я сейчас тут нахерачу, у тебя количество багов в этой системе будет такое, что мама, не горю, никогда в жизни их не вычистишь сам". Поэтому, да, лучше использовать, конечно, готовые решение в этом плане. М спринг очень хорош, да. Ну, кстати, при этом GPA, по-моему, вот этот с Spring Data он синхронный, правильно? Ти не понял, почему? Что что? В каком в каком моменте он? Ты делаешь себе из там 100 коннекшенов и можешь то есть не много коннектов понятно, когда у тебя пул есть, но в целом у тебя запросы в базу синхронные, адаптер синхронный, правильно? Я нет, не тоже точно тоже не понимаю. Синхронизируются ли разные запросы к твоей БД? Ты имеешь в виду это? Нет, я имею в виду, что у тебя тред, если у тебя воркер работает сейчас, обрабатывает запрос, ты пошёл с запросом в базу, воркер встал. Ну, конкретно это да, но опять же ты можешь воркера синхронно запустить этот запрос и получи получать его через фьючер, ну, типа или то есть, ну, я бы не сказал, что это проблема. Ну да, за про, да? То есть, если у тебя вот полотно кода и ты делаешь вызов к репозиторию, да, он будет блокирующий, если это если ты этошь, да, но да, ну я почему опять же на сравнение, потому что есть люди, которые пишут, например, на ноде, где у тебя вообще не бывает, понимаешь, да, у тебя в принципе всё асинхронно, поэтому там другой подход к работе и там другое восприятие у людей этой реальности. То же самое в GO, кстати, и то же самое, ну, в Fest API, при условии, если ты всё правильно делаешь, потому что, конечно, ты тоже там можешь вызвать какую-нибудь SQL алхимию, и у тебя тоже всё колом станет. Я так подозреваю, что там этого делать нельзя и надо использовать либо их обёртку, которая у них там есть. Она же тоже поверх алхимия, да, ведь? Да. А вот это SK modelл. Ну и, по-моему, ты можешь использовать встпи разным. То есть я ялки не использую. Да. Да. Ну, то скорее речь просто про то, что надо это понимать о том, что если ты адаптер используешь синхронный и у тебя вся скорость производительности STI потеряется, если ты используешь неправильную как бы обёртку. Вот. А в но такой проблемы нет, потому что у тебя, в принципе, нет синхронных драйверов и всего такого, поэтому там с этим проще. Я, видишь, поэтому периодически про это говорю. Всегда помни о том, что надо немножко вот сравнивать с теми людьми, которые воспринимают мир, да, другим способом немножко этот мир воспринимают. Хорошо. А давай всё-таки про базу тогда поговорим. Мы в в её сторону начали двигаться. И здесь, знаешь, даже я бы с чего начал. Вот представь, какое количество, особенно вот в гош вот этот тренд, ребята, у нас это, кстати, и в Entity фреймворк было, и про это говорили, и в Джаве про это говорили. А гошники так вообще поголовно. Во-первых, полное отрицание РМА. Сам, наверное, знаешь про это. Но они же все просто УРМ - это для этих вообще непонятно, что эти люди в профессии делают. А второе - это вот эта история с производительностью о том, что, ну, как же так? Смотрите, если у васм, значит объекты, значит у вас там, а, касты, ну, вообще много всякого разного добра. И в итоге это непроизводительно. В нормальных проектах их не используют. И понимаешь, что получается? Ты говоришь: "У нас тут терабайты, у нас тут, значит, ну, так серьёзно и при этом УРМ". Нет, я такого не говорил. И более того, там где там где там где терабайт и там нету. О'кей. Вот можешь вот как Да-да. Да, я имел в виду, что УРМ-то всё равно у вас есть. То есть у вас нет такого, что его целиком выкинули. Поэтому расскажи, пожалуйста, вот про тот подход, как вы понимаете, где вы юзаете или не юзаете, что ты имеешь в ту использовать УРМ или нет? Потому что наличие модели и сырые запросы в базу - это не одно и то же, да? А поэтому вполне возможно частично использовать. Иногда они идут бок-обок. Плюс с чего бы правильно начать? Уm - это удобно, да? То есть ты сразу мапишь там какие сущности из базы данных, по-разному собираешь у себя в свои энтити. Это удобно, но это не всегда ложится на, ну, на твойкейс. То есть, если тебе прилетают какие-то микробчи снаружи, твою программу, тебе их надо сохранить, например. Угу. Если ты начнёшь создавать jaва объекты на там тебе прилетело небольшое сообщение, там, не знаю, 10.000 объектов. Угу. Ну там тоже небольшой, ну, какой там месседж прилетел. Там 10.000 объекта. Если ты их засунешь там, сделаешь через JDBC template, как-то это всё красиво обернёшь и сделаешь нормально, у тебя оно за одно время сработает. Если ты будешь, чтобы эта орка сохранить, тебе это надо сначала в объекты конвертировать. Уже тут у тебя может взорваться память. То есть это сразу же То есть вместо того, чтобы там какую-то колонку одну обновить условно, тебе надо сначала создавать объекты, потом этот блок грузить. Это может быть часто особо оптимальной и непозволительной роскошью, когда тебе надо, например, считать что-то при инициализации. Наоборот, это может быть, если у тебя хватает памяти и времени, если это не очень большое количество дан, например, с пользователе очень очень удобно работать ээ через орm. Ты читаешь тебе вот когда мне нужно заниматься чтением, я больше склонен использовать ормки, если у Ну вот как-то как-то это быстрее. И уже я от Урма отделываюсь момента, где, ну вот не хватает памяти или времени, или есть какая-то более сложная логика при записи, например, в которой используется там, не знаю, какие-то функции специфические, там, не знаю, для для постгреса, условно. Угу. Ну, кстати, это же вообще не отрицает использованию Рэмов. В каком смысле? Очень многие Рэмки просто банально поддерживают апдейты батчами, когда они сами не создают. Ты им ты им всё это просто даёшь в той структуре, которая у тебя есть. Они её сами мапят, сами добавляют. И это вполне себе использование RМ даже без создания объектов. Да. Я так понимаю, что JBйка тоже это может и давай, давай ещё разта. Ну, когда вставка у тебя идёт большое количество объектов, то есть тебе не надо в обход тупо идти в JDBC напрямую в драйвер и херачить. Правильно, ведь? Да. Да. Но у тебя могли прийти снаружи пачка там, не знаю, бар UID значение. Угу. Где тебе делать промежуточный ещё объект с недозаполненными полями или тебе их надо как-то сначала считать, потом записать? Ну, то есть, может быть, ты реально хочешь по этому ключу обновить такие-то значения, если тебе нужно, сбежав полностью маппинга. Но если он не нужен, зачем его зачем тебе считывать, менять, чтобы потом сохранить? Ну вот если это часто просто субоптимально, кто-то скажет: "Это более чисто". Ну, может быть, да. Да. Ну, наверное, мой понт здесь не в том, что а как к этому относимся с точки зрения какого-то чистого оп, а скорее с точки зрения возможности ОРМ. То есть типа она даёт возможность так делать, то есть тебе, грубо говоря, не надо идти против ветра писать, как это может быть. Потому что я почему про это говорю? то, что у многих восприятие именно такое, что, грубо говоря, если у меня такая задача, ОРМ не мешает, они это так воспринимают. И я часто говорю о том, что нет, на в хорошего РМ тебе не мешают это сделать. Они просто говорят: "У меня есть ты можешь через объекты, а ты можешь ещё и вот так". И это валидный способ. И тебе дают интерфейсы для этого, пожалуйста, делай. А в Spring Data это сделано довольно, то есть ты можешь много чего делать Springdata JPA, но у тебя ещё есть Springdate GDBC, где ты можешь, собственно, использовать свои же объекты из ОРМА, но не как энтити, которые ты будешь мапить, а как детёшки обычные, которые ты потом будешь ээ загружать удобным образом через Pringles JDBC. Так тоже можно. Там там очень много чего можно навертеть, но в базовом случае, если можно пользоваться, я бы пользовался мом, пока его хватает. Поэтому нет ничего стыдно. Такие у нас разговоры. Нет ничего стыдного в использованию РМ. А, смотри, по поводу выборок, да? Другой частый кейс, про который говорят - это выборки, что, мол, смотрите, изучать новый язык поверх сQэля, это же какой-то ад. И вот я лучше, значит, буду сам SQL писать. Кстати, я пописал на SQLC, кто в Гоби этот очень инструмент. Это где ты, знаешь, прямо запросы пишь, а он тебе генерирует поверх этого методы. Вот. И чтобы ты понимал, это, кстати, по это обратная обратная вещь от того, как Java Data делает, когда ты наоборот в в репозитории пишешь find и он тебе там генерит соответствующий запрос, да, и это очень круто. И более того, в новом спрингбте, для тех, кто в курсе, теперь это будет компилироваться ahead of time. То есть раньше это была динамика, теперь это будет компилиться и класться внутрь. Я прямо буквально эти ноуты, релисноуты читал, а, по четвёртому спрингбту, который сейчас в версии один находится. Так вот, там, короче, знаешь, какой прикол? Вот просто представь, вот ты пишешь скель и как бы поинт всегда такой эк, кто такой подход поддерживает, что смотри, у тебя полный контроль, тебе не нужно учить новый язык, ты можешь там что-то легко сделать, но знаешь, к каким проблемам это приводит? Вот даже на примитивном уровне. То есть, грубо говоря, написал я запрос, который достаёт записи, ну, например, чтобы каунт посчитать, а потом я вдруг понимаю, что мне пейджинг нужен. Угадай, что надо сделать? Мне придётся 100% полностью дублировать этот запрос для того, чтобы написать limits, set, потому что сделать внутри if, ну, это же чистый скель. То есть на самом деле, как выясняется потом, это не чистый скель. У тебя есть template language, но этот langл, естественно, ничем не парсится. То есть вот у тебя примерно как когда ты в Кубернете ям в ямле начинаешь эти джинджи вот эти вставки делать, да, и у тебя это в кашу превращается, которая не ну невозможно ни отформатировать, ни проверить ничего. Да, и ты такой: "Это же просто капут". У меня на базовый крут получилось такое количество запросов, которые я бы вообще не писал, что просто кабздец полный. А поэтому, честно говоря, я такой: "Не, это, конечно, какой-то перебор". И поэтому quyдеры - это хорошо. А вот такой вот вывод я сделал вставочку. Ну, то есть, короче, у у тебя с этим проблем никаких нет. То есть, вы на полную катушку, крибилдеры, всё, что там надо, собрали, выбрали. А сложные запросы, где пятиэтажный там джоин или вы такое не пишете? И пишем, конечно, но опять же, если у тебя пятиэтажный джоин появился, вопросики, это тоже вопросики. То есть, слушай, а если у вас есть такая сущность, знаешь, было бы вот вот бы в скэлевских базах данных была какая-то возможность вот сохранить под каким-то именем вот какой-то запрос, так, чтобы он под капотом вот все эти джоины делал. Как жалко. Вот, блин, нет, в SQL есть вюшки. Ну вот тебе, если у вас есть такая потребность, напиши ты в Base, что тебе нужен такой-то вW, и потом отдельно вот храни его где-то и ходи к нему, если это частый кейс. Ну тут можно ещё добавить, что часто такие вещи появляются там, где есть аналитические запросы, а для них, в принципе, база, мягко говоря, не очень подходит, да, которая на запись рассчитана во многом. Аналитика часто будет подключаться к базе со своим тулингом собственным, который ничего к спрингу ниче не будет практически иметь. Ну, я имею в виду, какие-то выборки внутри бывают, но в таком случае, кстати, их и в базе-то настоящее пускать нельзя. Для этого всё-таки лучше делать отдельные представления с витринами и всем остальным. И, кстати, вот мы лично, ну, это, кстати, отдельная тема, которую тоже мне хочется потом будет разбирать, не только в подкастах, связанная, знаешь, с проектированием базы, а, например, там, грамотной денормализации, когда у тебя очень часто джоийны делаются именно в том месте, где, ну, логично скорее денорманализацию сделать и вот это вот вот всю сложность убрать, потому что тут мы правда выходим за рамки обсуждения Спрингбта. Я думаю, ты тоже с этим сталкиваешься, когда люди в какой-то момент, у нас же есть кэши, и они просто вместо того, чтобы хоть немножко там порядок навести и подумать, как преобразовать твою модель, данные, всё переложить, они такие: "Так, ладно, просто упкэш втыкаем". И у тебя получается всё приложение такое покрыто слоем кшей, без которых ты просто ничего не можешь сделать. Хотя это часто следствие, а не причина. У тебя есть есть такие кейсы? Бывали, но это сразу ну как-то, блин, дурной зал, ну не очень, короче, отношение к такому, да? Да, да, но это нужно, чтобы люди были, которые за этим следят, потому что, ну, я имею в виду квалификации высокой, да, которые замечают и бьют по рукам, если надо, которые скажут, что это не ок. Угу. А, ой, гениальное изобретение. Ещё раз, если у вас такое, ну, один раз, чтобы за сегодня закончить, а не ещё неделю сидеть над кодом, ну ладно. А когда целое приложение начинает из-за этого вырождаться и тонуть под своей сложностью, ну, наверное, вот момент. весенние год, да, ну это к вопросу о том, что фреймворк, при том, что он даёт очень много всяких возможностей, мозг никто не отменял, и в какой-то момент ты просто его, если он тебе не мешает, ты его не замечаешь, у тебя там так много бизнес-логики, так много вот этих вот всего, что фреймворк - это просто становится такая типа декорация, кото без него можно просто стреляться. И важно в мире, где из каждого утюга тебе кричат про искусственный интеллект, очень, ну, местами не достаёт естественного интеллекта.
Да. О'кей. Слушай, а раз ты про это сказал по поводу квалификации инженеров, ты считаешь, что для того, чтобы писать на спрингбте хорошо и правильно, прямо нужно очень много глубоко знать, нужна квалификация или не совсем понимаю вопрос. Нужно иметь квалификацию в фреймворке. Да, я сейчас попробую объяснить. Знаешь, какая есть ещё история, что у тебя, грубо говоря, она немножко такая своеобразная квалификация. Сейчас объясню, что я имею в виду. У тебя есть большое количество фреймворков, в которых ни хрена нет, и ты пишешь всё сам. И там очень нужна высокая квалификация для того, чтобы делать нормально, потому что очень легко писать самому. Но когда ты каждую часть написал сам, у тебя через какое-то время ты представляешь, какое-то месиво превращается с точки зрения поддержки и всего остального. Спринбуд, с одной стороны, в этом плане даёт гораздо больше чётких инструкций того, как надо делать и правил, подходов, и можно сказать: "Это хорошо, это плохо, это вот иди так, идик". А с другой стороны, одновременно с этим, он даёт так много всего внутри, что знаешь, как C++, да, даже там Строуструп не знает, как он устроен. Ну вот вот эти вот шутки, что у тебя люди, которые пишут на Спрингбуте, пишут ли они на Спрингбуте? Э используют ли они фреймворк или занимаются чем-то, какой-то самодеятельностью или, да, или самодеятельностью в том числе, потому что я уверен, я уверен, они пишут всё сами, потому что им потом, я это во всех фреймворках наблюдаю, ты приходишь человеку, говоришь: "Ну, у тебя же вот". А я не знал, что у меня такая штука есть. Вот в Спрингбте это прекрасный пример, я могу сказать, это, например, та же самая стоит машина. Там есть такой пакет, который в определённых случаях очень решает серьёзные проблемы. И ты смотришь, что люди вместо этого там такой ад генерят, и ты им говоришь: "Ну вот же стоит машина". Они такие: "А, а мы задачу не квалофици". Ну ты когда с ним поговоришь, становится понятно, что они в таких терминах задачу не видят. И только после того, как они увидели, они смогли найти соответствующий пакет. Да, но это больше вопросу того, как ты дизайнишь сам код. Знание того, как работают многие стрингпутовые вещи, даже не как они работают, а что есть в спринге, тебе как бы даёт ментальную модель таких кубиков, блоков конструкторов. А что я могу использовать? А несколько раз использовав, ты уже думаешь: "А это лучше в этом случае, это лучше в этом случае". Можно ли навертеть велосипедов? Можно. И мы, наверное, их тоже крутим постоянно. А тебе, кстати, не кажется, что Саякий сейчас проще стало? Я вот реально в какой-то момент осознал, что, да, в чужих фреймворках, где ты прямо не аз, это супер помогает, когда ты говоришь: "Вот такая типовая задача, каким внутренним решается". Да. Даже сложно сказать: "А в каком ты ас?" То есть ты же не затачиваешь под какой-то всё равно эволюционируешь, что-то новое появилось. Даже полезно. Вот в чём я люблю аишки. В них полезно, им полезно дать как бы решение на оценку и спросить, не фигню ли мы делаем, нормальная ли у меня гипотеза или может ли она, ну, если мы говорим про морского уровня языки или я что-то упускаю очень важное. Понятно, что Аишка может накосячить по итогу, но всё-таки, ну, это какое-то всё равно секонтапение относительно того, что есть в команде. Это правда. Да. Да. Смотри, я ещё хотел у тебя спросить про а шаблонный код. Ну, частично я, конечно, знаю, что всё-таки шаблоного кода, честно говоря, в спринге не так много. То есть, опять же, это ни в какие сравнения с гоней идёт, где там почти нет инструментов, приходится самим писать очень многое. А, ну просто их система давно существует, много возможностей у языка. Но, то есть, грубо говоря, а если ты пишешь сам, это всё равно много. У тебя дтошки, маперы, шмаперы, там то всё надо создавать, херачить, вход-выход, гарантии, тесты, да. А при этом сейчас в мире много достаточно генераторов, которые берут, например, спецификацию Open API. Сейчас сложно, да, Open Open API, похожие слова. Openfication, да, да, да. Open API спецификацию. И по ней не то, что тебе просто там давайте вот ДТО тебе сгенерим, а они тебе просто говорят: "Вот тебе обработчики, вот тебе реквест прямо готовый, вот тебе респонс, вот тебе маппинг". И там фактически тебе вот только вот чуть-чуть осталось написать вот насколько это распространено, вы это используете. Это прямо вот у оно есть в спринтгее. Это несколько раз использовал. Я не могу сказать, что я этим часто пользуюсь. То есть это хорошо, когда вот вы уже сделали полностью спецификацию. Опять же, в спецификации энпоинтов там может быть мало. То есть как раз в контроллере написать, невеликое дело, но что потом? Ну, то есть буквально, да, сегодня писал, записывал, то есть тебя на какой-то на один point, может быть, там дерево вызовов ещё в 50 уровней, дальше внизват. Просто пока ты приземляешься в итоге к другого, к вызову другого сервиса или БД, то спецификация в этом, что она должна была делать. Шаблонный код, только дтшка, гарантии какие-то, да, и я ленивый человек, и я часто кидаю это там в клод куда-то всё. Сделай мне, пожалуйста, или там в капилота, пожалуйста, напиши мне. Это мне стыдно в такие моменты, но Ну да, сейчас с этим попрощем. Такое время живём. Да, да, да. Ну, кстати, спецификацию тоже напрямую писать не надо. Это всё-таки её это же Да, да, то есть надо генерировать, да, для этого есть немало инструментов. Но, кстати, когда я изучал этот вопрос, потому что я сейчас активно как раз работаю над всякими растопишными штуками именно с точки зрения вот того, где, в каких системах, как сделано. В Джаве, кстати, очень крутой генератор, то есть именно который тебе прямо реально даёт вот всё, что надо: входвыход, конверси маппинге. Я такой: "Блин, прямо приятно". То есть в других языках в основном, не во всех, но в во фреймворках такого уровня автоматизации нет. То есть, когда у тебя фактически тебе ещё и тесты писать не надо, у тебя там банально гарантия аутпута даётся, да, что ты на выход. Потому что даже если ты посмотришь докурекам, там просто типа аля конверт тут же и что там на выходе? Соответствует ли оно хоть чему-то? Ноль вообще понятия. То есть либо мы в это верим, либо пишите тесты и там Jon какую-нибудь схему используйте, да, что, конечно, ад. Я ещё хотел сказать по поводу, давай немножко по поводу тестирования, потому что это не во всех фреймворках встроено. Давай. В богатых больших фреймворках это встроено во всех. В микрофреймворках это нигде почти не встроено. Ну мало кто предоставляет какие-то ресурсы. Здесь у нас супермощная система с большим количеством возможных вариантов. И полный тест с поднятием всего HTTP стека и без HTTP стека быстренько и накат-откат транзакций, всякие стратегии. Единственное только для негенерации объектов там, как он правильно читается, Истанкио, да, или я неправильно его читаю? Ну там, ну если либо аляфабрика для генерации объектов, чтобы ручками не создавать сра с фейк фейк данными. Может, кстати, не знаю, ты имеешь в виду, чтобы объекты там мокать или фазить инициализировать? Ненене. Ну тебе нужно инициализировать объекты для того, чтобы ручками не герить данные. То есть прямо по модельке, то есть не в смысле просто Оно само понимает, какие у тебя поля, оно понимает, какие можно использовать генераторы. Там можно это всё по подтюнить, но смысл в том, что полида подключается, если ты говоришь, что поле там в таком-то самом оно называется истанцио. Я почему про неё хорошо знаю, потому что ято как раз привык к таким библиотекам в других языках. И когда я в Jaжа Java пришёл, я первым делом понял, что, во-первых, этого нет в ни спринге, ни в Буте. Я такой: "О'кей, а есть ли решение?" Я его нашёл. И выяснилось, что он довольно молодой был на тот момент, ему там года три-четыре, может быть, но оно сейчас очень популярно, про него уже говорил. Ну ладно, короче, расскажи в целом. Со стороны скажу так, мне очень нравится, то есть то, как в Спринбуте сделано прямо. Я я очень люблю тесты, то есть я вот о тестах я могу автоматизация тестирования на уровне компонентов, моё самое любимое интеграционное. Дальше тоже интересно. Вот, то есть тест писать очень люблю. В этом большая боле оригинальная джа у меня есть ээ байка на тему тестов, как выглядит. Пытаюсь, чтобы никого не обидеть. Секунду. Мне попадались проекты, которые, ну, нам передавали, где я первым делом смотрел на тесты, говорю 100% покрытие, всё нрить. Я просто удалял это и комитил Git удаление, потому что это самые худшие омерзительные. Это это даже вот бывают классные тесты, бывают о'кейные тесты, бывают тестов вредительства. И на Джаве, особенно на Джаве без спринга, очень очень распространены тесты вредительства. Я дам пример. Инициализируется гора вот всего всего делаю. Всё на моках. Причём я это называю даже не тестировкой, а бетонированием кода, где вместо того, чтобы тестировать интерфейсы, бизнес-логику, взаимодействие там внутри компонента, между компонентом всяким таким, люди садились. Это было ещё до аишек. То есть я Давай я отвечу. Я Я знаю, что ты хочешь сказать. Давай попробуем в ГЭС поиграем. Скажу, что у тебя Я просто был в проектах, в которых просто я помню 30 40.000 строк тестов удалили по этой причине, когда я пришёл, потому что я тоже помогал им это устроить. Там проверяется по сути то, в сколько раз какие функции с какими аргументами вызываются, какие делаются возвраты. При этом ничего на самом деле не происходит. И что и главное и что больше ничего не вызывается. Потом ещё в конце всегда строчка типа больше ничего не вызывало, думаешь, [ __ ] Да. Да. А ещё знаешь, как часто говорят, что те, кто пишут такие тесты, они почему-то считают, что это юнит-тест. Они пишут, что это так надо, потому что мы пишем юнит-тесты. Вот. Да, это классный фа. Вот это для меня залить код бетоном. Просто мы делаем, мы ничего не протестировали. У нас 100, может быть, у вас стопроцентное покрытие. Действительно, очень легко так делать покрытие, но в итоге а чего вы? Ну строчик кода хорошо, а ну как йс toend там какой-то этот паoverage, что зачем на стопроцентное покрытие строч? О, чудо. В итоге не протестировано абсолютно ничего и код менять невозможно, потому что я один лог где-то добавляю, добавляю лок, дебаг бац, пряк на убилист, потому что работает никаких больше вызовов. Дадада да. То есть проверка именно идёт такая, что, кстати, хорошее слово бетонирование, я вот не использовал никогда, но я всегда пытался людям объяснить, если вы так тесты пишите, вы делаете невоз рефакторинг просто невозможным. У вас тесты должны помогать рефакторингу, а эти тесты уничтожают рефакторинг. Да, больше. Вот и я за что люблю сприн. Вот и это была мотивация, да, это была мотивация к спринговым тестам за счёт того, что ты не инжектишь объекты, а инжектишь их интерфейсы. Ты можешь не мокать объекты, а если то есть ты часто мокаешь, если ты вообще хочешь, чтобы объект не использовался, ты можешь писать в тестах какую-то альтернативную, упрощённую реализацию этого объекта. Или ты можешь брать обычный и как-то модифицировать его через разные механизмы его поведения. И так намного удобнее ты тестируешь реальный объект, который, то есть, свой реальный бин изолированный, который уже в каком-то симулированном окружении существует, а не рассуждаешь в тестах о том, как твой объект должен себя вести и кого вызывать, а ты хочешь результат. И это очень удобно. Ты можешь, э, например, просто прописывать и вот если моё приложение работает, то должны эти бины использовать, эти объекты использовать, скажем так. А если это тесты, то вот в этих случаях должны и ты делаешь аннотацией. Тебе не надо эти деревья выстраивать в тестовом кодерае думаешь о том, о'кей, а как мой компонент будет тестировать? Это замечательно, это отличный подход к дизайну самой программы. Ну да, у тебя и подмена, соответственно, легко. И я, знаешь, как про это тоже часто говорю. Тут все мы, когда часто говорим оки, тоже хочется сказать: "Вот ты говоришь спринг", а часто имеешь в виду спринг будет. Мы когда говорим оки, часто имеем в виду, на самом деле стаба, а не моки. Мы сейчас там не будем погружаться, то, что это уже такие немножко детали, но в целом у тебя действительно может быть легко такая ситуация, когда, например, по всему проекту есть какие-то вещи, которые, ну, банально тебе не твоя бизнес-логика, это просто, не знаю, отправка в систему аналитики или ещё что-то, что, например, есть вообще в каждом тесте, допустим, то, что в каждой штуке происходит, и она тебе просто мешает. Тебе хочется её вот как бы в конфигурации в начале старта тестов сказать: "Делаем вид, что этой херни не существует". И смотрим всё остальное. И вот, да, ты можешь глобально как бы в контейнере подменить, сказать: "Вот давай фейковую имплементацию", которая вместо, не знаю, отправки по HTTP просто ничего не делает, и ты спокойно как бы тестируешь своё приложение, да, не отвлекаясь на эту херню, потому что иначе тебе её без для этого в спринге тебе даже ничего прописывать не надо. Ты, когда делаешь тест, ты просто говоришь: "Вот эти бины, мокбин, вызовы должны работать, не падать". Но он ничего не делал, они в молоко уходят. То есть ты это можешь сделать на уровне, а он сам интерфейс просто подменяет, да, чтобы ничего, да, там восемь-девять буквный лень считает, да? То есть ты просто делаешь аннотацию. Я правильно понимаю, что он в рантайме он генерирует имплементацию под этот интерфейс, соответственно, он делает просто методы пустышки и которые просто ничего не делают, да? Вот это вот прекрасно, ребят. Вот это прекрасно. Такую фигню хрен вы где получите. Вот чточ что. Вот в этом отношении такая система с инверсиями, она мня, кстати, знаешь, в какой-то момент, я тут же делаю разбор чистого кода Мартина, и я там в каком-то моменте сказал о том, что в реальности а полиморфизм подтипов сабтай, когда тебе вот такая подмена нужна, нужен нечасто. И мне там кто-то в комментариях, знаешь, там написал в духе, как только Кирилл сказал эту фразу, я сразу перестал смотреть. Ну, типа, мол, он ничего не понимает. И там поинт мой, знаешь, в чём был? Я просто хочу здесь про это сказать в двух словах, что вот мы это обсуждаем и выглядит так, что как раз полиморфизм нужен вообще почти всегда, потому что тебены, подмены и так далее. У меня скорее был поинтмножко вообще про другое. Я имел в виду именно с точки зрения реальной бизнес-логики, потому что тестирование - это всё-таки такое дополнительная техника для удобства там, но не работы самой программы. Если ты говоришь про работу самой программы, то прямо сейчас вот в месте, где у тебя есть кусок кода, котором нужна подмена, бывает редко. Ну, я имею в виду, именно там, где у тебя реально могут разные типы приходить, просто потому что у тебя вот так устроено. А в большинстве случаев, ну да, ты выбрал какой-то адаптер, да, ты через полиморфизм это реализовано, но это могло быть реализовано и без полиморфизма. То есть скорее речь об этом. Вот. Да, знаешь, мне приказывается в каждом следующем видео иногда приходится такие вещи вставлять, чтобы этот как пояснение для того, чтобы было понятно, что имеется в виду, да? А смотри, ещё, кстати, тогда такой вопрос. Я буквально перед этим видео специально видишь, как много всяких разных подготовительных моментов написал пост по поводу того, что во многих фреймворках работа с восстановлением в состояниях тестов выглядит как начало транзакции, откат транзакции. Угу. И в спринге это тоже встроено из коробки. А я, кстати, даже не удивлюсь, что многие люди вообще это не в курсе. У меня такое было, когда человек пишет тесты, а потом ты ему говоришь: "А ты вообще в курсе, почему у тебя следующий тест? Не видит данных предыдущего теста". Они такие: "А я вообще не задумывался об этом. Оно как-то само работает". Вот. И знаешь, меня что поразило? Огром во-первых, все, очень много людей же пишут не на готовых фреймворках, да? А вот именно таких либо микро, либо сами что-то мутят. Опять гошников там много в этой лагере. Так ты знаешь, как они все делают? То есть, во-первых, так никто сам почти никогда не настраивает. Почти всегда создают новую базу под каждый тест. Вот для меня это было удивлением. Да. И и я так тоже иногда делаю. э не новую базу создаёшь, но если ты тестируешь что-то большое, а в тоже в Джаве, что удобно, ты можешь брать containers и поднимать маленький doкерконтейнер с нужным имиджем. Он будет инициализирован. То есть, я скажу так, иногда я в Gюните страдаю тем, что можно было бы назвать интеграционными тестами, когда я весь сценарий хочу протестировать. И под это дело, то есть где у тебя, ну, много-много много последовательности, тебе нужен финальный результат, например, там, не знаю, синхронизации какой-то большой обработки. И тогда я могу сделать определённые тесты, я их там назову там обычно toend тесты, где я реально подниму MQ, подниму бдшку и пущу из БДшки, ну, ивенты, чтобы пронаблюдать. То есть такое часто приходится делать, когда произошёл какой-то баг, и вы пытаетесь подеть, что случилось, во-первых. Угу. и вовторит, сделать так, чтобы, ну, иметь тесты на случай этого бага, чтобы быть уверенными, что эта штука больше не сломается. То есть это редкий случай, но вот какие-то 5-10% таких тестов я тоже произво но при этом вы как бы полагаетесь, да, на стандартный механизм отката отката базы. Ну да, причём даже я в Джавиш ты часто в Джаве имею в виду в спринге можно же отдельно протестировать, работает, работают ли твои JPA репозитории, как ты ожидаешь. А потом ты можешь мокать саму базу и реально смотреть с пайбинами. Меня интересует в итоге там пришёл какой-то объект, вызвал ли он в итоге с правильными параметрами через 20 шагов этой GPторы? Да, мне даже не надо, чтобы базу сохранял. Я верю, что он работает. У меня для него есть тесты отдельные. То есть этот слой работы с базой можно замок да протестировать. И дальше ты уже, ну, делаешь тест между ними, не трогая саму базу. Ну, я здесь как бы среди тех, кто просто в базе стоит, посмотрит через эти же объекты, но я этот слой не тестирую никогда. Более того, кстати, есть сейчас это уже от спринга отличается, есть РМКИ, например, дризл в но по полной на полную катушку используют не только Typeesриpt, но они ещё там определённым образом синхронизируются с базой, что у тебя, ну, как бы тебе не нужно тестировать, потому что у тебя гарантия Type safety там просто стопроцентная. Вот. Ээ, и это немножко и фичи его тип системы типов, и того, как всё это описывается. Вот это тоже приятная вещь, когда прикинь, ты просто пишешь тебе, он говорит: "Джонь невозможен, потому как у тебя там всё создано". Оче очень удобно. Ну, в Джаве тоже так. Ну, те, грубо говоря, если ты а скельки пишешь напрямую, у тебя есть, короче, места, при которых у тебя нужно всё-таки те методы, которые ты в репозиториях херачишь, да, тебе нужно их покрывать. Скорее, это связано с возможностями самого билдера. То есть у тебя, помнишь, там, кстати, интересно, я вот сейчас вот не помню, там есть вот этот за м язык запросов, который был в Хибернейте, в Spring Data. А он же не используется, да? Можно использовать Spring Data его можно использовать. Я я его использовал, но я обычно использую просто SQL, потому что Да, ну вот, да, я я именно про это. Дада, да, потому что там акцент идёт большой, да. Но SQL вот он как раз требует, да, потому что ты там название поля, название, не знаю, колонки неправильно назвал, он тебе никак его не посмотрит. Вот поэтому в таких случаях, ну, обычно ты это узнаешь ещё на этапе разработки, тебе твоя идея скажет красненьким. У тебя же она ещё твою программу со схемой BD будет ээ синхронизировать, она скажет: "А такой колонны нет". То есть ты хочешь сказать, что если ты пишешь чистый SQL, у тебя идея может Да, конечно, ты это со включаешь и автоete у тебя есть. Ты ты говоришь проль в строчках прямо, когда ты вот прямо Да, да, ты пишешь она вот я делаю там, не знаю, какой-то репозиторий, но я его ну я не пишу там, потому что у меня, ну, ширина монитора ограничена. У JV есть один очень широкий монитор и один очень высокий. Да, в какой-то момент приходится скиль писать. О'кей. Так, да. В како в какой-то момент, если find B и у тебя это уже 20 слов, но это но это не спортивно, да, и ты говоришь, там пишешь свой SQL, и там у тебя будет это самое. Слушай, кстати, я вот про это не знал, но тут в чём фишка, то есть это всё-таки здесь есть сложность в том, что это всё-таки очень сильно завязано на редактора, то есть это вообще не является стандартной тип системой типов Java, да, то есть это просто прямо хитрость. Поэтому, если, допустим, ты там конкатенацией занимаешься, я уверен, что есть кейсы, при которых это может сломаться. Но то, что они это делают, это круто. Но если я просто скорее, наверное, к чему говорил, что, грубо говоря, там в тех фреймворках это часть, ну, то есть это не отдельная некая фича поверх, чтобы сделать классно, а это прямо сама урмка так создана, что это проверяется вот именно статически чисто на самой РМК. Вот статически на этапе компиляции, да. Там просто, знаешь, как сделано? Там, грубо говоря, у тебя схема базы. А, естественно, если ты пойдёшь, что-то там поправишь, то, конечно, всё сломается. Там просто скорее речь о том, что у тебя схема базы описывается с языком этого фреймворка. И, как ты понимаешь, это даёт вот такую возможность, потому что ты, грубо говоря, все запросы строишь через ту схему, которую ты там описал. Поэтому, если ты там напрямую поля не меняешь, то ты получаешь гарантии стопроцентные. Вот. И поэтому тебе не нужно отдельный язык. Я могу писать Виме. Мне, по краще. Не, ну я я Вимер со стажем сейчас. Как выйти из Вима? Я случайно. Да, да, да, да, да, да. Не, ну, кстати, в в спринге я тоже в Биме пишу там в этом плане. Ты, кстати, слушай, я не знаю, почему у людей существует заблуждение. То есть, да, там нет такой фичи, как вот SQL. Понятно, что это Иtel же сделали, но когда люди начинают говорить, что а как вот там переход, рефакторинг и так далее, я говорю: "Ребята, ну о'кей, смотри, там же внутри Ненене, не дело не в этом. У тебя же внутри LSP во всех редакторах, да? И у тебя LSP в виме тот же самый, что в о-коде. То есть у тебя как бы он, грубо говоря, он плох так же, как плох VS-код по сравнению с Intelligдже. Вот что я имею в виду. То есть, грубо говоря, нету фичи в Интеellдже, которой нет, ой, в смысле, в Scде, которой нет виме, потому что она предоставляется не редактором, а LSP. Ну, ты знаешь, что там эклипс юзается, на самом деле, под капотом, поэтому рефакторинги, экстракты, ренеймы, там всё есть. А вот SQL как бы, извините, тебе в исходники не посмотрит. Ну, можно написать, да, но я думаю, что это писать долго и болезненно. Ну да, это надо, чтобы кто-то на этом бизнес строил. Вполне возможно такой коммент. Я в какой-то момент жизни на одной из своих ещё первых команд попал просто к друидам. Там были люди, ну, такие уже под пенсию. И они через тогда даже не через Эмоксы и через Z они поч человек сидит и почту открывает с Эмокса. Так это вообще операционная система, ты же знаешь эти шутки. Да, да, да, да, да, да. То есть они вот под всё их для меня это магия. Заметки, да, ты что там org mode вот этот вот там очень много всего. В эмоксе есть режим психотерапевта. Да, слушай, это просто свой собственный мир. Я бы, знаешь, как это назвал? Это это Minecraft для программистов. Вот, можно, наверно, так сказать, а, чтобы было понятно. Поэтому его вообще как редактор неправильно воспринимать, честно говоря. Да. Да, это просто для кого-то это тип давай так, форма жизни для кого-то. Это при том, что забавно, что как раз для тех, для кого эта форма жизни, это вот, ну, вроде как ты для плагинов лисп используют, там какой-то элисп и сам лисп как язык как раз очень сильно про это мы построим всё. Это ка там дума там думать надо, там думать надо. Не, ну я когда одно время я сидел на иксе, я на лиспе конфиге писал. Я обожаю лиспы, я кложу люблю, поэтому мне было очень приятно там писать. Но и, кстати, в Виме современном на Луа тоже вполне себе приятно писать, потому что Луа всё-таки язык, ну, особенно для тех, кто с джавоскриптом дружит, ну, очень такой язык приятненький. Вот так что сейчас, видишь, мир меняется. А раньше ты знаешь, что в Виме был Вим, вим э, свой собственный язык, и вот это ад. Ну, это прямо свой язык написали. Они же, это же одна из целей Энвима была. Они там переписывают на Лу всё в том числе. Ну ладно, это мы с тобой так уже немножко ушли в бок, немножко зацепили. Слушай, давай тогда последний вопрос. Всё-таки про Иишку мы много-много раз уже говорили. Что думаешь, твоя реальная работа со, ну, через призму спринга? Вот ты сидишь и пилишь в зависимости от кейса. То есть если я точно знаю, чего я хочу достичь, где я могу псевдокодом написать все тудушки расставить, вот там я более-менее могу доверить или чтоб что-то там, не знаю, вот тест написать. Проект для меня в работе больше аишка - это заполнение тудушек, потому что те вещи, которые критически для меня важны на сегодняшний день, по крайней мере, там копат или код сильно на галлюциониру и очень ча в реальной кодовой базе для меня большущая проблема. Тебе потом всё это надо прочитать, а потом это ещё коллеги на ревью увидят, да, посмотрят и ска скажут: "Ну ну, ну как, то есть в на сегодняшний день использования классических, которые тебе ещё не сжигают ээ 1.000 долларов токенами в день, а сегодня большая часть энтерпрайзов, ну, дай бог, копайлы отдают энтерпрайзки", да? То есть на уровень капилота написать докучно, да? То есть вот скажу, есть метод, пожалуйста, напиши документ, а, проверь вот такую вот гипотезу. Слушай, а вот где-то тут могут возникать й кондиition. Напиши мне, пожалуйста, эту душку. Слушай, я вот написал, вот у меня это есть это самое. Напиши мне тити буквально один в один. Отлично, замечательно. Ты ещё этот тестик. То есть вот использование АИ-агентов хорошее, когда ты точно знаешь, чего ты хочешь достичь. Для этого ты должен, ну, уже об этом подумать. или тебе надо это откуда-то скопировать, и ты точно в одном изолированном месте можешь это делать. То есть, если аичный дит распространяется больше, чем на один файл, у меня уже, ну, какое-то тревожность поднимается. Я вот когда ты говоришь: "О, отрифактори мне это или переведи это с такой-то библиотеки на это". Нет, нет, на сегодняшний день нет. Я хочу, хочу, жду. У меня было буквально месяц назад ситуацию, мне выдали, ну, это, наверное, нечестно ждать такого от аишки. Нужно было мигрировать старый XML base стринговый проект на Спрингбд. Я даже сначала не хотел к этому подступаться и палкой тыкать. Я очень сильно ругался, тако думаю, слушай, а что будет, если вот я этот элемент как конкретно один мигрируют попрошу сделать? мне дела 10 50 файлов всё самое пишет работает полчаса хорошо что не я за это плачу всё выдаёт результат назовём это результат а я вот он не работает да запустил вот запускал вот не работает не дела то что мне надо он да конечно вот точно очень глубокое наблюдение классно вы вы это самое всё начинается этот если выдаёт решение б тоже не что ещё хуже не работает такой
Нет, я я начинаю писать капсом. Вот я тебе только матом с ним разговариваю. Да, да, в какой-то в какой-то момент. Я надеюсь, я я недавно написал на работе, сейчас я вернусь к истории, но я надеюсь, что никому, ну, у нас же GDPR, всё это приватные данные. Моё вообще не слишко приватные данные. Я надеюсь, что, ну, никто не может посмотреть реально вот мои вызовы через корпоративнуюшку, как я с ней обща, потому что, ну, ко мне спецназ домой приедет и это психологически ненормальный человек. Это вымораживает, да, вот эта покорность, она ещё дополнительно вымораживает. То есть вот это вот, да, да, всё ещё и и вот и был вариант А, он не работал, она сделала вариант Б. Она такой тоже не работает. Ещё жду, попил чаю, всё. И и мне выдаёт практически полный вариант А изначально, который уже не работал уже. Капс. Я пишу: "Нет, нет". Этот вариант не сработал. И этот вариант не сработал. И только тогда Аишка призналась: "Да слушай, то, что ты хочешь сделать, на самом деле так, ну, так нельзя, так не получится. Вот список причин, почему это невозможно". Ну, это, кстати, очень круто, если ты смог дойти с ней до того, что она тебе призналась и не сделала. Мне надо на неё наорать и угрожать. Это вот и и я я и вот вот вот мне какие-то агенты это делают лучше. Опять же агенты не бесплатные, а в использовани то есть они же говорят ты написа тебе агент генерирует код. Говот. Ты говоришь: "Хорошо". Потом ты сохраняешь этот код и сразу же в той же сессии говоришь: "Слушай, вот код, идентифицируй в нём проблемы. что можно было бы сделать лучше. И он столько тебе выдаёт. Дада. Да. Я как-то твит, помнишь, на эту тему писал, когда я сказал, что он такой ещё говорит: "В твоём коде". Я говорю: "Да это твой код, что ты мне на меня это перекладываешь?" Да сложно к нему относиться не как к живому человеку. Это даже как к живому относиться, но человек такое такое делает. Это ж Ну да, ну да, да, да. Ой, это большая тема. Короче, вывод пока такой. Действительно, все находят какие-то типовые приёмы, да, которые с ним можно работать эффективно. Как только свободная задача в области подумай, прими правильное решение, найди причину, а не следствия, как он любит, поправить где-нибудь кастануть тип, вместо того, чтобы вначале понять, откуда вообще это пошло, да, ты Я вообще с этим задолбался. Я ему прямо я ему в файле пишу: "Запрещаю тебе создавать новые типы, запрещаю тебе кастовать без разрешения". И всё равно он это делает. Я спрашиваю: "Почему?" Он такой: "Ну, я хотел решить быстро". Я понимаю, что он учился на таком коде, и он везде вот эти эни пихает, с пихает. Ну, в тайпскрипте, например. Я говорю: "Не, хорош, я лучше сам в таком случае". И вот сшками часто это полезно, если ты знаешь, что ты хочешь делать, когда люди, которые не вот самое страшное - это дать кому-то задачу. получить. Ты видишь, что решение сделала Аишка. Человек не разобрался в задаче и уверен в том, что, ну, она идеально выполнена. И потом ты показываешь на кто это сделал. Да. Ну, как я люблю говорить про это. Во-первых, нам больше работы достанется и меньше переживать можно на тему того, найдём мы работу или нет. А, во-вторых, там ещё на 200 лет. Я всегда, как человек, который, да, учу программистов, буду востребован, наверное, ещё больше. С такой историей в какой-то момент индустрия обнаружилась: "Ой, мы перестали джинов нанимать". Хмм, а разрывчас возник серьёзный и будет весело. Да, да, посмотрим, посмотрим. Да, когда Давайте будем ожидать в двадцать седьмом году экономический рост, предрекаю, и посмотрим, что тогда будет. Экономический рост твой, да? Ну, мой рост заостановился, а общий, возможно, начнётся. Даю ещё 2 года земле на восстановление. Ну ладно. Я аналитиков разных слушал. В общем, где-то есть такие циферки, что в двадцать седьмом году нас отпустят всех немножко, если всё пойдёт хорошо. Ну а может быть, новый ковид, ещё что-нибудь похуже. А на такой весёлой ноте, Валер, я хочу тебе сказать спасибо за то, что ты пришёл. Вот мы с тобой технически всё это закопали. Я подозреваю, есть пару вопросов, которые не успели разобрать, в том числе с производительностью, там почему кваркус и так далее, но я думаю, что может быть это и на следующий раз. Но в целом, давай так, наверное, скажем, что со спрингом со Спрингтом всё хорошо, он ещё много лет будет на сцене, выходит новая версия, там производительность повысили, да, там как бы всё нормально, так что никуда не уходим, будем пользоваться. Всё остальное там слишком далеко по возможностям, бесконечно, чтобы дойти до такого Да, да, да. Вот. А то, что там память, ну о'кей, ладно, дадим чуть больше планочек, если если можно так сказать. В любом случае, ребят, напишите, что вы думаете. Появилось ли у кого-то желание попробовать Спрингбд в своих проектах, хотя бы его потрогать? Очень важно, пожалуйста, прошу написать те, кто посмотрели э вообще, осознали ли вы для тех, для кого далёка эта тема вообще, зачем нужен спринг и вот эта вот проблема инверсии зависимости и собирание матрёшки из объектов? Потому что даже после всех наших объяснений, я уверен, что всё-таки это сложно без, ну, если не увидел глазами, да, это понять. Поэтому, наверное, надо даже будет отдельное видео делать, где я буду ручками прямо показывать этот код, как это делается ручками, как делается не ручками. Валер, тебе спасибо, что нашёл время. Тебе спасибо, что позвал. Да. Всем спасибо. Пока. До новых встреч.
Creators and Guests
