Скрипт должен падать предсказуемо: 6 проверок до запуска в прод
Если python-скрипт живёт дольше одного запуска, его надо проверять не “на глаз”, а по схеме. Иначе он ломается там, где не ждёшь: на пустом файле, на кривой кодировке, на повторной записи, на таймауте API.
— Сначала проверяй вход: файл существует, формат тот, кодировка читается, обязательные поля не пустые.
— Потом ограничивай объём: лимит на размер файла, число строк, глубину рекурсии, размер ответа от внешнего сервиса.
— Любой внешний вызов оборачивай в retry + timeout, но retry делай только для идемпотентных операций.
— Логи пиши так, чтобы по одному сообщению было ясно: что обрабатывали, на каком шаге упали, какой был payload.
— Ошибки дели на ожидаемые и аварийные: первые обрабатывай, вторые пусть валят задачу с понятным trace.
Отдельная ловушка — временные файлы и частичные записи. Сначала пишешь в tmp, потом атомарно переименовываешь; иначе после падения у тебя остаётся “почти готовый” результат, который кто-то примет за валидный.
И ещё: любой скрипт без теста на один плохой кейс — это не автоматизация, а надежда. Лучше один раз зашить проверки, чем потом вручную искать, где именно всё съехало.
Если python-скрипт живёт дольше одного запуска, его надо проверять не “на глаз”, а по схеме. Иначе он ломается там, где не ждёшь: на пустом файле, на кривой кодировке, на повторной записи, на таймауте API.
— Сначала проверяй вход: файл существует, формат тот, кодировка читается, обязательные поля не пустые.
— Потом ограничивай объём: лимит на размер файла, число строк, глубину рекурсии, размер ответа от внешнего сервиса.
— Любой внешний вызов оборачивай в retry + timeout, но retry делай только для идемпотентных операций.
— Логи пиши так, чтобы по одному сообщению было ясно: что обрабатывали, на каком шаге упали, какой был payload.
— Ошибки дели на ожидаемые и аварийные: первые обрабатывай, вторые пусть валят задачу с понятным trace.
Отдельная ловушка — временные файлы и частичные записи. Сначала пишешь в tmp, потом атомарно переименовываешь; иначе после падения у тебя остаётся “почти готовый” результат, который кто-то примет за валидный.
И ещё: любой скрипт без теста на один плохой кейс — это не автоматизация, а надежда. Лучше один раз зашить проверки, чем потом вручную искать, где именно всё съехало.
React Server Actions ломают границы между UI и мутирующей логикой — и это надо проектировать заранее
Server Actions удобно вешать на форму и забывать про отдельный API-слой. Но если рядом уже живут TanStack Query, optimistic UI и сложная авторизация, начинаются дубли: одно и то же действие вызывают из формы, модалки и фонового процесса.
Перед внедрением проверьте три вещи:
— где проходит граница между чтением и записью;
— кто владеет инвалидцией кеша;
— можно ли вызвать действие не из браузерной формы, а из обработчика, теста или cron-джобы.
Главная ошибка — тащить в Action всю бизнес-логику. Тогда её сложно переиспользовать, мокать и переносить между Next.js, Remix и обычным backend-for-frontend. Лучше держать Action тонким адаптером: валидация, вызов доменного сервиса, возврат результата.
И ещё одно: Action не отменяет необходимость явных контрактов. Если на выходе у вас меняются поля, сообщения об ошибке и побочные эффекты, фронт быстро превращается в набор хрупких допущений. Разделяйте: Action для транспорта, сервис для правил, схема для данных.
Server Actions удобно вешать на форму и забывать про отдельный API-слой. Но если рядом уже живут TanStack Query, optimistic UI и сложная авторизация, начинаются дубли: одно и то же действие вызывают из формы, модалки и фонового процесса.
Перед внедрением проверьте три вещи:
— где проходит граница между чтением и записью;
— кто владеет инвалидцией кеша;
— можно ли вызвать действие не из браузерной формы, а из обработчика, теста или cron-джобы.
Главная ошибка — тащить в Action всю бизнес-логику. Тогда её сложно переиспользовать, мокать и переносить между Next.js, Remix и обычным backend-for-frontend. Лучше держать Action тонким адаптером: валидация, вызов доменного сервиса, возврат результата.
И ещё одно: Action не отменяет необходимость явных контрактов. Если на выходе у вас меняются поля, сообщения об ошибке и побочные эффекты, фронт быстро превращается в набор хрупких допущений. Разделяйте: Action для транспорта, сервис для правил, схема для данных.
This media is not supported in your browser
VIEW IN TELEGRAM
Google выпустил Android 17
Android получил встроенную Gemini с функциями автоматизации задач, конспектирования браузера и редактирования медиа. Обновление принесло новый интерфейс Bubble, двухкамерную запись и игровой режим для складных телефонов. Критический момент: Gemini Intelligence требует Gemini Nano v3 и минимум 12 ГБ RAM, что ограничивает аудиторию премиум-девайсов. Это создаёт потенциал для таргетинга криптооффера на узкий сегмент владельцев флагманов, готовых пл…
➡️ Читайте на сайте: https://aff.top/blog/google-vypustil-android-17
🧠 Ещё больше инсайтов → в канале AFF.top
Android получил встроенную Gemini с функциями автоматизации задач, конспектирования браузера и редактирования медиа. Обновление принесло новый интерфейс Bubble, двухкамерную запись и игровой режим для складных телефонов. Критический момент: Gemini Intelligence требует Gemini Nano v3 и минимум 12 ГБ RAM, что ограничивает аудиторию премиум-девайсов. Это создаёт потенциал для таргетинга криптооффера на узкий сегмент владельцев флагманов, готовых пл…
➡️ Читайте на сайте: https://aff.top/blog/google-vypustil-android-17
🧠 Ещё больше инсайтов → в канале AFF.top