Prologue: The 2 AM Deployment
It was 2:17 AM. I was staring at a terminal, sweat beading on my forehead, waiting for a deployment to finish. The feature? A simple discount coupon flow. Three forms, a validation step, and a confirmation screen. Nothing special by any standard.
But this was a grocery platform. And in the morning, thousands of people would wake up, open this app, and try to feed their families. If the coupon didn't apply correctly, someone would overpay. Someone would be frustrated. Someone might not be able to afford what they needed that week.
The deployment succeeded. I sat back, exhaled, and realized something I've never forgotten: the code I write has weight. It's not abstract. It's not just syntax. It's the difference between someone eating dinner and someone going hungry. Between a business staying open and closing. Between a delivery arriving on time or a child missing their school lunch.
Five years later, I've shipped hundreds of features. Some small ones. Some that moved millions in revenue. But that 2 AM deployment, that moment of realizing my code mattered, is the fire that's kept me going.
And now I'm watching the news tell an entire generation of aspiring engineers, "AI is coming for your job. Don't bother learning to code. It's over."*
They're wrong. Profoundly, dangerously, completely wrong.
Let me tell you why.
Part I: The Fear, The Headlines, and The Misunderstanding
Walk into any tech X (formerly Twitter) space, open any LinkedIn feed, scroll through any YouTube comment section, and you'll find the same narrative:
"Cursor wrote this entire app."
"V0 generates production-ready UI in seconds."
"Why hire a frontend engineer when Claude can build your entire landing page?"
"Frontend is dead."
I get it. It's scary. When I first saw an AI generate a functional React component from a sentence, my stomach dropped. I'd spent years learning to write that exact thing. Was it all for nothing?
Here's what I learned: AI generates output. It does not generate ownership.
Anyone can prompt. Almost no one can ship.
A generated component is just a sketch. It has no context. It doesn't know why the button is orange instead of blue. It doesn't know that the loading state needs to appear for exactly 300 milliseconds, not 200, not 400, because user testing showed that 300ms is the sweet spot between perceived speed and perceived effort.
It doesn't know that the disabled submit button should show a tooltip explaining why it's disabled. It doesn't know that the error message should say, "This email is already registered. Did you forget your password? Let us help you reset it" instead of "Error: duplicate entry."
AI doesn't know these things because these things are not in the training data. They're in the trenches. They're in the user testing sessions. They're in the 2 AM realizations. They're in the conversations with product managers and customer support agents and actual human beings who use what you build.
The fear is real. The headline is wrong.
Part II: What Five Years of Shipping Actually Taught Me
I've spent over five years building full-stack applications. I've built e-commerce platforms that connect thousands of vendors with hundreds of thousands of customers. I've built real-time logistics systems that track deliveries down to the exact GPS coordinate. I've built promotional campaign engines that reward customers for predictions and referrals. I've built admin dashboards that give businesses superpowers, the ability to see, understand, and act on their operations in ways they never could before.
And here's what I've learned about what matters:
1. Syntax is the cheapest thing you own
When I started, I thought knowing JavaScript deeply was the secret sauce. Then I thought React. Then TypeScript. Then the latest state management library. Then the hottest CSS framework.
Every six months, the "essential" tool changed.
If I'd tied my identity to syntax, I'd have been replaced ten times over. Instead, I tied my identity to something AI can't touch: the ability to translate human needs into technical solutions.
Here's what I mean: a customer doesn't care if you used Redux or Zustand or signals or context. They care that when they tap "Checkout," their order goes through. They care that when they're confused, the interface guides them. They care that when something breaks, the system doesn't punish them.
A business owner doesn't care if your admin panel is built with React or Vue or Svelte or vanilla HTML. They care that they can find the data they need in three clicks instead of thirty. They care that their team can onboard in an hour instead of a week.
Your framework is temporary. Your ability to understand what humans need? That's permanent.
2. The hard problems are not technical
Five years ago, I thought the hardest problems were technical. Architecture. Performance. Edge cases.
Today, I know the hardest problems are human:
- How do you tell a user their order failed without making them panic?
- How do you build a dashboard that a non-technical admin can use confidently?
- How do you design a referral flow that feels like a gift, not a transaction?
- How do you handle a vendor who accidentally set their inventory to zero and needs to fix it fast?
- How do you show a customer their delivery is delayed without making them angry at the rider?
Every single one of these is a frontend problem. Every single one requires empathy. Every single one requires understanding context, emotion, and real-world consequences.
AI can generate the form. It cannot generate trust.
3. The best code is code you don't write
This is the paradox of experience: the more you know, the less you build.
Junior me would write 500 lines to solve a problem. Today, I write 50. Not because I'm lazier, but because I've learned that every line of code is a liability. Every component is something that needs to be maintained, tested, and understood by the next person.
The most valuable skill I've developed isn't writing code faster. It's knowing what not to build.
- Do we need a custom date picker, or should we use the library we already have?
- Does this need to be a new page, or can it be a modal?
- Do we need real-time updates, or is polling every 30 seconds good enough?
- Does this feature need to exist at all, or are we solving a problem nobody has?
AI will never ask those questions. It will generate whatever you prompt. It has no judgment. It has no experience of maintaining a codebase for three years and knowing exactly which dependencies have caused problems and which patterns lead to bugs.
That judgment, the hard-earned wisdom of having shipped, failed, fixed, and shipped again, is irreplaceable.
Part III: A Tour Through Real Features I've Built
Let me walk you through a few real features I've built. Not to impress you, but to show you the difference between what AI generates and what an engineer actually does.
The Promotional Campaign Engine
A client wanted a promotional campaign: customers predict match scores and refer friends. Correct predictions and successful referrals earn rewards.
An AI could generate the CRUD. The forms. The tables.
But here's what the AI wouldn't know:
- The admin needs six different tabs because they check different data at different frequencies. Settings once. Matches daily. Winners hourly. Putting them all on one page would be chaos.
-
The prediction flow needs to show teams by name — but the database stores them inconsistently. Sometimes
home_team. Sometimeshome_team_name. Sometimeshome. The AI would pick one. I had to write code that handles all three, because the backend team was still migrating. That's not syntax. That's context. - The referral progress bar needs to handle multiple data sources. Progress could come from a dedicated endpoint, or it could be calculated from the entries list, or it could come from a cached value. The AI would assume one shape. Real APIs change. I had to write code that gracefully degrades through every possible source.
- The status badge needs to be green for "correct" but also for "qualified" and "rewarded" and "won." And orange for "pending" but not for "incorrect." And red for "incorrect" but also for "lost" and "expired." These aren't technical decisions. They're human decisions, what does each status mean to the person reading it?
AI generates output. Engineers generate meaning.
The Real-Time Logistics Dashboard
Trucks move across a city. Customers refresh their browsers, waiting for their groceries. The status needs to update without a page reload. The driver's location needs to show on a map. The estimated arrival needs to be accurate.
An AI could wire up WebSockets and drop a marker on a map.
But here's what the AI wouldn't know:
- The customer is anxious. Every second the spinner shows, their stress increases. So the UI needs to show something, not just a loading state, but a meaningful status: "Your rider is at the store" → "Your rider is packing your order" → "Your rider is on the way" → "Your rider is 3 minutes away." Each step is a small reassurance.
- The rider's GPS updates every 5 seconds, but we should only re-render the map every 15 seconds. Because re-rendering every 5 seconds drains battery, creates visual noise, and makes the UI feel jittery. The AI doesn't know about battery. It doesn't know about visual comfort.
- When the rider is late, the customer's frustration needs to be directed somewhere productive. So we show "Your rider is delayed by traffic," not "ETA updated." We frame the delay as external, not as a system failure. This is UX psychology, not code.
- The admin needs to see all active deliveries on one screen with color-coded status—green for on-time, yellow for borderline, and red for late. A simple dashboard that takes 10 minutes to build but saves hours of phone calls from anxious customers.
None of this is in any training data. It's all learned from watching real users struggle with real interfaces.
The Vendor Onboarding Flow
A marketplace lives and dies by its supply side. If vendors can't onboard quickly, the catalog stays empty. If the catalog is empty, customers don't come.
The onboarding form needed to collect business details, bank information, food safety certification, delivery zones, opening hours, and menu items. That's about 50 fields spread across 6 steps.
An AI could generate a multi-step form.
But here's what the AI wouldn't know:
- Vendors are busy. They're running a business. The form needs to save progress at every step so they can come back later. The AI wouldn't think about partial saves because it's never been interrupted by a customer walking into a store while filling out a form.
- The bank details step is stressful. People get nervous entering financial information. The UI needs to look secure, padlock icons, reassuring copy, and clear explanations of why each field is needed. The AI wouldn't know that the visual design of a form field can change someone's emotional state.
- The certification upload step has a specific failure mode: vendors take photos of documents on their phones, and those photos are often sideways, blurry, or too large. The frontend needs to handle orientation correction, compression, and clear error messages about quality requirements. The AI wouldn't know that 30% of users would upload a sideways image.
- When a vendor gets stuck, they don't email support. They just leave. So every step needs inline validation that explains what's wrong and how to fix it, not just "invalid input." The AI would generate generic error messages. Real vendors need specific guidance.
The Admin Dashboard
The most complex thing I've ever built isn't a customer-facing feature. It's the tool that runs behind the scenes.
Admin dashboards are where business operations happen. They're where customer support agents resolve issues. Where finance teams track payments. Where operations managers monitor deliveries. Where marketing teams launch campaigns.
An AI could generate a table with filters.
But here's what the AI wouldn't know:
- Every admin user has a different workflow. The support agent needs to search by customer name. The finance person needs to filter by date range and payment status. The operations manager needs to see everything sorted by urgency. One dashboard needs to serve multiple mental models.
- Admins are under pressure. They're handling customer complaints, vendor disputes, and delivery delays. The UI needs to be fast, not just technically fast, but cognitively fast. Every extra click, every confusing label, every slow filter adds to their stress. The AI wouldn't know that an extra 2 seconds of load time during peak hours means 50 fewer tickets resolved.
- The most important data needs to be most visible. Not everything in the dashboard is equally important. The orders that are 2 hours overdue matter more than the ones that were just placed. The vendors who haven't been paid in 3 weeks matter more than the ones who were paid yesterday. The AI would treat all data equally. Real dashboards need to tell a story about what needs attention right now.
- Admins make mistakes. They accidentally delete records, change values they shouldn't, and take actions they can't undo. Every destructive action needs confirmation, undo capability, or, at minimum, a clear audit trail. The AI wouldn't think about undo because it's never accidentally deleted a production record at 6 PM on a Friday.
Part IV: The Skills That Matter Now (And Will Matter More)
If you're an aspiring frontend engineer reading this, you're probably wondering, "What should I actually learn?"*
Let me be specific.
The Skills AI Cannot Amplify (That You Must Own)
1. Problem decomposition
Before you write a single line of code, you need to understand the problem. Not the technical problem, the human problem.
"The checkout page is too slow" is not a problem statement. It's a symptom.
The real problem might be "Users abandon the checkout when they see unexpected shipping costs."*
The real solution might not be a faster checkout. It might be showing shipping costs earlier. It might be free shipping over a certain amount. It might be a progress bar that shows "add ₦1,000 more for free delivery."
AI can optimize the checkout. It cannot diagnose the real problem.
2. Communication across disciplines
Every feature you build requires translating between worlds. The business team speaks in revenue and conversion. The design team speaks in flows and pixels. The backend team speaks in APIs and data models. The customer support team speaks in tickets and pain points.
Your job as a frontend engineer is to speak all these languages and translate between them. You're the bridge. Without you, each team operates in isolation. With you, the entire company moves in one direction.
AI cannot attend a meeting, understand what a product manager is really asking for, and translate that into technical requirements. It can't read between the lines of "can we make this pop?" and understand that the PM means "the conversion rate on this button is too low, and we need to make it more prominent."
3. Judgment about tradeoffs
Every engineering decision is a tradeoff:
- Speed vs. quality
- Custom vs. off-the-shelf
- Build vs. buy
- Ship now vs. ship right
- Optimize for the 90% case or handle the 10% edge case
There is no objectively correct answer. Every decision depends on context: the team size, the business stage, the user base, the technical debt already accumulated, the timeline, and the budget.
AI cannot judge tradeoffs. It can only optimize for what you tell it to optimize for. And most of the time, you don't know what to optimize for until you've made the wrong choice a few times and learned from it.
4. Ownership and accountability
This is the biggest one.
When AI generates code and it breaks, who fixes it? When a bug slips into production at 11 PM on a Friday, who's debugging? When a customer's order fails because of a frontend validation edge case, who's explaining to the support team what happened?
You. Every time.
Ownership means this is my code, my users, and my responsibility. It means staying up late to fix the bug. It means apologizing when you break something. It means learning from every failure and making sure it doesn't happen again.
AI has no skin in the game. It doesn't get paged at 3 AM. It doesn't have to explain to a CEO why revenue dropped. It doesn't care.
You do. And that caring, that deep, exhausting, beautiful commitment to your users, is the most valuable thing you bring to any team.
The Skills AI Can Amplify (That You Should Still Master)
1. Speed of iteration
AI can generate a prototype in seconds. Use this. Generate the first draft, then apply your judgment to refine it. You get to skip the boring scaffolding and focus on what matters: the details, the edge cases, the polish.
But here's the trap: if you can't judge whether the AI output is good, you're stuck. You need to know enough to be a critic, not just a prompter.
2. Code generation for known patterns
Any pattern you've implemented ten times, forms, tables, CRUD endpoints, or auth flows, AI can generate competently. Use it. Free up your brain for the novel problems.
But if you've never implemented these patterns yourself, you won't know when the AI generates something subtly wrong. The worst-case scenario isn't obvious bugs. It's subtle bugs that look correct but fail under specific conditions.
3. Exploration and learning
AI is phenomenal for answering "how do I do X in Y framework?" It compresses hours of documentation scrolling into seconds. Use it to learn faster.
But don't confuse knowing how to prompt for an answer with understanding the answer. Real understanding comes from implementing, debugging, and shipping.
Part V: A Letter to the Aspiring Engineer
Dear future engineer,
I know it's scary out there. I know the headlines are loud. I know every day brings a new announcement about AI replacing some part of our craft.
But here's the truth that nobody's saying loudly enough:
The demand for people who can ship real products, understand real users, and solve real problems is higher than it has ever been.
Yes, the entry barrier has shifted. The junior roles that were about "write this component" are disappearing. But the roles that require judgment, empathy, and ownership are growing. They pay more. They matter more. And they're harder to fill.
Here's my advice:
Build things that matter.
Not another todo app. Not another weather widget. Build something that a real human being would use. A tool for a local business. A helper for a family member. A dashboard for a friend's startup.
When you build for real users, you learn things no tutorial can teach:
- You learn that your beautiful architecture doesn't matter if the page takes 3 seconds to load on a phone
- You learn that your clever CSS animation makes some users nauseous
- You learn that what you thought was clear is confusing to everyone else
- You learn that shipping imperfect code today is better than shipping perfect code next month
- You learn that the joy of building isn't in the technology, but in watching someone use what you made and seeing their face light up
Read code. Read a lot of it.
Read the code of open-source projects you admire. Read your dependencies. Read the pull requests of senior engineers. The more code you read, the more patterns you absorb. And the more patterns you absorb, the better your judgment becomes.
AI reads all the code. But it doesn't understand any of it. It doesn't know which patterns lead to maintainable codebases and which lead to spaghetti. It doesn't know which abstractions are worth the complexity and which aren't.
That understanding only comes from reading, writing, and shipping code over years.
Find a mentor (or be one).
The best engineers I know all have one thing in common: they learned from someone more experienced. Not from a bootcamp. Not from a course. From someone who sat next to them, looked at their code, and said, "Here's a better way."
If you're early in your career, find someone who's been shipping for a decade and ask them questions. Most senior engineers love mentoring. We remember what it was like to feel lost, and we want to help.
If you're experienced, mentor someone. Teaching forces you to articulate what you know, which deepens your own understanding. And watching someone grow is one of the most satisfying experiences in this field.
Embrace the boring.
The hottest framework, the newest pattern, the most elegant architecture, none of it matters if the product doesn't work.
The best code I've written is boring code. Simple components. Clear data flows. Predictable patterns. Nothing clever. Nothing impressive. Just reliable, maintainable, understandable code that does what it's supposed to do.
AI loves clever code. AI generates interesting solutions. But interesting is not what users need. They need reliability. They need boring. They need code that works at 2 AM when their order depends on it.
Don't compete with AI. Use it.
The worst strategy is to pretend AI doesn't exist. The second-worst strategy is to let AI do all your thinking.
The best strategy is AI handling the boilerplate. You handle the meaning.
Use AI to generate your tests. Use it to catch your edge cases. Use it to explore alternative approaches. But never let it make the final judgment call. That's yours. That's always been yours.
Part VI: Why Frontend Matters More Than Ever
Here's something nobody talks about:
The frontend is where value is delivered.
The backend is where data lives. The database is where information is stored. The APIs are where logic executes. But none of that matters if a human being can't access it.
Every dollar your company makes passes through the frontend. Every customer interaction happens on the frontend. Every time someone chooses your product over a competitor's, they're choosing your frontend experience.
The frontend is not "just UI." It's the moment of truth, the place where all the backend complexity, all the business logic, all the data processing, and all the engineering effort become real for a human being.
If the frontend is confusing, the product is confusing. If the frontend is slow, the product is slow. If the frontend is untrustworthy, the product is untrustworthy.
The frontend engineer is not a "UI developer." You are the steward of the user's trust. Every pixel, every animation, every micro-interaction, every loading state, and every error message, they all either build trust or erode it.
AI can generate pixels. It cannot generate trust.
Trust is earned through consistency. Through reliability. Through understanding what your users fear and addressing it before they have to ask. Through shipping features that make your users' lives measurably better.
That's not a technical challenge.
That's a human one.
Part VII: The Architecture of Empathy
Let me share something I've never written down before.
There's a moment in every project where the code becomes invisible. Where you stop thinking about React components and API calls and start thinking about the human being on the other end of the connection.
It usually happens around 3 AM, after you've fixed the same bug three times.
You realize that the bug wasn't technical. It was emotional.
The user wasn't confused because the UI was unclear. They were confused because they were stressed, distracted, and in a hurry, and the interface demanded more attention than they had to give.
The solution wasn't a better error message. It was removing the need for the error message entirely.
This is what I call the architecture of empathy.
It's the realization that every interface is a conversation. Every button is a question. Every confirmation dialog is a reassurance. Every loading state is a promise.
And like any good conversation, the best interfaces are the ones where the other person feels understood.
Here's how you build with empathy:
Know who you're building for
Not "users." Not "customers." Specific people with specific contexts.
The cashier is processing orders at 7 PM after a 10-hour shift. The single parent ordering groceries while holding a toddler. The admin who's been doing data entry for 4 hours and desperately needs this one filter to work.
Every time you make a UX decision, ask: Would this help the person who's tired, stressed, distracted, and just wants to get this done?
Know what they're afraid of
Users come to every interface with fear:
- Will I lose my data?
- Will I be charged twice?
- Will I make a mistake I can't undo?
- Will this take too long?
- Will I look stupid?
Your job is to address every fear before they have to articulate it. Show them their data is saved. Show them the transaction was successful. Let them undo mistakes. Make the fast parts visible. Design error states that don't blame the user.
Know what they're trying to do
Nobody wakes up wanting to use your app. They wake up wanting to feed their family, run their business, or make it through their shift.
Your app is a means to an end.
Every feature should either get them closer to their goal faster or reduce the friction of getting there. If it doesn't do either, it doesn't belong.
Part VIII: The Real Future of Frontend
I've been doing this for over five years. I've built things I'm proud of and things I've learned from. I've stayed up late, shipped under pressure, debugged impossible bugs, and felt the incomparable joy of watching someone use something I built and seeing it make their day better.
And I can tell you with absolute certainty: the future of frontend engineering is not in writing more code. It's in understanding people better.
The AI revolution is not the end of our craft. It's the liberation of our craft.
We get to stop writing scaffolding and start designing experiences. We get to stop debugging CSS and start debugging user journeys. We get to stop optimizing render cycles and start optimizing for human delight.
The tools will change. They always do. The frameworks will evolve. They always will. AI will get smarter. It's already smart, and it's only going to get smarter.
But the fundamental equation hasn't changed:
Technology + Empathy = Value
AI brings the technology.
Only you bring empathy.
Only you can sit with a user, watch them struggle, and understand what they need. Only you can stare at a screen at 2 AM and realize that a single pixel adjustment will save thousands of people a moment of confusion. Only you can look at a business requirement and translate it into an interface that feels natural, intuitive, even joyful.
That's not going away. It's becoming more valuable every day.
Epilogue: The 2 AM Deployment, Revisited
It's 2 AM again, years later.
I'm watching a deployment pipeline run. This time it's a major feature, a campaign engine that will run for weeks, involving thousands of customers predicting scores, referring friends, and earning rewards.
The stakes are higher. The system is more complex. The audience is bigger.
And yet, the feeling is the same: this matters.
Somewhere out there, a customer will wake up, open this app, and see their prediction was correct. They'll smile. They'll tell a friend. They'll feel good about using this product.
Somewhere out there, an admin will log into the dashboard, see the referral leaderboard, and know exactly who to reward. They'll feel in control. They'll trust the system.
Somewhere out there, a business owner will look at the campaign metrics and see that revenue went up because more customers engaged, because the experience felt good, because someone, an engineer, cared about the details.
That engineer was me.
And for the next generation reading this: that engineer will be you.
Not AI. You.
The AI will write the components. The AI will handle the boilerplate. The AI will catch the edge cases.
But only you can write the future.
Only you can care enough to make it matter.
Only you can look at a blank screen and imagine something that doesn't exist yet, something that will make someone's life measurably better, and then build it, ship it, and watch it change the world, one interface at a time.
That's not a skill AI can learn.
That's a choice only a human can make.
So make it.
Build something that matters. Ship it imperfectly. Learn from the failures. Celebrate the wins. And never, ever let anyone tell you that what you do is "just frontend."
What you do is where value becomes real.
What you do is where technology meets humanity.
What you do is magic. It always has been. And AI? It's just another tool in your magic kit.
The real magician?
Still you.
Always you.
I've been building full-stack applications for over five years, e-commerce platforms, logistics systems, promotional engines, and admin dashboards. I've shipped code that moved millions and code that mattered to exactly one person. If you're early in your journey and wondering whether this path is worth it, it is. If you're experienced and wondering whether your skills still matter, they do. More than ever.
What are you building? I'd love to see it.
Follow Me
X: @ogeobubu
GitHub: @ogeobubu
Instagram: @ogeobubu
Threads: @ogeobubu
Top comments (2)
Good point about the onboarding flow. Less friction is underrated.
Exactly. Friction kills adoption, and no AI can replace the human intuition needed to spot those pain points.