Morning Coffee by Igor Šarčević
Co-founder of Operately, Software Engineer, ex. Lead Architect at SemaphoreCI. Cat & Dog person. Coffee lover. Husband of Daniela. Hiker. Writer.
Stuff I've made →
Find a Place That’s Curious
There are moments when the world changes its interface. People still want the
same things: good products, less busywork, fewer meetings, more time, more
leverage. But the way you get there shifts.
The internet did this. Spreadsheets did...
The Missing Sidebar in Cursor
When I’m working with AI agents, I spend most of my time reviewing changes. Not
individual commits. Not unstaged files. The only thing I care about is the full
diff between my branch and main. What changed? What files were touched? That’s...
The Best Conferences Have No Speakers
Last week our team at SuperPlane organized a
DevOps Unconference. We split into groups, picked our own topics, and talked
for hours about data privacy regulations, DevOps automation, AI agents for
observability. Just people in a room who...
One-Line Security Hardening for Ubuntu Servers
I wanted to deploy OpenClaw to Hetzner the other day, and it hit me again: basic
security hardening of a VPS by hand is a pain. Editing sshd_config, creating
users, configuring the firewall, setting up fail2ban, copying keys. It’s the same...
I write 0% of my code manually
I was chatting with friends recently. One mentioned that developers he knows
had gone from writing ~30% of their code manually to ~5% in the last three or
four months. He couldn’t confirm the numbers, but the direction was clear. I said...
Hiring in the Age of AI
I’ve been in this industry long enough to watch hiring trends come and go.
There was a time when interviews were all about clever puzzles. Later, it was
all about whiteboards. Then came the era of algorithm questions, and after that,
take...
Parallel AI Agents Are a Game Changer
I’ve been in this industry long enough to watch technologies come and go. I’ve
seen the excitement around new frameworks, the promises of revolutionary tools,
and the breathless predictions about what would “change everything.” Most of the...
Riding the waves of history
“It’s hard to predict the future,” I texted my friend last week.
We’d been messaging back and forth about AI, sharing links about
ChatGPT’s latest image generation capabilities, and debating
whether programming as we know it is dead. The...
Europe failed Serbia
I remember when Serbia loved Europe. Two decades ago, you could feel the electric
anticipation of EU membership everywhere in the country. As a Hungarian living in
Serbia, I had a unique perspective—watching both my cultural identities navigate...
Freedom and the Rule of Law
Rain fell steadily from a gray, oppressive sky as I joined the growing mass of
people at the city’s edge. Flags and banners waved in the wind, and the sound
of horns filled the air. We were six kilometers from the Republic Square where
the...
The cost of silence
I’ve recently shared a post on X about the asking questions and the importance
of it in a company culture. Here they are:
The temporary discomfort of asking questions is nothing compared to the
permanent cost of not asking them. The biggest...
Everything Around You Was Someone's Passion Project
Look around. Really look. That keyboard you’re typing on, the chair you’re
sitting in, the room you’re in, the building you’re in, the bakery at the end
of your street that sells that amazing bread, your freedom to walk down the
street without...
Work can wait, your wedding can't
I saw something insane on LinkedIn today. A founder bragging about his
co-founder about submitting a pull-request during his own wedding. Let that
sink in for a moment.
Social Parasites
We’ve recently witnessed a perfect example of this parasitic behavior. A
startup, freshly minted by a once-respected incubator, had the audacity to fork
an open-source project and claim it as their own. They didn’t innovate. They
didn’t improve...
Manage Your Time or Someone Else Will Do It for You
From the moment we’re born, our time isn’t really our own. Parents, schools,
and later, employers all have a say in how our days unfold. As kids, we’re on
someone else’s schedule. Education systems beat it into us, training us to
march to...
Steps We Took to Automate License Compatibility Verification
We are actively developing Operately, an open-source software licensed under
Apache 2.0. As such, we need to carefully consider whether our dependencies’
licenses are compatible with ours. Starting to build features based on
functionality...
Pull Requests are a reflection of your engineering culture
When engineers want to introduce a change to the system, they use pull requests
to package the change and present it to the rest of the team. A pull request
usually contains a title, a description, and a list of commits that aim to
change...
Proactive cache warming in a microservice-based architecture
With the microservice architecture style, services and their data are contained
within a single bounded context. This architectural decision helps us to develop
and deploy changes in one business unit fast and independent of other services...
Transactional Outbox: What is it and why you need it?
Receiving a request, saving it into a database, and finally publishing a message
can be trickier than expected. A naive implementation can either lose messages
or, even worse, post incorrect messages.
Let’s look at an example. A user registration...
Killing a process and all of its descendants
Killing processes in a Unix-like system can be trickier than expected. Last
week I was debugging an odd issue related to job stopping on Semaphore.
More specifically, an issue related to the killing of a running process in a
job.
Boolean short circuiting is not guaranteed
Last week I was debugging a weird bug in one of our services. In the logs we
saw an SQL error “repetition-operator operand invalid”, so I was pretty sure
that we have a broken SQL comparison in one of our services. The weird part
was that this error happened only occasionally, seemingly randomly.
Stable Pagination
Last week we’ve investigated a way to achieve stable pagination
for our new API. I’ve learned some new techniques for handling
pagination, and dig deep into the downsides of standard —
offset based — pagination.
Measuring the strength of a WiFi connection
Recently I switched my ISP provider and with the change I’ve got
a new WiFi router. The download speed is incredible, 10x the compared
to my previous subscription, but the stability got worse.
The PostgreSQL Query Cost Model
Slow database queries harm your organization in many ways. They can damage the
reputation of otherwise great applications, make background processing painfully
slow, and drastically increase the cost of your infrastructure. As a seasoned
web developer, it is absolutely essential to learn about optimization strategies
for your data layer.
Deadlocks in PostgreSQL
In concurrent systems where resources are locked, two or more processes can end
up in a state in which each process is waiting for the other one. This state is
called a deadlock. Deadlocks are an important issues that can happen in any
database and can be scary when you encounter them for the first time.
Multi Version Concurrency Control
The most prominent feature of PostgreSQL is how it handles concurrency. Reads
never block writes, and writes never block reads. To achieve this, PostgreSQL
uses the Multi Version Concurrency Control (MVCC) model, an elegant solution for
a very hard problem. If you want to design highly concurrent applications, you
should really invest the time to understand the bits and bolts of this
mechanism.
Transaction Isolation Levels in PostgreSQL
Misunderstanding transaction isolation levels can lead to disgusting side
effects in your application. Debugging such issues can be more than painful. The
SQL standard defines four levels of transaction isolation. Each of these
isolation levels defines what happens if two concurrent processes try to read
data updated by other processes.
Selecting for Share and Update in PostgreSQL
A regular select statement does not give you enough protection if you want to
query data and make a change in the database related to it. Other transactions
can update or delete the data you just queried. PostgreSQL offers additional
select statements that lock on read and provide an extra layer of safety.
Advisory Locks and How to Use Them
PostgreSQL provides the means for creating locks with application defined
meaning. These locks are called Advisory Locks and are an ideal candidate for
concurrency control where the standard MVCC (multiversion concurrency control)
doesn’t fit the bill. Advisory Locks can be the perfect tool in your arsenal
when you need to control access to a shared resource in a distributed system.
Understanding PostgreSQL locks
Locking is an important topic in any kind of database. Without properly handling
locks, an application might not only be slow, it might also be wrong and behave
in some insane ways. Therefore, learning proper locking techniques is essential
for good performance and correctness of our applications.
Separating Commands and Queries
I have learned an important lesson this year. A clear separation between queries
and commands can bring a lot of long term benefits to your code.