1. Задача: Написать функцию кодирования строки
def curtail_str(letters: str) -> str:
assert curtail_str('') == ''
assert curtail_str('ABC') == 'ABC'
assert curtail_str('AAA') == 'A3'
assert curtail_str('AAA6BXYZGD00A') == 'A3B2XYZ04A'
assert curtail_str('ABCABCABCCCCC') == 'ABCABCAB5C'
print('done')2. Гарантировано ли, что в строке будут только буквы, без цифр?
3. Какой подход ты выберешь для решения задачи по сжатию строки?
4. Какой алгоритмической сложности будет твоё решение для задачи сжатия строки?
5. Что бы ты изменил в коде для рефакторинга, чтобы учесть последний символ или избежать лишних проверок?
6. Какой у тебя опыт работы со стеком технологий, например, с HTTP-запросами?
7. Задача: Реализовать декоратор SlowLock для замера времени выполнения функции
import asyncio
@log
@slowlog(threshold=3)
async def some_func(seconds):
await asyncio.sleep(seconds)
return seconds * 2
assert asyncio.run(some_func(1)) == 2 # не должно логироваться
assert asyncio.run(some_func(5)) == 10 # должно логироваться8. Должен ли декоратор прерывать выполнение функции при превышении времени или только логировать?
9. Какие могут быть подводные камни при использовании модуля time для замера времени выполнения?
10. Как можно получить время в UTC или использовать альтернативные методы для избежания проблем с системным временем?
11. Задача: Провести код-ревью
import asyncpg
from fastapi import FastAPI, Body, HTTPException
app = FastAPI()
DB_DSN = "postgresql://test:test@localhost/testdb"
async def get_connection() -> asyncpg.Connection:
return await asyncpg.connect(DB_DSN)
@app.on_event("startup")
async def on_startup():
conn = await get_connection()
await conn.execute("""
CREATE TABLE IF NOT EXISTS "user" (
id TEXT NOT NULL,
name TEXT NOT NULL,
balance DOUBLE PRECISION
)
""")
@app.post("/transfer")
async def transfer(
from_user: str = Body(),
to_user: str = Body(),
amount: float = Body(),
):
conn = await get_connection()
row = await conn.fetchrow("SELECT id, balance FROM "user" WHERE id = $1", from_user)
if row["balance"] < amount:
raise HTTPException(status_code=400, detail="Insufficient funds")
await conn.execute("UPDATE "user" SET balance = balance - $1 WHERE id = $2", amount, from_user)
await conn.execute("UPDATE "user" SET balance = balance + $1 WHERE id = $2", amount, to_user)
return {"success": True}12. Что бы ты вынес из конфигурации базы данных (например, db_name, db_host, db_user) в переменные окружения?
13. Как бы ты использовал контекстный менеджер для соединения с базой данных?
14. Какие параметры в функции перевода средств можно вынести в URL?
15. Возможна ли SQL-инъекция в текущей реализации функции перевода средств?
16. Как можно параметризовать запросы, чтобы избежать SQL-инъекций?
17. Зачем нужен декоратор транзакций для функции перевода средств?
18. Можно ли возвращать статус ошибки в ответе функции перевода средств?
19. Используется ли Pydantic для валидации данных в текущем коде?
20. Всё ли корректно в схеме базы данных, например, с полем ID как primary key?
21. Нужно ли указывать precision для поля balance с типом double precision?
22. Стоит ли использовать varchar вместо text для ID в базе данных?
23. Какие проблемы могут быть с использованием double precision для хранения баланса?
24. Что ещё можно улучшить в схеме базы данных?
25. Проверяется ли наличие пользователей в базе данных перед выполнением перевода?
26. Как можно синхронизировать запросы, чтобы избежать ситуации, когда один пользователь уходит в минус из-за одновременных переводов?
27. Какие блокировки (оптимистичные или пессимистичные) можно использовать на уровне PostgreSQL для синхронизации переводов?
28. Можно ли использовать кодек в библиотеках или по MongoDB для этого сервиса?
Дополнительно
Собеседование состояло из лайвкодинга и разбора задач, представленных в файле.