<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Wait, What?!]]></title><description><![CDATA[Wait, What?! is a technical publication by Muhammad Azlaan Zubair about software engineering, artificial intelligence, and research. I write about engineering better software, understanding modern AI, and learning through research.]]></description><link>https://blog.mdazlaanzubair.com</link><image><url>https://cdn.hashnode.com/uploads/logos/63a80bd9b1011ed9ec6d049c/78f87ba5-34ca-4646-a20c-cfa74bf7cc91.png</url><title>Wait, What?!</title><link>https://blog.mdazlaanzubair.com</link></image><generator>RSS for Node</generator><lastBuildDate>Wed, 29 Jul 2026 22:12:42 GMT</lastBuildDate><atom:link href="https://blog.mdazlaanzubair.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Designing a Connected Candidate-to-Hire Workflow]]></title><description><![CDATA[Disclosure: This case study is anonymized. Product branding, source code, production screenshots, employee and candidate information, internal architecture, commercial details, and performance metrics]]></description><link>https://blog.mdazlaanzubair.com/designing-a-connected-candidate-to-hire-workflow</link><guid isPermaLink="true">https://blog.mdazlaanzubair.com/designing-a-connected-candidate-to-hire-workflow</guid><category><![CDATA[Software Engineering]]></category><category><![CDATA[Frontend Development]]></category><category><![CDATA[React]]></category><category><![CDATA[Next.js]]></category><category><![CDATA[websockets]]></category><category><![CDATA[workflow]]></category><category><![CDATA[HRtech]]></category><category><![CDATA[HR software]]></category><category><![CDATA[Case Study]]></category><category><![CDATA[System Design]]></category><category><![CDATA[api integration]]></category><dc:creator><![CDATA[Muhammad Azlaan Zubair]]></dc:creator><pubDate>Tue, 28 Jul 2026 12:31:15 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/63a80bd9b1011ed9ec6d049c/7d0e8df6-f48c-45dd-9fbf-3050b2a46845.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Disclosure:</strong> This case study is anonymized. Product branding, source code, production screenshots, employee and candidate information, internal architecture, commercial details, and performance metrics have been excluded.</p>
<h2>Building the frontend experiences and integrations behind recruitment, evaluation, offers, and pre-boarding</h2>
<p><strong>Industry:</strong> Recruitment and workforce management</p>
<p><strong>Project type:</strong> Recruitment workflow and candidate-management platform</p>
<p><strong><mark class="bg-yellow-200 dark:bg-yellow-500/30">My contribution: </mark></strong> <mark class="bg-yellow-200 dark:bg-yellow-500/30">Frontend Developer (Integration &amp; Development)</mark></p>
<p><strong>Team:</strong></p>
<ul>
<li><p><a href="https://www.linkedin.com/in/shebaankalim/">Shebaan Kalim</a> - UI/UX Designer</p>
</li>
<li><p><a href="https://www.linkedin.com/in/musadiq-shariq-90b701230/">Musadiq Shariq</a> - Frontend Developer</p>
</li>
<li><p><a href="https://www.linkedin.com/in/mohammad-maheer/">Mohammad Maheer</a> - Backend Lead</p>
</li>
<li><p><a href="https://www.linkedin.com/in/noman-shahid-99a349204/">Noman Shahid</a> - Backend Developer</p>
</li>
</ul>
<hr />
<h2>Overview</h2>
<p>Recruitment rarely happens inside one form.</p>
<p>A candidate submits an application, recruiters review it, interviews are scheduled, interviewers provide evaluations, managers approve decisions, offers are prepared, and successful candidates move toward pre-boarding.</p>
<p>When those activities are spread across email, spreadsheets, calendars, document templates, and disconnected systems, both sides lose visibility.</p>
<p>Candidates may not know whether their application has been reviewed or whether the organization expects another action from them. Recruiters must reconstruct the current state by checking several tools and asking colleagues for updates.</p>
<p>Our team developed a web platform that brought these connected recruitment activities into a shared workflow.</p>
<p>My contribution focused on the frontend experiences used by candidates and HR teams. I developed dashboards and workflow screens, integrated backend APIs, supported application-status updates, contributed to resume-management features, and coordinated implementation details with the design and backend teams.</p>
<hr />
<h2>The real problem was fragmented state</h2>
<p>The obvious problem appeared to be tool fragmentation.</p>
<p>Recruiters might use one system for job postings, another for communication, calendars for interviews, documents for evaluations, and templates for offer letters.</p>
<p>The deeper problem was that no single place represented the complete state of a candidate.</p>
<p>A candidate could be:</p>
<ul>
<li><p>Newly applied.</p>
</li>
<li><p>Under review.</p>
</li>
<li><p>Shortlisted.</p>
</li>
<li><p>Awaiting an interview.</p>
</li>
<li><p>Interviewed but not yet evaluated.</p>
</li>
<li><p>Waiting for approval.</p>
</li>
<li><p>Selected for an offer.</p>
</li>
<li><p>Rejected.</p>
</li>
<li><p>Moving into pre-boarding.</p>
</li>
</ul>
<p>Each stage depended on actions performed by different people.</p>
<p>The platform therefore needed to answer two different sets of questions.</p>
<h3>What candidates needed to know</h3>
<ul>
<li><p>Was my application received?</p>
</li>
<li><p>Has its status changed?</p>
</li>
<li><p>Is an interview scheduled?</p>
</li>
<li><p>Does the organization need anything from me?</p>
</li>
<li><p>Can I update or reuse my profile and resume?</p>
</li>
<li><p>What happens next?</p>
</li>
</ul>
<h3>What HR teams needed to know</h3>
<ul>
<li><p>Which candidates require review?</p>
</li>
<li><p>Which interviews need scheduling?</p>
</li>
<li><p>Which interviewers have submitted feedback?</p>
</li>
<li><p>Which decisions are waiting for approval?</p>
</li>
<li><p>Which offers need preparation or review?</p>
</li>
<li><p>Which successful candidates are ready for the next stage?</p>
</li>
</ul>
<p>The engineering challenge was not simply displaying this information.</p>
<p>It was ensuring that both interfaces represented the same underlying recruitment process without exposing internal actions inappropriately or allowing the two views to contradict each other.</p>
<hr />
<img src="https://cdn.hashnode.com/uploads/covers/63a80bd9b1011ed9ec6d049c/fe0f0cd5-a7da-40e6-a91c-e49374e342c9.png" alt="Candidates and recruiters experienced different interfaces, but both depended on one consistent recruitment lifecycle." style="display:block;margin:0 auto" />

<hr />
<h2>My contribution</h2>
<p>I worked primarily on the frontend implementation and integration of the candidate and HR experiences.</p>
<p>My contribution included:</p>
<ul>
<li><p>Developing candidate-facing dashboard screens.</p>
</li>
<li><p>Developing HR and recruitment-management interfaces.</p>
</li>
<li><p>Integrating application, job, interview, evaluation, approval, and offer-related APIs.</p>
</li>
<li><p>Supporting application-status updates through WebSocket and REST-based interactions.</p>
</li>
<li><p>Presenting workflow progress and pending actions clearly to candidates.</p>
</li>
<li><p>Building interfaces for interview scheduling and interview evaluations.</p>
</li>
<li><p>Supporting approval workflows for recruitment decisions and offers.</p>
</li>
<li><p>Collaborating on resume creation, upload, and download experiences.</p>
</li>
<li><p>Handling loading, empty, successful, restricted, and recoverable error states.</p>
</li>
<li><p>Implementing responsive behaviour across supported screen sizes.</p>
</li>
<li><p>Coordinating frontend requirements with the product designer, backend engineers, and senior frontend engineer.</p>
</li>
</ul>
<p>I did not design or develop the entire platform independently.</p>
<p>The designer owned the intended product experience. Backend engineers implemented the services and domain rules behind recruitment operations. Frontend responsibilities were shared across the team. My work centred on implementing substantial parts of the user-facing workflows and connecting them to those supporting services.</p>
<hr />
<h2>Why separate tools were not a complete solution</h2>
<p>Using specialized tools for each recruitment activity can appear flexible.</p>
<p>A calendar handles interviews. A spreadsheet tracks applicants. Email manages communication. Documents record evaluations. Templates produce offers.</p>
<p>The weakness emerges at the boundaries.</p>
<p>An interview rescheduled in one system may not update the applicant tracker. An evaluation may exist but remain invisible to the person responsible for approval. A candidate may receive an offer while their application status still appears unchanged elsewhere.</p>
<p>The organization then depends on people manually keeping every tool synchronized.</p>
<table>
<thead>
<tr>
<th>Fragmented process</th>
<th>Connected workflow</th>
</tr>
</thead>
<tbody><tr>
<td>Candidate data entered repeatedly</td>
<td>One profile supports related activities</td>
</tr>
<tr>
<td>Status communicated manually</td>
<td>Workflow state can drive visible updates</td>
</tr>
<tr>
<td>Interviews managed separately</td>
<td>Scheduling remains associated with the application</td>
</tr>
<tr>
<td>Evaluations stored in documents</td>
<td>Scores and feedback remain connected to the candidate</td>
</tr>
<tr>
<td>Approvals handled through messages</td>
<td>Pending decisions appear inside the workflow</td>
</tr>
<tr>
<td>Offers prepared in isolation</td>
<td>Offer activity remains part of the hiring record</td>
</tr>
<tr>
<td>Candidates request updates</td>
<td>Relevant progress can be surfaced directly</td>
</tr>
</tbody></table>
<p>The platform’s value was therefore not that it replaced every specialized tool.</p>
<p>It created a shared workflow in which the relationship among those activities could be represented consistently.</p>
<hr />
<h2>Designing recruitment as a stateful workflow</h2>
<p>Recruitment is not a straight sequence in which every candidate advances through identical stages.</p>
<p>Candidates may be rejected early, returned for additional review, interviewed more than once, moved between openings, or left waiting while an approval is pending.</p>
<p>The frontend needed to represent these paths without making the experience appear unpredictable.</p>
<p>A representative lifecycle included:</p>
<ol>
<li><p>A candidate created or completed a profile.</p>
</li>
<li><p>The candidate submitted an application.</p>
</li>
<li><p>The HR team reviewed the application.</p>
</li>
<li><p>The candidate was shortlisted, rejected, or held for further consideration.</p>
</li>
<li><p>An interview was scheduled where appropriate.</p>
</li>
<li><p>Interviewers submitted evaluations.</p>
</li>
<li><p>A hiring decision moved through any required approval process.</p>
</li>
<li><p>An offer was prepared and presented.</p>
</li>
<li><p>An accepted candidate moved toward pre-boarding.</p>
</li>
</ol>
<p>Each transition affected available actions.</p>
<p>For example:</p>
<ul>
<li><p>An interview should not be evaluated before it occurs.</p>
</li>
<li><p>A candidate should not see confidential interviewer notes.</p>
</li>
<li><p>An offer should not appear as final while approval remains pending.</p>
</li>
<li><p>A rejected application should not continue displaying actions intended for active candidates.</p>
</li>
<li><p>A rescheduled interview should not remain visible as two unrelated active events.</p>
</li>
</ul>
<p>The interface therefore needed to understand not only what data existed, but what that data allowed each user to do next.</p>
<blockquote>
<p><strong>Engineering principle:</strong> A recruitment platform is a permission-aware state machine presented as a series of dashboards and forms.</p>
</blockquote>
<hr />
<img src="https://cdn.hashnode.com/uploads/covers/63a80bd9b1011ed9ec6d049c/93cdeca5-6e0f-4a66-8cc2-0a1f5756977f.png" alt="The workflow needed to support approvals, additional reviews, scheduling changes, rejection, and withdrawal—not only successful progression." style="display:block;margin:0 auto" />

<hr />
<h2>Keeping candidate and recruiter views consistent</h2>
<p>The candidate dashboard and HR dashboard served different purposes.</p>
<p>Candidates needed a clear, limited view of their own applications and required actions. HR users needed broader operational information for managing candidates, interviews, approvals, and offers.</p>
<p>Those experiences could not simply expose the same response objects with different styling.</p>
<p>The frontend needed to translate recruitment state according to the current user’s context.</p>
<p>For candidates, that meant presenting:</p>
<ul>
<li><p>Current application status.</p>
</li>
<li><p>Upcoming interviews.</p>
</li>
<li><p>Relevant requests or next steps.</p>
</li>
<li><p>Resume and profile information.</p>
</li>
<li><p>Appropriate offer or pre-boarding actions.</p>
</li>
</ul>
<p>For HR teams, it meant presenting:</p>
<ul>
<li><p>Candidate queues.</p>
</li>
<li><p>Job-specific application lists.</p>
</li>
<li><p>Interview schedules.</p>
</li>
<li><p>Pending evaluations.</p>
</li>
<li><p>Approval requirements.</p>
</li>
<li><p>Offer progress.</p>
</li>
<li><p>Records requiring follow-up.</p>
</li>
</ul>
<p>The challenge was preserving consistency without revealing internal information.</p>
<p>A candidate might need to know that a decision was still in progress. They did not necessarily need to know which manager had not yet approved it or what an interviewer had written.</p>
<p>This required the frontend to distinguish between shared workflow state and role-specific presentation.</p>
<hr />
<h2>Integrating live application-status updates</h2>
<p>Application status is one of the most visible parts of a recruitment product.</p>
<p>A stale status undermines the transparency the feature is supposed to provide. At the same time, the frontend cannot assume that every change occurs within the candidate’s current browser session.</p>
<p>Recruiters and other authorized users may update the application from a separate interface. Approval services may change the state later. Interview activity can also modify what the candidate should see.</p>
<p>The frontend used WebSocket and REST interactions to support updated workflow information.</p>
<p>That introduced several responsibilities:</p>
<ul>
<li><p>Listening for relevant state changes.</p>
</li>
<li><p>Updating the visible application without duplicating records.</p>
</li>
<li><p>Refreshing dependent information when necessary.</p>
</li>
<li><p>Handling reconnection or unavailable live updates.</p>
</li>
<li><p>Avoiding contradictory local and server states.</p>
</li>
<li><p>Providing a reasonable fallback when immediate updates were unavailable.</p>
</li>
<li><p>Preventing the interface from announcing changes that the user was not permitted to inspect.</p>
</li>
</ul>
<p>Real-time behaviour was therefore not simply a matter of receiving an event.</p>
<p>The interface still needed to determine what had changed, whether the current view depended on it, and how to present that change safely.</p>
<hr />
<img src="https://cdn.hashnode.com/uploads/covers/63a80bd9b1011ed9ec6d049c/73f1cd9d-29bf-4023-8463-018bb6dac1ff.png" alt="Status updates required server validation, asynchronous delivery, permission-aware presentation, and a fallback when live updates were unavailable." style="display:block;margin:0 auto" />

<hr />
<h2>Coordinating interviews, evaluations, and approvals</h2>
<p>Interview scheduling appears to be a calendar problem, but the calendar is only one part of the workflow.</p>
<p>A scheduled interview may depend on:</p>
<ul>
<li><p>The candidate’s current application stage.</p>
</li>
<li><p>Interviewer availability.</p>
</li>
<li><p>The interview round.</p>
</li>
<li><p>The position being considered.</p>
</li>
<li><p>Required evaluation criteria.</p>
</li>
<li><p>Whether previous feedback has been completed.</p>
</li>
<li><p>Which users can reschedule or cancel the meeting.</p>
</li>
</ul>
<p>After the interview, evaluations also need to return to the appropriate recruitment record.</p>
<p>The interface must distinguish between:</p>
<ul>
<li><p>An interview that is scheduled.</p>
</li>
<li><p>An interview that is awaiting completion.</p>
</li>
<li><p>An interview that was rescheduled.</p>
</li>
<li><p>A completed interview awaiting feedback.</p>
</li>
<li><p>Submitted feedback awaiting a decision.</p>
</li>
<li><p>A decision waiting for further approval.</p>
</li>
</ul>
<p>This is where several seemingly simple features become one coordinated system.</p>
<p>The frontend connected scheduling, evaluation, and decision states so that the current recruitment condition remained understandable across different screens.</p>
<hr />
<h2>Managing offer and approval workflows</h2>
<p>An offer letter is not only a downloadable document.</p>
<p>It can be the output of a controlled workflow involving compensation details, review, authorization, generation, delivery, acceptance, or rejection.</p>
<p>The interface needed to avoid presenting a draft or pending offer as finalized.</p>
<p>It also needed to make pending work visible to the appropriate HR users without exposing sensitive details to unauthorized users.</p>
<p>A representative offer process included:</p>
<ol>
<li><p>The hiring decision reached the offer stage.</p>
</li>
<li><p>Required information was entered or confirmed.</p>
</li>
<li><p>The offer moved through the appropriate approval workflow.</p>
</li>
<li><p>A document was generated or prepared.</p>
</li>
<li><p>The approved offer became available for delivery.</p>
</li>
<li><p>Candidate action was recorded.</p>
</li>
<li><p>The workflow either progressed toward pre-boarding or closed.</p>
</li>
</ol>
<p>The frontend’s responsibility was to represent that lifecycle accurately and limit actions according to the current state and user permissions.</p>
<hr />
<h2>Supporting candidate profile and resume management</h2>
<p>Candidate information often exists in several formats.</p>
<p>A candidate may complete structured profile fields, upload an existing resume, or use the platform to create and download a resume.</p>
<p>These options provide flexibility, but they also introduce data-consistency questions.</p>
<p>For example:</p>
<ul>
<li><p>Which information is displayed when the profile and uploaded resume differ?</p>
</li>
<li><p>Does updating the profile change an already submitted application?</p>
</li>
<li><p>Which version of the resume is attached to a particular application?</p>
</li>
<li><p>What happens if document generation fails?</p>
</li>
<li><p>Can a candidate download a resume without submitting an application?</p>
</li>
<li><p>Which file formats and sizes are accepted?</p>
</li>
<li><p>How should upload progress and errors be communicated?</p>
</li>
</ul>
<p>The interface needed to make those distinctions understandable rather than treating “resume” as one interchangeable file.</p>
<p>This was another example of frontend complexity coming from product rules rather than visual components.</p>
<hr />
<img src="https://cdn.hashnode.com/uploads/covers/63a80bd9b1011ed9ec6d049c/791aff6e-cfed-4906-aded-bf2e32544b94.png" alt="A conceptual view of the connected recruitment activities. It does not reproduce the production interface." style="display:block;margin:0 auto" />

<hr />
<h2>Outcome</h2>
<p>The project delivered connected frontend experiences for candidates and HR teams across a broader recruitment workflow.</p>
<p>The work supported:</p>
<ul>
<li><p>Job and application management.</p>
</li>
<li><p>Candidate dashboards and application visibility.</p>
</li>
<li><p>Interview scheduling.</p>
</li>
<li><p>Interview evaluations and scoring.</p>
</li>
<li><p>Hiring-decision and offer approvals.</p>
</li>
<li><p>Offer preparation and tracking.</p>
</li>
<li><p>Candidate profile and resume management.</p>
</li>
<li><p>Pre-boarding progression.</p>
</li>
<li><p>Status updates across candidate and administrative interfaces.</p>
</li>
</ul>
<p>From an engineering perspective, the implementation produced several qualitative outcomes.</p>
<h3>Better visibility for candidates</h3>
<p>Candidates could access relevant information about their application progress and upcoming actions without relying entirely on manual follow-up.</p>
<h3>A more connected HR workflow</h3>
<p>Recruitment activities could remain associated with the same candidate and job records rather than being managed as unrelated administrative tasks.</p>
<h3>More consistent workflow state</h3>
<p>Applications, interviews, evaluations, decisions, offers, and pre-boarding activities could be represented as parts of one lifecycle.</p>
<h3>Clearer coordination across roles</h3>
<p>Recruiters, interviewers, approvers, and candidates could receive interfaces and actions appropriate to their responsibilities.</p>
<h3>Reusable frontend patterns</h3>
<p>The project established patterns for role-aware dashboards, asynchronous updates, approval states, document workflows, and multi-stage operational processes.</p>
<p>These are qualitative implementation outcomes.</p>
<p>This case study does not claim measured improvements in hiring time, administrative hours, candidate satisfaction, offer acceptance, recruitment cost, or employee retention because supporting analytics and disclosure permission are not available.</p>
<hr />
<h2>Limitations</h2>
<p>The platform brought several recruitment activities into a connected workflow, but software alone does not make a hiring process transparent or fair.</p>
<p>Candidate experience still depends on:</p>
<ul>
<li><p>Whether recruiters update statuses promptly.</p>
</li>
<li><p>Whether evaluation criteria are clear and consistently applied.</p>
</li>
<li><p>Whether interviewers submit feedback on time.</p>
</li>
<li><p>Whether candidates receive useful communication.</p>
</li>
<li><p>Whether access controls protect sensitive information.</p>
</li>
<li><p>Whether the organization’s process itself avoids unnecessary stages and delays.</p>
</li>
</ul>
<p>A well-designed interface can make operational state visible.</p>
<p>It cannot compensate indefinitely for an unclear or poorly maintained recruitment process.</p>
<hr />
<h2>What I learned</h2>
<h3>1. Recruitment software serves two narratives</h3>
<p>Candidates experience uncertainty and progression. HR teams experience queues, decisions, and coordination. The product must support both without allowing them to contradict each other.</p>
<h3>2. Status labels are condensed business logic</h3>
<p>“Under review” may depend on assignments, evaluations, approvals, permissions, and server state. The label is simple; the system behind it is not.</p>
<h3>3. Real-time updates require a fallback</h3>
<p>Live events improve responsiveness, but the current server state remains authoritative. A dependable product still needs refresh and recovery behaviour.</p>
<h3>4. Approval workflows are permission systems</h3>
<p>An approval button represents more than a state change. It depends on role, sequence, current status, and whether the underlying record has changed.</p>
<h3>5. Candidate transparency needs deliberate boundaries</h3>
<p>Candidates should understand their progress without receiving confidential evaluations or internal decision details.</p>
<h3>6. Document generation is a workflow, not a download link</h3>
<p>Resume and offer-document features include data preparation, versioning, validation, processing, failure handling, and access control.</p>
<h3>7. Connected products need consistent empty states</h3>
<p>“No applicants yet,” “feedback pending,” “offer not created,” and “failed to load” may all produce empty space, but they describe completely different situations.</p>
<hr />
<h2>Closing reflection</h2>
<p>This project was broader than building a job board or a collection of HR dashboards.</p>
<p>The engineering challenge was to represent one recruitment process across candidates, recruiters, interviewers, and approvers while keeping the underlying state consistent.</p>
<p>My contribution focused on building and integrating those user-facing workflows: candidate and HR dashboards, application-status behaviour, interviews, evaluations, approvals, offers, resumes, and responsive interaction states.</p>
<p>The central lesson was that recruitment transparency does not come from displaying more information.</p>
<p>It comes from accurately translating a complex, role-dependent process into information and actions each participant can understand.</p>
<hr />
<h2>Engineering Takeaways</h2>
<ul>
<li><p>Model workflows as explicit states, not scattered UI logic.</p>
</li>
<li><p>Keep the backend as the source of truth for transitions and permissions.</p>
</li>
<li><p>Pair real-time updates with reliable fallback mechanisms.</p>
</li>
<li><p>Separate business state from presentation to keep systems maintainable.</p>
</li>
</ul>
<hr />
<h2>Portfolio callout</h2>
<p><strong>What I demonstrated</strong></p>
<p>Frontend development · API integration · WebSocket workflows · Role-aware interfaces · Recruitment state modelling · Approval workflows · Document experiences · Responsive UI · Cross-functional collaboration</p>
<hr />
<h2>Publication note</h2>
<p>All accompanying diagrams and interface illustrations must be labelled <strong>representative</strong> or <strong>conceptual</strong>. They must not be presented as production screenshots, exact architecture diagrams, customer analytics, or reproductions of the product’s proprietary workflow.</p>
]]></content:encoded></item><item><title><![CDATA[Frontend Is Easy… Until You Actually Build Something]]></title><description><![CDATA[Every frontend developer has heard some variation of these.

"It's just a screen."
"Backend does the real work."
"AI can generate that."
"Just use ShadCN."
"Just copy the component."
"It's just a chec]]></description><link>https://blog.mdazlaanzubair.com/frontend-is-easy-until-you-actually-build-something</link><guid isPermaLink="true">https://blog.mdazlaanzubair.com/frontend-is-easy-until-you-actually-build-something</guid><category><![CDATA[frontend]]></category><category><![CDATA[webdev]]></category><category><![CDATA[React]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[shadcn]]></category><category><![CDATA[AI]]></category><category><![CDATA[claude]]></category><dc:creator><![CDATA[Muhammad Azlaan Zubair]]></dc:creator><pubDate>Mon, 22 Jun 2026 16:26:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/63a80bd9b1011ed9ec6d049c/9784731c-e8ce-4311-b490-4b6425916bbf.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every frontend developer has heard some variation of these.</p>
<blockquote>
<p>"It's just a screen."</p>
<p>"Backend does the real work."</p>
<p>"AI can generate that."</p>
<p>"Just use ShadCN."</p>
<p>"Just copy the component."</p>
<p>"It's just a checkbox."</p>
</blockquote>
<p>And every frontend developer silently smiles because they know where this story is headed. Because somewhere, deep inside Jira, a "simple checkbox" is preparing to ruin someone's week.</p>
<hr />
<h1>The Great Myth: Frontend Being Easy</h1>
<p>People outside frontend often imagine our job like digital LEGO.</p>
<table>
<thead>
<tr>
<th>Problem</th>
<th>Solution</th>
</tr>
</thead>
<tbody><tr>
<td>Need a modal?</td>
<td>Copy one.</td>
</tr>
<tr>
<td>Need a button?</td>
<td>ShadCN has it.</td>
</tr>
<tr>
<td>Need a table?</td>
<td>AI can generate it.</td>
</tr>
<tr>
<td>Need a form?</td>
<td>There are 37 libraries for that.</td>
</tr>
</tbody></table>
<p>Everything looks simple. Until somebody says:</p>
<blockquote>
<p>"Can we add a checkbox?"</p>
</blockquote>
<p>And suddenly four days disappear from your life.</p>
<p>Ask me how I know.</p>
<hr />
<h1>The Story: It's Just a Checkbox</h1>
<img src="https://cdn.hashnode.com/uploads/covers/63a80bd9b1011ed9ec6d049c/747a148a-ed1f-4b24-a6da-864ad6e6069c.png" alt="" style="display:block;margin:0 auto" />

<p>At my previous company, we were building a project management platform for a large auditing firm.</p>
<p>One day our PM asked for a checkbox on a senior consultant's dashboard. PM said:</p>
<blockquote>
<p>It's just a checkbox. You can probably do it in two hours. In fact, I'm giving you the whole day so you can test it too.</p>
</blockquote>
<p>According to her, she was being generous.</p>
<p>Honestly, I thought the same.</p>
<blockquote>
<p>How hard could a checkbox be?</p>
</blockquote>
<p>My assumptions needed debugging.</p>
<hr />
<h2>Day 1: The Checkbox Doesn't Exist For Everyone</h2>
<p>Turns out the checkbox wasn't for every senior consultant.</p>
<p>It should only appear if:</p>
<ul>
<li><p>The project is from a certain type of client, OR</p>
</li>
<li><p>The project is from the clients having ARR above the given limit.</p>
</li>
<li><p>The project is active.</p>
</li>
<li><p>The project belongs to a specific category.</p>
</li>
<li><p>The consultant is actually responsible for that project.</p>
</li>
<li><p>And few other client and project related checks.</p>
</li>
</ul>
<p><em>Okay.</em></p>
<p>Not terrible.</p>
<p>Just some filtering and conditions.</p>
<p>Still sounds like a checkbox.</p>
<p>Right?</p>
<p>Wrong.</p>
<hr />
<h2>Day 2: Clicking It Doesn't Actually Do Anything</h2>
<p>Checking the box wasn't the real feature.</p>
<p>The checkbox created a request that needed approval from the consultant's senior manager.</p>
<p>Now we're talking about:</p>
<ul>
<li><p>New API endpoints.</p>
</li>
<li><p>New request states.</p>
</li>
<li><p>Approval workflows.</p>
</li>
<li><p>Error handling.</p>
</li>
<li><p>Loading states.</p>
</li>
<li><p>Notifications.</p>
</li>
</ul>
<p>Funny enough, the checkbox itself became the least interesting part.</p>
<hr />
<h2>Day 3: Management Doesn't Like Delays at Their End</h2>
<p>Then another requirement appeared.</p>
<p>Senior managers didn't want requests piling up when they weren't around.</p>
<p>So the checkbox should only be visible when the corresponding manager was currently using the application.</p>
<p>Wait… what?</p>
<p>Not online recently.</p>
<p>Not active today.</p>
<p>Actively connected.</p>
<p>At that moment.</p>
<p>Because if the manager wasn't available, consultants shouldn't create requests that would just sit there.</p>
<p>Which meant we needed real-time presence.</p>
<p>Not for chat.</p>
<p>Not for notifications.</p>
<p>For a checkbox.</p>
<p>Computers are fascinating and mildly offensive.</p>
<hr />
<h2>Day 4: Congratulations, You've Built a System</h2>
<p>By this point, we had:</p>
<ul>
<li><p>Modified database models.</p>
</li>
<li><p>Added new API contracts.</p>
</li>
<li><p>Introduced new frontend states.</p>
</li>
<li><p>Defined new data flows.</p>
</li>
<li><p>Added presence tracking.</p>
</li>
<li><p>Maintained socket connections.</p>
</li>
<li><p>Managed synchronization between users.</p>
</li>
<li><p>Tested edge cases.</p>
</li>
<li><p>Handled loading, errors, and race conditions.</p>
</li>
</ul>
<p>And somewhere in the middle of all that…</p>
<p>There was a checkbox.</p>
<p>Thirty hours later, the feature was done.</p>
<p>Not because drawing a checkbox takes thirty hours.</p>
<p>Because business rules do.</p>
<img src="https://cdn.hashnode.com/uploads/covers/63a80bd9b1011ed9ec6d049c/7c9ba836-b9d5-4b36-87c4-f5f64980ccfc.png" alt="" style="display:block;margin:0 auto" />

<h2>The Funny Thing About Frontend</h2>
<p>Frontend isn't difficult because buttons are hard. <strong>The complexity comes from translating human requirements into behavior.</strong></p>
<p>Every "simple" feature eventually turns into:</p>
<blockquote>
<p>"What if this happens?"</p>
<p>"What if they're offline?"</p>
<p>"What if two people click simultaneously?"</p>
<p>"What if permissions change?"</p>
<p>"What if the API is slow?"</p>
<p>"What if the socket disconnects?"</p>
<p>"What if this user shouldn't even see the button?"</p>
</blockquote>
<p>The UI is where all these questions become visible.</p>
<p>Backend systems have complexity.</p>
<p>No doubt.</p>
<p>But frontend has to absorb complexity coming from users, business rules, permissions, accessibility, responsiveness, loading states, and the beautiful chaos known as changing requirements.</p>
<p><strong>And unlike backend, everyone sees frontend. Which means everyone has opinions about it.</strong></p>
<p>Including people who think AI can replace it because it generated a pretty card component once.</p>
<hr />
<h1>Just Use ShadCN</h1>
<p>I love ShadCN. And use AI daily.</p>
<p>Component libraries are amazing. They remove boring work.</p>
<p>But they don't solve business problems.</p>
<p>ShadCN gives you a checkbox.</p>
<p>It doesn't tell you:</p>
<ul>
<li><p>Who should see it.</p>
</li>
<li><p>When it should disappear.</p>
</li>
<li><p>Which projects qualify.</p>
</li>
<li><p>How approvals flow.</p>
</li>
<li><p>How real-time presence works.</p>
</li>
<li><p>What happens when connections fail.</p>
</li>
<li><p>How state should synchronize.</p>
</li>
</ul>
<p>The hard part was never drawing the box. It was understanding what the box actually meant.</p>
<hr />
<h1>AI Can Generate Components. It Can't Generate Context.</h1>
<p>AI is fantastic at producing buttons, forms, and layouts.</p>
<p>But business logic lives inside <strong>conversations</strong>, <strong>assumptions</strong> and requirements nobody mentioned until <strong>Wednesday</strong> afternoon.</p>
<p>And every frontend developer knows this magical sentence:</p>
<blockquote>
<p>"Oh, one more thing…"</p>
</blockquote>
<p>Those four words have probably consumed more engineering hours than TypeScript errors.</p>
<hr />
<h1>Conclusion: Is Frontend Easy?</h1>
<p>Honestly?</p>
<blockquote>
<p>Yes.</p>
</blockquote>
<p>Right up until you actually build something. Then you realize frontend isn't about pixels. It's about translating human chaos into something people can click. And somehow making it feel simple.</p>
<p>Maybe that's why the best frontend work looks easy.</p>
<p>Not because it is.</p>
<p><strong>But because somebody spent four days making a checkbox feel like a checkbox.</strong></p>
<p>And honestly, that's the fun part.</p>
]]></content:encoded></item><item><title><![CDATA[Is Overthinking a Red Flag? We Put AI Reasoning to the Test.]]></title><description><![CDATA[More Thinking Doesn't Always Mean Better Answers
Reasoning models are designed to think step by step, and the common assumption is simple:

More thinking = better results.

I expected reasoning models]]></description><link>https://blog.mdazlaanzubair.com/is-overthinking-a-red-flag-we-put-ai-reasoning-to-the-test</link><guid isPermaLink="true">https://blog.mdazlaanzubair.com/is-overthinking-a-red-flag-we-put-ai-reasoning-to-the-test</guid><category><![CDATA[AI]]></category><category><![CDATA[llm]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[Prompt Engineering]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[Artificial Intelligence]]></category><category><![CDATA[openai]]></category><category><![CDATA[reasoning]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[research]]></category><dc:creator><![CDATA[Muhammad Azlaan Zubair]]></dc:creator><pubDate>Thu, 18 Jun 2026 19:07:19 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/63a80bd9b1011ed9ec6d049c/86e468b5-5f79-44e1-9b82-edc8a3965d5b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>More Thinking Doesn't Always Mean Better Answers</h2>
<p>Reasoning models are designed to think step by step, and the common assumption is simple:</p>
<blockquote>
<p>More thinking = better results.</p>
</blockquote>
<p>I expected reasoning models to dramatically outperform simpler ones.</p>
<p>Surprisingly, the improvements weren't always as large as expected.</p>
<p>Sometimes AI just spends more computation reaching nearly the same answer.</p>
<hr />
<h2>Bigger Brain, Bigger Bill</h2>
<p>Reasoning comes with costs:</p>
<ul>
<li><p>More tokens</p>
</li>
<li><p>More GPU time</p>
</li>
<li><p>More energy</p>
</li>
<li><p>Higher latency</p>
</li>
<li><p>Higher costs</p>
</li>
</ul>
<p>Like using a supercar for a five-minute grocery trip, extra power isn't always necessary.</p>
<hr />
<h2>The Real Question</h2>
<p>The important question isn't:</p>
<blockquote>
<p>"Can AI think harder?"</p>
</blockquote>
<p>It's:</p>
<blockquote>
<p>"Does thinking harder consistently produce better results?"</p>
</blockquote>
<p>The answer appears to be: <strong>not always.</strong></p>
<p>Just as humans can overthink, AI can sometimes add complexity without adding much value.</p>
<hr />
<h2>Complexity Has a Cost</h2>
<p>We often equate complexity with intelligence, but efficiency matters too.</p>
<p>More parameters and longer chains of reasoning don't automatically mean better outputs.</p>
<p>Sometimes effort is mistaken for effectiveness.</p>
<hr />
<img src="https://cdn.hashnode.com/uploads/covers/63a80bd9b1011ed9ec6d049c/393845d1-f712-44fa-b61e-13f49354e545.png" alt="" style="display:block;margin:0 auto" />

<hr />
<h2>There's an Environmental Cost Too</h2>
<p>Longer reasoning means more computation and more electricity.</p>
<p>At scale, millions of extra tokens translate into higher energy consumption and a larger carbon footprint.</p>
<p>Smarter AI should also aim to be more efficient.</p>
<hr />
<h2>Better Prompts Can Matter More</h2>
<p>Another surprise: clearer instructions often improve results significantly.</p>
<p>Not bigger models.</p>
<p>Not more reasoning.</p>
<p>Just better communication.</p>
<p>Sometimes asking better questions matters more than thinking longer.</p>
<hr />
<img src="https://cdn.hashnode.com/uploads/covers/63a80bd9b1011ed9ec6d049c/6407b96f-477e-4773-a569-3cce9b1f3a8f.png" alt="" style="display:block;margin:0 auto" />

<hr />
<h2>So, Is Overthinking a Red Flag?</h2>
<p>Not always.</p>
<p>Complex problems need deep reasoning.</p>
<p>But many tasks don't.</p>
<p>In some cases, answers produced in 5 seconds are nearly identical to those produced in 50.</p>
<p>The real goal may not be building AI that thinks harder, but AI that knows when to stop thinking.</p>
<p>And that might be the smarter approach.</p>
<h2>One More Thing 📚</h2>
<p>I originally wrote this post while working on a research paper about the same question.</p>
<p>If you're curious about the detailed experiments, results, and comparisons, you can find them in the paper. This post is more about the strange ideas, surprising observations, and "Wait, what?!" moments I ran into along the way.</p>
<blockquote>
<p><strong>Zubair, M. A., Bouchelligua, W., Danish, S., Ahmad, S., &amp; Ksibi, A. (2026).</strong> <em>Evaluating AI Reasoning and Prompt Engineering in Automated Test Case Generation: A Comparative Study of GPT-4o, O1 Models, and Human QA</em>. <strong>Applied Soft Computing, 201</strong>, 115708. <a href="https://doi.org/10.1016/j.asoc.2026.115708">https://doi.org/10.1016/j.asoc.2026.115708</a></p>
</blockquote>
<p>Apparently, "Wait… what?" is a valid research methodology.</p>
<p>And honestly, that's the fun part.</p>
]]></content:encoded></item></channel></rss>