Разбор тестового задания на PYTHON JUNIOR с окладом 80000 рублей
Вставка
- Опубліковано 22 лип 2022
- В этом видео я хотел бы разобрать реализацию тестового задания на языке python для компании Avito. Простое тестовое задание, в котором хотят проверить, насколько кандидат владеет знаниями по работе с базовыми библиотеками.
Личный телеграмм канал, где публикую личный опыт и советы начинающим разработчикам:
t.me/+4CvMjNYRaiMwZDky
Ссылка на решение с кодом:
github.com/davdeenko/python-t...
Ссылка на документацию poetry:
python-poetry.org
Телеграмм канал, где я публикую личный опыт и советы начинающим разработчикам:
t.me/+4CvMjNYRaiMwZDky
Спасибо очень информативно. Очень нужно побольше таких видео
офигеть,вот это задачки
Продолжайте выпускать подобные видео. Очень качественно и информативно)
Спасибо!
Завтра новое видео)
@@pythondevv отличный демотивирующий ролик !!
Спасибо тебе, появилось понимание над чем нужно работать
Дмитрий, обязательно пили про асинхронщину!
Большое спасибо за видео:)
в планах :)
Спасибо , познавательно, интересно
Посмотрел с удовольствием, много полезной информации! Планируете в будущем снять видео о асинхронном программировании? К сожалению мало качественного материала на эту тему.
Да, точно будет )
Хорошая подача. Редко пишу комментарии, но тут поддержу видео, качество на уровне, приятно смотреть
Ожидал лайв-кодинга, а тут все уже сам решено и объяснение как делал.
братан это ТОП. это то что нужно.
спасибо тебе огромное.
Отличный формат 👍
Но есть критика:
1) зачем запутывать джуниоров pyenv, poetry и копанием в натройках IDE. На этом уровне этого не требуется. У джуниоров и так голова пухнет, а тут еще лишняя информация, у многих от этого руки просто опускаются.
2) 22:53 продолжать работать как ни в чем не бывало при некорректных входных данных это ооооооочень плохая идея. В такой ситуации правильнее выкинуть исключение а-ля raise 'expected square matrix' , а не возвращать пустой список. В реальной разработке не бывает просто функции, это будет частью громадной системы и если что-то пойдет не так, если какой-то из кирпичиков отработал не так как ожидалось, то лучше сразу остановиться. Даже если идти вашим путем, то исполнение странное. Зачем выкидывать ошибку, тут же её ловить и логировать? Почему бы просто сразу не залогировать тогда, зачем кидать её вообще?
3) 43:55 Логирование на основе HTTP кодов очень скудное. По таким логам ничего понятно не будет, какой в них тогда толк. Я про скудное "Client error"/"server error"
Там еще похоже 500-ка некорректно обрабатывается. Так как условия 400 500. Т.е. при status = 500 считаем, что все хорошо ...
Ага: сам кинул исключение, сам же его поймал строкой ниже, чтоб залогировать сообщение которое сам же и передал в исключение...
Что то мне плохо стало и температура поднялась во время просмотра
Заметил хорошую литературу. Талиба черный лебедь и разумный инвестор. Шикарный выбор.
Отдельное видео по Poetry - да, пожалуйста
Сделаю!
Сделал :)
ua-cam.com/video/1bf41pPVxWU/v-deo.html
Видео огонь! Делай больше таких, начинающим подобный контент очень нужен)
Видео в большей части просмотрел диагонально, потому что многое знаю и нет смысла детально смотреть. Больше смотрю для дополнительного опыта и чужого взгляда на решение задач. Но так же как ребята уже заметили, местами Ты конкретно начинаешь перегружать молодой мозг, тем же poetry(копанием внутренни ide и настройкой самого poetry).
Также заметил, может возьмешь на вооружение: так как Ты тут в большей части являешься учителем и примером, учи ребят с 0, чтобы, к примеру, сначала проработать алгоритм, расписать его в голове/на листке(в блокноте), а потом писать код, ведь в программирование главное алгоритм продумать, а потом уже нарисовать его кодом.
Я хоть являюсь middle/middle+ в python, но меня очень удивило, что в тестовом задании на Джуна от него требуют асинхронность О_о и требования по написанию выходных данных в функциях и прочие мелкие моменты.
Удачи в развитии канала и контента. Подписка)
Как щас говорят, что ищут мидла на зп Джуна)
Соответственно и вопросы для мидла
Круто, можно больше таких видео, и где брать такие задачи ?
Codewars
На самом деле любое тестовое задание это мини проект выполняющий узкую задачу, как тут. Я бы рекомендовал во время обучения сразу же пытаться что-то написать по теме уроков. Что-то реально работающее, например бот в телеграмм или маленькое веб приложение. Тут самый важный этап - чтобы потом кто-то опытный проревьюил это решение и указал на недочеты.
Так же есть мысли откликнуться на джуниор позиции в разных компания и разобрать больше реальных тестовых, такие как в видео.
@@pythondevv хорошая идея по Джуниор вакансий, было бы круто
Такое качество записи, но так мало фолловеров... Успехов, парень, отлично снято!
Однако на твоём месте я бы немного поработал. Не хватает тихой музыки из библиотек Ютуба + можно было бы гринвол купить, чтобы камера не отнимала на себя много места
Спасибо! Музыку обычно вставляю, но в этом видео забыл. А что такое гринвол?
@@pythondevv гринскрин, который убирает фон, но как по мне итак хорошо. Да и без музыки воспринимается легче, тут на вкус и цвет
Если на ютубе под видосиками такого характера будет отображаться много просмотров, то я задумаюсь о том, что мы живем в симуляции от какой-то нейросетки на питоне. Люди ведь заинтересованы в развлекательном контенте, а не в практическом образовательном.
@@pythondevv зеленая ширма на фоне, благодаря которой видно только тебя
Дмитрий, подскажи, на какое время рассчитаны такие задачи во время реальной работы на компанию? Т. Е. От момента, когда задачу определили, до её полного решения ( включая время на поиски решения)
Все индивидуально, зависит от задачи, твоего уровня и твоего собственного темпа. В agile (методология разработки) есть понятие story point. Бывают задачи на 1 день, а бывают на 2-3 дня. Обычно, если задача занимает больше 2-3 дней - ее декомпозируют. Так проще следить за прогрессом, особенно у джунов. Такая задача должна занимать 1-2 дня рабочего времени у джуна. Человек с опытом должен решать такое за несколько часов.
00:00 Intro.
00:50 Тестовое задание.
03:33 Давайте начнём.
05:00 Настроим интерпретатор (Poetry).
09:29 Едем дальше. Шаблон решения.
10:35 Тесты
11:38 Шаблон решения.
28:17 Напишем код. aiohttp
30:32 prepare_matrix
34:55 test prepare_matrix
37:14 Логирование
38:20 travers_matrix
40:15 get_matrix
42:20 Catching net errors
47:07 Про тесты
47:40 docstrings
49:32 Запуск кода из терминала
53:20 Проверка кода статическими анализаторами
54:32 Завершение
54:50 Обсуждение решения
Если ставить эти тайм коды в описание к видео, а не комментом, то ютуб сделает правильное "разделение" блоков видео. Это помогает визуально оценивать структуру видео и быстро искать нужные блоки.
С двойным разворотом и рекурсией красиво, но как додумались для этого, или где-то увидели такое решение? (Интересно бы прочитать ход мыслей которые к нему приводят). У меня (как и у большинства, думаю) довольно длинная функция с ручными проходом, сменой направления и обновлением границ снизу/справа/сверху/слева
Привет!
Давай разберем функцию traverse_matrix по частям:
1. matrix = list(zip(*matrix[::-1]))
- эта строчка с использованием функцинаольного подхода.
- matrix[::-1] разворачивает вненший* список, то есть список строк матрицы, разварачиваем в обратном порядке (с помощью ::-1)
- с помощью оператора * (звездочка) мы "распаковываем" список чтобы передать его в функцию zip
- функция zip составляет новые строки матрицы беря каждый элемент из каждого списка превращая в новый список. Получается сначала список сначала из всех нулевых элементов, потом из вторых и так далее. (лучше почитать доку docs.python.org/3.3/library/functions.html#zip)
- Теперь если вдруматься - то такими действиями мы просто повернули матрицу по часовой стрелке
2. output.extend(matrix[0][::-1])
- matrix[0] - берем первую строку, [::-1] - разворачиваем ее
- Так как мы обходим исходную матрицу против часовой стрелки, нам нужно взять первую строку в обратном порядке в развернутой матрице (развернутой на предыдущем шаге). Если визуализировать, то понятно, что сначала мы поворачиваем матрицу, потом срезаем первую строку, затем переворачиваем эту строку, чтобы получить первую сторону обхода против часовой стрелки исходной матрицы.
3. traverse_matrix(matrix[1:], output)
- Вызываем функцию рекурсивно с матрицей без первой строки (потому что мы ее уже добавили в ответ)
Так же обязательно нужно отметить, что такое решение хорошо работает только на маленьких матрицах. Это так - потому что у него плохая ассимптотика. На каждом шаге рекурсии мы по факту создаем новый объект с новой марицей, выделяем память и тд. Так что ваше решение, если оно не создает матрицу заного может оказаться совсем не хуже в задачах с большими матрицами.
@@pythondevv спасибо за ответ! не, как она работает я понял, разобрав на примере (и про асимптотику тоже подумал, что хоть решение в лоб и длинное, но должно быть эффективнее т.к проходит 1 раз и не создает новых вызовов ф-ции -- про создание объектов не подумал кстати), изначально интересно было (и вопрос был) -- как додуматься до такого решения, не помните какие мысли к нему привели, или увидели его на литкоде когда после сдачи открывается список других решений?
@@user-jl3wg4gl2v на самом деле правда решал эту задачу когда-то давно, в своём первом курсе по python на stepik :) Почему заполнил именно это решение?
Я хотел написать в пару строчек через слайсы, а с помощью них можно разворачивать и отрезать куски списков. Я легко могу срезать первую строку, но мне нужен левый столбец. Поэтому и надо развернуть матрицу. Как-то так я к этому и пришёл.
А вообще да, если хочется щёлкать такие задачи, литкод и ему подобные сайты - лучший тренажёр.
Подушка в верхнем левом углу топ)
Это мерч с внутренней конференции по python в нашей компании. Считай лимитированный товар :) Кстати, у вас классный канал :)
@@pythondevv Спасибо)
Да, можно по асинхронщине видео, спасибо
Сделаю!
А я то думал print('Hello world!') и погнали😃
А мог бы сделать road map по python для новичка?было бы очень полезно,потому что не нашел на ру ютубе
Привет!
Это будет как раз одно из следующих видео, я уже пишу сценарий для него!
3:50 Или просто в интерпретаторе импортировать this )
Матрица - это прямоугольник из чисел , всё таки)
А квадрат, это не прямоугольник? :)
@@pythondevv Всякий квадрат то это бесспорно - прямоугольник, но не всяк прямоугольник - квадрат. А матрицы бывают не только n x n размерами, но и m х n. Понимаете о чем я?
@@user-qk3em5oq8d Да, матрицы бывают m*n, этого вроде бы никто не отрицал
Ребят вопрос, я прохожу курсы по Python на Stepik. Всякие ООП, фреймворки, базы данных ещё не проходил. Что мне необходимо изучить, чтобы решать такие задачи?
На самом деле тут ответ простой - начать решать такие задачи. А все, что не понятно надо гуглить)
Я прохожу обучение на курсах,омни уже скоро к концу подходят по пайтон-разработке,но там даже близко нет того,что вы делаете на данном видео. Никакого асинхронного программирования,никаких тестов,никаких матриц. Где и как можно подготовиться хорошо на уровень джуна. Где эти знания получить в достаточном объеме
Итальянец. Спасибо за видео.
Итальянец??)
@@pythondevv в начале руками машете, как итальянцы. Вот и вспомнил про них))
Где вы находите вакансии на джуниоров? Мне почему-то попадаются вакансии уровнем не ниже миддла.
Добрый день! Да, на джуниор позицию сейчас найти что-то и правда не просто. Надо мониторить рынок. Тут несколько факторов. Хочу записать отдельное видео на эту тему. На senior позиции мне каждую неделю по 2-3 вакансии приходит, при том, что я ничего для этого не делаю.
@@pythondevv подписался чтоб не пропустить
А на питоне всегда такие легкие тз для джуна? Просто я как c# unity dev привык видеть вещи на порядок сложнее)
Это одно из самых простых. При этом решение тестового задания не гарантирует трудоустройство. Еще нужно пройти собесед. Если удастся такое тз - это почти гарантированный билет на интервью.
@@pythondevv О, я то думал что это примерно среднее тз. Понятно что прохождение тз это не гарант трудоустройства, его ведь еще должны заревьюить
@Тот самый Андрей Ну учитывая что я щас мидл вполне возможно)
Это на Джуниора? Завязываю с обучением
Сяп
python так сделать, что не красиво не напишешь. а напишешь работать не будет. Задание не сложное вроде)))
Когда код пишет явно не джун, чтобы показать типа решение тестового для джуна - это не корректно.
Да можно много чего узнать, и я сразу начал искать poetry, а потом в коментах нашел - что poetry джуну не нужно. А время и главное структура поэтапного изучения потеряна. Да в свое время я бы к этому пришел. Но еще есть что изучать и без него.
Когда-то смотрел канал по тестированию, где толковый джун начал записывать свое реальное обучение на рабочих проектах. И видно, как он с каждым новым видео больше изучал. То что у него на работе нужно было, а не для галочки, или это понравится дяде, который будет смотреть ваше тестовое.
Так-с начинаю смотреть видео, начал учить Пайтон 4 дня назад, посмотрим-с, получу я роботу или нет.
успехов!
Ну как успехи -то?)
@@user-ur3mc6hb5d даже вспомнить не могу, когда это я учил Пайтон😁
Народ, кто может подсказать? Где можно найти начинающего программиста для совместного проекта в портфолио?
Ответил в телеграмм канале)
я задание решил легко, но с тестами поработал плохо. То есть вообще, я тесты не пишу, мне это сложно. Нормально для 16-ти лет?
Для 16 лет это потрясающий результат. Тут взрослые люди на работу так устраиваются, решая такие задания.
Тесты придётся выучить, без них не написать ни один серьёзный проект
@@pythondevv я рад если всё так и есть
Дима, сколько тебе лет?
26)
@@pythondevv Когда начал заниматься? )
В универе :)
Продакшен опыта чуть больше 4х лет сейчас.
Отличное видео. Очень нужное и познавательное. На 5+. Но английский автору можно немного подучить. Улыбнулся от "This function used to get text" и некоторых других ошибок.
Можно забить на эти ошибки. В англоязычных компаниях никто не обращает на них внимание и они не мешают общению. Главное чтобы тебя понимал собеседник.
Спасибо за фидбек! На самом деле я уже больше 4х лет работаю в международных компаниях. И совсем не испытываю проблем с коммуникацией, чтением документации и даже презентациями продуктов на английском. При этом я изначально хотел использовать его по минимуму в этом видео, чтобы не нагружать зрителя, чуть переволновался (потому что был сосредоточен на задаче) и допустил такие ошибки с написанием и произношением :)
На самом деле хочу сделать отдельное видео по поводу английского для программиста. Спойлер - без него ничего не получится :)
Товарищ 5 секунд менял elif на else....
Ну норм видео в целом конечно.
С кем не бывает)
а это точно на джуна?
Точно :)
Стажер / джун
Не думаю что это для джунов...минимум миддл
джун - стажер :)
Какое же тупое условие задачи. Получает матрицу и возвращает list[int], что должно содержаться в этом листе хз.
Ошибку на = 500 забыл проверить
Только сейчас заметил, что знак равенства там потерял, спасибо :)
Вроде бы и умеешь такое решать, а всё равно, первую работу найти не можешь....
Искать работу и уметь работать разные навыки, к сожалению)
@@pythondevv с этим я соглашусь.)
Как же это все криво и через жопу в питоне...
На мой взгляд очень даже красиво. А я много на чем умею код писать :)
Много слов говорит
портит видос то что вы что то пытаетесь на инглише вставлять, прям невозможно смотреть. если вы про тестовое задание то про него и говорите. нафиг эти английские звуки?
Привет!
Да, уже отвечал где-то, что изначально хотел вообще без английских терминов, но иногда просто не знаешь слова на русском + из-за специфики работы уже так привык.
А по поводу произношения - оно такое себе, сложно было много говорить на камеру и совершенно не следил за произношением и акцентом.
Следующие видео будет как раз про английский и почему он нужен и почему без него никак.
Если обычный, нормальный человек прочитает описание функции traverse_matrix (получает матрицу, возвращает traversed matrix и еще какая-то help variable you don't need to provide) то он и будет использовать её как: result = traverse_matrix(matrix, []) будет очень сильно удивлён результатом, ведь функция всегда возвращает None. Внезапно.
Решение идти в рекурсию очень красивое и остроумное, но упадёт на матрице 100*100, а это не так и много. Я не "играю в Гугл", коллекция в 10К(и даже миллион) элементов вполне рядовой случай в реальной жизни. Еще на каждом шаге рекурсии у вас создаётся новая коллекция, т.е. на матрице 4*4 у нас дополнительно сделали 8 коллекций, на 100*100 будет 200 (а в 1K*1K - две тысячи?), каждая со своей копией (части) данных и все коллекции "живые", потому что в методах, которые в рекурсии. Что быстрее наступит, стек оверфлоу или аут оф мемори я сходу не скажу, но обычный тупой цикл отработал бы на "ура" даже, наверное, на 1000*1000.
Согласен, все верно пишете. Но такое решение я добавил для того, чтобы видео на час не делать. Там еще пара упрощений. И я даже оставлял коммент в видео об этом :)
traverse_matrix - просто жесть. абсолютно нечитабельный код. при это еще и рекурсивный. интересно сработает он вообще с массивном 1000 на 1000 размером например или больше
Я как раз прокомментировал этот момент в видео, пересмотри :)
Решение в лямбде написанное за 5 минут , где мои 80к
s = [
[10, 20, 30, 40],
[50, 60, 70, 80],
[90, 100, 110, 120],
[130, 140, 150, 160]
]
get_matrix = lambda mat: (lambda out: [mm := lambda m, l: [m := list(zip(*m[::-1])), l.extend(m[0][::-1]), mm(m[1:], l), 0][-1] if m else l, mm(mat, out), out][-1] )([])
print(get_matrix(s))
С таким бы решением вы бы не прошли у меня интервью :)
Я не гуру в математике, но матрицы там бывают не только квадратные, в общем случае прямоугольные [m x n] где m != n.
Вроде бы никто с этим не спорит)
@@pythondevv
01:36 - ' кто не изучал математику: матрица это просто квадрат из цифр'.