• Настраиваем окружение Python с помощью pyenv, virtualenvwrapper, tox и pip-compile
    +1

    А теперь добавьте к этому шаблоны вроде "requirements.dev.txt" и "requirements.dev.freeze.txt" :)


    Я ни в коем случае не оспариваю, что можно обойтись одним pip и virtualenv (идущим из коробки python3 -m venv). Но для меня poetry — это удобный высокоуровневый инструмент, который избавляет от рутины и тем самым уменьшает количество ошибок.

  • Настраиваем окружение Python с помощью pyenv, virtualenvwrapper, tox и pip-compile
    0

    Пока вы перечисляете все зависимости (и зависимости зависимостей) указывая их точную версию, может и ничем.
    Но poetry и ему подобные инструменты могут "замораживать" установленные версии пакетов. Poetry записывает эти версии в poetry.lock. Таким образом вы можете воспроизвести установленные зависимости как на любой девелоперской машине, так и в продакшене.

  • Почему разработчикам не нравится Agile?
    +1

    А вам не кажется, что такое поведение — обман работодателя?

  • Почему разработчикам не нравится Agile?
    +2

    Нужно доверие "сверху" и желание "снизу". Доверие менеджеров команде профессионалов и доверие членов команды к менеджерам и друг к другу.
    В противном же случае, если у менеджера продукта в голове Скрам, и спринты ему необходимы как мана небесная — это плохо. Если у разработчиков отношение, как писали выше, "работать на дядю и делать таски записанные в бэклоге" — это ещё хуже.
    Как писали в обсуждении — дело в культуре. Культуру не изменишь, поменяв скрам на канбан.


    Мне кажется, что рабочий вариант при такой ситуации — выделить маленькую мотивированную команду из 3-4 человек, пересадить их спина к спине в отдельное пространство и дать им карт-бланш на пол-года. Пусть пробуют новые процессы, подходы к разработке, DDD, DevOps. Пусть тратят своё время на совместный просмотр лекций (или котиков).
    У такой команды безусловно должны быть цели и сроки, должна быть отчётность. Но вместо категорических вопросов из серии "почему вы не работаете над вот этой очень_нужной_фичей?", должны быть "ребята, как ваши коллеги и компания может вам помочь?".


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

  • Почему разработчикам не нравится Agile?
    +2

    Да, так оно и есть :) И как порой бывает сложно работать с ребятами из соседней команды, у которых тоже Аджайл, под соусом Scrumbut-a. "Мы это уже написали, но сможем выложить на интеграцию только через неделю...".

  • Почему разработчикам не нравится Agile?
    +5

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


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


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


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


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

  • Почему разработчикам не нравится Agile?
    +6

    Больно было читать. Скрам мастер, 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

  • А как вам такой вариант управления зависимостями в Python?
    +2

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


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

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

  • Все, что вы хотели узнать про области видимости в Python, но стеснялись спросить
    0

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

  • Все, что вы хотели узнать про области видимости в Python, но стеснялись спросить
    0

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


    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 и за каким-то макаром печатающая глобальную переменную?

  • Как стать Java-разработчиком? А может быть, выбрать Python?
    0
    EVE написана на Питоне. Это намного весомее, чем «скриптовый язык».
  • Python 3.8: Что нового и как этим пользоваться?
    0

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

  • Python 3.8: Что нового и как этим пользоваться?
    0

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

  • Почему мне нравится PHP?
    –9

  • Python 3.8: Что нового и как этим пользоваться?
    0

    Вариант с 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__()
  • Python 3.8: Что нового и как этим пользоваться?
    0

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

  • Python 3.8: Что нового и как этим пользоваться?
    +2

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

  • Peloton: следующая Apple или еще один скам?
    0

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

  • Глючный код на Python: 10 самых распространенных ошибок, которые допускают разработчики
    0

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


    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]
  • Представлен моноблок «Эльбрус 801М» в «новом современном дизайне»
    +4

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

  • Django 3.0 будет асинхронным
    0

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

  • Определяем взаимозависимых лиц по составам советов директоров с помощью python
    0

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


    ...
    if managers_of_interest.issubset(s)

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

  • Определяем взаимозависимых лиц по составам советов директоров с помощью python
    0

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


    # предложенные директора
    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%. И уже в этом результате имеет смысл искать конкретные имена.

  • Определяем взаимозависимых лиц по составам советов директоров с помощью python
    0

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


    Дано 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)
  • F-strings или как сделать код чуть более быстрым и читаемым
    0

    Армин тоже разбирал этот момент: http://lucumr.pocoo.org/2016/12/29/careful-with-str-format/

  • CI\CD для стартапа: какие есть инструменты, и почему ими пользуются не только крупные и известные компании
    +7

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

  • Автоматизация импортов в Python
    +2

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

  • Объяснение задачи на Python с собеседования
    0

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


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

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

  • Объяснение задачи на Python с собеседования
    0
    Чтобы там всё «выстрелило» — оно должно быть на неделю работы…

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


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

  • Объяснение задачи на Python с собеседования
    0

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

  • Объяснение задачи на Python с собеседования
    0

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


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


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


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

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

  • Объяснение задачи на Python с собеседования
    +9

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

  • Последние изменения в IO-стеке Linux с точки зрения DBA
    +8

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

  • 5 распространенных ошибок начинающих программистов на Python
    0

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


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

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


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


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

  • 5 распространенных ошибок начинающих программистов на Python
    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 явным образом задающие контекст переменной.

  • 5 распространенных ошибок начинающих программистов на Python
    +5

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


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

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


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


    >>> f()
    140694137408008
    
    >>> print(id(f.__defaults__[0]))
    140694137408008
  • Как ворваться в велосезон во всеоружии — в спортивной и городской комплектации
    +3

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


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

  • Как ворваться в велосезон во всеоружии — в спортивной и городской комплектации
    0

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

  • Как делать сайты в 2019 году
    +29

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


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

  • Крепостные в эпоху искусственного интеллекта
    +2

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