My headspace
This is my main writing space.
Thoughts on tech, quality, systems, and life, mixed with things I find useful, interesting, or worth questioning. Some posts are practical, some are reflective. All of them are written with clarity, not noise.
-
String Handling in TypeScript Without Losing Your Mind
A practical guide to trim, split, join, and friends String manipulation shows up everywhere, interviews included.Yet many developers freeze because strings feel “magical”. They’re not. Once you see the patterns, it becomes mechanical. The Core Mental Model Strings are immutable.You don’t change them, you create new ones. Most string problems follow one of these flows:…
-
Common Code Mistakes Every Engineer Eventually Learns the Hard Way
As engineers grow, the biggest shift is not learning new syntax, but learning to recognize bad code early. These mistakes have names for a reason, they show up everywhere, across teams, languages, and seniority levels. This post is a practical breakdown of common code mistakes, why they happen, and why seniors care so much about…
-
Playwright vs CodeceptJS
A clear, practical comparison for modern E2E testing End-to-end testing is table stakes now. Two big options you’ll hear about are Playwright and CodeceptJS. Both help you automate full user flows in browsers. But they take very different approaches. For clarity, Playwright is a test automation library from Microsoft. CodeceptJS is a framework that can…
-
Stop Putting Parameterized Locators in Constructors
If you’re using Playwright with Page Objects, you’ve probably seen something like this: It works. But it’s a bad pattern. This article explains what this pattern is, why it causes problems, and what to do instead. What Is This Pattern Called? That code is a parameterized locator factory defined in the constructor. Key traits: It’s…
-
Type vs Interface vs Class vs Tuple (and When to Use Each)
TypeScript gives you many ways to describe data. That’s powerful, but also confusing. If you’ve ever asked “why does this exist when that already works”, this post is for you. I’ll explain what each one really is, what it’s good at, and when not to use it. Mental model first (important) If you mix these…
-
data-testid Is Not a Smell. Misusing It Is.
data-testid gets a bad reputation. Some people say it’s lazy. Others say it’s an anti-pattern. Both are wrong. data-testid is a tool. Like any tool, it’s either used with intent or abused. Let’s be honest about when it’s the right choice and when it’s not. What data-testid actually is data-testid is a testing-only attribute added to…
-
What the DOM Really Is (and Why Your Tests Keep Breaking)
“DOM” is one of those words everyone uses and half the people misunderstand. If you write UI tests and don’t truly get the DOM, you will write fragile tests. Period. Let’s fix that. DOM does NOT mean HTML DOM = Document Object Model HTML is a file. The DOM is a live, in-memory structure created…
-
6 Custom ESLint Rules That Forced My Playwright Tests to Grow Up
Playwright is powerful. That’s also the problem. It lets teams move fast, and when teams move fast, test quality quietly degrades. You end up with unreadable assertions, inconsistent page objects, slow test runs, and Allure reports nobody trusts. I stopped trying to “educate” people in code reviews. Instead, I wrote ESLint rules. These six custom…
-
Stop using waitFor* as a crutch in Playwright E2E
If your Playwright tests are full of waitForTimeout() or “wait a bit then click”, you are buying flakiness and slow runs. Playwright already has smarter waiting built in. Your job is to wait for a condition, not wait for time. What’s wrong with waitForTimeout() (hard waits) page.waitForTimeout(2000) just sleeps. It does not care whether the…
-
Conflict handling is a senior skill
Most conflicts at work aren’t really about people. They’re about pressure, unclear ownership, and timing. But when something breaks, pipelines turn red, or deadlines get tight, the conversation often shifts from facts to tone. That’s when conflict starts. I’ve learned this the hard way. In one situation, a technical discussion slowly turned into something else.…
-
Page Objects are not enough. Page Actions matter.
Page Objects solved one problem: locators.They did not solve behavior, readability, or long-term maintenance. In many Playwright projects, Page Objects slowly turn into dumping grounds. Locators, clicks, assertions, waits, logic, and workarounds all mixed together. It works at the beginning. It always does. Until it doesn’t. That’s when tests become hard to read, harder to…
-
What does “senior” even mean in the AI era?
Not long ago, being senior meant years.More years, more tickets, more systems survived. That definition is dying. AI didn’t just speed things up. It compressed experience. Tasks that used to take years to master can now be done in weeks with the right tools. Writing tests, scaffolding code, generating docs, even debugging. AI leveled the…
-
Why my website is called Falcoma
Falcoma is a name I didn’t invent. I saw it online, couldn’t find a real meaning, and that was exactly the point. It sounded unique, slightly feminine, and open enough to grow into something personal. The name reminds me of a falcon, or an eagle. People often mix them up, and I don’t mind. What…
-
Jira Skipper, stop pushing code just to skip tests
When E2E is flaky, the worst workflow is this: someone changes code to skip a scenario, pushes, waits for CI, then changes it back later. It’s slow, noisy, and it pollutes git history. So we built Jira Skipper. Idea: control skipping from a single Jira ticket description. No code changes needed. Update Jira, rerun pipeline,…
-
QE is not the bottleneck. Reality is.
Quality Engineering often gets blamed when pipelines are slow or E2E tests are flaky. It’s an easy target. A red pipeline is visible, the real cause often isn’t. What’s usually ignored is this:test automation is hard and expensive to maintain.ISTQB is very clear on this. Automation is not a one-time setup. It requires continuous maintenance…
-
My CPAP Journey in Germany
Snoring. Breath-holding. A tired partner. That’s how it all started. What followed was a months-long journey through doctors, wires, eye-rolls, and, finally—sleep.
-
End-to-End Testing
End-to-end tests leverage the power of CodeceptJS, a modern, scenario-driven testing framework designed to write simple and clean tests. CodeceptJS is the successor of Codeception, a widely adopted full-stack testing framework in the PHP ecosystem.
-
Visual Testing
While end-to-end and functional testing assesses the underlying functionality, flow, and integration of an application or website, they may overlook the visual presentation. The visual appearance of a website plays a critical role in user experience, and small visual discrepancies can lead to user confusion or mistrust. This is where visual testing becomes vital.
