<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Habeeb Abdullahi</title>
    <description>The latest articles on DEV Community by Habeeb Abdullahi (@engrwithhabeeb).</description>
    <link>https://dev.to/engrwithhabeeb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2501179%2F9a977a7b-5b55-4010-afc5-7e66019cc7ca.png</url>
      <title>DEV Community: Habeeb Abdullahi</title>
      <link>https://dev.to/engrwithhabeeb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/engrwithhabeeb"/>
    <language>en</language>
    <item>
      <title>Beyond the Syntax: Why Growth Matters More Than Tools</title>
      <dc:creator>Habeeb Abdullahi</dc:creator>
      <pubDate>Sun, 12 Jul 2026 08:50:57 +0000</pubDate>
      <link>https://dev.to/brynchofficial/beyond-the-syntax-why-growth-matters-more-than-tools-1jd6</link>
      <guid>https://dev.to/brynchofficial/beyond-the-syntax-why-growth-matters-more-than-tools-1jd6</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm8jvkj4f6doxfz59eg8j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm8jvkj4f6doxfz59eg8j.png" alt="Anime-inspired illustration of a thoughtful software engineer working late at a desk overlooking a city skyline. A whiteboard highlights software architecture, problem solving, security, and business understanding, while books on system design and clean architecture sit beside a laptop. The cover emphasizes that long-term engineering growth comes from mastering principles, continuous learning, and solving real problems—not simply collecting tools or following technology trends. The title reads: " width="800" height="533"&gt;&lt;/a&gt;Every few months, a new technology dominates the conversation.&lt;/p&gt;

&lt;p&gt;Yesterday it was Docker.&lt;/p&gt;

&lt;p&gt;Then Kubernetes.&lt;/p&gt;

&lt;p&gt;Today, it's AI.&lt;/p&gt;

&lt;p&gt;Tomorrow, it will be something else.&lt;/p&gt;

&lt;p&gt;The discussion usually sounds like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Do I need to learn this to stay relevant?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I think that's the wrong question.&lt;/p&gt;

&lt;p&gt;The technology itself isn't what keeps engineers relevant.&lt;/p&gt;

&lt;p&gt;Their ability to grow does.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Misconception: Tools Make Great Engineers
&lt;/h2&gt;

&lt;p&gt;It's easy to believe that learning every new framework, platform, or tool automatically makes you a better software engineer.&lt;/p&gt;

&lt;p&gt;It doesn't.&lt;/p&gt;

&lt;p&gt;Docker didn't create great engineers.&lt;/p&gt;

&lt;p&gt;AWS didn't create great engineers.&lt;/p&gt;

&lt;p&gt;Kubernetes didn't create great engineers.&lt;/p&gt;

&lt;p&gt;AI won't either.&lt;/p&gt;

&lt;p&gt;They're all tools.&lt;/p&gt;

&lt;p&gt;Powerful tools.&lt;/p&gt;

&lt;p&gt;But tools nonetheless.&lt;/p&gt;

&lt;p&gt;The engineers who built these technologies started with the same computer science and engineering fundamentals every developer learns.&lt;/p&gt;

&lt;p&gt;The difference wasn't access to better tools.&lt;/p&gt;

&lt;p&gt;It was years of continuous learning, solving increasingly difficult problems, and building real systems.&lt;/p&gt;

&lt;p&gt;Tools are the result of engineering.&lt;/p&gt;

&lt;p&gt;They are not a substitute for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  School Gives You the Foundation
&lt;/h2&gt;

&lt;p&gt;One misconception I often hear is that universities should teach everything you'll use in industry.&lt;/p&gt;

&lt;p&gt;They can't.&lt;/p&gt;

&lt;p&gt;And they were never meant to.&lt;/p&gt;

&lt;p&gt;Formal education introduces the fundamentals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Programming&lt;/li&gt;
&lt;li&gt;Data Structures and Algorithms&lt;/li&gt;
&lt;li&gt;Operating Systems&lt;/li&gt;
&lt;li&gt;Computer Networks&lt;/li&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;li&gt;Software Engineering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those principles don't become obsolete every year.&lt;/p&gt;

&lt;p&gt;They're the foundation that allows engineers to understand new technologies much faster.&lt;/p&gt;

&lt;p&gt;No university can realistically teach every cloud platform, framework, container technology, or AI model.&lt;/p&gt;

&lt;p&gt;By the time a curriculum is updated, the industry has already evolved.&lt;/p&gt;

&lt;p&gt;School gives you the fundamentals.&lt;/p&gt;

&lt;p&gt;Growth is your responsibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Growth Is What Keeps Engineers Relevant
&lt;/h2&gt;

&lt;p&gt;The engineers who remain relevant aren't necessarily the ones who know the most tools.&lt;/p&gt;

&lt;p&gt;They're the ones who never stop learning.&lt;/p&gt;

&lt;p&gt;Growth comes in many forms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building personal projects.&lt;/li&gt;
&lt;li&gt;Participating in hackathons.&lt;/li&gt;
&lt;li&gt;Contributing to open source.&lt;/li&gt;
&lt;li&gt;Reading technical books.&lt;/li&gt;
&lt;li&gt;Learning from experienced engineers.&lt;/li&gt;
&lt;li&gt;Working on real-world systems.&lt;/li&gt;
&lt;li&gt;Making mistakes and learning from them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every project teaches something.&lt;/p&gt;

&lt;p&gt;Every challenge exposes another gap in your knowledge.&lt;/p&gt;

&lt;p&gt;Every solved problem compounds your experience.&lt;/p&gt;

&lt;p&gt;That's how engineering maturity develops.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Doesn't Replace Growth
&lt;/h2&gt;

&lt;p&gt;AI has changed how we build software.&lt;/p&gt;

&lt;p&gt;It hasn't changed how engineers grow.&lt;/p&gt;

&lt;p&gt;AI can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explain concepts.&lt;/li&gt;
&lt;li&gt;Generate boilerplate.&lt;/li&gt;
&lt;li&gt;Review code.&lt;/li&gt;
&lt;li&gt;Accelerate implementation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What it can't do is replace curiosity.&lt;/p&gt;

&lt;p&gt;It can't replace engineering judgment.&lt;/p&gt;

&lt;p&gt;It can't replace the experience gained from solving real problems.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI is a powerful accelerator.&lt;/p&gt;

&lt;p&gt;But acceleration without direction only gets you lost faster.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The developers who will thrive in the AI era won't be those who rely on AI the most.&lt;/p&gt;

&lt;p&gt;They'll be those who understand enough engineering to use AI effectively.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principles Over Popularity
&lt;/h2&gt;

&lt;p&gt;Technology trends will always change.&lt;/p&gt;

&lt;p&gt;The principles underneath them rarely do.&lt;/p&gt;

&lt;p&gt;Yesterday it was jQuery.&lt;/p&gt;

&lt;p&gt;Then Angular.&lt;/p&gt;

&lt;p&gt;Then React.&lt;/p&gt;

&lt;p&gt;Today it's AI.&lt;/p&gt;

&lt;p&gt;Tomorrow, it will be something else.&lt;/p&gt;

&lt;p&gt;Engineers who chase every trend without understanding the fundamentals constantly start over.&lt;/p&gt;

&lt;p&gt;Engineers who build strong principles simply adapt.&lt;/p&gt;

&lt;p&gt;Learning the next tool becomes easier because they're standing on a stronger foundation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Staying relevant isn't about predicting the next technology.&lt;/p&gt;

&lt;p&gt;It's about becoming the kind of engineer who can learn whatever comes next.&lt;/p&gt;

&lt;p&gt;That's why I no longer measure growth by the number of tools I know.&lt;/p&gt;

&lt;p&gt;I measure it by my ability to understand new ideas, solve harder problems, and adapt when the industry changes.&lt;/p&gt;

&lt;p&gt;Because technology will always evolve.&lt;/p&gt;

&lt;p&gt;Great engineers evolve with it.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What has contributed the most to your growth as a software engineer?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Was it school, work experience, side projects, hackathons, open source, or something else?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Beyond the Syntax: Why the "Web Dev Is Dead" Debate Misses the Point</title>
      <dc:creator>Habeeb Abdullahi</dc:creator>
      <pubDate>Sun, 28 Jun 2026 02:56:10 +0000</pubDate>
      <link>https://dev.to/brynchofficial/beyond-the-syntax-why-the-web-dev-is-dead-debate-misses-the-point-4ee8</link>
      <guid>https://dev.to/brynchofficial/beyond-the-syntax-why-the-web-dev-is-dead-debate-misses-the-point-4ee8</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feh8ft6cor1rr5ue4n2ro.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feh8ft6cor1rr5ue4n2ro.png" alt="An anime-inspired illustration of a software engineer working late at a multi-monitor workstation overlooking a futuristic city skyline. The workspace features diagrams on software architecture, system design, security, business understanding, and problem solving, alongside screens displaying code and AI-assisted development. The artwork emphasizes that AI is a productivity amplifier while engineering principles, architecture, and sound decision-making remain at the core of building maintainable software. The cover text reads: " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every few months, the same debate resurfaces:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Is web development still worth learning?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Recently, I came across another discussion asking the same question. The consensus was that AI has changed the industry and that developers now need to combine coding with problem-solving, security, and business understanding.&lt;/p&gt;

&lt;p&gt;I agree with that conclusion.&lt;/p&gt;

&lt;p&gt;What I don't agree with is one underlying assumption.&lt;/p&gt;

&lt;p&gt;The conversation often implies that web development used to be "just writing code" and that AI somehow changed that.&lt;/p&gt;

&lt;p&gt;It didn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Misconception: Web Development Was Never "Just Coding"
&lt;/h2&gt;

&lt;p&gt;Long before LLMs and AI coding assistants existed, web development was never about simply writing lines of code.&lt;/p&gt;

&lt;p&gt;Building production-ready software has always required much more than knowing a programming language.&lt;/p&gt;

&lt;p&gt;It has always demanded:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Systems Architecture:&lt;/strong&gt; Designing scalable, maintainable, and loosely coupled systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Integrity:&lt;/strong&gt; Managing state and ensuring predictable application behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problem Solving:&lt;/strong&gt; Translating business requirements into reliable software.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trade-off Analysis:&lt;/strong&gt; Understanding that every engineering decision comes with benefits and costs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These have always been the skills that separate someone who writes code from someone who engineers software.&lt;/p&gt;

&lt;p&gt;AI didn't invent that distinction.&lt;/p&gt;

&lt;p&gt;It simply made it more obvious.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Is a Productivity Multiplier, Not a Substitute
&lt;/h2&gt;

&lt;p&gt;I don't see AI as a threat to software engineering.&lt;/p&gt;

&lt;p&gt;I see it as leverage.&lt;/p&gt;

&lt;p&gt;AI handles boilerplate.&lt;/p&gt;

&lt;p&gt;It generates repetitive code.&lt;/p&gt;

&lt;p&gt;It explains unfamiliar APIs.&lt;/p&gt;

&lt;p&gt;It speeds up implementation.&lt;/p&gt;

&lt;p&gt;That gives engineers more time to focus on the things that actually matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System design.&lt;/li&gt;
&lt;li&gt;Architecture.&lt;/li&gt;
&lt;li&gt;Business logic.&lt;/li&gt;
&lt;li&gt;Security.&lt;/li&gt;
&lt;li&gt;Performance.&lt;/li&gt;
&lt;li&gt;User experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real conversation isn't whether AI will replace developers.&lt;/p&gt;

&lt;p&gt;It's how developers can leverage AI to become more productive while continuing to make the engineering decisions AI cannot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Fundamentals Matter More Than Ever
&lt;/h2&gt;

&lt;p&gt;Ironically, AI makes strong engineering fundamentals even more important.&lt;/p&gt;

&lt;p&gt;Without them, it's incredibly easy to generate a large amount of incorrect or poorly designed code.&lt;/p&gt;

&lt;p&gt;You can absolutely build a bad system with AI.&lt;/p&gt;

&lt;p&gt;In fact, you can build it much faster.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI is an amplifier.&lt;/p&gt;

&lt;p&gt;If it is given a flawed architectural idea, it will happily generate messy, tightly coupled, and unmaintainable code at five times the speed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Without understanding software fundamentals, many developers won't even realize they're heading toward a structural dead end until the application becomes difficult to maintain, scale, or debug.&lt;/p&gt;

&lt;p&gt;AI doesn't replace engineering judgment.&lt;/p&gt;

&lt;p&gt;It magnifies it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principles Over Syntax
&lt;/h2&gt;

&lt;p&gt;The question has never been whether web development is worth learning.&lt;/p&gt;

&lt;p&gt;The real question is &lt;em&gt;how&lt;/em&gt; you're learning it.&lt;/p&gt;

&lt;p&gt;If your focus is only on memorizing syntax, AI will probably outperform you.&lt;/p&gt;

&lt;p&gt;But if your focus is understanding software architecture, system design, trade-offs, business logic, and engineering principles, AI becomes one of the most powerful tools you'll ever use.&lt;/p&gt;

&lt;p&gt;Languages will evolve.&lt;/p&gt;

&lt;p&gt;Frameworks will change.&lt;/p&gt;

&lt;p&gt;AI will continue to improve.&lt;/p&gt;

&lt;p&gt;But thoughtful engineering remains timeless.&lt;/p&gt;

&lt;p&gt;AI can generate code.&lt;/p&gt;

&lt;p&gt;It can suggest implementations.&lt;/p&gt;

&lt;p&gt;It can accelerate development.&lt;/p&gt;

&lt;p&gt;But it still can't decide what should be built, why it should be built that way, or how the system should evolve over the next five years.&lt;/p&gt;

&lt;p&gt;That's still engineering.&lt;/p&gt;

&lt;p&gt;And that's why the question was never whether web development is worth learning.&lt;/p&gt;

&lt;p&gt;The real question is whether you're learning syntax or learning engineering.&lt;/p&gt;




&lt;p&gt;What are your thoughts? Has AI changed what it means to be a software engineer, or has it simply amplified the skills that have always mattered?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>Beyond the Syntax: Why Software Engineering Is Not Just Writing Code</title>
      <dc:creator>Habeeb Abdullahi</dc:creator>
      <pubDate>Fri, 26 Jun 2026 22:41:42 +0000</pubDate>
      <link>https://dev.to/brynchofficial/beyond-the-syntax-why-software-engineering-is-not-just-writing-code-5hm2</link>
      <guid>https://dev.to/brynchofficial/beyond-the-syntax-why-software-engineering-is-not-just-writing-code-5hm2</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F687m08x6mgjug8ebzywd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F687m08x6mgjug8ebzywd.png" alt="An anime-style illustration of a software engineer thinking deeply at his desk, surrounded by motivational tech quotes, coding philosophy, and textbooks. The image features prominent text reading " width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
We've all seen the archetypes: the developer who boasts about knowing seven different programming languages, the interview prep champion who can solve a LeetCode Hard in their sleep, and the coding bootcamp graduate eager to write thousands of lines of code.&lt;/p&gt;

&lt;p&gt;Early in a software engineering journey, it's easy to mistake these milestones for the destination.&lt;/p&gt;

&lt;p&gt;I used to think that becoming a better engineer meant learning more languages, more frameworks, and solving more algorithmic problems.&lt;/p&gt;

&lt;p&gt;Then I started building larger applications.&lt;/p&gt;

&lt;p&gt;That's when I realized something that completely changed my perspective.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Building software is fundamentally not about writing code.&lt;/p&gt;

&lt;p&gt;Code is simply the artifact of engineering decisions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The real engineering happens long before a single keystroke hits the editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Syntax Trap
&lt;/h2&gt;

&lt;p&gt;Learning a programming language is largely a game of understanding syntax, keywords, standard libraries, and APIs.&lt;/p&gt;

&lt;p&gt;It's an essential first step, but it's still a tool-level skill.&lt;/p&gt;

&lt;p&gt;Knowing how to write a &lt;code&gt;for&lt;/code&gt; loop in Go, Rust, and TypeScript doesn't mean you know how to build a scalable data pipeline.&lt;/p&gt;

&lt;p&gt;It simply means you know how to express the same idea using different syntax.&lt;/p&gt;

&lt;p&gt;The same applies to Data Structures and Algorithms.&lt;/p&gt;

&lt;p&gt;DSA is incredibly valuable. It sharpens logical thinking and teaches you how to build efficient solutions.&lt;/p&gt;

&lt;p&gt;But after spending time on real projects, I noticed something.&lt;/p&gt;

&lt;p&gt;Very few production problems were caused by an inefficient sorting algorithm.&lt;/p&gt;

&lt;p&gt;Most of them looked like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tightly coupled modules.&lt;/li&gt;
&lt;li&gt;Fragile dependencies.&lt;/li&gt;
&lt;li&gt;Business logic scattered across the application.&lt;/li&gt;
&lt;li&gt;Architectures that resisted change.&lt;/li&gt;
&lt;li&gt;Development environments that didn't match production.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those aren't syntax problems.&lt;/p&gt;

&lt;p&gt;They're engineering problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shift Your Focus: Principles Over Syntax
&lt;/h2&gt;

&lt;p&gt;One of the biggest mindset shifts I experienced was realizing that languages and frameworks are temporary.&lt;/p&gt;

&lt;p&gt;The developers who consistently build great software aren't valuable because they know every framework.&lt;/p&gt;

&lt;p&gt;They're valuable because they understand the principles underneath them.&lt;/p&gt;

&lt;p&gt;When you prioritize mental models over framework-specific knowledge, moving between languages and technologies becomes much easier.&lt;/p&gt;

&lt;p&gt;You're no longer memorizing APIs.&lt;/p&gt;

&lt;p&gt;You're recognizing familiar ideas expressed through different tools.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Frameworks teach implementation. Principles teach engineering.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Three Things That Matter More Than Syntax
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Architectural Decisions
&lt;/h3&gt;

&lt;p&gt;The biggest difference between writing code and engineering software is thinking about how a system evolves.&lt;/p&gt;

&lt;p&gt;Good architecture isn't about using the latest design pattern.&lt;/p&gt;

&lt;p&gt;It's about making future change inexpensive.&lt;/p&gt;

&lt;p&gt;That means asking questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can this component evolve independently?&lt;/li&gt;
&lt;li&gt;Is my business logic isolated from infrastructure?&lt;/li&gt;
&lt;li&gt;Can I replace my database without rewriting my application?&lt;/li&gt;
&lt;li&gt;Will changing the UI affect my core domain?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Patterns like MVC, Clean Architecture, and Hexagonal Architecture aren't goals by themselves.&lt;/p&gt;

&lt;p&gt;They're tools for reducing coupling and making systems easier to change.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Thinking Beyond the Current Feature
&lt;/h3&gt;

&lt;p&gt;Every line of code becomes something that has to be maintained.&lt;/p&gt;

&lt;p&gt;Before implementing a feature, I've learned to ask questions first.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What happens when the data grows tenfold?&lt;/li&gt;
&lt;li&gt;Can this solution be tested independently?&lt;/li&gt;
&lt;li&gt;Does my local environment accurately represent production?&lt;/li&gt;
&lt;li&gt;Will another engineer understand why I made this decision two years from now?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Engineering is less about finding answers and more about asking better questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Technical Communication
&lt;/h3&gt;

&lt;p&gt;One lesson I underestimated early on was how much communication influences software quality.&lt;/p&gt;

&lt;p&gt;Readable code.&lt;/p&gt;

&lt;p&gt;Meaningful commit messages.&lt;/p&gt;

&lt;p&gt;Clear documentation.&lt;/p&gt;

&lt;p&gt;Consistent naming.&lt;/p&gt;

&lt;p&gt;These aren't soft skills.&lt;/p&gt;

&lt;p&gt;They're engineering practices.&lt;/p&gt;

&lt;p&gt;As Martin Fowler famously said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Software is read far more often than it's written.&lt;/p&gt;

&lt;p&gt;Making it understandable is part of the job.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Engineer's Mindset
&lt;/h2&gt;

&lt;p&gt;Looking back, I don't think learning programming languages or practicing DSA was the wrong approach.&lt;/p&gt;

&lt;p&gt;Those skills gave me a solid foundation.&lt;/p&gt;

&lt;p&gt;But they weren't the destination.&lt;/p&gt;

&lt;p&gt;The real growth started when I stopped asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How do I write this?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And started asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How should this system evolve?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That single shift changed how I approach software engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Languages will continue to evolve.&lt;/p&gt;

&lt;p&gt;Frameworks will come and go.&lt;/p&gt;

&lt;p&gt;Libraries will eventually be replaced.&lt;/p&gt;

&lt;p&gt;But thoughtful engineering remains timeless.&lt;/p&gt;

&lt;p&gt;Today, I measure progress differently.&lt;/p&gt;

&lt;p&gt;Not by how many languages I know.&lt;/p&gt;

&lt;p&gt;Not by how many frameworks I've used.&lt;/p&gt;

&lt;p&gt;But by how maintainable my systems are, how well they adapt to change, and how easily another engineer can understand what I've built.&lt;/p&gt;

&lt;p&gt;Because in the end, software engineering isn't about writing more code.&lt;/p&gt;

&lt;p&gt;It's about making better decisions before writing any code at all.&lt;/p&gt;




&lt;p&gt;What experience changed the way you think about software engineering? I'd love to hear your perspective in the comments.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
    </item>
    <item>
      <title>The Trap of "Perfect" Architecture: What Building a Shopping Cart Taught Me</title>
      <dc:creator>Habeeb Abdullahi</dc:creator>
      <pubDate>Sat, 30 May 2026 22:06:27 +0000</pubDate>
      <link>https://dev.to/engrwithhabeeb/the-trap-of-perfect-architecture-what-building-a-shopping-cart-taught-me-3ice</link>
      <guid>https://dev.to/engrwithhabeeb/the-trap-of-perfect-architecture-what-building-a-shopping-cart-taught-me-3ice</guid>
      <description>&lt;p&gt;Early in my journey as a software engineer, I became fascinated with software architecture.&lt;/p&gt;

&lt;p&gt;I spent hours learning about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SOLID Principles&lt;/li&gt;
&lt;li&gt;Clean Architecture&lt;/li&gt;
&lt;li&gt;Hexagonal Architecture&lt;/li&gt;
&lt;li&gt;Ports and Adapters&lt;/li&gt;
&lt;li&gt;Dependency Inversion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more I learned, the more I became convinced that every project should be highly decoupled, framework-agnostic, and future-proof.&lt;/p&gt;

&lt;p&gt;Then I built a shopping cart application.&lt;/p&gt;

&lt;p&gt;And that's when reality taught me a lesson that no book could.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building It "The Right Way"
&lt;/h2&gt;

&lt;p&gt;Instead of creating a straightforward React application, I decided to apply a strict layered architecture.&lt;/p&gt;

&lt;p&gt;My project was structured like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UI
│
Controllers
│
Application
│
Domain
│
Adapters
│
Infrastructure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every responsibility had its own layer.&lt;/p&gt;

&lt;p&gt;Every dependency pointed inward.&lt;/p&gt;

&lt;p&gt;Every interaction crossed carefully designed boundaries.&lt;/p&gt;

&lt;p&gt;At first, I loved it.&lt;/p&gt;

&lt;p&gt;The folder structure looked professional.&lt;/p&gt;

&lt;p&gt;The separation of concerns looked clean.&lt;/p&gt;

&lt;p&gt;The architecture looked impressive.&lt;/p&gt;

&lt;p&gt;Then I started building features.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architectural Tax
&lt;/h2&gt;

&lt;p&gt;A simple feature change often required updates across multiple layers.&lt;/p&gt;

&lt;p&gt;Something that should have taken minutes turned into a journey through several directories and files.&lt;/p&gt;

&lt;p&gt;I found myself spending more time maintaining architectural boundaries than solving actual problems.&lt;/p&gt;

&lt;p&gt;That's when I realized something important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Architecture isn't free.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every layer comes with a cost.&lt;/p&gt;

&lt;p&gt;Every abstraction comes with a cost.&lt;/p&gt;

&lt;p&gt;Every boundary comes with a cost.&lt;/p&gt;

&lt;p&gt;You pay for it with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More files&lt;/li&gt;
&lt;li&gt;More indirection&lt;/li&gt;
&lt;li&gt;More cognitive load&lt;/li&gt;
&lt;li&gt;More debugging effort&lt;/li&gt;
&lt;li&gt;Slower development velocity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture wasn't wrong.&lt;/p&gt;

&lt;p&gt;The problem was that the complexity of the architecture was greater than the complexity of the application itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Is a Budget, Not a Rulebook
&lt;/h2&gt;

&lt;p&gt;This realization completely changed how I think about software design.&lt;/p&gt;

&lt;p&gt;The question is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Is this architecture clean?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What problem is this architecture solving, and is that problem large enough to justify its cost?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A shopping cart application with a handful of features does not face the same challenges as a large enterprise system.&lt;/p&gt;

&lt;p&gt;Treating both projects the same way can actually make the smaller project harder to maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Framework-Agnostic Illusion
&lt;/h2&gt;

&lt;p&gt;One of my goals was to make the application completely independent of React.&lt;/p&gt;

&lt;p&gt;I wanted to be able to swap React for another framework in the future.&lt;/p&gt;

&lt;p&gt;In theory, that sounded like great engineering.&lt;/p&gt;

&lt;p&gt;In practice, I realized I was optimizing for a scenario that might never happen.&lt;/p&gt;

&lt;p&gt;The changes that are almost guaranteed to happen are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New features&lt;/li&gt;
&lt;li&gt;Requirement changes&lt;/li&gt;
&lt;li&gt;UI updates&lt;/li&gt;
&lt;li&gt;Bug fixes&lt;/li&gt;
&lt;li&gt;Refactoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A complete framework migration is usually much less likely.&lt;/p&gt;

&lt;p&gt;Today, I still keep business logic isolated, but I no longer try to abstract every single framework detail away.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Prefer Now
&lt;/h2&gt;

&lt;p&gt;My current frontend architecture is much simpler:&lt;/p&gt;

&lt;h3&gt;
  
  
  Domain
&lt;/h3&gt;

&lt;p&gt;Pure business logic.&lt;/p&gt;

&lt;p&gt;No React.&lt;/p&gt;

&lt;p&gt;No API calls.&lt;/p&gt;

&lt;p&gt;No UI concerns.&lt;/p&gt;

&lt;h3&gt;
  
  
  Infrastructure
&lt;/h3&gt;

&lt;p&gt;External systems such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API clients&lt;/li&gt;
&lt;li&gt;Storage&lt;/li&gt;
&lt;li&gt;Third-party services&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Hooks
&lt;/h3&gt;

&lt;p&gt;State management and orchestration.&lt;/p&gt;

&lt;p&gt;The bridge between the domain and the UI.&lt;/p&gt;

&lt;h3&gt;
  
  
  UI
&lt;/h3&gt;

&lt;p&gt;Presentation components.&lt;/p&gt;

&lt;p&gt;Focused on rendering and user interaction.&lt;/p&gt;

&lt;p&gt;Nothing more.&lt;/p&gt;

&lt;p&gt;This gives me most of the benefits I care about without introducing unnecessary complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Biggest Lesson
&lt;/h2&gt;

&lt;p&gt;The lesson wasn't that Hexagonal Architecture is bad.&lt;/p&gt;

&lt;p&gt;The lesson wasn't that Clean Architecture is wrong.&lt;/p&gt;

&lt;p&gt;The lesson was this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Architecture should solve real problems, not hypothetical ones.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes adding a boundary is the right decision.&lt;/p&gt;

&lt;p&gt;Sometimes removing a boundary is the right decision.&lt;/p&gt;

&lt;p&gt;The difficult part is knowing the difference.&lt;/p&gt;

&lt;p&gt;And that's not something you learn from reading alone.&lt;/p&gt;

&lt;p&gt;You learn it by building software, experiencing the friction, and understanding the trade-offs firsthand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Engineering maturity isn't about applying every design pattern you've learned.&lt;/p&gt;

&lt;p&gt;It's about understanding the cost and value of each decision.&lt;/p&gt;

&lt;p&gt;The goal isn't perfect architecture.&lt;/p&gt;

&lt;p&gt;The goal is reducing the cost of future change.&lt;/p&gt;

&lt;p&gt;Build.&lt;/p&gt;

&lt;p&gt;Ship.&lt;/p&gt;

&lt;p&gt;Learn.&lt;/p&gt;

&lt;p&gt;Then simplify.&lt;/p&gt;




&lt;p&gt;Have you ever realized you were over-engineering a project? What lesson did it teach you?&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>webdev</category>
      <category>software</category>
      <category>career</category>
    </item>
    <item>
      <title>JavaScript vs TypeScript? Maybe We’ve Been Asking the Wrong Question.</title>
      <dc:creator>Habeeb Abdullahi</dc:creator>
      <pubDate>Thu, 30 Apr 2026 12:23:08 +0000</pubDate>
      <link>https://dev.to/engrwithhabeeb/javascript-vs-typescript-maybe-weve-been-asking-the-wrong-question-3aei</link>
      <guid>https://dev.to/engrwithhabeeb/javascript-vs-typescript-maybe-weve-been-asking-the-wrong-question-3aei</guid>
      <description>&lt;p&gt;A lot of developers frame JavaScript vs TypeScript as a debate about which one is better or more professional.&lt;/p&gt;

&lt;p&gt;But in real-world systems, that question often misses the real issue.&lt;/p&gt;

&lt;p&gt;The difference between good and bad developers is rarely about the language. It is about understanding software design, data flow, and runtime behavior.&lt;/p&gt;

&lt;p&gt;Let’s look at a practical example.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Bad TypeScript (Type Safety Without Real Safety)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a common pattern&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/api/user/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;showUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;showUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;123&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What is wrong here&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On the surface this looks clean and type safe&lt;/p&gt;

&lt;p&gt;But in reality&lt;/p&gt;

&lt;p&gt;• The API response is not validated&lt;br&gt;
• The server could return null or incomplete data&lt;br&gt;
• TypeScript is being trusted blindly&lt;br&gt;
• Runtime errors are still possible&lt;/p&gt;

&lt;p&gt;This is what happens when TypeScript is used as a replacement for validation instead of a supplement&lt;/p&gt;



&lt;p&gt;✅ Better JavaScript (Safer Through Design)&lt;/p&gt;

&lt;p&gt;Now compare this approach&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`/api/user/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;isUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid user data received from API&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;showUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Failed to load user:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;showUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;123&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Why this JavaScript approach can actually be safer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;• It validates real runtime data instead of assumptions&lt;br&gt;
• It fails explicitly when something is wrong&lt;br&gt;
• It separates concerns between fetching, validation, and usage&lt;br&gt;
• It scales naturally into schema based systems like Zod or Joi&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The real takeaway&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;TypeScript improves &lt;strong&gt;developer experience and static safety&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;real world safety comes from architecture, validation, and understanding runtime behavior, not types alone.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd03mcu9zgt1w7n93ev57.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd03mcu9zgt1w7n93ev57.png" alt="A comparison of two security models: a cracked blue holographic shield labeled 'Type Safety' next to a solid, reinforced yellow vault door labeled 'Real Safety'" width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
You can write unsafe TypeScript and safe JavaScript.&lt;/p&gt;

&lt;p&gt;The difference is not the language.&lt;/p&gt;

&lt;p&gt;It is the engineering discipline behind it.&lt;/p&gt;




&lt;p&gt;If you are serious about frontend engineering, the real question is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;JavaScript or TypeScript&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do I understand what actually happens when my code runs?&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm6qik0gpzaxd6qk7ifnb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm6qik0gpzaxd6qk7ifnb.png" alt="A glowing vintage scale balancing a yellow JS cube and a blue TS cube, supported by a heavy mechanical base labeled 'Software Design &amp;amp; Fundamentals' and 'Real-World Safety'." width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What’s your take? Does TypeScript make better developers or do fundamentals matter more?&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>architecture</category>
      <category>typescript</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
