<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://kyrylo.org/feed.xml" rel="self" type="application/atom+xml" /><link href="https://kyrylo.org/" rel="alternate" type="text/html" /><updated>2026-07-24T14:54:14+08:00</updated><id>https://kyrylo.org/feed.xml</id><title type="html">Kyrylo Silin</title><subtitle>I build serious software and unserious websites</subtitle><author><name>Kyrylo Silin</name><email>silin@kyrylo.org</email></author><entry><title type="html">The favicon survived the web</title><link href="https://kyrylo.org/html/2026/07/24/the-favicon-survived-the-web.html" rel="alternate" type="text/html" title="The favicon survived the web" /><published>2026-07-24T00:00:00+08:00</published><updated>2026-07-24T14:52:51+08:00</updated><id>https://kyrylo.org/html/2026/07/24/the-favicon-survived-the-web</id><content type="html" xml:base="https://kyrylo.org/html/2026/07/24/the-favicon-survived-the-web.html"><![CDATA[<p>Most of us never look at a favicon.</p>

<p>We look past it, the way we look past a house number we already know. It sits
quietly in the corner of a browser tab, sixteen pixels or so, reminding us which
tiny piece of the internet we are visiting.</p>

<p>The favicon appeared in the late 1990s as a “favorite icon” for bookmarked
websites. Even its name belongs to an older web.</p>

<p>Since then, almost everything around it has changed.</p>

<p>Pages became applications. Desktops gave way to phones. Tables became divs,
Flash disappeared, servers floated into clouds, and browsers grew so many tabs
that we can barely read their titles anymore.</p>

<p>Through all of it, the favicon stayed.</p>

<p>Its file format changed. It grew larger versions, sharper versions, touch icons,
and manifests. But its purpose remained almost untouched: a small mark that
says, <em>this page belongs to this place</em>.</p>

<p>The web is a city that rebuilds itself overnight. Buildings rise, fashions
spread, neighborhoods disappear, and yesterday’s landmarks become broken
links. Yet the favicon is still there, a tiny house number nailed beside the
door.</p>

<p>Nobody celebrates it. Nobody announces the next generation of favicon. We only
notice when one is missing and a browser shows us that empty, generic square.</p>

<p>Maybe that is why it survived. It never tried to become more than it was.</p>

<p>The web rushed toward whatever came next.</p>

<p>The favicon stayed in the corner, keeping our place.</p>]]></content><author><name>Kyrylo Silin</name><email>silin@kyrylo.org</email></author><category term="html" /><summary type="html"><![CDATA[Most of us never look at a favicon.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kyrylo.org/assets/images/kyrylo-silin@2x.webp" /><media:content medium="image" url="https://kyrylo.org/assets/images/kyrylo-silin@2x.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">AI will not stop at simple work</title><link href="https://kyrylo.org/software/2026/07/23/ai-will-not-stop-at-simple-work.html" rel="alternate" type="text/html" title="AI will not stop at simple work" /><published>2026-07-23T19:17:27+08:00</published><updated>2026-07-23T19:22:49+08:00</updated><id>https://kyrylo.org/software/2026/07/23/ai-will-not-stop-at-simple-work</id><content type="html" xml:base="https://kyrylo.org/software/2026/07/23/ai-will-not-stop-at-simple-work.html"><![CDATA[<p>After I wrote that <a href="/software/2026/07/22/programming-experience-is-no-longer-a-moat.html">programming experience is no longer a
moat</a>,
one reply kept appearing.</p>

<p>AI can write simple code, people said, but when the system becomes complicated,
you still need an experienced human.</p>

<p>This is a reasonable objection.</p>

<p>It also feels true today.</p>

<p>Ask a model to build a small application and it moves quickly. Ask it to change
billing rules across a ten-year-old system and it may wander into the woods. A
human has to pull it back.</p>

<p>The mistake is treating that boundary as permanent.</p>

<p>The models that struggled with a complete feature last year can now explore a
codebase, change several files, run tests, notice failures, and try again. They
still get lost, but the forest keeps getting larger.</p>

<p>The replies focused on where the boundary is today. I was more interested in
where it is moving.</p>

<p>A complicated system is not complicated in one giant way. It is usually a pile
of smaller decisions held together by constraints.</p>

<p>The payment must be retried, but never twice at the same time. Old customers
keep their original price. The migration must work without downtime. Failed
jobs must be safe to run again. This strange database column cannot be removed
because a forgotten report still uses it.</p>

<p>An experienced programmer carries much of this context in their head.</p>

<p>The model does not.</p>

<p>Give it a vague request and it fills the gaps with guesses. Give it the intended
behaviour, the constraints, the edge cases, the relevant code, and a way to test
the result, and something different happens.</p>

<p>It breaks the work down. It proposes a plan. It changes the code, runs the
tests, reads the failures, and adjusts.</p>

<p>It will still make mistakes. Sometimes serious ones. I am not claiming that AI
can already redesign every complicated system perfectly.</p>

<p>I am saying that it is moving into complicated work faster than many
programmers are updating their idea of what complicated means.</p>

<p>That shifts the bottleneck.</p>

<p>The difficult part becomes less about whether the machine can produce the code.
It becomes whether the human can explain what correct means.</p>

<p>That is not a small task.</p>

<p>Writing a good specification requires understanding the system, finding the
hidden constraints, resolving contradictions, and choosing trade-offs. Then
someone still has to review the result and take responsibility for it.</p>

<p>The human remains, but the work changes.</p>

<p>More of it becomes specification, judgment, verification, and ownership.</p>

<p>If you cannot describe the constraints, the model will invent them for you. If
you can, you still have to check the result and put your name on it.</p>

<p>That is the part experienced programmers should be practising now.</p>]]></content><author><name>Kyrylo Silin</name><email>silin@kyrylo.org</email></author><category term="software" /><summary type="html"><![CDATA[After I wrote that programming experience is no longer a moat, one reply kept appearing.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kyrylo.org/assets/images/kyrylo-silin@2x.webp" /><media:content medium="image" url="https://kyrylo.org/assets/images/kyrylo-silin@2x.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The hard way has changed</title><link href="https://kyrylo.org/software/2026/07/23/the-hard-way-has-changed.html" rel="alternate" type="text/html" title="The hard way has changed" /><published>2026-07-23T00:00:00+08:00</published><updated>2026-07-23T11:07:50+08:00</updated><id>https://kyrylo.org/software/2026/07/23/the-hard-way-has-changed</id><content type="html" xml:base="https://kyrylo.org/software/2026/07/23/the-hard-way-has-changed.html"><![CDATA[<p>After I wrote that <a href="/software/2026/07/22/programming-experience-is-no-longer-a-moat.html">programming experience is no longer a
moat</a>,
many people told me that experience was still the real moat.</p>

<p>LLMs can produce code, they said, but they cannot compress judgment. You only
get that by spending years debugging systems, making mistakes, and suffering
with the compiler.</p>

<p>I think they are right about the first part.</p>

<p>I am less sure about the second.</p>

<h2 id="we-dont-know-yet">We don’t know yet</h2>

<p>The technology is too new.</p>

<p>Nobody has spent ten years learning programming with a capable coding agent
because capable coding agents haven’t existed for ten years. We cannot examine
the careers of people who learned entirely this way. Those careers have barely
started.</p>

<p>Maybe some beginners have already compressed five years of learning into two.
Maybe they only look competent because the machine is doing the work. A working
application doesn’t tell us which one happened.</p>

<p>One <a href="https://doi.org/10.1145/3632620.3671116">small study of novice
programmers</a> found exactly this split.
Almost everyone completed the task, but some students used AI to move faster
while others became even more confused.</p>

<p>It is interesting, but it doesn’t answer the bigger question. Only time will.</p>

<h2 id="two-kinds-of-beginner">Two kinds of beginner</h2>

<p>The first beginner asks the LLM to build an application.</p>

<p>It works. They ask for another feature. That works too. When something breaks,
they paste the error back into the chat and apply the next patch.</p>

<p>After six months, they may have shipped a surprising amount of software. They
may also understand very little of it.</p>

<p>I know how addictive this is because <a href="/projects/2025/07/02/i-vibe-coded-tech-debt-a-game-written-in-pure-html-css-js.html">I tried vibe-coding an entire
game</a>.
The incentive to stop and read the code is almost nonexistent when the next
prompt can keep you moving.</p>

<p>The second beginner does not start by reviewing architecture and rejecting bad
abstractions. They cannot. They are still a beginner.</p>

<p>They start smaller.</p>

<p>They ask what each file does. They try to predict what the code will do before
running it. They ask for a hint before asking for the patch. After the LLM fixes
a bug, they revert the fix and try to reproduce it themselves.</p>

<p>They break their small application on purpose. They change the input, delete a
record, add latency, or make an API return nonsense. Then they watch what
happens.</p>

<p>At first, they will ask bad questions and misunderstand the answers. That is
normal. The important part is that they stay with the problem after the code
starts working.</p>

<p>Eventually, they can read the generated architecture. Eventually, they can
compare two approaches and notice that one of them is a mess. Eventually, they
can refuse the first working answer.</p>

<p>Those are not skills the beginner starts with. They are what this process is
supposed to produce.</p>

<h2 id="friction-still-matters">Friction still matters</h2>

<p>I previously wrote that beginners should <a href="/software/2025/03/28/learn-to-code-ignore-ai-then-use-ai-to-code-even-better.html">learn to code, ignore AI, then use AI
to code even
better</a>.</p>

<p>I am no longer sure about the “ignore AI” part.</p>

<p>A beginner may be able to use AI from the first day and still learn properly.
They just cannot let it remove every obstacle.</p>

<p>The LLM can finish the exercise, or it can help you understand the exercise.
Those uses look similar from the outside because both may produce working code.</p>

<p>Only one of them requires much thinking.</p>

<p>The old route included friction automatically. The compiler refused to
cooperate. Documentation was unclear. Answers were difficult to find. You had no
choice but to sit with the problem.</p>

<p>Now the easy answer is always one prompt away.</p>

<p>That means the beginner has to choose the hard part deliberately.</p>

<p>Build something small enough to understand. Read what the model writes. Ask for
explanations, not only fixes. Work without it occasionally. Break things in a
safe environment. Put something real online and take responsibility when it
fails.</p>

<p>Experienced programmers should not pretend that our old learning route is the
only route that can produce judgment. Beginners should not pretend that shipping
AI-generated software means they have already developed it.</p>

<p>If I were learning today, I would use AI from the beginning. But if the code
worked and I couldn’t explain why, I would not consider the lesson finished.</p>]]></content><author><name>Kyrylo Silin</name><email>silin@kyrylo.org</email></author><category term="software" /><summary type="html"><![CDATA[After I wrote that programming experience is no longer a moat, many people told me that experience was still the real moat.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kyrylo.org/assets/images/kyrylo-silin@2x.webp" /><media:content medium="image" url="https://kyrylo.org/assets/images/kyrylo-silin@2x.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Programming experience is no longer a moat</title><link href="https://kyrylo.org/software/2026/07/22/programming-experience-is-no-longer-a-moat.html" rel="alternate" type="text/html" title="Programming experience is no longer a moat" /><published>2026-07-22T00:00:00+08:00</published><updated>2026-07-22T10:11:53+08:00</updated><id>https://kyrylo.org/software/2026/07/22/programming-experience-is-no-longer-a-moat</id><content type="html" xml:base="https://kyrylo.org/software/2026/07/22/programming-experience-is-no-longer-a-moat.html"><![CDATA[<p>I have a Computer Science degree. I’ve been writing code for more than 15
years. I’ve written software in more than eight programming languages, read
countless programming books, and used to do code golf for fun.</p>

<p>Yet in 2026, it feels like I no longer have much of an advantage over someone
who only learned React.</p>

<p>I <a href="https://x.com/kyrylo/status/2079585326482526389">posted this on X</a>
and asked a simple question: if AI has compressed years of accumulated
knowledge into something anyone can access, what should experienced programmers
focus on now? What becomes the new moat?</p>

<p>Some people read it as a confession rather than a question.</p>

<p>One person, who has been programming since the 1970s,
<a href="https://x.com/perrymetzger/status/2079714793120833922">replied</a>:
“Wow, what an admission.”</p>

<p>Another <a href="https://x.com/J_Von_Random/status/2079711656263684514">said</a>
that perhaps I had been a competent code-slinger but had never learned the
important architecture and engineering skills.</p>

<p>The implication was that if AI makes you question the value of your experience,
the only possible explanation is that you never had any. That may be a
comforting answer, but I don’t think it is the correct one.</p>

<h2 id="experience-still-matters">Experience still matters</h2>

<p>I have written before that
<a href="/software/2025/11/26/ai-amplifies-programmers-not-replaces-them.html">AI amplifies programmers rather than replacing them</a>.
I still believe that.</p>

<p>Give an incompetent programmer a powerful model and they may produce middling
crap. Give a competent programmer the same model and they can produce excellent
work faster than ever. One of the replies made exactly
<a href="https://x.com/J_Von_Random/status/2079725129597141486">this point</a>,
and I agree with it.</p>

<p>Experience helps you notice when generated code is subtly wrong. It helps you
ask better questions, reject bad abstractions, understand trade-offs, and know
when the green tests are lying to you. A beginner sees working code. An
experienced programmer sees the maintenance bill hiding behind it.</p>

<p>That is true, but it still wasn’t the point I was making.</p>

<p>My point is that the distance between incompetence and competence has become
much shorter.</p>

<p>AI does not need to make a beginner equal to an expert to change the economics
of programming. It only needs to help the beginner catch up faster than before,
which is already happening.</p>

<h2 id="the-ladder-got-shorter">The ladder got shorter</h2>

<p>When I started programming, knowledge was expensive.</p>

<p>You had to read the book, learn the vocabulary, fight with the compiler, search
through forum posts, misunderstand the documentation, break the program, and
then spend hours figuring out why. A lot of what we call experience is simply
the scar tissue left by repeating this process for years.</p>

<p>Today, a beginner can paste an error into an LLM and get an explanation in
seconds. They can ask for three possible solutions, request a comparison, and
then ask the model to implement the best one. They still need enough knowledge
to judge the result, but the amount they must learn before becoming productive
has collapsed.</p>

<p>The expert still starts further ahead, but the beginner no longer has to walk
the whole road to get somewhere useful.</p>

<p>That is what I mean by compression. AI has not deleted the difference between a
junior and a senior programmer. It has compressed it.</p>

<h2 id="the-manual-is-no-longer-the-bottleneck">The manual is no longer the bottleneck</h2>

<p>The most interesting reply came from the programmer who disagreed with me. He
<a href="https://x.com/perrymetzger/status/2079721096006316257">said</a> LLMs are
already excellent at systems programming. He routinely gets complicated
compiler tooling from them in one shot, and has had them nearly produce hardware
simulators from a manual in one shot too.</p>

<p>To me, however, this is evidence for my argument rather than against it.</p>

<p>The machine consumed the manual and produced the result. Now imagine that you
need to learn ten manuals. Would you spend months absorbing all of them before
starting, or would you use the machine sitting next to you? I know which option
I would choose.</p>

<p>He later <a href="https://x.com/perrymetzger/status/2079729662318584218">compared</a>
programming by hand to learning arithmetic before using a calculator, solving
integrals before using Mathematica, and operating manual machine tools before
using CNC. I agree with that too. Learning the fundamentals gives you a mental
model that the tool cannot install with a single prompt.</p>

<p>Children should still learn arithmetic, of course, but doing long
multiplication by hand is no longer a moat.</p>

<p>Knowing assembly language can make you a better programmer, but it does not
mean you should manually translate every program into machine code. The
compiler moved that work into a tool, and AI is doing something similar one
level higher.</p>

<p>The knowledge still matters, but the market stops rewarding you merely for
having acquired it the hard way.</p>

<h2 id="programming-is-becoming-a-commodity">Programming is becoming a commodity</h2>

<p>This is the uncomfortable part of the discussion, because programming has been
such an important part of how many of us see ourselves.</p>

<p>Typing the same ten things by hand feels mundane when you know a machine can do
them faster. You already proved to yourself that you can write the code. Doing
it again is like reaching for a regular screwdriver when an electric one is
sitting next to it.</p>

<p>You can admire the craftsmanship of the regular screwdriver. You can practice
with it to keep your hands sharp. But don’t confuse that practice with a
competitive advantage.</p>

<p>AI has made code cheaper because, as the models improve and absorb more public
code, documentation, books, and examples, more programming knowledge becomes
available on demand. As a result, the bottleneck moves away from remembering
how to produce the code.</p>

<p>Whether LLMs <a href="https://x.com/perrymetzger/status/2079724698452066645">“truly
think”</a> is an
interesting philosophical argument, but it doesn’t change the practical result.
If a machine can produce the compiler tooling, debug the system, and ship the
feature, the market will care about the result more than the internal mechanism
that produced it.</p>

<p>We will probably live through a turbulent period with mountains of bad
AI-generated software. Vibe coders will ship security holes, broken
abstractions, and dependency piles that nobody understands. The market will
slowly correct for it, though, because users still expect software to work.</p>

<p>Bad output from beginners does not preserve the old moat, though. It simply
shows that better tools have not eliminated the need for judgment.</p>

<h2 id="so-what-is-the-new-moat">So what is the new moat?</h2>

<p>I don’t think the new moat will be syntax, framework trivia, or remembering an
API that the model can look up in a second. It will be everything around the
code: knowing which problem is worth solving, understanding the users and the
domain, and turning messy requirements into precise decisions.</p>

<p>It will also involve having enough taste to prefer a simple system over an
impressive mess, recognizing when the AI is confidently wrong, and being
willing to own the result after the prompt is finished.</p>

<p>Most of this was always part of good software engineering. The difference is
that it is becoming the job, rather than the layer of thinking around the job.</p>

<p>Experienced programmers should use AI aggressively. We should also keep our
fundamentals sharp, because without them we cannot judge what the machine gives
us. But we should stop treating the difficulty of our education as permanent
protection from newcomers, because it no longer provides that kind of
protection.</p>

<p>AI did not make my 15 years of experience worthless, but it did make a large
part of that experience easier for other people to borrow.</p>

<p>That experience still gives me an advantage, but it no longer feels like the
protective moat it once was. As code becomes cheaper to produce, the judgment
behind it becomes more important, and that is where I think experienced
programmers should focus.</p>]]></content><author><name>Kyrylo Silin</name><email>silin@kyrylo.org</email></author><category term="software" /><summary type="html"><![CDATA[I have a Computer Science degree. I’ve been writing code for more than 15 years. I’ve written software in more than eight programming languages, read countless programming books, and used to do code golf for fun.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kyrylo.org/assets/images/kyrylo-silin@2x.webp" /><media:content medium="image" url="https://kyrylo.org/assets/images/kyrylo-silin@2x.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">I built Flag Click</title><link href="https://kyrylo.org/projects/2026/07/07/i-built-flag-click.html" rel="alternate" type="text/html" title="I built Flag Click" /><published>2026-07-07T00:00:00+08:00</published><updated>2026-07-07T10:07:01+08:00</updated><id>https://kyrylo.org/projects/2026/07/07/i-built-flag-click</id><content type="html" xml:base="https://kyrylo.org/projects/2026/07/07/i-built-flag-click.html"><![CDATA[<p>I built a small web game called <a href="https://flagclick.com">Flag Click</a>.</p>

<p>The idea is almost embarrassingly simple: you click your country flag, your flag
climbs up the pole, and you try to overtake everyone else. That’s the whole
game.</p>

<p><img src="/assets/images/posts/i-built-flag-click/01.webp" alt="Flag Click on a phone, with flags climbing a pole in space" /></p>

<p>I keep getting drawn to these tiny internet toys. Not the serious kind of game
where you need a tutorial, a season pass, and three currencies before you are
allowed to have fun. I mean the stupid little thing that makes sense
immediately. You open it, you understand it, and before your brain has time to
ask why, you are already clicking.</p>

<p>Flag Click grew out of <a href="https://flagmatch.com">Flag Match</a>, my flag matching
game. Flag Match at least has the noble excuse of being educational. You can
tell yourself you are learning geography. Flag Click does not have that excuse.
It is the less responsible cousin. You click a flag because you want your flag
to be higher than the other flags.</p>

<p>That sounds silly, but that is exactly why flags work so well here. A flag is
not just a random image on a button. People instantly recognize it. It carries
just enough identity to make the number feel personal, but not enough gravity to
turn the thing into something serious. It stays in that nice internet zone where
everyone knows it does not matter, but it still kind of does.</p>

<p>The first version was not a flagpole. It was a big field of flags where the
winning countries slowly took over the screen. In my head, this was clearly the
right mechanic. On the screen, it was ugly. Flags got squished, the layout
looked noisy, and the whole thing had no drama. It was technically doing what I
asked it to do, which is often the worst kind of failure because the idea itself
is the problem.</p>

<p>The flagpole fixed it.</p>

<p>Once countries started climbing instead of occupying space, the game suddenly
made sense. The screen had a direction. Being #1 meant being at the top. Smaller
countries could sit lower on the pole. On mobile, it also felt much more natural
because the entire game became vertical, which is where your thumb already
lives.</p>

<p>Most of the work after that was not about adding more features. It was about
making the click feel right. The flag had to wave. The score had to react
quickly. Overtaking another country needed a little bit of theatre. The sound
could not be annoying after five seconds. Mobile tapping had to feel good
because this is absolutely a phone game first.</p>

<p>That kind of polish sounds optional until you build something this small. Then
you realize the polish is the product. If the button feels bad, there is no game
left to hide behind.</p>

<p>I also had to think about fake scores, because of course I did. Any public
clicker invites people to mess with it. That is part of the genre. I do not
think you can make this kind of thing perfectly cheat-proof, and I do not want
to turn a silly flag game into airport security. The goal is simpler: make
casual cheating boring enough that normal players do not feel like the board is
immediately ruined.</p>

<p>I have no idea if Flag Click will go anywhere. Maybe it gets shared, maybe it
doesn’t. Maybe one country wakes up and turns the leaderboard into a national
emergency for twelve minutes. Maybe nobody cares. All outcomes are acceptable.</p>

<p>What I like is that it exists. It is small, weird, and self-contained. It made
me care about sounds, animation, phone taps, flags, and one very opinionated
pole. That is enough for me.</p>

<p>Go click your flag: <a href="https://flagclick.com">flagclick.com</a>.</p>]]></content><author><name>Kyrylo Silin</name><email>silin@kyrylo.org</email></author><category term="projects" /><summary type="html"><![CDATA[I built a small web game called Flag Click.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kyrylo.org/assets/images/posts/i-built-flag-click/01.webp" /><media:content medium="image" url="https://kyrylo.org/assets/images/posts/i-built-flag-click/01.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The artificial programmer</title><link href="https://kyrylo.org/2026/06/23/the-artificial-programmer.html" rel="alternate" type="text/html" title="The artificial programmer" /><published>2026-06-23T00:00:00+08:00</published><updated>2026-06-23T12:36:57+08:00</updated><id>https://kyrylo.org/2026/06/23/the-artificial-programmer</id><content type="html" xml:base="https://kyrylo.org/2026/06/23/the-artificial-programmer.html"><![CDATA[<p>I recently got six months of free access to OpenAI’s advanced coding models
because of my open-source contributions. I
<a href="https://x.com/kyrylo/status/2068857794955223259">posted</a> about it on X. It’s an
incredibly generous offer, and I’ve been using Codex every day since.</p>

<p>The convenience is ridiculous.</p>

<p>You describe what you want, and it produces working code. You paste a stack
trace, and it explains the bug and offers a fix. You ask it to add a feature,
and it updates the relevant files, writes tests, and sometimes even suggests the
migration. What used to take an hour of focused work can now take ten minutes of
prompting and reviewing.</p>

<p>This speed is genuinely useful. I am not going to pretend otherwise. But it also
makes it dangerously easy to stop doing the real work yourself.</p>

<p>The muscle that actually makes you a programmer is not typing code. It is the
ability to hold a mental model of a system, reason about trade-offs, spot the
smell in an abstraction before it spreads, and debug by thinking instead of
throwing prompts at the wall.</p>

<p>That muscle needs exercise.</p>

<p>With AI, many problems get solved before you ever have to think hard about them.
The friction disappears, and with it goes some of the growth. You still ship the
change, but you may not have learned much. You still get the green tests, but
you may not understand why the solution is shaped the way it is.</p>

<p>At the same time, the power on the other side is absurd. These tools are no
longer just autocomplete. They can act as agents: explore a codebase, make
coordinated changes across files, run commands, observe results, and iterate. It
is like having a tireless pair of hands that can execute at a speed no human can
match.</p>

<p>The leverage is real. Used well, it lets a single developer ship things that
previously required a small team.</p>

<p>The problem is the gap between those two realities. The tools reward you for
staying in the loop of prompting and accepting. They do not punish you for
slowly losing the ability to work without them. You can produce more output
while your underlying capability quietly erodes. You become very good at
directing an artificial programmer instead of remaining a real one yourself.</p>

<p>I have written before that
<a href="/software/2025/11/26/ai-amplifies-programmers-not-replaces-them.html">AI amplifies programmers rather than replacing them</a>.
I still believe that. But amplification only works if there is still something
strong on the receiving end. If the human side atrophies, you do not get 10×
output. You get 10× of whatever shallow thinking you brought to the prompt.</p>

<p>I also still believe that you should
<a href="/software/2025/03/28/learn-to-code-ignore-ai-then-use-ai-to-code-even-better.html">learn to code, ignore AI, then use AI to code even better</a>.
Maybe even more now.</p>

<p>The practical question is not whether to use these tools. You would be foolish
not to. The question is whether you are still doing enough deliberate, unaided
work to keep your own reasoning sharp.</p>

<p>Sometimes that means closing the AI tab and wrestling with the problem the old
way first. Sometimes it means using the model only after you have already formed
your own approach. Sometimes it means reading the generated code line by line
instead of accepting the diff because the tests passed.</p>

<p>The tools are too good to ignore, but they are also too good at letting you
coast.</p>

<p>The programmers who will matter in the next few years are not the ones who
prompt the best. They are the ones who stay sharp enough to know what to prompt
for, when to use the output, and when the output is wrong.</p>

<p>Everything else is just faster typing.</p>]]></content><author><name>Kyrylo Silin</name><email>silin@kyrylo.org</email></author><summary type="html"><![CDATA[I recently got six months of free access to OpenAI’s advanced coding models because of my open-source contributions. I posted about it on X. It’s an incredibly generous offer, and I’ve been using Codex every day since.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kyrylo.org/assets/images/kyrylo-silin@2x.webp" /><media:content medium="image" url="https://kyrylo.org/assets/images/kyrylo-silin@2x.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Stick with defaults</title><link href="https://kyrylo.org/2026/05/20/stick-with-defaults.html" rel="alternate" type="text/html" title="Stick with defaults" /><published>2026-05-20T00:00:00+08:00</published><updated>2026-05-20T20:24:14+08:00</updated><id>https://kyrylo.org/2026/05/20/stick-with-defaults</id><content type="html" xml:base="https://kyrylo.org/2026/05/20/stick-with-defaults.html"><![CDATA[<p>There is a strange instinct among developers to distrust defaults. The moment we
install a new tool, framework, editor, or operating system, many of us
immediately begin searching for “the real setup”. We hunt for configuration
guides, optimization tricks, must-have plugins, and dotfiles maintained by
people with anime avatars and 700-line configuration files.</p>

<p>Somewhere along the way, software customization became a hobby of its own. This
reflects the same pattern behind <a href="/software/2025/08/21/why-do-software-developers-love-complexity.html">why developers love
complexity</a>.</p>

<p>But the longer I write software, the more I appreciate defaults.</p>

<p>The default path is where every user begins. It is the most exercised, most
documented, and most battle-tested part of the product. Thousands or millions of
people have already walked that road before you. Bugs are discovered there
first. Edge cases are encountered there first. Performance issues become visible
there first. When something breaks, the maintainers notice because everyone is
using it.</p>

<p>Defaults are not arbitrary. They are usually the result of years of accumulated
experience and hard-won trade-offs between performance, maintainability,
usability, and predictability. When Rails ships with a certain project
structure, or SQLite enables certain behaviors by default, or a browser decides
how something should work out of the box, there is often more practical
reasoning behind those choices than most developers assume.</p>

<p>The customized path, by contrast, is lonely.</p>

<p>The more you diverge from the defaults, the more you become responsible for your
own ecosystem. Documentation becomes less relevant because your environment no
longer matches what everyone else is using. Tutorials stop applying cleanly.
Upgrades become riskier. You start carrying a collection of tweaks whose
original purpose you no longer remember.</p>

<p><strong>I know this because I used to do exactly that.</strong> I spent countless hours
configuring editors, terminals, Linux desktops, tiling window managers, browser
setups, and JavaScript toolchains in pursuit of some ideal workflow that never
actually arrived. At some point, the setup itself quietly became the project. I
was investing more energy into perfecting the environment than using it to build
things.</p>

<p>Meanwhile, the person using the defaults quietly ships their work.</p>

<p>This is not an argument against customization entirely. Sometimes defaults
genuinely do not fit your needs. Some workloads require tuning. Some preferences
matter. But customization should come from real friction encountered over time,
not from the assumption that the default experience must be inferior simply
because it is common.</p>

<p>There is also a psychological trap here. Developers often associate
customization with expertise. Using the default setup can feel unsophisticated,
as if you are leaving performance or productivity on the table. But many
experienced engineers eventually arrive at the opposite conclusion: simplicity
has value, and every deviation from the standard path carries a maintenance
cost.</p>

<p>A good default reduces cognitive load. It lets you focus on the actual work
instead of endlessly shaping the environment around the work.</p>

<p>This becomes more obvious as software matures. Modern tools are significantly
better than they used to be. Browsers work well without extensions. Rails
defaults are remarkably solid. SQLite handles workloads that people once
considered impossible for it. Even operating systems have become harder to
misconfigure catastrophically.</p>

<p>The industry has slowly learned that good defaults are a feature.</p>

<p>In many cases, the default path is not merely the easiest option. It is the
option refined through the largest amount of real-world usage. That matters.
Software behaves differently under millions of users than it does in theory.</p>

<p>So these days, I try to resist the instinct to immediately optimize and
customize everything. I start with the defaults and stay there until something
repeatedly becomes a real problem. Most of the time, that moment never comes.</p>

<p>And when it does, I at least understand exactly why I am changing something.</p>]]></content><author><name>Kyrylo Silin</name><email>silin@kyrylo.org</email></author><summary type="html"><![CDATA[There is a strange instinct among developers to distrust defaults. The moment we install a new tool, framework, editor, or operating system, many of us immediately begin searching for “the real setup”. We hunt for configuration guides, optimization tricks, must-have plugins, and dotfiles maintained by people with anime avatars and 700-line configuration files.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kyrylo.org/assets/images/kyrylo-silin@2x.webp" /><media:content medium="image" url="https://kyrylo.org/assets/images/kyrylo-silin@2x.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The magic of typing terminal commands</title><link href="https://kyrylo.org/2026/05/11/the-magic-of-typing-terminal-commands.html" rel="alternate" type="text/html" title="The magic of typing terminal commands" /><published>2026-05-11T00:00:00+08:00</published><updated>2026-05-20T20:24:14+08:00</updated><id>https://kyrylo.org/2026/05/11/the-magic-of-typing-terminal-commands</id><content type="html" xml:base="https://kyrylo.org/2026/05/11/the-magic-of-typing-terminal-commands.html"><![CDATA[<p>There is a quiet magic in the terminal.</p>

<p>The screen is black. The cursor blinks — steady and patient. You lean in and
begin to type, your fingers moving with intention across the keys. A few simple
words appear: <code class="language-plaintext highlighter-rouge">ls</code>, <code class="language-plaintext highlighter-rouge">cd</code>, <code class="language-plaintext highlighter-rouge">mkdir</code>, <code class="language-plaintext highlighter-rouge">grep</code>.</p>

<p><img src="/assets/images/posts/the-magic-of-typing-terminal-commands/01.webp" alt="Empty terminal window" /></p>

<p>Then comes the moment of anticipation — that brief pause before you press
<code class="language-plaintext highlighter-rouge">Enter</code>.</p>

<p>And when you do, the terminal answers.</p>

<p>Results appear line by line, precise and immediate. There is something deeply
satisfying about the exchange: you speak in commands, and the machine responds
with clarity.</p>

<p>This is the beauty of the terminal: its power lies in simplicity. A few letters
typed on a black screen can search vast amounts of data, launch processes, and
reshape entire systems.</p>

<p>Here, you are not a passive user. You are the one who speaks — and the machine
listens. Every time you type a command in the terminal, you feel it: the
ancient, elegant magic of turning thought into action with nothing but words.</p>]]></content><author><name>Kyrylo Silin</name><email>silin@kyrylo.org</email></author><summary type="html"><![CDATA[There is a quiet magic in the terminal.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kyrylo.org/assets/images/kyrylo-silin@2x.webp" /><media:content medium="image" url="https://kyrylo.org/assets/images/kyrylo-silin@2x.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">AI will help you climb the wrong ladder faster</title><link href="https://kyrylo.org/2026/04/15/ai-will-help-you-climb-the-wrong-ladder-faster.html" rel="alternate" type="text/html" title="AI will help you climb the wrong ladder faster" /><published>2026-04-15T00:00:00+08:00</published><updated>2026-04-15T10:28:31+08:00</updated><id>https://kyrylo.org/2026/04/15/ai-will-help-you-climb-the-wrong-ladder-faster</id><content type="html" xml:base="https://kyrylo.org/2026/04/15/ai-will-help-you-climb-the-wrong-ladder-faster.html"><![CDATA[<p>One of my biggest disappointments with AI is this:</p>

<p>It will confidently help you build a ladder… even if it’s leaning against the
wrong wall.</p>

<h2 id="the-problem">The problem</h2>

<p>AI keeps moving forward, even when the direction is off. It supports your line
of thinking, refines it, and adds detail, but rarely stops to say:</p>

<blockquote>
  <p>“Now that the requirements are clearer, we should reassess.”</p>
</blockquote>

<p>Instead, it continues optimizing the current path — whether or not it still
makes sense.</p>

<h2 id="why-this-happens-factually">Why this happens (factually)</h2>

<ul>
  <li><strong>Objective mismatch:</strong> AI is optimized to be helpful and responsive, not to
interrupt or challenge direction.</li>
  <li><strong>Weak global reasoning:</strong> It doesn’t reliably maintain a high-level model of
changing requirements unless prompted.</li>
  <li><strong>User intent bias:</strong> It assumes your framing is correct and works within it.</li>
  <li><strong>Reactive nature:</strong> It responds to input, but it doesn’t proactively step
back or redirect.</li>
</ul>

<h2 id="the-result">The result</h2>

<p>If your initial framing is off, the AI will often:</p>

<ul>
  <li>Refine the wrong solution</li>
  <li>Add convincing detail to a flawed approach</li>
  <li>Stay anchored to outdated assumptions</li>
</ul>

<p>Even if you ask it to “reassess”, it may still operate within the same flawed
frame.</p>

<h2 id="what-would-be-better">What would be better</h2>

<p>A more useful system would:</p>

<ul>
  <li>Notice when the problem definition has shifted</li>
  <li>Pause and reframe</li>
  <li>Challenge assumptions</li>
  <li>Suggest stepping back before continuing</li>
</ul>

<h2 id="practical-takeaway">Practical takeaway</h2>

<p>AI is excellent at accelerating execution.</p>

<p>But it won’t reliably tell you if you’re solving the wrong problem. You still
have to move the ladder to the right wall.</p>]]></content><author><name>Kyrylo Silin</name><email>silin@kyrylo.org</email></author><summary type="html"><![CDATA[One of my biggest disappointments with AI is this:]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kyrylo.org/assets/images/kyrylo-silin@2x.webp" /><media:content medium="image" url="https://kyrylo.org/assets/images/kyrylo-silin@2x.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Less decoration, more communication</title><link href="https://kyrylo.org/2026/04/08/less-decoration-more-communication.html" rel="alternate" type="text/html" title="Less decoration, more communication" /><published>2026-04-08T00:00:00+08:00</published><updated>2026-04-08T12:10:17+08:00</updated><id>https://kyrylo.org/2026/04/08/less-decoration-more-communication</id><content type="html" xml:base="https://kyrylo.org/2026/04/08/less-decoration-more-communication.html"><![CDATA[<p>I’ve been rethinking why we rely so heavily on icons in interfaces.</p>

<p>While building a mostly text-based UI for <a href="https://telesink.com">Telesink</a>, something became obvious: icons make
things look polished, but they rarely make things clearer.</p>

<p><img src="/assets/images/posts/less-decoration-mode-communication/01.webp" alt="Telesink settings" /></p>

<p>We tend to treat icons as essential. In reality, they’re situational.</p>

<p>They help when:</p>

<ul>
  <li>👍 Multilingual products: not everyone speaks the same language, icons provide
rough affordances</li>
  <li>👍 Space-constrained UIs: when labels don’t fit (mobile, dense tables)</li>
  <li>👍 Repeated actions: once learned, icons are faster to scan</li>
  <li>👍 Visual grouping: they help chunk related actions</li>
  <li>👍 Status &amp; feedback: success, warning, loading are instantly recognizable</li>
</ul>

<p>But most of the time, they’re not necessary:</p>

<ul>
  <li>👎 They have to be learned (many aren’t universal)</li>
  <li>👎 They’re ambiguous without labels</li>
  <li>👎 They slow down new users</li>
  <li>👎 They add visual noise without adding meaning</li>
  <li>👎 They increase design and consistency overhead</li>
  <li>👎 Text is more accessible (screen readers, clarity, localization control)</li>
</ul>

<p>So for Telesink, I chose a mostly text-only interface. Not as a stylistic
choice, but a practical one:</p>

<ul>
  <li>✅ clearer actions</li>
  <li>✅ less guesswork</li>
  <li>✅ faster onboarding</li>
  <li>✅ simpler to build and maintain</li>
</ul>

<h2 id="my-rule-of-thumb">My rule of thumb</h2>

<p>Whenever I’m deciding whether to use an icon or text, I now run it through two
simple questions:</p>

<ul>
  <li>Would a first-time user understand this instantly?</li>
  <li>Does the icon truly add clarity, or is it mostly decoration?</li>
</ul>

<p>If it doesn’t pass both tests with a clear “yes”, I default to text.</p>

<p>This mental filter has dramatically reduced visual clutter and forced me to
focus on actual communication rather than aesthetic habit.</p>

<p>Less decoration, more communication.</p>]]></content><author><name>Kyrylo Silin</name><email>silin@kyrylo.org</email></author><summary type="html"><![CDATA[I’ve been rethinking why we rely so heavily on icons in interfaces.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kyrylo.org/assets/images/kyrylo-silin@2x.webp" /><media:content medium="image" url="https://kyrylo.org/assets/images/kyrylo-silin@2x.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>