Pull to refresh
76
0
Zaur Nasibov @BasicWolf

Software Engineer

Send message

Не проще ли завести Gitlab Community Edition? И одним махом решить большую часть проблем DevOps цикла?

А как насчёт работы линтеров? flake8, pylint? Уживаются ли они с библиотекой?

Из опыта: было дано задание на которое ушло 3 часа. Но это была обязательная часть (минимальный CRUD API на Django / DRF).
Также предлагалось раз в 7 больше задач с пометкой "мы были бы рады увидеть ваше решение, если вы знаете об этом больше нас". И эти задачи проникали во все концепции DevOps актуальные для компании — от вопросов "напиши Web UI для приложения" до "как бы вы организовали инфраструктуру AWS для нагрузки в 100, 1000, 10000 запросов / сек. ?"
Конечно можно было бы прийти на собеседование лишь с обязательной частью. Но тогда и не скромные запросы зарплаты вряд ли бы прокатили.


Вы точно будут «гореть желанием» пойти к работодателю с подобными требованиями?

Немного превувеличил :)

Чтобы там всё «выстрелило» — оно должно быть на неделю работы…

Совершенно верно! Если я, как программист заинтересован в работодателе, то неделя потраченная на тестовое задание вполне того стоит.


Если нужно проверить, насколько программист разбирается в легаси коде, бусть часть задания будет из серии "Вам пришлось работать с легаси-кодом программы -цатилетней давности, написанной, скажем, на COBOL. Разберитесь в том что он делает и представьте идентичный API на Питоне".

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

А мне кажется что давать такие задачки на собеседовании, человеку который метит на позицию Senior — плохая трата времени, как своего, так и кандидата. Если этот человек Senior — то это же не разработчик на Питоне в вакууме. Нам нужен Senior Python Developer.


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


Что же касается вышеприведённой задачи, то в контексте обсуждения написания API, я бы спросил у кандидата следующее:


Как бы вы инициализировали значение по-умолчанию аргумента функции, если это значение — изменяемый объект?

И попросил бы обосновать свой ответ. Спросил бы о том, как бы кандидат задокументировал это значение. Использовал бы type annotations?
Как по вашему, помогло бы это нам лучше узнать кандидата, по сравнению с "что делает этот код?"

Меня всегда удивляли подобные вопросы на собеседовании. Что именно пытаются выяснитаь таким образом? То что человек знает конкретный нюанс языка? Так таких нюансов кучи, теперь на каждом из них будем заморачиваться?
ИМХО такая задача много говорит о "компетентности" её задающего. Если бы до меня стали так докапываться на собеседовании, то скорее нам с этим человеком не по пути.

Интересный материал, но читается очень тажело. Такое ощущение, что текст писал Йода одновременно отражая массированную атаку штурмовиков.

Ну так по вашей логике, человек пришедший скажем из Питона в C, будет также недоумевать, а с чего это


#include "stdio.h"

int main() {
    for (int i = 0; i < 10; i++);
    printf("%d", i);        
    return 0;
}

не компилируется?


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


А учителям и ученикам можно порекомендовать соответствующий раздел туториала :)

Про for: по той простой причине, что если нужно пользоваться значением переменной при выходе из цикла при break, вам не придётся заводить дополнительной переменной вне цикла.


Про "не скомпилируется" — у питона чётко прописан механизм доступа к переменным. Когда в функции foo() происходит чтение переменной a, то интерпретатору не надо задумываться откуда происходит чтение. Сначала идёт поиск в локальном контексте, потом в глобальном.


А вот при присваивании всё сложнее:


def foo():
    a = a + 1

С чего интерпретатор должен считать что при присваивании значения переменной a, её область видимости глобальна? Отстутствие a в локальном контексте — не причина так считать. Ведь есть ещё и вложенные функции! Например:


def foo():
    a = 20

    def foo_inside():
        a = a + 1

    foo_inside()

Здесь будет та же ошибка, хотя а не глобальна, а лежит вне локального контекста foo_inside().


Поэтому и существуют операторы global и nonlocal явным образом задающие контекст переменной.

Следовало бы добавить первопричину такого поведения: Питон неотложно исполняет инструкции, соответственно, когда он натыкается на


def f(val = []):
    print(id(val))

то создаётся объект f типа function и записываются вычисленные значения аргументов в аттрибуты f.__defaults__ и f.__kwdefaults__.


Это легко проверить:


>>> f()
140694137408008

>>> print(id(f.__defaults__[0]))
140694137408008

При этом не обязательно брать именно циклокросс — т.к. в вакууме "циклокросс" — это снаряд для велокроссовых гонок. Это налагает ограничения вроде максимальной ширины покрышки в 33мм или специфики рамы — более короткой по сравнению с шоссейниками, что сказывается при длительных заездах. Как компромисс — т.н. "гравийные" велосипеды.


П.С. сам на работу катаю на циклокроссе, 50/50 асфальт/грунт, ежедневные поездки до 20км и максимальный заезд на на 120км.

К дублирующим ручкам двоякое отношение. С одной стороны позволяют тормозить при центральном хвате, с другой — занимают место и немного ухудшают чуствительность основных тормозов. И если в начале используешь их часто, то со временем руки тянутся к основным тормозам на полном автомате.

Заходишь на сайт по ссылке гугла. Видишь баннер в пол-экрана, предупреждающий о куках во имя GDPR. Закрываешь. Пролистываешь страницу, переходишь по паре внутренних ссылок. Видишь баннер в пол-экрана с просьбой зарегестрироваться. Закрываешь. Пробуешь перейти с сайта, кликая по "внешней" ссылке. Видишь предупреждение во весь экран о том, что покидаешь сайт. Закрываешь. И между делом закрываешь назойливые баннеры, предлагающие скачать мобильное приложение, которое сэкономит аж 10% траффика!


А как всё было просто всего 10 лет назад :)

Как из холодного душа облили. Вспомнил историю десятилетней давности — зашёл в универ проведать свою кафедру. Знакомые аспиранты (sic!) занимались описаным — разметкой объектов на кадрах с процессом приготовления суши. Это была часть совместного с японцами проекта по постройке робота-повара. И с барского плеча, вот такую "работу" отвалили нашим ребятам :(

Порой мы забываем, сколько всего нам заменяет смартфон :)

(взято с просторов рунета)

Скобки явным образом определяют тело инструкции. Ингода, это выливается в ложное видение области — думаешь, что находишься в теле какого-нибудь огроменного if-а, а на самоме деле уже давно вылез куда-то ещё.
В Питоне, с отсутствием скобок, становится не комфортно писать подобные простыни.

P.S. https://hg.python.org/cpython/file/tip/Python/ceval.c#l5159 — причина по которой tuple логично использовать в CPython — это представления tuple в виде обычного массива с указателями. Работать с ним намного проще и быстрее чем с любой другой коллекцией.

amarao, давайте не будет переливать из пустого в порожнее. Как было сказано — "except принимает tuple и ничего больше, потому что у нас так принято" :) С вами с удовольствием обсудят это в Python mailing list и может даже дело дойдёт до PEP-a. Питон не закрытый язык, если у вас есть идея, как его улучшить или исправить — дело за малым :)

Information

Rating
Does not participate
Location
Азербайджан
Registered
Activity