Тестовое собеседование Java разработчика #18 - Владислав Селицкий

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

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

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

    00:00:00 - 00:01:25

  • как на данный момент у меня маленький опыт работы поэтому пока что я фиксу баги фиксу баги и на данный момент я разрабатываю фиксу баги в open source каморке моя компания она разрабатывает окна source framework наверное многие зрители будут узнают его в общем о называется куба и сейчас идет мажорная версия его разработки который называется джеймс я понял хорошо хорошо скажи пожалуйста по технологическому стойку с чем работаете что используешь в своей башне на работе я повседневной работе используя spring

    00:00:43 - 00:02:16

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

    00:01:28 - 00:03:08

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

    00:02:19 - 00:04:06

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

    00:03:15 - 00:05:01

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

    00:04:08 - 00:05:54

  • когда у нас боккетти становится больше восьми элементов и количество bucket of становится больше 64 структура дерева из сами bucket и is linked листов из но из листов они перестраиваются в дерево деревья и пришел он отрабатывать . если размер массива 64 больше четырех допустим 16 элементов в массиве то мы не перестроим link от листа в трясет верно нет насколько я знаю нет хорошо а если опустить оптимизацию пришел что какая бы у нас была сложность поиска тогда линейном это ну в худшем случае даже я помню например

    00:05:01 - 00:06:56

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

    00:05:58 - 00:07:53

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

    00:07:09 - 00:08:50

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

    00:08:08 - 00:09:53

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

    00:09:11 - 00:10:58

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

    00:10:04 - 00:12:11

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

    00:11:10 - 00:12:39

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

    00:11:55 - 00:13:18

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

    00:12:39 - 00:13:53

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

    00:13:17 - 00:15:02

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

    00:14:07 - 00:15:34

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

    00:14:53 - 00:16:34

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

    00:15:43 - 00:17:13

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

    00:16:30 - 00:18:58

  • tylo у нас ничего нет как как the sky у нас а операции чтения и операции изменения они в общем la tine у нас обеспечивает от омар ность операция ну скажи пожалуйста вот операция изменения переменный этой сам один атомарной само по себе а да да потому что это переменная потому что это перитонит сейчас сейчас нет если это обычная переменная которая примитивного типа туда является хорошо смотри ситуацию то есть у меня есть процессор у меня есть оперативная память у меня и шина данных то есть допустим даже возьмем ситуацию что

    00:17:48 - 00:19:38

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

    00:18:55 - 00:20:33

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

    00:19:44 - 00:21:18

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

    00:20:34 - 00:22:10

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

    00:21:24 - 00:23:21

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

    00:22:23 - 00:24:14

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

    00:23:29 - 00:25:05

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

    00:24:18 - 00:25:55

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

    00:25:17 - 00:26:45

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

    00:26:02 - 00:27:39

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

    00:27:00 - 00:28:38

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

    00:27:50 - 00:29:21

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

    00:28:34 - 00:30:37

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

    00:29:49 - 00:31:43

  • допустим зачем мапо почему то пусть my hair set мы можем их с этим хорошо перри при словах ног и шмапы шмапы не нужно нам да да да да да не нужно нам достаточно будет фосетта они там допустим данные и что там буду хранить вот мы сейчас идем например да по циклу мы знаем что 310 у нас первые числа мы берем три вычитаем из 10 3 и варим что 7 и получается мы должны записать 3 scudo в сет наш хорошо записали также насчет мы записали не жди ты мне кажется спутал меняете по каско очень хорошо ты очень хорошо думаешь не

    00:30:57 - 00:32:46

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

    00:31:56 - 00:33:46

  • нужно столько знамени настолько значение элементов то есть мне хоть он и не и декса яндекс всё я понял хорошо это знать как след кода но она немножко арестанта так напишем код немного да давай было отлично поехали я должен быть доступ а вся вижу в зачем ну эрна и незачем просто если в худшем случае то нам пришлось бы с как-то так и все то что штамм идём и идём по нам сам [музыка] какой версия работаешь java напрашивается 8 так с . ой а надо собрать все . да и мы туда кладем какой мипо set мы туда кладем

    00:32:51 - 00:35:14

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

    00:34:38 - 00:36:30

  • есть ты говоришь что вот в момент операции у нас есть доступ к этому элементу массива на взляда есть доступ к таргет сам верно хорошо я понял я понял я понял минус ines контент собственно торги тсу это невозможно поле ну вот отлично отлично у него слове не визы не продолжать тогда мы rizups 0 кладем нам не обрезал 1 кладем сет сет вот не по и как там значение а значение из мы же мы же не можем нам же не важно вообще доставать его из этом и же сразу знаем какое-то число ну возможно как тоже можно

    00:36:02 - 00:38:39

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

    00:38:12 - 00:40:31

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

    00:39:26 - 00:41:25

  • про нормализацию база данных для нормальных форм у нас есть в целом цену 1 2 3 бойся кода 4 5 6 сколько выучилась 767 хорошо а вот социальная форма не вспомнит что такое нет я я после я после 3 не помню да я просто может у вас бы использует такие вещи ну хранения не у на я же я же вообще с базами данных работаю постольку поскольку а все это я так понял хорошо но но допустил кодак астана элемента мы создаем очень хорошо подходит выше более высокие формы а крите нормальная форма что нам не гарантирует поэтому третья

    00:40:28 - 00:41:51

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

    00:41:11 - 00:43:18

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

    00:42:15 - 00:44:12

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

    00:43:13 - 00:45:14

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

    00:44:19 - 00:46:15

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

    00:45:24 - 00:47:04

  • тогда на этом мы заканчиваем собеседование всем спасибо да да встреч удачи

    00:46:17 - 00:46:28

Менторы

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

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

    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