Mobile Developer Test Validity and Fairness: Avoiding Common Pitfalls
Validity vs fairness: What's the difference?
Validity: Does the assessment measure what you actually need the engineer to do?
Fairness: Do all candidates have an equal opportunity to show what they know?
You can have one without the other. An assessment can be valid but unfair. Or fair but invalid. Both are problems.
Validity: Measuring the job
The trap: Measuring trivia instead of judgment
"What's the difference between strong and weak references in Swift?" is a question with a factual answer. It's valid only if the job requires knowing that answer. For most teams, it doesn't. The engineer looks it up in 30 seconds.
Test for validity: Would you ask this question in code review?
If the answer is no, remove it from the assessment.
The better approach: Test under constraints
Instead of "What's a weak reference?", ask:
"Here's a view controller that holds a reference to a manager object. The manager holds a reference back to the view controller. Show me how you'd fix the retain cycle. Write code, don't explain."
This tests:
- Can they recognize the problem?
- Can they use the right tools (weak, unowned)?
- Can they write code that compiles?
- Do they think about memory?
All of these are real job skills.
iOS validity checklist
Does your assessment test:
- Reading and understanding existing code?
- State management decisions (ViewController vs ViewModel)?
- Lifecycle understanding (not just naming, but reasoning)?
- Network error handling and edge cases?
- Memory safety patterns (weak refs, unowned, etc.)?
- Testability and dependency injection?
If you're testing "name this method," you're failing validity.
Android validity checklist
Does your assessment test:
- Fragment and Activity lifecycle reasoning?
- ViewModel and Repository patterns?
- Coroutine usage and scope?
- Database integration (Room or similar)?
- Testing setup (Mockito, Espresso)?
- Handling configuration changes?
If you're testing "what's the exact method signature," you're failing validity.
React Native validity checklist
Does your assessment test:
- Component lifecycle and hooks?
- Navigation patterns (React Navigation, not web routing)?
- AsyncStorage and persistence?
- FlatList optimization?
- Bridge understanding and native module integration?
- Performance thinking (not web-like assumptions)?
If you're testing "which npm package does X," you're failing validity.
Fairness: Equal opportunity to show knowledge
The unfairness trap: Platform-specific gotchas
Example: "Write a function that capitalizes the first letter of a string in Swift."
Unfair version: Don't mention the API. Make them implement it manually.
- Seniors find this trivial
- Mid-level engineers might stumble
- Junior engineers will implement a loop
Fair version: "Capitalize the first letter. You can use built-in APIs."
The first version isn't testing judgment. It's testing API memorization. Different candidates memorize different APIs.
The platform knowledge fairness problem
Someone who's used iOS for 5 years vs 2 months will have different API knowledge. This is expected and fine. But the assessment should measure reasoning and learning, not API inventory.
Fair: "You need to handle background task completion. How would you approach this?"
Unfair: "Name the Swift function for background task completion without looking it up."
The fair version lets the candidate think. The unfair version is trivia.
Language-specific gotchas
For Java/Kotlin Android engineers:
- Don't penalize Kotlin if they use Java (or vice versa) unless you've explicitly required one
- The logic matters more than the language choice
For Swift/Objective-C iOS engineers:
- Objective-C is fading but still valid
- Modern Swift is the standard, but syntactic differences shouldn't kill them
For JavaScript React Native engineers:
- Class components vs functional components: both are valid
- Old patterns (callbacks, promises) vs new (async-await): old still works
The experience level fairness problem
A junior and a senior will both solve the same problem. But a fair assessment shows the junior's potential, not just their current knowledge.
Unfair: Time limit so tight the junior can't finish.
Fair: Time limit that lets candidates finish, then grades on quality/approach.
Unfair: Asking about advanced patterns only seniors know (never taught the junior).
Fair: Asking about core patterns everyone uses, with stretch goals for advanced thinking.
The timezone and language fairness problem
If the assessment is "live coding," consider:
- What time zone is the engineer in?
- Is English their first language?
- Do they have a quiet place to code?
An engineer from a different time zone performing poorly at 3 AM in their local time isn't a signal. It's unfair setup.
Solution: Offer flexibility on timing or use take-home assessments where possible.
Common validity failures
1. The take-home that's too open-ended
"Build an app." That's not an assessment, that's a rabbit hole. Different engineers will build it differently, making grading impossible.
Fix: Set specific requirements. Three screens, specific API, specific constraints.
2. The live coding question that's too narrow
"Implement a binary search tree." This tests competitive programming practice, not mobile development.
Fix: Use realistic problems. "Fix this bug in the pagination logic." "Optimize this FlatList."
3. The assessment that requires external knowledge
"We use Redux. Implement this feature with Redux." But the candidate has never used Redux.
Fix: Separate platform knowledge from job knowledge. If Redux is required, teach it or don't require it.
4. The assessment that requires specific tools
"Use Xcode." But the candidate uses AppCode or VS Code.
Fix: Let them use the tools they're comfortable with. The output matters, not the toolchain.
Common fairness failures
1. Gatekeeping on platform experience
"We only hire people with 2+ years of iOS experience." This filters by time spent, not competence. Some people learn in 6 months, others take 3 years.
Fix: Test what they can do now. If they're weak on a specific area, probe whether it's learnable (yes: hire and train; no: pass).
2. Penalizing different approaches
Candidate A solves the problem using a state machine. Candidate B solves it with a simpler approach. Both work.
Fix: Grade on the rubric (does it work, is it maintainable), not on aesthetic preference.
3. Hidden assumptions about environment
"The assessment assumes you have a Mac with Xcode." What about candidates on Linux? Windows?
Fix: If the assessment must be platform-specific (iOS development), acknowledge it and offer alternatives.
4. Time-based fairness
An assessment designed for 60 minutes but unrealistic in that time puts weak time managers at a disadvantage.
Fix: Give plenty of time (90 minutes for 60-minute work). Grade on what they did, not how fast.
Building and testing assessment fairness
Step 1: Have multiple reviewers grade
Give the same assessment to 5 candidates. Have 2 people grade each independently. If scores diverge wildly, the rubric is unclear.
Example divergence: Reviewer A gives 75/100. Reviewer B gives 55/100. This is a fairness problem. The rubric is too subjective.
Step 2: Check for demographic patterns
Over time, ask: Do certain groups consistently underperform?
- Do all iOS engineers from one background score lower?
- Do junior engineers from some backgrounds score lower than juniors from others?
If there's a pattern, investigate whether it's unfair assessment or actual skill gap. If unfair, fix the assessment.
Step 3: Validate against hiring outcomes
The ultimate fairness check: Did engineers who scored high actually succeed?
- If a demographic group scores high but then underperforms, the assessment is missing something
- If a demographic group scores low but performs great, the assessment is biased against them
Track this and adjust.
Step 4: Audit for hidden complexity
Re-read your assessment. Do you use idioms that aren't obvious? Ambiguous language? Jargon?
Example:
- "Implement a reactive model" is vague and jargon-filled
- "Fetch data and update the UI when data changes" is clear
Clear is fairer.
The platform-specific fairness matrix
| Aspect | iOS | Android | React Native |
|---|---|---|---|
| Core language knowledge | Swift modern syntax | Kotlin fundamentals | JavaScript ES6+ |
| Platform-specific gotcha | Lifecycle edge cases | Fragment lifecycle | Bridge limitations |
| Fair assumption level | Mid-level+ knows async-await | Mid-level+ knows coroutines | Mid-level+ knows hooks |
| Time estimate | 90 min for mid-level task | 90 min for mid-level task | 90 min for mid-level task |
Use this to set expectations. Don't assume knowledge not in this table.
Red flags in your assessment
- You have questions with no right answer (ambiguous)
- Different reviewers consistently disagree on grading
- A demographic group consistently underperforms
- Candidates report not understanding what you're asking
- You grade based on "did it match my solution" instead of "does it solve the problem"
- Time limit feels tight for anyone
- The problem is only solvable if you know a specific API
If any of these apply, fix it.
Transparency builds fairness
Tell candidates upfront:
- What you're testing (architecture, not API knowledge)
- What tools they can use
- How long it should take
- What the rubric is
- Whether they pass/fail and why
Transparency doesn't hurt strong candidates. It only helps weak ones understand what went wrong. That's fair.
Bringing it together: Assessment audit
Before you use an assessment with real candidates, answer:
- Validity: Would you ask this in code review? Does it measure the job?
- Fairness: Could candidates from different backgrounds all show what they know?
- Clarity: Is the prompt unambiguous?
- Rubric: Is grading objective or does it depend on reviewer preference?
- Outcome tracking: Can you measure if the assessment predicts success?
If you answer yes to all five, you have a good assessment.
This is how you build assessments that actually work for mobile developer hiring at scale.