Skip to main content

I created my first native app and now I know what I hate about web development

So, I finally did it. After years of wrangling with web development—the land of never-ending “next sprints” and “feature enhancements”—I created my first native app. And guess what? It’s like stepping out of a chaotic family dinner into a zen garden. Don’t get me wrong, I’ll always have a complicated love-hate relationship with web dev (it’s like that one ex who keeps texting you), but native app development? That’s a whole different story.

Why web development feels like a treadmill

Web dev is a never-ending loop. You launch something, and before you can celebrate, there’s a new feature request, an unexpected bug report, or a browser update that breaks everything (hi, Safari).

Here’s my favorite kind of chaos:

// Start with something simple
function fetchData() {
  return fetch('/api/data')
    .then(response => response.json())
    .then(data => console.log(data));
}

// A week later... "Add caching, please."
function fetchDataWithCache() {
  if (localStorage.getItem('data')) {
    return Promise.resolve(JSON.parse(localStorage.getItem('data')));
  }

  return fetch('/api/data')
    .then(response => response.json())
    .then(data => {
      localStorage.setItem('data', JSON.stringify(data));
      return data;
    });
}

// Two weeks later... "What if the user is offline?"

It’s exhausting. There’s no finish line—just more work. Every bug you fix or feature you add feels like slapping duct tape on a moving train. No matter how much you polish, there’s always something new to break.

Why native apps feel different

When I started building my native app, I wasn’t sure what to expect. Would it be another endless project? Nope. It actually felt… complete. Like putting together a puzzle and placing the final piece.

Here’s the kind of simplicity I’m talking about:

// A straightforward Swift function
func calculateSum(_ numbers: [Int]) -> Int {
    return numbers.reduce(0, +)
}

let result = calculateSum([1, 2, 3, 4, 5])
print(result) // Output: 15

No “what if” scenarios. No hacks for obscure devices. Just clean, functional code. When it worked, it worked. Done.

Okay, fine, debugging in Xcode made me want to throw my laptop across the room, but that’s just part of the charm, right?

It’s not all sunshine and rainbows

Don’t get me wrong, native apps have their quirks. Submitting to the App Store is like jumping through flaming hoops while juggling knives. And let’s not even talk about provisioning profiles. But these hurdles feel… purposeful. They’re one-time struggles, not the constant maintenance hamster wheel of web development.

The beauty of being “done”

When my app was finished, I actually got to sit back and enjoy the work. That’s the thing with native apps—you can reach a point where you call it “done.” Sure, there might be updates down the road, but it’s not the endless treadmill of tweaks, patches, and performance optimizations.

Web development? It’s like trying to keep a house clean while someone keeps throwing mud through the windows. Native development? It’s more like building a cabin in the woods. Once it’s done, you get to step back and admire your work (until the bears show up, aka OS updates).

So, what now?

Does this mean I’m ditching web development? Nah. It’s still part of what I do. But I’ll definitely think twice before signing up for another “small” web project that spirals into a three-year commitment.

For now, I’m just going to bask in the joy of having built something that I can call “finished.” Well, at least until I decide it needs dark mode…