Собеседование Яндекс Java | ТЕОРИЯ+LIVECODING РАЗБОР ЗАДАЧ

แชร์
ฝัง
  • เผยแพร่เมื่อ 23 ม.ค. 2025

ความคิดเห็น • 119

  • @sorokinpavel
    @sorokinpavel  6 วันที่ผ่านมา

    Забирай бесплатные полезные материалы для обучения и роста в Java t.me/JavaLearnBot?domain=JavaLearnBot&start=c1724626210163-115-ds
    Обучение до оффера Java разработке sorokinpavel.ru/?

  • @arenmkhoyan
    @arenmkhoyan ปีที่แล้ว +5

    Очень полезный контент, побольше бы таких заданий, паралельно с тобой делаю

  • @yarik2303
    @yarik2303 7 หลายเดือนก่อน +1

    Очень понятно и грамотно. Однозначно подписываюсь и жду новых видео

  • @neruinfo166
    @neruinfo166 11 หลายเดือนก่อน +2

    Вполне адекватные вопросы и задачки. Если подготовиться, то вообще изи

  • @Ivan-t8l1r
    @Ivan-t8l1r หลายเดือนก่อน +1

    33:00 вместо wait и notify же рекомендуют использовать механизмы синхронизации из пакета java.util.concurrent?

  • @aww8609
    @aww8609 9 หลายเดือนก่อน +2

    Спасибо за контент🔥 очень полезно .12:26 Throwable это класс, не интерфейс

  • @tomervercetti
    @tomervercetti 10 หลายเดือนก่อน +1

    Спасибо бро, очень полезно

    • @sorokinpavel
      @sorokinpavel  10 หลายเดือนก่อน

      Рад, что было полезно)

  • @СэмФишер-х4д
    @СэмФишер-х4д 11 หลายเดือนก่อน

    классное видео, спасибо!побольше бы такого контента!

  • @BassLite
    @BassLite 10 หลายเดือนก่อน +3

    Спасибо за видео, хороший канал.
    Во второй задаче ошибка в решении.
    На 34 строке, всегда будет вызываться b.remove(), что всегда будет вызывать ошибку java.lang.IllegalStateException

  • @Ivan-t8l1r
    @Ivan-t8l1r หลายเดือนก่อน

    11:00 а в чем разница между методом main и стеками потоков? main же тоже в стеке потока находится

  • @artemtelushkin186
    @artemtelushkin186 11 หลายเดือนก่อน

    Спасибо, очень познавательно

  • @java_coder
    @java_coder 4 หลายเดือนก่อน +1

    Вообще, онлайн с задачками и вопросами - это первый этап, на втором нужно решать задачи на доске и без ошибок, даже синтаксических, но и это еще не все))) так что обхожу стороной конторы, где 100500 этапов собеседования и завышенные требования. Первый этап - изи, как по мне, но дальше - сложность даже не в задачах, а в написании кода без синтаксических ошибок и в довольно хорошем темпе, с заранее продуманными именами и последовательностью, и даже если что-то стер или изменил на доске или на листочке сам, то это уже минус тебе. Также избегаю конторы с тестовыми на неделю, может на стажера это норм, но синьору тратить время на это - моветон, есть много более интересных дел)) У Тинька тоже 100500 этапов, но попроще чем в Яше. А после всего этого еще неделями можно искать себе команду, что тоже пахнет кринжатиной.

  • @iffomko
    @iffomko 4 หลายเดือนก่อน +2

    Не совсем правда про gc. Они всегда останавливают работу приложения. Просто некоторые из них именно пометку объектов делают во время работы приложения

  • @aydinkadyrov
    @aydinkadyrov หลายเดือนก่อน

    Map.entry(num, key) в строчке 31 как работает?

  • @Ivan-t8l1r
    @Ivan-t8l1r หลายเดือนก่อน

    30:00 Почему статическую переменную просто не создал?

  • @titsubishi
    @titsubishi 9 หลายเดือนก่อน +1

    Спасибо, за видос! Звук ток пришлось на максимум выкрутить - довольно тихо было) могу подсказать, как решить вопрос со звуком, если надо)

  • @Romigo4
    @Romigo4 11 หลายเดือนก่อน +4

    12:11 Throwable это класс, а не интерфейс )

    • @non_holy6286
      @non_holy6286 5 หลายเดือนก่อน

      резонно

  • @владимирсенцов-р1ю
    @владимирсенцов-р1ю 11 หลายเดือนก่อน +1

    Переменную счётчика можно не объявлять как volitile, так как у тебя синхронизация по тому же монитору. Следовательно все будет видно между потоками.

    • @RustamPlayer
      @RustamPlayer 11 หลายเดือนก่อน +3

      Синхронизация дает атомарность для изменения переменной, а volitile не дает кэшировать значение для потока.
      Другими словами - потоки могут закэшировать значения, и иметь расхождения даже при синхронизации

    • @ramarren14
      @ramarren14 หลายเดือนก่อน

      @@RustamPlayer если мы изменили значение переменной, то после выхода из монитора остальные потоки которые используют эту переменную увидят новое значение и volatile тут не нужен.

  • @ibragimmagomedov4996
    @ibragimmagomedov4996 11 หลายเดือนก่อน +3

    не стоит байтить на звук оповещения телеграмма

  • @jujubeperch
    @jujubeperch ปีที่แล้ว +12

    Советую над звуком поработать, очень тихо.

    • @ellirabethj6044
      @ellirabethj6044 11 หลายเดือนก่อน

      чего там работать. просто ни**** не слышно )

  • @iKorvik
    @iKorvik 10 หลายเดือนก่อน +3

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

    • @sorokinpavel
      @sorokinpavel  10 หลายเดือนก่อน

      Я проходил на senior позицию. Это был стандартный первый этап, который у всех одинаковый.
      А как упоминать я сам решу, спасибо)

    • @symryvvin
      @symryvvin 4 หลายเดือนก่อน +2

      @@sorokinpavel в чем стандартность? мне дали 2 задачи алгоритмические решить за час, никаких вопросов по Java

  • @summerparadise938
    @summerparadise938 8 หลายเดือนก่อน +5

    Throwable это класс, не путай

    • @sorokinpavel
      @sorokinpavel  8 หลายเดือนก่อน

      Спасибо. Сам решу, что путать, а что не путать

    • @antongromov8093
      @antongromov8093 8 หลายเดือนก่อน +3

      ​@@sorokinpavel ущемился или что? Чел правильно суть подметил, а ты сразу по-грязному дефаешься. Странновато, не находишь?

    • @sorokinpavel
      @sorokinpavel  8 หลายเดือนก่อน

      ​@@antongromov8093 Подметить суть еще не означает высказать ее в нужной форме. Я отдаю людям пользу в мир, а он указывает с претензией на то, как мне надо делать. Одно дело, если бы это было сделано без агрессии в мою сторону, но тут другой случай.
      Странным не нахожу, я сам решаю как реагировать. Не нравится контент - не смотришь.

    • @antongromov8093
      @antongromov8093 8 หลายเดือนก่อน +1

      @@sorokinpavel претензию и агрессию ты себе выдумал (агрессия, кста - это про нарочное причинение вреда, ты здесь агрессию не докажешь). Где он тут претензию предъявил? Да, действительно, изложить можно было и в более вежливой форме, базару ноль, но тут и грубой формы не было.
      Про странность - да, по факту: это было странно лично для меня, зря написал, претензии нет
      По поводу контента: для меня любой контент - это не единица или ноль: что-то мне понравилось, что-то нет. Так или иначе, польза от этого видео ненулевая

    • @sorokinpavel
      @sorokinpavel  8 หลายเดือนก่อน

      Про агрессию:
      1. Нарочное или не нарочное для меня разницы нет. Человек думает перед тем, как написать
      2. Тут явно вижу причинение вреда для себя и попытка с его стороны прогнуть меня под его требования. Прямым текстом мне заявляет "так делай, а так не делай". Так что агрессия здесь есть для меня.
      С остальным согласен

  • @danrold
    @danrold 11 หลายเดือนก่อน +2

    От Exception наследуется два наследника это RuntimeException и checked exception 13:05
    Кек

  • @marioalvarez7462
    @marioalvarez7462 6 หลายเดือนก่อน +1

    В последней задаче про робота: можно ведь прокинуть в конструктор общий ReentrantLock, в конструктор которого передать fair=true. В начале вайл цикла лочить лок. Тогда они будут выполняться последовательно.

    • @sorokinpavel
      @sorokinpavel  6 หลายเดือนก่อน +1

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

  • @dodik4929
    @dodik4929 ปีที่แล้ว +1

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

    • @sorokinpavel
      @sorokinpavel  ปีที่แล้ว +2

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

    • @luckytima2315
      @luckytima2315 ปีที่แล้ว +2

      Сейчас? Сколько ты спал? Kata akademy этим занимается уже года 4, в сбере куда не плюнишь попадешь в джависта с нарисованым опытом

  • @Ivan-t8l1r
    @Ivan-t8l1r หลายเดือนก่อน

    Это на какой уровень собседование?

  • @alexzaides767
    @alexzaides767 10 หลายเดือนก่อน +3

    это на джуна? или яндекс поменял свои задачи в кои то веки?

  • @ПриветПривет-я7о
    @ПриветПривет-я7о 5 หลายเดือนก่อน

    привет! спасибо за видео. подскажи, лайвкодинг тоже был в идейке, или просто в текстовом редакторе без подсказок?

    • @sorokinpavel
      @sorokinpavel  5 หลายเดือนก่อน

      Привет, в обычном редакторе был лайвкодинг

    • @Geovald
      @Geovald 2 หลายเดือนก่อน +1

      @@sorokinpavel ну они и черти. Что мешает автозаполнением Intellij пользоваться...Это ведь 100% будет использоваться в работе.

  • @brime12345
    @brime12345 10 หลายเดือนก่อน

    Собеседование в Я и нет задачек на алгосы с литкода? Странно как-то.

    • @sorokinpavel
      @sorokinpavel  10 หลายเดือนก่อน

      Это был первый стандартный этап, который одинаковый для всех, дальше алгоритмы

  • @Ivan-t8l1r
    @Ivan-t8l1r หลายเดือนก่อน

    Ты забыл про метод toString в Object.

  • @АнатолийШалобасов
    @АнатолийШалобасов 11 หลายเดือนก่อน +1

    Здравствуйте. Подскажите пожалуйста это собеседование на Senior или какую позицию? Заранее спасибо за ответ!

    • @sorokinpavel
      @sorokinpavel  11 หลายเดือนก่อน +4

      Я собеседовался на Senior. Это был первый этап, но там первые 3 этапа для всех одинаковые

  • @kozhuhovIvan
    @kozhuhovIvan 9 หลายเดือนก่อน

    На какую позицию собес был?

  • @1-ov947
    @1-ov947 ปีที่แล้ว +1

    Это первый этап интервью? Яндекс поменял формат и перестал спрашивать литкод?

    • @sorokinpavel
      @sorokinpavel  ปีที่แล้ว +2

      Да, это был первый этап. На остальных спрашивали только задачи на алгоритмы.

  • @МаргаритаМаргарита-м4з
    @МаргаритаМаргарита-м4з 11 หลายเดือนก่อน

    Не взяли?

  • @LPS-ln1mz
    @LPS-ln1mz 10 หลายเดือนก่อน +2

    вообще у exception 2 наследника - checked & unchecked и runtime exception это наследник checked

  • @владимирсенцов-р1ю
    @владимирсенцов-р1ю 11 หลายเดือนก่อน

    С итераторам можно проще. Засунул их в очередь и все. На конце очереди будет текущий итератор.

    • @dmitryduzhinsky2739
      @dmitryduzhinsky2739 11 หลายเดือนก่อน

      Итератор подразумевает под собой интерфейс, который не гарарнтирует нахождение всех элементов в памяти (они могут просто не помещаться), что делает данное решение неприменимым в данной ситуации. К тому же, создание отдельной структуры за O(N + M) выглядит слишком избыточнм. Задачи на комбинацию итераторов и заключаются в том, чтобы довольно оптимально скомбинировать интерфейс исходных.

  • @antonivanov1351
    @antonivanov1351 ปีที่แล้ว +1

    Вообще говоря то, что одинаковые строки будут ссылаться на один объект не гарантируется.

    • @sorokinpavel
      @sorokinpavel  ปีที่แล้ว

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

    • @antonivanov1351
      @antonivanov1351 ปีที่แล้ว

      @@sorokinpavel а я не сказал, что это обязательно так не будет. Я сказа, что это не гарантируется - это разные вещи. Это детали имплементации и лучше на них не закладываться.

    • @владимирсенцов-р1ю
      @владимирсенцов-р1ю 11 หลายเดือนก่อน +1

      Если объявить через литерал, то будет на один и тот же объект.

    • @antonivanov1351
      @antonivanov1351 11 หลายเดือนก่อน

      @@владимирсенцов-р1ю это гарантируется стандартом языка?

  • @ЕвгенийП-д8л
    @ЕвгенийП-д8л 5 หลายเดือนก่อน

    Перемудрил с блокировками в 3 задаче. Они там совсем ни к чему.

  • @biggireal
    @biggireal 11 หลายเดือนก่อน

    iter1 = [1], iter2 =[1], multi.next(), multi.remove() - no such element

  • @ya_uze_umirayu1424
    @ya_uze_umirayu1424 11 หลายเดือนก่อน

    Подскажи на какой грейд ты проходил собес?

    • @sorokinpavel
      @sorokinpavel  11 หลายเดือนก่อน +1

      На senior, но там этапы для всех одинаковые

    • @iKorvik
      @iKorvik 10 หลายเดือนก่อน +2

      @@sorokinpavelони там угарают с такими теор. вопросами на синьора? :D

  • @ypohut1673
    @ypohut1673 ปีที่แล้ว +1

    А ты бы не хотел на Линукс пойти там говорят вакансий много и платят хорошо (там С) просто интересно мнение я новичок, присматриваюсь к Джаве и С

    • @sorokinpavel
      @sorokinpavel  ปีที่แล้ว

      Переходить никуда не планирую😁
      Вакансий и на java предостаточно

    • @ypohut1673
      @ypohut1673 ปีที่แล้ว

      @@sorokinpavel говорят что на Джаве предложений больше чем вакансий из-за этого Джава отталкивает

    • @luckytima2315
      @luckytima2315 ปีที่แล้ว +6

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

    • @ypohut1673
      @ypohut1673 ปีที่แล้ว

      @@luckytima2315 теперь знаю что все правильно делают что идут на питон и джаву, нг новичкам на джаву сложно, лучше джаваскрипт

  • @konstantingorbunov4372
    @konstantingorbunov4372 8 หลายเดือนก่อน +1

    Похоже, что у тебя неправильное решение третьей задачи, на мой взгляд вот так должно быть:
    @Override
    public void run() {
    while (current < 100) {
    if (id == current % quantity) {
    synchronized (lock) {
    step();
    current ++;
    }
    }

    }

    }
    Цикл ограничил 100 шагами для наглядности, ну и потоки надо стартануть.

    • @konstantingorbunov4372
      @konstantingorbunov4372 8 หลายเดือนก่อน

      Или вообще вот так лучше без доп переменной
      public void run() {
      while (current < 100) {
      if (id == current % quantity) {
      step();
      }
      }
      }
      synchronized private void step() {
      System.out.println("Step by " + name);
      current ++;
      }

    • @sorokinpavel
      @sorokinpavel  8 หลายเดือนก่อน +1

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

    • @konstantingorbunov4372
      @konstantingorbunov4372 8 หลายเดือนก่อน

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

    • @sorokinpavel
      @sorokinpavel  8 หลายเดือนก่อน

      @@konstantingorbunov4372 Покзаываю решение, которое я придумал во время собеса в реальном времени

    • @konstantingorbunov4372
      @konstantingorbunov4372 7 หลายเดือนก่อน

      @@sorokinpavel вообще я подмал, что здесь вообще не нужен synchronized блок, а достаточно двух volatile переменных, и сам я тоже зря написал synchronized метод во втором случае, так робот не сможет одновременно шагать и махать рукой например. Вот так тоже работает, можешь проверить:
      private final String name;
      volatile private static int current = 0;
      volatile private static int quantity = 0;
      private final int id;
      public Foot(String name) {
      this.name = name;
      id = quantity;
      quantity += 1;
      }
      @Override
      public void run() {
      while (current < 100) {
      if (id == current % quantity) {
      step();
      }
      }
      }
      private void step() {
      System.out.println("Step by " + name);
      current ++;
      }
      Хотя теоретически current ++ не атомарная операция

  • @Ivan-t8l1r
    @Ivan-t8l1r หลายเดือนก่อน

    Многопоточка сложная

  • @alekseysverbeev2934
    @alekseysverbeev2934 10 หลายเดือนก่อน

    Завязывать логику на name, который задается в конструкторе - это даже не bad practice, это уголовное преступление)

  • @вапвапвапвапва-ж1и
    @вапвапвапвапва-ж1и 11 หลายเดือนก่อน +1

    Поздравляю с офером. Чё по зп? Средняя по рынку или чуть выше? Какие таски?

    • @sergeynothing9324
      @sergeynothing9324 11 หลายเดือนก่อน +1

      А кто сказал что кандидат прошел? ) Задачи разные, в яндексе десятки подразделений и там встречаются совершенно разные задачи. Можно найти на любой вкус. По зп зависит от вашего уровня.
      Ну скажем так: в Яндекс сложнее проскочить на высокую зп, нежели в средненькую контору и тут я скорее про средний уровень разработчиков. Но компания дает тебе много вариантов вырасти и развиваться в долгую.

  • @SarkhanTakhirov
    @SarkhanTakhirov 11 หลายเดือนก่อน

    А на какой уровень было собеседование? Кажется довольно простым для всех страшилок, которые я слышал о Яндексе, судя по тому что не было System Design, это jun, middle?

    • @vegassinn
      @vegassinn 11 หลายเดือนก่อน

      Senior, ниже написано.

    • @LPS-ln1mz
      @LPS-ln1mz 10 หลายเดือนก่อน

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

  • @pianogx6077
    @pianogx6077 9 หลายเดือนก่อน

    это пример livelock'а?
    th-cam.com/users/shortsd2Ya0T-LolI

  • @RomanTchekashov
    @RomanTchekashov ปีที่แล้ว

    Тебя взяли в Яндекс?

  • @КиборгЗлодей
    @КиборгЗлодей 9 หลายเดือนก่อน

    Полезно, но очень тихо

  • @kiselkisel3463
    @kiselkisel3463 11 หลายเดือนก่อน +1

    Странный задачи на алгосы. Уровень стажера

  • @monkedlyugge
    @monkedlyugge 9 หลายเดือนก่อน

    currentLeg = 1 - currentLeg;

  • @blackdragon7047
    @blackdragon7047 11 หลายเดือนก่อน +14

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

    • @sorokinpavel
      @sorokinpavel  11 หลายเดือนก่อน +6

      Не понимаю почему что-то конкретное X - зло, тем более без аргументации Есть то, что тебе подходит, что не подходит. Если тебе не хочется в яндекс - не иди, многим другим хочется.

    • @tanyagibadulina8809
      @tanyagibadulina8809 11 หลายเดือนก่อน +3

      Согласна на все 💯 бежала оттуда сверкая тапками.

    • @yt_user-u1x
      @yt_user-u1x 11 หลายเดือนก่อน +1

      Поясните

    • @andrewmovan771
      @andrewmovan771 11 หลายเดือนก่อน

      Ух ты, мамкин нетакусик в комментариях

    • @CAMOBAP795
      @CAMOBAP795 7 หลายเดือนก่อน +1

      Работа на любую роccийcкую компанию зло, яндекc чем-то выделяетcя кроме цензуры в выдаче поиcковика?

  • @tesgreat8958
    @tesgreat8958 ปีที่แล้ว

    Третья задачка прикольная ). Но как по мне, перемудрил.
    - во первых потоки нигде не запускаются, на видео просто new Thread(..).
    - даже если ты не используешь стандартные Lock, лучше было бы передать обьект снаружи, а не надеятся на пул констант.
    - все эти wait
    otify тут лишние - у тебя же есть уже критическая секция, потоки на ней будут синхронизироваться.
    - ну и архитектурно я бы все что. не связано с ногами вынес в отдельный класс FootOrder какойнибудь ( но это уже конечно придирки, на собесе может и норм))

    • @sorokinpavel
      @sorokinpavel  11 หลายเดือนก่อน +1

      Спасибо за обратную связь!
      1. Да, потоки не запускаются, но по условию можно было трогать только метод step и внутреннее устройство Foot
      2. Wait и notify не лишние потому что нельзя гарантировать порядок, в котором будет захватываться монитор. Можно сделать, чтобы поток сразу же выходил из критической секции, если не его очередь ходить. Но тогда может произойти такое, что поток делает много лишней работы, хотя мог бы просто поспать)

    • @tesgreat8958
      @tesgreat8958 11 หลายเดือนก่อน

      Так notify тоже не гарантирует порядок. При двух потоках может показаться, что смысл есть, но если представить обобщённый вариант ( ту самую сороконожку ), принципиальной разницы не будет - что 40 потоков залочены на входе в крит. секцию, что те же 39 спят и рандомно просыпаются от notify.

    • @Ivan-t8l1r
      @Ivan-t8l1r หลายเดือนก่อน

      @@tesgreat8958 так есть проверка же, неподходящие потоки снова заснут по wait

  • @youtubeeda
    @youtubeeda ปีที่แล้ว

    💣

  • @test143000
    @test143000 11 หลายเดือนก่อน

    собеседование в гбшную контору, а кому это надо?

  • @DmitriySnezhinskiy
    @DmitriySnezhinskiy ปีที่แล้ว

    Про атомик какой-то бред прозвучал

    • @sorokinpavel
      @sorokinpavel  ปีที่แล้ว

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

    • @g_or_l
      @g_or_l ปีที่แล้ว +2

      ​@@sorokinpavel про атомик прослушал, видимо. Но если речь про замечание о volatile на currentLeg, то оно звучало не очень, имхо.
      1. Он там не нужен. Захват/освобождение монитора happens before организуют, это решает все проблемы.
      2. Если бы я проводил интервью, то желание вставить volatile и объяснение мотивации вида "читать напрямую из памяти" стриггерили бы меня чуть подробней поговорить и про volatile и про jmm.
      Спасибо за видео.

    • @ianisforis
      @ianisforis ปีที่แล้ว +3

      @@sorokinpavel тоже по началу давал такой ответ, что volatile читает напрямую из памяти, но после изучения материалов про jmm все не так просто. Можно сказать что volatile дает нам гарантию видимости значения разными потоками, а как именно это будет зависит от архитектуры памяти и/или jvm оптимизаций. Может быть и когерентность кэша и читать будут именно из него, но при этом с гарантией видимости и т д

    • @sorokinpavel
      @sorokinpavel  ปีที่แล้ว

      @@ianisforis Спасибо за конструктивную обратную связь!

    • @ianisforis
      @ianisforis ปีที่แล้ว

      @@sorokinpavel всех благ и дальнейшего развития канала. Много каналов про java не бывает, как говорится)