К книге
Мастерство промт-инжиниринга. Продвинутый уровеньТРЕНАЖЁР 3. РАЗРАБОТЧИК. КОНТЕКСТ И ДАННЫЕ
73%
ТРЕНАЖЁР 3. РАЗРАБОТЧИК. КОНТЕКСТ И ДАННЫЕ
16

Стек: Python, небольшой бэкенд‑сервис.

Кусок кода (специально с проблемами)

import datetime

def get_user_active_days(logins):

# logins – список дат в виде строк 'YYYY-MM-DD'

# функция должна вернуть количество дней, когда пользователь заходил в систему за последние 30 дней

today = datetime.datetime.now()

count = 0

for login in logins:

login_date = datetime.datetime.strptime(login, "%Y-%m-%d")

diff = today – login_date

if diff.days <= 30:

count += 1

return count

Проблемы (подсказки):

включение текущего дня/границ,

часовые пояса/время,

привязка к now() внутри функции (сложно тестировать),

нет обработки некорректных форматов дат,

тип datetime, хотя логика по дням.

Баг‑репорт (условный)

Заголовок: Некорректный подсчёт активных дней пользователя

Описание:

В отчёте "Активность пользователей" для некоторых пользователей показывается больше активных дней, чем было фактически.

Ожидание:

Если пользователь заходил, например, 1 и 31 числа прошлого месяца, а сегодня 31-е текущего месяца, то активных дней за последние 30 дней должно быть 1, а не 2.

Фактическое поведение:

В текущей версии отчёта для такого пользователя показывается 2 активных дня.

Дополнительно:

Подозреваем, что проблема в функции get_user_active_days.

Условные логи инцидента

2024-11-30 02:05:10 [INFO] Generating activity report for user_id=123

2024-11-30 02:05:11 [DEBUG] User 123 logins: ['2024-10-31', '2024-11-01', '2024-11-15', '2024-11-30']

2024-11-30 02:05:11 [DEBUG] Active days count: 4

2024-11-30 02:05:11 [INFO] Report generated

Комментарий аналитика:

Для периода "последние 30 дней" (с 2024-10-31 по 2024-11-30 включительно) фактически пользователь заходил 3 дня: 1, 15 и 30 ноября. Логин от 2024-10-31 попадает в отчёт, но по бизнес-правилам его нужно исключать.

Задачи тренажёра “Разработчик”

Составить промт для код‑ревью функции get_user_active_days.

Составить промт для генерации тестов к этой функции.

Составить промт для разбора инцидента/логов и предложения фикса.

1. Эталон: промт для код‑ревью

Вы – сеньор Python-разработчик.

Контекст:

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

Вот код:

```python

import datetime

def get_user_active_days(logins):

# logins – список дат в виде строк 'YYYY-MM-DD'

# функция должна вернуть количество дней, когда пользователь заходил в систему за последние 30 дней

today = datetime.datetime.now()

count = 0

for login in logins:

login_date = datetime.datetime.strptime(login, "%Y-%m-%d")

diff = today – login_date

if diff.days <= 30:

count += 1

return count

Задача:

Провести код‑ревью и найти потенциальные проблемы:

граничные случаи (ровно 30 дней, 31 день и т.п.),

привязка ко времени/часовым поясам,

тестируемость кода,

обработка некорректных данных.

Предложить улучшенную версию функции, учитывая:

чёткую бизнес-логику: “последние 30 полных дней, не включая текущий день” (или предложить варианты),

возможность передать "текущую дату" параметром для удобства тестирования,

аккуратность в работе с датами.

Формат ответа – только валидный JSON:

{ "summary": "Краткое общее впечатление от кода", "issues": [ { "type": "bug | edge_case | testability | style | other", "severity": "low | medium | high", "description": "Описание проблемы", "suggestion": "Предложение по исправлению" } ], "improved_code": "Улучшенная версия функции get_user_active_days", "notes": "Дополнительные комментарии, если есть" }

2. Эталон: промт для генерации тестов

```text

Вы – сеньор Python-разработчик и QA-инженер.

У нас есть функция get_user_active_days, которая должна возвращать количество активных дней пользователя за последние 30 дней. (Смотри код ниже.)

Код функции:

```python

import datetime

def get_user_active_days(logins):

# logins – список дат в виде строк 'YYYY-MM-DD'

# функция должна вернуть количество дней, когда пользователь заходил в систему за последние 30 дней

today = datetime.datetime.now()

count = 0

for login in logins:

login_date = datetime.datetime.strptime(login, "%Y-%m-%d")

diff = today – login_date

if diff.days <= 30:

count += 1

return count

Задача:

Предложить набор тест‑кейсов:

нормальные случаи,

граничные случаи (ровно 30 дней, 31 день, пустой список),

некорректные данные (невалидный формат даты).

Для каждого кейса указать:

описание,

пример входа (список дат),

заранее зафиксированную "текущую дату" (например, 2024-11-30),

ожидаемый результат.

Сгенерировать пример кода юнит-тестов с использованием pytest:

с фиксацией "текущей даты" (через monkeypatch или параметр в функции – можно предложить модификацию функции для лучшей тестируемости).

Формат ответа – только валидный JSON:

{ "test_cases": [ { "id": "case_1", "type": "normal | edge | invalid", "description": "Что проверяем", "today": "2024-11-30", "logins": ["2024-11-01", "2024-11-15"], "expected_result": 2 } ], "pytest_code_example": "Пример кода с тестами для pytest" }

3. Эталон: промт для разбора инцидента/логов

```text

Вы – сеньор Python-разработчик / SRE.

Контекст:

В отчёте "Активность пользователей" для некоторых пользователей показывается больше активных дней, чем было фактически. Подозреваем, что проблема в функции get_user_active_days.

Код функции:

```python

import datetime

def get_user_active_days(logins):

# logins – список дат в виде строк 'YYYY-MM-DD'

# функция должна вернуть количество дней, когда пользователь заходил в систему за последние 30 дней

today = datetime.datetime.now()

count = 0

for login in logins:

login_date = datetime.datetime.strptime(login, "%Y-%m-%d")

diff = today – login_date

if diff.days <= 30:

count += 1

return count

Логи инцидента: """ 2024-11-30 02:05:10 [INFO] Generating activity report for user_id=123 2024-11-30 02:05:11 [DEBUG] User 123 logins: ['2024-10-31', '2024-11-01', '2024-11-15', '2024-11-30'] 2024-11-30 02:05:11 [DEBUG] Active days count: 4 2024-11-30 02:05:11 [INFO] Report generated

Комментарий аналитика: Для периода "последние 30 дней" (с 2024-10-31 по 2024-11-30 включительно) фактически пользователь заходил 3 дня: 1, 15 и 30 ноября. Логин от 2024-10-31 попадает в отчёт, но по бизнес-правилам его нужно исключать. """

Задача:

На основе кода и логов:

сформулировать гипотезу причины некорректного подсчёта,

описать, как именно текущая логика даты/разницы дней даёт ошибку.

Предложить исправление бизнес‑логики:

чётко определить, что значит "последние 30 дней" (включая/исключая текущий день, границы периода),

описать, как скорректировать условие в коде.

Предложить дополнительные проверки/алерты или тесты, которые помогут в будущем не пропускать подобные ошибки.

Формат ответа – только валидный JSON:

{ "summary": "Краткое описание проблемы", "root_cause_hypothesis": "Гипотеза причины", "business_logic_fix": { "period_definition": "Как именно определяем период 'последние 30 дней'", "code_change_description": "Что нужно изменить в логике" }, "suggested_tests_or_alerts": [ "Идея теста или алерта 1", "Идея теста или алерта 2" ] }

Дальше можно:

– взять эти входные данные,

– написать свои версии промтов,

– сравнить с эталоном,

– улучшить под свой стиль и задачи,

– добавить в свою библиотеку промтов как готовые тренажёры.

Предыдущая главаГлава 16 из 22Следующая глава