Unstuck

PM-ing sometimes can be tiring. I have been circling in the same movement.

The wait for strategic clarity is a joke. It never lands. Just empty torrents from upstairs who prefer ambiguity over accountability.

So we drown. Firefighting the daily chaos their vagueness spawns, chasing the phantom of inbox zero, rewriting the same meaningless docs over and over because no one will make a goddamn call.

This isn’t “proactive shaping.” It’s sheer survival.

Sure, anyone can follow a clear plan – that’s the easy part. 

But we’re forced to conjure one out of thin air because leadership won’t, or can’t. We learn to stop asking “What’s the direction?” – it’s a wasted question seeking clarity that never arrives.

Instead, we grit our teeth, build the damn raft ourselves, and shove it out saying, “Here. I mapped the chaos you’re ignoring. Poke holes, tear it down, do something – just give us a bearing so we can stop drowning.

It bleeds you dry. It’s exhausting, thankless work.

Carrying the weight of indecision, constantly course-correcting, buried under tactical emergencies while the strategy remains a ghost. Less product leadership, more glorified chaos janitor.

Understandably, it’s normal to feel stuck sometimes.

I need courage to leverage knowledge and experience to make decisions in an uncertain world. Doing nothing and hoping for direction is a terrible, terrible strategy.


Showing Up is Half the Battle

Hawking said that. And now here’s how to conquer the rest.

You’ve heard it a million times: “Showing up is half the battle.” And honestly? It’s not wrong. Just getting yourself to the starting line, whatever that looks like, is a genuine win against the forces of inertia and apathy.

Being present puts you in the game. It means you’ve overcome the first, often hardest, obstacle – the resistance to simply start. It builds a baseline of reliability that, frankly, many others fail to achieve. Opportunities don’t knock if you’re not even near the door.

So yes, give yourself credit for showing up. It matters. It builds momentum. It proves you’re willing. It’s the essential first step on any path worth taking.

But here’s the catch: it’s only half. Stop there, and you’re settling for mediocrity. You become part of the furniture – present, but not impactful. You risk stagnation, watching potential slip through your fingers because you were physically there but mentally checked out.

Winning the whole battle demands more than just presence. It demands intention. It demands engagement. It requires you to actively conquer the other, often more challenging, half.

Don’t just attend, engage. Dive into the conversation, listen with purpose, contribute your thoughts. Make your presence felt through active participation, not just by warming a seat.

Presence demands performance. Showing up consistently is vital, but pair it with consistent quality. Deliver work that matters, strive for excellence, and make your reliability count through tangible results.

Spotting problems is easy; anyone can do it. The real value lies in finding answers. Bring solutions to the table, even small ones. Show that you’re thinking ahead, not just reacting to what’s in front of you.

Don’t wait for instructions. Anticipate needs, identify opportunities, and take initiative. Proactive effort screams ownership and separates the contributors from the spectators.

Neutrality is forgettable. Aim for a positive impact. Be the collaborator people seek out, the supportive teammate, the constructive voice. Build energy, don’t just consume it.

Finally, don’t show up just to repeat yesterday. Use your presence to learn, adapt, and evolve. Stay curious, seek feedback, and embrace growth. Stagnation is the enemy of progress.

Showing up is half the battle – a crucial, non-negotiable half. But the real victory, the meaningful progress, the lasting impact? That comes from conquering the rest. Show up, then step up and win the whole damn thing.

Charge!


Compounding Effect

The idea of the ‘compounding effect’ often surfaces when we talk about money. Small sums, invested consistently, growing into surprising wealth over time. It’s a powerful concept.

But this quiet, relentless force reaches far beyond financial ledgers. Reflecting on it, I see it as a fundamental principle shaping our experiences, perhaps one of the unseen architects of the lives we actually build day by day.

It touches everything – our skills, our relationships, even our quiet regrets and hidden triumphs.

What strikes me most is its utter impartiality. Compounding doesn’t play favourites; it works with the same potent force whether we are building up or, sadly, tearing down.

Think of the positive side. Every small act of kindness offered, every page turned in a book, every hour dedicated to honing a craft, every mindful health choice – these are like small deposits into our future selves.

Individually, these actions can feel almost invisible, barely registering on the day’s scale.

Yet, diligently repeated, they build upon one another. They create a quiet momentum, often unseen at first.

Knowledge deepens, skills become instinct, trust solidifies, well-being improves – not always steadily, but often with an accelerating curve. These are the eventual rewards, sometimes blooming long after the initial efforts feel distant.

But this same powerful mechanism fuels the downward slope just as effectively.

A minor procrastination allowed to linger, a small neglect in a relationship, a harsh word spoken in haste, an unhealthy habit excused ‘just this once’ – these are also seeds sown.

They, too, compound. Trust doesn’t shatter instantly; it subtly erodes. Health doesn’t collapse overnight; it quietly degrades.

Opportunities aren’t always dramatically lost; sometimes they just silently slip away. Debts – both literal and metaphorical – can mount almost unseen.

The consequences arrive with equal force, often catching us off guard precisely because each individual misstep felt so trivial, so easy to dismiss at the time.

This lands us squarely at the significance of our choices. Good or bad.

Every decision we make, however seemingly small, feeds into this personal compounding equation. Each one is, in essence, a quiet vote cast for a particular kind of future.

Choosing the stairs instead of the lift, dedicating ten minutes to reading rather than scrolling, mustering the courage for a genuine apology, setting aside even a tiny sum – these aren’t random occurrences.

They are conscious (or sometimes unconscious) nudges, gently steering the trajectory of our health, our knowledge, our relationships, our financial stability.

And, naturally, the reverse holds true. Opting for inaction, choosing momentary indulgence over discipline, or allowing unkindness to pass our lips – these nudge the trajectory in another direction entirely.

Recognising this constant compounding force in my own life is both incredibly empowering and deeply sobering.

It pulls back the curtain, showing that extraordinary results seldom erupt from singular, grand gestures. More often, they are the quiet harvest grown from countless, consistent, seemingly small choices.

This realization lends a profound weight to our everyday actions and highlights the critical importance of simple awareness – of noticing the small things.

The future we step into tomorrow is largely the compounded interest earned on the decisions we are making today.

Whether we find ourselves building a life that feels like it’s flourishing or one quietly eroding, that unseen architect – the compounding effect – is perpetually at work, faithfully building upon the foundations we lay, choice by mindful (or mindless) choice.


Vibe Coding

Two weeks ago I started to noticed about something that’s both fascinating and slightly unsettling: vibe coding. And no, it’s not about writing code while listening to lo-fi beats (though that sounds nice too).

Vibe coding, as coined by Andrej Karpathy, is essentially “fully giving in to the vibes” and forgetting that code even exists. Instead of writing lines of code, you’re having a conversation with AI about what you want to build. It’s less about “how” and more about “what”.

Think about it: instead of googling Stack Overflow (that was so 2022, who’s still do that?) for the millionth time about that one CSS property you can never remember, you just tell an AI, “Make this button look cooler.” And it… just does it?

Even wild, you can make it independently execute 10 steps by itself.

The wild part is that it works. People are building entire applications without writing a single line of traditional code. It’s like having a really smart dev friend who does all the technical heavy lifting while you focus on the creative vision. I been using voice/STT as interface (because typing is slow) and AI IDE like Cursor since last year (even longer with voice as interface – almost 10 years till this date, can you believe it? **Dragon Dictate, hello!), and I agreed it was new paradigm even though I felt like I was cheating.

But here’s what fascinates me most: we’re moving from a world where coding was about speaking the computer’s language to one where computers are learning to speak ours. It’s not about syntax anymore—it’s about vibes.

Is this the future of software development? Maybe. Will it replace traditional coding? Probably not entirely. But it’s definitely changing how we think about building software. – I am firm believer the future is also agentic.

For now, I’m both excited and slightly terrified to see where this goes. After all, sometimes the best vibes come from understanding what’s happening under the hood.

What do you think about this shift? Are you ready to give in to the vibes?


ROI Over Use Cases

I’ve often found myself in what I now call “researcher’s syndrome” – that relentless urge to cover all angles, explore every possibility, and chase down every use case. As a PM, it felt natural: the more I knew, the better decisions I could make. Or so I thought. This is the story of how I learned that sometimes, less truly is more.

The Realization

In my early PM days, I was that person with sticky notes everywhere and a roadmap that looked like a tangled web of possibilities. I believed success meant creating products that solved every conceivable user need. My research was exhaustive, my feature sets were bloated, and honestly? My team was exhausted.

It wasn’t until a mentor @chuazm bluntly told me I was “trying to boil the ocean” that something clicked. The truth hit hard: in trying to solve everything, I was solving nothing particularly well. I also pickup new approach to first principal thinking with our EM @lsshawn.

Why Less Is More

Here’s what I’ve learned about focusing on what truly matters:

  1. Clarity Over Clutter
    When we focus on fewer features, we gain clarity about what our product actually stands for. It’s not about doing less work – it’s about doing better work. Apple’s approach to product design has been my north star here. Their relentless pursuit of simplicity isn’t just aesthetic; it’s strategic.
  2. Depth Over Breadth
    Think about Slack. They could’ve tried competing with full project management tools or email clients, but instead, they focused on one thing: making team communication seamless. This laser focus allowed them to excel where it mattered most.
  3. Strategic Alignment with ROI
    The shift from “What else can we add?” to “What will deliver the highest impact?” transformed my decision-making process. Not all features are created equal – some might delight users but barely move the needle on business metrics. Learning to differentiate between “nice to have” and “need to have” became crucial.

The Philosophy in Practice

Here’s how I’ve integrated this mindset into my work:

  • Start with Why: Every feature needs a clear purpose tied to user needs or business outcomes.
  • Kill Your Darlings: Regular roadmap audits are essential. Be ruthless about removing features that don’t add significant value.
  • Focus on Outcomes: Shift your thinking from features shipped to problems solved.

One of my proudest moments was when our team chose to improve an existing workflow used by 80% of our users instead of building a flashy new feature. The result? A 30% increase in user satisfaction. Sometimes the best solutions aren’t the most exciting ones.

A Closing Thought

Minimalism in product management isn’t about taking shortcuts – it’s about making deliberate choices that amplify impact. It’s recognizing that our resources are finite and choosing to use them wisely.

If you’re feeling overwhelmed by possibilities or paralyzed by options, remember this: success isn’t measured by how many features you ship, but by how well you solve real problems. Sometimes, doing less is the bravest – and smartest – choice we can make.

I’ve learned that my initial instinct to cover every base wasn’t just about thoroughness – it was about validation. But true impact comes from focusing on what matters most and executing it exceptionally well.

What could you achieve by doing less, but doing it better?

P/S: I got inspiration to write this after watch Arseny Shatokhin video on AI agent development.


To Code or Not to Code, Revisited

So, I ranted about code in static papers a while back (someone asked me about this – so I’d figure allow me to do a follow up), but what if your code is the real star of the show? Can you still sneak some in without drowning readers in curly braces?

Yes.

If your snippets are absolutely critical—like the secret sauce that everyone needs to see—fine, slip in a few lines. Just make them short and sweet. No one wants to navigate a labyrinth of semicolons; your readers only care about that one essential function or loop that proves your point. But don’t stop there: you still need to explain why those lines matter. If you’re showing off a special parsing trick or a brand-new algorithm, tell us why it’s special—don’t just paste it and pray.

Most importantly, provide a link to the full code in its natural habitat, whether that’s GitHub or another platform. Readers who truly want to dig deeper will thank you for letting them see—and run—the real thing, rather than forcing them to squint at a crammed PDF. Give context, give clarity, and keep the clutter to a minimum. After all, no one’s going to appreciate a code dump… not even your future self re-reading that paper.

Keep it stupid simple. KISS.


Living Dangerously

You know that feeling when you open your laptop in the morning, staring at the same desktop wallpaper you’ve had since 2016? That’s how many of us live our lives – in a comfortable, predictable loop that slowly drains the color from our days. I’ve been there, sitting in that ergonomic chair of safety, until I discovered something that changed everything: the art of living dangerously.

Now, before you picture me free-climbing Mount Bromo or swimming with dolphins, let me explain. Living dangerously isn’t about becoming an adrenaline junkie – it’s about embracing the electricity of uncertainty in our everyday choices. Think of it like upgrading from a basic smartphone to the latest model; sure, the old one works fine, but you’re missing out on features you didn’t even know you needed.

The Algorithm of Playing it Safe

We’re programmed to seek stability. Our brains run on what I call the “predictability protocol” – a set of neural pathways that prefer the known over the unknown. But just like any outdated software, this programming needs an upgrade. Living dangerously is about pushing that ‘update now’ button on your life, even when it’s inconvenient.

I remember when I was offered to lead a major tech project despite having zero experience with the core technology. My inner safety algorithm screamed “ERROR: INSUFFICIENT QUALIFICATIONS!” But here’s the thing about bold choices – they’re like quantum computers, operating in a space where traditional rules of success and failure don’t apply.

The Colorful Chaos of Bold Choices

When you start living dangerously, something magical happens. Life becomes high-definition, surround-sound spectacular.

Think about it: We’re floating on a rock through infinite space, orbiting a giant nuclear fusion reactor, and somehow we’ve convinced ourselves that playing it safe is the “logical” choice. It’s like having a ticket to the most spectacular show in the universe and spending the whole time scrolling through your phone.

Last year, I decided to embrace this absurdity. Instead of following my carefully plotted life trajectory (which, let’s be honest, was about as exciting as watching paint dry in slow motion), I started treating my existence like a series of thought experiments.

Think about the last time you took a real risk. Remember that flutter in your stomach? That’s not anxiety – it’s your internal GPS recalculating to accommodate new possibilities. The most vibrant moments in life often come wrapped in uncertainty, like mystery notifications you can’t ignore.

Your Personal Risk Operating System

Living dangerously doesn’t require a complete system override. Start with small program updates:

First, practice saying “yes” to the unknown. When I started attending random tech meetups outside my expertise, I felt like a MacBook at a Windows convention. But those uncomfortable moments led to some of my most valuable professional connections.

Learn to reframe fear as your personal beta testing phase. Every time you feel scared, you’re actually on the verge of a major upgrade in your capabilities. That presentation that terrifies you? It’s just your next feature release. That cereals 6 months past expiry date? probably nothing bad will happen.

Embrace failures as debug reports. Recently, I bombed a presentation so badly that someone actually started slow-clapping – and not in a good way. But that experience taught me more about public speaking than a dozen successful presentations ever could.

The Full Stack of Life

Here’s what I’ve learned: life is too short to run on safe mode. Living dangerously means becoming the beta tester of your own potential. It’s about running experimental code in the production environment of your life.

So, what’s your next bold commit going to be? What feature of yourself are you ready to push to production? Maybe it’s finally starting that side project, having that difficult conversation, or taking that class that intimidates you.

Remember: the most interesting bugs in life often lead to the most impressive features. The question isn’t whether you’ll encounter errors – it’s whether you’ll let them stop you from releasing your next version.

Your life is the most complex program you’ll ever run. Don’t let it become abandonware. Push updates regularly, test new features boldly, and never stop debugging your comfort zone. After all, the best software evolution happens outside the sandbox environment.

Ready to deploy your next bold choice? The command line is waiting for your input.

P/S: had fun with the copious SWE references in this post? I know, I know, so long with the quirkiness. It’s fun I’ll do it again next time. Thanks Claude.


Code in an Academic Paper? No, Thank You.

Let’s be brutally honest here: there’s something painfully awkward about stuffing blocks of code into an academic paper. You know the type—pages upon pages of impenetrable black text, each line looking more threatening than the last. And for what? So that the 1.5 people who might care can grab a magnifying glass and attempt to decipher your curly braces?

Why It’s a Bad Idea:

  1. No One Reads It
    You think your readers are going to flip through your 40-page magnum opus and pause to admire your meticulously spaced code? No—people skim for the interesting bits, like your hypothesis, your findings, and maybe your conclusion. Detailed code is about as riveting in paper format as reading a phone book.
  2. Adds Bulk, Not Value
    Sure, code inflates your paper’s page count. But more isn’t more if it’s meaningless. If the real purpose is clarity and sharing, then a massive code dump does neither. You’re better off providing a link to a GitHub repo or a supplementary file.
  3. Low Readability
    Code that reads well in your favorite IDE doesn’t magically transform into a well-structured exposition when copy-pasted into a PDF. Syntax highlighting is minimal, line breaks get weird, and crucial context is lost.

What to Do Instead:

  1. Diagram the Process
    A picture is worth a thousand lines of code. Creating a clear flowchart or system diagram not only looks neat on your poster or slides, but also helps people understand the logic.
  2. Explain the Thought Process
    Your paper should be about the why rather than the what. Readers want to know the reasoning behind your methods, the decisions that led you to that final algorithm, and how it ties back to your research question. This context is what sparks interest and fuels further discussion.
  3. Link to Repos
    If you really want to share the code (and believe me, that’s awesome for reproducibility!), pop it on a version control platform. Stick a tiny URL in your paper or slide deck, and voilà—everyone can explore your code if and when they want, in its natural habitat.

Bottom Line
Stop cramming lines of C++ or Python into that gorgeous LaTeX doc just so you can say, “Look, it’s all here.” It’s not a show of strength—it’s a show of clutter. Diagram it, explain your process, and let your readers actually learn something from your research. Because at the end of the day, clarity beats extra pages every time.

Whether it’s a corporate white paper, a thesis, or your team’s internal project report, spare your readers (and yourself) from the headache of static code dumps. Show the bigger picture with diagrams, share your insights, and let them chooseto view the code in a dynamic, interactive space if they want. That’s how you really add value—and no one will ever complain about too few pages!

And if the code is truly that interesting, trust me: your audience will thank you for a link instead of a messy PDF labyrinth.


Limits

I remember 2017 vividly. It was the year that taught me what being human truly means. Time is relentless, marching forward without pause. Reality hit me hard – we all have limits.

Looking back at my younger self in 2004 and 2014, I smile at my naive enthusiasm. Rest seemed like a weakness then. I was that person who believed in pushing boundaries without breaks. The world was mine to conquer.

Let me share something I’ve never told many people: I once had a panic attack ten minutes before a major presentation. My heart raced, hands trembled, and breath shortened. In that moment, all my preparation, all my confidence, melted away. Standing in the bathroom, staring at my reflection, I realized how fragile our minds can be despite our best preparations.

These moments of vulnerability teach us more than success ever could. Some days, giving 0% is all you can manage. The younger me would stay awake for three days straight, fueled by ambition and coffee. What a fool I was. Those marathon sessions came with a price – days of mental fog and exhaustion.

Your body whispers before it screams. I learned to listen to those whispers. Now, in my older years, wisdom has finally settled in. My body isn’t just a vehicle for my ambitions. I’ve learned to celebrate small victories, understanding that the journey matters more than the destination.

Goals still drive me, but they don’t consume me. Each tiny step forward deserves recognition. Sometimes, retreating isn’t defeat – it’s strategy. You don’t have to win every single battle.

Here in 2024, I’m still a student of life. Each day brings new lessons. My spiritual journey has deepened, and I understand now that growth isn’t always visible. The greatest lesson? Being human means embracing both strength and weakness.

We’re not machines. We’re wonderfully imperfect beings, learning as we go. And that’s perfectly okay.


Form Follows Function

As a product manager in a small team, I’ve learned to embrace simplicity. We don’t have dedicated UX researchers or product designers. But that’s okay.

The phrase “form follows function” has become our guiding principle. It’s more than just a design philosophy. It’s our survival strategy.

My journey here wasn’t straightforward. Previously, I was the typical overenthusiastic PM, trying to map out every user scenario before writing a single line of code. I’d spend weeks creating comprehensive requirement documents that attempted to address every edge case imaginable, only to find half of my assumptions were wrong.

Now, I’ve learned to start small and think bottom-up. We begin with the core problem and its simplest solution. Nothing more.

When resources are limited, you focus on what truly matters. What does the user need to accomplish? How can we make it work first, then make it beautiful?

Take our recent notification system redesign. Instead of planning for every notification type upfront, we started with just one: payment confirmations. We got it working perfectly, then gradually expanded to other types.

Each sprint teaches us something new about our users. Sometimes we get it wrong. That’s fine – we adjust and move forward.

Rather than conducting extensive user interviews, we now rely on quick feedback loops and usage data. When we launched our new dashboard, we started with just three essential metrics that users actually needed daily, rather than cramming in every possible data point.

Our software evolves like a sculpture. We start with rough shapes and basic functionality. Then we chip away at the unnecessary parts. We polish what remains.

The best solutions often emerge from constraints. Our limited resources push us to focus on essentials. Everything else is just decoration.

So we keep building, testing, and refining. Form follows function. Always.