Собеседование на позицию Java junior #1 Антон

Подготовка к собеседованию на Java Developer

Транскрипция видео:

  • Здравствуйте сегодня все присутствующие На этом видео мы сегодня делаем тестовое собеседование с будущим Java разработчикам Надеюсь что будущем Вот соответственно перед нами Антон Антон Расскажи о себе Сколько тебе лет может быть где-то учился Как долго ты изучаешь Java Вот примерно так Добрый день зовут Антон как вы уже перед догадаться 25 лет Java изучаю уже где-то на протяжении месяцев 8-9 сам вообще заканчивал образование непрофильное не связано с it там больше там инженерное вот собственно говоря Вот решил как-то

    00:00:02 - 00:01:42

  • влиться попробовать свои силы в разработке это так OK значит тогда я предлагаю следующий формат я буду на доске сначала расшарю свой экран и на доске мира буду вопрос не забыл Или еще что-то вот Ну соответственно я буду задавать вопрос задачи Если ты знаешь сказать ответ Если ты не знаешь сказать просто что нет не знаю все не мучиться Вот это поехали значит У нас тут самый первый вопрос Причем он тут у нас уже был но мы начнем наверное даже не с этого вопроса А вот такого Самого простого базового это Расскажи

    00:00:52 - 00:02:39

  • про что это такое вообще и пример из реальной жизни по каждому принципу ориентированная программирование скажем парадигма благодаря которой мы можем представить наш так скажем код в виде каких-то классов и объектов то есть становится более читабельный более понятный основные столбы это у нас следование капсуляции полиморфизм также есть акции выделяет если говорить про наследование это так скажем способность классов наследовать поля и методы своих классов родителей Вот коротко допустим там если например

    00:01:51 - 00:03:25

  • реальной жизни допустим родился у нас есть допустим Лев соответственно если там родятся какие-то там его так скажем потомки его маленькие львята они будут присущие качество его отца может еще что-то вот а полиморфизм это говорим про наследование да А ну как бы какая практическая то польза нам Ну вот нас есть там класс родители классно наследника что нам это дает с точки зрения практики но мы можем задать в родительском классе какие-то общие атрибуты которые могут присущи каждому так скажем потомку или

    00:02:40 - 00:04:03

  • какие-то методы какой-то функционал который будет переопределяться начальных классов вот у меня есть допустим класс там к и от него там есть Лев тигр и так далее То есть в чем практически смысл этого действия что я вот написал Почему не написать [музыка] Ну это как минимум сокращает код но и еще так скажем как преимущество Если у вас есть какой-то общий родитель то мы можем так скажем благодаря полиморфизм полиморфизм использовать какой-то общий функционал этих объектов за счет того что они являются так скажем потомками общего

    00:03:23 - 00:04:51

  • какого-то родительского класса Ну то есть по факту просто у нас сокращается кодовая база то есть мы можем написать Ну давай дальше полиморфизм это так скажем способность объектов различных классов использовать общие функционал за счет того что они являются потомками общего какого-то класса В общем английского класса Ну как пример допустим у нас есть какой-то класс Animal допустим животные допустим в этом классе животные есть какой-нибудь метод по типу там мы можем допустим двух наследников там кошку и собаку

    00:04:15 - 00:05:41

  • допустим кошка там будет мяукать собака будет гавкать потом допустим создать какой-то общий массив типа и не мог засунуть объекты и потом допустим в цикле про это тренироваться и вызвать этот метод Ну ты как бы сейчас уходишь такую техническую реализацию А я вот верхние уровни прошу что мне дает какой он мне возможность ну так скажем у нас может быть какой-то общий интерфейс и могут быть различные реализации то есть много формы некоторые Я так и знаешь я пытаюсь как-то навести на мысль на какую-то Да хотя как

    00:05:05 - 00:06:26

  • интерьер не должен То есть у меня вот если у объекта есть один и тот же метод Да есть один тот же мир то что мне полиморфизм Ну способность В каждом классе построен реализовать этот метод и Да я тебя слышу ну и допустим за счет какого-то общего так скажем класса от которой метод вызывать То есть у объектов различных классов но я скажу сразу что я ожидал просто на самом деле в какую фразу что мы можем вызывать метод какой-то несмотря на его реализацию то есть по сути У нас есть какой-то общий метод до у родителя когда мы определяем

    00:05:53 - 00:07:38

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

    00:06:52 - 00:08:21

  • Вот у нас есть какой-то класс у него нету никаких атрибутов Ну у него есть там один метод публичный один там этот приватный публичный дергает приватно вот в чем как бы смысл-то инкапсуляции в данном случае Ну в том что здесь так скажем некоторые метод благодаря которому можно допустим передать какое-то значение и он вернет допустим какой-то результат но то есть залезть в этот приватный метод который может какая-то быть важная логика и что-то там поменять мы не можем потому что это может сломать нормальное течение программы и

    00:07:49 - 00:09:21

  • работы Ну смотри Подожди Поменять не можем у нас же перед нами если кот есть да ты же можешь взять поменять код методом перед тобой можешь А если с другой стороны а если я использую использую чужую библиотеку и там есть паблик Public метод Ну да вот внешне Ну то есть я из внешней библиотеки его беру Вот я допустим открываю ДК вот у меня есть класс string Да вот рефлексии может какой-то ну рефлексии да ну мы сейчас не говорим фиксировать это же как бы наоборот сломали парадигмату Я просто к чему говорю ты как бы сказал

    00:08:37 - 00:10:16

  • такую вещь что мы как бы не можем поменять правильно но это же не пропсоляция это же не про то что мы можем поменять код переписать переписать приватный можем можем можем в чем как бы смысл Я думаю так опять же если уровни в целом если какой-то там метод или какая-то переменная помечено правило к нам это как бы уже говорит о том что лучше не соваться ничего я так думаю Окей в моем представлении просто капсуляция говорит другому программисту о том что она разделяет методы на публичные и приватные и публичное

    00:09:43 - 00:11:17

  • означает то что я этим методами могу пользоваться да то есть это готовый какой-то метод приватный метод он реализует какую-то скрытую логику И это не говорит о том что приватный метод все поменять не могу это просто мне говорит что дружище пользуйся вот этим публичным методом потому что в нем уже реализовано вся функционально все готово а приватным не пользуйся потому что там еще может быть до этого была цепочка вызовов Да который для этого приватного метода И тем самым я как бы другому человеку программисты

    00:10:32 - 00:11:55

  • говорю вот у меня есть готовый метод пользуюсь им а вот приватные это значит Ну он его просто не видит и пока он не залезет код Он не узнает о его существовании Вот наверное такой смысл хорошо Ну тут начал про Гетто расет тара как бы вот [музыка] давай дальше излюбленный вопрос сразу Что такое методы между которыми контакт допустим если работает какой-то хешированной коллекции по типу кошмак мы должны правильно определить их между ними есть контакт если ты говоришь про контракт между ними но сначала скажу что это

    00:11:14 - 00:12:49

  • метод нужен для сравнения потому что по умолчанию объекты сравниваются по ссылке а не по умолчанию Ну то есть в классе обжиг тоже перепадет И там то есть реализация такая что он сравнивает по ссылке Поэтому если мы хотим объекты сравнивать между собой Мы должны нашим классе переопределять этот сказал в классе лучше не придет там же есть реализация по умолчанию Вдруг у нас оказывается что он говорит о том что там у нас Что такое а хешкот это стоковое представление нашего не стоит часовое представление

    00:12:11 - 00:13:44

  • нашего объекта то умещается в диапазон Инта как правило нужен для работы какими-то коллекциями хэширования по типу кошмапы с это Такого разряда хорошо И в чем же между ними тогда контракт если Шкоды одинаковые это не означает что объекты одинаковые если коды разные это означает то что объекты разные если объекты равны и многократный вызов коды должен возвращать всегда хорошо Давай дальше Поехали вот у нас есть такое понятие Ну стринг пул что это такое Это так скажем область памяти которые хранятся наши строки так как такая

    00:13:16 - 00:15:17

  • является объектом а если я вот через неё стринг напишу я попаду в этот или нет а допустим если создаем какую-то строку допустим string и равно hallow потом создаем допустим строку б спрашивают простой вопрос Вот я делаю стринг и передаю туда значение Я попал там есть метод который То есть если я просто напишу New string то я не попаду тся строка просто как отдельный объект Ну окей значит тогда я сразу вопрос тебе вот Я создаю string переменные две у меня будет надо было вопрос Вообще дать в мир

    00:14:20 - 00:16:11

  • обсуждаем значит вот я даю создаю переменную одну просто кавычки указываю а вторую стринг б у меня переменная там переменная а переменная B У них одно и то же значение Но одно значение через двойные кавычка указываю второй через нее Стрим у них какой результат будет по моему Метод iqos при определенный а если равно ровно напишу будет потому что это два разных объекта а если бы я создал бы стринг Ну и Первую вторую переменную через кавычки потому что это были бы две ссылки на один Окей хорошо Поехали дальше значит поговорим с тобой

    00:15:37 - 00:17:28

  • знаешь что ну это вроде как кэш хранятся значение от 0 до 128 наиболее часто используемые скажем числовые Ну от минус 128 от места 28 127 по-моему вот там типа как байт 0 же тоже как А зачем вообще это все сделали Но если допустим у нас есть какая-то строка строка Вот и мы допустим Если каждый раз будем там как так добавлять Девушка ты нацию нас постоянно будут нашим пуле то есть увеличиваться так скажем он будет просто очень много объектов будет тратить очень много памяти поэтому То есть как бы придумали

    00:16:49 - 00:18:29

  • stringpal то что допустим есть какая-то строка там Hello и когда мы создаем гражданского у нас просто появится ссылки на разные объекты и не придется занимать память лишнее Поехали дальше значит стримы какие у нас есть виды операции [музыка] коллекция для так скажем удобно работы коллекциями вот из предоставлять какой-то поток данных для работы там с листовом подобным Зачем вообще их изобрели Ну что через форечь не работалось Ну это удобно намного меньше года писать и допустим каких-то промежуточных

    00:17:55 - 00:19:28

  • операциях по типу сорта мы можем указать сами там реализацию какую-то Как там будут сортироваться наш объект который Вот и написать самим реализацию давай по-другому Спрошу Стрим API Какой нам парадигму какую парадигму национальное программирование вот я про это имел ввиду что она как бы вносит на самом деле функциональный способ работы с нашими коллекциями то чего раньше не было раньше мы бы писали бы это все так сказать процедурном стиле вот значит Ну давайте промежуточные операции терминальные

    00:18:54 - 00:20:27

  • а допустим промежуточные они нас как-то работают допустим с нашей коллекции там по типу мапы какой-нибудь то есть принимает что-то что производят какие-то там действия и возвращает нам объект но не объект результат и то есть терминальные операторы завершающие по типу там [музыка] он этот возвращает и собственно мы там уже работаем а в чем тогда отличие Вот смотри ты говоришь промежуточный терминале Вот они промежуточных может быть много терминальная она одна завершающая а как нам понять что это операция

    00:19:54 - 00:21:24

  • промежуточная я вот начал бы смотреть Ну там начал бы что-то со стримами делать Да вот открыл бы этот Стрим и как бы операция Мэт или операция фильтра промежуточная А вот терминале как-то вот я смог бы сигнатуре ну то есть вообще по возвращаемом типа понять [музыка] промежуточную нас реализует функциональные рейсы Ну и после них но после промежуточных мы можем там еще какой-то промежуточный Стрим добавить получается что то есть терминальный мы как бы что-то у нас тут не хватает мы много раз вызываем какую-то

    00:20:40 - 00:22:21

  • промежуточную операцию Значит получается так что мы вызвали допустим что у нас Какой объект получился а ну также стримы возвращает что он возвращает Стрим тоже Стрим OK А если я фильтр там запущу что отфильтрует то есть наши Как скажем коллекция также вернет у меня Объект какой будет если я взял бы точка Стрим потом точка фильтр Я бы чтобы переменные захотел сохранить В какой примерно в лист нет Вот я релиз точка Стрим точка фильтр Ну и фильтры передал бы какой-то лямбда выражение вот я бы тобой объект типа Стрим будет

    00:21:37 - 00:23:21

  • отлично А если я вот называю допустим вот значит получается так что стримы промежуточной операции не возвращают нам стримы закрывают этот Стрим второй раз уже не можем обратиться к этому так какие-то знаешь методы [музыка] промежуточный операции промежуточные функции Как еще раз animage Да аниме что он возвращает твой или фокус это промежуточная а это значит вот смотри вот мы воспользовались фильтром Да мы вот туда Передаем Ну интерфейс до функциональный лямбда гараже Что такое Ну это интерфейс в котором только один

    00:23:06 - 00:24:49

  • метод один метод какой а публичный не дефолтный метод она сможет в интерфейсе быть вообще приватным приватный метод Нет не может быть интерфейса потому что Интерфейс Это как контакт нет только какие только паблик Хорошо согласен Так значит То есть получается функциональный интерфейс по итогу это интерфейс одним публичным методом каким вот фильтр принимает себя как этот [музыка] может быть compara был какой-нибудь нет контора болото сравнение это у нас возвращается другой это сорт принимает фильтр вы не вспомню не вспомнишь

    00:24:56 - 00:27:03

  • Что такое поставщик поставщик нельзя ничего не принимает какие-то хорошо а какие у нас есть терминальные операции коллег Ну окей если я хочу получить одно значение чем не делать там по-моему есть метод скип что ли или limit одно значение То есть у меня была там 10 значений вот у меня создался лист 10 чисел климат по моему и я хочу Вы по итогу сохранить переменную одно значение вот у меня там много чисел не знаю 10 там 20 30 я хочу переменную сохранить создать переменную integer Number с первым числом

    00:26:24 - 00:28:31

  • Ну можно все это конечно скользить к листу и сделать Get 0 давай не кастинг так не прокатит у меня Стрим Какая промежуточная операция позволит сделать фильтр фильтр ну наоборот терминально заговаривается как бы я бы выбрать самое первое значение не используя никакие промежутки хорошо а что коллег делает коллег позволяет нам наш Стрим преобразовать какой-то коллекции какой-то коллекции Ну хорошо Допустим мы можем преобразовать вряд ли если мы лист на листе вызвали а можем вызвать на мапе да как map.scream нет допустим нас есть хэшмапа

    00:27:53 - 00:30:00

  • и выйдет за что как он будет италироваться тогда там же два значения наверное с помощью у мамы класс есть смотри на самом деле мы можем с помощью коллектора и сохранить и в маму там есть такое коллекция Там просто надо будет написать лям до выражения что будет являться ключом А что будет являться значением когда мы по мате если бы захотели бы проиндерироваться мы бы наверное вызвали бы сначала а да Значит хорошо Поехали дальше какие у нас вообще есть модификаторы доступа У нас 4 модификатора доступа это по

    00:29:16 - 00:30:49

  • строгости они идут край Вот Потом модификатор по умолчанию доступ к классу можно получить только внутри класса так согласен а что Ну дальше дефолт дефолт можно получить доступ к внутри класса внутри одного пакета потом у нас идет protected можно получить внутри класса внутри пакета и класс Наследники могут получить доступ Ну и паблик он открыт из любого класса любого пакета Хорошо согласен а в чем отличие между абстрактным классом интерфейсом [музыка] абстракты класса Может быть как некий шаблон и других классов в нем могут

    00:30:25 - 00:32:01

  • написать какие-то методы с реализацией можно написать какие-то атрибуты которые будут присущи потомков и так далее а Интерфейс Это как как лимитируем интерфейс и пишем реализацию его методов некоторые поведения а вот и сказал что реализация каких-то методов А что у нас не может быть реализация интерфейсе может быть дефолт можно сделать да Значит уже реализация может быть в интерфейсе скорее общие атрибуты OK вопрос А у нас может быть в интерфейсе конструктор интерфейсе конструктор нет это странно но мы можем конечно с

    00:31:29 - 00:33:06

  • помощью реализовать интерфейс реализовать Может у нас скажу Нет честно говоря не знаю в абстрактном классе может быть конструктор Нет не может быть в абстрактном Но мы же не можем сказать объект по сути в Интерфейс это не может быть конструктором не может создавать объекты классов и интерфейсов скажи пожалуйста вот ты говоришь что есть переменная да Тогда может быть нет но они там статические финальные все что мы пишем в интерфейс какие-то атрибуты они сразу Статик Ну вот теперь вот руководствуюсь всеми

    00:32:29 - 00:34:07

  • своими знаниями которые мы только что получили получается в интерфейсе конструктора быть не может это раз второе Переменная переменные в интерфейсе стать хорошо Поехали дальше может А кстати Может у нас интерфейс быть приватно Вот мы нет хорошо Поехали дальше перечислить все методы класса object и рассказать зачем они нам нужны так методы класса string getclass Клон есть еще вейд Ноти фай Ноти фай вейпните файл но свой ты напутал Нет есть Окей Так что нам делать а возвращает класс которому принадлежит

    00:33:34 - 00:35:48

  • объект а что это класс что нас этого класса мы можем сравнивать там через инстанцию Окей согласен А еще что у нас у класса Ну вот ты взял сделал там string Get класс Да что еще мы помимо того что просто instance of у нас там получается класс с помощью get-класса мы по моему как раз таки рефлексии можно использовать то есть залезть так скажем класс как бы исследовать его данные методы какие-то поля Хорошо давай дальше Вот мы говорили класс говорили ноту string Что просто Что надо делать а это клонирования объектов

    00:35:10 - 00:36:58

  • нужен для клонирования объектов по моему чтобы скажем реализовать этот метод нужной помощи им приметить интерфейс conobal есть по моему два типа клонирования это поверхностное и глубокое чем отличие поверхностное то есть там может так что допустим какого-то класса может быть объект в атрибутах и он то есть вместо того чтобы создать новый объект сделать копии он будет просто ссылаться на тот же Объект который есть уже в классе и это как бы не очень хорошо поверхностное клонирование получается хорошо

    00:36:29 - 00:37:52

  • допустим принимаю pate на tefi на Tefal Но это для работы с многопоточкой честно многопоточку Так только читал косарь не работал вот это по-моему доставляет потоки ждать пока в другом потоке не будет вызвана на Tefal а ноте на она получается все потоки ждать вызываю я вызываю пишу Трейд Ну там не знаю что там делаю да что мне это дает Ну поток приостанавливает работу и Ну то есть работы другие потоки в это время новый поток а ждет сейчас не углубляться во всю тематику по точности мне просто интересно больше если все

    00:37:16 - 00:39:20

  • равно не работал просто Узнать хотя бы познания вот у нас есть вот мы хотим создать второй поток не знаю допустим второй поток берет и распечатывает на экран просто Hello world как мы могли бы это сделать два путя это либо имплементировать рано был сколько помню либо и переопределить метод а потом в моей не вызвать соответственно поток вот рано был да это Интерфейс Да и как бы получается что вот я взял Ну написал реализацию этого интерфейса И что мне нужно сделать чтобы вот этот интерфейс запустился Ну вот метод Мы с

    00:38:29 - 00:40:16

  • имплементили то есть при определили метод Run там допустим какой-то запустили цикл чтобы он там печатал потом методе Main мы получается создаем объект и запускаем его через метод точно не помню а ты говоришь запускается Star правда потом потом мы же в методе Main должны запустить его я с тобой согласен что мы должны его запустить на Тебе не кажется что если мы в интерфейса рано был вызовем Run Да потому что там же абстрактный то наступает работать никакой трек не создаст значит наверное нам нужно создать новый

    00:39:45 - 00:41:19

  • объект и передать туда качестве вот ну не буду спрашивать тогда про все эти раны прочее смотри Давай дальше у нас есть такая концепция называется Drive что-то слышал про не это какой-то архитектурный паттерн честно говоря нет вот смотри вот Давай так я вот публикую вот какой-нибудь из этих трех знаешь туалет солидом как еще сталкивался сталкивался Что это такое Ну и так скажем тоже архитектурный паттер так скажем некоторые правила которых следует придерживаться при разработке Java приложения то есть каждая буква это

    00:40:42 - 00:42:29

  • какая-то аббревиатура Set у нас принцип единичной ответственности О это у нас принцип открытости закрытости Или это по моему [музыка] принцип подстановкой принцип постановки там были листов ай это у нас принцип разделения интерфейсов D это принцип инъекции зависимости это как бы круто что ты это запомнил но мне будущему человеку с которым с тобой работать я от того что ты выучил Там нет ничего не даст Больше интересно про то что как-то это понимаешь потому что ведь это принцип разработанный спрашивали люди для того чтобы

    00:41:44 - 00:43:42

  • их программы когда они вот смотри у нас есть о да Open Close Princess что реальном примере ты бы мог мне сказать в чем смысл какой-то класс допустим к что на этом коте в чем был бы принцип То есть это принцип того что класс должен быть доступен к расширению но закрыт для модификации если мы хотим Добавить какой-то новый функционал мы не должны при этом изменять свой старый код уже написанный его либо можно добавить с помощью допустим у нас были какие-то методы мы могли решать того что нужно писать

    00:43:08 - 00:45:00

  • каким интерфейс интерфейс это у меня класс код есть ты говоришь открыт для расширения вот чтобы я захотел как Давай попробуем объяснить я теперь не только мяукал Ну то есть не только звук меня произносил А еще мы создаем какой-то общий интерфейс допустим с методом Sound потом допустим какие-то отдельные объекты им примитивные интерфейс и пишем его реализацию и так далее собственный принцип открыт расширение закрыт изменения значит Если ты создаешь новый Интер Если хочешь связать да Ну вот ты бы что-то там создал бы

    00:44:22 - 00:46:15

  • какой-то второй класс до на основании этого интерфейса для того чтобы тебя кот и второй вот класс который бы ты создал могли бы работать воедино Тебе пришлось бы поменять кота написать что он им комментирует вообще-то вот интерфейс допустим класс мяу будет смотрят реальный пример у меня есть класс у него есть метод мелом уже реализованы все это существующий класс Я хочу чтобы кот теперь не только мяукал но еще и шипел вот когда я делаю мяу вот этот обращаюсь Как мне это сделать используя руководствуясь этим принципом

    00:45:28 - 00:47:14

  • мы можем создать еще один интерфейс имплементировать его подожди Интерфейс это это опять же Интерфейс Это значит что мне класс Кэт придется написать им племен твой созданный интерфейс примеру Хотя не очень хорошо ты же говоришь закрыт на изменение Ну ты же сам не провозглашаешь говоришь Я говорю что у нас опыт закрыт на изменение ты тут же мне предлагаешь решение изменять этого кота потому что имплемент и новый Интерфейс это изменение вообще как бы сделал Я не знаю просто допустим мы можем мяукает и гавкает

    00:46:26 - 00:48:11

  • нас могут быть два Я хочу чтобы он еще во время того он мяукал Я бы еще был его а он что-то принимать второй метод второго метода не будет будет один и тот же мир он принимает что-то параметры [музыка] она нужна просто Как добавить на функционал не знаю может декоратор какой-то вряд ли конечно декоратор бы смог бы решить нашу проблему Но на самом деле тебе надо было бы просто так экстендиться от кота И тем самым Забирайте его метод мял И вот тогда бы ты бы расширил бы так у нас же класс код как мы как мы еще

    00:47:20 - 00:49:00

  • от кота Так мы же уже кот Мы же работаем с классом код и встретимся Где в интерфейсе или принцип открытости закрытости говорит о том что я могу сейчас сделать чтобы поменять класс функционал создать еще один классный и у меня расширяется функциональность класса кода я могу вот вот здесь с точки зрения реальной жизни Вот в чем смысл так я после себе это как бы по-другому вот смотри Давай дальше Вот у нас там есть еще в ту же сторону инверсия зависимость в чем вот по куда я вот так себе понял но я

    00:48:13 - 00:50:07

  • так понял что нас как верхний модули программы не должны зависеть от нижних мы классы то есть между ним должна быть какая-то абстракция через которую они взаимодействуют более низкоуровневые реализации [музыка] низкоуровневая самое лучшее слово вот а вот абстракция хорошая сейчас Значит ты сказал Абстракция что значит абстракция Ну какой-то абстрактный класс который будет взаимодействовать с другими классами смотри давай по-другому вопрос поставлен У меня есть завод класс и у него есть у меня есть еще

    00:49:31 - 00:51:19

  • абстрактный класс worker Или даже интерфейс Work есть две реализации Петрович Иванович вот я хочу чтобы на заводе у меня работали люди да Ну вот рабочие то есть меня появляется зависимость да то есть меня завод будет содержать себе рабочих Скажи мне пожалуйста мы атрибуты Какие бы какой бы у них был бы тип Исходя из этого Из этой версии зависимости Ну горка был интерфейсе или или класс Я думаю на какой-то абстрактный класс потому что как у Петрович Иванович там тоже присуще Чем ты там имя фамилии это

    00:50:27 - 00:52:17

  • абстракция для чего мы это делаем что мы так скажем не были подвязаны на конкретно этих объектов То есть если допустим что-то случится там с петровичем чтобы могли также работать меня устраивает [музыка] давай дальше Вот буква I принцип разделения интерфейсов состоит в том что у нас лучше сделать много маленьких интерфейсов с какими-то методом чем один огромный интерфейс который будет нагроможденно куча всего куча всего Ну а что Ну вот смотри вот у меня есть интерфейс завод или вот тот же самый worker

    00:51:28 - 00:52:56

  • остановимся у меня работник он умеет есть он умеет работать он умеет спать Он умеет что еще делать бегать Согласно этому интерфейсу согласно этому принципу мне надо было их разделить на множество методов но лучше да потому что появится еще какой-то класс в порядке Бреда тигр вот и он тоже там захочет есть спать и бегать то есть имплементирует интерфейс worker то есть там появится еще не нужно по типу работать хорошо А если бы мы думали о том что У нас вот эти вот методы Только бы работник мог реализовать

    00:52:22 - 00:54:04

  • мы бы стали Ну вот этот интерфейс Work был да элементов есть Ну вообще Мы про интерфейсы Да говорим Поэтому если бы у нас горка был бы мы подразумевали что он всегда выполняет только вот все методы надо было бы разделять его на 4 отдельно или не надо было Да тут даже не знаю Ну хорошо мы сейчас закопаемся на самом деле то что ты сказал что Лев может тоже есть и поэтому стоит разделить это нормальный в принципе он устраивает у нас появляется возможность переиспользоваться нас не появляется избыточности

    00:53:26 - 00:55:10

  • Ну хорошо Итак Поехали дальше значит вот у нас есть такое понятие перегрузка метода что это означает Ну это не так такими же названием как два метра просто с одинаковыми названиями но разными входными параметрами входными параметрами количество или разные или что Да даже может быть просто допустим Один метод принимает string integer другой метод может принимать интежи string все они как бы уже перегружены то есть еда Ешка поймет то что внутри Потому как мы в каком порядке будем передавать аргументы

    00:54:26 - 00:55:59

  • сигнатура модификатор доступа тип возвращаем значение название и какие-то входные параметры понятно [музыка] не совсем так сигнатура это наименование нашей функции а также их типа аргумент и количество то что ты это сигнатура называется переопределение метода что это метод таким же названием таким же возвращаем типом таким же модификатором доступа но как другой реализации Ну как при определении мы используем когда чего-то наследуемся то есть пишем там какую-то свою реализацию там для каждого класса

    00:55:22 - 00:57:02

  • запретить переопределять метод класса дочерней файл добавить файл нельзя будет переопределять куда ну рядом с методом Так посмотри у нас есть такие нас и string да А есть еще Билдер и Стрим баффер Что такое стринг Билдер так скажем механизм позволяющий нам работать нельзя изменить и допустим если мы допустим строка мы допустим в каком-то цикле там каждый раз не прибавляем букву нас будет создана в нашем пуле очень много тренингов это будет занимать память вот там как раз на помощь приходит то есть мы оборачиваем

    00:56:17 - 00:58:04

  • под капотом по моему Если не ошибаюсь он образует массив символов там то есть совершает концентрацию благодаря методу вставляется массив какие-то символ и потом когда мы вызываем туринг он уже создает эту строку а Stream бафферы это по-моему более такая старая реализация на самом деле сын баффер это многопоточность А давай дальше Поехали вот у нас есть такой сборщик мы работали Ты никогда нибудь [музыка] Скажи мне пожалуйста Так по моему клиенту очищает наш торги нашу папочку Target там у нас уже это лежит жарный то есть

    00:57:33 - 00:59:17

  • собранный проект компилированный джарник а может там не джарник лежать а может зависимости от того как собираем Ну просто расширение то есть никаких больше отличий Нет ну взяли поменяли Нет она если они собираются по-разному собираются А для чего нужен [музыка] nis что есть вот все Клин очистили то все дальше Клин потом компайл компилируется потом тест компилируется и все или еще вот у нас там есть Папочка ресурсы Да вот ты берешь написал классы свои да и у тебя есть папка ресурсов которые ты там прописываешь какие-то свойства там

    00:58:39 - 01:00:45

  • да пропертис скажи пожалуйста вот эти ресурсы когда попадут во время выполнения во время выполнения Ну то есть это загрузится они как файл прочитается Ну да А у тебя в тарге попадут эти ресурсы или нет да да campile да отлично [музыка] по-моему потом валидейт Install pompital package validate Install ох ох ох можно путаю памяти хочу сделать Ну то есть упаковывает нам как раз таки Install выгружает куда-то на локально там на компьютер локально на компьютер выгружает а зачем это делать ну чтобы могли там

    01:00:04 - 01:02:07

  • переиспользовать какие-то допустим писали какой-то класс можем там его за инсталлить потом можем использовать пользоваться в этом классами Какими методами и так далее ты говоришь ты сделал стол для тебя класс да а в итоге у тебя вот попадет в этот куда-то там собрался копировать на локальный компьютер у тебя что там сохранится Так ладно давай дальше тогда поехали есть такая прелесть А именно Spring работал когда-нибудь да работал молодец Что такое инверсия управления то есть мы делегируем обязанности по созданию

    01:01:34 - 01:03:08

  • объектов внедрение зависимости нашему на Spring контейнер А что нам это дает в целом разработку нам не нужен тебе каждый раз создавать какие-то объекты потом туда что-то инъектить и так далее принципе делать за нас нам остается только пользоваться уже готовыми бинами springs делает за нас аж что мы должны это сделать чтобы спринг понял что вообще создавать ну типа то что там Создать конфигурационный класс говорим мы сейчас говорим вообще про то что вот смотри вот ты начинаешь делать проект Да у нас Премьер ты говоришь вот

    01:02:40 - 01:04:04

  • я все делает Вот я тебя спрашиваю Вот ты создаешь какие-то объекты да с помощью спринга как их создать повесить аннотацию компонент либо конфиге там Создать метод с нотации bin который будет нам возвращать наши объекты и к власти в контекст в контексте контекста Что такое но некий контейнер в котором лежат наши бины бины хорошо а вот контейнеры Как выглядит Ну то есть вот я хочу там узнать что там по моему там под капотом под капотом Окей согласен смотри Вот ты все там написал какой-то спринг проект

    01:03:31 - 01:05:29

  • [музыка] и вот у меня вопрос тебе у тебя в контексте Вот ты взял создал два Бина один Бин будет у него Оскол сингл 2 будет про то что в контексте будет в контексте если он будет играть в контексте у нас а если при обращении То есть к этому вину при попытке получить Бин нам будет просто отдавать готовый объект через неё контекст он лежать не будет контекст лежать не будет хорошо Он контексте не лежит теперь смотри вот у нас есть такая аннотация называется предистрой Да она вызывается после так скажем

    01:04:41 - 01:06:32

  • использования нашего вина использование Ну как перед остановкой нашего спинка приложения OK теперь вопрос вот опять у нас существует два бина у одного ствол сингл второго прототать и у каждого из них вот ну типа написал нет типа по моему Пока так нет ничего не знает об этом объекте согласен А как ну как бы что происходит Вот как он понимает что надо эти бины удалять но не удалять точнее вызывать эти методы пристрой То есть ты говоришь мы закрываем контекст заканчиваем программу как понимает Ну может они не используются больше

    01:05:44 - 01:07:32

  • у них фай на Лайс вызывается [музыка] честно говоря не отвечу на то что вызывается перед остановкой приложений Дело в том что у спринга есть ивента вот Event close он говорит о том что нужно зайти в маку где у нас хранятся синглтон бины и по каждому вызвать придестрой Вот и все мечта Давай дальше Вот смотри у нас есть еще мы начали говорить там про аннотации проще сервис что нам дает Ну по сути тот же самый компонент просто мы бугре антарцы сервис помечаем класс в котором у нас будет наша бизнес логика

    01:06:55 - 01:08:59

  • безусловно что это бизнес логика что это [музыка] скажем присуще конкретному приложению реализации [музыка] это реализация основная реализация нашего приложения у нас также вызывается этим мапперы и так далее так OK OK что еще что еще Ну давай тогда поговорим про вот у нас есть Spring что нам дает Spring Web а ну нужен для для построения каких-то веб-приложений веб-сервисов Когда у нас входит сервер основные нотации для работы а если мы не импортируем веб у нас там сервера не будет честно не помню не помню

    01:08:17 - 01:10:22

  • хорошо Да вопрос Вот смотри мы нас есть еще Spring Good что тогда такое спринт будет так скажем надстройка над спринг она как бы упрощает разработку приложений на самом Spring то есть там сама конфигурирует то есть сама как раз поднимает том как она получается там тогда не только самому делать но понимать да в ней уже там есть [музыка] спринг дата более удобный механизм вот смотри вот она вот мы взяли начали пользоваться спрингбутом я вот допустим хочу взять и разработать какое-то приложение сервер которым не принимает

    01:09:34 - 01:11:25

  • запроса отдает что мне отдает принимает себя что мне для написать контроллер сервис принять то есть какой-то Джейсон в request будет что-то с ним сделать и вернуть обратно какой-то результат хорошо Вот смотри Я сейчас тебе попрошу расшарить свой экран и сделать простую вещь Я хочу чтобы ты в режиме онлайн создал проект который бы принимал себя запрос Ну допустим вот я запрос какая-то там localhost 88 слэш я туда передаю любое число Да это число возвращается вот ответом прям в браузере что я могу увидеть

    01:10:40 - 01:12:20

  • То есть я скажу localhost вот пожалуйста как бы ты это сделал может демонстрировать экран как так видно да Да видно вот смотри мне нужно Spring бутовое приложение так Ну я понял Для чего Нам нужно пройти Блин ну не знаю как на Маке Может просто браузер сделать чуть меньше да Сначала мы сходим шикарная ссылка на YouTube [музыка] как он там у нас Ну да я уже просто продиктовать тоже потребуется в а базу Не надо не надо по сути [музыка] так поехали Ну пожалуйста не главное чтобы оно работало Так что когда

    01:11:53 - 01:13:59

  • я не могу Ну смотри вот у тебя есть такая мудрость Да сейчас от меня может быть ты вот был на Spring и не шалайзера Да у тебя там было сердце него зайти посмотреть как там написано этот класс вот слева у тебя есть папка у тебя там есть Да можно было каким-то Я не понимаю почему здесь не появляется что нет не то писал Так нам нужно получается обрабатывать какое-то что теперь запрос Да New Packet нам понадобится значит контроллер точка май контроллер Public так number это джейсоне будем принимать

    01:15:09 - 01:17:10

  • не Я тебе говорю у меня строка там я просто в урле передаю localhost и Слэш и число все больше там ничего не Передаем о колхоз свыше число да так по моему ничего не путаю а это passwareble сейчас мы можем сделать по своей не очень хорошо Нет ну я же тебе Я тебе сказал что собственно говоря вроде бы все вроде бы все ну давай Запускай Так что Application Так у нас он тут контроля тут Да попробуем так вроде все ОК [музыка] это браузер мог бы зайти просто написать потом уже по привычке можно здесь пожалуйста

    01:17:26 - 01:19:25

  • OK сделал значит это было нас такой микро сеанс чтобы понимать вообще что ты можешь не можешь так далее смотри вопрос тебе такой вот можешь создать отдельный класс назвать хэштет экзамен Ну да тут паблик кстати смотри Я хочу сделать такую вещь что бы у меня хочу сломать Короче говоря с хэш-сет то есть вот ну я не знаю на 700 значит такой хэштег капотом а только ключ значение Там просто какая-то константная заглушку еще нам вообще-то нужно это как перечисление там лежат только уникальные так скажем объекты

    01:19:27 - 01:21:25

  • перечисление чуть-чуть дернула Вот это и нам же у нас перечисление Ну ладно [музыка] Вот смотри у меня создай класс юзер вот у класса юзер пускай будет там privatestring name Ну и конструктор теперь смотри В чем задача твоя сейчас во-первых я хочу сделать так чтобы У меня два юзера с одинаковыми именами хранились с этим как не можем сделать можем как-то так сделать возвращаться получается объекты будут все время разные вопрос сразу тогда такое сколько ячеек будет по умолчанию 16 16 если я создам 17 объектов

    01:20:56 - 01:22:51

  • одинаковыми именами я попаду в одну из ячеек Нет так не попаду если у них коды будут разные получается там похож коду будет вычисляться баки туда куда это бег засунется если кот будут разные то Вполне возможно что они могут по разным баке там лежать 17 объектов 16 Да но он же увеличит количество размере увеличится в разы нет стоп стоп стоп стоп полный должен увеличиться там по моему когда так Ну давай продолжай я тебе пытаюсь склонить такую мысли что у меня может возникнуть ситуация когда у меня два объекта

    01:22:38 - 01:24:29

  • попадут в маху один и тот же и тогда как бы получится Так что вот исходя из твоей сейчас реализации Нет я как бы это так я думаю быстро Сколько нужно там что-то придумать сколько придумать это как бы не очень хорошо будет время можем объекта вызывать правильно Смотри короче давай пойдем простым путем вот я просто напросто хочу чтобы у меня все юзера который какого бы я юзера не создал вот с одинаковыми номера именами хоть их будет сотка чтобы они все были в сете мы можем вообще ничего не переопределять

    01:23:32 - 01:25:15

  • Просто кто класть не надо будет добавляться что ты вот сразу мне это решение не знаю [музыка] вообще да Ну все вот это была первая задача Да давай что это так от работы так хэш сет нельзя в одной цене юзер у него хорошо супер Вопрос такой как мне сделать так чтобы они всегда попадали в один надо чтобы всегда возвращался один и тот же хешкод а теперь почини и сделай так чтобы наконец наш юзер хранился нормально Ну то есть только уникальные имена у юзеров согласен OK вопрос тебе такой ты когда-нибудь

    01:24:34 - 01:26:35

  • тестировал тестирование Я сейчас тут Давай ведем что вопрос значит тогда демонстрация экрана прекращай так как пауза Ну у тебя демонстрации экрана там остановить совместное использование значит я возвращаюсь своему экрану и вопрос тебе такой вот что такое мог Stop Spy это у нас уже тестирование мог это у нас некая заглушка которая имитирует поведение какого-то класса допустим приемник тестирование очень часто используется мойки чтобы протестировать какой-то функционал вне зависимости от результата работы каких-то методов

    01:26:51 - 01:28:35

  • которые не подвязаны объектов их методов [музыка] Окей А вот ты что Ну когда работал ну ты тестировал вообще что-нибудь своей жизни вот такие виды тестов есть Юнит тестирование это тестирование какого-то Бока кода интеграционное тестирование тестирование системы и в целом то есть взаимодействие с другими объектами когда какой-то метод зависит Результаты работы другого метода еще есть было дело там сиреневым использовал скольз вопрос Вот ты говоришь что ты использовал ты говорил мог Да а как это вот джавит

    01:28:07 - 01:29:55

  • использовал что это было за библиотека еще что-то библиотека Макита по-моему создаешь мог потом [музыка] makitan то есть ваш какой-то метод и то есть его поведение что это должен возвращать так чтобы не привязываться к реализации какого-то класса хорошо Вопрос такой еще тебе вот мы сейчас уже поговорили протестирование что-то видимо все таки тестировал а плавно перейдем с тестирования тогда на SQL значит в чем у нас отличие Energy а energround это внешнее соединение у нас допустим записи из левой таблицы

    01:29:20 - 01:31:17

  • связываются записями из правой таблицы потому как записи сделать таблицы По условию соединения есть нашлась пара соединение Они то есть связываются это все записи из левой таблицы связываются записями таблицы которые проходят соединения И также добавляется все записи из левой таблицы которые не нашли пару соединений соответственно хорошо вот смотри вот у нас вообще вот SQL Да есть А для чего он Ну почему это вообще нужен Почему и создали именно SQL SQL структурированный язык запросов Он нам нужен для Даже так Давай низкий А

    01:30:31 - 01:32:18

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

    01:31:37 - 01:33:29

  • номер два Ну хорошо Да вот у меня есть машина у меня есть человек машина да у человека может быть машина значит как нам организовать эту связь у одного человека может быть несколько машин нам не интересно сейчас количество интересно связь как ты мне скажешь как ты создашь эту связь допустим у нас есть таблица Human допустим есть человек там есть имя фамилия и есть допустим колонка эта колонка допустим она ссылается на запись таблица кровать таблицы как мне уже хранятся машины допустим 2 Toyota а ключ ключ А что этот ну вот ключ А в

    01:32:42 - 01:34:40

  • чем его особенность как уникальный идентификатор А у человека получается когда он караиди это что у него есть как бы свои лишних и айдишник записи на которые он ссылается допустим когда он ссылается внешний ключ Супер Супер классно так внешне ключ и Может ли у нас быть два айдишника одинаковых да А может у нас быть два одинаковых Prime реки Нет не может быть может быть Хорошо согласен а давай чуть отойдем от Red Ну от непосредственно SQL вот у нас есть хайбер что это такое хайбернет это так скажем оболочка

    01:33:55 - 01:35:49

  • помогающая нам работать базами данных вообще-то оболочка на gbc то есть мы можем представлять так скажем нашу базу данных виде каких-то классов и объектов взаимодействие оболочка так А почему сделали Зачем эту оболочку сделали почему gbc нас не устраивала GTC Там слишком много кода нужно писать там создавать эти стейтменты Connection и каждый раз это все открывать закрывать Это не совсем удобно поэтому нам сделали такую бочку для воплощения работы чтобы могли работать далее Как как мы привыкли то есть представляете

    01:35:00 - 01:36:30

  • классы в виде таблицы какие-то сущности ты сработать как-то вот с базой данных с помощью это называется орн Ну да обжиг то есть представление наших объектов виде таблицы виде записи базы данных то есть и наоборот у нас хайверный подключен Как нам сделать так чтобы класс был Стал вот связали с таблицей допустим у нас есть в базе данных таблицы юзер мы можем в нашей Джаве создать о том что является сущностью [музыка] Давай дальше тогда вот у нас есть еще Lazy и игр что это такое вообще Это вроде как при

    01:35:47 - 01:37:29

  • selecti если у нас есть [музыка] соединение с другими таблицами Lazy нам просто выдает результат скажем то есть допустим то что находится в этой таблице а игр это по-моему То есть она делает еще нам полностью весь результат а ну подожди он делает он Join вот смотрите А так получается Ну если вот у нас есть давай класс к и класс hum но тот же пример у каждого человека там машина Вот смотри если бы у нас был бы хьюман у него там был бы класс кар это тоже является Скажи пожалуйста если бы я сделал все

    01:37:10 - 01:39:02

  • тайп лези Я бы чтобы никогда бы не получил карп [музыка] Надо подумать он то будет делать произошел он там делает Ну вот такое я начинаю работать с этим кьюманом я говорю детка если у меня Fiat Lazy это я значит я думаю А зачем тогда Ну иногда она может не понадобиться то есть информация о каких-то связанных но если мы никогда его не получим повесим нотацию lazy ну атацию вот Представь вот мы взяли создали поле карт Да взяли там на связь Ну это что это Join колам Да там и это у нас там feti да если мы делаем Гетто мы не получаем А

    01:38:16 - 01:40:14

  • зачем вообще так это поле нужно Ну в чем его смысл проделали лишнюю работу зачем-то мы это сделали Мы всегда будем получать На каком смысл зачем нам это поле зачем нам это поле если никогда ничего не возьмет по твоей Гетто будет не знаю Окей на самом деле есть базы данных Fish Type Lazy то при загрузке хьюмана мы бы не загрузили БК но если мы вызвали Get карту мы бы сделали этот Селект он бы сразу Антон у меня в принципе все у нас есть возможность сейчас два варианта с тобой я могу поделиться впечатлением о

    01:39:39 - 01:41:17

  • интервью тебе лично сказать без либо по записи сказать Да не принципиально могу по записи Хорошо смотри что мне понравилось Мне понравилось знание javacore оно на хорошем уровне я увидел что у тебя есть понимание того как работает там Map Да я вижу что ты это знаешь это мне это понравилось Мне понравилось что то что ты смог развернуть приложение ты смог выполнить Вот это простое действие это было Это было супер вот с точки зрения концепции Да там солят драки были вопросы потому что Solid Ну как сказать

    01:40:58 - 01:43:05

  • на моменте там Open Close принципе я вдруг поймал тебя на том что ты не очень понимаешь в чем его смысл вот ну там допустим а идет расшифровал Да а что еще дальше мы с тобой как бы пошли в Spring в принципе ты более менее рассказал Да это такие базовые вещи не спросил еще очень много чего Хотя хотелось но тем не менее я увидел что ты просто это знаешь может быть ты не знаешь как это все работает под капотом но какие-то принципы простые Понимаешь вот дальше мы с тобой начали говорить про тестирование

    01:42:00 - 01:43:31

  • я допустим был удивлен что не знаю что такое спай и а ты нам рассказывал значит Блин да и получается Смотри дальше что получается я еще Что мне еще допустим Ну вот я услышал когда ты сказал интеграционные тесты что это когда мы приложение все Тестируем на самом деле интеграционный тест это когда мы Тестируем группу взаимодействия с другими объектами А ты сказал как бы все приложения это меня чуть-чуть меня так резану вот дальше мы с тобой поговорили Ну еще мы говорили с тобой и как бы по ответам

    01:42:47 - 01:44:39

  • Ну у меня какое-то было такое двоякое впечатление как там она подтягивается как она не подтягивается Вот она как-то вот не было уверенности А дальше мы с тобой поговорили про скилли Мне понравилось отвечал Я задал простые вопросы не просил тебе писать запросы Хотя хотел бы но уже Время и Стекло вот и что еще нос хайбер на этом уже все уже начал быть да то есть ну знаешь что такое Но вот все уже шаг право шаг влево уже начинается чуть-чуть проблемы вот значит по итогу по итогу я как бы чтобы тебе

    01:43:48 - 01:45:28

  • сказал мне в целом понравилось твое мне понравился собеседовать и больше наверное понравилось то что ты во время собеседования мог менять у тебя как бы то есть понимал что где-то идет что-то не так да и начал размышлять где-то выходил на то есть это это больше мне было бы это больше было ценно нежели чем какое-то знание в тот же момент времени потому что я хотя бы видел что тебя живой ты можешь перестроиться и понять это Вот то есть это тебе плюс вот как бы больше ну как бы хорошо было что не придумывал что-то от себя какие-то

    01:44:37 - 01:46:08

  • странные вещи не говорил да то есть ты говорил я там не знаю это не вызывало у меня волну хейтов в твою сторону Да вот в принципе в принципе все супер [музыка] но надо чуть-чуть поработать над хайберной там и вот раз прибудут еще чуть-чуть повариться это то что у тебя сейчас является твои слабой стороной понятно что я не задал еще множество вопросов да и но мне в принципе хватило Я бы допустим тебя рекомендовал на позицию Java Junior Вот Но тут просто вопрос заключается в том какая бы еще бы это была позиция там

    01:45:26 - 01:47:20

  • если где-то было больше бы работа за б.д Я бы наверное тебя больше спрашивал Да и по работе с джипа и так далее Вот но мне пока вот этого хватило в принципе все Если у тебя есть какие-то вопросы ко мне задавай в целом вопросов можно претендовать тем что имею сейчас Да понятно что когда дальше буду развиваться вполне как бы да вот тут опять же каждый Джун Ну У всех разные представления я думаю там под каждый проект были бы свои эти вопросы так далее понимаешь такая такой момент я в принципе Я спросил то что мне близко поэтому

    01:46:23 - 01:48:11

  • спасибо тебе за это интервью был достаточно интересно общаться Вот надеюсь ты устроишься вот для зрителей говорю пока с тобой я еще останусь Всем пока ребят учитель

    01:47:31 - 01:48:05

Менторы

Специалисты своей области, которые смогут помочь вам

  • Нигма Нурия
    Нигма Нурия

    Middle .Net Developer

  • Сущенко Татьяна
    Сущенко Татьяна

    Senior Product Manager

  • Гудков Денис
    Гудков Денис

    Middle Python Developer

  • Курочкин Константин
    Курочкин Константин

    Ведущий программист

  • Гудман Макс
    Гудман Макс

    Backend Software Engineer (PHP)

  • Гребенкин Антон
    Гребенкин Антон

    Senior .NET/C# developer

  • Ахназаров Фёдор
    Ахназаров Фёдор

    Middle DevOps Engineer | Tbilisi, Georgia

  • Шорохов Дмитрий
    Шорохов Дмитрий

    Middle C# .NET

  • Жуков Александр
    Жуков Александр

    Senior PHP-разработчик

  • Мазикин Павел
    Мазикин Павел

    Middle python developer

© 2024 HireGuru. Сделано в Санкт-Петербурге с hireguru.ru