Skip to content

Instantly share code, notes, and snippets.

@esemi
Last active January 26, 2022 11:29
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save esemi/4432b496c377e77f83a2f1aa5e008e0c to your computer and use it in GitHub Desktop.
Save esemi/4432b496c377e77f83a2f1aa5e008e0c to your computer and use it in GitHub Desktop.
Вопросы к кандидату (python-back)

Список вопросов универсальный для тех. скринига питонистов.

Само собой, родился из ограничений, так что по сути консенсус из того что важно командам и мне с адаптацией под текущий процесс хайринга (:

Жиза

  • с чем работал

  • что делал, какие проблемы запомнились

  • что хочется, что не хочется от работы (почему мы видим тебя на собеседовании)

Python

  • версия питона

  • что нра/ненра в питоне

  • что нра/ненра в свежих релизах

  • когда может пригодиться знание про мутабельность/немутабельность типов

  • зачем могут понадобиться генераторы

  • зачем могут понадобиться контекстные менеджеры.

  • ... контекст варсы?

  • зачем придумали GIL

  • чем мешает и когда

  • что делают @classmethod, @staticmethod, @property

  • как тестировать привык

  • задача: придумать такую функцию, которую я запарюсь покрывать юнитами. Хочу список её "фич"

  • как хорошо зафиксировать зависимости в свежем проекте на питоне

asyncio

  • что внутри, как работает

  • чем лучше тредов/процессов и лучше ли

  • чего юзал из асинк фреймворков

  • как быть с транзакционными операциями в асинхронном сервисе

gilab CI

  • задача: опиши идеальный паплайн деплоя на прод веб приложения на питоне

СУБД

  • что юзал и зачем

  • зачем придумали индексы

  • а как они работают в постгре

  • а почему на все стобцы не навесить

  • что такого страшного ты можешь увидеть в выводе EXPLAIN

  • зачем настраивал уровни изоляции транзакций

  • опиши принцип работы MVCC для Васяна

Docker

  • сколько слоёв должно быть и почему

  • опиши слои веб-приложения на питоне (любого из практики)

k8s

  • какие сущности юзал

  • сервис vs ингрес

  • configmap vs secret

  • hpa

  • affinity

  • писал руками ямлики или шаблонизировал чем

  • а секреты как хранил

GCP/etc

  • что юзал

  • нра/не нра и почему

  • а как это бекапить

  • а как не "вендорлочить"

Очереди/etc Union[celery, rabbit, kafka, pubsub]

  • как юзали

  • какие проблемы поймали

  • как мониторили и кто админил

Сесурити

  • что расскажешь про XSS

  • ... про CSRF

Лайвкод секция и занимательные задачки

  • развернуть список в питоне - несколько способов и тест на это
def reverse(list):
    """Реализуйте функцию максимально production-ready.
    
    Использовать можно всё что угодно.
    Менять можно всё что угодно.
    Главное чтобы ассерты внизу проходили.
    """
    # todo impl (u turn)
    pass


assert reverse([1, 2, 3]) == [3, 2, 1]
assert reverse(['1', None, '', 'A', 'a']) == ['a', 'A', '', None, '1']

source_list = [1, 2]
assert reverse(source_list) == [2, 1]
assert source_list == [1, 2], source_list
  • отфильтровть список и тест на это
from typing import Any, List

def filter_list(source_list: List[Any]) -> List[Any]:
    """Реализуйте функцию максимально production-ready.
    
    Использовать можно всё что угодно.
    Менять можно всё что угодно.
    Главное чтобы ассерты внизу проходили.
    """    
    # todo impl (u turn)
    pass


assert filter_list([0, 1, 2]) == [1, 2]
assert filter_list([1, 2, 3, '', None, '1', -1]) == [1, 2, 3, '1']
  • кодоревью таски стажёров
"""@see <https://github.com/esemi/python_intern>"""

import requests
from fastapi import FastAPI
from requests.exceptions import ConnectionError, InvalidURL

app = FastAPI()

@app.get("/healthz")
async def healthz(hostname) -> dict:
    """
    Checks if the host is up or down.
    :param hostname: The name of the host being checked.
    """
    status = 'up' if is_alive_host(hostname) else 'down'
    return {'status': status}


def is_alive_host(h):
    """Проверить, что запрашиваемый хост возвращает http status 100<=x<400."""
    url = 'http://' + h
    try:
        response = requests.get(url)
        status_code = response.status_code
        if 100 <= status_code < 400:
            return True
        return False
    except ConnectionError:
        return False
    except InvalidURL:
        return False

  • хочу автотаску на каждые 10 минут - что делать

  • хочу автотаску на каждую секунду - что делать

  • один запрос с UI, за ним инфа от десятка сервисов, на беке фляжка, работает долго

  • асинк фреймворк, внутри критичная транзакция, падает на запросе во внешний сервис

  • DDD

  • луковая/слоистая/дядя Боб

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment