Frontend Engineer Interview Questions

30 questionsWritten 5 September 2026

A frontend interview is two interviews wearing one name.

There is the one about the language and the browser — closures, the box model, why the layout jumps — which you can revise for over a weekend. And there is the one about judgement: why this component re-renders, why you reached for shared state when a prop would have done, what you would delete first if the bundle had to halve. That second interview is where offers are decided, and it is the one you cannot revise for.

The tell is always the same. A candidate solves the exercise cleanly, then goes quiet when asked why. Not because they don't know — because they have never had to say it out loud to somebody who might disagree, and the interviewer is watching to see whether you can be argued out of a bad decision or only into one.

One thing has genuinely changed in the last two years and the prep content has not caught up: you will be asked what an assistant wrote and what you wrote. Employer policies on that differ sharply, sometimes between two teams in the same building, and answering it badly reads worse than the code ever could. Question 26 is the one to rehearse.

If you are a mid-level frontend engineer, this is your page. There is a graduate page, a senior page, and no mid page — everything below assumes code you have already shipped to real browsers.

The phone screen

A recruiter filtering, not evaluating. Answer these quickly and get to the part that decides.

The screen

All levels

Twenty to thirty minutes with a recruiter or an engineering manager, and the only thing being decided is whether you go further. Nobody expects depth here. What loses it is vagueness — a candidate who describes a team's work in the first person plural for four minutes and never says which part was theirs.

  1. Walk me through what you built — not what the team built.Show the answer guide

    Say the boundary out loud in the first sentence. "I owned the checkout flow — three screens, the address form and the payment step. I did not build the payment integration itself." That single move separates you from the majority of the shortlist, because most people answer this in "we".

    Then pick one thing that was hard and say why it was hard. Not the feature list. The hard part — the form that had to keep half-finished input across a page refresh, the table that had to stay usable at four hundred rows, the component two other teams also depended on so you couldn't change its props.

    Interviewers are listening for scope and for honesty about it. Overclaiming is caught in the technical round twenty minutes later, and it costs more than the smaller true answer would have.

    One candidate's version

    I owned the search results page on a property listings site — the filters, the map sync and the results list. About 40,000 listings, so the filter panel and the map had to stay in step without refetching on every checkbox. The hard part wasn't the rendering, it was that the URL had to be the source of truth so people could share a filtered search. I got that wrong first and had to rebuild it in the third week.

    Swap in your own screen. Keep the shape: what you owned, the number that made it non-trivial, and the thing you got wrong before you got it right.

  2. Why are you leaving?Show the answer guide

    Answer in one sentence and move on. The long answer always sounds like a grievance no matter how carefully it is worded.

    Something about the work is safest and usually true: "I've been maintaining the same admin panel for two years and I want to be closer to a product people actually use." Do not describe a manager. Do not describe a salary, even if the salary is the reason — that conversation has its own question and this is not it.

  3. What are your salary expectations?Show the answer guide

    Give a range with a floor you would actually accept, and say what the range is anchored on — the local market, the market for the client's country, or the currency you're paid in. Those are three different numbers for the same job and this role is the one where they diverge most.

    If you're working from your own market for an employer based in another, the honest position is that you're being paid against a third market. Say which one you're quoting. A number with no stated basis reads as a guess, and it invites the employer to supply the basis themselves.

    One thing you're entitled to ask before you answer, and asking it costs nothing: what band is this role in, and what does the band top out at?

  4. Which parts of the stack do you actually own?Show the answer guide

    The trap is claiming full-stack because the job ad says it. Name the layer you would be trusted with unsupervised, then name the one you can work in with review. Two honest sentences beat one impressive one.

The questions that are really about your paperwork

All levels

Where sponsorship and work permits are routine, these are asked outright, early, and without embarrassment — often before anything technical. Where they are not, they arrive late and hedged. Either way they are decisions, not small talk, and going in without an answer is how a good candidate stalls at the offer stage.

The one fact worth carrying into a Saudi interview. Software roles sit under the ICT nationalisation decision, not the engineering one — Ministerial Resolution 28889, issued 5 October 2020 and in force from 27 June 2021, which set a 25% Saudization rate across communications and IT engineering, application development, programming and analysis, and technical support, at establishments with five or more workers. It also set a minimum counted wage of SAR 7,000 a month for specialised roles and SAR 5,000 for technical ones. Conflating this with the 30% engineering decision is a mistake a Saudi interviewer notices immediately, because they are different decisions with different numbers.

What it means depending on which side of it you are on. If you are Saudi, an employer in this sector has a legal reason to be in the room with you, and the wage floor is a floor, not a target. If you are an expatriate, the same decision is the reason the shortlist for your role is shorter than the job ad suggests — and since mid-2025 your work permit also carries a skill classification, assessed on qualifications, experience, wage and age, which is renewed with the permit rather than set once.

Neither of those is a reason to raise the subject yourself. They are the reason to know what the employer is weighing while they ask you something that sounds administrative.

  1. Do you need sponsorship, and is your permit transferable?Show the answer guide

    Answer factually and completely in one pass — status, transferability, and the realistic date you could start. Employers ask because a transfer and a fresh visa are different problems with different timelines, and a vague answer here is read as an attempt to postpone a bad fact.

    If your position is awkward, say the awkward thing plainly and immediately follow it with the date. An employer can plan around a date. They cannot plan around ambiguity.

  2. What is your current package, all in?Show the answer guide

    In markets without statutory pay-transparency rules this is asked directly and is not considered rude. In markets with them, applicants have a right to pay information for the role before the interview and employers are not to ask about pay history — the universal screening guide covers the scope of that properly, and it is narrower than people assume.

    Practically: know your all-in number including housing and transport allowances, because where the package is split that way the base salary alone understates it badly, and an employer comparing your base against their total package will "beat" your current pay while cutting it.

  3. Would you relocate?Show the answer guide

    Ask what the role actually requires before you answer: full relocation, a rotation, or three onsite days a quarter. Those are different lives and the job ad usually says only one word about it.

Verified: — Scoped. The ICT decision's number, date and figures were checked against a law-firm alert and a same-day Saudi financial-press report of the commencement; no ministry page was readable from here. The 2026–2028 Nitaqat cycle re-based sector quotas and we could not confirm at Tier 1 whether the ICT rate still stands at 25% — check your own establishment's band on the ministry's own platform before relying on it.

Quotas, wage floors and permit rules move without notice, and the classification attached to a permit is decided by the ministry, not by an employer's description of the job. Treat everything here as the shape of the rule, not as advice about your own file.

The technical sit-down

Where it stops being about your CV. You either know these or you don't — and bluffing fails on the follow-up.

The craft questions

Entry – senior

This is the part that decides it. Notice that almost none of these have one right answer — they are asked so that you will reason out loud, and the interviewer is measuring whether your reasoning survives a push. Say what you would check first and in what order, and be willing to change your mind when they hand you a new fact.

A working habit that reads well here: when you don't know, say what you would do to find out. That is a real answer in this job, and it is what the person opposite you does all day.

  1. This component re-renders on every keystroke and the page feels slow. Where do you look first?Show the answer guide

    The wrong move is to start naming optimisations. The right move is to measure, and to say so before you do anything else.

    Order it: confirm the re-render is real with the framework's own profiler or a render counter, because half the time the slowness is elsewhere entirely and you are about to optimise a component that was never the problem. Then find what changes identity on every keystroke — an object or function or array created inline in the parent, a context whose value is a fresh object each render, a key that isn't stable. Then ask whether the state is in the right place at all: input state that lives three levels above the input is the single most common cause of this, and moving it down beats memoising anything.

    Only after those three would I reach for memoisation, and I would say why out loud — memoisation has a cost, it can be defeated by an unstable dependency, and a memo wrapped around a component whose props genuinely change every render is pure overhead with a comment on top.

    The answer that impresses is the one where you name the thing you would check and what result would make you abandon that line.

    What to avoid

    Do not say "I'd wrap it in a memo." It is the answer of someone who has read about the problem rather than sat with it, and the immediate follow-up — "and if the props are a new object every time?" — ends the line badly.

  2. When does state belong to the component, and when does it belong somewhere else?Show the answer guide

    Start from who needs to read it. State that only one subtree reads belongs in that subtree. State that two siblings need belongs to their nearest common parent. State that survives navigation, or that must match what the server thinks, is not really component state at all — it's cached server data or it's the URL, and treating it as component state is how you end up writing a sync loop nobody can debug.

    Say the URL part explicitly. Filters, tabs, pagination and search terms belong in the URL because a user expects to share and reload them, and half the state-management pain in this job comes from having learned that late.

  3. Walk me through everything between a click and the pixel changing.Show the answer guide

    Asked open-ended on purpose; how far you get is the measurement. The spine: the event fires and your handler runs on the main thread, sets state, which schedules work rather than doing it; the framework computes what changed and writes to the DOM; the browser recalculates styles, computes layout, paints and composites. Some property changes skip layout; some force it.

    The part worth landing is the one with consequences: reading a layout value immediately after writing one forces synchronous layout, and doing that inside a loop over a list is how a smooth page becomes a stuttering one. And if you don't know a stage, name it and say so — a confident wrong sequence costs more, and the interviewer already knows which parts you're guessing at.

  4. How do you decide something needs memoising?Show the answer guide

    By measuring, and by saying what the threshold was. The honest answer is that most components do not need it and that the cost of memoising everything is a codebase where nobody can tell which optimisations matter.

    Two cases are worth naming as genuinely justified: an expensive derived computation over a large collection, and a value passed to a memoised child where identity stability is the entire point. Everything else is "I profiled it and it was measurable."

  5. The list has five thousand rows and scrolling stutters. What do you do?Show the answer guide

    Windowing — render only the rows in view plus a buffer — is the expected answer, so get there quickly and then spend your time on what it costs. Variable row heights break naive windowing. Search and keyboard navigation inside a windowed list need care because the target row may not be mounted. Accessibility gets harder because assistive technology cannot see rows that aren't there, which is what the row-count attributes exist for.

    The stronger version of the answer asks a question back: does the user actually need five thousand rows, or do they need to find one? Pagination and better filtering solve the same problem without any of the cost, and proposing that first is a product instinct interviewers notice.

  6. The user types, then navigates away before the request comes back. What happens?Show the answer guide

    Two failures live here and a good answer names both. The response arrives and writes to a component that is gone. And two responses arrive out of order, so the older one wins and the screen shows results for a query the user has already replaced.

    Cancellation handles the first — an abort signal tied to the effect's cleanup. The second needs a sequence check or a request key, because cancellation is best-effort and a race can still resolve backwards. Say the second one; most candidates only say the first.

  7. How do you test a component?Show the answer guide

    Answer in terms of what you assert, not which library you use. Test what the user can observe — the text on the screen, the accessible role and name of the control, what happens after a click — and never assert on internal state or class names, because a test that breaks when you rename a CSS class is a tax with no benefit.

    Then name the boundary: unit tests for logic with no DOM, component tests for behaviour, and a small number of end-to-end tests for the flows whose breakage would be an incident. Say the number is small and say why — they're slow and flaky, and a suite people ignore is worse than no suite. Asked what you'd test first in an untested codebase, the answer is the flow that makes the money, not the file that looks worst.

    If you have a real example of a test that caught something before release, that is the whole answer — use it instead of the theory.

  8. What's your approach to forms?Show the answer guide

    Say where validation lives and when it runs, because that is the actual question. Validate on blur rather than on every keystroke for anything a person is still typing; show errors after a field has been touched, not before; and never let the client be the only place a rule exists, because the server will be handed the request directly sooner or later.

    Then mention the two things that get skipped and that a reviewer will look for: what happens when the submit fails halfway, and whether the form is usable with a keyboard alone.

What the browser is doing while your code runs

Entry – mid

These come from an engineer rather than a manager, and they are diagnostic — the interviewer usually already knows whether you have hit each of these in real work, and is checking how you describe it. Short, concrete answers beat thorough ones here.

  1. The page content jumps around while it loads. Why?Show the answer guide

    Because something took up space after the fact. Images and embeds without dimensions reserved, a web font swapping in at a different metric, content injected above what's already rendered, an ad or banner slot that grows.

    The fix is boring and worth saying plainly: reserve the space in advance — width and height or an aspect ratio on media, a fixed container for anything asynchronous, and font loading configured so the fallback and the real face are close enough in size that the swap doesn't reflow.

  2. This element has a huge z-index and it's still behind that one. Explain.Show the answer guide

    Because z-index only orders siblings inside the same stacking context, and an ancestor with a transform, a filter, or an opacity below one has created a new one. The element is at the top of a box that is itself underneath. Say that, then say you would look up the tree rather than raise the number.

  3. How does the event loop decide what runs next?Show the answer guide

    One call stack, a queue of tasks, and a separate microtask queue that is drained completely after each task and before the browser renders. Promise callbacks are microtasks; timers and most events are tasks.

    The consequence is the part worth saying, because it's why the question is asked: a promise chain that never yields will starve rendering just as effectively as a long loop, and awaiting something that resolves immediately does not give the browser a chance to paint.

  4. What is a CORS error actually telling you?Show the answer guide

    That the browser made the request, got a response, and refused to hand it to your code because the server did not say your origin was allowed. It is a server configuration answer, not a client one — which is why nothing you change in the fetch call will fix it, and why the proxy people reach for is a workaround rather than a solution.

  5. How would you make this page usable on a mid-range Android on a bad mobile connection?Show the answer guide

    This one rewards first-hand experience of mid-range hardware and weak networks, and it is worth preparing properly wherever your users are on exactly that device on exactly that connection — a page tuned on a laptop over office wifi has never met them.

    Work in order of what actually costs: ship less JavaScript — split by route, defer anything not needed for the first screen, and check whether a dependency is worth its weight rather than assuming it is. Send images that fit the device, in a modern format, with dimensions reserved. Get the first meaningful paint off the server rather than after a bundle downloads, parses and hydrates.

    Then say the thing most candidates don't: parsing and executing JavaScript is the expensive part on a slow device, not downloading it. A 300KB bundle on a fast connection and a weak CPU is still a frozen page for a second and a half. Finish with how you'd know — throttle the network and the CPU in the browser's own tooling, and test on a real mid-range handset rather than a simulator.

  6. What does accessible mean, concretely, on a screen you have built?Show the answer guide

    Be concrete or don't answer. The generic version of this answer — that accessibility is important and we should follow the guidelines — is worth nothing and every interviewer has heard it forty times.

    Concrete looks like: every interactive thing is reachable and operable with a keyboard alone, and the focus ring is visible rather than removed. Every control has an accessible name that isn't just an icon. Colour is never the only way information is conveyed. Headings are in order and describe the structure rather than being chosen for their size. Form errors are associated with their fields and announced, not just coloured red. Anything that appears on top — a dialog, a menu — traps focus while it's open and returns it when it closes.

    The best single answer to this question is a story: something you found because you actually tried to use your own screen with the mouse unplugged, or with a screen reader on for ten minutes. "We ran an automated checker" is a weaker answer than it sounds, and saying so out loud — that automated tools catch a minority of real problems — is a mark of someone who has done it.

    What to avoid

    Do not recite conformance levels as if they were the work. Naming a standard tells the interviewer you know the word; describing the keyboard trap you found in your own dialog tells them you have done the job.

Judgement calls they will push on

Mid – senior

Expect to be disagreed with here, deliberately, to see what you do. Holding a position under mild pressure is good; holding it after being given a fact that undermines it is not. The pass condition is that you change your mind for a reason and say which reason.

  1. The design cannot be built in the time that's left. What do you do?Show the answer guide

    Go to the designer with a specific cut, not with the problem. "The animated transition is two days and the rest is one. Ship it without the transition and add it next sprint, or drop the filter panel and keep the animation." Two options and a recommendation.

    The failure interviewers are listening for is the engineer who either silently builds a worse version of it or silently misses the date. Both are decisions taken alone that were not theirs to take alone.

  2. The API returns a shape that's awkward for the UI. Do you reshape it in the client?Show the answer guide

    Yes, in one place, at the boundary — and then go and ask for the API to change. Both halves matter. Reshaping scattered through components is how a shape becomes permanent; reshaping in one adapter keeps the cost visible and the change cheap when the endpoint improves.

    Say when you would not ask: if the endpoint serves three other consumers who are happy with it, the awkwardness is yours to absorb, and knowing which case you're in is the actual judgement being tested.

  3. Which framework would you pick for a new product, and why?Show the answer guide

    There is no answer they want and there is definitely an answer they don't want, which is a ranking. What is being tested is whether you can hold a preference without being religious about it.

    Decide out loud from constraints: what the team already knows and can hire for locally, whether the product needs to be indexed by search engines or is behind a login, how much of it is genuinely interactive versus mostly content, and what the rendering requirement is on a slow device. Then name your pick and, in the same breath, name what it costs you.

    The single strongest thing you can add: say what would change your mind. "If most of the team came from a different ecosystem I'd pick theirs, because a framework I like and nobody can review is worse than one I tolerate." That sentence is what a lead sounds like. And if you have only ever worked in one, say so — faking breadth is caught in one follow-up question.

    What to avoid

    Avoid "it depends" as a complete answer. It is technically correct and it tells them nothing. Depend on something, out loud, and then decide.

  4. You inherit a large codebase with no tests and a deadline. What's your first week?Show the answer guide

    Ship the deadline first, and say that plainly — an engineer who arrives and starts a refactor is a real hiring risk. Then: get the app running locally and write down every step that was undocumented, because that list is the highest-value thing you will produce in week one. Add tests only around what you are about to change, so the tests are load-bearing rather than decorative.

    Name the trap: the code that looks worst is usually the code that has survived contact with the most edge cases, and rewriting it is how you reintroduce five years of fixed bugs.

  5. How much of this did an assistant write, and how do you know it's correct?Show the answer guide

    Ask the policy before you start the exercise, not after. Employer positions on this differ sharply — some ask candidates not to use assistance at all during an assessment, some allow it in preparation but not in the room, some actively want to see how you use it. Nobody minds being asked; plenty of people mind finding out afterwards.

    When it is allowed, the thing being measured is not whether you used it. It is whether you can tell the difference between output that works and output that only looks like it works. So narrate the review, not the generation: which part you took as written, which part you rejected and why, what you tested about it, and where you checked the documentation because you weren't sure.

    The answer that fails is either extreme — pretending you write everything unaided in a job where nobody does any more, or handing over code you cannot defend line by line. Both are the same failure wearing different clothes: claiming ownership you can't back. So say what you don't delegate. Almost everyone who has thought about this has a line — the security-sensitive part, the thing that touches money, the code review itself — and naming yours is a strong answer.

The team questions

All levels

Frontend sits between design, backend and whoever owns the deadline, which is why these questions are asked more seriously here than the generic advice suggests. They are checking whether disagreements with you get resolved or escalated.

  1. Tell me about a bug you shipped.Show the answer guide

    Pick one that reached users and that you found or fixed. The instinct is to choose something small and safe; the small safe one is exactly the answer that sounds rehearsed.

    Weak

    There was a bug in a form once where validation wasn't working correctly. I identified the issue, fixed it quickly, and we added tests to make sure it wouldn't happen again. It taught me the importance of thorough testing.

    No system, no user, no cost, no number, and a moral at the end that restates what everyone already believes. It could be any bug in any codebase, which means it is evidence of nothing.

    Strong

    I changed a date field to send an ISO string and didn't notice the mobile app parsed it as local time. For about eleven hours, appointments booked after 9pm showed on the following day for anyone east of UTC. Support caught it, not us. I fixed the parse, backfilled the eighty-odd affected bookings by hand with the ops team, and then added a test that asserts the round trip across a timezone rather than just the format.

    The second one has a mechanism, a blast radius, a duration, an honest admission that a customer found it first, and a fix that addresses the class rather than the instance. It is also plainly a real memory — the detail about doing eighty by hand is the kind of thing nobody invents.

    Name the cost before you name the fix. Candidates who lead with the fix sound like they are managing you.

  2. Tell me about a code review that went badly.Show the answer guide

    Either side is fine, but the version where you were the reviewer is more revealing and fewer people tell it. What's being checked is whether you can separate a disagreement about code from a disagreement with a person.

    The useful shape: what the actual technical disagreement was, what you did when the comment thread passed about four replies, and what the resolution was. The correct move at four replies is a fifteen-minute call, and saying so is a small thing that reads as experience.

  3. How do you work with a designer who keeps changing things?Show the answer guide

    Do not answer this as a complaint, which is the trap it is set as. Answer it as a process question: when you get involved (before the design is final, not after), what you flag early (the states nobody drew — empty, loading, error, too-long text), and what you agree is frozen once build starts.

  4. What have you learned recently, and how?Show the answer guide

    Name one specific thing and what you built with it. A course you started counts for nothing; a small thing you finished counts for a lot, even if it is ugly.

Also asked, and worth a sentence each: what you'd change about your last team's process · how you keep up · a technical decision you now think was wrong · what you'd want in your first month here.

The closing conversation

The part most candidates waste. What you ask here is read as carefully as what you answered.

Questions to ask them

For this role the good questions are about how work reaches production, because that is what your day will actually consist of. Ask two or three.

  • How does a change get from my machine to a user — and how long does that take?
  • Who decides what gets built, and how does the frontend team find out?
  • Is there a design system, and who owns it?
  • What's the oldest part of the codebase, and who is afraid of it?
  • How much of the team's week goes to new work versus fixing?

Ask the last one. The answer is rarely rehearsed, and the gap between what they say and what the previous answers implied tells you more about the job than anything on the job ad.

The take-home

Reviewers are not scoring the feature. They open the repository and look for three things: whether the README tells them how to run it, whether the commits show a person thinking or a single dump, and whether you said what you left out.

So write the README — how to run it, what you'd do next with more time, and what you deliberately did not do. That last part converts every gap from an oversight into a decision. And on time limits: if it says four hours, spend four hours and say what four hours bought. Submissions that obviously took two days lose to honest ones more often than candidates expect.

Local notes

Offshore delivery — interviewing for a client you will never sit with

A large share of frontend hiring here is for delivery centres and offshore teams serving clients overseas — Egypt's ICT agency reports the sector hosting well over two hundred offshoring companies and more than two hundred and fifty delivery centres, with digital exports around USD 4.8 billion in 2025 and rising annually since 2022.

That changes the interview in three concrete ways. The whole loop is in English, including the parts that would be small talk anywhere else, and language fluency is genuinely being assessed even when nobody says so. You will be asked about overlap hours — how much of your day intersects the client's, and whether you have worked to a timezone before. And written communication is part of the technical assessment: on a distributed team the pull-request description and the standup note are the visible product, so a take-home with a thin README reads as a preview of how you will communicate for two years.

Long loops, long notice, and pay information up front

Longer loops, more stages, and a notice period measured in months rather than weeks — say yours accurately at the screen, because a three-month notice discovered at offer stage kills offers. Take-homes are more common than live algorithm exercises for this role, and are usually discussed in a follow-up conversation rather than scored in isolation.

On pay questions, what you are owed up front and what an employer may ask about your pay history both differ by market and have moved recently — so check the position where the employer sits before the screen rather than relying on a half-remembered rule. The universal screening guide sets it out properly, and the scope is narrower than it is usually described.

A half-day of sessions in one block

The federal labour statistics office projects around 106,100 annual openings for software developers, QA analysts and testers across the 2025–2035 decade, with a median wage of $135,980 in May 2025 — useful as a frame, but one bucket for a great many different jobs and not a frontend band.

The loop is the familiar one: recruiter screen, technical screen, then a half-day of several sessions in a block. The frontend-specific part is that one of those is usually building something small in a browser rather than solving a puzzle, and the debrief afterwards is worth more than the code.

The rule underneath all three: find out which market's interview you are actually in before you prepare for it. An engineer interviewing with an overseas client is in that client's loop conducted in English, and preparing for a local one is how a strong candidate gets surprised at stage two.

The two pages every job shares

This guide covers your field. These two cover the frame the questions are built on — the behavioural canon, and the screening call that decides who reaches an interview at all.

  • Behavioral interview questionsThe canon every profession shares: error, conflict, pressure, initiative, and where your limits are.www.atshiring.com/en/interview-questions/behavioral
  • Screening and first-round questionsThe recruiter call: introductions, the administrative gate, and where people lose money on salary.www.atshiring.com/en/interview-questions/screening

Before the interview

No resume yet?

Build an ATS-safe one, then come back to the questions.

Build a resume

Ordering note

Ordering here is editorial judgement, not measured frequency. No public dataset ranks interview questions for this role by how often they are asked, and the candidate-report archives that carry that kind of evidence for other roles on this site were not readable for engineering titles in this pass. So no question on this page carries a company attribution, and none pretends to: the sections are ordered by the shape of a normal loop, and within a section by what we judge decides the outcome.

Where the page states a regulation or a statistic, the source is named in the page's own data and the regulatory block carries the date a person checked it. Where it states a craft opinion — and there are several, deliberately — it is written as an opinion.

Sources

Everything consulted for this page, named in plain text.

  • MHRSD Ministerial Resolution 28889 (18/2/1442H, 5 October 2020) — ICT roles nationalisation, via a law-firm client alert
  • Saudi financial press report of the ICT Saudization commencement, dated 27 June 2021
  • Saudi expatriate work-permit skill classification (2025) — global-mobility alerts from two international advisory firms
  • US Bureau of Labor Statistics — Occupational Outlook Handbook, Software Developers, QA Analysts and Testers
  • Information Technology Industry Development Agency (ITIDA), Egypt — industry outlook
  • Our own job-board reading, 2026-09-03, recorded in docs/notes/interview-questions/roles-shortlist.md (row 8)