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

Расскажи о процессе начала работы на новой задачей

2.0 Middle🔥 101 комментариев
#Python Core

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

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

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

Процесс начала работы над новой задачей

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

Этап 1: Понимание задачи (10-15 минут)

1.1. Прочитаю требование

Одна задача может содержать:
- Описание: что нужно сделать
- Acceptance Criteria: критерии принятия
- Техническое задание: как реализовать
- Ограничения: что нельзя делать

1.2. Выявлю неясности

# Для каждого требования спрашу себя:
"✅ Ясно ли это?"        - Если нет, спрошу PM
"✅ Критичное ли?"       - Это основная функция или бонус?
"✅ Когда нужно?"        - Дата дедлайна ясна?
"✅ Кто будет тестить?" - QA, PM или оба?

1.3. Разложу задачу на подзадачи

Например, "Добавить авторизацию через Google":

┌─ Исследование (1-2 часа)
│  ├─ Прочитать документацию Google OAuth 2.0
│  ├─ Проверить существующие решения (django-allauth)
│  └─ Оценить, сколько времени это займёт
│
├─ Разработка backend (4-6 часов)
│  ├─ Подстроить Google OAuth
│  ├─ Создать endpoint для авторизации
│  ├─ Обработать ошибки
│  └─ Написать тесты (unit + integration)
│
├─ Разработка frontend (3-4 часа)
│  ├─ Добавить кнопку "Sign in with Google"
│  ├─ Обработать response
│  └─ Обновить UI в зависимости от статуса
│
└─ Тестирование (2-3 часа)
   ├─ Ручное тестирование
   ├─ Проверка на мобильных
   └─ Edge cases (no internet, user cancels, etc.)

Всего: ~14-20 часов работы

Этап 2: Исследование кодовой базы (20-30 минут)

2.1. Изучу похожие функции

# Если добавляю авторизацию, ищу существующую:
grep -r "authenticate" backend/
# Найду места, где уже есть авторизация
# Стилей кода, паттернов, структуры

# Посмотрю на существующие API endpoints
find backend/ -name "views.py" -o -name "*api*"

2.2. Проверю используемые библиотеки

# requirements.txt или pyproject.toml
cat requirements.txt | grep -i auth
# django-rest-framework-simplejwt
# django-allauth
# djangorestframework

# Это даст мне понимание, что уже есть

2.3. Посмотрю на структуру проекта

backend/
├── core/
│   ├── models.py        (где User модель?)
│   ├── views.py         (как они структурированы?)
│   └── serializers.py   (какой стиль сериализаторов?)
├── auth/
│   ├── views.py         (есть ли уже авторизация?)
│   └── permissions.py   (кастомные permissions?)
├── utils/
│   ├── decorators.py    (используются ли декораторы?)
│   └── helpers.py       (общие функции?)

Этап 3: Планирование (30-45 минут)

3.1. Создам план работы

# План в виде TODO листа:

[ ] Исследование
    [ ] Изучить Google OAuth документацию
    [ ] Выбрать библиотеку (google-auth, django-allauth)
    [ ] Посмотреть примеры

[ ] Backend
    [ ] Настроить settings.py (CLIENT_ID, SECRET)
    [ ] Создать endpoint POST /api/v1/auth/google
    [ ] Валидировать token от Google
    [ ] Создать или получить User
    [ ] Вернуть JWT токен
    [ ] Написать unit тесты
    [ ] Написать integration тесты

[ ] Frontend
    [ ] Установить @react-oauth/google
    [ ] Добавить GoogleLogin компонент
    [ ] Обработать успешный login
    [ ] Обработать ошибки
    [ ] Сохранить токен в localStorage
    [ ] Добавить E2E тест

[ ] QA
    [ ] Ручное тестирование
    [ ] Проверка на мобильных
    [ ] Edge cases

3.2. Оценю сложность

# Оценка по Фибоначчи: 1, 2, 3, 5, 8, 13, 21

Эта задача = 8 стори-поинтов
# Потому что:
# - Нужно интегрировать с внешним API (Google)
# - Нужна как backend, так и frontend часть
# - Требуется тестирование
# - Может быть много edge cases

3.3. Проверю зависимости

# Нужно ли что-то сделать перед этой задачей?

Зависимости:
- ✅ User модель уже существует
- ✅ JWT авторизация уже настроена
- ❌ Google OAuth не настроена в settings.py
- ⚠️ Frontend не имеет UI для button

Этап 4: Окружение (15-20 минут)

4.1. Создам ветку

# Стандартное именование веток
git checkout -b feature/google-oauth

# Или если это баг
git checkout -b fix/auth-bug

# Или если это улучшение
git checkout -b improvement/faster-login

4.2. Обновлю зависимости

# Если нужны новые библиотеки
pip install google-auth
pip install google-auth-oauthlib
pip install google-auth-httplib2

# Добавлю в requirements.txt
pip freeze | grep google >> requirements.txt

4.3. Проверю окружение

# Все ли работает?
make test
make lint

# Запущу приложение
make run

# Проверю, что базовая функциональность работает
curl http://localhost:8000/api/v1/health

Этап 5: Начало разработки (TDD подход)

5.1. Напишу тест ДО кода

# tests/test_auth.py
import pytest
from django.test import Client
from unittest.mock import patch, MagicMock


class TestGoogleAuth:
    """Тесты для Google OAuth"""
    
    @pytest.mark.django_db
    def test_google_login_creates_user(self):
        """Тест: первый логин через Google создаёт пользователя"""
        
        # Arrange (подготовка)
        google_token = "mock_google_token"
        mock_user_data = {
            "email": "john@gmail.com",
            "name": "John Doe"
        }
        
        with patch('app.auth.verify_google_token') as mock_verify:
            mock_verify.return_value = mock_user_data
            
            # Act (выполнение)
            client = Client()
            response = client.post(
                '/api/v1/auth/google',
                {'token': google_token},
                content_type='application/json'
            )
        
        # Assert (проверка)
        assert response.status_code == 200
        assert 'jwt_token' in response.json()
        
        # Проверим, что пользователь создан
        from myapp.models import User
        user = User.objects.get(email='john@gmail.com')
        assert user.email == 'john@gmail.com'
    
    @pytest.mark.django_db
    def test_google_login_with_invalid_token(self):
        """Тест: неправильный токен возвращает ошибку"""
        
        client = Client()
        response = client.post(
            '/api/v1/auth/google',
            {'token': 'invalid_token'},
            content_type='application/json'
        )
        
        assert response.status_code == 400
        assert 'error' in response.json()

5.2. Напишу минимальный код для прохождения теста

# app/auth/views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from google.auth.transport import requests
from google.oauth2 import id_token


class GoogleAuthView(APIView):
    def post(self, request):
        """Авторизация через Google"""
        token = request.data.get('token')
        
        if not token:
            return Response(
                {'error': 'Token required'},
                status=status.HTTP_400_BAD_REQUEST
            )
        
        try:
            # Проверяем токен у Google
            idinfo = id_token.verify_oauth2_token(
                token,
                requests.Request(),
                settings.GOOGLE_CLIENT_ID
            )
            
            # Получаем или создаём пользователя
            user, created = User.objects.get_or_create(
                email=idinfo['email'],
                defaults={'first_name': idinfo.get('given_name', '')}
            )
            
            # Генерируем JWT токен
            refresh = RefreshToken.for_user(user)
            
            return Response({
                'jwt_token': str(refresh.access_token),
                'user_id': user.id
            })
        
        except ValueError:
            return Response(
                {'error': 'Invalid token'},
                status=status.HTTP_400_BAD_REQUEST
            )

Этап 6: Разработка по TDD

# 1. RED: написал тест, он падает
pytest tests/test_auth.py -v
# FAILED test_google_login_creates_user

# 2. GREEN: написал минимальный код
pytest tests/test_auth.py -v
# PASSED test_google_login_creates_user

# 3. REFACTOR: улучшаю код, тесты всё ещё проходят
# Делаю код чище, добавляю обработку edge cases

# Повторяю 1-3 для каждого требования

Этап 7: Проверка качества

# Линтинг
make lint
# Проверка на ошибки стиля (flake8, black, isort)

# Тесты
make test
# Проверка покрытия >= 80%

# Типизация
mypy app/auth/
# Проверка типов

# Безопасность
bandit app/auth/views.py
# Проверка на уязвимости

Этап 8: Code Review

8.1. Самопроверка

# Перед отправкой на review, спрошу себя:

[ ] Код читаем? (понятные имена, комментарии)
[ ] Нет дублирования? (DRY принцип)
[ ] Обработаны ошибки? (try-catch, валидация)
[ ] Есть тесты? (unit + integration)
[ ] Тесты проходят? (100% зелено)
[ ] Покрытие >= 80%?
[ ] Нет console.log / print?
[ ] Документация обновлена?
[ ] Performance приемлемый?

8.2. Создам PR

Название PR:
"feat: Add Google OAuth authentication"

Описание:
## Changes
- Добавлен endpoint для авторизации через Google
- Реализована валидация Google токена
- Автоматическое создание User при первом логине
- Возврат JWT токена для дальнейших запросов

## Testing
- Все unit тесты проходят
- Добавлены 5 новых тестов
- Покрытие: 84%

## Related issue
Closes #123

Этап 9: Обратная связь и итерации

# Reviewer может попросить изменения:"Нужна обработка случая, когда email меняется"
✅ Добавлю

❌ "Нужен более информативный error message"
✅ Изменю

❌ "Покрытие тестами меньше 80%"
✅ Напишу ещё тесты

# После исправлений:
git commit --amend
git push --force-with-lease

Чек-лист перед началом работы

  • Прочитал всё требование до конца
  • Спросил неясные моменты
  • Разложил задачу на подзадачи
  • Изучил похожий код в проекте
  • Создал план работы
  • Оценил сложность и время
  • Создал ветку
  • Обновил окружение
  • Проверил, что всё работает
  • Написал тесты
  • Запустил линтинг и тесты
  • Готов к разработке

Общие рекомендации

✅ Делай так:

  • Работай небольшими итерациями
  • Пиши тесты ДО кода
  • Часто коммитить (каждые 30-60 минут)
  • Спрашивай, если неясно
  • Читай существующий код перед своим

❌ Не делай так:

  • Не начинай кодить без плана
  • Не пропускай тесты
  • Не коммитай всё сразу в конце дня
  • Не стесняйся спрашивать
  • Не копируй код без понимания