Mulualem Eshetu

@mulualem.bsky.social

Software engineer working on AI products. I write about UX, agentic AI, and how complex systems reach users. 🔗 mulualem.dev

One of my favorite Git workflows just became a native Github feature. 𝗦𝘁𝗮𝗰𝗸𝗲𝗱 𝗣𝗥𝘀. I never used Graphite, I manually chained branches. One desktop feature I built ended up being 18+ stacked PRs. Smaller diffs. Better reviews. Easier merges.

Bild

𝗢𝗻𝗲 𝘁𝗵𝗶𝗻𝗴 𝘀𝘂𝗿𝗽𝗿𝗶𝘀𝗲𝗱 𝗺𝗲. The more AI helps me write code... the more valuable engineering judgment becomes. Knowing how to build something matters. Knowing whether to build it matters even more.

Bild

𝗧𝗵𝗶𝘀 𝗳𝗲𝗹𝘁 𝘄𝗿𝗼𝗻𝗴 𝗮𝘁 𝗳𝗶𝗿𝘀𝘁. I used to feel guilty asking AI so many questions. Then I realized... I'm not outsourcing my thinking. I'm accelerating it. There's a huge difference.

Bild

𝗡𝗼𝗯𝗼𝗱𝘆 𝘄𝗮𝗿𝗻𝘀 𝘆𝗼𝘂 𝗮𝗯𝗼𝘂𝘁 𝘁𝗵𝗶𝘀. The better you get as an engineer... the less time you spend writing code. You spend more time reading. Thinking. Questioning requirements. Reviewing. Simplifying. Saying "no." Funny enough... writing code became the easiest part of my job.

Bild

The weird thing about AI: The more I build, the more I ask myself "What do I actually know?" I might not remember every syntax or API anymore. But I know how to think, debug, simplify, and make decisions. Maybe that's the skill that matters now.

Bild

Nobody tells you this. The hardest bugs aren't the ones that take days to fix. They're the ones that make you question everything you changed. Sometimes the fix is one line. Finding that one line is the hard part.

Most link shorteners have a hidden business model: Your audience's data. We didn't like that. So we started building TrimLink with a simple rule: Analytics without surveillance. No IP. No cookies. No fingerprinting. No consent banners. Just links. What are you using to shorten links today?

Bild

Working on AI products taught me something: The goal isn't to use AI everywhere, the goal is to use AI where uncertainty exists. Search, filtering, permissions, and business rules are usually better handled by code.

The older I get as an engineer, the less I care about clever code. I care more about: - code others can understand - code I can understand 6 months later - code that solves the actual problem Simple scales surprisingly well.

A few years ago, I thought good engineers were the ones who knew the most. Today, I think good engineers are the ones who learn the fastest. Technology changes. Tools change. Requirements change, the ability to adapt is what compounds over time.

Working around AI every day taught me something unexpected The biggest productivity boost isn't getting AI to write code, It's getting AI to help you think. - Brainstorming. - Debugging. - Exploring options. - Reviewing ideas. The coding part is only a small piece of the puzzle.

Bild

One thing I've learned after a few years of building products Coding is rarely the hard part, the hard part is: - understanding the problem - handling edge cases - making changes without breaking things - keeping the code maintainable months later

I needed to reuse a component across apps. Simple, right? Except it lived in the wrong package layer. It imported auth hooks and UI components directly from one app. Everything tangled together. To extract it, I had to replace every app-specific dependency with generic props and shared utilities.

Bild

It failed because the package checked it during preinstall, which only reads shell env at install time. Fix: `𝐞𝐱𝐩𝐨𝐫𝐭 𝐋𝐈𝐂𝐄𝐍𝐒𝐄_𝐊𝐄𝐘=... && 𝐩𝐧𝐩𝐦 𝐢𝐧𝐬𝐭𝐚𝐥𝐥` Useful reminder: 𝐚𝐩𝐩 𝐫𝐮𝐧𝐭𝐢𝐦𝐞 𝐞𝐧𝐯 != 𝐢𝐧𝐬𝐭𝐚𝐥𝐥-𝐭𝐢𝐦𝐞 𝐞𝐧𝐯

Bild

I replaced 3 API clients with one shared layer. 3 apps. 3 separate HTTP clients. 3 auth implementations. All doing the same thing. Built one shared package. Migrated each app feature by feature. Removed the old clients only after everything was stable.

Bild

dozens of PRs in one month. not because I'm 10x. because I break work into small PRs, batch related work, don't over-engineer, and review my own PR before requesting review (catches 50% of issues). consistency > intensity.

Bild

"we need this by Friday." every engineer has heard this. I've failed at it, overscoped, didnt ask for help early, communicated too late. lessons: scope ruthlessly, timebox exploration, ship the fix then the refactor, communicate early. velocity isn't working faster. it's cutting scope to wt matters.

Bild

i shipped a change that spiked CPU on Gmail. our browser extension was causing it. root cause? infinite re-render loop. we injected a toolbar into Gmail's compose. DOM change → reinit toolbar → DOM change → reinit → forever. fix was 15 lines. finding it took 4 hours.

Bild

UX = Design the RIGHT thing UI = Design the thing RIGHT Most designers mix them up. One solves real problems. The other makes it feel smooth & beautiful. You need BOTH 🔥 Which side are you stronger at? UX or UI? 👇

Bild

the first week i worked on the browser extension: opened Gmail, toolbar was there. opened Outlook, broken. Google Docs, half rendered. LinkedIn, gone. same code, 4 sites, 4 behaviours. that's what extension dev actually is, you're a guest in someone else's app. they redecorate without telling you.

Bild

Before I wrote my first major change, I spent 2 weeks just reading code. Traced a button click through, React component → event handler → API client → backend → database → response → state update → re-render. Understanding the system IS the contribution.

Bild

removed 62 unused npm packages from our codebase in one PR. 14 never imported, 23 left behind by deleted code, 11 duplicates, 14 dev deps listed as prod. bundle size dropped 40%. run `npx depcheck` on your project, you'll probably find more than you expect.

Bild

TIL: you don't need side projects to grow as an engineer. you need responsibility. I learned Tauri because we needed a desktop app, not because it was trendy. production systems with real users teach you more than any tutorial. the stakes are just different.

Bild

my first major challenge as a frontend engineer: building speech-to-text for an AI product used by millions. completely new territory. browser permissions, edge cases, unreliable real-time input.