Rust Developer interview questions
100 real questions with model answers and explanations for Senior Rust Developer candidates.
See a Rust Developer resume example →Practice with flashcards
Spaced repetition · Hunter Pass
Questions
Passing the String by value transfers ownership to the parameter, so the old binding becomes unusable and only the final initialized owner can normally drop the value.
- The move transfers the String's stack representation without cloning its heap buffer, and Rust invalidates the source binding at compile time.
- If the callee returns the String, ownership moves back and the caller may use the returned binding without a new heap allocation.
- If the final initialized owner reaches a normal drop point, Drop runs there once; mem::forget, leaks, and process abort mean Rust does not guarantee that destruction runs.
- A type that implements Drop cannot also implement Copy, because implicit duplication would make single destruction impossible to guarantee.
Why interviewers ask this: The interviewer checks whether the candidate can trace ownership and destruction precisely instead of describing a move as a deep copy.
Each call can receive a shorter reborrow of r, so the original mutable reference becomes usable again after that child borrow ends.
- At a parameter expecting &mut i32, the compiler can treat the argument as &mut *r rather than permanently moving r into the first call.
- While the reborrow is active, access through r is suspended because the shorter child borrow temporarily holds the usable exclusive access.
- The second call starts a new non-overlapping reborrow after the first function call has returned.
- An explicit assignment that moves r into another binding can consume the original reference, so this behavior is contextual rather than Copy semantics.
Why interviewers ask this: A strong answer distinguishes reborrowing from copying and identifies the interval during which the parent borrow is suspended.
The push is accepted only when the shared borrow's last use occurs before the mutation, not merely when its enclosing block ends.
- Non-lexical lifetimes derive the active region from actual uses, so printing the reference before push can end the borrow early.
- Using that reference after push keeps the borrow live and rejects the mutation because Vec growth could reallocate and invalidate it.
- Calling drop on a Copy reference does not create special lifetime semantics, so a smaller scope or a true last use is the clearer way to end access.
- NLL shortens borrows when the data flow permits it but never allows a reference to survive a potentially invalidating mutation.
Why interviewers ask this: The interviewer is testing whether the candidate reasons from last use and invalidation rather than from braces alone.
Elision assigns input lifetimes first and can infer an output only from one input lifetime or from a receiver lifetime.
- Rule one gives every elided input reference its own lifetime parameter, so x and y in first receive distinct inferred lifetimes.
- Rule two assigns the sole input lifetime to all elided output references when there is exactly one input lifetime.
- Rule three assigns the lifetime of &self or &mut self to all elided outputs when there are several input lifetimes and one is the receiver.
- Therefore trim ties its output to s by rule two, first needs an explicit relationship, and view ties its output to self by rule three.
Why interviewers ask this: A strong answer states the rules in order and does not invent a shortest-lifetime rule for ambiguous free functions.
I would use fn choose<'a>(x: &'a str, y: &'a str, pick_x: bool) -> &'a str, which limits the result to a lifetime valid for both inputs.
- At a call site, the inferred 'a is no longer than the shorter usable input lifetime because either branch may be returned.
- The annotation relates existing borrows and does not extend either allocation or force both original values to live equally long.
- If the function always returns x, y should have an independent or elided lifetime so the signature does not impose a false relationship.
- Returning an owned String is the right alternative when the result must outlive both borrowed inputs.
Why interviewers ask this: The interviewer checks whether explicit lifetimes describe relationships rather than create longer-lived data.
The 'static bound means the spawned future must contain no borrow shorter than the process, so it should usually own the String or an Arc to it.
- An owned String satisfies T: 'static because it contains no borrowed reference, even though that String can still be dropped when the task completes or is cancelled.
- A value of type &'static str is different because that particular reference is valid for the entire program.
- Box::leak can manufacture a 'static reference by intentionally never freeing the allocation, which turns ordinary task ownership into permanent retention.
- Moving the String into an async move block or cloning an Arc gives the task explicit finite ownership without a leak.
Why interviewers ask this: A strong answer separates a 'static type bound from an immortal value and chooses ownership over leaking.
Shared references are covariant, function arguments are contravariant, and mutable references are invariant in their referent type because they permit writes.
- &'a T is covariant in 'a and in T, so a longer valid borrow can be shortened where a shorter one is accepted.
- A function pointer is contravariant in its argument and covariant in its return, since a function accepting more possible inputs can replace one accepting fewer.
- &mut T is covariant over its own borrow lifetime but invariant in T, because code holding it may replace the contained T.
- If &mut &'long str could become &mut &'short str, the shorter reference could be written into a slot later read as 'long, creating a dangling reference.
Why interviewers ask this: The interviewer is evaluating whether the candidate can connect variance directions to a concrete soundness failure.
I would store byte ranges into the String unless a specialized self-referential abstraction is essential, because pinning the outer struct alone does not freeze the String buffer.
- A straightforward safe struct cannot tie an internal &str lifetime to its own String while still allowing operations that move, replace, drop, or reallocate that owner.
- Offsets or Range<usize> survive moves and let a method create a fresh slice after validating UTF-8 boundaries.
- A pinned self-referential design must initialize references after pinning, opt out of Unpin when address stability matters, and hide every operation that could invalidate the referent.
- Pin prevents safe movement of a non-Unpin pointee but does not make fields immutable or stop an inner String from reallocating through an exposed mutable API.
Why interviewers ask this: A strong answer prefers a move-safe representation and states exactly what Pin and Unpin do when self-reference is unavoidable.
Option::take replaces the field with None before returning the old value, so the borrowed object remains fully initialized.
- Moving a non-Copy field directly through &mut self would leave a hole that the caller could later observe or Drop could traverse.
- take performs the same ownership pattern as mem::replace with a valid replacement value.
- The transferred Vec keeps its existing allocation and is dropped by the worker's eventual owner unless ownership moves again.
- For a plain Vec field, mem::take leaves Vec::default(), while replace is preferable when a preallocated replacement should remain.
Why interviewers ask this: The interviewer checks whether the candidate understands why moving through a mutable borrow requires restoring a valid value.
Rust first calls the bundle's Drop::drop and then drops its fields in declaration order, while independent local variables are dropped in reverse declaration order.
- Drop::drop can still access all fields because automatic field destruction starts only after that method returns.
- A moved-out local is no longer dropped at its old binding, so only its final owner performs destruction.
- During panic unwinding, initialized values are dropped along the unwound stack, but panic = abort performs no unwinding cleanup.
- Code should encode required shutdown dependencies explicitly rather than rely on a surprising declaration order.
Why interviewers ask this: A strong answer traces deterministic destruction and distinguishes field order, local order, moves, and abort behavior.
The implementation must prove that every valid use of the wrapper remains sound under the exact cross-thread access promised by Send or Sync.
- Send permits ownership to move between threads, while Sync means &Wrapper can be shared because &Wrapper is Send.
- Auto traits are derived from fields, so Rc prevents Send and Sync, and raw-pointer-like fields force the wrapper author to establish the external contract explicitly.
- An unsafe impl Send may be sound for a thread-transferable handle even when Sync is not, if concurrent calls through shared references are forbidden.
- The proof must cover aliasing, C library thread guarantees, callback threads, destruction, and any thread affinity rather than merely wrapping calls in a mutex.
Why interviewers ask this: The interviewer evaluates whether unsafe auto-trait implementations are treated as complete soundness claims.
I would choose from critical-section cost and update semantics, using an RwLock only after read concurrency proves useful and an actor when updates form a sequential protocol.
- Arc<Mutex<_>> is the simplest choice when accesses are short and contention is low, and Arc only shares ownership rather than making the table internally safe.
- Arc<RwLock<_>> can allow concurrent readers, but writer fairness, read duration, and implementation behavior must be measured under the actual 95/5 workload.
- An actor owns the table in one task and receives commands, which removes shared locking but adds queueing, message design, and one-owner throughput limits.
- Copy-on-write publication through ArcSwap is another fit when updates are rare and readers need lock-free snapshots, at the cost of rebuilding and retaining table versions.
Why interviewers ask this: A strong answer compares ownership models with the given read ratio and does not declare RwLock universally faster.
I would bound the channel for a measured burst window and define what producers do once sustained input exceeds consumer capacity.
- A capacity of 10,000 absorbs roughly one second of the stated 10,000-event-per-second deficit, but no finite queue fixes sustained overload.
- send().await propagates backpressure by suspending producers, while try_send can implement explicit shedding or coalescing when waiting is unacceptable.
- reserve().await can secure capacity before performing expensive message construction and prevents wasted work during saturation.
- Queue depth, send wait time, rejected events, and consumer throughput must be observed together so memory growth is not the overload signal.
Why interviewers ask this: The interviewer checks whether channel capacity is tied to arithmetic, backpressure, and an explicit overload policy.
I would use watch for the latest configuration, broadcast only for best-effort audit fan-out, and oneshot for the single startup reply.
- watch retains one current value and notifies receivers of changes, so a slow receiver may skip intermediate configurations and read the newest state.
- broadcast retains a bounded sequence for every receiver, and a receiver that falls behind gets a Lagged error, so compliance-grade audit records need a durable log before fan-out.
- oneshot carries one value from one sender to one receiver without a stream or reusable subscription.
- None of these replaces mpsc when many producers should distribute each work item to one consumer.
Why interviewers ask this: A strong answer matches channel delivery semantics to the three concrete communication requirements.
The producer should publish the pointer with Release and the consumer should load it with Acquire before dereferencing the initialized object.
- Release prevents prior initialization writes from moving after publication, and a matching Acquire that observes the value makes those writes visible to the consumer.
- Relaxed is enough for an independent statistics counter because it guarantees atomicity but no ordering of surrounding data.
- SeqCst adds one global order among sequentially consistent operations, but it does not repair an invalid ownership or reclamation scheme.
- The design still needs a proof that only valid pointers are published and that no reader accesses the allocation after it is freed.
Why interviewers ask this: The interviewer tests whether the candidate can pair ordering guarantees with ownership and reclamation requirements.
I would use the weakest orderings that preserve the state machine's synchronization proof, often AcqRel on success and Acquire or Relaxed on failure.
- A successful AcqRel operation can acquire data published by the previous state and release writes associated with the new state.
- A failed comparison performs only a load, so its ordering cannot be Release or AcqRel and should reflect whether the observed value carries data that must be acquired.
- The returned Err(actual) must drive the retry because another thread may have changed the state since the expected value was read.
- Correct orderings do not solve ABA or safe memory reclamation, which require a separate versioning, epoch, or ownership design.
Why interviewers ask this: A strong answer derives CAS orderings from the success and failure paths instead of defaulting blindly to SeqCst.
Idle workers can steal runnable tasks from busy workers, but they cannot preempt a task that blocks or spends too long inside one poll.
- Per-worker queues favor locality, while externally spawned or overflow work can enter shared scheduling paths that other workers access.
- A spawned Send task may resume on a different worker after an await, so thread-local assumptions cannot cross suspension.
- Tokio scheduling is cooperative, which requires futures to return Pending or otherwise yield within bounded work.
- Work stealing balances runnable tasks but cannot create CPU capacity or rescue all workers blocked in synchronous calls.
Why interviewers ask this: The interviewer checks whether the candidate understands both load balancing and the cooperative scheduler's limits.
I would move the blocking call to spawn_blocking and bound admission to that work so executor workers and the blocking queue cannot saturate unchecked.
- spawn_blocking uses Tokio's blocking pool, whose large default upper limit is not a substitute for a Semaphore sized to CPU and latency budgets.
- Once a blocking closure starts, aborting its JoinHandle does not stop the closure, so deadlines need cooperative cancellation or discard of late results.
- Sustained CPU-parallel compression may fit a dedicated Rayon pool better, with a bounded bridge from async request handling.
- block_in_place is limited to a multi-thread runtime and runs blocking code on the current worker after Tokio hands off other tasks, so it still needs careful capacity control.
Why interviewers ask this: A strong answer offloads the call while also addressing admission, cancellation, and sustained CPU parallelism.
poll must arrange for the current task's Waker to be notified after progress becomes possible and must never block the executor thread.
- The future checks readiness, registers or updates the current waker with the source, and rechecks state when registration can race with an event.
- That recheck closes the lost-wakeup window in which readiness changes between the first check and waker registration.
- Returning Pending without a future wake can leave the task asleep forever, while waking on every poll creates a busy loop.
- poll receives Pin<&mut Self> because the future state may rely on stable addresses, and Ready returns the final output.
Why interviewers ask this: The interviewer evaluates whether the candidate understands wake-driven progress and the lost-wakeup race.
I would keep partial protocol state outside the cancellable branch and select only over operations whose dropped futures do not lose committed progress.
- select! drops losing branch futures, so recreating a non-cancellation-safe read on each loop can discard bytes already consumed into that future's private state.
- The parser can own a persistent buffer, use a cancellation-safe read primitive to append bytes, and decode complete frames separately.
- A long-lived future that must retain internal progress should be created and pinned outside the loop rather than rebuilt after every timeout.
- Cancellation safety means dropping at any await preserves invariants and documented restart behavior, not that the operation completes cleanup asynchronously.
Why interviewers ask this: A strong answer connects select branch dropping to concrete ownership of partial I/O progress.
Locked questions
- 21
Tokio::spawn reports that a future is not Send because Rc<RefCell<_>> or a guard lives across await; what are the valid fixes?
asyncsmart-pointersasync-runtime - 22
A graph of async subscriptions uses Arc in both parent and child links and never frees after all external handles are dropped; what is wrong?
async - 23
Five thousand tasks may call a downstream API that allows only 64 concurrent requests; how would you enforce that limit with Tokio?
async-runtimeapiconcurrency - 24
An iterator chain over 10 million u32 values is blamed for overhead versus a hand-written loop; how would you evaluate the zero-cost claim?
iterationiteratorsperformance - 25
A generic serializer is instantiated for 40 message types and adds 18 MB to a constrained binary; what trade-off would you consider?
serializationgenerics - 26
A parser appends one million records to an initially empty Vec; how would you control allocations and capacity?
capacity - 27
Ninety-five percent of parsed header lists contain at most eight entries, but the remaining five percent contain up to forty; would SmallVec<[Header; 8]> help?
- 28
A three-stage async pipeline passes 4 KB network frames without payload copies; what ownership costs remain in a Bytes-based design?
asyncownershipdesign - 29
A scan over 50 million records reads only status and timestamp from a large struct; how would layout affect cache locality?
cachingtypes - 30
A Criterion benchmark reports a 7 percent speedup with noisy samples; what evidence would you gather before accepting the optimization?
optimization - 31
A benchmarked request handler is fast in isolation but allocates heavily under load; how would you profile its heap behavior?
debuggingdata-structures - 32
A scalar ASCII classifier processes 64 MB buffers and consumes 30 percent of CPU; when would an AVX2 path be justified?
concurrencytypes - 33
During review, list the five classes of operation that unsafe Rust permits and explain what checks remain active.
unsafe - 34
You wrap a raw ring buffer whose C API returns pointer and length pairs; how would you expose a safe Rust slice API?
types - 35
A custom shared cell mutates T through &self; what role does UnsafeCell<T> play, and what must the wrapper still enforce?
unsafe - 36
Construction of a [Packet; 1024] fails after initializing element 317; how would MaybeUninit avoid leaks and invalid values?
- 37
An FFI parser receives ptr and len and wants a mutable Rust slice; which raw-pointer validity, aliasing, and provenance conditions must hold?
ffiownershiptypes - 38
You expose a Rust packet header to C and generate headers with cbindgen; what guarantees does repr(C) add and what remains your responsibility?
- 39
A C client receives an opaque Rust object and a byte buffer; how would you define allocation ownership and deallocation?
ownership - 40
A C API calls Rust and Rust later invokes a C callback; how should panics, errors, exceptions, and callback lifetime be contained?
callbackserror-handlinglifetimes - 41
An unsafe SIMD parser improves a representative workload from 6.2 ms to 4.4 ms against a 5 ms budget; when is that unsafe code justified?
unsafe - 42
A service has 24 request handlers, a 20 MB binary budget, and a 2 microsecond dispatch budget; would you use generics or trait objects at the handler boundary?
genericstraits - 43
A Decoder implementation has one canonical output type, while a Convert trait may target many output types; where do associated types and generic parameters fit?
genericstraits - 44
A plugin registry needs Box<dyn Plugin>, but the trait has a generic method, an associated const, and async fn run; why is it not dyn-compatible?
asyncgenericstraits - 45
How would a generic associated type model a decoder that returns a frame borrowing from its own input buffer?
genericsownershiptraits - 46
A buffer walker invokes the same callback with many unrelated short-lived &[u8] slices; why use for<'a> Fn(&'a [u8])?
callbackstypes - 47
A factory returns one iterator adapter in all paths today but may later choose unrelated implementations; when is impl Trait appropriate?
iterationtraitsiterators - 48
You publish a parsing library with invalid-header, unsupported-version, and I/O failures; how would you design its Result error type?
designerror-handling - 49
A service binary loads configuration, connects to a database, and runs the parser library; where would anyhow fit without erasing useful error semantics?
databaseconfigerror-handling - 50
A library function uses ? on a dependency error; what conversion occurs, and how do you preserve the source chain without coupling the public API to that dependency?
dependenciesapi - 51
A parser must cache token slices from its own 8 MB input buffer, but the proposed struct with String and &str fields does not compile and must remain movable; what do you ship?
typescachingtokens - 52
Forty request tasks mutate a session map, and a refactor to Arc<Mutex<HashMap<...>>> makes p99 jump from 18 ms to 73 ms; how do you redesign the shared state?
concurrencysessionsrefactoring - 53
A method updating self.index from self.records fails because a helper takes &mut self while the loop already borrows self.records; how do you split the borrows without cloning 600,000 records?
indexesownership - 54
A 600 MB log is split into 16 chunks, but a proposed Rayon closure mutates one shared Vec and either fails borrow checking or becomes Arc<Mutex<_>>; how do you refactor it?
closuresconcurrencyownership - 55
A cache exposes fn find<'a>(&'a self, key: &'a str) -> Option<&'a Entry>, forcing callers to retain or clone temporary keys across 30,000 lookups per second; how do you correct the lifetime API?
lifetimeserror-handlingownership - 56
After a deploy, 0.7 percent of Tokio requests remain open forever while CPU and downstream latency stay normal; what evidence do you collect and what fix do you accept?
deploymentasync-runtimelatency - 57
A cache refresh holds a tokio::sync::Mutex guard while awaiting a 300 ms HTTP call, and 500 callers serialize behind it; how do you repair the incident?
asyncconcurrencyhttp - 58
Two account-transfer tasks deadlock once a day because one locks source then destination and another does the reverse; what production-safe correction do you make?
locking - 59
An async upload endpoint calls a synchronous virus scanner for 140 ms, and Tokio scheduling latency rises from 2 ms to 90 ms at 200 requests per second; what do you change?
jobsendpointslatency - 60
Active requests return to zero after a load test, but Tokio task count climbs by 12,000 per hour and RSS follows it; how do you find and stop the accumulation?
load-testingasync-runtime - 61
A telemetry service uses one unbounded mpsc for lossless audit events and droppable debug events, consuming 6 GB in four minutes when the sink slows; what overload contract do you implement?
- 62
tokio::select! cancels write_all on a timeout after part of a 32 KB socket frame was written, and retrying the full frame duplicates its prefix and corrupts the protocol; how do you repair the sender?
resiliencetypingasync-runtime - 63
SIGTERM gives a service 20 seconds, but shutdown hangs because a background batcher still owns a sender and three handlers wait forever on recv; how do you make termination bounded?
batch - 64
A 4-vCPU container runs Tokio plus default Rayon, reaches 900 percent runnable CPU in host metrics, and p99 doubles under image processing load; how do you remove oversubscription?
containersmonitoringasync-runtime - 65
A downstream permits 80 concurrent calls, but 6,000 spawned tasks acquire sockets before waiting for capacity and exhaust file descriptors; where do you put admission control?
concurrencydescriptorscapacity - 66
RSS rises from 1.1 GB to 4.6 GB over six hours after a release, but request volume is unchanged; how do you distinguish a leak from allocator and mapping effects?
- 67
A service publishes a new immutable 200 MB routing snapshot through ArcSwap every minute, but 40 old versions remain because spawned jobs hold Arc snapshots across long retries; how do you stop the retention?
retentionsnapshotimmutability - 68
A JSON routing hot path performs 34 allocations per request and consumes 22 percent of CPU at 120,000 requests per second; what optimization do you accept?
optimization - 69
A release moves request p99 from 42 ms to 96 ms while median latency is unchanged; how do you isolate the regression and set a rollback gate?
latencyrollback - 70
A generic Tower middleware stack instantiated for 70 handlers adds 22 MB to the binary and raises clean link time from 4 to 13 minutes while request latency is unchanged; what do you change?
middlewarelatencygenerics - 71
A teammate proposes SmallVec<[Header; 16]> and a global buffer pool to cut allocations, but profiles show headers average 18 entries and buffers are retained across idle tasks; what do you decide?
- 72
A packet decoder crashes roughly once per two billion frames only on ARM64, and the failing path uses an unsafe pointer fast path; how do you contain and investigate it?
unsafe - 73
A new unsafe ring-buffer wrapper assumes the producer never overwrites leased slots, but a timeout path releases the lease twice; how do you make the abstraction safe?
oopunsaferesilience - 74
A Rust client receives corrupted records only through a C library after upgrading its headers, with failures concentrated on 32-bit targets; how do you isolate the FFI contract break?
ffi - 75
A repr(C) struct is converted to &[u8], including its padding, for hashing; Miri reports uninitialized-byte reads and production hashes differ across builds, so what do you ship?
csstypes - 76
An unsafe AVX2 parser is 24 percent faster but disagrees with the scalar implementation on 31-byte inputs ending in 0xFF; what do you ship?
unsafetypesconflict - 77
Miri passes a concurrent unsafe queue, but ThreadSanitizer reports a race after 10 million operations in the native stress test; what conclusion and next steps are justified?
concurrencydata-structuresunsafe - 78
The top production panic, 18,000 times per day, is expect("header present") on an HTTP request boundary after a proxy begins omitting the header; what do you change?
proxyhttperrors - 79
One of 12 plugins panics while mutating shared state inside catch_unwind and poisons a std::sync::Mutex; should the process continue?
concurrencyerrors - 80
A tonic service currently maps every storage and validation failure to Status::internal, causing clients to retry bad requests 40,000 times per hour; how do you redesign the error boundary?
reactresiliencevalidation - 81
A 9 MB command-line agent must clean temporary files after a recoverable job panic and also remove leftovers after a process crash, while a stateless container worker restarts on any fault; which panic and cleanup contracts do you choose?
concurrencyerrorscontainers - 82
Dependency v1 exposes an external trait and v2 exposes a replacement type, but the orphan rule prevents your service from implementing the old trait for the new type during migration; what bridge do you build?
migrationsdependenciestraits - 83
A workspace compiles serde-compatible payloads from crate v1 and v2, but a function rejects one as the wrong Payload type even though both names and fields match; how do you resolve it?
cargocontrol-flow - 84
Enabling TLS in one workspace member unifies a dependency feature that raises MSRV from 1.82 to 1.85, but an embedded customer is fixed on 1.82; what release decision do you make?
tlsdependencies - 85
A networking crate drops one required timeout callback, upstream estimates six months, and launch is in eight weeks; do you wrap, fork, contribute, or replace it?
estimationcallbacksresilience - 86
A major runtime upgrade changes timer behavior across 26 services, and only 10 percent can be deployed per day; how do you execute the semver rollout?
deployment - 87
A 900,000-line C++ gateway must move its highest-crash parser to Rust without changing the public C ABI or exceeding 5 percent latency overhead; what first migration slice do you choose?
migrationslatencygateway - 88
A synchronous Rust API handles 300 connections reliably, but a new requirement is 15,000 mostly idle connections; how do you migrate to Tokio without hiding blocking calls?
async-runtimeapi - 89
A protobuf enum change must cross 14 independently deployed Rust services and six-month-old queued messages; what migration order prevents a fleet-wide decode failure?
data-structuresenumsmigrations - 90
A proposal replaces epoll with io_uring for a service at 80,000 connections, but only 7 percent of CPU is in syscalls and 15 percent of hosts run an older kernel; what do you decide?
- 91
Allocator profiles show 38 percent fragmentation in a 24 GB cache process, and a custom arena proposal claims to save 6 GB; how do you decide whether to deploy it?
cachingdeploymentconcurrency - 92
A tonic service retries a non-idempotent CreateOrder call during downstream overload, producing 0.3 percent duplicate orders; what Tower policy and API change do you make?
idempotency - 93
A mid-level engineer adds 27 clone calls to make a 50,000-row import pass the borrow checker, doubling peak memory; what bounded mentoring exercise do you assign?
ownershipmentoringmemory - 94
An engineer repeatedly holds tokio::sync::Mutex guards across HTTP awaits, and one change caused a 60-second queue stall; how do you coach and verify improvement?
asyncconcurrencydata-structures - 95
A teammate proposes unsafe get_unchecked to save 2 percent in a noisy parser benchmark before profiling production; what mentoring intervention do you make?
mentoringprofilingunsafe - 96
A new engineer wraps every service field in Arc<Mutex<_>>, creating 14 locks and intermittent contention in a single-owner worker; what exercise changes that habit?
concurrency - 97
An engineer submits a public API with nine generic parameters, six associated-type bounds, and compiler errors spanning 80 lines for callers; how do you mentor a simpler boundary?
mentoringapigenerics - 98
An outage came from an unsafe buffer wrapper you approved, and the same unchecked length pattern exists in 11 modules; what does your retrospective produce?
unsafe - 99
A 400-line unsafe optimization lowers a microbenchmark from 5.1 ms to 4.7 ms, but production p99 is unchanged and maintenance requires two specialists; do you keep it?
optimizationunsafe - 100
A Rust platform has 37 unsafe sites, a 19-minute build, and a dependency blocking MSRV updates, but the quarter funds only six engineer-weeks; what debt do you schedule?
dependenciesunsafe