Турукин Вячеслав. Собеседование junior python разработчик
HTML-код
- Опубликовано: 20 сен 2024
- Подписка, колокольчик, лайки и комментарии мотивируют продолжать.
Поддержать канал: www.tinkoff.ru...
Обычно денежка идёт на книжки про питончик. Но иногда на светлое и тёмное.
Моя тележка andpronin -- стучите, если что.
Мой канал про обучению python с нуля и до мидла Андрей+=Пронин
/ @pypronin
Я в других сетях
🔗Вконтакте: CaptPronin
🔗Дзен: zen.yandex.ru/...
#python #питон #программирование #Андрей_Пронин #собеседование
Фидбек от Андрея один из лучших, если не лучший. Спасибо Вячеславу что дал добро быть этому ролику)
Не каждый решится на публикацию своей неудачи. Нужно определённое мужество. Я бы сказал, яйца у Вячеслава наличествуют
Переживал за Вячеслава, зная что он не прошел) хороший парень, я думаю у него все еще впереди, проваленные собесы это тоже необходимый опыт. В ближайшем времени предстоит тот же путь, который уже прошел Вячеслав, поэтому спасибо за это видео, оно будет очень полезным когда я буду готовится к своим первым собесам)
*Да, попасть бы ещё на эти собесы не проживая в Москве)*
@@Proborder начни прожимать в Москве :)
@@Proborder я не в Москве живу)
@@AndyPronin *Да я в целом, а не именно к Вам. Трудно сейчас джунам)*
@@Proborder джунам всегда непросто
Хороший тестовый собес! Вынес для себя полезные моменты, спасибо!
Колокольчик, лайк и тд) Рад, что полезно
@@AndyPronin сделано, шеф!)
А в целом так-то неплохо.
Да, в "подкопотню" человек явно не лез и это сразу видно: думаю, вопросы про "pk" и про "залезь в objects" именно на это и были направлены.
Однако инфу он нормально ищет: загуглил, на странице через CTRL + F. Т.е. времени много не терял. Правда, нашел не то, что нужно - но, думаю, тут можно списать на стресс.
Печатает достаточно резво, копипастит и исправляет копипасту - тоже норм.
Думаю, самый большой его минус - очень маленький "ИТ-кругозор". Тут капнуть чуть глубже, там залезть чуть дальше, тут ответить на вопрос "почему так, а не иначе, и что будет, если сделаю иначе?" + подтянуть английский + уверенность = под пивас сойдет. :D
Но вопросы на этом собесе были прям уровнем выше, чем на остальных. Думаю даже, что не стоит ожидать на них ответов от среднестатистического студента из ЯП.
P.S. А я бы задачу решил через кэш - закэшировал бы список айдишников. Да, память мы потеряем, однако значительно выиграем по скорости. Особенно если эта штука потенциально будет часто использоваться. И в этом случае еще нужно будет пересмотреть логику добавления/удаления объектов - кэш обновлять нужно будет.
А постоянно в БД лазать с order_by("?"), это, кажись, плохо.
Еще, кстати, в СКЛ есть же рандомайзер. Технически, можно на уровне СКЛ выбрать 3 рандомных элемента, без order_by. Но тут я не совсем уверен, что сработает.
P.P.S. От continue в цикле for меня слегка передернуло. :D
Спасибо за работу, очень полезный материал! (Тоже готовлюсь к собеседованиям, реальный опыт год).
Каждый новый ролик думаю, ну всё теперь Андрей спросил всё, что есть, дальше я на всё отвечу))) ан нет))
Некоторые мысли, которые мне приходят во время просмотра:
1) когда человек что-то быстро отвечает, вы часто говорите что-то вроде "ок хорошо". Непонятно, правильный ответ или нет. Если правильный, будет не лишним это проговорить): и зрителю понятно, где правильно, и человека подбодрить))
2) если человек что-то не отвечает, вы довольно часто говорите "Давайте что-нибудь попроще". В педагогике это bad practice. Если ответ простой, можно его проговорить (для зрителей). "попроще" или "ну хорошо я подскажу" это демотивация участника. лучше без мгновенной оценки подсказывать, или если уж совсем плохо, то "давайте перейдем к другой задаче, а к этой вернёмся" - абсолютно корректно, имхо.
Супер контент, супер примеры, спасибо что выкладываете это, надеюсь будете продолжать ;)
Спасибо за обратную связь. Полезно. Постараюсь учесть
@@AndyPronin спасибо вам за ролики, смотрю с удовольствием ;)
Андрей, большое спасибо за видос! День уже удался))
рад, что нравится. Сегодня будет сложный стрим
Редко пишу комментарии. Но иногда раздражают все эти требования к кандидатам и некое пренебрежение, что касаемо уверенности, откуда ей взяться, без реального опыта?
первый собес, человек волнуется, бедняга, воду пил каждые пару минут, хотел только подливать))))
Проведите с ним собес через год реальной работы, будет та самая уверенность, видно же, что нормальный адекватный парень и перспетива у него есть, были кандидаты и похжуе. Так что удачи тебе, просто рынок IT сейчас перенасыщен и работодатель хочет готового специалиста за минимальный бюджет ввиду большой конкуренции. А так отличный джун, молодец, найдешь себе работу однозначно.
Уверен, что так и будет. Надеюсь, ещё сделаю видео с ним про то, как ему сделали оффер
Так если рынок переполнен, как он найдет работу то? И переполняться он будет дальше, спрос падает, а предложение растет.
@@АндрейСидоров-ц3ж по рынку в понедельник попробуем стрим записать. С ответами на вопросы
@@AndyPronin ждемс
@@АндрейСидоров-ц3ж я думаю когда кандидат Уверенный, человек со Знаниями, то его возьмут на фоне будь 100 кандидатов растеряшек, будь их 1000.
Моё мнение, что у Екатерины слишком завышенные требования к человеку, который ещё не в отрасли и пытается в неё попасть на начальную позицию.
По мне, так Вячеслав достаточно достойно на всё отвечал, касательно Soft.
И откуда взялись эти 85% - он же не на Project Menadger идёт, а на разработчика?
Дорогая всем Катерина, если прочитаете данное сообщение,
Поздравляю с днём рождения!!
Крепкого здоровья, Вам, Вашей семье!!! Каждое собеседование с вами заряжает позитивной энергией, подталкивает учиться ещё усерднее ,
Вы прекрасны, счастье и процветания 😇😇😇
Чет дама слишком буллингом занимается. Почему то выбирает наиболее грубые формулировки вопросов. Ей не хватает формы мусора и лампы которую она бы поворачивала в лицо соискателю. Можно было бы помягче выбирать выражения, а то это какой-то фемдом и тест на стрессоустойчивость.
Да она типичный манагер по персоналу. Захейтила кандидата по умолчанию и скинула решение на технаря
+
Я в работе для таких кейсов использую BETWEEN вместо OFFSET, он работает быстрее поскольку отрабатывает оптимизация субд (бинарное дерево по первичным ключам). А для получения рандомных данных можно использовать ORDER BY RAND() и лимит, тогда снова отрабатывает оптимизация, и выбирает рандомные записи до достижения лимита. Есть конечно расширения которые делают это лучше. Но стараемся не тянуть зависимости, тем более база мальенькая на 2кк строк. Вся аналитика же построена на кликхаусе, там репорты для клиентов генерируются в свободное время, так что производительность не играет роли.
Верно понял, что ты описывал вот это решение:
Item.objects.order_by('?')[:3]
Благодарю за Джанго
Как раз с ним не сталкивался ещё ☺
Представляю если я буду проходить собеседование, я когда начну волноваться это будет капец 🥲,
Зафиксируй стул, что бы не крутился.
@@AndyPronin , у меня обычный на 4 ножках, если только прибить к полу 🤣, а если серьёзно атмосфера с видео очень сильно передаётся как от Джуна Вячеслава, его волнения, так и полное спокойствие Андрея, просто нереальное), так же конечно же великолепная и позитивная Катерина 😊
@@Maine__Coon__1 а еще у нее сегодня ДР)
Вы тоже после просмотра ерзаете в кресле и говорите ну, эээ, ааа и то есть :)? (я да)
12:34 темное нефильтрованное? Простите))))) Спасибо за видео!
SELECT * FROM table WHERE num_value >= RAND() *
( SELECT MAX (num_value ) FROM table )
ORDER BY num_value LIMIT 1
Все думал ,и вспомнил,чутье мне досказало у нас же есть генераторы,они как раз решают данную задачу,по времени быстрей ,плюс сам код сокращён,и в памяти занимает мало места для вычисления ,да тут более подойдет генератор,сейчас что нибудь напишу,чтоб проверить ,хотя попробую пример переписать,должно получится
Софтовый фидбек лажа какая-то. Конечно блять люди идут хоть куда нибудь чаще всего на данном этапе. Зачем этот самообман?
Я джавист, на питоне ничего не писал, но как по мне, здесь два варианта:
1. Два запроса в БД: первый возвращает все существующие id, второй идёт опять в БД и вытягивает n записей по указанным id из первого запроса. В принципе, я думаю, джанго предоставляет какой-то функционал вроде спринговой пропагации транзакций, чтобы использовать одну и ту же транзакцию в разных методах, общающихся с БД, так что потенциально это не самый плохой вариант с точки зрения оптимизации, как по мне.
2. Один запрос, который сразу возвращает случайные существующие записи, но придётся повозиться с SQL.
P.S. Да, вариант с лимитом и оффсетом наверное получше будет, чем певый.
Один из вариантов решения - генерить список из трех случайных айдишников, существующих в базе и далее по ним получать три объекта из БД, используя оператор .
Отрабатывать должно быстро, тк получение по индексу будет, но минус в том, что два запроса нужны будут, хоть и не самые дорогостоящие)
А как генерить список?
@@AndyPronin нужно хранить в отдельной табличке размер списка, обновлять его с помощью сигналов при изменении таблицы содержащей список
Надо срочно что-то с курсом делать, просто такие слабые ученики слов нету. Просто маркетинг плати деньги ревьюеры вытянут тебя за уши.
Нельзя человека выучить против его воли
Если они поставят жесткие рамки, увы, заработать не получится. А так, да, все зависит о человека, кто то идет меня там научат, кто то идет я там научусь. Только вот тех кто "меня там научат" очень много стало.
Андрей , возьмите на работу))
Увы. Пока нет вакансий(
По поводу задачи с выборкой 3х рандомных записей из бд. Условие записей много (3000000 и более и некоторые из них могут отсутствовать) , а если взять максимальный last_pk = Item.objects.last().pk . Затем нам нужно рандомное число random_number = random.randint(1, last_pk) . Пишем функцию которая будет делать запрос в бд Item.objects.filter(pk=random_number) . Если запись существует добавляем ее в список , если запись пуста повторяем с другим рандомным числом. + добавим проверку уникальности списка. и по итогу возвращаем список уникальных существующих id
А если много пробелов?
А зачем так сложно? Есть же order_by(‘?’)[:3]
А если посчитать общее кол во всех сущностей в бд(objects.count()), запихнуть это в переменную num
Далее с помощью randrange найти случайное число ДО этого offset 3 раза. Ну, типо offset1,2,3
После - последовательно написать 3 запроса
Item.queryset[offset].first()
По сути, будут 3 запроса в бд, но все будут дешевые, тк мы будем брать сразу же первую сущность после того как применим offset
Пока писал, кажется, понял какую ерунду написал.)
Увы)))
ага. решение не выглядит норм
сомнительное конечно решение приветствовать "звиздеть", что знаешь, когда понимаешь, что плаваешь в ответе ...
возможно стоит обратить внимание на "IBM" специалистов - те прям уверены в своих знаниях - правда боинги потом падают...
HR вообще просто по списку прошлась
На мой взгляд парень сообразительный и можно работать
что за компания?
Вот что бы я посоветовал этому челу. Так это просто хотя бы задавать себе вопросы. Допустим я бы спросил что нужно видеть юзеру, если у нас в списке 1 статья. И отталкиваясь от требований писать логику кода. А тут как будто его заставляют писать, а не он сам думать хочет. Ну про 60к конечно, загнул
по поводу решения, что если ?
1) объявить моделях класс ItemManager(models.Manager)
2) в нем def get_random_items(self):
...параметры выборки...
query = f """ RAW SQL request """
with connection.cursor() as cursor: cursor.execute(query)
row = cursor.fetch()
далее возвращаем что нужно через objects ....
3) Модели Item добавить
objects = ItemManager()
4) во View нужно просто вызвать этот кастомный метод
random_items = Item.objects.get_random_tems()
.....
Надеюсь я понятно изложил идею.
Так же как вариант objects.raw(), но не пользовался таким, возможно это даже проще.
На мой взгляд, идея должна быть легкой для БД, и не допускает исполнения никакой логики во Views.
Как это позволит получить случайные элементы не перемешивая таблицу? Сама идея с менеджерам моделей ок
Делайте ваши ставки
А если так попробовать, конечно будет плохо работать, если много удаленных элементов
def get_random():
max_id = Item.objects.all().aggregate(max_id=Max("id"))['max_id']
count = 0
list_id = []
while count < 3:
pk = random.randint(1, max_id)
if Item.objects.filter(pk=pk).exists():
list_id.append(pk)
count += 1
return list_id
По моему мнению, Екатерина в начале подзадушила Вячеслава
Спасибо за собеседования, интервью и Лутца! Сам уже прочитал, но какие-то моменты иногда забываются, поэтому использую видео по нему как краткий справочник.
Такой вопрос:
На тестовые собеседования могут попасть только студенты Яндекс Практикума?
Рад, что наравится. Да. Пока так. Возможно, в феврале это изменится. Следите за каналом
Видно чувак волнуется)
Здравствуйте, на счет задачи про получение 3 случайных элементов из БД, я бы сделал так - 1) Получил бы максимальный индекс элемента 2) Сделал бы просто 3 перестановки цифр этого индекса (по алгоритму, чтобы сгенерированное число, не превышало максимальный индекс) и потом уже сделал запрос на получение этих индексов из БД.
Моя квалификация - ученик, 1 курс.
Максимальный индекс не равен количеству записей, может быть такое , что несколько промежуточных записей удалены, есть каунт, для подсчёта количества записей, в остальном согласен, сделал бы так же.
А если индекс попадёт на удалённую запись? Из БД можно же удалять?
@@AndyPronin перед добавлением можно проверить на .exists(). Получаем максимальный id, генерируем один рандомный, проверяем наличие, добавляем в словарь.
Запрос к базе это:
1. Махинации в ОРМ..
2. Собственно сам запрос к главному процессу СУБД.
3. Создание нового процесса для исполнения запроса.
4, Планирование запроса.
5. Наконец само исполнение.
6. Передача результата.
7. Закрытие процесса.
8. Махинации в ОРМ..
Отсюда: желательно уложиться в один запрос.
@@xewuss3750 предположим в таблице несколько миллионов записей, мы делаем фетчол, по вашей логике это более рационально чем сделать 3 запроса с конкретными айди? Хотя я не предлагал делать 3 запроса, но мне кажется даже в этом случае будет лучше. А вообще «or» никто не отменял.
Генерируем 3 рандомных числа в рамках диапазона длины списка rand_items. Затем выбираем по полученным числам в качестве индекса 3 объекта, создаём лист из этих объектов. Во время создания листа либо во время генерации чисел (используем любую структуру данных для их хранения, мы должны проверить что либо число уникальное, либо объект уникальный). Для крайних случаев когда длина списка меньше 3 возвращаем сам список. Рендерим полученные объекты в шаблон
а если id выпадет несуществующий?
@@AndyPronin вы правы не идеальный метод, обработать несуществующий id, думаю, тоже можно, только сложность алгоритма будет расти.
@@AndyPronin через цикл while и try/except ищем существующие, добавляем их в список. Как набираем 3 шт - выходим из цикла
Можно ещё перед этим всем из БД вытащить максимальное значение pk
Интересная штука, я один стопаю видео, отвечаю, а потом запускаю чтоб посмотреть как я ответил?
Думаю, нет) Примерно так и должно работать
"Уверенности не хватило", ну а как без волнения на собесе...
Сижу тут,не подписан,и сижу нахаляву смотрю,надо исправится)
И колокольчик не забываем)
@@AndyPronin Ой забыл)
Что по поводу такого варианта?
использоваться annotate(count=Count(...)), в values_list помимо 'pk' положить 'count', сгенерировать через рандом число от 0 до count - 3, и взять срез 3 элементов, начиная от этого рандом элемента. Кажется, это должно отработать быстрее, чем вариант с сортировкой.
При count < 3, очевидно, упадёт, но это нюансы, можно обработать -_-. Просто интересно, приняли бы такое решение или ищем дальше )
UPDATE. Тут вообще не то считал, ниже в комментах поправил
Прикольно. Но количество элементов это не последний id же?
@@AndyPronin Да, понял косяк.
Что-то такое можно
count = Item.objects.all().count()
rand_index = random.randint(0, count - 3)
rand_articles = Item.objects.all()[rand_index:rand_index + 3]
Но это будет выполнено за 2 запроса, мб можно и за один
@@gvadellupa9335 эм.. А если id не сплошняком? Например, како Н будь Фильтр типа is_published=True
@@AndyPronin мб вопрос понял неправильно, но что нам мешает вместо all() написать filter(is_published=True). Просто изначально выборка была из всех записей
@@gvadellupa9335 предположим, что у нас из БД в выборку попали записи с id 1, 2, 10, 50. Count будет 4. И индексы не сработают, как планировали
Это у всех такие зарплатные планки с учётом того, что ты почти ничего не знаешь? (без обид) И рынок действительно готов таких за такие деньги переваривать?
В целом, джуны так и стоят. Но Вячеславу подкачаться нужно для оффера
Охх, я бы, наверное, сознание потерял, если бы на меня так серьезно смотрели, как Андрей вначале на Вячеслава))
Добрый день, Андрей.
Что если изначально использовать метод first и last, чтобы определить первый и последний id. Затем запускать random из range(first id, last id) и выбирать 3 значения. Пробовать извлекать по сгенерированным id. Если нету чего-то, то ещё раз запускать random пока не найдутся все id.
А если есть удалённые записи, или нужно фильтровать? Опять же, первый и последний элементы - значит, мы должны каким то образом сортировку сначала сделать?
@@AndyPronin а записи не хранятся по возрастанию id?
@@РосликДмитрий по умолчанию Джанго не сортирует, насколько я поиню
Андрей, а вы принимаете непосредственное участие в проработке курса ЯП? Заметил что вы про недавнее изменение в теории по Джанго что то сказали.
До недавнего времени принимал. Курс будет значительно обновлен
Pr'am kak na Fortrane napisal for-loop, zavershil 'continue' 🙂
Екатерину уберите, спасибо
Если дороги операции чтения по определенному столбцу, b-tree по нему проставить не сильно поможет?
Перемешивание дорогое. Чтение с lIMIT - нет
Влюблен в Екатерину
Странный вкус. Либо прыщавый онанимист, либо ищешь мамку себе.
@@ivanabdullaev859
Грубовато
@@ЕгорГуторов-р7я если этих красавиц ейчарш вовремя не осаживать, они со своим креативом зае... любого работника. Эта как раз из таких. По поводу вкуса я лично за симпатишных молодых герлов, а не за бесполезных теток под 40.
А random.choices только уникальные берет или могут быть повторы?
:) посмотрите в доке. А вообще например на степике в курсах по пайтону многих этот модуль разбирается с задачами. Помоему случайное число из списка берет. Может ошибаюсь
Могут быть повторы
Андрей , как вы относитесь к питон программистам которые используют Виндоус как мейн ос ? И не знают вообще в Линукс?
Я к ним не отношусь) по факту, пайчарм и вскод позволяют вполне комфортно и на винде работать. А что подразумевается под знают линукс?
Программирование - это писание символов. Какая разница, в какой ОС будет открыт редактор текста?
приветствую! проект "джун на прокачку" закрыт? последняя серия 10 месяцев назад
Он нашел работу девопсером. Идея взлетела, но не так, как планировали.
@@AndyPronin спасибо! Не думаете продолжить проект с другим человеком?
@@SavenkoRoman если найду на это силы и время. Очень затратное мероприятие оказалось
Здравствуйте. Не так давно на вашем канале. Скажите, это же не реальное собеседование кандидата в компанию?
Это - нет. Тестовое
Понял спасибо
Вроде на собеседование, а вертится на кресле. Смотрится подрастково и не серьёзно
Нервы и волнение. Вполне объяснимо.Посмотрит на себя ос стороны и сделает выводы. Для этого и сделано
Комментарии ютуб удаляет или где?
По какой то своей внутренней логике трет. Да
@@AndyPronin я там ссылку на хабр кидал. Не очень популярная статья, но автор приводил пример, что SELECT * FROM ,,, ORDER BY RAND() LIMIT 3 , выполнялся у него 40 секунд и он придумал запрос, который выполнял аналогичную задачу за пару секунд.
Что тайм менеджмент относится к аналитическому складу ума?
Я бы заскочил к вам на собеседование.
Ну... Пока для студентов Практикума, боюсь с небольшими исключаниями. Возможно, в дальнейшем что-то измениться.
Зачем нужно изначальн собеседование не по технич. части , кому это интересно блин ?
надо же познакомится с человеком? + софты тоже важны для трудоустройства