Пишешь ли ты код вне Jupyter Notebook?

«Пишешь ли ты код вне Jupyter Notebook?» — вопрос из категории Софт-скиллы, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый пример ответа, который можно адаптировать под свой опыт.

Ответ

Да, для серьезных проектов я всегда перехожу из ноутбуков в полноценную IDE и структурированный код. Это критически важно для поддерживаемости, тестирования и совместной работы.

Мой стандартный workflow:

  1. IDE: Использую VS Code с плагинами (Python, Pylance, Black) или PyCharm.
  2. Структура проекта: Создаю модульную структуру с самого начала.
    ml_project/
    ├── src/
    │   ├── __init__.py
    │   ├── data/
    │   │   ├── __init__.py
    │   │   └── make_dataset.py
    │   └── models/
    │       ├── __init__.py
    │       └── predict_model.py
    ├── tests/
    │   └── test_predict_model.py
    ├── notebooks/          # Только для EDA и прототипирования
    ├── pyproject.toml     # Зависимости через Poetry
    ├── Dockerfile
    └── README.md
  3. Инструменты:
    • Poetry для управления зависимостями и виртуальными окружениями.
    • Pre-commit hooks с black, isort, flake8 для автоматического форматирования и линтинга.
    • Pytest для модульного и интеграционного тестирования.
    • Git с осмысленными коммитами и Pull Request.

Пример модуля с аннотацией типов:

from typing import Optional
import pandas as pd
from sklearn.pipeline import Pipeline

def load_and_validate_data(filepath: str) -> pd.DataFrame:
    """Загружает CSV и проверяет базовую целостность."""
    df = pd.read_csv(filepath)
    if df.empty:
        raise ValueError(f"Файл {filepath} пуст.")
    # Проверка обязательных колонок
    required_cols = {"feature_1", "feature_2", "target"}
    if not required_cols.issubset(df.columns):
        missing = required_cols - set(df.columns)
        raise ValueError(f"Отсутствуют колонки: {missing}")
    return df

Такой подход позволяет легко интегрировать код в CI/CD пайплайны (например, GitHub Actions) и развертывать его.