<?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>Forem: Increase Akinwole</title>
    <description>The latest articles on Forem by Increase Akinwole (@increase123).</description>
    <link>https://forem.com/increase123</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3601514%2Fdc856cf2-a00a-4fb0-88ec-67e3b37a5f95.jpeg</url>
      <title>Forem: Increase Akinwole</title>
      <link>https://forem.com/increase123</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/increase123"/>
    <language>en</language>
    <item>
      <title>The AI Productivity Paradox: Why Developers Are 19% Slower (And What This Means for 2026)</title>
      <dc:creator>Increase Akinwole</dc:creator>
      <pubDate>Thu, 18 Dec 2025 15:55:39 +0000</pubDate>
      <link>https://forem.com/increase123/the-ai-productivity-paradox-why-developers-are-19-slower-and-what-this-means-for-2026-a14</link>
      <guid>https://forem.com/increase123/the-ai-productivity-paradox-why-developers-are-19-slower-and-what-this-means-for-2026-a14</guid>
      <description>&lt;p&gt;We've all heard the narrative: AI coding tools are revolutionizing software development, making us faster, more productive, and more creative. GitHub reports that 41% of new code is now AI-generated. Tool vendors tout massive productivity gains. And if you ask most developers, they'll tell you AI makes them faster.&lt;/p&gt;

&lt;p&gt;But here's the uncomfortable truth: &lt;strong&gt;They might all be wrong.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Study That's Making Everyone Uncomfortable
&lt;/h2&gt;

&lt;p&gt;In a rigorous randomized controlled trial conducted by METR (Model Evaluation &amp;amp; Threat Research) between February and June 2025, something shocking emerged. When 16 experienced open-source developers were given real tasks from their own repositories, projects they'd worked on for an average of five years, &lt;strong&gt;those using AI tools took 19% longer to complete their work.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let that sink in. Not 19% faster. &lt;strong&gt;19% slower.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But here's where it gets really interesting: Before the study, these developers predicted AI would make them 24% faster. Even &lt;em&gt;after&lt;/em&gt; experiencing the slowdown, they still believed AI had sped them up by 20%.&lt;/p&gt;

&lt;p&gt;This isn't just a measurement error. This is a &lt;strong&gt;39-percentage-point perception gap&lt;/strong&gt; between reality and belief.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Trust Crisis No One's Talking About
&lt;/h2&gt;

&lt;p&gt;The disconnect between perception and reality extends far beyond this single study. Google's 2024 DORA report, surveying over 39,000 professionals, revealed troubling patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;75% of developers &lt;em&gt;feel&lt;/em&gt; more productive with AI&lt;/li&gt;
&lt;li&gt;Yet every 25% increase in AI adoption showed a 1.5% dip in delivery speed&lt;/li&gt;
&lt;li&gt;System stability dropped by 7.2% with increased AI adoption&lt;/li&gt;
&lt;li&gt;Only 24% of developers report having "a great deal" or "a lot" of trust in AI-generated code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates a dangerous paradox: &lt;strong&gt;We're using tools we don't trust, believing they're helping us, while data suggests they're slowing us down.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Are We Actually Slower?
&lt;/h2&gt;

&lt;p&gt;The METR study identified five key factors contributing to the productivity loss:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;The Over-Optimism Trap&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Developers consistently overestimated AI's benefits. This persistent optimism meant they kept reaching for AI assistance even when it was counterproductive. It's like having a hammer and seeing every problem as a nail, except the nail gun is actually slower than doing it by hand.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Deep Repository Knowledge Defeats AI&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The study found that developers with high familiarity with their repositories were slowed down more. When you already know your codebase intimately, AI suggestions often miss crucial context. As one participant noted: &lt;em&gt;"AI doesn't pick the right location to make the edits"&lt;/em&gt; and lacks understanding of &lt;em&gt;"weird cases of backwards compatibility."&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;AI Struggles with Complexity&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The repositories averaged over 1.1 million lines of code and were approximately 10 years old. Developers reported that AI &lt;em&gt;"made some weird changes in other parts of the code that cost me time to find and remove."&lt;/em&gt; Current AI tools simply struggle with complex, mature codebases where everything is interconnected.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;The Acceptance Rate Problem&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Developers accepted less than 44% of AI-generated code suggestions. Even when accepted, 56% of developers reported needing to make major changes to clean up AI code. Think about that overhead: you're spending time reviewing, understanding, and fixing AI suggestions.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;The Review Tax&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Developers spent approximately 9% of their time just reviewing and cleaning AI-generated outputs. That's nearly 4 hours per week for a full-time developer, time that could have been spent writing code they understood from the start.&lt;/p&gt;

&lt;h2&gt;
  
  
  But Wait, Other Studies Show the Opposite?
&lt;/h2&gt;

&lt;p&gt;You're right to be skeptical. Microsoft's 2023 study showed developers completing tasks 55.8% faster with GitHub Copilot. Other research found a 26% increase in completed tasks.&lt;/p&gt;

&lt;p&gt;So what gives?&lt;/p&gt;

&lt;p&gt;The key difference is &lt;strong&gt;context and experience level&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Earlier studies often used simpler, self-contained tasks&lt;/li&gt;
&lt;li&gt;They measured less experienced developers working on unfamiliar codebases&lt;/li&gt;
&lt;li&gt;The tasks were algorithmic and well-scoped&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The METR study specifically tested experienced developers on their own mature projects, the real-world scenario most professional developers actually face. As the research notes, &lt;em&gt;"less experienced developers showed higher adoption rates and greater productivity gains."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Translation: AI might be a great tutor for beginners, but a questionable assistant for experts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 2025-2026 Reality Check: What Changed?
&lt;/h2&gt;

&lt;p&gt;Interestingly, Google's 2025 DORA report (released September 2025) shows a shift: AI adoption is now linked to &lt;em&gt;higher&lt;/em&gt; software delivery throughput, a reversal from 2024's findings. But stability concerns remain.&lt;/p&gt;

&lt;p&gt;What happened? A few things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tools got smarter.&lt;/strong&gt; Claude 3.7 Sonnet, GPT-4, and specialized coding agents emerged with better context understanding.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Developers got wiser.&lt;/strong&gt; There's a learning curve. Studies suggest it may take 11 weeks (or 50+ hours with a specific tool) to see meaningful productivity gains.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Best practices emerged.&lt;/strong&gt; The developer community figured out &lt;em&gt;when&lt;/em&gt; to use AI and when to skip it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  So When Does AI Actually Help?
&lt;/h2&gt;

&lt;p&gt;Based on the research, AI coding tools excel at:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boilerplate and repetitive code:&lt;/strong&gt; Writing CRUD operations, API endpoints, or standard patterns? AI shines here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unfamiliar territories:&lt;/strong&gt; Learning a new framework or language? AI can accelerate the learning curve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation and explanation:&lt;/strong&gt; Generating README files, inline comments, or understanding existing code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test generation:&lt;/strong&gt; Creating unit tests and test cases based on existing functions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simple, well-scoped tasks:&lt;/strong&gt; Clear requirements with minimal context? AI can handle it.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Stay Human
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Complex, interconnected systems:&lt;/strong&gt; Your 5-year-old monolith with tribal knowledge? AI will struggle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security-critical code:&lt;/strong&gt; AI-generated code has been found to introduce more privilege escalation paths (322% more) and design flaws (153% more).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When you know the answer:&lt;/strong&gt; If you already have deep familiarity with the solution, AI will slow you down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quality over speed contexts:&lt;/strong&gt; When code quality, maintainability, and long-term thinking matter most.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 2026 Playbook: Using AI Responsibly
&lt;/h2&gt;

&lt;p&gt;Here's how to actually benefit from AI coding tools in 2026:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Treat AI as a Junior Developer&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Never accept the first suggestion. Review, understand, and refine. Would you merge a junior dev's code without review? Then don't do it with AI.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Context is King&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Start by documenting your codebase thoroughly. Well-documented code helps AI generate better suggestions. As Google engineers found: document early to get better output later.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Break Tasks Into Stages&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Don't ask for entire modules in one shot. Instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask AI to outline the approach&lt;/li&gt;
&lt;li&gt;Request detailed pseudocode&lt;/li&gt;
&lt;li&gt;Generate implementation in chunks&lt;/li&gt;
&lt;li&gt;Review and integrate piece by piece&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Use the Right Tool for the Job&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inline completion&lt;/strong&gt; (Copilot, Cursor autocomplete): For simple functions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chat/generation&lt;/strong&gt; (Claude, GPT-4): For explaining concepts, planning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic tools&lt;/strong&gt; (Claude Code, Windsurf): For multi-file refactors&lt;/li&gt;
&lt;li&gt;Don't use AI at all: When you know exactly what to do&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Measure What Matters&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Stop tracking "lines of code generated" or "suggestions accepted." Instead, measure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Time to merge (cycle time)&lt;/li&gt;
&lt;li&gt;Code review comments and issues&lt;/li&gt;
&lt;li&gt;Post-merge bugs and reverts&lt;/li&gt;
&lt;li&gt;Developer satisfaction and flow state&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. &lt;strong&gt;Establish Team Standards&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;AI amplifies your development culture. If your processes are messy, AI will make them messier. Invest in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clear coding standards&lt;/li&gt;
&lt;li&gt;Documented architectural decisions&lt;/li&gt;
&lt;li&gt;Consistent error handling patterns&lt;/li&gt;
&lt;li&gt;Security guidelines&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. &lt;strong&gt;Practice Fundamentals&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Don't let AI atrophy your skills. As one engineer noted after relying heavily on AI: &lt;em&gt;"Things that used to be instinct became manual, sometimes even cumbersome."&lt;/em&gt; Continue practicing the grunt work regularly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bigger Picture: What This Means for 2026
&lt;/h2&gt;

&lt;p&gt;The AI productivity paradox teaches us an important lesson: &lt;strong&gt;We're in the middle of a fundamental shift in how software gets built&lt;/strong&gt;, and we're still figuring out the rules.&lt;/p&gt;

&lt;p&gt;Here's what to expect in 2026:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;More Specialization&lt;/strong&gt;: Tools will get better at specific tasks. We'll see AI that's great at testing, AI that's great at refactoring, and AI that's great at documentation, not one tool trying to do everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better Context Management&lt;/strong&gt;: The 200K+ token context windows we're seeing now will become standard. Tools will maintain better understanding of entire codebases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Human-AI Collaboration Patterns&lt;/strong&gt;: Clear playbooks will emerge for when to use AI and when to go manual. The "vibes-based coding" phase will mature into structured practices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skill Evolution&lt;/strong&gt;: The most valuable developers won't be those who generate the most AI code, they'll be those who know when to trust it, when to question it, and how to integrate it responsibly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;AI coding tools aren't magic productivity multipliers, at least not yet, and not for everyone. They're powerful but immature technologies that work best in specific contexts.&lt;/p&gt;

&lt;p&gt;The 19% slowdown isn't a death knell for AI coding tools. It's a reality check. It tells us:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Perception isn't reality.&lt;/strong&gt; Just because you &lt;em&gt;feel&lt;/em&gt; faster doesn't mean you &lt;em&gt;are&lt;/em&gt; faster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Experience matters.&lt;/strong&gt; What works for beginners doesn't work the same way for experts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context is everything.&lt;/strong&gt; AI needs more information than we initially thought to be truly helpful.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality takes time.&lt;/strong&gt; The time you save generating code gets spent reviewing and fixing it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As we move into 2026, the winners won't be the developers who blindly adopt every AI tool. They'll be the ones who thoughtfully integrate AI where it helps, skip it where it doesn't, and maintain the fundamental skills that make them effective engineers.&lt;/p&gt;

&lt;p&gt;The productivity paradox isn't a problem to solve, it's a reality to navigate. And navigating it well might just be the most important skill you develop this year.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Vibe Coding vs Traditional Development: Finding Your Balance</title>
      <dc:creator>Increase Akinwole</dc:creator>
      <pubDate>Tue, 09 Dec 2025 12:03:05 +0000</pubDate>
      <link>https://forem.com/increase123/vibe-coding-vs-traditional-development-finding-your-balance-3gj4</link>
      <guid>https://forem.com/increase123/vibe-coding-vs-traditional-development-finding-your-balance-3gj4</guid>
      <description>&lt;p&gt;Last Tuesday at 2 AM, I shipped a feature in 3 hours that would've taken me two days using my "proper" development workflow. The code worked perfectly. The users loved it. But my dev brain kept screaming: "Where are your tests? What about the documentation? Did you even plan this?"&lt;/p&gt;

&lt;p&gt;Welcome to the eternal struggle between vibe coding and traditional development.&lt;/p&gt;

&lt;p&gt;If you've been in the dev community lately, you've probably heard about "vibe coding", that magical state where you just &lt;em&gt;flow&lt;/em&gt; with the code, trusting intuition over rigid processes. But here's the thing: both approaches have their place, and knowing when to use each one might be the most valuable skill you can develop.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are We Really Comparing?
&lt;/h2&gt;

&lt;p&gt;Before we dive in, let's define what we're actually talking about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Traditional Development&lt;/strong&gt; is the structured approach most of us learned in school or bootcamps. It emphasizes planning, documentation, testing, code reviews, and following established patterns. Think TDD, design documents, and those three-hour architecture meetings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vibe Coding&lt;/strong&gt; is the intuitive, flow-state approach where you trust your instincts and just build. It's about momentum over methodology, shipping over perfection, and letting your subconscious developer brain take the wheel. Less planning, more doing.&lt;/p&gt;

&lt;p&gt;Neither is inherently better. They're tools, and like any tool, they shine in different situations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Case for Traditional Development
&lt;/h2&gt;

&lt;p&gt;Let's be honest: traditional development practices exist for good reasons. They're battle-tested solutions to real problems that have cost companies millions of dollars.&lt;/p&gt;

&lt;h3&gt;
  
  
  When Traditional Development Wins
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Working on critical systems&lt;/strong&gt;: When you're touching payment processing, medical records, or anything where bugs can harm people or cost serious money, you need that safety net. Write those tests. Do those code reviews. Plan meticulously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Large team collaboration&lt;/strong&gt;: When 20 developers are working on the same codebase, you need structure. Without conventions, clear documentation, and proper planning, you'll spend more time fixing conflicts than building features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Long-term maintainability&lt;/strong&gt;: That clever hack you vibe-coded at 2 AM? Future you (or worse, your teammate) will hate you for it. Traditional practices ensure code remains understandable and maintainable months or years later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complex architecture decisions&lt;/strong&gt;: When you're designing a microservices architecture or choosing a database strategy, you can't just vibe it. These decisions have long-term consequences that require careful analysis.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Hidden Costs of "Proper" Development
&lt;/h3&gt;

&lt;p&gt;But traditional development isn't free. Every process has overhead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Planning meetings that could've been async messages&lt;/li&gt;
&lt;li&gt;Writing tests for code that might get thrown away tomorrow&lt;/li&gt;
&lt;li&gt;Documentation that's outdated before it's even reviewed&lt;/li&gt;
&lt;li&gt;Code review cycles that kill momentum and context&lt;/li&gt;
&lt;li&gt;Analysis paralysis from trying to predict every edge case&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I once spent three weeks on a "properly planned" feature with full test coverage and documentation. The stakeholder changed their mind two days after launch. All that careful work? Wasted.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Case for Vibe Coding
&lt;/h2&gt;

&lt;p&gt;Vibe coding gets a bad rap from the "serious developers," but it's how some of the best software gets built. It's not about being sloppy—it's about optimizing for different constraints.&lt;/p&gt;

&lt;h3&gt;
  
  
  When Vibe Coding Wins
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Prototyping and MVPs&lt;/strong&gt;: When you're validating an idea, speed trumps everything. Ship fast, learn fast, iterate fast. Nobody needs unit tests for a prototype that might be scrapped tomorrow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solo projects and side hustles&lt;/strong&gt;: When you're the only developer and the stakes are low, why burden yourself with enterprise processes? Trust your judgment and move fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creative exploration&lt;/strong&gt;: Sometimes you don't know what you're building until you build it. Vibe coding lets you discover solutions through experimentation rather than upfront planning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small, isolated features&lt;/strong&gt;: That new button on your dashboard? The email notification template? These don't need architecture review meetings. Just build it and ship it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;High-context, low-complexity work&lt;/strong&gt;: When you deeply understand the domain and the change is straightforward, formal processes just slow you down.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Vibe Coding Gets Right
&lt;/h3&gt;

&lt;p&gt;Vibe coding recognizes some truths that traditional development often ignores:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flow state is real and valuable&lt;/strong&gt;: When you're in the zone, you can accomplish in 2 hours what would take 8 hours with constant interruptions for standup, code review, and planning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Perfect is the enemy of shipped&lt;/strong&gt;: Working software in users' hands beats perfect software in your head every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context is expensive&lt;/strong&gt;: Every meeting, every code review round, every context switch costs you precious mental bandwidth. Sometimes the fastest path forward is just heads-down building.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your intuition is trained&lt;/strong&gt;: After years of coding, your gut instincts are informed by countless experiences. Trust them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reality: You Need Both
&lt;/h2&gt;

&lt;p&gt;Here's what I've learned after bouncing between startups and enterprise roles: the best developers aren't purists. They're pragmatists who know when to vibe and when to be rigorous.&lt;/p&gt;

&lt;h3&gt;
  
  
  My Personal Framework
&lt;/h3&gt;

&lt;p&gt;I use what I call the "consequence-complexity matrix" to decide my approach:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Low consequence + Low complexity = Pure vibe coding&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI tweaks&lt;/li&gt;
&lt;li&gt;Internal tools&lt;/li&gt;
&lt;li&gt;Quick fixes&lt;/li&gt;
&lt;li&gt;Experimental features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;High consequence + Low complexity = Vibe with safety nets&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add basic tests&lt;/li&gt;
&lt;li&gt;Quick peer review&lt;/li&gt;
&lt;li&gt;But keep the momentum&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Low consequence + High complexity = Structured vibe&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rough plan or diagram&lt;/li&gt;
&lt;li&gt;Code freely within that structure&lt;/li&gt;
&lt;li&gt;Refactor as you learn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;High consequence + High complexity = Full traditional&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proper design phase&lt;/li&gt;
&lt;li&gt;Test-driven development&lt;/li&gt;
&lt;li&gt;Thorough code review&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Real-World Examples
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Vibe coding win&lt;/strong&gt;: I built an internal dashboard for our support team in a single afternoon. No tests, minimal planning, just vibes. It's been running for two years with zero issues because the domain was simple and the stakes were low.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Traditional development win&lt;/strong&gt;: When we rewrote our authentication system, we spent a week planning, another week implementing with TDD, and had three rounds of security review. Overkill? No. That code handles thousands of users' sensitive data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hybrid approach&lt;/strong&gt;: For our new feature flagging system, I vibe-coded a prototype in a day to validate the approach. Then we threw it away and built the production version properly over two weeks with full test coverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding Your Balance
&lt;/h2&gt;

&lt;p&gt;Here's how to develop your own sense of when to use each approach:&lt;/p&gt;

&lt;h3&gt;
  
  
  Start with self-awareness
&lt;/h3&gt;

&lt;p&gt;Ask yourself honestly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How well do I understand this problem?&lt;/li&gt;
&lt;li&gt;What happens if this breaks?&lt;/li&gt;
&lt;li&gt;Am I building to learn or building to ship?&lt;/li&gt;
&lt;li&gt;Will anyone else need to maintain this?&lt;/li&gt;
&lt;li&gt;Is this experimental or foundational?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Develop your gut check
&lt;/h3&gt;

&lt;p&gt;Before starting any task, pause for 30 seconds and ask: "What's the appropriate level of rigor here?" Your instinct will get better with practice.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create safety valves
&lt;/h3&gt;

&lt;p&gt;Even when vibe coding, have some guardrails:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use TypeScript or another typed language (catches obvious bugs)&lt;/li&gt;
&lt;li&gt;Write integration tests for critical paths (even if you skip unit tests)&lt;/li&gt;
&lt;li&gt;Do quick self-reviews before pushing (catch the obvious mistakes)&lt;/li&gt;
&lt;li&gt;Keep a "tech debt" list (acknowledge what you're skipping)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Timebox your vibes
&lt;/h3&gt;

&lt;p&gt;Give yourself permission to vibe code for a fixed period. "I'll build this feature in 2 hours with pure vibes. If it works, great. If not, I'll restart with proper planning." This prevents vibe coding from becoming reckless coding.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learn to shift gears
&lt;/h3&gt;

&lt;p&gt;The best developers can switch modes mid-project. Start with vibe coding to explore the solution space, then switch to traditional development once you know what you're building. Or vice versa: plan the architecture properly, then vibe code the implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Common Pitfalls
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Vibe Coding Gone Wrong
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The rewrite trap&lt;/strong&gt;: You vibe code something quickly, it grows, and eventually you need to rewrite it properly. Sometimes that's fine (validate fast, rebuild right). Sometimes it's wasteful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The maintenance nightmare&lt;/strong&gt;: Future you trying to debug vibe-coded spaghetti at 3 AM is not a fun experience. Leave yourself breadcrumbs—at least some comments explaining the why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The scope creep&lt;/strong&gt;: Vibe coding feels so productive that you keep adding features without stopping to question if they're needed. Momentum is great until you build the wrong thing really fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  Traditional Development Gone Wrong
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Process theater&lt;/strong&gt;: Following processes because "that's how we do things" rather than because they add value. If your standup is just people reading their Jira tickets, you're doing it wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Premature optimization&lt;/strong&gt;: Planning for scale you'll never reach, abstracting before you understand the problem, building frameworks when you need features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Innovation paralysis&lt;/strong&gt;: When everything requires an RFC, three meetings, and a committee decision, you'll never ship the weird experimental feature that becomes your killer feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools That Help Both Approaches
&lt;/h2&gt;

&lt;p&gt;Interestingly, modern tools are making it easier to get the best of both worlds:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI assistants&lt;/strong&gt; (Claude, Copilot, Cursor) let you vibe code faster while still maintaining quality. They help you write tests quickly, suggest edge cases, and catch bugs—the safety nets without the overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Type systems&lt;/strong&gt; give you compile-time guarantees even when you're moving fast. TypeScript lets you vibe code with confidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hot reload and fast feedback loops&lt;/strong&gt; mean you can experiment freely and catch mistakes immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linting and formatting tools&lt;/strong&gt; handle the boring stuff automatically, letting you focus on the interesting problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Current Balance
&lt;/h2&gt;

&lt;p&gt;These days, I spend about 60% of my time vibe coding and 40% in traditional mode. But it varies wildly by project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Side projects? 90% vibe coding, 10% "let me at least write a README"&lt;/li&gt;
&lt;li&gt;Startup features? 70% vibe, 30% structure&lt;/li&gt;
&lt;li&gt;Enterprise work? 30% vibe, 70% traditional&lt;/li&gt;
&lt;li&gt;Open source? 50/50, because others need to understand my code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key insight: I'm &lt;em&gt;consciously choosing&lt;/em&gt; my approach based on context, not just defaulting to one style.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Meta Skill
&lt;/h2&gt;

&lt;p&gt;Here's the real secret: the skill isn't mastering vibe coding or traditional development. It's developing the judgment to know which tool to use when.&lt;/p&gt;

&lt;p&gt;Some developers are incredible at traditional development but get bogged down in process when they should just ship. Others are vibe coding wizards who create maintenance nightmares because they never slow down to do things properly.&lt;/p&gt;

&lt;p&gt;The developers I most admire? They can switch effortlessly between modes. They vibe code their way through exploratory work, then lock in with rigorous practices when they find something worth building properly. They know when tests add value and when they're just ceremony.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Action Plan
&lt;/h2&gt;

&lt;p&gt;If you're trying to find your balance, here's what I suggest:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Track your work for a week&lt;/strong&gt;: Note which tasks you vibe coded and which got the full treatment. Did you choose appropriately?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Experiment deliberately&lt;/strong&gt;: Pick a task you'd normally over-engineer and just vibe it. Pick another you'd normally vibe and do it properly. How did it feel? What did you learn?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Get feedback&lt;/strong&gt;: Ask teammates or users which of your shipped features feel solid and which feel hacky. You might be surprised.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build your rubric&lt;/strong&gt;: Develop your own decision framework. Mine is consequence-complexity, but yours might be different based on your context.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Forgive yourself&lt;/strong&gt;: You'll sometimes choose wrong. That's fine. The goal is to improve your batting average, not be perfect.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Vibe coding and traditional development aren't enemies. They're different tools in your toolkit, each optimized for different situations.&lt;/p&gt;

&lt;p&gt;The worst developers are the ones who only know one approach and try to apply it everywhere. The best developers are pragmatists who choose their methodology based on context, not ideology.&lt;/p&gt;

&lt;p&gt;So the next time you're starting a task, pause and ask: "What does this need?" Sometimes the answer is proper planning and rigorous testing. Sometimes it's throwing on some lo-fi beats and vibing your way to a solution in one flow state session.&lt;/p&gt;

&lt;p&gt;Both are valid. Both are professional. Both are necessary.&lt;/p&gt;

&lt;p&gt;The magic happens when you know which one to use.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>vibecoding</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>Building Your First MCP Server: A Complete Beginner's Guide</title>
      <dc:creator>Increase Akinwole</dc:creator>
      <pubDate>Tue, 02 Dec 2025 15:16:56 +0000</pubDate>
      <link>https://forem.com/increase123/building-your-first-mcp-server-a-complete-beginners-guide-760</link>
      <guid>https://forem.com/increase123/building-your-first-mcp-server-a-complete-beginners-guide-760</guid>
      <description>&lt;p&gt;If you've been exploring AI development, you've probably heard about the Model Context Protocol (MCP). But what exactly is it, and how do you build your own MCP server? In this guide, we'll walk through creating your first MCP server from scratch, no prior experience required.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is MCP?
&lt;/h2&gt;

&lt;p&gt;The Model Context Protocol is an open standard that enables AI assistants like Claude to securely connect with external data sources and tools. Think of it as a universal adapter that lets AI models interact with your applications, databases, and services in a standardized way.&lt;/p&gt;

&lt;p&gt;Before MCP, integrating AI with different tools meant building custom solutions for each integration. MCP provides a unified protocol that makes these connections simpler and more maintainable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We're Building
&lt;/h2&gt;

&lt;p&gt;We'll create a simple weather MCP server that provides current weather information. This server will expose a tool that Claude can use to fetch weather data for any city. It's a perfect first project because it's practical, straightforward, and demonstrates all the core MCP concepts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before we start, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js installed (version 18 or higher)&lt;/li&gt;
&lt;li&gt;Basic knowledge of JavaScript/TypeScript&lt;/li&gt;
&lt;li&gt;A code editor (VS Code recommended)&lt;/li&gt;
&lt;li&gt;An API key from OpenWeatherMap (free tier works fine)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Set Up Your Project
&lt;/h2&gt;

&lt;p&gt;First, create a new directory and initialize a Node.js project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;weather-mcp-server
&lt;span class="nb"&gt;cd &lt;/span&gt;weather-mcp-server
npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install the required dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @modelcontextprotocol/sdk
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; typescript @types/node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a &lt;code&gt;tsconfig.json&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compilerOptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ES2022"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Node16"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"moduleResolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Node16"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"outDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rootDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./src"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"strict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"esModuleInterop"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"skipLibCheck"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"include"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"src/**/*"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Understanding MCP Server Structure
&lt;/h2&gt;

&lt;p&gt;An MCP server has three main components:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Resources&lt;/strong&gt;: Read-only data that the AI can access (like files or database records)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;: Functions that the AI can execute (like searching, creating, or updating data)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompts&lt;/strong&gt;: Pre-built prompt templates the AI can use&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For our weather server, we'll focus on creating a tool since we want Claude to actively fetch weather data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Create the Server
&lt;/h2&gt;

&lt;p&gt;Create a &lt;code&gt;src&lt;/code&gt; directory and add an &lt;code&gt;index.ts&lt;/code&gt; file:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Server&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/sdk/server/index.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StdioServerTransport&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/sdk/server/stdio.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;CallToolRequestSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;ListToolsRequestSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/sdk/types.js&lt;/span&gt;&lt;span class="dl"&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;WEATHER_API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OPENWEATHER_API_KEY&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="nx"&gt;WEATHER_API_KEY&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;OPENWEATHER_API_KEY environment variable is required&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="c1"&gt;// Create the MCP server&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;weather-server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.0.0&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="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;tools&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// List available tools&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setRequestHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ListToolsRequestSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;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="na"&gt;tools&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;get_weather&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Get current weather information for a city&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;inputSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&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="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The city name (e.g., 'London', 'New York')&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="p"&gt;},&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;city&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="p"&gt;},&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="c1"&gt;// Handle tool execution&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setRequestHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CallToolRequestSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&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;get_weather&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kr"&gt;string&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="nx"&gt;city&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;City parameter is required&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;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Fetch weather data from OpenWeatherMap API&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&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;`https://api.openweathermap.org/data/2.5/weather?q=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;encodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nx"&gt;city&lt;/span&gt;
        &lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;appid=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;WEATHER_API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;units=metric`&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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&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="s2"&gt;`Weather API error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusText&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="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;response&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;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;content&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="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;city&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="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;temperature&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="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;feels_like&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="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;feels_like&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;humidity&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="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;humidity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;description&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="nx"&gt;weather&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;wind_speed&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="nx"&gt;wind&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="p"&gt;},&lt;/span&gt;
              &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="mi"&gt;2&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="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;error&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="s2"&gt;`Failed to fetch weather data: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;
          &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;error&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="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&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="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="s2"&gt;`Unknown tool: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&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="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Start the server&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;main&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;transport&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StdioServerTransport&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transport&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;Weather MCP Server running on stdio&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="nf"&gt;main&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;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;Fatal error in main():&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Understanding the Code
&lt;/h2&gt;

&lt;p&gt;Let's break down what's happening:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server Initialization&lt;/strong&gt;: We create a new MCP server with a name and version, specifying that it has tool capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ListToolsRequestSchema Handler&lt;/strong&gt;: This tells Claude what tools are available. We define a &lt;code&gt;get_weather&lt;/code&gt; tool with a clear description and input schema that specifies it needs a city name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CallToolRequestSchema Handler&lt;/strong&gt;: This is where the actual work happens. When Claude calls our tool, we fetch data from the OpenWeatherMap API and return formatted results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transport&lt;/strong&gt;: We use &lt;code&gt;StdioServerTransport&lt;/code&gt; which allows the server to communicate via standard input/output, making it easy to integrate with Claude.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Build and Configure
&lt;/h2&gt;

&lt;p&gt;Add build scripts to your &lt;code&gt;package.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tsc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node build/index.js"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"module"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Build your server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6: Get Your API Key
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://openweathermap.org/api" rel="noopener noreferrer"&gt;OpenWeatherMap&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sign up for a free account&lt;/li&gt;
&lt;li&gt;Navigate to your API keys section&lt;/li&gt;
&lt;li&gt;Copy your API key&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 7: Connect to Claude Desktop
&lt;/h2&gt;

&lt;p&gt;To use your MCP server with Claude Desktop, you need to configure it. Create or edit the Claude Desktop configuration file:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On macOS&lt;/strong&gt;: &lt;code&gt;~/Library/Application Support/Claude/claude_desktop_config.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On Windows&lt;/strong&gt;: &lt;code&gt;%APPDATA%\Claude\claude_desktop_config.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Add your server configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"weather"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/absolute/path/to/your/weather-mcp-server/build/index.js"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"OPENWEATHER_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your_api_key_here"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;/absolute/path/to/your/weather-mcp-server&lt;/code&gt; with the actual path to your project and &lt;code&gt;your_api_key_here&lt;/code&gt; with your OpenWeatherMap API key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 8: Test Your Server
&lt;/h2&gt;

&lt;p&gt;Restart Claude Desktop. You should now be able to ask Claude questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What's the weather in Tokyo?"&lt;/li&gt;
&lt;li&gt;"Can you check the current temperature in Paris?"&lt;/li&gt;
&lt;li&gt;"Tell me about the weather conditions in Lagos"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claude will automatically use your MCP server to fetch real-time weather data!&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding What Just Happened
&lt;/h2&gt;

&lt;p&gt;When you ask Claude about the weather:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Claude recognizes it needs weather information&lt;/li&gt;
&lt;li&gt;It discovers your &lt;code&gt;get_weather&lt;/code&gt; tool through the MCP protocol&lt;/li&gt;
&lt;li&gt;It calls the tool with the appropriate city parameter&lt;/li&gt;
&lt;li&gt;Your server fetches data from OpenWeatherMap&lt;/li&gt;
&lt;li&gt;The results are returned to Claude&lt;/li&gt;
&lt;li&gt;Claude presents the information in a natural, conversational way&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Common Issues and Solutions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Server not appearing in Claude&lt;/strong&gt;: Make sure you've restarted Claude Desktop after editing the config file, and check that the path to your server is absolute, not relative.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API errors&lt;/strong&gt;: Verify your OpenWeatherMap API key is correct and that you've activated it (it can take a few minutes after signing up).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TypeScript errors&lt;/strong&gt;: Ensure you're using Node.js 18 or higher and that all dependencies are installed correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;Congratulations! You've built your first MCP server. Here are some ways to extend it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add more weather endpoints (forecast, air quality, historical data)&lt;/li&gt;
&lt;li&gt;Implement caching to reduce API calls&lt;/li&gt;
&lt;li&gt;Add error handling for invalid city names&lt;/li&gt;
&lt;li&gt;Create additional tools for related functionality&lt;/li&gt;
&lt;li&gt;Add resources to provide weather data access patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where to Go From Here
&lt;/h2&gt;

&lt;p&gt;The MCP ecosystem is growing rapidly. Here are some resources to continue your journey:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;Official MCP Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/modelcontextprotocol" rel="noopener noreferrer"&gt;MCP GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/modelcontextprotocol/servers" rel="noopener noreferrer"&gt;Community MCP Servers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building MCP servers opens up endless possibilities for enhancing AI capabilities. Whether you're connecting to databases, APIs or custom business logic, the pattern you've learned here applies universally.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>mcp</category>
      <category>programming</category>
    </item>
    <item>
      <title>JavaScript Build Tools: Past and Beyond</title>
      <dc:creator>Increase Akinwole</dc:creator>
      <pubDate>Tue, 25 Nov 2025 15:37:38 +0000</pubDate>
      <link>https://forem.com/increase123/javascript-build-tools-past-and-beyond-34ni</link>
      <guid>https://forem.com/increase123/javascript-build-tools-past-and-beyond-34ni</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;If you've been writing JavaScript for more than a few years, you've probably experienced the dizzying evolution of build tools. From manually concatenating files to modern zero-config bundlers, the JavaScript ecosystem has been on a relentless quest to make our development experience faster, simpler, and more powerful.&lt;/p&gt;

&lt;p&gt;In this article, we'll journey through the history of JavaScript build tools, understand why each generation emerged, and explore what the future holds for frontend tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Early Days: Manual Concatenation and Task Runners
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before Build Tools (Pre-2010)
&lt;/h3&gt;

&lt;p&gt;In the early days of web development, JavaScript files were simply linked in HTML with multiple script tags. As applications grew, this approach became problematic with issues like global namespace pollution, dependency management nightmares, and slow page loads from multiple HTTP requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  Grunt (2012): The Task Runner Era
&lt;/h3&gt;

&lt;p&gt;Grunt introduced configuration-based task automation to JavaScript. You could define tasks for minification, compilation, linting, and more through a Gruntfile.&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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;grunt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;grunt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;uglify&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/*.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;build/app.min.js&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="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;grunt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadNpmTasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;grunt-contrib-uglify&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;grunt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerTask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;default&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;uglify&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it emerged:&lt;/strong&gt; Developers needed automation for repetitive tasks like minification and file watching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitations:&lt;/strong&gt; Configuration files became massive and complex. Tasks ran sequentially, making builds slow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gulp (2013): Streaming Build System
&lt;/h3&gt;

&lt;p&gt;Gulp improved upon Grunt by using Node.js streams and code-over-configuration philosophy, making builds faster and more intuitive.&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;const&lt;/span&gt; &lt;span class="nx"&gt;gulp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gulp&lt;/span&gt;&lt;span class="dl"&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;uglify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gulp-uglify&lt;/span&gt;&lt;span class="dl"&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;concat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gulp-concat&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;gulp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;scripts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&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;gulp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;src&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/*.js&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="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app.js&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="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;uglify&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gulp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;build&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Innovation:&lt;/strong&gt; Streaming architecture and cleaner API made it faster and more developer-friendly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Module Bundler Revolution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Browserify (2011): Bringing Node.js to the Browser
&lt;/h3&gt;

&lt;p&gt;Browserify allowed developers to use Node.js-style &lt;code&gt;require()&lt;/code&gt; statements in browser code, pioneering the concept of bundling.&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="c1"&gt;// Now you could write browser code like Node.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;utils&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./utils&lt;/span&gt;&lt;span class="dl"&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;lodash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lodash&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;Game changer:&lt;/strong&gt; Module system in the browser before ES6 modules existed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Webpack (2012): The Bundler King
&lt;/h3&gt;

&lt;p&gt;Webpack transformed how we think about frontend assets. Everything became a module - JavaScript, CSS, images, fonts. It introduced concepts like code splitting, tree shaking, and hot module replacement.&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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./src/index.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bundle.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dist&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="na"&gt;module&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;rules&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="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;css$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;style-loader&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;css-loader&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="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.(&lt;/span&gt;&lt;span class="sr"&gt;png|jpg|gif&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;file-loader&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="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&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 it dominated:&lt;/strong&gt; Incredibly powerful and flexible, with a massive plugin ecosystem. It could handle any asset type and supported advanced features like lazy loading and HMR.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The catch:&lt;/strong&gt; Configuration complexity became legendary. Webpack configs could easily grow to hundreds of lines.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rollup (2015): Optimized for Libraries
&lt;/h3&gt;

&lt;p&gt;Rollup focused on producing smaller, cleaner bundles using ES6 modules and advanced tree-shaking. It became the go-to choice for library authors.&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/main.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bundle.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;esm&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Sweet spot:&lt;/strong&gt; Excellent for libraries and packages that needed minimal, clean output.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Modern Era: Speed and Simplicity
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Parcel (2017): Zero Configuration
&lt;/h3&gt;

&lt;p&gt;Parcel promised "blazing fast, zero configuration web application bundler." It automatically detected dependencies and transformed files without requiring configuration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# That's it. No config file needed.&lt;/span&gt;
parcel index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Philosophy:&lt;/strong&gt; Convention over configuration. Just point it at your entry file and go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Innovation:&lt;/strong&gt; Multi-core compilation and filesystem caching made it incredibly fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  Snowpack (2020): Unbundled Development
&lt;/h3&gt;

&lt;p&gt;Snowpack took a radical approach by leveraging native ES modules in the browser, skipping bundling entirely during development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key insight:&lt;/strong&gt; Modern browsers support ES modules natively. Why bundle during development at all?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Near-instant startup and updates, regardless of project size.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vite (2020): The New Standard
&lt;/h3&gt;

&lt;p&gt;Created by Evan You (Vue.js creator), Vite combined the best ideas from previous tools with native ESM during development and Rollup for production builds.&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="c1"&gt;// vite.config.js - minimal config&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;react&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@vitejs/plugin-react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;react&lt;/span&gt;&lt;span class="p"&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 developers love it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lightning-fast cold starts and hot module replacement&lt;/li&gt;
&lt;li&gt;Simple configuration with sensible defaults&lt;/li&gt;
&lt;li&gt;Framework-agnostic but with great framework support&lt;/li&gt;
&lt;li&gt;Production builds optimized with Rollup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Development experience:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm create vite@latest my-app
&lt;span class="nb"&gt;cd &lt;/span&gt;my-app
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;span class="c"&gt;# Server running in milliseconds, not seconds&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  esbuild (2020): Written in Go for Speed
&lt;/h3&gt;

&lt;p&gt;esbuild rewrote the bundler in Go, achieving speeds 10-100x faster than JavaScript-based bundlers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benchmark reality check:&lt;/strong&gt; What took Webpack 10 seconds might take esbuild 0.1 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt; Fewer features and plugins than mature bundlers, but many tools now use it internally for speed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Turbopack (2022): Rust-Powered Successor
&lt;/h3&gt;

&lt;p&gt;Vercel announced Turbopack as "the successor to Webpack," written in Rust for maximum performance. Currently integrated into Next.js.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Promise:&lt;/strong&gt; 700x faster updates than Webpack, 10x faster than Vite for large applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current State: What Should You Use Today?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For New Projects
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vite:&lt;/strong&gt; Best all-around choice for most frontend projects. Fast, simple, excellent DX.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next.js/Remix/SvelteKit:&lt;/strong&gt; Framework-specific solutions that handle bundling for you.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For Libraries
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rollup or esbuild:&lt;/strong&gt; Produce clean, optimized packages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tsup:&lt;/strong&gt; Modern, simple library builder powered by esbuild.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For Large Monorepos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Turborepo + Vite/esbuild:&lt;/strong&gt; Orchestration with fast builds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nx:&lt;/strong&gt; Complete monorepo solution with caching and task scheduling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Legacy Projects
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Webpack:&lt;/strong&gt; Still perfectly fine if already set up. Webpack 5 is stable and performant.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Looking Beyond: The Future of Build Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Native Tooling Integration
&lt;/h3&gt;

&lt;p&gt;Browsers continue improving native ES module support and import maps, potentially reducing bundling needs further.&lt;/p&gt;

&lt;h3&gt;
  
  
  WebAssembly Tooling
&lt;/h3&gt;

&lt;p&gt;More tools will be written in compiled languages (Rust, Go) for native-level performance. SWC (Rust-based) is already replacing Babel in many projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Edge Computing Optimization
&lt;/h3&gt;

&lt;p&gt;Build tools are evolving to optimize for edge deployments, with features like automatic code splitting for serverless functions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unified Toolchains
&lt;/h3&gt;

&lt;p&gt;Projects like Biome aim to replace multiple tools (ESLint, Prettier, bundlers) with single, fast solutions.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI-Assisted Optimization
&lt;/h3&gt;

&lt;p&gt;Future tools might use AI to automatically optimize bundle splitting, lazy loading strategies, and performance based on real usage patterns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Lessons from the Evolution
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Developer Experience Matters:&lt;/strong&gt; Tools that are easier to configure and faster to run win adoption.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Performance is Non-Negotiable:&lt;/strong&gt; Each generation of tools gets dramatically faster. Users won't tolerate slow builds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Defaults Over Configuration:&lt;/strong&gt; Modern tools succeed by making the right choices by default while still allowing customization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Native Platform Features:&lt;/strong&gt; As browsers evolve, build tools adapt to leverage new capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. The Best Tool is the One You Don't Notice:&lt;/strong&gt; The ideal build tool works so seamlessly you forget it exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Migration Advice
&lt;/h2&gt;

&lt;p&gt;If you're on Webpack and considering a migration:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to stay:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your current setup works fine&lt;/li&gt;
&lt;li&gt;Complex custom configurations that would be hard to replicate&lt;/li&gt;
&lt;li&gt;Team familiarity and no pain points&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to migrate:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Starting a new project&lt;/li&gt;
&lt;li&gt;Build times are causing productivity issues&lt;/li&gt;
&lt;li&gt;Seeking simpler configuration&lt;/li&gt;
&lt;li&gt;Want better developer experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Migration path:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Try Vite on a small new feature or side project&lt;/li&gt;
&lt;li&gt;Measure the difference in build times and DX&lt;/li&gt;
&lt;li&gt;Plan incremental migration if beneficial&lt;/li&gt;
&lt;li&gt;Keep Webpack knowledge - it's not going away soon&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The evolution of JavaScript build tools reflects our industry's relentless focus on improving developer experience and performance. We've gone from manually concatenating files to sub-second rebuilds of massive applications.&lt;/p&gt;

&lt;p&gt;Today, tools like Vite offer the best balance of speed, simplicity, and power for most projects. But the landscape continues evolving, with even faster tools emerging and new approaches being explored.&lt;/p&gt;

&lt;p&gt;The key is choosing tools that match your project's needs and team's expertise rather than chasing the newest shiny object. Sometimes Webpack is still the right choice. Sometimes you need Vite's speed. And sometimes, for simple projects, you might not need a bundler at all.&lt;/p&gt;

&lt;p&gt;What's your experience with JavaScript build tools? Have you made any migrations recently? Share your stories in the comments below!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>A Beginner-Friendly Guide to TypeScript (What I Wish I Knew Earlier)</title>
      <dc:creator>Increase Akinwole</dc:creator>
      <pubDate>Fri, 21 Nov 2025 14:34:35 +0000</pubDate>
      <link>https://forem.com/increase123/a-beginner-friendly-guide-to-typescript-what-i-wish-i-knew-earlier-56oc</link>
      <guid>https://forem.com/increase123/a-beginner-friendly-guide-to-typescript-what-i-wish-i-knew-earlier-56oc</guid>
      <description>&lt;p&gt;When I first started learning TypeScript, I thought it was “just JavaScript with extra rules.”&lt;br&gt;
But the deeper I went, the more I realised TypeScript isn’t just a tool, it’s a mindset.&lt;/p&gt;

&lt;p&gt;If you’re new to it, this post will save you the confusion I went through and give you a smooth entry into TypeScript.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Is TypeScript?
&lt;/h2&gt;

&lt;p&gt;In simple terms:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;TypeScript = JavaScript + types + better developer experience&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It helps you catch bugs early, write clearer code, and avoid accidental mistakes.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why TypeScript Matters
&lt;/h2&gt;

&lt;p&gt;Here’s what I wish I understood from day one:&lt;br&gt;
&lt;strong&gt;1. TypeScript makes your code predictable&lt;/strong&gt;&lt;br&gt;
No more guessing what a function returns or what type of data a variable holds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Fewer runtime errors&lt;/strong&gt;&lt;br&gt;
TS catches issues before your code runs.&lt;br&gt;
That alone saves hours of debugging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Better autocomplete&lt;/strong&gt;&lt;br&gt;
Your editor becomes smarter.&lt;br&gt;
Auto-suggestions, type hints and documentation right inside VS Code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Makes teamwork easier&lt;/strong&gt;&lt;br&gt;
Other developers understand your code faster when types are clear.&lt;/p&gt;
&lt;h2&gt;
  
  
  TypeScript Basics (Explained Simply)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Type Annotations&lt;/strong&gt;&lt;br&gt;
You can tell TS the type of a variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let age: number = 24;
let username: string = "John";
let isLoggedIn: boolean = true;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Arrays&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let scores: number[] = [10, 20, 30];
let names: string[] = ["John", "Jane"];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Objects&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let user: { name: string; age: number } = {
  name: "John",
  age: 24
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Functions&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function greet(name: string): string {
  return `Hello, ${name}`;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Union Types&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let id: number | string;
id = 12;
id = "12";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Interfaces (Your New Best Friend)&lt;/strong&gt;&lt;br&gt;
Interfaces let you create a structure that many objects can follow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface User {
  name: string;
  age: number;
  isAdmin?: boolean; // optional property
}

const admin: User = {
  name: "John",
  age: 24,
  isAdmin: true
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes your code more organised and scalable.&lt;/p&gt;

&lt;h2&gt;
  
  
  TypeScript With React (A Quick Taste)
&lt;/h2&gt;

&lt;p&gt;If you’re using React, TS helps you avoid a lot of confusion.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type ButtonProps = {
  label: string;
  onClick: () =&amp;gt; void;
};

function Button({ label, onClick }: ButtonProps) {
  return &amp;lt;button onClick={onClick}&amp;gt;{label}&amp;lt;/button&amp;gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now React knows exactly what the component expects, no more guessing.&lt;/p&gt;

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

&lt;p&gt;You don’t need to &lt;em&gt;master&lt;/em&gt; TypeScript before using it.&lt;br&gt;
The real magic happens when you start building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;add types gradually&lt;/li&gt;
&lt;li&gt;use your editor hints&lt;/li&gt;
&lt;li&gt;let TypeScript guide you
And with time, everything clicks.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;TypeScript isn’t difficult. Once you get comfortable with its structure, your code becomes cleaner, safer and more enjoyable to write.&lt;/p&gt;

&lt;p&gt;If you’re a beginner, here’s my advice:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Start small. Build often. Let TypeScript teach you as you go.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>typescript</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How I Transitioned Into Software Engineering (Coming From Architecture)</title>
      <dc:creator>Increase Akinwole</dc:creator>
      <pubDate>Wed, 19 Nov 2025 17:55:14 +0000</pubDate>
      <link>https://forem.com/increase123/how-i-transitioned-into-software-engineering-coming-from-architecture-4b0m</link>
      <guid>https://forem.com/increase123/how-i-transitioned-into-software-engineering-coming-from-architecture-4b0m</guid>
      <description>&lt;p&gt;When people hear that I studied Architecture for my BSc, they’re always surprised when I introduce myself today as a Software Engineer.&lt;br&gt;
To many, the two fields feel worlds apart, one deals with buildings, the other with code.&lt;/p&gt;

&lt;p&gt;But in reality, the transition wasn’t as strange as it sounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Background: From Buildings to Code
&lt;/h2&gt;

&lt;p&gt;I spent years learning architectural design, drawings, modelling, building science and how to bring concepts to life. Architecture teaches structure, logic, precision and the importance of breaking big ideas into small, buildable units.&lt;/p&gt;

&lt;p&gt;Funny enough…&lt;br&gt;
that’s exactly what software engineering requires too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Moment I Realized Architecture Wasn’t My Final Destination
&lt;/h2&gt;

&lt;p&gt;At some point during my degree, I realized I enjoyed creating, but not just buildings. I wanted something more dynamic, something that allowed me to build faster, explore ideas quickly and bring solutions to life without waiting months or years.&lt;/p&gt;

&lt;p&gt;I discovered programming accidentally.&lt;br&gt;
The first time I saw a simple “Hello World,” it felt like magic — &lt;em&gt;instant creation.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Early Struggles
&lt;/h2&gt;

&lt;p&gt;Transitioning wasn’t smooth:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I had to learn to think like a developer.&lt;/li&gt;
&lt;li&gt;Debugging made me question all my life choices.&lt;/li&gt;
&lt;li&gt;JavaScript humbled me more times than I can count.&lt;/li&gt;
&lt;li&gt;I felt behind because others started earlier.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But one thing architecture taught me was discipline.&lt;br&gt;
You don’t survive architecture school without resilience, and that helped me survive learning to code.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Architecture Secretly Prepared Me for Software Engineering
&lt;/h2&gt;

&lt;p&gt;Looking back, I realized Architecture gave me several advantages:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Design Thinking&lt;/strong&gt;&lt;br&gt;
In architecture, you learn to understand user flow, space usage and human behavior.&lt;br&gt;
In software, it became intuitive for me to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;structure UI layouts,&lt;/li&gt;
&lt;li&gt;think about user experience,&lt;/li&gt;
&lt;li&gt;and design clean, logical systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Breaking Down Complex Projects&lt;/strong&gt;&lt;br&gt;
Architectural projects are huge.&lt;br&gt;
You learn to break things into drawings, layers, components and stages.&lt;/p&gt;

&lt;p&gt;This made it easier to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;components in React&lt;/li&gt;
&lt;li&gt;modular code&lt;/li&gt;
&lt;li&gt;large software systems&lt;/li&gt;
&lt;li&gt;project management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Attention to Detail&lt;/strong&gt;&lt;br&gt;
Architecture forces you to think in precision, one small mistake affects the whole building.&lt;/p&gt;

&lt;p&gt;That mindset helped me write cleaner, more readable code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Turning Point
&lt;/h2&gt;

&lt;p&gt;The moment everything clicked was when I finally built my first functional project, something small but it worked.&lt;br&gt;
And that feeling of bringing something to life through code was addictive.&lt;/p&gt;

&lt;p&gt;From there:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I studied consistently&lt;/li&gt;
&lt;li&gt;built projects&lt;/li&gt;
&lt;li&gt;improved my portfolio&lt;/li&gt;
&lt;li&gt;and slowly grew into the engineer I am today&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Learned (That I Wish I Knew Sooner)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Consistency beats intensity&lt;/strong&gt;&lt;br&gt;
You don’t need 10 hours a day, just 3–4 focused hours done consistently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. You don’t need to know everything before building&lt;/strong&gt;&lt;br&gt;
Start building early. Projects teach more than tutorials.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Google, StackOverflow and documentation are your best friends&lt;/strong&gt;&lt;br&gt;
Real engineers search every day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Impostor syndrome is normal&lt;/strong&gt;&lt;br&gt;
If you feel like you don’t know enough, congratulations — you’re a developer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Your background is a strength, not a disadvantage&lt;/strong&gt;&lt;br&gt;
Architecture didn’t hold me back, it made me unique.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Switching careers isn’t easy, but it’s possible.&lt;br&gt;
My journey from Architecture to Software Engineering taught me that your degree doesn’t define your future, your willingness to learn does.&lt;/p&gt;

&lt;p&gt;If you’re transitioning from a completely different field too, remember:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You don’t start from zero. You start from experience.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
