Комментарии (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 # ❌ Это моя кошмарная функция
Как я справляюсь:
- Спокойно разбираюсь — пишу юнит тесты
- Документирую — что делает функция (не как, а зачем)
- Рефакторю постепенно — небольшими шагами
# ✅ Мой план лечения
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)
- ✅ Мониторинг работает
- ✅ Архитектура чистая
- ✅ Откат возможен
Главное: я активно работаю над тем, чтобы минимизировать источники стресса, а не терпеть их.