.NET Interview Questions — Practice With Real Questions
Reviewed by Mark Dickie · Last updated
13 questions on this page you can answer and see marked on the spot. Go to the first one
The .NET platform is a cross-platform development ecosystem from Microsoft that includes the Common Language Runtime, the C# language, the base class library, and frameworks like ASP.NET Core and EF Core. For interviews you should know how the CLR executes managed code (JIT compilation, garbage collection, assembly loading), the core C# language features (async/await, LINQ, generics, delegates, pattern matching), and the major application frameworks built on top of the runtime.
Most .NET interview rounds split into language fundamentals, runtime behavior, and framework-specific questions. A strong candidate can explain value types vs reference types, how garbage collection generations work, what async/await actually does at the state machine level, and the request pipeline in ASP.NET Core. Below is a quick map of what each area tends to cover.
| Interview area | What comes up |
|---|---|
| C# language | Value vs reference types, ref/out/in, generics, delegates and events, pattern matching, records |
| CLR internals | JIT vs AOT compilation, GC generations and large object heap, assembly resolution, AppDomains (legacy) vs single-file |
| ASP.NET Core | Middleware pipeline, dependency injection containers, routing, minimal APIs, configuration sources |
| EF Core | Change tracking, query execution, lazy vs eager loading, migrations, concurrency tokens |
| Concurrency | Task, async/await, CancellationToken, Channel<T>, locking, Interlocked |
What does a .NET interview typically test?
- Type system fundamentals: stack vs heap allocation, boxing, nullable reference types, and how generic constraints affect compilation.
- Runtime mechanics: how the JIT compiles IL to native code, when GC triggers a collection, and what the large object heap does to performance.
- Async programming: the state machine the compiler generates for
async/await, synchronization context, and common deadlock patterns with.Result. - ASP.NET Core pipeline: how middleware order matters, where DI scopes live, and how endpoint routing resolves to a handler.
- Data access with EF Core: how
DbContexttracks entities, when a query is executed, and how to handle concurrency conflicts.
How should you prepare for a .NET interview?
Focus on understanding over memorization. If you can explain why the runtime behaves a certain way, you can answer the follow-up questions that interviewers use to separate surface-level knowledge from real understanding. Write small console apps to trigger GC collections, inspect IL with tools like ILSpy, and trace an HTTP request through the ASP.NET Core middleware pipeline. The quiz below covers a mix of language, runtime, and framework questions so you can find gaps before the real thing.
Key facts
- Tarmac has 143 .NET interview questions on this topic, 25 of them on this page, at difficulty 1–5 of 5.
- Tarmac tracked 653 job postings asking for .NET in September 2026.
- Roles asking for .NET advertise a median base salary of £70,000, across 241 job postings as of September 2026.
- Tarmac last reviewed these .NET interview questions on 20 October 2026.
At a glance
| Questions | 25 shown · 143 in the bank |
|---|---|
| Difficulty | 1–5 of 5 |
| Formats | True / false, Multiple choice, Find the bug, Ordering, Short answer, Fill in the blank, Multiple answer, Code output, Flashcard |
What you'll review
- minimal apis
- middleware pipeline
- routing in aspnet core
- mvc controllers and views
Practice questions
Try one before you open the answer. Pick an option and press Check; it's marked on the spot.
In ASP.NET Core, Minimal APIs allow you to define HTTP endpoints using lambda expressions or method delegates passed to extension methods like MapGet and MapPost, without requiring a controller class.#
Options
Show answer
True. ASP.NET Core Minimal APIs let you define endpoints by passing lambda expressions or method delegates to extension methods such as MapGet and MapPost on IEndpointRouteBuilder, without requiring a controller class.
Minimal APIs, introduced in .NET 6, let you register endpoints directly on IEndpointRouteBuilder via methods like MapGet and MapPost, passing a delegate as the handler. No controller class is needed, unlike the traditional MVC/web-api controller pattern.
In ASP.NET Core Minimal APIs, route parameters in the URL pattern (e.g. {id} in MapGet("/items/{id}", ...)) are automatically bound to handler method parameters with matching names by default.#
Options
Show answer
True. In ASP.NET Core Minimal APIs, route parameters declared in the URL pattern such as {id} are automatically bound to handler parameters with matching names by default, with no explicit attribute required.
Minimal APIs use model binding conventions: a route parameter like {id} is automatically bound to a handler parameter named id (case-insensitive) without explicit attributes, as long as the name matches.
In an ASP.NET Core application's Program.cs / Startup.Configure, the order in which middleware components are registered determines the order in which they execute. Which interface method does each middleware component's registration typically chain on?#
Options
Show answer
Middleware components are registered on IApplicationBuilder via the Use* family of extension methods such as UseRouting, UseAuthentication, and UseEndpoints. The Add* methods configure the DI service container, and Map* methods branch the pipeline rather than add a linear component.
Middleware is registered on the IApplicationBuilder via the Use* family of extension methods (e.g., UseRouting, UseAuthentication, UseAuthorization, UseEndpoints). Add* methods belong to the service-container configuration phase (IServiceCollection), not the pipeline. Map* methods branch the pipeline rather than registering a linear middleware component. There is no standard Configure* extension family for pipeline registration.
What does calling app.Run(context => { ... }) do in an ASP.NET Core middleware pipeline?#
Options
Show answer
app.Run adds a terminal middleware delegate that takes only the HttpContext and has no next parameter, so it ends the pipeline and prevents any later middleware from executing. Use app.Use when you need to call next and continue the chain.
app.Run adds a terminal middleware delegate — it receives only the HttpContext (no next parameter) and therefore cannot invoke the next middleware. Execution ends at that delegate, so anything registered after it never runs. app.Use is the method that provides a next delegate for chaining. Map branches the pipeline, and background services are registered via AddHostedService, not app.Run.
ASP.NET Core middleware components form a pipeline through which every HTTP request passes. The pipeline is commonly described as having two phases per request. In what order does a single middleware component process a request relative to the components registered before and after it?#
Options
Show answer
Middleware follows an onion/stack model: the code before await next() runs in registration order (top-to-bottom) on the way in, and the code after await next() runs in reverse registration order (bottom-to-top) on the way out. This bidirectional flow is why ordering matters for cross-cutting concerns like logging and exception handling.
The middleware pipeline behaves like a stack (onion model). On the way in, each component's code before await next() executes in the order the components were registered (top-to-bottom). On the way out, after next() returns, each component's remaining code executes in the reverse order (bottom-to-top) as the stack unwinds.
The following ASP.NET Core controller compiles without errors, but a GET request to /api/products/42 returns 0 instead of 42. Find the line containing the bug.#
[ApiController]
[Route("api/products")]
public class ProductsController : ControllerBase
{
[HttpGet("{id}")]
public IActionResult GetById(int productId)
{
return Ok(productId);
}
}Show answer
The bug is on line 6.
The route template on line 5 defines a parameter named {id}, but the action method parameter on line 6 is named productId. ASP.NET Core binds route values to action parameters by name, so the route value id is never matched to productId, which defaults to 0. Renaming the parameter to int id (or adding [FromRoute(Name = "id")]) fixes the binding.
A developer expects the endpoint GET /api/products to work, but requests to that URL return 404. Which option identifies the bug?#
[ApiController]
[Route("api/[controler]")]
public class ProductsController : ControllerBase
{
[HttpGet]
public IActionResult GetAll()
{
return Ok();
}
}Options
Show answer
Line 2: [controler] is misspelled — it should be [controller], so ASP.NET Core treats it as a literal string instead of substituting the controller name.
ASP.NET Core only recognizes the exact token [controller] (with both r's) and replaces it with the controller's name minus the Controller suffix. Because [controler] is misspelled, the framework treats it as a literal path segment, so the actual route becomes api/[controler] — not api/products. The misspelled [controler] option is correct. The other options describe non-existent problems: [ApiController] works fine with attribute routing, [HttpGet] without a template matches the base controller route, and action method names do not need to start with an HTTP verb when attribute routing is used.
Arrange the following ASP.NET Core MVC filter types in the order they appear in the filter pipeline as defined by the framework, from first to last. (Exception filters are excluded because they wrap both the action and result stages rather than occupying a single linear position.)#
Put these in order
Show answer
The ASP.NET Core MVC filter pipeline order is: Authorization filters → Resource filters → Action filters → Result filters. Authorization runs first to gate access, Resource filters wrap the rest of the pipeline, Action filters wrap the action method, and Result filters wrap action-result execution. Exception filters are excluded because they wrap both the action and result stages rather than occupying a single linear position.
The ASP.NET Core MVC filter pipeline defines a fixed stage order for these four filter types: Authorization filters run first (to gate access), then Resource filters (which wrap model binding and the rest of the pipeline), then Action filters (which wrap the action method execution), and finally Result filters (which wrap the action result execution, such as view rendering). Exception filters are intentionally excluded from this ordering because they do not occupy a single linear position — they apply to exceptions thrown during both the action and the result stages, wrapping both rather than sitting between them.
In ASP.NET Core Minimal APIs, what method do you call on the WebApplication instance to register an HTTP GET endpoint at the path /products? Write the exact method name (no parentheses or arguments).#
Show answer
MapGet
In Minimal APIs, endpoints are registered by calling extension methods like MapGet, MapPost, MapPut, and MapDelete on the WebApplication (or IEndpointRouteBuilder) instance. To handle GET requests at /products you call app.MapGet("/products", handler).
Order the following stages of the ASP.NET Core MVC request-processing pipeline as they occur when handling an incoming HTTP request that results in a rendered view (from first to last).#
Put these in order
Show answer
The correct order is: Routing → Model Binding → Action Method Execution → Action Result Execution → View Rendering. ASP.NET Core MVC first matches the request to an action via routing, binds request data to parameters, executes the action method (which returns an IActionResult), then executes that result, and finally renders the Razor view into the HTTP response.
ASP.NET Core MVC processes a request in a fixed sequence: routing first selects the action, then model binding populates parameters, the action method runs and produces an IActionResult, the result executes (which for a ViewResult locates the view), and finally the Razor view is rendered into the response body.
In the ASP.NET Core MVC filter pipeline, each filter type has a defined position. Order these filter types by when their 'before' (OnXxxExecuting) phase runs during request processing, from earliest to latest.#
Put these in order
Show answer
The correct order is: Authorization Filters → Resource Filters → Action Filters → Result Filters. In the ASP.NET Core MVC filter pipeline, authorization filters run first and can short-circuit the request, resource filters wrap the rest of the pipeline, action filters run immediately before and after the action method, and result filters run immediately before and after the action result executes.
Per the official ASP.NET Core filter pipeline, the 'before' phases execute in this order: authorization filters run first (short-circuiting the rest if denied), then resource filters (wrapping most of the pipeline), then action filters (immediately before the action method), and finally result filters (immediately before the action result executes). Exception filters are triggered only when an unhandled exception occurs and are not part of this sequential 'before' ordering.
In an ASP.NET Core minimal-hosted app (Program.cs), conventional routing for MVC controllers is typically registered by calling _____ with a route name and a pattern such as "{controller=Home}/{action=Index}/{id?}".#
Show answer
In an ASP.NET Core minimal-hosted app (Program.cs), conventional routing for MVC controllers is typically registered by calling **MapControllerRoute** with a route name and a pattern such as "{controller=Home}/{action=Index}/{id?}".
MapControllerRoute is an extension method on IEndpointRouteBuilder, typically called on app (the WebApplication) inside the top-level statements of Program.cs. It accepts a route name and a route pattern, making it the standard way to register a named conventional route. By contrast, MapDefaultControllerRoute takes no arguments and uses a hard-coded default pattern, while MapControllers is used for attribute-routed controllers only.
To enable attribute routing in ASP.NET Core, you apply the _____ attribute directly on a controller class or an individual action method to specify its URL template, e.g. [_____("products/{id}")].#
Show answer
To enable attribute routing in ASP.NET Core, you apply the **Route** attribute directly on a controller class or an individual action method to specify its URL template, e.g. [**Route**("products/{id}")].
The [Route] attribute is the core attribute-routing marker in ASP.NET Core. Placing it on a controller sets a base template, and placing it on an action method sets (or combines with) that action's template. [HttpGet], [HttpPost], etc. also accept templates but [Route] is the general-purpose attribute for defining a route template regardless of HTTP verb.
In the ASP.NET Core route template "{id:int?}", the int portion is called a route _____ — it restricts the id segment to integer values only, while the trailing ? marks the parameter as optional.#
Show answer
In the ASP.NET Core route template "{id:int?}", the int portion is called a route constraint — it restricts the id segment to integer values only, while the trailing ? marks the parameter as optional.
The colon syntax inside a route parameter ({param:constraint}) applies a route constraint. int is a built-in constraint that only matches the segment when it can be parsed as an integer. Constraints are evaluated during URL matching; if the segment does not satisfy the constraint, that route is not selected.
In ASP.NET Core Minimal APIs, a custom endpoint filter registered via AddEndpointFilter<TFilter> must implement a specific interface. Name the interface and the single instance method it requires, including the method's exact return type.#
Show answer
The interface is IEndpointFilter. It requires the method InvokeAsync, which has the return type ValueTask<object?>.
Every Minimal API endpoint filter implements IEndpointFilter, which defines one method: ValueTask<object?> InvokeAsync(EndpointFilterInvocationContext context, EndpointFilterDelegate next). The ValueTask<object?> return type allows the filter to either short-circuit by returning a result directly or call next to continue the pipeline. Knowing the return type is important because it differs from the MVC action-filter Task<IActionResult> pattern.
In ASP.NET Core Minimal APIs, both Results and TypedResults are factory classes that produce IResult response objects. What is the primary advantage of using TypedResults over Results when declaring a route handler's return type? Mention both the compile-time benefit and the documentation benefit.#
Show answer
TypedResults returns concrete generic types such as Ok<T> instead of the non-generic IResult, which gives compile-time type safety for the response payload and allows the OpenAPI/Swagger document to automatically infer the correct response body schema at compile time without extra configuration.
Results.Ok(...) returns IResult, erasing the payload type at compile time, so the compiler cannot verify that the handler returns the declared shape and OpenAPI cannot infer the response body schema without manual annotations. TypedResults.Ok<T>(value) returns Ok<T>, a concrete generic IResult implementation, giving compile-time type checking on the response payload and enabling automatic OpenAPI response schema generation directly from the handler's return type signature.
Which of the following statements about the ASP.NET Core middleware pipeline are true?#
Options
Pick every one that applies.
Show answer
Statements a, b, and c are true. app.Run() is terminal and never calls the next component; app.Use() receives a RequestDelegate and may short-circuit by not calling it; app.Map branches on a path prefix and the branch does not rejoin the parent pipeline. Statement d is false because middleware processes the response in reverse registration order, so the first-registered component is the last to see the outgoing response.
app.Run() registers a terminal delegate — it does not receive or call a next, so nothing after it runs (the statement about app.Run() is true). app.Use() provides a Func<HttpContext, RequestDelegate, Task>, letting you call next() (or await next(context) in older APIs) to continue, or omit the call to short-circuit (the statement about app.Use() is true). app.Map performs a path-prefix branch; the matched branch runs to completion and the parent pipeline's subsequent middleware is not executed for those requests (the statement about app.Map is true). Middleware sees the request in registration order but the response in reverse order, so the first-registered component is the last to observe the response on the way back (the statement about middleware execution order is false).
An ASP.NET Core MVC app defines the controller below. A client sends the request:#
[Route("api/[controller]")]
public class SearchController : Controller
{
[HttpGet("{query}")]
public IActionResult Search(string query) => Content($"S:{query}");
[HttpGet("{id:int}")]
public IActionResult GetById(int id) => Content($"I:{id}");
[HttpGet("{query:alpha}/{page:int}")]
public IActionResult Paged(string query, int page) => Content($"P:{query}:{page}");
}Show answer
P:hello:2
The request path /api/search/hello/2 has two route segments after the controller prefix (hello and 2). The Search action template {query} expects one segment and the GetById action template {id:int} also expects one segment, so neither can match. The Paged action template {query:alpha}/{page:int} matches two segments: "hello" satisfies the :alpha constraint (letters only) and "2" satisfies the :int constraint. Content("P:hello:2") returns that string as the response body with content type text/plain.
In ASP.NET Core Minimal APIs, what is the key difference between returning TypedResults.Ok(product) versus Results.Ok(product) from an endpoint handler, and which should you prefer for compile-time type safety and OpenAPI schema accuracy?#
Show answer
Use TypedResults (the static class with generic, compile-time-checked results) instead of Results. TypedResults.Ok(product) returns TypedResults.Ok<TProduct>, a concrete closed type, so the analyzer can infer the response schema and flag mismatches at build time. Results is an open union (IResult-implementing struct) whose payload type is erased at runtime, which means OpenAPI generation relies on reflection hints and the compiler cannot catch a wrong payload type.
Both classes live in Microsoft.AspNetCore.Http and produce the same HTTP 200 response at runtime, but they differ in static typing. TypedResults exposes strongly-typed generic result types (e.g., TypedResults.Ok<TValue>) so the return type of the handler is a concrete closed generic. This lets the Roslyn analyzer infer exact response schemas, enables route handler delegate signature validation at compile time, and produces accurate OpenAPI documents without extra hints. Results returns an IResult whose concrete payload type is not visible in the handler signature, so schema inference falls back to runtime reflection or explicit metadata. The ASP.NET Core team recommends TypedResults for all new Minimal API code for these reasons.
How are endpoint filters ordered in an ASP.NET Core Minimal API pipeline, and what does that ordering mean for when a filter's pre- and post-handler logic runs relative to other filters and the handler itself?#
Show answer
Filters execute in registration order — first registered, first executed — wrapping the handler in a nested Russian-doll pipeline. Each filter calls next() to invoke the next filter (or the terminal handler if it is last). Control flows back outward on return, so the first-registered filter is the outermost: it sees the request first and the response last. You register them via endpointHandler.AddFilter<TFilter>() or by chaining multiple .AddFilter calls on the RouteHandlerBuilder.
Minimal API endpoint filters follow the same nested-middleware pattern as ASP.NET Core middleware. The first filter registered wraps all subsequent filters and the handler. When the first filter calls next(context), execution enters the second filter, and so on, until the terminal handler runs. On the return path, unwinding happens in reverse order — the last filter's post-handler code runs first, then the second-to-last, and finally the first filter's post-handler code. This means the first-registered filter has the broadest scope (earliest entry, latest exit) and is the correct place for concerns like global exception handling or timing, while the last filter sits closest to the handler.
What role does RequestDelegateFactory play in Minimal APIs, and how does the source-generated variant (Microsoft.AspNetCore.Http.RequestDelegateGenerator) change the runtime behavior and enable Native AOT publishing?#
Show answer
RequestDelegateFactory (RDF) is the runtime component that transforms a Minimal API route handler lambda into a RequestDelegate. It inspects the delegate's parameters, binds each to the appropriate source (route, query, header, body via [FromBody], services via [FromServices]), injects HttpContext/HttpRequest/CancellationToken when present, and synthesizes response-writing logic — all via runtime reflection and dynamic IL emission. The separate source generator Microsoft.AspNetCore.Http.RequestDelegateGenerator (distinct from RDF and from the Microsoft.AspNetCore.OpenApi package) performs the same transformation at compile time, emitting static C# into the user's assembly instead of using runtime reflection. This eliminates reflection over handler signatures, makes the code trim-safe, and is what enables Native AOT publishing of Minimal API apps.
RequestDelegateFactory is the runtime bridge between a developer-authored lambda and the RequestDelegate that ASP.NET Core's routing infrastructure invokes. It reads the lambda's parameter list, infers each parameter's binding source, generates code to populate parameters from HttpContext, and generates response serialization — all at runtime via reflection and dynamic IL. RequestDelegateGenerator is a separate component (packaged in Microsoft.AspNetCore.Http.RequestDelegateGenerator, not Microsoft.AspNetCore.OpenApi) that performs the same transformation at compile time, emitting static C# into the assembly. This eliminates runtime reflection, makes the code trim-safe, and is required for Native AOT publishing.
In an ASP.NET Core 8 minimal-host application, consider the middleware ordering rules enforced or recommended by the framework. Which of the following statements are correct? (Select all that apply.)#
Options
Pick every one that applies.
Show answer
UseRouting must precede UseAuthorization so endpoint metadata is available, UseAuthentication must precede UseAuthorization so the identity is established, endpoint middleware like MapGet is terminal and short-circuits on a match, and UseExceptionHandler should be registered early to catch exceptions from all later middleware. UseStaticFiles does not require UseRouting and is typically placed early, so requiring it after routing is incorrect.
UseRouting must precede UseAuthorization because the authorization middleware reads IEndpointMetadataProvider metadata from the matched endpoint. UseAuthentication must precede UseAuthorization so the ClaimsPrincipal is set on HttpContext before authorization evaluates policies. Endpoint middleware (MapGet, MapPost, etc.) is terminal: when a route matches it writes the response and does not call _next, so nothing later in the pipeline runs. UseStaticFiles does not depend on endpoint routing and is conventionally placed early, before UseRouting, for performance; routing does not handle static files, so the claim that UseStaticFiles must be placed after UseRouting is false. UseExceptionHandler should be one of the first components registered so its try/catch wraps every subsequent middleware in the pipeline.
You are building a custom middleware pipeline in ASP.NET Core 8 and are considering the branching extensions Map, MapWhen, and UseWhen, as well as the Run extension. Which of the following statements about these APIs are correct? (Select all that apply.)#
Options
Pick every one that applies.
Show answer
MapWhen branches are terminal and do not rejoin the main pipeline, UseWhen branches rejoin the main pipeline after their middleware executes, and Map moves the matched path prefix from Request.Path to Request.PathBase. A Map branch does not rejoin the main pipeline, and Run registers a terminal delegate that does not call next.
Map creates a branch that does NOT rejoin the main pipeline; it is terminal once entered (the claim that a Map branch rejoins the main pipeline is false). MapWhen similarly creates a terminal branch that does not call back into the main pipeline (the claim that MapWhen branches are terminal is true). UseWhen, by contrast, creates a branch that rejoins the main pipeline — it wraps the remaining pipeline so that after the branch middleware completes, execution continues with the next middleware in the main pipeline (the claim that UseWhen branches rejoin the main pipeline is true). Run registers a terminal middleware delegate that does not receive or call a next delegate (the claim that Run automatically calls await next() is false). When Map matches a path prefix such as "/api", it prepends that segment to Request.PathBase and removes it from Request.Path so branch middleware sees the remainder (the claim about Map splitting Request.Path and Request.PathBase is true).
An ASP.NET Core MVC app has the controller below. A browser sends a single request: GET /Checkout/Start. TempData is backed by the default cookie-based provider. Trace the TempData lifecycle across the two redirects and determine the exact string written to the HTTP response body by the Confirm action's Content result.#
using Microsoft.AspNetCore.Mvc;
public class CheckoutController : Controller
{
public IActionResult Start()
{
TempData["Step"] = "Start";
TempData["Count"] = 1;
return RedirectToAction("Process");
}
public IActionResult Process()
{
var step = TempData["Step"]?.ToString() ?? "None";
var count = TempData["Count"]?.ToString() ?? "0";
TempData["Step"] = "Process";
TempData.Keep("Count");
return RedirectToAction("Confirm");
}
public IActionResult Confirm()
{
var step = TempData["Step"]?.ToString() ?? "None";
var count = TempData["Count"]?.ToString() ?? "0";
return Content($"Step={step}, Count={count}");
}
}Show answer
Step=Process, Count=1
In Start, TempData["Step"]="Start" and TempData["Count"]=1 are both set (unmarked for deletion) and survive the redirect. In Process, reading TempData["Step"] returns "Start" and marks Step for deletion; reading TempData["Count"] returns "1" and marks Count for deletion. Then TempData["Step"]="Process" reassigns Step, which removes it from the deletion set. TempData.Keep("Count") also removes Count from the deletion set. Both values survive the redirect to Confirm. In Confirm, TempData["Step"] reads "Process" and TempData["Count"] reads "1", so Content writes exactly Step=Process, Count=1.
In ASP.NET Core, when middleware components are registered via app.Use(...) in order A, then B, then C, any code that A places after await next(context) executes only after both B's and C's entire invocation (including their own post-next code) has completed — i.e., the response-side processing follows last-in-first-out (LIFO) order.#
Options
Show answer
True. The ASP.NET Core middleware pipeline is a nested delegate chain: each middleware wraps the next, so the first-registered component runs first on the request path and last on the response path. Code placed after await next(context) in middleware A executes only after every downstream middleware (B, C, …) has fully completed, yielding LIFO order on the response side.
The middleware pipeline is built as a chain of nested delegates: each Use call receives the next delegate and wraps it. When A calls await next(context), control flows to B; when B calls await next(context), control flows to C. C completes first, then B's post-next code runs, then A's post-next code runs. The first-registered middleware is the first to see the request and the last to see the response, producing strict LIFO ordering on the response path.
Related interview questions
Job market
See dotnet salaries and hiring demand from live job postings.
The other 118 questions
This page shows 25 and marks what you pick. That's as far as a page can go. A free account opens the other 118 and keeps every answer. What you miss comes back until it's right: after a day, then at longer gaps.
Free · the whole bank · 100 marked answers per 30 days · written feedback on the paid plan