Pull to refresh
75
0
Zaur Nasibov @BasicWolf

Software Engineer

Send message

И попытаюсь ответить на ваши вопросы основываясь на своём опыте. Год назад я сменил место работы. Мне очень повезло попасть в команду, которую собирали с нуля.


У нас нет скрама, спринтов и бэклога. Зато есть понимание бизнес-требований продукта каждым членом команды. Есть глубокое понимание того, что важно на данный момент, почему мы работаем над той или иной задачей и какова конечная цель.


У нас нет утренних пятнадцатиминутных стендапов — мы сидим на расстоянии вытянутой руки друг от друга и постоянно общаемся. Мы любим парное программирование, а ещё больше мы любим программирование толпой (mob programming). Мы хорошо знаем, что совершаем кучу глупых ошибок и что вместе мы умнее, внимательнее, сильнее.


У нас нет проблем с деплоем — от коммита до деплоя в продакшн проходит не более 10 минут. У нас практически нет веток — они живут максимум сутки и то — для того, чтобы недоделанное мною вечером, мог продолжить и залить коллега, приходящий рано утром. А баги фиксятся здесь и сейчас. Какой смысл разрабатывать новую фичу, если в программе содержится ошибка и мы о ней знаем?


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

Больно было читать. Скрам мастер, Agile менеджер… И уж не обессудьте, я процитирую твиттер Аллена Холуба:


Words that DO NOT appear in the Agile Manifesto & Principles:
sprint
backlog
product owner, scrum master
release train
story
story points
estimate
velocity
meeting
Jira
manager
productivity
utilization


Words that DO appear in the Agile Manifesto & Principles:
individuals
interaction
valuable (software)
collaboration
change
customer
deliver…frequently
conversation
technical excellence
simplicity
self-organizing
reflects on…effective
adjusts

А как же разделение вида requirements.prod.txt и requirements.dev.txt? Если зашивать версии зависимостей для вас не критично, то достаточно в этих файлах определить зависимости первого уровня.


Poetry же не работает для управления зависимостями для блокнотов.

Расскажите пожалуйста поподробнее, в чём проблема с Poetry?

И может стоило бы привести ссылку на соотвествующий раздел документации: Execution model / Resolution of names.

Приведённый пример с константой, кажется сильно натянутым:


SUDDEN_LIST = [0, 0, 0]

def print_list(some_list):
    for element in SUDDEN_LIST:
        print(element) 

print_list([1, 2, 3]) 

Разве вы напишете такое в реальном коде? Функция с названием print_list, принимающая аргумент some_list и за каким-то макаром печатающая глобальную переменную?

EVE написана на Питоне. Это намного весомее, чем «скриптовый язык».

PEP-505, был отложен аккурат до выхода версии 3.8.

Имеется ввиду, "не хотели добавлять новую семантику оператору as".

Вариант с as рассматривали и отклонили: https://www.python.org/dev/peps/pep-0572/#alternative-spellings.
Если вкратце: не хотели добавлять лишнюю семантику. В рассматриваемых случаях, переменная с правой стороны от as всегда присутствует в области видимости:


  1. import x.y.z as z
    # z = x.y.z
  2. with context as c:
    # c = context.__enter__()

Всем на заметку: репозиторий с кейсами использования моржового оператора: https://github.com/vlevieux/Walrus-Operator-Use-Cases

Согласен. После этого кипиша (PEP-572) Гвидо и ушёл с поста BDFL — не было больше сил и нервов противостоять сообществу.

Мать ты моя, за эти же деньги можно полноценный Wahoo-шный тренажёрный бандл купить! С вентилятором и симулятором подъёмов/спусков. Да ещё и на велик останется.

Потому что здесь происходит замена данных, а не присваивание (связывание). Рассмотрим пример с обычным присваиванием:


numbers = [1, 2, 3]
other_number = numbers

numbers = [4, 5, 6]
# В данной ситуации, значение `other_numbers` не меняется, т.к. эта переменная продолжает ссылаться на область в памяти, к которой она была привязана изначально
print(other_numbers)
>>> [1, 2, 3]

Теперь с [:] = [...]:


numbers = [1, 2, 3]
other_number = numbers

numbers[:] = [4, 5, 6]
# Значение `other_numbers` меняется, т.к. обе переменные ссылаются на одну и ту же область памяти 
print(other_numbers)
>>> [4, 5, 6]

Товарищи кто в теме, поправьте, но это же ересь какая-то — "детектирование как IntelCore 2 Duo". Это что же получается, "Эльбрус" на команду CPUID себя за Интел выдаёт?

Отличный комментарий! Как вы считаете, насколько сложным будет изолирование моделей Django в слое сохранения состояния (persistence layer)?

Поторопился:


...
if managers_of_interest.issubset(s)

По 1-му коду — ну да, это лишь "заготовка" демонстрирующая основную идею. К ней можно приделать и красивый вывод и вообще всё что угодно :)

Спасибо! Но ведь тогда всё ещё проще:


# предложенные директора
managers_of_interest = {1, 2, 3} 

data = (
    {1, 2, 3, 4}, 
    {1, 2, 3, 5}, 
    {3, 4, 5, 6, 7}
)

for s in data:
    if managers_of_interest & s:
        print(s)

A в предыдущем примере так и вообще ничего вводить не надо — программа сама найдёт все организации в которых пересечение директоров больше 50%. И уже в этом результате имеет смысл искать конкретные имена.

Я правильно понимаю что эта задача сводится к


Дано n множеств N1, N2,… Nn: ∀1 ≤ k ≤ n |Nk| ≥ 1
Найти множества: |Nk ⋂ Nj| ≥ max(|Nk|, |Nj|) / 2: j ≠ k


?


Потому что в этом случае решение укладывается в 3 строки:


import itertools

# данные, каждая цифра соотвествует директору
data = (
    {1, 2, 3, 4}, 
    {1, 2, 3, 5}, 
    {3, 4, 5, 6, 7}
)

# решение
for s0, s1 in itertools.combinations(data, 2):
    if len(s0 & s1) > max(len(s0), len(s1)) / 2:
        print(s0 & s1)

Information

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