Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+717новых вакансий за сутки·60 871вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 951
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python9 224
  • Облачные технологии4 076
  • QA вакансии1 588
  • Android1 322
  • Инженер данных805
  • Продакт-менеджер368

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C#210
  • C++204

DevOps и инфраструктура

  • DevOps вакансии2 713
  • Kubernetes2 308
  • Linux-инфраструктура1 890
  • Terraform / IaC1 406
  • CI/CD842
  • Мониторинг и Observability645
  • SRE226
  • Кибербезопасность84

Аналитика и данные

  • Аналитик данных483
  • Data Scientist469
  • Бизнес-аналитик349
  • Системный аналитик48

Другие направления

  • Проджект-менеджер139
  • UI/UX дизайн71
  • Ручное тестирование14

По регионам

  • Вакансии в США24 791
  • Вакансии в Европе9 439
  • Работа в России2 924
  • Вакансии в Канаде2 178

По формату

  • Удалённые вакансии43 505
  • Релокация в США24 791
  • Гибридная работа3 370
  • Офисная работа2 525

По уровню

  • Senior вакансии20 898
  • Middle вакансии12 438
  • Junior вакансии3 864

Сейчас нанимают

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме tRPCВсе вопросы
tRPCMiddleОпыт

Расскажите о случае, когда вы улучшали performance, accessibility, testing или maintainability в проекте на tRPC.

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Пример из практики: добавление Zod-валидации на все процедуры сразу через middleware улучшило maintainability; подключение superjson устранило баги с Date-сериализацией; покрытие API-слоя интеграционными тестами через createCallerFactory дало уверенность при рефакторинге.

1. Maintainability: вынос общей логики в middleware

Повторяющаяся проверка аутентификации была скопирована в каждую защищённую процедуру. Вынесли её в reusable middleware через t.middleware и создали protectedProcedure:

// server/trpc/middleware.ts
import { TRPCError } from '@trpc/server';
import { t } from './init';

const isAuthed = t.middleware(({ ctx, next }) => {
  if (!ctx.session?.userId) {
    throw new TRPCError({ code: 'UNAUTHORIZED' });
  }
  return next({ ctx: { ...ctx, userId: ctx.session.userId } });
});

export const protectedProcedure = t.procedure.use(isAuthed);

После этого каждый роутер просто импортирует protectedProcedure вместо дублирования условия.

Контекст задачи

В одном из проектов tRPC-бэкенд вырос органически: около 40 процедур, разбросанных по 8 роутерам. Со временем накопились проблемы: дублирование логики валидации, медленные тесты из-за реальных HTTP-запросов, отсутствие обработки ошибок для клиента, и утечки типов Date в JSON.

Что улучшили и как

2. Testing: createCallerFactory для быстрых интеграционных тестов

Тесты через HTTP занимали 3–5 с на старт. Переписали на прямые вызовы:

// tests/user.test.ts
import { createCallerFactory } from '@trpc/server';
import { appRouter } from '../server/trpc/router';
import { createMockContext } from './helpers';

const createCaller = createCallerFactory(appRouter);

test('user.getById returns correct user', async () => {
  const ctx = createMockContext({ userId: 'u1' });
  const caller = createCaller(ctx);
  const user = await caller.user.getById({ id: 'u1' });
  expect(user.name).toBe('Alice');
});

Время прогона 40 тестов сократилось с 18 с до 1.2 с — нет реального HTTP, нет запуска сервера.

3. Корректная сериализация: подключение superjson

Клиент получал даты как строки вместо Date-объектов, что вызывало баги в компонентах с форматированием. Подключили трансформер:

// server/trpc/init.ts
import { initTRPC } from '@trpc/server';
import superjson from 'superjson';

export const t = initTRPC.context<Context>().create({
  transformer: superjson,
});
// lib/trpc.ts (клиент)
import { createTRPCReact } from '@trpc/react-query';
import superjson from 'superjson';
import { httpBatchLink } from '@trpc/client';
import type { AppRouter } from '../server/trpc/router';

export const trpc = createTRPCReact<AppRouter>();

export const trpcClient = trpc.createClient({
  links: [
    httpBatchLink({
      url: '/api/trpc',
      transformer: superjson,
    }),
  ],
});

4. Accessibility ошибок: форматированный errorFormatter

Zod-ошибки валидации возвращались как непонятный JSON. Добавили errorFormatter, который возвращает поле fieldErrors для форм:

export const t = initTRPC.context<Context>().create({
  transformer: superjson,
  errorFormatter({ shape, error }) {
    return {
      ...shape,
      data: {
        ...shape.data,
        fieldErrors:
          error.cause instanceof ZodError
            ? error.cause.flatten().fieldErrors
            : null,
      },
    };
  },
});

Подводные камни

  • Middleware применяется цепочкой — порядок вызова .use() имеет значение: логирование должно идти до проверки авторизации, иначе неавторизованные запросы не логируются.
  • createCallerFactory не проходит через HTTP-слой — заголовки, cookies и rate-limiting не тестируются этим способом. Для end-to-end нужен отдельный слой тестов.
  • При добавлении superjson после запуска в продакшене старые клиенты (без трансформера) перестанут корректно парсить ответы — нужен координированный деплой.
  • Refactoring роутеров с переименованием процедур ломает клиентский код сразу — это полезно, но нужно учитывать при CI: TypeScript должен проверять весь monorepo.
  • Глубокое вложение middleware увеличивает время вывода типов TypeScript — разбивайте сложные цепочки на именованные переменные.

Частые вопросы на собеседовании

  • Чем tRPC отличается от REST и GraphQL? Когда стоит выбрать tRPC вместо них?
  • Как реализовать защищённые процедуры (protected procedures) с помощью middleware и context?
  • Как добавить валидацию входных данных к процедурам tRPC с помощью Zod?
  • В каких типах frontend-проектов tRPC даёт реальный выигрыш, а где будет избыточен или неудачен?

Что портит ответ

  • Выдумывать опыт или говорить слишком общими фразами
  • Не объяснять свою личную роль в работе с tRPC
  • Не показывать результат, метрики или извлечённые уроки

Что слушает интервьюер

  • Может подготовить честный пример использования tRPC
  • Показывает свою роль, решения и результат
  • Умеет рефлексировать над trade-offs и уроками

Как вы знаете этот вопрос?

Проверить себя по теме tRPC →

Связанные темы

tRPCexperience-storytellingtechnical-communicationtechnology-selectiontrade-off-analysis