Skip to content

Вопросы на собеседовании: Rust-разработчик

100 реальных вопросов с образцовыми ответами и пояснениями для уровня Senior Rust-разработчик.

Смотреть пример резюме: Rust-разработчик

Тренировка флешкарточками

Интервальное повторение · Hunter Pass

Вопросы

ownership

Передача String по значению переносит владение в параметр, поэтому старая привязка становится недоступной, а обычно уничтожить значение может только конечный инициализированный владелец.

  • При перемещении переносится представление String на стеке без клонирования буфера в куче, а компилятор запрещает доступ через исходную привязку.
  • Если функция возвращает String, владение переходит обратно и вызывающий код использует новую привязку без новой аллокации буфера.
  • Если конечный инициализированный владелец достигает обычной точки уничтожения, Drop выполняется там один раз; mem::forget, утечки и process abort означают, что Rust не гарантирует вызов деструктора.
  • Тип с реализацией Drop не может реализовывать Copy, иначе неявное дублирование нарушило бы гарантию единственного уничтожения.

Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат точно проследить владение и уничтожение вместо описания move как глубокого копирования.

ownership

Каждый вызов может получить более короткое повторное заимствование r, поэтому исходная изменяемая ссылка снова доступна после окончания дочернего заимствования.

  • Для параметра типа &mut i32 компилятор может интерпретировать аргумент как &mut *r, а не окончательно перемещать r в первый вызов.
  • Пока повторное заимствование активно, доступ через r приостановлен, поскольку более короткое дочернее заимствование временно держит используемый эксклюзивный доступ.
  • Второй вызов создаёт новое непересекающееся заимствование после возврата из первой функции.
  • Явное присваивание с перемещением r в другую привязку может поглотить исходную ссылку, поэтому это контекстное поведение, а не семантика Copy.

Зачем это спрашивают: Сильный ответ отличает повторное заимствование от копирования и называет период приостановки родительского заимствования.

lifetimes

Push разрешён только тогда, когда последнее использование общей ссылки происходит до изменения, а не просто до конца окружающего блока.

  • Non-lexical lifetimes определяют активную область по реальным использованиям, поэтому печать ссылки перед push может завершить заимствование раньше.
  • Использование ссылки после push сохраняет заимствование активным и запрещает изменение, поскольку рост Vec может реаллоцировать буфер и инвалидировать ссылку.
  • Вызов drop для Copy-ссылки не создаёт особой семантики lifetime, поэтому меньший scope или настоящее последнее использование яснее завершают доступ.
  • NLL сокращает заимствования, когда это позволяет поток данных, но никогда не сохраняет ссылку через потенциально инвалидирующее изменение.

Зачем это спрашивают: Интервьюер проверяет рассуждение от последнего использования и инвалидации, а не только от фигурных скобок.

lifetimes

Elision сначала назначает lifetimes входам и может вывести lifetime выхода только из единственного входа или из receiver.

  • Первое правило даёт каждой входной ссылке без аннотации отдельный lifetime, поэтому x и y в first получают разные lifetimes.
  • Второе правило назначает единственный входной lifetime всем выходным ссылкам без аннотации, когда входной lifetime ровно один.
  • Третье правило назначает lifetime &self или &mut self всем выходам без аннотации, когда входных lifetimes несколько и один принадлежит receiver.
  • Поэтому trim по второму правилу связывает output с s, first требует явной связи, а view по третьему правилу связывает output с self.

Зачем это спрашивают: Сильный ответ перечисляет правила по порядку и не придумывает правило кратчайшего lifetime для неоднозначных свободных функций.

promiseslifetimes

Я использую fn choose<'a>(x: &'a str, y: &'a str, pick_x: bool) -> &'a str, что ограничивает результат lifetime, допустимым для обоих входов.

  • В месте вызова выведенный 'a не превышает более короткий доступный lifetime входов, поскольку вернуться может любая ветка.
  • Аннотация связывает существующие заимствования, но не продлевает аллокации и не заставляет исходные значения жить одинаково долго.
  • Если функция всегда возвращает x, y нужен независимый или выведенный lifetime, чтобы сигнатура не создавала ложную связь.
  • Возвращаемый String подходит лучше, когда результат должен пережить оба заимствованных входа.

Зачем это спрашивают: Интервьюер проверяет понимание явных lifetimes как описания связей, а не способа продлить данные.

ownershipasyncasync-runtime

Bound 'static означает, что spawned future не должна содержать заимствований короче процесса, поэтому ей обычно следует владеть String или Arc на него.

  • Владеющий String удовлетворяет T: 'static, поскольку не содержит заимствованной ссылки, хотя сам String всё ещё может быть уничтожен при завершении или отмене задачи.
  • Значение типа &'static str отличается тем, что именно эта ссылка допустима в течение всей программы.
  • Box::leak создаёт 'static-ссылку ценой намеренного вечного удержания аллокации, превращая обычное владение задачи в постоянную утечку.
  • Перемещение String в async move блок или клонирование Arc даёт задаче явное конечное владение без утечки.

Зачем это спрашивают: Сильный ответ отделяет bound типа 'static от бессмертного значения и выбирает владение вместо утечки.

api

Общие ссылки ковариантны, аргументы функций контравариантны, а изменяемые ссылки инвариантны по типу значения из-за возможности записи.

  • &'a T ковариантна по 'a и T, поэтому более долгое допустимое заимствование можно сократить там, где ожидается короткое.
  • Указатель на функцию контравариантен по аргументу и ковариантен по результату, поскольку функция с более широким набором входов заменяет функцию с более узким.
  • &mut T ковариантна по собственному lifetime, но инвариантна по T, потому что держатель ссылки может заменить содержащийся T.
  • Если бы &mut &'long str преобразовывалась в &mut &'short str, в слот можно было бы записать короткую ссылку и позже прочитать её как 'long.

Зачем это спрашивают: Интервьюер оценивает, связывает ли кандидат направления variance с конкретным нарушением безопасности.

typesdesign

Я сохраню диапазоны байтов внутри String, если специализированная самоссылающаяся абстракция не обязательна, поскольку одно закрепление внешней структуры не фиксирует буфер String.

  • Обычная safe struct не может связать lifetime внутренней &str с собственным String и одновременно разрешить операции перемещения, замены, уничтожения или реаллокации владельца.
  • Offsets или Range<usize> переживают перемещения и позволяют методу заново создать slice после проверки границ UTF-8.
  • Pinned self-referential design должен создавать ссылки после pinning, отключать Unpin при зависимости от адреса и скрывать каждую операцию, способную инвалидировать referent.
  • Pin запрещает безопасное перемещение non-Unpin pointee, но не делает fields неизменяемыми и не мешает внутреннему String реаллоцироваться через открытый mutable API.

Зачем это спрашивают: Сильный ответ предпочитает устойчивое к перемещениям представление и точно описывает роль Pin и Unpin при неизбежной самоссылке.

error-handling

Option::take заменяет поле на None до возврата старого значения, поэтому заимствованный объект остаётся полностью инициализированным.

  • Прямое перемещение non-Copy поля через &mut self оставило бы дыру, которую позже мог бы увидеть вызывающий код или пройти Drop.
  • take реализует тот же ownership pattern, что и mem::replace с допустимым замещающим значением.
  • Переданный Vec сохраняет существующую аллокацию и уничтожается конечным владельцем в воркере, если владение снова не переместится.
  • Для обычного поля Vec mem::take оставляет Vec::default(), а replace лучше, если на месте нужен заранее выделенный буфер.

Зачем это спрашивают: Интервьюер проверяет понимание того, почему перемещение через изменяемое заимствование требует оставить допустимое значение.

monitoringownership

Rust сначала вызывает Drop::drop для bundle, затем уничтожает его поля в порядке объявления, а независимые локальные переменные уничтожает в обратном порядке объявления.

  • Drop::drop ещё может обращаться ко всем полям, поскольку их автоматическое уничтожение начинается только после возврата метода.
  • Перемещенная локальная переменная больше не уничтожается в старой привязке, поэтому Drop выполняет только её конечный владелец.
  • При раскрутке panic инициализированные значения уничтожаются по раскручиваемому стеку, но panic = abort не выполняет такую очистку.
  • Код должен явно кодировать зависимости завершения ресурсов, а не полагаться на неожиданный порядок объявления.

Зачем это спрашивают: Сильный ответ прослеживает детерминированное уничтожение и различает порядок полей, локальных переменных, перемещения и abort.

unsafetypestraits

Реализация должна доказать корректность каждого допустимого использования обёртки при том межпоточном доступе, который обещает Send или Sync.

  • Send разрешает перенос владения между потоками, а Sync означает возможность делить &Wrapper, поскольку &Wrapper реализует Send.
  • Auto traits выводятся из полей, поэтому Rc запрещает Send и Sync, а raw-pointer поля требуют от автора явного доказательства внешнего контракта.
  • unsafe impl Send может быть корректен для переносимого между потоками handle даже без Sync, если конкурентные вызовы через общие ссылки запрещены.
  • Доказательство охватывает aliasing, гарантии потоков C-библиотеки, потоки callbacks, уничтожение и thread affinity, а не только наличие mutex.

Зачем это спрашивают: Интервьюер оценивает, рассматриваются ли unsafe-реализации auto traits как полные утверждения о корректности.

concurrencyserializationasync-runtime

Я выберу модель по стоимости критических секций и семантике обновлений, используя RwLock только при доказанной пользе параллельных чтений, а actor для последовательного протокола изменений.

  • Arc<Mutex<_>> является самым простым выбором для коротких доступов и слабой конкуренции, а Arc разделяет только владение и не делает таблицу внутренне безопасной.
  • Arc<RwLock<_>> допускает конкурентных readers, но fairness writers, длительность чтений и поведение реализации нужно измерять на реальной нагрузке 95/5.
  • Actor владеет таблицей в одной задаче и принимает команды, убирая shared locking ценой очереди, дизайна сообщений и предела одного владельца.
  • Публикация copy-on-write снимков через ArcSwap подходит для редких обновлений и чтений без lock ценой пересборки и удержания версий таблицы.

Зачем это спрашивают: Сильный ответ сравнивает модели владения с заданной долей чтений и не объявляет RwLock всегда более быстрым.

async-runtime

Я ограничу канал под измеренное окно всплеска и задам поведение producers после того, как длительный вход превысит пропускную способность consumer.

  • Capacity 10 000 поглотит примерно одну секунду указанного дефицита в 10 000 событий в секунду, но конечная очередь не исправляет длительную перегрузку.
  • send().await распространяет backpressure, приостанавливая producers, а try_send реализует явный сброс или объединение, когда ожидание недопустимо.
  • reserve().await позволяет получить место до дорогого создания сообщения и не тратить работу во время насыщения.
  • Глубину очереди, ожидание отправки, отклонённые события и throughput consumer нужно наблюдать вместе, чтобы рост памяти не становился сигналом перегрузки.

Зачем это спрашивают: Интервьюер проверяет, связана ли ёмкость канала с расчётом, backpressure и явной политикой перегрузки.

configasync-runtimefan-out

Я использую watch для последней конфигурации, broadcast только для best-effort fan-out audit events и oneshot для единственного startup reply.

  • watch хранит одно текущее значение и уведомляет receivers об изменениях, поэтому медленный receiver может пропустить промежуточные конфигурации и прочитать последнюю.
  • broadcast хранит ограниченную последовательность для каждого receiver, а отставший receiver получает ошибку Lagged, поэтому compliance-grade audit records сначала требуют durable log.
  • oneshot переносит одно значение от одного sender к одному receiver без stream или повторной подписки.
  • Ни один из них не заменяет mpsc, когда множество producers должны распределять каждый work item одному consumer.

Зачем это спрашивают: Сильный ответ сопоставляет семантику доставки каналов трём конкретным требованиям коммуникации.

concurrencymemorycss

Producer должен опубликовать указатель через Release, а consumer загрузить его через Acquire перед разыменованием инициализированного объекта.

  • Release не даёт предшествующим записям инициализации переместиться после публикации, а совпавший Acquire, увидевший значение, делает эти записи видимыми consumer.
  • Relaxed достаточно для независимого счётчика статистики, поскольку он гарантирует атомарность, но не порядок окружающих данных.
  • SeqCst добавляет один глобальный порядок среди sequentially consistent операций, но не исправляет неверную схему владения или reclamation.
  • Дизайн всё ещё должен доказывать публикацию только допустимых указателей и отсутствие readers после освобождения аллокации.

Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат связывать гарантии ordering с требованиями владения и reclamation.

concurrency

Я использую самые слабые orderings, сохраняющие доказательство синхронизации state machine, часто AcqRel при успехе и Acquire или Relaxed при неудаче.

  • Успешная AcqRel-операция получает данные, опубликованные предыдущим состоянием, и публикует записи, связанные с новым состоянием.
  • Неудачное сравнение выполняет только load, поэтому его ordering не может быть Release или AcqRel и зависит от необходимости получить данные увиденного значения.
  • Возвращённый Err(actual) должен управлять retry, поскольку другой поток мог изменить состояние после чтения expected.
  • Правильные orderings не решают ABA или безопасный memory reclamation, которым нужен отдельный дизайн версий, epochs или владения.

Зачем это спрашивают: Сильный ответ выводит CAS orderings из путей успеха и неудачи, а не бездумно выбирает SeqCst.

async-runtimeconcurrency

Свободные workers могут забирать runnable tasks у занятых, но не могут вытеснить задачу, которая блокируется или слишком долго работает внутри одного poll.

  • Очереди workers улучшают locality, а внешние spawned или overflow tasks могут попадать в общие пути планирования, доступные другим workers.
  • Spawned Send task может продолжиться на другом worker после await, поэтому thread-local предположения нельзя переносить через приостановку.
  • Планирование Tokio кооперативно, поэтому futures должны возвращать Pending или иначе уступать управление за ограниченное время.
  • Work stealing балансирует готовые задачи, но не создаёт CPU capacity и не спасает все workers, заблокированные синхронными вызовами.

Зачем это спрашивают: Интервьюер проверяет понимание балансировки нагрузки и ограничений кооперативного scheduler.

async-runtimeendpointsasync

Я перенесу блокирующий вызов в spawn_blocking и ограничу допуск к этой работе, чтобы workers executor и blocking queue не насыщались бесконтрольно.

  • spawn_blocking использует blocking pool Tokio, чей большой верхний лимит по умолчанию не заменяет Semaphore, рассчитанный по CPU и latency budgets.
  • После запуска blocking closure abort её JoinHandle не останавливает closure, поэтому deadlines требуют кооперативной отмены или отбрасывания позднего результата.
  • Постоянный CPU-параллельный compression может лучше работать в отдельном Rayon pool с bounded bridge из async request handling.
  • block_in_place доступен только на multi-thread runtime и исполняет blocking code на текущем worker после передачи других задач, поэтому ему тоже нужен контроль capacity.

Зачем это спрашивают: Сильный ответ не только переносит вызов, но и учитывает admission, отмену и постоянный CPU parallelism.

health-checksasync

poll должен организовать уведомление текущего Waker после появления прогресса и никогда не блокировать поток executor.

  • Future проверяет readiness, регистрирует или обновляет текущий waker у источника и повторно проверяет состояние, если регистрация может конфликтовать с событием.
  • Повторная проверка закрывает lost-wakeup окно, в котором readiness меняется между первой проверкой и регистрацией waker.
  • Возврат Pending без будущего wake может навсегда усыпить задачу, а wake на каждом poll создаёт busy loop.
  • poll получает Pin<&mut Self>, поскольку состояние future может зависеть от стабильного адреса, а Ready возвращает конечный output.

Зачем это спрашивают: Интервьюер оценивает понимание продвижения через wake и гонки lost wakeup.

resilienceasync-runtime

Я сохраню частичное состояние протокола вне отменяемой ветки и буду выбирать только операции, Drop которых не теряет зафиксированный прогресс.

  • select! уничтожает futures проигравших веток, поэтому повторное создание не-cancellation-safe чтения в цикле может терять байты из приватного состояния future.
  • Parser может владеть постоянным буфером, добавлять байты через cancellation-safe read primitive и отдельно декодировать полные frames.
  • Долгоживущую future с внутренним прогрессом нужно создать и закрепить вне цикла, а не пересоздавать после каждого timeout.
  • Cancellation safety означает сохранение инвариантов и документированной семантики перезапуска при Drop на любом await, а не async-завершение cleanup.

Зачем это спрашивают: Сильный ответ связывает уничтожение select-ветки с конкретным владением частичным I/O progress.

Закрытые вопросы

  • 21

    Tokio::spawn сообщает, что future не реализует Send, потому что Rc<RefCell<_>> или guard живёт через await; какие исправления допустимы?

    asyncsmart-pointersasync-runtime
  • 22

    Граф async subscriptions использует Arc и для parent, и для child links и не освобождается после удаления внешних handles; в чём ошибка?

    async
  • 23

    Пять тысяч задач могут вызывать downstream API, допускающий только 64 конкурентных запроса; как обеспечить лимит через Tokio?

    async-runtimeapiconcurrency
  • 24

    Iterator chain по 10 миллионам u32 обвиняют в overhead по сравнению с ручным циклом; как проверить утверждение о zero-cost?

    iterationiteratorsperformance
  • 25

    Generic serializer инстанцирован для 40 типов сообщений и добавляет 18 MB к ограниченному binary; какой trade-off вы рассмотрите?

    serializationgenerics
  • 26

    Parser добавляет миллион records в изначально пустой Vec; как контролировать allocations и capacity?

    capacity
  • 27

    Девяносто пять процентов списков headers содержат не больше восьми элементов, остальные пять процентов содержат до сорока; поможет ли SmallVec<[Header; 8]>?

  • 28

    Трёхстадийный async pipeline передаёт network frames по 4 KB без копий payload; какие ownership costs остаются у дизайна на Bytes?

    asyncownershipdesign
  • 29

    Scan по 50 миллионам records читает только status и timestamp из большой struct; как layout повлияет на cache locality?

    cachingtypes
  • 30

    Criterion benchmark сообщает об ускорении на 7 процентов при шумных samples; какие доказательства нужны перед принятием оптимизации?

    optimization
  • 31

    Request handler быстр в изолированном benchmark, но много аллоцирует под нагрузкой; как профилировать его heap behavior?

    debuggingdata-structures
  • 32

    Scalar ASCII classifier обрабатывает buffers по 64 MB и потребляет 30 процентов CPU; когда оправдан AVX2 path?

    concurrencytypes
  • 33

    На review перечислите пять классов операций, разрешённых unsafe Rust, и объясните, какие проверки продолжают действовать.

    unsafe
  • 34

    Вы оборачиваете raw ring buffer, чей C API возвращает пары pointer и length; как открыть safe Rust slice API?

    types
  • 35

    Custom shared cell изменяет T через &self; какую роль играет UnsafeCell<T> и что wrapper всё ещё должен обеспечивать?

    unsafe
  • 36

    Создание [Packet; 1024] завершается ошибкой после инициализации элемента 317; как MaybeUninit избежит leaks и invalid values?

  • 37

    FFI parser получает ptr и len и хочет создать mutable Rust slice; какие условия raw-pointer validity, aliasing и provenance должны выполняться?

    ffiownershiptypes
  • 38

    Вы открываете Rust packet header в C и генерируете headers через cbindgen; что гарантирует repr(C) и что остаётся вашей ответственностью?

  • 39

    C client получает opaque Rust object и byte buffer; как определить allocation ownership и deallocation?

    ownership
  • 40

    C API вызывает Rust, а Rust позже вызывает C callback; как ограничить panics, errors, exceptions и lifetime callback?

    callbackserror-handlinglifetimes
  • 41

    Unsafe SIMD parser ускоряет representative workload с 6,2 ms до 4,4 ms при budget 5 ms; когда такой unsafe code оправдан?

    unsafe
  • 42

    Сервис имеет 24 request handlers, budget binary 20 MB и budget dispatch 2 microseconds; выбрать generics или trait objects на границе handlers?

    genericstraits
  • 43

    Реализация Decoder имеет один canonical output type, а trait Convert может поддерживать много target types; где использовать associated types и generic parameters?

    genericstraits
  • 44

    Plugin registry требует Box<dyn Plugin>, но trait имеет generic method, associated const и async fn run; почему он не dyn-compatible?

    asyncgenericstraits
  • 45

    Как generic associated type смоделирует decoder, который возвращает frame, заимствующий собственный input buffer?

    genericsownershiptraits
  • 46

    Buffer walker вызывает один callback с множеством несвязанных короткоживущих &[u8] slices; зачем использовать for<'a> Fn(&'a [u8])?

    callbackstypes
  • 47

    Factory сейчас возвращает один iterator adapter во всех paths, но позже может выбирать несвязанные implementations; когда уместен impl Trait?

    iterationtraitsiterators
  • 48

    Вы публикуете parsing library с invalid-header, unsupported-version и I/O failures; как спроектировать её Result error type?

    designerror-handling
  • 49

    Service binary загружает configuration, подключается к database и запускает parser library; где использовать anyhow без стирания полезной error semantics?

    databaseconfigerror-handling
  • 50

    Library function использует ? для dependency error; какое conversion происходит и как сохранить source chain без coupling public API с этой dependency?

    dependenciesapi
  • 51

    Парсер должен кэшировать срезы токенов из собственного входного буфера на 8 MB, но предложенная структура с полями String и &str не компилируется и должна оставаться перемещаемой; что вы выпустите?

    typescachingtokens
  • 52

    Сорок задач запросов изменяют карту сессий, а рефакторинг на Arc<Mutex<HashMap<...>>> увеличил p99 с 18 ms до 73 ms; как вы перестроите общее состояние?

    concurrencysessionsrefactoring
  • 53

    Метод обновления self.index из self.records не компилируется, потому что helper принимает &mut self, пока цикл уже заимствует self.records; как разделить заимствования без клонирования 600 000 записей?

    indexesownership
  • 54

    Лог размером 600 MB делится на 16 частей, но предложенная Rayon-closure изменяет один общий Vec и либо не проходит borrow checker, либо превращается в Arc<Mutex<_>>; как вы проведёте рефакторинг?

    closuresconcurrencyownership
  • 55

    Cache открывает fn find<'a>(&'a self, key: &'a str) -> Option<&'a Entry>, из-за чего callers удерживают или клонируют временные ключи при 30 000 lookup в секунду; как исправить lifetime API?

    lifetimeserror-handlingownership
  • 56

    После деплоя 0,7 процента Tokio-запросов навсегда остаются открытыми, хотя CPU и latency downstream нормальны; какие данные вы соберёте и какое исправление примете?

    deploymentasync-runtimelatency
  • 57

    Обновление кэша держит guard tokio::sync::Mutex во время HTTP-вызова на 300 ms, и 500 callers выстраиваются за ним; как исправить инцидент?

    asyncconcurrencyhttp
  • 58

    Две задачи перевода между счетами раз в день попадают в deadlock, потому что одна блокирует source, затем destination, а другая делает наоборот; какое безопасное для продакшена исправление вы внесёте?

    locking
  • 59

    Async endpoint загрузки вызывает синхронный антивирусный сканер на 140 ms, и scheduling latency Tokio растёт с 2 ms до 90 ms при 200 запросах в секунду; что вы измените?

    jobsendpointslatency
  • 60

    После load test active requests возвращаются к нулю, но число Tokio tasks растёт на 12 000 в час и следом увеличивается RSS; как найти и остановить накопление?

    load-testingasync-runtime
  • 61

    Telemetry-сервис использует один unbounded mpsc для lossless audit events и droppable debug events, потребляя 6 GB за четыре минуты при замедлении sink; какой overload contract вы реализуете?

  • 62

    tokio::select! отменяет write_all по timeout после частичной записи frame размером 32 KB в socket, а повторная отправка всего frame дублирует prefix и ломает protocol; как исправить sender?

    resiliencetypingasync-runtime
  • 63

    SIGTERM даёт сервису 20 секунд, но shutdown зависает, потому что background batcher всё ещё владеет sender, а три handlers вечно ждут recv; как ограничить завершение?

    batch
  • 64

    Контейнер с 4 vCPU запускает Tokio и Rayon по умолчанию, достигает 900 процентов runnable CPU в host metrics, а p99 удваивается под image processing; как убрать oversubscription?

    containersmonitoringasync-runtime
  • 65

    Downstream допускает 80 конкурентных вызовов, но 6 000 spawned tasks открывают sockets до ожидания capacity и исчерпывают file descriptors; где поставить admission control?

    concurrencydescriptorscapacity
  • 66

    После релиза RSS растёт с 1,1 GB до 4,6 GB за шесть часов при неизменном объёме запросов; как отличить утечку от эффектов allocator и mappings?

  • 67

    Сервис каждую минуту публикует новый неизменяемый routing snapshot размером 200 MB через ArcSwap, но 40 старых версий остаются из-за spawned jobs, которые держат Arc во время долгих retries; как остановить удержание?

    retentionsnapshotimmutability
  • 68

    Горячий путь JSON-routing делает 34 аллокации на запрос и потребляет 22 процента CPU при 120 000 запросов в секунду; какую оптимизацию вы примете?

    optimization
  • 69

    После релиза request p99 вырос с 42 ms до 96 ms при неизменной median latency; как изолировать регрессию и задать rollback gate?

    latencyrollback
  • 70

    Generic Tower middleware stack инстанцируется для 70 handlers, увеличивает binary на 22 MB и clean link time с 4 до 13 минут при неизменной request latency; что вы измените?

    middlewarelatencygenerics
  • 71

    Коллега предлагает SmallVec<[Header; 16]> и глобальный buffer pool для сокращения аллокаций, но профили показывают в среднем 18 headers и удержание buffers в idle tasks; что вы решите?

  • 72

    Packet decoder падает примерно один раз на два миллиарда frames только на ARM64, а failing path использует unsafe pointer fast path; как локализовать и исследовать сбой?

    unsafe
  • 73

    Новый unsafe wrapper кольцевого буфера предполагает, что producer не перезаписывает арендованные slots, но timeout path освобождает lease дважды; как сделать абстракцию безопасной?

    oopunsaferesilience
  • 74

    Rust-клиент получает повреждённые records только через C-библиотеку после обновления её headers, причём сбои сосредоточены на 32-bit targets; как изолировать нарушение FFI contract?

    ffi
  • 75

    repr(C)-структуру преобразуют в &[u8] вместе с padding для хеширования; Miri сообщает о чтении неинициализированных bytes, а production hashes различаются между builds, что вы выпустите?

    csstypes
  • 76

    Unsafe AVX2 parser на 24 процента быстрее, но расходится со scalar implementation на входах длиной 31 байт с 0xFF в конце; что вы выпустите?

    unsafetypesconflict
  • 77

    Miri успешно проверяет concurrent unsafe queue, но ThreadSanitizer сообщает о race после 10 миллионов операций в native stress test; какой вывод и следующие шаги обоснованы?

    concurrencydata-structuresunsafe
  • 78

    Самый частый production panic, 18 000 раз в день, происходит в expect("header present") на границе HTTP-запроса после того, как proxy перестал передавать header; что вы измените?

    proxyhttperrors
  • 79

    Один из 12 plugins вызывает panic при изменении общего состояния внутри catch_unwind и отравляет std::sync::Mutex; должен ли процесс продолжить работу?

    concurrencyerrors
  • 80

    Tonic-сервис сейчас преобразует все ошибки storage и validation в Status::internal, из-за чего клиенты повторяют плохие запросы 40 000 раз в час; как перестроить error boundary?

    reactresiliencevalidation
  • 81

    Command-line agent размером 9 MB должен очищать временные файлы после восстанавливаемого panic отдельной job и удалять остатки после падения процесса, а stateless container worker перезапускается при любом сбое; какие panic и cleanup contracts вы выберете?

    concurrencyerrorscontainers
  • 82

    Dependency v1 открывает внешний trait, а v2 предоставляет replacement type, но orphan rule не позволяет сервису реализовать старый trait для нового type во время миграции; какой bridge вы построите?

    migrationsdependenciestraits
  • 83

    Workspace компилирует serde-compatible payloads из crate v1 и v2, но функция отклоняет один как неверный Payload type, хотя имена и fields совпадают; как решить проблему?

    cargocontrol-flow
  • 84

    Включение TLS в одном workspace member унифицирует dependency feature и поднимает MSRV с 1.82 до 1.85, но embedded customer зафиксирован на 1.82; какое release decision вы примете?

    tlsdependencies
  • 85

    Из networking crate удалён один обязательный timeout callback, upstream оценивает исправление в шесть месяцев, а launch назначен через восемь недель; выбрать wrapper, fork, contribution или replacement?

    estimationcallbacksresilience
  • 86

    Major upgrade runtime меняет поведение timers в 26 сервисах, а за день можно развернуть только 10 процентов; как выполнить semver rollout?

    deployment
  • 87

    Gateway на 900 000 строк C++ должен перенести самый аварийный parser на Rust без изменения public C ABI и с overhead latency не больше 5 процентов; какой первый migration slice выбрать?

    migrationslatencygateway
  • 88

    Синхронный Rust API надёжно обслуживает 300 соединений, но новое требование составляет 15 000 в основном idle connections; как перейти на Tokio и не скрыть blocking calls?

    async-runtimeapi
  • 89

    Изменение protobuf enum должно пройти через 14 независимо развёртываемых Rust-сервисов и queued messages возрастом до шести месяцев; какой порядок migration предотвратит fleet-wide decode failure?

    data-structuresenumsmigrations
  • 90

    Предложение заменяет epoll на io_uring в сервисе с 80 000 соединений, но только 7 процентов CPU уходит на syscalls и 15 процентов hosts используют старое kernel; что вы решите?

  • 91

    Allocator profiles показывают 38 процентов fragmentation в cache process на 24 GB, а proposal custom arena обещает сэкономить 6 GB; как решить, стоит ли её деплоить?

    cachingdeploymentconcurrency
  • 92

    Tonic-сервис повторяет non-idempotent CreateOrder при downstream overload, создавая 0,3 процента duplicate orders; какую Tower policy и API change вы внесёте?

    idempotency
  • 93

    Middle-инженер добавил 27 вызовов clone, чтобы import на 50 000 строк прошёл borrow checker, и удвоил peak memory; какое ограниченное упражнение вы дадите?

    ownershipmentoringmemory
  • 94

    Инженер регулярно держит guards tokio::sync::Mutex во время HTTP awaits, а одно изменение вызвало stall очереди на 60 секунд; как обучить его и проверить улучшение?

    asyncconcurrencydata-structures
  • 95

    Коллега предлагает unsafe get_unchecked ради 2 процентов в шумном parser benchmark до profiling продакшена; какое mentoring intervention вы проведёте?

    mentoringprofilingunsafe
  • 96

    Новый инженер обернул каждое поле сервиса в Arc<Mutex<_>>, создав 14 locks и периодический contention в worker с одним владельцем; какое упражнение изменит эту привычку?

    concurrency
  • 97

    Инженер отправил public API с девятью generic parameters, шестью associated-type bounds и compiler errors на 80 строк для callers; как научить его более простой boundary?

    mentoringapigenerics
  • 98

    Outage вызвал unsafe buffer wrapper, который вы одобрили, а такой же unchecked length pattern есть ещё в 11 модулях; что должно получиться из retrospective?

    unsafe
  • 99

    Unsafe optimization на 400 строк сокращает microbenchmark с 5,1 ms до 4,7 ms, но production p99 не меняется, а для поддержки нужны два специалиста; оставить её?

    optimizationunsafe
  • 100

    Rust-платформа имеет 37 unsafe sites, build на 19 минут и dependency, блокирующую обновления MSRV, но в квартале есть только шесть engineer-weeks; какой debt вы запланируете?

    dependenciesunsafe