<?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" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Huseyn Ashurlu on Medium]]></title>
        <description><![CDATA[Stories by Huseyn Ashurlu on Medium]]></description>
        <link>https://medium.com/@huseynashurlu?source=rss-564007cebaad------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*ihCQBvVFZv9J1k0KmW9tlA.png</url>
            <title>Stories by Huseyn Ashurlu on Medium</title>
            <link>https://medium.com/@huseynashurlu?source=rss-564007cebaad------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 04 Nov 2026 19:18:13 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@huseynashurlu/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[React Interview Questions That Sound Easy Until You Try to Answer Them]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://javascript.plainenglish.io/react-interview-questions-that-sound-easy-until-you-try-to-answer-them-55b851f8738c?source=rss-564007cebaad------2"><img src="https://cdn-images-1.medium.com/max/2226/1*CbMz9-98gWkdyn2Bcu4bfA.png" width="2226"></a></p><p class="medium-feed-snippet">The questions are simple. The answers are where engineering experience starts to matter.</p><p class="medium-feed-link"><a href="https://javascript.plainenglish.io/react-interview-questions-that-sound-easy-until-you-try-to-answer-them-55b851f8738c?source=rss-564007cebaad------2">Continue reading on JavaScript in Plain English »</a></p></div>]]></description>
            <link>https://javascript.plainenglish.io/react-interview-questions-that-sound-easy-until-you-try-to-answer-them-55b851f8738c?source=rss-564007cebaad------2</link>
            <guid isPermaLink="false">https://medium.com/p/55b851f8738c</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[front-end-development]]></category>
            <dc:creator><![CDATA[Huseyn Ashurlu]]></dc:creator>
            <pubDate>Wed, 04 Nov 2026 17:48:41 GMT</pubDate>
            <atom:updated>2026-11-04T17:48:41.642Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[The Frontend Works. So Why Does It Still Feel Slow?]]></title>
            <link>https://javascript.plainenglish.io/the-frontend-works-so-why-does-it-still-feel-slow-1e070f79ed89?source=rss-564007cebaad------2</link>
            <guid isPermaLink="false">https://medium.com/p/1e070f79ed89</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Huseyn Ashurlu]]></dc:creator>
            <pubDate>Mon, 02 Nov 2026 13:25:32 GMT</pubDate>
            <atom:updated>2026-11-02T13:25:32.504Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Everything looks fine in the code. The API is fast. There are no errors. But something still feels wrong.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uXotFnNlfkzvtGZp2HT-6Q.png" /></figure><p>Imagine you’re working on a trading dashboard.</p><p>Everything seems ready.</p><p>The charts are displaying correctly. Market prices are updating. The API responses are fast. Even the initial page load looks good.</p><p>You open the application and start testing.</p><p>You type a few letters into the instrument search field.</p><p>For a moment, nothing happens.</p><p>You keep typing.</p><p>The input suddenly catches up, and the results appear.</p><p>You try switching to another market.</p><p>Again, there’s a small delay.</p><p>Nothing is broken. There are no obvious errors.</p><p>But the application doesn’t feel right.</p><p>And that’s where an interesting frontend problem begins.</p><p><strong>The application works. It just doesn’t feel fast.</strong></p><h3>The API Wasn’t the Problem</h3><p>The first instinct might be to check the network requests.</p><p>Maybe the search endpoint is slow.</p><p>Maybe we’re fetching too much data.</p><p>Maybe something is wrong with the backend.</p><p>So we open Chrome DevTools and look at the Network tab.</p><p>The requests look fine.</p><p>Some responses arrive in around 100 milliseconds.</p><p>That’s not bad.</p><p>But if the backend is responding quickly, why does the interface still feel slow?</p><p>Because an API response is only one part of what happens between a user action and a visible update.</p><p>After receiving data, the browser might still need to process it, execute JavaScript, update components, calculate layout, and paint the result.</p><p>And all of that takes time.</p><p><strong>A fast API doesn’t guarantee a fast user experience.</strong></p><p>It’s a simple idea, but one that’s easy to forget when we’re focused on building features.</p><h3>What Was Actually Happening?</h3><p>Let’s return to our trading dashboard.</p><p>Imagine it has hundreds of instruments, live price updates, filtering, and pagination.</p><p>Every time a new price arrives, the application updates its state.</p><p>That’s expected.</p><p>But suppose those updates also cause a large part of the component tree to render again.</p><p>Now the browser is doing extra work continuously.</p><p>Meanwhile, the user is trying to type into the search field.</p><p>The input needs to respond to their keyboard events, but the main thread is busy processing other JavaScript work.</p><p>The result?</p><p>The search field feels delayed.</p><p>The important part is that none of the individual features is necessarily broken.</p><p>WebSocket updates work.</p><p>Search works.</p><p>Filtering works.</p><p>Pagination works.</p><p><strong>But the way they interact creates a performance problem.</strong></p><p>This is something I find particularly interesting about frontend engineering.</p><p>The biggest challenges often appear not when building individual features, but when those features start working together.</p><h3>The Temptation to Optimize Everything</h3><p>Once we notice unnecessary rendering, it’s tempting to start adding optimizations everywhere.</p><p>useMemo here.</p><p>useCallback there.</p><p>React.memo around every component.</p><p>Problem solved?</p><p>Not necessarily.</p><p>These tools can be useful, but they aren’t magic performance switches.</p><p>If a component receives constantly changing props, memoizing it might not help much.</p><p>If the application is processing a large dataset on every keystroke, wrapping a few functions in useCallback won&#39;t fix the expensive calculation.</p><p>And if we’re rendering hundreds of rows that the user can’t even see, we may need to rethink the rendering strategy itself.</p><p>I’ve learned to prefer a different question:</p><p><strong>What exactly is making this interaction slow?</strong></p><p>Not which optimization should we add.</p><p>Not which library should we install.</p><p>Just: where is the time going?</p><h3>Finding the Real Bottleneck</h3><p>For our example dashboard, I’d start with Chrome DevTools Performance and React DevTools Profiler.</p><p>I’d reproduce the delayed search interaction and inspect what happens.</p><p>Are there long JavaScript tasks blocking the main thread?</p><p>Are unrelated components rendering when the user types?</p><p>Is filtering the dataset expensive?</p><p>Are incoming market updates triggering more work than necessary?</p><p>The answers determine the solution.</p><p>If too many components subscribe to frequently changing data, we can make those subscriptions more targeted.</p><p>If filtering is expensive, we can avoid repeating unnecessary calculations or move sufficiently heavy work away from the main thread.</p><p>If the list contains hundreds of rendered elements, virtualization might help by rendering only what is needed near the visible area.</p><p>And if updates arrive faster than the screen needs to display them, we can consider controlling how often visual updates are applied, without losing important data.</p><p>Notice something?</p><p>We haven’t introduced a complicated architecture.</p><p>We’re simply trying to stop the application from doing work it doesn’t need to do.</p><p><strong>Sometimes the best optimization is doing less.</strong></p><h3>What About Performance Metrics?</h3><p>This is where metrics like Largest Contentful Paint (LCP) and Interaction to Next Paint (INP) become useful.</p><p>LCP helps us understand loading experience.</p><p>INP helps us understand how responsive a page is to interactions.</p><p>Both matter, but they answer different questions.</p><p>A page can have a good LCP while still having poor interaction responsiveness.</p><p>For example, a marketing page might load quickly, but clicking a navigation menu could feel delayed because the main thread is busy.</p><p>In my experience working on frontend performance, looking at these metrics together provides a much better picture than focusing only on loading speed.</p><p>But I wouldn’t rely on a single number.</p><p>I’d also use the application the way a real person would.</p><p>Type into the search field.</p><p>Open and close a modal.</p><p>Switch between tabs.</p><p>Scroll through a long list.</p><p>Because performance issues often become obvious when we stop looking at dashboards and start interacting with the actual product.</p><h3>Back to Our Trading Dashboard</h3><p>Remember the search field that felt slow?</p><p>Imagine we’ve profiled it and found that frequent price updates are causing unnecessary rendering across the dashboard.</p><p>We narrow the state subscriptions so components only receive the updates they need.</p><p>We make the instrument list more efficient.</p><p>We avoid recalculating filtered results when the relevant inputs haven’t changed.</p><p>Then we test again.</p><p>The user starts typing.</p><p>The input responds immediately.</p><p>Live prices continue updating.</p><p>Market switching feels smooth.</p><p>The application still does the same things it did before.</p><p>But now it feels different.</p><p>And that’s the part that matters.</p><p>We didn’t necessarily need faster servers or more powerful devices.</p><p>We needed a better understanding of what the frontend was doing.</p><h3>The Lesson I Keep Coming Back To</h3><p>As frontend engineers, it’s easy to focus on whether a feature works.</p><p>Does the API return the right data?</p><p>Does the button trigger the correct action?</p><p>Does the component render?</p><p>Those questions are important.</p><p>But there’s another question worth asking:</p><p><strong>Does the experience feel right to the person using it?</strong></p><p>Users don’t know how many React components we have.</p><p>They don’t care whether we used useMemo, virtualization, or some clever caching strategy.</p><p>They notice whether the interface responds when they need it.</p><p>And sometimes a tiny delay is enough to make an otherwise well-built application feel unreliable.</p><p>That’s why I believe good frontend engineering goes beyond writing working code.</p><p>It’s about understanding the entire experience, identifying what actually matters, and solving problems without adding unnecessary complexity.</p><p><strong>Because the frontend isn’t truly fast just because our metrics look good. It needs to feel fast to the people using it.</strong></p><p><em>Have you ever worked on an application where everything looked fast in DevTools, but the UI still felt slow? What turned out to be the problem?</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1e070f79ed89" width="1" height="1" alt=""><hr><p><a href="https://javascript.plainenglish.io/the-frontend-works-so-why-does-it-still-feel-slow-1e070f79ed89">The Frontend Works. So Why Does It Still Feel Slow?</a> was originally published in <a href="https://javascript.plainenglish.io">JavaScript in Plain English</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[7 Things Every Frontend Developer Should Know About System Design]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://javascript.plainenglish.io/7-things-every-frontend-developer-should-know-about-system-design-59dc8292e09c?source=rss-564007cebaad------2"><img src="https://cdn-images-1.medium.com/max/1982/1*K_7PLqFI_Af5KDdjekHCeQ.png" width="1982"></a></p><p class="medium-feed-snippet">What working on trading platforms, large-scale applications, and performance optimization taught me about frontend engineering.</p><p class="medium-feed-link"><a href="https://javascript.plainenglish.io/7-things-every-frontend-developer-should-know-about-system-design-59dc8292e09c?source=rss-564007cebaad------2">Continue reading on JavaScript in Plain English »</a></p></div>]]></description>
            <link>https://javascript.plainenglish.io/7-things-every-frontend-developer-should-know-about-system-design-59dc8292e09c?source=rss-564007cebaad------2</link>
            <guid isPermaLink="false">https://medium.com/p/59dc8292e09c</guid>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[design-systems]]></category>
            <dc:creator><![CDATA[Huseyn Ashurlu]]></dc:creator>
            <pubDate>Thu, 29 Oct 2026 13:47:20 GMT</pubDate>
            <atom:updated>2026-10-29T13:47:20.898Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[5 Advanced React Concepts Every Senior Frontend Engineer Should Know]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://javascript.plainenglish.io/5-advanced-react-concepts-every-senior-frontend-engineer-should-know-50bad6925ffb?source=rss-564007cebaad------2"><img src="https://cdn-images-1.medium.com/max/2246/1*ihAAl6cjXV72v4QoSaLUdg.png" width="2246"></a></p><p class="medium-feed-snippet">Practical lessons on rendering, state management, component design, and production reliability.</p><p class="medium-feed-link"><a href="https://javascript.plainenglish.io/5-advanced-react-concepts-every-senior-frontend-engineer-should-know-50bad6925ffb?source=rss-564007cebaad------2">Continue reading on JavaScript in Plain English »</a></p></div>]]></description>
            <link>https://javascript.plainenglish.io/5-advanced-react-concepts-every-senior-frontend-engineer-should-know-50bad6925ffb?source=rss-564007cebaad------2</link>
            <guid isPermaLink="false">https://medium.com/p/50bad6925ffb</guid>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[frontend]]></category>
            <dc:creator><![CDATA[Huseyn Ashurlu]]></dc:creator>
            <pubDate>Tue, 20 Oct 2026 20:00:24 GMT</pubDate>
            <atom:updated>2026-10-20T20:00:24.315Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[20 Senior Frontend Interview Questions With Real-World Answers]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://javascript.plainenglish.io/20-senior-frontend-interview-questions-with-real-world-answers-6d01d2036016?source=rss-564007cebaad------2"><img src="https://cdn-images-1.medium.com/max/2600/1*pcIjCQ8sQT3mDiEH5Vs_SQ.png" width="2646"></a></p><p class="medium-feed-snippet">JavaScript, React, performance, architecture, and system design &#x2014; explained with practical examples and lessons from production&#x2026;</p><p class="medium-feed-link"><a href="https://javascript.plainenglish.io/20-senior-frontend-interview-questions-with-real-world-answers-6d01d2036016?source=rss-564007cebaad------2">Continue reading on JavaScript in Plain English »</a></p></div>]]></description>
            <link>https://javascript.plainenglish.io/20-senior-frontend-interview-questions-with-real-world-answers-6d01d2036016?source=rss-564007cebaad------2</link>
            <guid isPermaLink="false">https://medium.com/p/6d01d2036016</guid>
            <category><![CDATA[frontend-development]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[interview]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Huseyn Ashurlu]]></dc:creator>
            <pubDate>Sat, 17 Oct 2026 14:51:30 GMT</pubDate>
            <atom:updated>2026-10-17T14:51:30.853Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[The Real Cost of overusing useMemo and useCallback in React]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://javascript.plainenglish.io/the-real-cost-of-overusing-usememo-and-usecallback-in-react-383ccdb39a50?source=rss-564007cebaad------2"><img src="https://cdn-images-1.medium.com/max/2296/1*KaUqI0_CPREjFKpzl5SM1A.png" width="2296"></a></p><p class="medium-feed-snippet">Why more memoization doesn&#x2019;t automatically mean better performance &#x2014; and what a large React migration reminded me about optimization.</p><p class="medium-feed-link"><a href="https://javascript.plainenglish.io/the-real-cost-of-overusing-usememo-and-usecallback-in-react-383ccdb39a50?source=rss-564007cebaad------2">Continue reading on JavaScript in Plain English »</a></p></div>]]></description>
            <link>https://javascript.plainenglish.io/the-real-cost-of-overusing-usememo-and-usecallback-in-react-383ccdb39a50?source=rss-564007cebaad------2</link>
            <guid isPermaLink="false">https://medium.com/p/383ccdb39a50</guid>
            <category><![CDATA[react]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Huseyn Ashurlu]]></dc:creator>
            <pubDate>Thu, 08 Oct 2026 12:12:37 GMT</pubDate>
            <atom:updated>2026-10-21T09:51:52.545Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Why Most Frontend Developers Never Become Senior]]></title>
            <link>https://blog.stackademic.com/why-most-frontend-developers-never-become-senior-ca271d8ec90c?source=rss-564007cebaad------2</link>
            <guid isPermaLink="false">https://medium.com/p/ca271d8ec90c</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[Huseyn Ashurlu]]></dc:creator>
            <pubDate>Thu, 30 Jul 2026 11:02:13 GMT</pubDate>
            <atom:updated>2026-08-07T06:57:27.783Z</atom:updated>
            <content:encoded><![CDATA[<p>The real gap is not React knowledge. It is judgment, ownership, and the ability to see problems before they reach production.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*e-aGRBYv0Ts3M2QQnJujlw.png" /></figure><p>Most frontend developers do not get stuck because they stop learning.</p><p>They get stuck because they keep improving the same skills that helped them earlier in their careers.</p><p>They learn another framework feature. They write cleaner components. They become faster at turning designs into working interfaces. They understand state management better, improve their TypeScript, and get more comfortable integrating APIs.</p><p>All of that matters.</p><p>But eventually, the job changes.</p><p>The skills that move someone from junior to mid-level are not always the same skills that move someone from mid-level to senior.</p><p>Early in your career, the main question is:</p><blockquote>Can you build this?</blockquote><p>Later, the more important questions become:</p><blockquote><em>Should we build it this way?</em></blockquote><blockquote><em>What could fail?</em></blockquote><blockquote><em>What will this decision cost the team six months from now?</em></blockquote><p>A lot of developers never fully make that transition.</p><p>They become very good at implementation, but they continue treating every task as an implementation problem.</p><p>That is where the plateau begins.</p><h3>The Role Changes Without Warning</h3><p>Nobody sends you a message saying:</p><blockquote><em>You are experienced now. From today, writing code is no longer the main part of your job.</em></blockquote><p>The change happens gradually.</p><p>At first, progress is easy to recognize.</p><p>You build your first reusable component.</p><p>You fix a difficult bug.</p><p>You integrate an API without help.</p><p>You understand why a React component is re-rendering.</p><p>You learn how authentication works.</p><p>You become faster, more independent, and more confident.</p><p>Then the feedback becomes less obvious.</p><p>You may still complete your tickets. Your code may work. Your pull requests may be approved.</p><p>But you are no longer being evaluated only on whether you can finish the task.</p><p>People begin paying attention to different things:</p><ul><li>Did you identify risks before implementation?</li><li>Did you ask the right questions?</li><li>Did you understand the wider system?</li><li>Did you consider failure states?</li><li>Did your solution make future work easier or harder?</li><li>Could the team trust you to own the feature after release?</li></ul><p>This is where some developers become confused.</p><p>They are still improving technically, but they are not progressing professionally at the same speed.</p><p>The problem is not necessarily a lack of effort.</p><p>They are simply optimizing for the wrong version of the job.</p><h3>Being Fast Is Not the Same as Being Senior</h3><p>A developer can be extremely fast and still create expensive problems.</p><p>They can build a feature in two days that takes the team two weeks to stabilize.</p><p>They can produce a clean abstraction that nobody else understands.</p><p>They can reduce the number of lines in a component while making the business flow harder to follow.</p><p>They can finish every ticket assigned to them without noticing that the requirement itself is incomplete.</p><p>Speed is useful, but seniority is not measured by how quickly someone can move a Jira ticket to Done.</p><p>A senior engineer thinks beyond the ticket.</p><p>They want to understand why the feature exists, how it fits into the product, which systems it depends on, and what will happen when one of those dependencies fails.</p><p>Sometimes the fastest implementation is the wrong implementation.</p><p>Sometimes the best solution is to simplify the requirement.</p><p>Sometimes the team does not need another abstraction.</p><p>Sometimes the frontend should not solve a problem that belongs in the API.</p><p>And sometimes the most valuable contribution is saying:</p><blockquote>We should not build this yet because we do not understand the failure path.</blockquote><p>Knowing how to build something is a technical skill.</p><p>Knowing when not to build it is engineering judgment.</p><h3>Senior Engineers Start Before the Editor Opens</h3><p>One of the biggest differences between experienced engineers and everyone else is where they begin.</p><p>A less experienced developer often starts with the implementation.</p><p>They open the project, find the relevant component, and begin writing code.</p><p>A senior engineer is more likely to pause first.</p><p>They may inspect the existing flow.</p><p>They may check the API response.</p><p>They may look at how similar features were implemented.</p><p>They may ask whether the requirement covers all user states.</p><p>They may question how the feature will behave for users with old data, expired sessions, slow devices, or limited permissions.</p><p>This can look slower from the outside.</p><p>It usually saves time later.</p><p>A wrong decision found during a discussion may cost fifteen minutes.</p><p>The same decision found after release may cost a rollback, an incident, several meetings, and days of debugging.</p><p>Senior engineers are not trying to avoid writing code.</p><p>They are trying to avoid writing the wrong code.</p><h3>The Happy Path Is Only the Beginning</h3><p>One of the clearest signs of engineering maturity is how someone thinks about failure.</p><p>Consider a payment flow.</p><p>The happy path is simple:</p><ol><li>The user enters payment details.</li><li>The frontend submits the request.</li><li>The payment succeeds.</li><li>The user sees a confirmation screen.</li></ol><p>That is the version we usually build first.</p><p>But real systems do not live only on the happy path.</p><p>What happens when the user clicks the payment button twice?</p><p>What happens when the request times out?</p><p>What happens when the payment succeeds, but the frontend does not receive the response?</p><p>What happens when the token expires halfway through the process?</p><p>What happens when the user refreshes the page while the payment is still processing?</p><p>What happens when the API returns a status the frontend does not recognize?</p><p>What happens when the application shows an error, but the customer has already been charged?</p><p>These are not imaginary edge cases.</p><p>They are the actual product.</p><p>The happy path proves that the feature can work.</p><p>The failure states determine whether it is safe to use.</p><p>Mid-level developers often treat loading, error, retry, timeout, unauthorized, empty, and partial-success states as additional work.</p><p>Senior engineers treat them as part of the original requirement.</p><p>That difference matters because production is not a cleaner or larger version of local development.</p><p>It is a completely different environment.</p><p>It includes unstable networks, slower devices, repeated actions, stale sessions, unexpected data, concurrent requests, browser interruptions, and users who do things the team never predicted.</p><p>A feature is not finished when the ideal sequence works.</p><p>It is finished when the team understands what happens when that sequence breaks.</p><h3>Seniority Becomes Visible During Debugging</h3><p>Local bugs are often straightforward.</p><p>You reproduce the issue, inspect the component, find the incorrect state update, fix it, and move on.</p><p>Production bugs are rarely that polite.</p><p>The error may depend on a specific account state.</p><p>The issue may only happen on a slower device.</p><p>Two requests may arrive in a different order.</p><p>A token may expire between related calls.</p><p>The backend may successfully complete an operation while the frontend displays an error.</p><p>The user may have the same application open in several tabs.</p><p>A senior engineer does not only ask:</p><blockquote>Which line of code failed?</blockquote><p>They also ask:</p><ul><li>What sequence of events created this state?</li><li>Which system was the source of truth?</li><li>What did the user see?</li><li>Which requests were sent?</li><li>In what order did the responses arrive?</li><li>Was the operation safe to retry?</li><li>Did the system log enough information to explain what happened?</li><li>Is this an isolated bug, or a symptom of a weak design?</li></ul><p>This is where deeper engineering knowledge becomes important.</p><p>Not only React knowledge.</p><p>You need to understand networking, APIs, authentication, browser behavior, caching, asynchronous flows, backend state, monitoring, and the business process behind the screen.</p><p>The frontend is not an isolated layer.</p><p>It is the part of the system where many failures become visible to the user.</p><h3>Code Review Is More Than Checking Syntax</h3><p>A lot of teams use code review as a final approval step.</p><p>The comments focus on names, formatting, small refactors, or whether a helper function should be moved into another file.</p><p>Those comments can be useful, but they are not the most valuable part of review.</p><p>A strong review asks questions such as:</p><ul><li>Is this state duplicated?</li><li>Does this abstraction solve a real repeated problem?</li><li>What happens when the request fails?</li><li>Is the frontend hiding a backend issue?</li><li>Could this change affect another user flow?</li><li>Will this design still make sense when the next requirement arrives?</li><li>Are we introducing temporary logic without a plan to remove it?</li><li>Can someone unfamiliar with the feature understand the business behavior?</li></ul><p>The goal of code review is not only to improve the current code.</p><p>It is to prevent a local decision from becoming a system-wide problem.</p><p>A codebase can have consistent formatting, excellent naming, and a large test suite while still being difficult to maintain.</p><p>Clean code is valuable.</p><p>But clean code built on the wrong decision is still the wrong code.</p><h3>Framework Knowledge Has a Ceiling</h3><p>Frontend development changes quickly, so it is easy to believe that seniority comes from knowing more technology.</p><p>Learn React internals.</p><p>Master TypeScript.</p><p>Understand Server Components.</p><p>Study rendering behavior.</p><p>Try another state-management library.</p><p>Learn a new meta-framework.</p><p>Improve your knowledge of performance.</p><p>This technical depth is important. A senior frontend engineer should understand the platform and the tools they use.</p><p>But framework knowledge alone does not create seniority.</p><p>There are developers with deep React knowledge who remain mid-level for years.</p><p>The reason is simple: they still approach every problem as a coding task.</p><p><strong>They ask:</strong></p><blockquote>How do I implement this?</blockquote><p><strong>A senior engineer also asks:</strong></p><blockquote>Why does the system need this?</blockquote><blockquote><em>What assumptions are we making?</em></blockquote><blockquote><em>What becomes harder after we add it?</em></blockquote><blockquote><em>Who owns this after release?</em></blockquote><blockquote><em>How will we detect when it stops working?</em></blockquote><p>These questions are not specific to React, Vue, Angular, or any other framework.</p><p>They are questions about reliability, maintainability, ownership, product impact, and long-term cost.</p><p>Tutorials can teach you how to use a tool.</p><p>They rarely teach you how to live with the consequences of your decisions.</p><h3>Ownership Changes the Way You Work</h3><p>One of the fastest ways to grow is to own something beyond the pull request.</p><p>Not only the component.</p><p>Not only the frontend task.</p><p>The outcome.</p><p>That means understanding the requirement, reviewing dependencies, considering failure states, coordinating with other teams, releasing the feature, monitoring it, and helping investigate problems afterward.</p><p>Ownership changes your thinking because you cannot separate implementation from consequences.</p><p>When you know you may have to support the feature in production, you ask better questions before writing it.</p><p>When you investigate an incident caused by a shortcut, you become more careful with the next shortcut.</p><p>When you maintain a component you created one year earlier, you learn whether your abstraction was actually useful.</p><p>When you explain why a “small feature” took three weeks, you learn to identify hidden complexity sooner.</p><p>Experience is not only the number of years you have worked.</p><p>It is the number of consequences you have taken responsibility for.</p><h3>Communication Is Part of Engineering</h3><p>Some developers believe that communication becomes important only when they become team leads or managers.</p><p>It becomes important much earlier.</p><p>A senior engineer must be able to explain:</p><ul><li>why a seemingly simple solution is risky;</li><li>why a task requires more time than expected;</li><li>why a requirement needs clarification;</li><li>why a technical shortcut may create product problems;</li><li>why the team should simplify instead of adding more code;</li><li>which trade-off they are making and what it costs.</li></ul><p>Good communication is not about speaking more in meetings.</p><p>It is about making complexity understandable.</p><p>A technically correct idea that nobody understands is difficult to support.</p><p>A risk that stays inside one developer’s head cannot help the team.</p><p>A senior engineer turns technical uncertainty into a discussion the team can act on.</p><p>That is part of the job.</p><h3>How to Close the Gap</h3><p>You do not need to wait for a senior title before working this way.</p><p>Start by changing the questions you ask.</p><p>Before building a feature, ask what assumptions it depends on.</p><p>Before adding new state, ask where the current source of truth is.</p><p>Before creating an abstraction, ask whether the repeated problem actually exists yet.</p><p>Before merging a workaround, ask whether there is a plan to remove it.</p><p>Before calling the feature complete, test slow networks, failed requests, missing data, repeated clicks, expired sessions, and unexpected responses.</p><p>Read code outside your current task.</p><p>Follow a user action from the interface to the API and back.</p><p>Learn what the backend changes when the operation succeeds.</p><p>Look at logs and monitoring data.</p><p>Read incident reports.</p><p>Ask why an existing system was designed in a particular way before replacing it.</p><p>During code review, focus on decisions, not only style.</p><p>Volunteer for work that includes uncertainty, coordination, and responsibility after release.</p><p>And stop measuring your growth only by the amount of code you produce.</p><p>A better measure is:</p><ul><li>How many problems did you prevent?</li><li>How much complexity did you remove?</li><li>How reliable was the result?</li><li>Did your decision make the next developer’s job easier?</li><li>Could the team trust you to own the outcome?</li></ul><h3>Final Thoughts</h3><p>The move from mid-level to senior is not mainly about writing more advanced code.</p><p>It is a shift in attention.</p><p>You stop thinking only about whether the feature works today.</p><p>You start thinking about whether it will remain reliable, understandable, and maintainable after the original implementation is forgotten.</p><p>You stop treating failure states as optional details.</p><p>You stop seeing planning, investigation, documentation, and code review as time taken away from development.</p><p>You understand that they are part of development.</p><p>Senior engineers are not simply developers with more years of experience.</p><p>They are developers who learned that every technical decision has a long-term cost — and started optimizing for that instead of only producing more code.</p><p>Sometimes the most valuable engineering decision is not choosing what to build next.</p><p>It is recognizing what should not be built at all.</p><p><strong>What do you think is the biggest mindset shift between a mid-level and a senior frontend engineer?</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ca271d8ec90c" width="1" height="1" alt=""><hr><p><a href="https://blog.stackademic.com/why-most-frontend-developers-never-become-senior-ca271d8ec90c">Why Most Frontend Developers Never Become Senior</a> was originally published in <a href="https://blog.stackademic.com">Stackademic</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[10 Mistakes I See Junior Frontend Developers Make]]></title>
            <link>https://medium.com/@huseynashurlu/10-mistakes-i-see-junior-frontend-developers-make-b37608dc04e0?source=rss-564007cebaad------2</link>
            <guid isPermaLink="false">https://medium.com/p/b37608dc04e0</guid>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Huseyn Ashurlu]]></dc:creator>
            <pubDate>Fri, 24 Jul 2026 07:55:47 GMT</pubDate>
            <atom:updated>2026-07-24T08:06:43.396Z</atom:updated>
            <content:encoded><![CDATA[<p>Patterns I’ve seen repeatedly after mentoring 500+ students — and what junior developers should do instead.*</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yMF0uiwQwT3_G9qBsHbkqg.png" /></figure><p>After mentoring more than 500 students and reviewing many junior frontend projects, I kept seeing the same mistakes appear again and again.</p><p>Most of them are not caused by a lack of intelligence or motivation.</p><p>They happen because beginners are often taught how to make an application work, but not how to think like an engineer.</p><p><strong>Tutorials optimize for:</strong></p><p><em>&gt; “It runs.”</em></p><p><strong>Real engineering asks:</strong></p><p><em>&gt; “Will it still work when the data, users, and requirements change?”</em></p><p>Here are the 10 mistakes I see junior frontend developers make most often.</p><h3>1. Learning Frameworks Before JavaScript</h3><p>Many juniors move to React before they are comfortable with JavaScript itself.</p><p>They can create a component, use hooks, and display data from an API, but they struggle to explain concepts such as:</p><p>- Closures<br>- Asynchronous behavior<br>- Object references<br>- Mutation<br>- Array methods<br>- Scope<br>- Why state sometimes appears stale</p><p>This creates a fragile kind of knowledge.</p><p>The developer can follow familiar React patterns, but the moment something behaves unexpectedly, they do not know where to start.</p><p>And in many cases, the unexpected behavior is not caused by React.</p><p>It is caused by a JavaScript concept they never fully understood.</p><p>React becomes much easier when you understand the language underneath it.</p><p>Do not rush through JavaScript just to reach a framework faster.</p><p>Learn the language deeply enough that you can explain what your code is doing — not only confirm that it works.</p><h3>2. Copying Code Without Understanding It</h3><p>Stack Overflow, tutorials, documentation, and AI tools make it easy to find working code within seconds.</p><p>That is useful.</p><p>The problem begins when developers copy a solution without understanding why it works.</p><p>It solves the immediate issue, so it feels productive.</p><p>But the cost appears later.</p><p>The code breaks in a slightly different situation.</p><p>The requirements change.</p><p>The developer needs to extend the feature.</p><p>Suddenly, the copied solution becomes difficult to modify because there is no mental model behind it.</p><p>The developer copied an answer, but not the method used to find the answer.</p><p>Before adding unfamiliar code to your project, read it line by line.</p><p>Ask:</p><p>- What does each part do?<br>- What problem is it solving?<br>- What would happen if I removed this line?<br>- Does this solution fit my application?<br>- Are there any security, performance, or maintenance risks?</p><p>Using existing solutions is normal.</p><p>Using code you cannot explain is dangerous.</p><h3>3. Building Only Tutorial Projects</h3><p>To-do lists, weather applications, calculators, and clones of popular websites are useful for learning syntax.</p><p>They help beginners practice components, state, API calls, forms, and routing.</p><p>But they rarely teach enough about the difficult parts of real engineering.</p><p>Tutorial projects are usually designed to work smoothly.</p><p>The data is clean.</p><p>The requirements are already known.</p><p>The correct architecture has already been chosen.</p><p>Someone else has removed most of the uncertainty before the tutorial begins.</p><p>Real projects are different.</p><p>APIs may return incomplete or inconsistent data.</p><p>Users may behave in unexpected ways.</p><p>Requirements may change halfway through development.</p><p>A decision that looked reasonable two weeks ago may suddenly become a problem.</p><p>You do not gain that experience by watching more tutorials.</p><p>You gain it by building something slightly more difficult than your current skill level.</p><p>Build a project where you have to make your own decisions.</p><p>Get stuck.</p><p>Research the problem.</p><p>Make mistakes.</p><p>Refactor your first solution.</p><p>That process teaches far more than copying another finished application step by step.</p><h3>4. Ignoring Loading, Error, and Empty States</h3><p>The happy path is the easiest part of most features.</p><p>The request succeeds.</p><p>The data arrives immediately.</p><p>The list contains items.</p><p>The user enters valid information.</p><p>The application behaves exactly as expected.</p><p>Junior projects often handle only this version of the feature.</p><p>Production applications cannot assume that everything will always work perfectly.</p><p>Requests take time.</p><p>Servers return errors.</p><p>Lists can be empty.</p><p>Users lose their internet connection.</p><p>Sessions expire.</p><p>A UI that only handles the happy path is not production-ready, because real users will eventually experience delays, empty results, and failed requests.</p><p>Every data-driven feature should consider at least these states:</p><p>- Loading<br>- Success<br>- Empty<br>- Error</p><p>In some cases, you may also need:</p><p>- Retry behavior<br>- Offline states<br>- Partial data<br>- Permission errors<br>- Session expiration<br>- Recovery after refreshing the page</p><p>These states are not optional details to add later.</p><p>They are part of the feature.</p><h3>5. Putting Everything in Global State</h3><p>Redux, Zustand, Context, and other state management tools can feel like one convenient solution for every type of state.</p><p>Once juniors learn one of these tools, they often begin placing everything inside it.</p><p>But most state does not need to be global.</p><p>A form input used by one component probably does not need to live in Redux.</p><p>A dropdown’s open or closed state probably does not need to be shared across the application.</p><p>A modal that belongs to one feature may not need a global store.</p><p>Overusing global state makes an application harder to understand.</p><p>Now a component can be affected by updates coming from anywhere in the codebase.</p><p>Debugging becomes more difficult.</p><p>Dependencies become less obvious.</p><p>Before deciding where state should live, ask:</p><p><em>“Who actually needs this state?”</em></p><p>If only one component needs it, keep it local.</p><p>If a small group of related components needs it, lift it to their nearest shared parent or use a focused context.</p><p>If the state represents server data, consider a server-state tool instead of manually copying everything into a global store.</p><p>Global state is useful.</p><p>But it should solve a real sharing problem — not become the default location for every value in the application.</p><h3>6. Creating Components With Too Many Responsibilities</h3><p>A component that handles data fetching, form logic, validation, business rules, state management, and rendering in one place is difficult to maintain.</p><p>This is common in junior codebases because keeping everything in one file initially feels simpler.</p><p>You can see the entire feature at once.</p><p>You do not need to decide where anything belongs.</p><p>But as the component grows, that simplicity disappears.</p><p>Large, mixed-responsibility components become:</p><p>- Harder to read<br>- Harder to test<br>- Harder to reuse<br>- Harder to debug<br>- Harder to change safely<br>- Harder for another developer to understand</p><p>The problem is not simply the number of lines.</p><p>A long component is not automatically bad.</p><p>The real problem is that unrelated responsibilities are mixed together.</p><p>Ask:</p><p>- Is this logic related to rendering?<br>- Could this behavior be moved into a custom hook?<br>- Is this section a separate reusable component?<br>- Does this business rule belong somewhere else?<br>- Can this part be tested independently?</p><p>Do not split components just to create more files.</p><p>Split them when doing so creates clearer responsibilities and makes the code easier to understand.</p><h3>7. Debugging by Guessing Instead of Investigating</h3><p>When something breaks, many juniors start changing code randomly until the error disappears.</p><p>They add `console.log` everywhere.</p><p>They remove parts of the component.</p><p>They reinstall packages.</p><p>They change multiple lines at once.</p><p>They copy another solution without first understanding the actual problem.</p><p>Sometimes this accidentally removes the visible error.</p><p>But it does not build real debugging skills.</p><p>A better debugging process is more structured.</p><p>Start by reproducing the problem consistently.</p><p>Then ask:</p><p>- What did I expect to happen?<br>- What actually happened?<br>- Where does the behavior first become incorrect?<br>- What input entered this function?<br>- What output came back?<br>- Did the network request succeed?<br>- What does the full error message say?<br>- Did the state change as expected?</p><p>Change one thing at a time.</p><p>Use browser developer tools.</p><p>Inspect network requests.</p><p>Read stack traces.</p><p>Check the data at each step.</p><p>Reduce the number of possible causes until only the real one remains.</p><p>Good debugging is not about guessing faster.</p><p>It is about investigating systematically.</p><h3>8. Ignoring Accessibility and Mobile Users</h3><p>Junior projects are often built and tested only in desktop Chrome, using a mouse, on a large screen.</p><p>That covers only one way real users interact with an application.</p><p>A feature is not complete simply because it looks correct on your laptop.</p><p>Can someone navigate it using only a keyboard?</p><p>Does a form input have a clear label?</p><p>Can a screen reader understand the page structure?</p><p>Is the text readable with sufficient contrast?</p><p>Does the layout work on a smaller screen?</p><p>Can users tap buttons comfortably on mobile?</p><p>Accessibility is not something to add at the end of a project.</p><p>A form that cannot be navigated with a keyboard is a broken form for users who rely on keyboard navigation.</p><p>A button without an understandable label is a broken button for someone using a screen reader.</p><p>The same applies to responsive design.</p><p>A layout that only works on a large desktop screen is not a finished layout.</p><p>Consider accessibility and mobile behavior while building the feature, not after everything else is complete.</p><p>It is usually cheaper and easier to design for these needs from the beginning than to fix them later.</p><h3>9. Trusting AI-Generated Code Without Reviewing It</h3><p>This is a newer mistake, but it is quickly becoming one of the most common.</p><p>AI tools can generate components, hooks, tests, API integrations, and validation logic within seconds.</p><p>That can make developers much faster.</p><p>But fast output is not always correct output.</p><p>AI-generated code may contain:</p><p>- Subtle bugs<br>- Security problems<br>- Outdated patterns<br>- Unnecessary complexity<br>- Incorrect assumptions<br>- Code that does not fit the existing architecture<br>- Solutions that work only for the happy path</p><p>The biggest risk appears when a developer accepts the result without understanding it.</p><p>If you do not understand what the AI wrote, you cannot confidently review it, debug it, or change it later.</p><p>Use AI to accelerate your work.</p><p>Ask it to explain unfamiliar code.</p><p>Compare different approaches.</p><p>Use it to create a first draft.</p><p>But review every line critically.</p><p>Treat AI-generated code the same way you would treat a pull request from a developer you do not know.</p><p>Because that is effectively what it is.</p><p>AI should improve your thinking — not replace it.</p><h3>10. Trying to Learn Everything Instead of Building Deeply</h3><p>Junior developers often feel pressure to learn everything at once.</p><p>React.</p><p>Next.js.</p><p>Vue.</p><p>Angular.</p><p>Redux.</p><p>GraphQL.</p><p>Node.js.</p><p>Docker.</p><p>Cloud platforms.</p><p>Testing tools.</p><p>System design.</p><p>Every week, another library or framework appears to become “essential.”</p><p>This creates developers who recognize many names but cannot build anything substantial with any of them.</p><p>Early in your career, depth is usually more valuable than breadth.</p><p><em>&gt; Depth beats breadth early in a career.</em></p><p>Choose one stack.</p><p>Learn it properly.</p><p>Build a real project with it.</p><p>Take that project beyond the basic tutorial stage.</p><p>Add authentication.</p><p>Handle errors.</p><p>Build responsive layouts.</p><p>Write tests.</p><p>Improve performance.</p><p>Refactor weak decisions.</p><p>Deploy it.</p><p>Maintain it after the first version.</p><p>Let the problems you encounter guide what you learn next.</p><p>Do not learn tools simply because they are trending.</p><p>Learn them when they solve a problem you genuinely understand.</p><h3>Final Thought</h3><p>Junior developers do not need to know everything.</p><p>They need to understand what they are building, why they are building it that way, and what can go wrong.</p><p>Most mistakes on this list come from choosing something that works immediately over something that is properly understood.</p><p>The goal is not to write perfect code from the beginning.</p><p>The goal is to develop the habit of asking better questions.</p><p>Why does this work?</p><p>What happens when it fails?</p><p>Who will need to change it later?</p><p>Is there a simpler solution?</p><p>What am I assuming?</p><p>Fix that habit, and many of the other mistakes begin to disappear on their own.</p><p><strong><em>Which of these mistakes do you see most often in junior frontend projects?</em></strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b37608dc04e0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Difference Between a React Developer and a Frontend Engineer]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://blog.stackademic.com/the-difference-between-a-react-developer-and-a-frontend-engineer-d3caa8961f20?source=rss-564007cebaad------2"><img src="https://cdn-images-1.medium.com/max/2246/1*UWB3vqeLE6nghv8DnhVDdA.png" width="2246"></a></p><p class="medium-feed-snippet">Knowing React does not automatically make someone a Frontend Engineer.</p><p class="medium-feed-link"><a href="https://blog.stackademic.com/the-difference-between-a-react-developer-and-a-frontend-engineer-d3caa8961f20?source=rss-564007cebaad------2">Continue reading on Stackademic »</a></p></div>]]></description>
            <link>https://blog.stackademic.com/the-difference-between-a-react-developer-and-a-frontend-engineer-d3caa8961f20?source=rss-564007cebaad------2</link>
            <guid isPermaLink="false">https://medium.com/p/d3caa8961f20</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Huseyn Ashurlu]]></dc:creator>
            <pubDate>Mon, 20 Jul 2026 08:16:38 GMT</pubDate>
            <atom:updated>2026-10-15T10:34:24.062Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[The 7 Skills Every Frontend Engineer Needs in 2026]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://javascript.plainenglish.io/the-7-skills-every-frontend-engineer-needs-in-2026-789cb4ca85d7?source=rss-564007cebaad------2"><img src="https://cdn-images-1.medium.com/max/2116/1*TGHgjyP4_ZXhjGWxy8zj0A.png" width="2116"></a></p><p class="medium-feed-snippet">The role of frontend engineering is changing.</p><p class="medium-feed-link"><a href="https://javascript.plainenglish.io/the-7-skills-every-frontend-engineer-needs-in-2026-789cb4ca85d7?source=rss-564007cebaad------2">Continue reading on JavaScript in Plain English »</a></p></div>]]></description>
            <link>https://javascript.plainenglish.io/the-7-skills-every-frontend-engineer-needs-in-2026-789cb4ca85d7?source=rss-564007cebaad------2</link>
            <guid isPermaLink="false">https://medium.com/p/789cb4ca85d7</guid>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Huseyn Ashurlu]]></dc:creator>
            <pubDate>Thu, 16 Jul 2026 08:29:01 GMT</pubDate>
            <atom:updated>2026-07-20T13:13:48.057Z</atom:updated>
        </item>
    </channel>
</rss>