📅 Friday, Oct 17, 2025
⏰ 00:00:00
🔄 Friday, Oct 17, 2025 00:00:00
📖 Reading time: 16 min
A post-mortem on how cognitive bias sabotaged my preparation, and the systematic approach I built to prevent it from happening again
I was excited about the opportunity. It checked all my boxes: fully remote position, contract work with competitive compensation, and genuine opportunities for growth. They sent me a technical challenge with a clear instruction right at the top:
“You are not required to code the full solution before the interview. Instead, prepare to walk through your design decisions and, if desired, share code snippets or pseudocode to illustrate critical parts.”
I had a long weekend to prepare. I’m a Senior Software Engineer with deep PHP and Laravel expertise. I’d helped multiple companies modernize legacy systems. This should have been straightforward.
So naturally, I completely missed the point and spent the entire weekend doing exactly what they told me not to do.
Monday, 12:45 PM. Fifteen minutes before the interview.
I stared at my screen, looking at the fully refactored Laravel 12 application I’d built, the comprehensive test suite I’d written, the elaborate service layer architecture I’d implemented. My heart sank as I finally, finally read the requirements properly:
Http::pool() for concurrent requests instead of designing an actual async solution.The interview was chaotic. I was just walking through each commit, like a guide pull request. I should have been going over my plan of what to do and not showing then what I did. I should have been explaining the architecture and presenting the trade-offs.
I knew within the first five minutes that I’d failed.
Here’s what hurt the most: I’m not a junior developer who doesn’t know better. I’ve mentored other developers. I’ve led technical decisions on production systems. I’ve given conference talks about software architecture. I recently helped a recent uni graduate do their own technical challenge and land their first job.
And yet, when faced with a clear set of instructions, I did the exact opposite of what they asked.
Why?
After the interview, I did what any engineer would do: I researched why this happened. Turns out, I wasn’t experiencing some unique personal failings. I was experiencing well-documented cognitive biases that affect everyone, especially technically skilled people.
My attention fixated on technical implementation, the comfortable, familiar territory where I feel competent, while filtering out the presentation requirements, which felt ambiguous and uncomfortable. Research shows that our perception is affected by our current train of thought, often causing us to focus on certain elements while ignoring others attentional-bias-decision-lab attentional-bias-frontiers. My brain literally filtered out the parts of the requirements that made me uncomfortable.
I prioritized tasks that felt urgent (getting the code working, making the refactoring “perfect”) over tasks that were actually important (diagrams, OAuth for external clients, presentation structure). Studies show that people tend to prioritize tasks they perceive as time-sensitive over tasks that provide objectively greater rewards, even when those urgent tasks aren’t the ones that matter most mere-urgency-effect eisenhower-matrix.
Coding gave me immediate satisfaction. Every commit felt like progress. Creating diagrams and analyzing requirements felt abstract and anxiety-inducing. My brain chose the dopamine hit of “look at all this code I wrote” over the uncomfortable work of strategic thinking.
The immediate reward of seeing working code outweighed the delayed reward of having a good presentation. I told myself, “I’ll do the diagrams later” knowing full well that “later” would never come.
Here’s the insidious part: I’m so skilled at coding that my brain defaults to it when faced with ambiguity. Coding is my hammer, and this problem looked like a nail. When experts face uncertainty, they retreat to what they know best, even when it’s not what’s needed.
The really painful part? While the Dunning-Kruger effect dunning-kruger describes how unskilled people overestimate their abilities, there’s a flip side; experts tend to underestimate their own abilities at unfamiliar tasks. I assumed “anyone can make a diagram” but “not everyone can refactor code this well.” So I overinvested in the wrong thing.
Looking back with clear eyes, here’s what a proper approach would have looked like:
Day 1 (2 hours):
Day 2-3 (8 hours):
Day 4 (3 hours):
Day 5 (1 hour):
Total time: ~14 hours spread across 5 days, with plenty of buffer.
Instead, I spent 20+ hours in a coding frenzy, finishing at midnight on Sunday, exhausted and with nothing presentable.
I’m sharing this publicly because I know I’m not the only one who does this. So I built a systematic framework based on requirements analysis, best practices and cognitive bias mitigation techniques. I call it the Requirements-First Framework, and it’s designed to interrupt the automatic patterns that lead us astray.
Time Box: 30-60 minutes When: Immediately upon receiving any task, before touching code Rule: You cannot start implementation until this phase is complete
Create a file called REQUIREMENTS.md in your project:
# Requirements Document
Date Created: [DATE]
Task: [NAME]
Review By: [DATE - set 24 hours before deadline]
## EXPLICIT REQUIREMENTS
(Things they explicitly said you must do)
### Submission Format
- [ ] Requirement 1
- [ ] Requirement 2
### Deliverables
- [ ] Deliverable 1
- [ ] Deliverable 2
### Technical Requirements
- [ ] Technical requirement 1
- [ ] Technical requirement 2
## EVALUATION CRITERIA
(How will they judge success?)
1. Criterion 1
2. Criterion 2
3. Criterion 3
## EXPLICITLY EXCLUDED
(Things they said NOT to do)
- ❌ NOT doing full implementation - they said "not required"
- ❌ NOT perfecting code - they're evaluating architecture thinking
## RED FLAGS TO AVOID
(Common mistakes for this type of task)
- ⚠️ Getting lost in implementation details
- ⚠️ Ignoring presentation requirements
- ⚠️ Focusing on impressive work that wasn't asked for
Go through the requirements and highlight these indicators:
Presentation Indicators:
Exclusion Indicators:
Evaluation Indicators:
Before starting any work:
Question 1: What is the PRIMARY outcome they want?
Question 2: If I only had 25% of the time, what would I focus on?
For my interview, my honest answers would have been:
That would have saved me.
Time Box: 1-2 hours Rule: Plan your presentation BEFORE writing code
Create your presentation outline first:
# Presentation Outline
## Opening (2 minutes)
- What I'll cover today
- My approach to the problem
## Section 1: Current State Critique (5 minutes)
- Diagram: Current architecture
- Problems identified (3-5 key issues)
## Section 2: Proposed Solution (8 minutes)
- Diagram: Proposed architecture
- Key improvements with rationale
- Code snippet examples (3-4 snippets max)
## Section 3: Trade-offs & Priorities (5 minutes)
- What I would do first (MVP)
- What I would do next (Phase 2)
- What I deliberately deprioritized (and why)
## Materials Needed
- [ ] Diagram 1: Current architecture
- [ ] Diagram 2: Proposed architecture
- [ ] Code snippet 1: [Description]
- [ ] Code snippet 2: [Description]
Why this works: If you plan your presentation first, you’ll only build what you need for the presentation. You literally cannot overengineer if you’ve already decided what you’re showing.
Create your diagram sketches before writing any code. Even rough boxes-and-arrows on paper. This forces architectural thinking before implementation.
Rule: Every task gets a time box. When time expires, you stop.
Create a time box matrix:
| Task | Time Box | Status |
|-------------------------------|----------|---------------|
| Requirements extraction | 1 hour | ✅ Done |
| Create presentation outline | 1 hour | ✅ Done |
| Create diagrams (draft) | 2 hours | ✅ Done |
| Prototype core pattern | 3 hours | 🔄 In Progress |
| Write tests | 2 hours | ⏳ Planned |
| Polish diagrams | 1 hour | ⏳ Planned |
| Practice presentation | 1 hour | ⏳ Planned |
| BUFFER | 2 hours | ⏳ Reserved |
Time box rules:
The Stopping Rule:
If you’re coding and losing track of time, STOP and ask:
If #3, stop immediately. Save and close the file.
Set calendar reminders to check against requirements.
Every day at the same time:
## Daily Check-In: [DATE]
### What I completed today:
- [Task 1]
- [Task 2]
### Against requirement checklist:
- ✅ Met requirement: [which one]
- ❌ Haven't addressed: [which one]
### Red flags check:
- Am I building something they said NOT to do? ❌ No
- Am I ignoring evaluation criteria? ❌ No
- Am I doing "impressive" work that wasn't asked for? ⚠️ YES - STOP
### Course correction needed?
[Yes/No + What to change]
48 hours before deadline, do a full review:
## 48-Hour Pre-Mortem
If I submitted what I have RIGHT NOW:
### Evaluation Criteria Scoring (1-10)
1. [Criterion 1]: [Score]/10 - Reasoning: [Why]
2. [Criterion 2]: [Score]/10 - Reasoning: [Why]
### What's Missing That's Required?
- [ ] Missing item 1 - Impact: HIGH
- [ ] Missing item 2 - Impact: MEDIUM
### What Did I Build That Wasn't Asked For?
- [Item 1] - Time spent: [X hours] - Could have spent on: [Y]
### Honest Assessment:
Would this pass? YES / NO / MAYBE
If NO or MAYBE, what's the ONE thing that would move it to YES?
This 48-hour check-in would have saved me. I would have seen:
Time Box: 1-2 hours When: 24 hours before delivery Rule: Do this even if it feels awkward
Practice your presentation out loud:
The “Explain to a Rubber Duck” Test:
Before the real presentation, explain your approach in one paragraph:
“The problem they gave me was [X]. The most important thing they’re evaluating is [Y]. My approach was [Z]. The key things I need to show are [A, B, C].”
If you can’t clearly articulate this, you’re not ready.
When you realize you’ve been focusing on the wrong thing:
1. STOP immediately. Close your IDE. Step away.
2. Emergency triage (15 minutes):
## Emergency Triage
TIME REMAINING: [X hours]
CURRENT STATE:
- What I've built: [description]
- What I'm missing: [description]
REQUIREMENTS REVIEW:
- What's actually required: [list]
- What I've met: [list]
- What I'm missing: [list]
SALVAGE PLAN:
- Can I repurpose what I built? [Yes/No + How]
- What must I create from scratch? [List]
- What can I skip entirely? [List]
3. Execute ruthlessly:
Beyond the process framework, here are mental tricks that help:
When you’re deep in work, ask:
“If a friend showed me this situation, what would I tell them?”
We’re much better at seeing other people’s mistakes than our own. This creates psychological distance and clarity.
Set a recurring reminder:
“Will Future Me (in the interview) be glad I spent time on this specific thing?”
If uncertain, the answer is probably “no.”
Keep a document: UNCOMFORTABLE_TRUTHS.md
## Things I Know But Don't Want to Admit
- [ ] I'm avoiding creating diagrams because I'm not confident
- [ ] I'm overengineering code because it feels safer than prep
- [ ] I haven't practiced presenting because it makes me anxious
## Action Plan
For each truth, what's the smallest step I can take TODAY?
Writing down what you’re avoiding makes it conscious, which makes it addressable.
If I follow this framework for my interview:
Phase 0 would have caught:
Phase 1 would have forced:
Phase 2 time boxes would have prevented:
Phase 3 check-ins would have revealed:
Phase 4 dry run would have shown:
The framework catches these issues BEFORE the interview, not moments before when it’s too late.
Don’t try to use the entire framework at once. Build the habit gradually:
Week 1: Just do Phase 0 (requirement extraction) for every task Week 2: Add daily check-ins Week 3: Add presentation-first planning Week 4: Add dry runs for presentations Week 5: Add time boxing Week 6: Full framework operational
By week 6, these practices become automatic.
Here’s your immediate action plan:
Right now, create a folder called interview-templates with these files:
REQUIREMENTS.md (empty template)TIME_BOX_MATRIX.md (empty template)DAILY_CHECKIN.md (empty template)PRESENTATION_OUTLINE.md (empty template)When you get your next challenge, copy this folder and fill it out.
Print this and put it somewhere visible:
□ I have created REQUIREMENTS.md
□ I have identified what they're evaluating
□ I have created a presentation outline
□ I have created time boxes for all tasks
□ I have set daily check-in reminders
□ I have scheduled a 48-hour warning
□ I have scheduled a dry run
□ I have identified what I'm NOT doing
ONLY PROCEED IF ALL BOXES ARE CHECKED
Reach out to someone you trust. Ask them:
“I’m working on breaking a bad habit where I over-engineer and miss requirements. Can you be my check-in person for my next interview prep? I just need you to ask me three questions at the midpoint: What was required? What did you build? Do they match?”
External accountability catches blind spots.
Here’s what I’ve learned:
I’ve mentored developers, led teams, modernised legacy systems, and given conference talks. And I still fell into this trap. That’s not despite my experience, it’s because of it.
The framework exists because willpower and experience aren’t enough. Our brains are wired to seek comfort, avoid ambiguity, and jump to implementation. Senior engineers need systems to counteract these tendencies precisely because we’re good enough to build the wrong thing very efficiently.
I’m publishing this post-mortem because:
This is common. You’re not alone if you’ve done this.
It’s not a character flaw. These are well-documented cognitive patterns that affect everyone, especially skilled people facing ambiguous tasks.
It’s fixable. Not through willpower, but through systems.
Someone needs to say it out loud. We all pretend we’re perfectly rational engineers who follow requirements. We’re not. We’re humans with biases, and we need frameworks to compensate.
The research shows that awareness alone doesn’t fix cognitive bias. But awareness plus systematic countermeasures does.
So here’s my systematic countermeasure, built from my failure, tested against the research, and ready for you to use.
If you want to understand more about the cognitive science behind this:
If you want templates and tools:
I failed that interview. That hurt. But failing taught me something valuable:
Being a good engineer isn’t enough. You also have to solve the right problem.
And sometimes the right problem isn’t technical at all. Sometimes it’s communication, presentation, and understanding what people actually need to see.
The Requirements-First Framework is my apology to Future Me, and my gift to anyone else who’s ever spent a weekend building the wrong thing because it felt right.
You’re not broken. Your brain is just being a brain.
Build systems that compensate, and you’ll be fine.
Have you experienced something similar? I’d love to hear your stories and what frameworks you’ve built to prevent it. Connect with me on LinkedIn or GitHub.