← Назад к вопросам

Как ты решаешь проблемы в коде?

2.0 Middle🔥 171 комментариев
#Soft Skills

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Процесс решения проблем в коде

Решение проблем — это систематический процесс, который я применяю при столкновении с багами, ошибками или неэффективностью кода. Мой подход основан на научной методике и лучших практиках отладки.

1. Репродукция проблемы

Первый шаг — убедиться, что я воспроизвожу проблему и понимаю её точно:

# Шаг 1: Записываю точное описание проблемы
# Шаг 2: Записываю шаги для воспроизведения
# Шаг 3: Проверяю, что я правильно воспроизвожу проблему

def reproduce_issue():
    """
    Проблема: функция возвращает None вместо списка
    Как воспроизвести:
    1. Вызвать get_users(limit=-5)
    2. Получить None
    """
    result = get_users(limit=-5)
    assert result is not None  # Провал

2. Сбор информации

Когда проблема воспроизведена, собираю максимум информации:

import logging
import traceback

logger = logging.getLogger(__name__)

def collect_debug_info():
    # Логирование входных данных
    logger.debug(f"Input params: {locals()}")
    
    # Логирование промежуточных значений
    try:
        result = some_operation()
        logger.debug(f"Intermediate result: {result}")
    except Exception as e:
        # Полный stack trace
        logger.error(f"Error occurred: {e}")
        logger.error(traceback.format_exc())
        raise

3. Выдвижение гипотез

На основе информации выдвигаю несколько гипотез о причине:

# Гипотеза 1: Проблема в входных данных
def test_hypothesis_1():
    # Проверяю граничные случаи
    assert process_data(None) is not None
    assert process_data("") is not None
    assert process_data(0) is not None

# Гипотеза 2: Проблема в логике
def test_hypothesis_2():
    # Проверяю каждый шаг логики отдельно
    data = prepare_data()
    assert data is not None
    
    result = transform(data)
    assert result is not None

# Гипотеза 3: Проблема в зависимостях
def test_hypothesis_3():
    # Проверяю, что зависимости работают корректно
    mock_service = MagicMock()
    mock_service.get_data.return_value = {"status": "ok"}
    assert process_with_service(mock_service)

4. Тестирование гипотез

Проверяю каждую гипотезу через тесты и эксперименты:

import pytest
from unittest.mock import patch

# Использую pytest для систематического тестирования
def test_with_different_inputs():
    """Проверяю разные входные данные"""
    test_cases = [
        ({"name": "John"}, True),
        ({"name": ""}, False),
        ({}, False),
        (None, False),
    ]
    
    for data, expected in test_cases:
        result = process(data)
        assert (result is not None) == expected

def test_with_mocked_dependency():
    """Изолирую зависимости"""
    with patch(module.external_service) as mock_service:
        mock_service.return_value = "expected_value"
        result = my_function()
        assert result == "expected_value"
        mock_service.assert_called_once()

5. Локализация проблемы

Сужаю область поиска, используя бинарный поиск по коду:

# Если ошибка в функции с 100 строк,
# проверяю середину, потом половины, пока не найду точное место

def find_exact_line():
    # Добавляю print или логирование в критические точки
    logger.debug("Step 1: Data prepared")  # Добавляю здесь
    data = prepare_data()
    
    logger.debug("Step 2: About to transform")  # Потом здесь
    result = transform(data)
    
    logger.debug(f"Step 3: Result = {result}")  # И здесь
    return result

6. Анализ и исправление

После локализации анализирую причину и исправляю:

# ❌ Проблема: функция не обрабатывает None
def get_user_age(user_id):
    user = db.query(User).get(user_id)
    return user.age  # AttributeError если user is None

# ✅ Исправление: добавляю проверку
def get_user_age(user_id):
    user = db.query(User).get(user_id)
    if user is None:
        raise ValueError(f"User {user_id} not found")
    return user.age

7. Проверка исправления

После исправления проверяю, что проблема решена и не появились новые баги:

def test_fix():
    # Проверяю, что проблема исправлена
    assert get_user_age(1) == 30
    
    # Проверяю граничные случаи
    with pytest.raises(ValueError):
        get_user_age(-1)
    
    # Проверяю регрессию (что я не сломал что-то ещё)
    assert get_user_age(2) == 25

8. Документирование и обучение

Заканчиваю процесс документированием для будущего:

def documented_function(user_id: int) -> int:
    """
    Получить возраст пользователя.
    
    Args:
        user_id: ID пользователя
    
    Returns:
        Возраст пользователя
    
    Raises:
        ValueError: если пользователь не найден
    
    Note:
        Раньше эта функция возвращала None для несуществующих пользователей.
        Это было исправлено на выброс исключения для лучшей обработки ошибок.
    """
    user = db.query(User).get(user_id)
    if user is None:
        raise ValueError(f"User {user_id} not found")
    return user.age

Инструменты, которые я использую

  • pdb/ipdb — отладчик Python для пошагового выполнения
  • logging — структурированное логирование вместо print
  • pytest — для написания воспроизводящих тестов
  • profilers — cProfile для проблем производительности
  • mypy — статический анализ типов
  • linters — flake8, pylint для обнаружения ошибок

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

Как ты решаешь проблемы в коде? | PrepBro