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

Как научился читать чужой код?

1.0 Junior🔥 121 комментариев
#Soft Skills

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

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

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

Как научился читать чужой код?

Чтение чужого кода — это ремесло, которому нужно учиться. За 10+ лет я развил систематический подход. Делюсь техниками.

1. Понимание контекста (Big Picture)

Никогда не начинай с деталей. Сначала поймиши ЗАЧЕМ существует этот код:

1. Прочитай README и документацию
2. Найди главный файл приложения (main.py, app.py, __main__.py)
3. Проверь requirements.txt/pyproject.toml — какие зависимости?
4. Посмотри на структуру проекта
5. Запусти проект локально и посмотри, что он делает

Пример анализа:

project/
├── README.md          # Читай первым!
├── requirements.txt   # Какие зависимости? → FastAPI, SQLAlchemy, Redis
├── main.py           # Входная точка
├── src/
│   ├── api/          # API endpoints
│   ├── models/       # ORM модели
│   └── services/     # Бизнес-логика

Выводы: Это REST API на FastAPI с БД. Скорее всего есть аутентификация и работа с данными.

2. Читай тесты перед кодом

Тесты — это лучшая документация:

# tests/test_user_service.py
def test_create_user_with_valid_data():
    service = UserService()
    user = service.create(name="John", email="john@example.com")
    
    assert user.id is not None
    assert user.name == "John"

def test_create_user_with_invalid_email():
    service = UserService()
    
    with pytest.raises(ValidationError):
        service.create(name="John", email="invalid")

Что я узнаю:

  • UserService имеет метод create
  • Принимает name и email
  • Возвращает объект с id и name
  • Выбрасывает ValidationError при неверном email

Это лучше, чем читать сам сервис!

3. Используй debugger, не print

# ❌ ПЛОХО: добавлять print везде
print(f"user_id = {user_id}")
print(f"query = {query}")

# ✅ ХОРОШО: использовать debugger
# Поставь breakpoint и шагай через код

import pdb; pdb.set_trace()

# Или в IDE (VS Code / PyCharm):
# 1. Поставь breakpoint на строку
# 2. Запусти в debug mode
# 3. Шагай через код, смотри значения переменных
# 4. Используй console для вычисления выражений

4. Метод "следуй за data flow"

Все приложения — это трансформация данных. Следи за данными:

Вход: HTTP запрос
   ↓
Контроллер парсит параметры
   ↓
Сервис обрабатывает бизнес-логику
   ↓
Репозиторий обращается к БД
   ↓
Данные возвращаются
   ↓
Выход: HTTP ответ

Пример:

# 1. Начни с API endpoint
@router.post("/users")
async def create_user(data: CreateUserRequest):
    # Что здесь происходит?
    user = await user_service.create(data.name, data.email)
    return UserResponse.from_orm(user)

# 2. Перейди в user_service.create()
class UserService:
    async def create(self, name: str, email: str):
        # Валидация?
        if not self.is_valid_email(email):
            raise ValidationError("Invalid email")
        
        # Обращение к БД?
        user = await self.user_repo.create(name=name, email=email)
        return user

# 3. Посмотри в user_repo.create()
class UserRepository:
    async def create(self, name: str, email: str):
        # Какой SQL запрос выполняется?
        stmt = insert(User).values(name=name, email=email)
        result = await self.db.execute(stmt)
        return result

Результат: Я понимаю полный flow от запроса до БД.

5. Рисуй диаграммы

Когда понимаешь flow, нарисуй диаграмму:

HTTP POST /users
    ↓
CreateUserRequest validation
    ↓
UserService.create()
    ├─ is_valid_email() → ValidationError
    └─ UserRepository.create() → insert into users
        ↓
UserResponse from_orm()
    ↓
HTTP 201 Created

Инструменты: Draw.io, Miro, или просто текстовая диаграмма.

6. Поиск по кодовой базе

# Где используется эта функция?
grep -r "def create_user" .

# Где импортируется этот модуль?
grep -r "from user_service import" .

# Все вызовы определённого метода
grep -r "\.create(" . --include="*.py"

# IDE (VS Code):
# Ctrl+Shift+F — поиск по файлам
# Ctrl+F12 — структура файла
# F12 — перейти в определение

7. Комментирование кода при чтении

# Когда читаешь сложный код, добавляй комментарии

class UserService:
    async def create(self, name: str, email: str):
        # КОММЕНТАРИЙ: Проверяем, что email имеет валидный формат
        if not self.is_valid_email(email):
            # КОММЕНТАРИЙ: Выбрасываем исключение, которое будет обработано в API
            raise ValidationError("Email must be valid")
        
        # КОММЕНТАРИЙ: Обращаемся к БД для создания пользователя
        # Это async операция, поэтому await
        user = await self.user_repo.create(name=name, email=email)
        
        # КОММЕНТАРИЙ: Возвращаем User объект с заполненными полями
        return user

8. Используй type hints для понимания

Типы помогают понять, что функция ожидает и возвращает:

# ❌ НЕПОНЯТНО
def process(data):
    return data.transform()

# ✅ ЯСНО
from typing import List, Dict, Optional

def process(data: List[Dict[str, str]]) -> Dict[str, List[int]]:
    return data.transform()

9. Читай коммиты истории

Гит история показывает, как развивался код:

# Когда был добавлен этот файл?
git log --follow -p src/user_service.py | head -100

# Кто писал этот код и когда?
git blame src/user_service.py

# Какие изменения были в этом файле?
git log --oneline src/user_service.py

10. Практика: Code Review подход

Читай код как будто ты делаешь code review:

1. ☑ Понимаю ли я, что делает эта функция?
2. ☑ Правильная ли обработка ошибок?
3. ☑ Есть ли утечки памяти / ресурсов?
4. ☑ Тесты покрывают все случаи?
5. ☑ Нет ли performance проблем?
6. ☑ Код следует best practices?
7. ☑ Документация актуальна?
8. ☑ Все переменные понятно названы?
9. ☑ Нет ли дублирования кода?
10. ☑ Безопасность: валидация, SQL injection, etc?

Инструменты для чтения кода

IDE:

  • VS Code (Python extension, Pylance)
  • PyCharm (лучший для Python)
  • Sublime Text (быстро, но базово)

Документация в коде:

# Посмотри docstrings
python -c "import user_service; help(user_service.UserService.create)"

# Или в Python REPL
>>> from user_service import UserService
>>> help(UserService.create)

Анализ кода:

# Посмотри структуру
ctags -R . && cat tags | head -20

# Или используй LSP (Language Server Protocol)
# VS Code использует Pylance

Типичная ошибка при чтении кода

❌ ПЛОХО: Начать с случайного файла и копаться в деталях
✅ ХОРОШО: Big Picture → Тесты → Data Flow → Детали

Чек-лист при чтении нового кода

  • Прочитал README
  • Запустил проект локально
  • Прочитал тесты
  • Нарисовал архитектурную диаграмму
  • Проследил data flow
  • Добавил комментарии к сложным участкам
  • Запустил debugger на интересных местах
  • Проверил коммиты истории
  • Понимаю, как добавить новую фичу
  • Смог написать тест для этого

Чтение чужого кода — это не пассивный процесс. Это активное взаимодействие с кодом, постоянное задавание вопросов и поиск ответов.

Как научился читать чужой код? | PrepBro