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

Что заставляет нервничать в работе?

1.8 Middle🔥 151 комментариев
#Python Core

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

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

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

Источники напряжения в разработке

Честный взгляд на рабочие стрессы

Я предпочитаю честно и конструктивно рассказать о вещах, которые вызывают напряжение, и как я их решаю.

1. Плохо организованный код (наследуемый от других)

Что вызывает нервозность:

# ❌ Когда я вижу такой код в production
def process_data(d, x, y, z):
    # 500 строк логики без комментариев
    # Переменные с неясными именами
    # Обработка ошибок через try-except (все ошибки молча игнорируются)
    try:
        result = compute_something_complex(d, x, y, z)
        for item in result:
            save_to_db(item)  # Может упасть, но молча
        return result
    except:
        pass  # ❌ Это моя кошмарная функция

Как я справляюсь:

  1. Спокойно разбираюсь — пишу юнит тесты
  2. Документирую — что делает функция (не как, а зачем)
  3. Рефакторю постепенно — небольшими шагами
# ✅ Мой план лечения
plan = [
    "1. Написать тесты для существующей функции",
    "2. Разбить на подфункции (каждая в 20-30 строк)",
    "3. Добавить типизацию",
    "4. Добавить понятные имена переменных",
    "5. Обработать ошибки явно"
]

2. Race conditions и асинхронные баги

Что вызывает нервозность:

# ❌ Баги, которые воспроизводятся в 1 случае из 1000
# Типичный race condition в asyncio:

async def process_order(order_id, user_id, db):
    # Thread 1 и Thread 2 вызывают одновременно
    user = await db.get_user(user_id)  # ← Race condition здесь!
    
    # user.balance может измениться между get и update
    if user.balance < order_total:
        # Другой поток уже потратил деньги
        raise InsufficientFundsError
    
    user.balance -= order_total
    await db.update_user(user)  # ← Потеря обновления

Как я справляюсь:

# ✅ Решение: SELECT FOR UPDATE
query = """
SELECT * FROM users WHERE id = @user_id FOR UPDATE SKIP LOCKED
"""
user = await db.fetch_one(query, user_id=user_id)
# Теперь юзер заблокирован, race condition исключена

# Или в SQLAlchemy 2.0:
from sqlalchemy import select

stmt = select(User).where(User.id == user_id).with_for_update()
user = await session.execute(stmt).scalar()

3. Неправильные архитектурные решения

Что вызывает нервозность:

# ❌ Плохое архитектурное решение, которое обнаружилось слишком поздно
# Вся бизнес-логика в API handlers:

from fastapi import FastAPI

app = FastAPI()

@app.post("/orders")
async def create_order(request: Request, db: Session):
    # Здесь 200 строк бизнес-логики:
    # - валидация
    # - калькуляция цены
    # - проверка инвентаря
    # - создание платежа
    # - отправка email
    # - логирование
    # - аналитика
    # ВСЁ в одной функции!
    
    # Теперь нельзя:
    # - Переиспользовать логику в другом endpoint'е
    # - Тестировать логику отдельно
    # - Заменить email на SMS

Как я справляюсь:

# ✅ Правильная архитектура: Clean Architecture
from fastapi import APIRouter
from application.use_cases import CreateOrderUseCase

router = APIRouter()

@router.post("/orders")
async def create_order(request: CreateOrderRequest) -> CreateOrderResponse:
    # Тонкий handler — только парсинг и ответ
    use_case = CreateOrderUseCase(order_repo, payment_service, email_service)
    order = await use_case.execute(request.to_dto())
    return CreateOrderResponse.from_entity(order)

# Бизнес-логика в отдельном слое:
class CreateOrderUseCase:
    def __init__(self, order_repo, payment_service, email_service):
        self.order_repo = order_repo
        self.payment_service = payment_service
        self.email_service = email_service
    
    async def execute(self, dto: CreateOrderDTO) -> Order:
        # Только бизнес-логика, никаких HTTP деталей
        order = Order.create(user_id=dto.user_id, items=dto.items)
        await self.payment_service.charge(order.total)
        await self.email_service.send_confirmation(order)
        return await self.order_repo.save(order)

4. Отсутствие мониторинга и видимости

Что вызывает нервозность:

# ❌ Production падает, но я не знаю, почему
# Логи отключены или не отправляются
# Метрики не собираются
# Алерты не настроены

# Звонок в 2 ночи: "Сервис не отвечает!"
# Я включу логи, перезагружу сервер, надеюсь на лучшее

Как я справляюсь:

# ✅ Правильный мониторинг с первого дня
import logging
import prometheus_client

# 1. Логирование
logger = logging.getLogger(__name__)

async def process_order(order_id):
    logger.info(f"Processing order {order_id}")
    try:
        order = await fetch_order(order_id)
        logger.debug(f"Fetched order: {order}")
        await charge_payment(order)
        logger.info(f"Order {order_id} processed successfully")
    except PaymentError as e:
        logger.error(f"Payment failed for order {order_id}", exc_info=True)
        raise

# 2. Метрики
from prometheus_client import Counter, Histogram, Gauge

order_processing_time = Histogram(
    'order_processing_seconds',
    'Time to process order'
)
orders_processed = Counter(
    'orders_processed_total',
    'Total orders processed',
    ['status']
)
active_orders = Gauge(
    'active_orders',
    'Number of orders being processed'
)

# 3. Использование
with order_processing_time.time():
    active_orders.inc()
    try:
        await process_order(order_id)
        orders_processed.labels(status='success').inc()
    except Exception:
        orders_processed.labels(status='failed').inc()
    finally:
        active_orders.dec()

5. Спешка и давление дедлайнов

Что вызывает нервозность:

# ❌ Менеджер: "Это нужно завтра!"
# Я: "У меня нет ни тестов, ни документации"
# Менеджер: "Не важно, главное работает"

Как я справляюсь:

# ✅ Честная оценка и коммуникация
my_approach = """
1. Оценю реалистически:
   - На качественное решение: 3 дня
   - На hack'ичное решение: 1 день

2. Предложу варианты:
   - "Вариант A: сделаю за 3 дня, будет нормально"
   - "Вариант B: сделаю за 1 день, потом придётся рефакторить"
   - "Вариант C: используем existing library, 30 минут"

3. Дам знать о рисках:
   - "Если сделаю быстро, будут баги"
   - "Если поспешу, потом потеряю неделю на отладку"

4. Продвигаю мудрость:
   - "Медленно сейчас = быстро потом"
   - "Быстро сейчас = медленно потом"
"""

6. Отсутствие тестов в legacy коде

Что вызывает нервозность:

# ❌ Изменил одну строку, и всё упало
# Но я не знаю, где и почему
# Нет тестов, чтобы проверить

# Каждый деплой = риск

Как я справляюсь:

# ✅ Добавляю тесты постепенно (Boy Scout Rule)
# При каждом баге пишу тест, который бы его выловил

# Пример: нашёл баг в payment processing
def test_payment_with_zero_amount():
    """Проверяю, что платёж с нулевой суммой отклоняется."""
    payment = Payment(amount=0)
    with pytest.raises(InvalidPaymentError):
        payment.validate()

# Добавляю это в тесты, fix'ю код, баг больше не вернётся

7. Непредсказуемое поведение в production

Что вызывает нервозность:

# ❌ Локально работает, в production падает
# Разные версии зависимостей
# Разные переменные окружения
# Race conditions, которые не воспроизводятся

# Я не сплю ночью, думаю: "Может быть, это из-за..."

Как я справляюсь:

# ✅ Контролирую окружение
specs = """
1. Docker для идентичной окружения (dev = prod)
2. Environment variables (12factor app)
3. Feature flags для постепенного roll-out
4. Smoke tests перед деплоем
5. Мониторинг и алерты
"""

# Пример Dockerfile
FROM python:3.11-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt --no-cache-dir

COPY . .
CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0"]

Что вызывает МЕНЬШЕ нервозности

things_that_calm_me_down = [
    "✅ Хорошее тестовое покрытие (90%+)",
    "✅ Правильная архитектура (Clean Architecture)",
    "✅ Понятные имена переменных",
    "✅ Мониторинг и логирование",
    "✅ Code review культура",
    "✅ Документация",
    "✅ Постепенное внедрение изменений",
    "✅ Откат возможен (git, БД migrations)",
    "✅ Честное общение с командой",
    "✅ Время на рефакторинг"
]

Как я управляю стрессом

my_coping_strategies = {
    "Технически": [
        "Пишу тесты перед изменениями",
        "Добавляю мониторинг",
        "Изучаю документацию",
        "Провожу code review"
    ],
    "Психологически": [
        "Принимаю неопределённость",
        "Сосредоточиваюсь на том, что могу контролировать",
        "Не беру личное то, что произошло",
        "Учусь на ошибках (своих и других)"
    ],
    "Физически": [
        "Спорт помогает",
        "Нормальный сон (не ночные правки)",
        "Перерывы между сессиями"
    ]
}

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

Нервозность в работе — это нормально, если её источники — сложность задач, а не недостаток контроля.

Я нервничаю когда:

  • ❌ Нет видимости (логи, мониторинг)
  • ❌ Нет тестов
  • ❌ Спешка + давление
  • ❌ Плохая архитектура

Я спокоен когда:

  • ✅ Хороший процесс (тесты, review)
  • ✅ Мониторинг работает
  • ✅ Архитектура чистая
  • ✅ Откат возможен

Главное: я активно работаю над тем, чтобы минимизировать источники стресса, а не терпеть их.

Что заставляет нервничать в работе? | PrepBro