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

Как избавиться от рутины на проекте?

1.3 Junior🔥 191 комментариев
#Soft Skills#Архитектура и паттерны

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

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

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

Как избавиться от рутины на проекте

Рутинная работа — это проблема почти каждого проекта. За 10+ лет я выработал систематический подход к её устранению, который сильно повышает продуктивность.

Первый шаг: Идентификация рутины

Прежде всего, нужно отслеживать время на каждый вид задач:

from datetime import datetime, timedelta
from collections import defaultdict

class TaskTracker:
    def __init__(self):
        self.tasks = defaultdict(timedelta)
        self.start_time = None
        self.current_task = None
    
    def start_task(self, task_name: str):
        if self.start_time:
            elapsed = datetime.now() - self.start_time
            self.tasks[self.current_task] += elapsed
        self.current_task = task_name
        self.start_time = datetime.now()
    
    def report(self):
        for task, duration in sorted(self.tasks.items(), key=lambda x: x[1], reverse=True):
            hours = duration.total_seconds() / 3600
            print(f"{task}: {hours:.1f} часов")

Виды рутины и способы её избежать

1. Повторяющиеся проверки качества кода:

Решение: автоматизация линтинга и форматирования

# pre-commit hooks автоматизируют это
# .pre-commit-config.yaml
repos:
  - repo: https://github.com/psf/black
    rev: 23.3.0
    hooks:
      - id: black
  - repo: https://github.com/PyCQA/ruff
    rev: v0.0.260
    hooks:
      - id: ruff

Вместо того чтобы вручную проверять форматирование, запускаю black и ruff, и всё встало в строй.

2. Повторяющиеся тестовые данные:

import factory

class UserFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = User
    
    username = factory.Faker('username')
    email = factory.Faker('email')
    is_active = True

user = UserFactory()

3. Повторяющиеся скрипты и команды:

.PHONY: test lint format clean

test:
	pytest --cov=src/ --cov-report=html

lint:
	ruff check .
	black --check .

format:
	black .
	ruff check . --fix

clean:
	find . -type d -name __pycache__ -exec rm -rf {} +
	find . -type f -name "*.pyc" -delete

Теперь вместо длинных команд: make test, make lint, make format.

4. Ручное развертывание:

#!/bin/bash
set -e

echo "Running tests..."
python -m pytest --tb=short

echo "Running linters..."
python -m ruff check .
python -m black --check .

echo "Building Docker image..."
docker build -t myapp:latest .

echo "Pushing to registry..."
docker push myapp:latest

echo "Updating deployment..."
kubectl set image deployment/myapp myapp=myapp:latest

echo "Deploy complete!"

Систематический подход к автоматизации

Использую этапы для определения приоритетов:

Этап 1: Быстрый выигрыш (1-2 часа, экономит 5+ часов/неделю)

  • git hooks для форматирования кода
  • Bash скрипты для часто повторяющихся команд
  • CI/CD пайплайны для тестирования

Этап 2: Средний выигрыш (4-8 часов, экономит 10+ часов/неделю)

  • Фабрики для тестовых данных
  • Docker Compose для локальной разработки
  • Скрипты для миграций БД

Этап 3: Большой выигрыш (1-2 недели, экономит 20+ часов/неделю)

  • CI/CD с автоматическим деплоем
  • Система для багов и фич
  • Документация с вики

Конкретный пример: Проект с большим числом интеграций

На проекте e-commerce было много интеграций. Каждая требовала ручной проверки. Решение: единый скрипт

#!/usr/bin/env python
import subprocess
import sys
from pathlib import Path

INTEGRATIONS = ['payment', 'shipping', 'logging']

def run_integration_test(integration: str) -> bool:
    print(f"Testing {integration}...")
    result = subprocess.run(
        ['pytest', f'tests/integrations/{integration}/', '-v'],
        capture_output=True,
        text=True
    )
    if result.returncode != 0:
        print(f"FAILED: {integration}")
        print(result.stdout)
        return False
    print(f"PASSED: {integration}")
    return True

def main():
    failed = []
    for integration in INTEGRATIONS:
        if not run_integration_test(integration):
            failed.append(integration)
    
    if failed:
        print(f"Failed: {', '.join(failed)}")
        sys.exit(1)
    print("All integrations passed!")

if __name__ == '__main__':
    main()

Раньше каждый интегрейшен проверялся отдельно (30+ минут). Со скриптом — автоматически за несколько минут.

Принципы автоматизации

  • Если делаешь дважды — автоматизируй
  • Если кто-то говорит "а я сделаю руками быстрее" — это признак плохой автоматизации
  • Инвестируй в tooling: pre-commit, Make, Docker
  • Документируй процессы: люди забывают, скрипты нет
  • Версионируй конфиги: как код в git

Итоговый совет

Рутина обычно говорит: "Это просто и быстро". Но просто и быстро 10 раз в день = 10 часов в неделю впустую. Потратить день на автоматизацию — отличная инвестиция на долгосрок.