Back Then: Just Make It Run, Ship the Features, Hit the Store
Eight years ago, when I built my first professional app, my mindset was pretty simple: as long as the app runs, the features are complete, and it's ready to ship to the store โ that's a win.
Back then, Stack Overflow and official docs were my primary lifelines. I wasn't too concerned about best practices. Fast forward to today, and my perspective has shifted completely.
Now, before I write a single line of code, my main focus is on user impact: does this feature genuinely align with what the UI/UX team has mapped out? Will it deliver the right outcome and actually help the people using it? The same goes for the technical side โ the question I ask myself is: "Will this code still be easy to maintain and structurally sound when it becomes legacy someday?"
- 01Focus on clickable UI & running features
- 02Quick copy-paste from Stack Overflow
- 03Quick spot-testing on a single emulator
- 04Build release binary & ship to store ๐
- 01Understand business problem & real user needs
- 02In-depth alignment with UI/UX & Product
- 03Design modular, testable & maintainable code
- 04Prepare mitigation plans & error fallbacks
Excited, But Forgot About Maintenance: Lessons from a Messy Codebase
Early in my career, the excitement of shipping a working hybrid app often made me overlook something critical: maintainability. Since I didn't fully understand the importance of a clean structure back then, the codebase quickly became a mess.
Every class was written in a different style, so whenever a bug appeared, I'd find myself lost trying to track it down โ and the refactoring process was completely out of control.
The breaking point came when a bug slipped all the way into production. The panic was real. Honestly, I hadn't prepared any mitigation plan for when things went wrong in a live environment.
Inconsistent Code Styles
Each class followed a different pattern with no team standard
Tight Hidden Coupling
Modifying one screen unexpectedly broke unrelated screens
Live Production Leak
Uncaught edge case slipped directly into real user devices
Panic With Zero Mitigation
No error fallbacks or observability in place for live crises
Core Lesson: Mitigation is not an afterthought โ preparing fallback paths is a fundamental developer responsibility.
As the App Grew: Time to Fix the Architecture
Over time, as the app scaled, I started feeling real technical fatigue. The best analogy I can think of is a car that looks incredibly sporty on the outside โ but the moment you open the hood, the wiring is tangled and all over the place.
The consequence? Fixing even a small bug took way more time and effort than it should. That's when I realized this couldn't go on.
After getting a few recommendations, I started making serious changes โ learning about scalable, modular, and maintainable architecture. The goal was to make things easier for the whole team when handling bugs or shipping new features, while also making sure coding standards were consistent and well-documented across the board.
Modern UI, smooth transitions, rich feature set. From the outside, the application looks like a race car ready to go.
- โTangled wiring with tightly coupled logic
- โFixing small bugs breaks three other components
- โNew developers struggle to trace code flow
- โSeparated layers: Presentation โ Domain โ Data
- โConsistent coding standards & safe refactoring
- โFast feature delivery without unexpected side-effects
Beyond the Code: When Collaboration Becomes Your Core Work
Once the technical side was in better shape, did everything suddenly click? Not quite.
I started realizing that my day-to-day wasn't just about writing code and submitting daily reports anymore. There was another layer of work โ one that actually takes more time but is far more important: collaborative brainstorming with the UI/UX and Product teams.
At this stage, we weren't just asking "How do we build this feature?" โ we were asking "Is the effort worth the impact it'll have on users?" So now I'm a lot more deliberate before jumping into execution, with the goal of avoiding wasted UI design effort or experiences that just don't feel right for the people using the product.
Subtle UX improvements that instantly remove user friction.
Core feature builds or architectural refactoring for long-term scale.
Minor polish handled when there is spare sprint bandwidth.
Complex features rarely used by users โ must be challenged and re-scoped with PM & Design!
What I'm Taking Away from 8+ Years of This
To summarize, here are the key takeaways I've gathered from this journey:
A good app isn't just about code that runs โ it's about how easy it is to maintain. Good code is code that's readable, understandable, and extendable by anyone on the team.
The work outside the code matters just as much as the code itself. Brainstorming sessions, discussions with the UI/UX and Product teams, and a solid grasp of business logic often save us from building things that waste effort or miss the mark.
Mitigation is non-negotiable in production environments. Don't wait for a bug to blow up in production before you start thinking about it. Having a clear handling and mitigation plan from the start is a mark of professional responsibility.
Technology keeps changing, but a strong problem-solving mindset is timeless. Frameworks and tools will come and go, but the ability to think critically and approach problems with structure โ that's the real asset of a developer.
Closing Thoughts
Eight-plus years in mobile development has taught me that being a senior developer isn't just about how sophisticated your code is โ it's about how much impact you deliver, both for the people using your app and for the team working alongside you. There's still a long road ahead, and there's always something new to learn every single day.
Thanks for reading my story :)
P.S. This is my very first published article on this blog. It feels great to finally start documenting and sharing reflections from my engineering journey. If you have any thoughts, feedback, or just want to swap mobile dev stories, feel free to reach out and connect!
