Interview Cheat Sheet

instant recall for technical interviews · languages · design · systems · AI

JUNIOR What they test

MID What they test

SENIOR What they test

ARCHITECT What they test

ARCH Architect's toolkit

ADR
short record: context → decision → consequences
C4 model
diagrams at Context → Container → Component → Code
NFRs / "-ilities"
scalability, availability, security, maintainability, cost
Conway's law
systems mirror org structure; inverse Conway maneuver
Buy vs build
build only what differentiates you
Fitness functions
automated checks that architecture rules hold
Tech radar
adopt / trial / assess / hold
One-way doors
irreversible decisions deserve slow, deep review

LANG Python

from collections import Counter, defaultdict, deque
import heapq
freq = Counter(words).most_common(3)
g = defaultdict(list); g[u].append(v)
q = deque([start]); q.popleft()          # O(1) queue
heapq.heappush(h, (prio, item))          # min-heap
pairs.sort(key=lambda p: (-p[1], p[0]))
squares = [x*x for x in xs if x % 2]
@dataclass(frozen=True)
class Point: x: int; y: int

LANG JavaScript / TypeScript

const counts = new Map();
for (const w of words) counts.set(w, (counts.get(w) ?? 0) + 1);
const { id, ...rest } = user;              // destructure
const name = user?.profile?.name ?? "anon";
const [a, b] = await Promise.all([fa(), fb()]);
nums.sort((x, y) => x - y);               // default sort is lexicographic!
type Result<T> = { ok: true; value: T } | { ok: false; error: string };

LANG Java

Map<String, Integer> freq = new HashMap<>();
for (var w : words) freq.merge(w, 1, Integer::sum);
var top = freq.entrySet().stream()
    .sorted(Map.Entry.<String,Integer>comparingByValue().reversed())
    .limit(3).map(Map.Entry::getKey).toList();
record Point(int x, int y) {}                // immutable data carrier
var pq = new PriorityQueue<int[]>((a, b) -> a[0] - b[0]);
try (var ex = Executors.newVirtualThreadPerTaskExecutor()) { ex.submit(task); }

LANG Go

freq := map[string]int{}
for _, w := range words { freq[w]++ }
results := make(chan int)
var wg sync.WaitGroup
for _, j := range jobs {
    wg.Add(1)
    go func() { defer wg.Done(); results <- work(j) }()
}
go func() { wg.Wait(); close(results) }()
if err != nil { return fmt.Errorf("load: %w", err) }

LANG C# / .NET

var top = words.GroupBy(w => w)
    .OrderByDescending(g => g.Count())
    .Take(3).Select(g => g.Key).ToList();   // LINQ
public record Point(int X, int Y);
var msg = shape switch {
    Circle { R: > 10 } => "big circle",
    Circle c           => $"circle {c.R}",
    _                  => "other" };
await using var conn = await db.OpenAsync(ct);

LANG Rust

let mut freq: HashMap<&str, usize> = HashMap::new();
for w in &words { *freq.entry(w).or_insert(0) += 1; }
fn parse(s: &str) -> Result<u32, ParseIntError> {
    let n = s.trim().parse::<u32>()?;           // ? propagates Err
    Ok(n * 2)
}
match shape { Shape::Circle(r) => area(r), Shape::Square(s) => s * s }
let shared = Arc::new(Mutex::new(vec![]));

LANG C++

std::unordered_map<std::string, int> freq;
for (auto& w : words) ++freq[w];
std::priority_queue<int, std::vector<int>, std::greater<>> minHeap;
auto p = std::make_unique<Widget>();     // sole owner
auto s = std::make_shared<Cache>();      // ref-counted
std::ranges::sort(v, {}, &User::age);

LANG PHP 8.x

enum Status: string { case Paid = 'paid'; case Due = 'due'; }
final class Money {
    public function __construct(public readonly int $cents) {}
}
$label = match (true) { $n < 0 => 'neg', $n === 0 => 'zero', default => 'pos' };
$slug = $title |> trim(...) |> strtolower(...);   // 8.5 pipe

ROSETTA Same idea, many languages

Hash mapMin-heapDynamic array
Pythondictheapqlist
JS/TSMapnone (hand-roll)Array
JavaHashMapPriorityQueueArrayList
Gomapcontainer/heapslice
C#DictionaryPriorityQueueList<T>
RustHashMapBinaryHeap+ReverseVec
C++unordered_mappriority_queue+greatervector

ROSETTA Concurrency models

Python
asyncio (single-thread loop), threads (I/O), processes (CPU)
JS/Node
single-threaded event loop + promises; worker threads for CPU
Java
OS threads, executors, CompletableFuture, virtual threads
Go
goroutines (M:N scheduled) + channels (CSP)
C#
Task-based async/await on the thread pool
Rust
threads + ownership; async futures run by a runtime (tokio)
Erlang/Elixir
actors: isolated processes + message passing, "let it crash"

LANG Language concepts

Paradigms
imperative · OOP · functional · declarative (SQL, HTML) · logic
Static vs dynamic
types checked at compile time vs runtime
Strong vs weak
no vs implicit coercion ("1"+1)
Nominal vs structural
Java/C# name-based vs TS/Go shape-based
Compiled / JIT
AOT to native (Go, Rust) vs bytecode + JIT (JVM, .NET, V8)
Memory
GC (tracing / ref-count) vs ownership (Rust) vs manual (C)
Value vs reference
copy on assign vs share pointer; pass-by-sharing
Stack vs heap
fast, scoped, fixed-size vs dynamic, longer-lived
Closure
function + captured lexical environment
Generics
reified (C#) vs erased (Java) vs monomorphized (Rust, C++)

OOP Four pillars

OOP Composition over inheritance

// inheritance: behavior locked in at compile time
class LoggingRepo extends SqlRepo { ... }
// composition: behavior injected, swappable, testable
class OrderService {
  constructor(private repo: Repo, private log: Logger) {}
  place(o: Order) { this.repo.save(o); this.log.info("placed", o.id); }
}

OOP Interface vs abstract class & friends

Interface
contract only (may have default methods); multiple allowed
Abstract class
partial implementation + state; single inheritance
Trait / mixin
reusable behavior bundle, horizontal reuse
Overload
same name, different params: compile-time
Override
subclass replaces method: runtime (dynamic dispatch)
Static dispatch
resolved at compile time (generics, templates) — faster, inlinable
Diamond problem
multiple inheritance ambiguity; solved by interfaces/MRO

KEY DIP vs DI vs IoC container

OOP Coupling, cohesion, Demeter

SOLID The five

SOLID OCP in 8 lines

# closed: every new type edits this function
def price(kind, base):
    if kind == "vip": return base * 0.8
    if kind == "sale": return base * 0.5
# open: new behavior = new class, zero edits
class Discount(Protocol):
    def apply(self, base: float) -> float: ...
def price(d: Discount, base): return d.apply(base)

PRINCIPLES Beyond SOLID

DRY
one source of truth for knowledge, not for similar-looking code
AHA / WET
avoid hasty abstractions; duplicate twice, abstract on the third
KISS
simplest thing that works
YAGNI
don't build for imagined requirements
SoC
separation of concerns (UI / domain / infra)
POLA
principle of least astonishment
Fail fast
validate at boundaries, crash loudly on broken invariants
Boy Scout
leave code cleaner than you found it
CoC
convention over configuration (Rails, Spring Boot)

SMELLS Code smells → refactor

Long method
Extract Method
God class
Extract Class by responsibility
Feature envy
Move Method to the data it uses
Shotgun surgery
one change → many files; consolidate
Primitive obsession
Value Object (Email, Money)
Switch on type
Replace Conditional with Polymorphism
Long param list
Parameter Object / Builder
Magic numbers
named constants / enums

GoF Creational

GoF Structural

GoF Behavioral

PATTERN Decorator + Strategy, live

class CachedRepo(Repo):                 # Decorator
    def __init__(self, inner: Repo, cache):
        self.inner, self.cache = inner, cache
    def get(self, id):
        if (hit := self.cache.get(id)) is not None: return hit
        v = self.inner.get(id); self.cache[id] = v; return v

strategies = {"card": pay_card, "paypal": pay_pp}   # Strategy
strategies[method](amount)

PICK "I need to…" → pattern

swap algorithm at runtime
Strategy
add behavior w/o subclassing
Decorator
tame an ugly API
Adapter / Facade
react to something happening
Observer / Pub-Sub
undo / queue actions
Command
complex object creation
Builder / Factory
lifecycle with rules
State machine
pipeline of handlers
Chain of Responsibility / middleware
treat one & many alike
Composite

FP Functional patterns

ANTI Anti-patterns

ARCH Monolith ↔ Microservices

WinCost
Monolithsimple deploy, local calls, ACIDscales as one, team contention
Modular monoenforced module boundaries, one deploydiscipline required
Microservicesindependent deploy/scale, team autonomynetwork, distributed txns, ops overhead
Serverlesszero ops, pay per callcold starts, limits, lock-in

ARCH Clean / Hexagonal / Onion

DDD Domain-Driven Design

Ubiquitous lang.
code uses the business's words
Bounded context
boundary where a model is consistent (≈ service boundary)
Entity
identity over time (Order#42)
Value object
defined by values, immutable (Money, Address)
Aggregate
consistency boundary; one root; one txn per aggregate
Domain event
"something happened" (OrderPlaced)
ACL
anti-corruption layer translating a foreign model
Context map
how contexts relate (upstream/downstream, shared kernel)

ARCH CQRS & Event Sourcing

ARCH Microservice patterns

API Gateway
single entry: routing, auth, rate limit, TLS
BFF
backend-for-frontend, one per client type
Service mesh
sidecar proxies (Envoy/Istio/Linkerd): mTLS, retries, telemetry
Strangler fig
incrementally replace legacy behind a facade
DB per service
own your data; share via APIs/events
Service discovery
registry / DNS (Consul, K8s Services)
Bulkhead
isolate resource pools so one failure doesn't sink all
Circuit breaker
closed → open → half-open; fail fast

EDA Event-driven basics

EDA Delivery guarantees

def handle(msg):
    if store.seen(msg.id): return          # idempotent
    with tx: apply(msg); store.mark(msg.id)

EDA Outbox, CDC, Saga

EDA Brokers compared

Kafka
distributed log; partitions, consumer groups, offsets, retention + replay; high throughput
RabbitMQ
smart broker; exchanges + routing keys; per-message ack; task queues
SQS / SNS
managed queue / fan-out topic (AWS); FIFO variant
Pub/Sub
GCP managed pub/sub; push or pull
EventBridge
event bus with rules/filters, SaaS integrations
NATS / Redis Streams
lightweight, low-latency messaging

STREAM Stream processing

CLOUD Service models

IaaS
VMs, networks, disks (EC2, Compute Engine)
CaaS
managed containers (EKS, GKE, AKS, Cloud Run, Fargate)
PaaS
push code, platform runs it (App Engine, Heroku, App Service)
FaaS
functions on events (Lambda, Cloud Functions)
SaaS
finished product (Gmail, Salesforce)

CLOUD AWS · GCP · Azure

NeedAWSGCPAzure
VMEC2Compute EngineVirtual Machines
FunctionsLambdaCloud FunctionsFunctions
K8sEKSGKEAKS
ContainersFargate / App RunnerCloud RunContainer Apps
ObjectS3Cloud StorageBlob Storage
SQLRDS / AuroraCloud SQL / SpannerAzure SQL
NoSQLDynamoDBFirestore / BigtableCosmos DB
QueueSQSPub/SubService Bus
CDNCloudFrontCloud CDNFront Door
WarehouseRedshiftBigQuerySynapse / Fabric
AIBedrock / SageMakerVertex AIAzure AI Foundry

CLOUD 12-Factor app (short)

K8S Containers & Kubernetes

Image / container
immutable template / running instance (namespaces + cgroups)
Pod
smallest unit; 1+ containers sharing network
Deployment
desired replicas + rolling updates
Service
stable virtual IP / DNS for pods
Ingress / Gateway
L7 HTTP routing into the cluster
ConfigMap / Secret
config / sensitive config
HPA
autoscale on CPU / custom metrics
Liveness vs readiness
restart me vs don't send me traffic yet
StatefulSet
stable identity + storage (DBs)
DaemonSet
one pod per node (log agents)
Helm / Kustomize
packaging / overlays for manifests

CLOUD Serverless

IaC Infra as Code & GitOps

CLOUD HA & Disaster Recovery

SD The interview loop

SD Numbers & napkin math

L1 / RAM
~1 ns / ~100 ns
SSD random read
~100 µs
Same-DC round trip
~0.5 ms
Cross-continent
~150 ms
1 day
86,400 s ≈ 105 s
1M req/day
≈ 12 req/s (peak ×2–10)
100M DAU × 10 req
≈ 12k QPS avg
Powers
210≈103 KB · 220 MB · 230 GB · 240 TB
Single box
~10k+ simple RPS app; Postgres ~10k TPS tuned

SD Scaling & load balancing

SD Caching

Cache-aside
app reads cache → miss → DB → fill. Most common.
Read-through
cache loads from DB itself
Write-through
write cache + DB synchronously (consistent, slower)
Write-back
write cache, flush later (fast, risk of loss)
Eviction
LRU · LFU · TTL · FIFO
Stampede
hot key expires, herd hits DB → lock / jittered TTL / stale-while-revalidate
Layers
browser → CDN → reverse proxy → app (in-mem) → Redis → DB

SD Replication & sharding

SD Rate limiting

def allow(now):
    tokens = min(cap, tokens + (now - last) * rate); last = now
    if tokens >= 1: tokens -= 1; return True
    return False

SD Classic designs: the key trick

URL shortener
base62(ID) or hash + collision check; 301 vs 302; read-heavy → cache
News feed
fan-out on write (push) vs on read (pull); hybrid for celebrities
Chat
WebSockets, presence service, per-conversation ordering, offline store
Typeahead
trie / prefix index + top-K cache per prefix
Unique IDs
Snowflake: time | machine | sequence; UUIDv7 sortable
Notifications
queue per channel, retries, user prefs, dedupe
Web crawler
URL frontier, politeness, dedupe (Bloom filter)
File storage
chunking, content hashing, metadata DB + blob store

SD Consistency & consensus

SQL Must-know queries

-- top earner per department (window fn)
SELECT * FROM (
  SELECT e.*, ROW_NUMBER() OVER (
    PARTITION BY dept_id ORDER BY salary DESC) rn
  FROM employees e) t
WHERE rn = 1;
-- depts with > 5 people
SELECT dept_id, COUNT(*) FROM employees
GROUP BY dept_id HAVING COUNT(*) > 5;
WITH recent AS (SELECT ... ) SELECT ... FROM recent;

DB Indexes & query perf

DB Transactions & isolation

LevelPrevents
Read uncommittednothing
Read committeddirty reads (Postgres default)
Repeatable read+ non-repeatable reads (MySQL default)
Serializable+ phantoms, write skew

DB Picking a store

Relational
Postgres, MySQL: joins, ACID, the safe default
Document
MongoDB: flexible JSON, aggregate-shaped reads
Key-value
Redis, DynamoDB: O(1) by key, massive scale
Wide-column
Cassandra, Bigtable: write-heavy, time-ordered
Graph
Neo4j: relationship traversal
Search
Elasticsearch/OpenSearch: inverted index, full-text
Time-series
TimescaleDB, InfluxDB: metrics
Vector
pgvector, Pinecone, Qdrant, Weaviate: similarity search

DATA Analytics stack

API Styles compared

REST
resources + HTTP verbs, cacheable GETs, simple. Over/under-fetch.
GraphQL
typed schema, client picks fields, one endpoint. N+1 resolvers, caching harder.
gRPC
Protobuf over HTTP/2, fast, streaming, codegen. Service-to-service.
WebSocket
full-duplex persistent connection (chat, games)
SSE
server → client stream over HTTP (LLM token streaming!)
Webhook
server calls you on events; verify signatures
SOAP
XML + WSDL, rigid, legacy enterprise

API REST design rules

2xx
200 OK · 201 Created · 204 No Content
3xx
301 permanent · 302/307 temporary · 304 not modified
4xx
400 bad · 401 unauthenticated · 403 forbidden · 404 · 409 conflict · 422 invalid · 429 too many
5xx
500 · 502 bad gateway · 503 unavailable · 504 gateway timeout

WEB What happens when you hit Enter

ALGO Big-O of data structures

StructureAccessSearchInsertDelete
Array1nn (end: 1*)n
Linked listnn1 (at node)1
Hash map–1 avg1 avg1 avg
Balanced BSTlog nlog nlog nlog n
Heaptop: 1nlog nlog n
Trie–LLL

ALGO Problem → pattern

sorted array / pair sum
two pointers, binary search
contiguous subarray/string
sliding window
subarray sum = k
prefix sum + hash map
top / kth K
heap of size K (or quickselect)
all combos / perms
backtracking
shortest path, unweighted
BFS
weighted, non-negative
Dijkstra
dependencies / ordering
topological sort
connected groups
union-find / DFS
optimal + overlapping subproblems
dynamic programming
next greater element
monotonic stack
overlapping intervals
sort by start, merge
prefix lookups
trie
"min max" / "max min"
binary search on the answer

ALGO Templates

def lower_bound(a, x):            # first i with a[i] >= x
    lo, hi = 0, len(a)
    while lo < hi:
        mid = (lo + hi) // 2
        if a[mid] < x: lo = mid + 1
        else: hi = mid
    return lo

def longest_unique(s):            # sliding window
    seen, l, best = {}, 0, 0
    for r, ch in enumerate(s):
        if seen.get(ch, -1) >= l: l = seen[ch] + 1
        seen[ch] = r; best = max(best, r - l + 1)
    return best

def bfs(start):
    dist, q = {start: 0}, deque([start])
    while q:
        u = q.popleft()
        for v in graph[u]:
            if v not in dist: dist[v] = dist[u] + 1; q.append(v)
    return dist

ALGO Dynamic programming

@cache
def coins(n):                     # min coins for n
    if n == 0: return 0
    return min((coins(n - c) + 1 for c in C if c <= n), default=inf)

ALGO Graphs

BFS / DFS
O(V+E); BFS = shortest in unweighted
Dijkstra
non-negative weights, heap: O(E log V)
Bellman-Ford
negative weights, detects negative cycles: O(VE)
Floyd-Warshall
all pairs: O(V³)
Topo sort
Kahn's (in-degree queue) or DFS post-order; cycle = impossible
Union-Find
path compression + union by rank ≈ O(α(n))
MST
Kruskal (sort edges + UF) / Prim (heap)
A*
Dijkstra + heuristic (maps, games)

ALGO Coding round playbook

CONC Concurrency core

CONC Models & patterns

SEC OWASP → defense

Broken access ctrl
#1. Check authz server-side on every object (IDOR)
Injection (SQLi)
parameterized queries, never string-concat
XSS
context-aware output encoding, CSP header
CSRF
SameSite cookies, anti-CSRF tokens
SSRF
allowlist outbound URLs, block metadata IPs
Insecure deserial.
never deserialize untrusted native objects
Crypto failures
TLS everywhere, strong algos, no homemade crypto
Misconfiguration
no default creds, least privilege, no verbose errors
Vulnerable deps
SCA scanning, SBOM, pin + update

SEC AuthN · AuthZ · OAuth

SEC Crypto & hygiene

Encoding
format change, no secrecy (Base64)
Hashing
one-way (SHA-256). Passwords: argon2 / bcrypt + salt
Symmetric
one shared key, fast (AES-GCM)
Asymmetric
public/private (RSA, ECC): key exchange, signatures
HMAC
keyed hash → integrity + authenticity (webhooks)
Secrets
vault / KMS, never in git, rotate
Zero trust
never trust network location; verify every request
Least privilege
minimal permissions for users, services, CI tokens
Supply chain
SBOM, signed artifacts (Sigstore), lockfiles

TEST Testing essentials

OPS Delivery

CI
merge often, build + test every commit
CD
delivery (deployable) vs deployment (auto to prod)
Trunk-based
short-lived branches + flags over long feature branches
Rolling
replace instances gradually
Blue-green
two envs, atomic switch, instant rollback
Canary
small % of traffic, watch metrics, widen
Feature flag
decouple deploy from release
Shadow
mirror prod traffic to new version, discard responses
Semver
MAJOR (breaking) . MINOR (feature) . PATCH (fix)
Expand/contract
backward-compatible DB migrations in steps

SRE Observability

RCA Debugging & incidents

ML Fundamentals

ML Metrics

Precision
TP / (TP+FP): of flagged, how many right? (spam filter)
Recall
TP / (TP+FN): of real, how many caught? (cancer screen)
F1
harmonic mean of P and R
Accuracy
misleading on imbalanced data (99% "not fraud")
ROC-AUC / PR-AUC
threshold-free ranking quality; PR for rare positives
MAE / RMSE
regression error; RMSE punishes big misses
Imbalance
resample, class weights, pick the right metric

ML Classic algorithms

Linear / logistic reg.
baseline, interpretable
Decision tree
if/else splits; overfits alone
Random forest
bagging many trees → robust
Gradient boosting
XGBoost / LightGBM: king of tabular data
SVM
max-margin boundary, kernels
k-NN
vote of nearest neighbors
k-means
clustering into k centroids
PCA
linear dimensionality reduction
Naive Bayes
fast text classification baseline

DL Deep learning

LLM How LLMs work

LLM Prompting & sampling

Temperature
randomness; 0 ≈ deterministic, higher = creative
Top-p / top-k
sample only from the likeliest tokens
System prompt
role, rules, format, persistent instructions
Zero / few-shot
no examples / a few examples in the prompt
In-context learning
learns the task from the prompt, no weight updates
Chain-of-thought
reason step by step; reasoning models do it natively (test-time compute)
Structured output
JSON schema / tool schemas for reliable parsing
Context engineering
curating exactly what goes into the window
Prompt injection
untrusted text hijacks instructions; isolate + least-privilege tools

LLM Prompt vs RAG vs fine-tune

RAG Retrieval-augmented generation

# ingest
chunks = split(docs, size=500, overlap=50)
store.upsert([(c.id, embed(c.text), c.meta) for c in chunks])
# query
hits = store.search(embed(q), k=20)          # ANN: HNSW
hits = rerank(q, hits)[:5]                   # cross-encoder
answer = llm(f"Answer only from:\n{hits}\n\nQ: {q}")

AGENT Agents & tool use

while not done:                     # the agent loop
    msg = llm(history, tools=TOOLS)
    if msg.tool_call:
        result = run(msg.tool_call)     # sandboxed, permissioned
        history += [msg, result]
    else: done = True

LLMOps Shipping AI to prod

AI-SD Design an AI assistant

AI Buzzword decoder

GenAI
models that generate text, images, audio, code
Foundation model
big general pretrained model, adapted to many tasks
Multimodal
text + image + audio + video in/out
Diffusion
generate by iteratively denoising (images, video)
GAN / VAE
older generative models: adversarial / latent-space
MoE
mixture of experts: only some params active per token
SLM
small language model; on-device, cheap
Open-weights
weights downloadable (Llama, Mistral, Qwen, DeepSeek)
Hallucination
fluent but false output
Grounding
tying answers to trusted sources
Emergent ability
skill appearing only at larger scale
Test-time compute
spend more inference "thinking" for better answers
Synthetic data
model-generated training data
Copilot
AI assistant embedded in a workflow
Agentic
AI that plans and takes multi-step actions
Vibe coding
building by prompting, reviewing little code
AGI
hypothetical human-level general intelligence

AI Responsible AI

SOFT STAR answers

SOFT Senior signals

TERMS Distributed / correctness

Idempotency
repeat = same result; key dedupes retries
At-least-once
+ idempotent consumer ≈ exactly-once
Eventual consist.
replicas converge; stale reads expected
ACID / BASE
txn guarantees / basically-available soft-state
CAP
on partition pick Consistency or Availability
Optimistic / pess.
version check vs lock up front
Split brain
two leaders after a partition; fencing tokens
Clock skew
never trust wall clocks for ordering
Bloom filter
"maybe in set" / "definitely not", tiny memory

TERMS Performance

Latency / throughput
time per request / requests per time
P95 / P99
tail latency: what users feel; averages lie
Backpressure
consumer signals "slow down"
Cache stampede
herd of misses on one expired key
Amortized
average cost over a sequence of ops
Little's law
L = λW (in-flight = rate × time)
Amdahl's law
speedup capped by the serial part
Head-of-line
one slow item blocks the queue

TERMS Ops & reliability

MTTR / MTBF
time to recover / between failures
Circuit breaker
stop calling a failing dependency; fail fast
Graceful degradation
serve partial results over errors
Retry storm
retries amplify outage; backoff + budgets
Toil
manual, repetitive ops work: automate it
Runbook
step-by-step incident procedure
Blast radius
how much breaks when this breaks
Shift left
test/secure earlier in the lifecycle
Platform eng.
internal developer platform, golden paths

★ The thesis

no cards match. Try fewer words, or press Esc

What are you interviewing for?

We'll show the cards that matter most at that level. You can switch anytime from the header.