<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>In Rust We Trust 🦀 - productivity</title>
      <link>https://nikolaishelekhov.com</link>
      <description>Nikolai is a Rust software engineer building high-performance systems, backend and blockchain infrastructure.</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://nikolaishelekhov.com/tags/productivity/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Tue, 03 Feb 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Why Vim Felt Inevitable</title>
          <pubDate>Tue, 03 Feb 2026 00:00:00 +0000</pubDate>
          <author>Nikolai Shelekhov</author>
          <link>https://nikolaishelekhov.com/blog/why-vim/</link>
          <guid>https://nikolaishelekhov.com/blog/why-vim/</guid>
          <description xml:base="https://nikolaishelekhov.com/blog/why-vim/">&lt;p&gt;I didn’t switch to Vim because it was trendy.&lt;br &#x2F;&gt;
I switched because everything else started to feel wrong.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;it-started-with-friction&quot;&gt;It Started With Friction&lt;&#x2F;h2&gt;
&lt;p&gt;Over time, I became increasingly sensitive to small inefficiencies:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Reaching for the mouse&lt;&#x2F;li&gt;
&lt;li&gt;Breaking typing flow&lt;&#x2F;li&gt;
&lt;li&gt;Context switching between tools&lt;&#x2F;li&gt;
&lt;li&gt;UI-heavy editors fighting my focus&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Individually, these are minor.&lt;br &#x2F;&gt;
Collectively, they compound.&lt;&#x2F;p&gt;
&lt;p&gt;As someone who cares about systems performance at the kernel and runtime level, it felt inconsistent to tolerate inefficiency in my own development workflow.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-ergonomics-shift&quot;&gt;The Ergonomics Shift&lt;&#x2F;h2&gt;
&lt;p&gt;The turning point wasn’t Vim itself — it was ergonomics.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Moving to compact keyboards&lt;&#x2F;li&gt;
&lt;li&gt;Optimizing for home-row typing&lt;&#x2F;li&gt;
&lt;li&gt;Reducing hand movement&lt;&#x2F;li&gt;
&lt;li&gt;Eliminating unnecessary reach&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Once you train your hands to stay anchored, the mouse becomes an interruption.&lt;&#x2F;p&gt;
&lt;p&gt;Traditional editors assume pointer interaction. Vim assumes intent expressed through motion.&lt;&#x2F;p&gt;
&lt;p&gt;That difference is fundamental.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;modal-editing-and-systems-thinking&quot;&gt;Modal Editing and Systems Thinking&lt;&#x2F;h2&gt;
&lt;p&gt;What clicked for me was this:&lt;&#x2F;p&gt;
&lt;p&gt;Vim treats text editing like a language.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Verbs (&lt;code&gt;d&lt;&#x2F;code&gt;, &lt;code&gt;c&lt;&#x2F;code&gt;, &lt;code&gt;y&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;Motions (&lt;code&gt;w&lt;&#x2F;code&gt;, &lt;code&gt;}&lt;&#x2F;code&gt;, &lt;code&gt;t(&lt;&#x2F;code&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;Objects (&lt;code&gt;iw&lt;&#x2F;code&gt;, &lt;code&gt;ap&lt;&#x2F;code&gt;, etc.)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;You compose actions instead of triggering commands.&lt;&#x2F;p&gt;
&lt;p&gt;That composability mirrors how I think about system design:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Small primitives&lt;&#x2F;li&gt;
&lt;li&gt;Clear contracts&lt;&#x2F;li&gt;
&lt;li&gt;Composable building blocks&lt;&#x2F;li&gt;
&lt;li&gt;Zero unnecessary abstraction&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It felt closer to Rust than to an IDE.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-neovim-not-just-vim&quot;&gt;Why Neovim (Not Just Vim)&lt;&#x2F;h2&gt;
&lt;p&gt;I eventually moved to Neovim for practical reasons:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Native LSP integration&lt;&#x2F;li&gt;
&lt;li&gt;Async plugin model&lt;&#x2F;li&gt;
&lt;li&gt;Lua configuration&lt;&#x2F;li&gt;
&lt;li&gt;Tight terminal integration&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I wiped prebuilt configs and built my setup from scratch.&lt;&#x2F;p&gt;
&lt;p&gt;Not because prebuilt configs are bad —&lt;br &#x2F;&gt;
but because understanding your tools matters.&lt;&#x2F;p&gt;
&lt;p&gt;When your editor becomes infrastructure, you should know how it works.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-real-benefit&quot;&gt;The Real Benefit&lt;&#x2F;h2&gt;
&lt;p&gt;The biggest gain wasn’t speed.&lt;&#x2F;p&gt;
&lt;p&gt;It was flow.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Fewer context switches&lt;&#x2F;li&gt;
&lt;li&gt;No mouse dependency&lt;&#x2F;li&gt;
&lt;li&gt;Terminal + editor unified&lt;&#x2F;li&gt;
&lt;li&gt;Predictable behavior&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The editor stopped being a UI and became an extension of intent.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;is-it-for-everyone&quot;&gt;Is It For Everyone?&lt;&#x2F;h2&gt;
&lt;p&gt;No.&lt;&#x2F;p&gt;
&lt;p&gt;Vim has a learning curve.
It requires patience.
It requires deliberate practice.&lt;&#x2F;p&gt;
&lt;p&gt;But if you:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Care about ergonomics&lt;&#x2F;li&gt;
&lt;li&gt;Think in composable primitives&lt;&#x2F;li&gt;
&lt;li&gt;Prefer keyboard-driven workflows&lt;&#x2F;li&gt;
&lt;li&gt;Enjoy understanding your tooling deeply&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Then it may feel less like a choice —&lt;br &#x2F;&gt;
and more like inevitability.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>How I Keep Up With Tech Trends</title>
          <pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate>
          <author>Nikolai Shelekhov</author>
          <link>https://nikolaishelekhov.com/blog/how-i-keep-up-with-tech-trends/</link>
          <guid>https://nikolaishelekhov.com/blog/how-i-keep-up-with-tech-trends/</guid>
          <description xml:base="https://nikolaishelekhov.com/blog/how-i-keep-up-with-tech-trends/">&lt;p&gt;“How do you follow all the tech news and programming trends?”&lt;&#x2F;p&gt;
&lt;p&gt;I sometimes get this question in interviews.&lt;&#x2F;p&gt;
&lt;p&gt;My answer is simple:&lt;&#x2F;p&gt;
&lt;p&gt;RSS.&lt;&#x2F;p&gt;
&lt;p&gt;Yes — that “dead” technology from the 2000s.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-rss-still-wins&quot;&gt;Why RSS Still Wins&lt;&#x2F;h2&gt;
&lt;p&gt;Modern content consumption is algorithm-driven:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Infinite scroll&lt;&#x2F;li&gt;
&lt;li&gt;Engagement optimization&lt;&#x2F;li&gt;
&lt;li&gt;Notification loops&lt;&#x2F;li&gt;
&lt;li&gt;Recommended content you didn’t ask for&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The result is noise.&lt;&#x2F;p&gt;
&lt;p&gt;RSS flips the model.&lt;&#x2F;p&gt;
&lt;p&gt;You choose the sources.
You get the updates.
Nothing else.&lt;&#x2F;p&gt;
&lt;p&gt;No ads.
No ranking algorithms.
No engagement tricks.&lt;&#x2F;p&gt;
&lt;p&gt;Just a chronological stream of content you explicitly subscribed to.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-most-people-don-t-realize&quot;&gt;What Most People Don’t Realize&lt;&#x2F;h2&gt;
&lt;p&gt;Most technical platforms still publish RSS feeds:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Tech blogs&lt;&#x2F;li&gt;
&lt;li&gt;Documentation sites&lt;&#x2F;li&gt;
&lt;li&gt;Security advisories&lt;&#x2F;li&gt;
&lt;li&gt;GitHub releases&lt;&#x2F;li&gt;
&lt;li&gt;YouTube channels&lt;&#x2F;li&gt;
&lt;li&gt;Reddit communities&lt;&#x2F;li&gt;
&lt;li&gt;Mastodon accounts&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;RSS never died.
It just stopped being marketed.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;my-setup&quot;&gt;My Setup&lt;&#x2F;h2&gt;
&lt;p&gt;I use &lt;strong&gt;News Explorer&lt;&#x2F;strong&gt; as my primary reader.&lt;&#x2F;p&gt;
&lt;p&gt;It supports:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;RSS feeds&lt;&#x2F;li&gt;
&lt;li&gt;YouTube&lt;&#x2F;li&gt;
&lt;li&gt;Reddit&lt;&#x2F;li&gt;
&lt;li&gt;Mastodon&lt;&#x2F;li&gt;
&lt;li&gt;Bluesky&lt;&#x2F;li&gt;
&lt;li&gt;Podcasts&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Everything syncs via iCloud across devices.&lt;&#x2F;p&gt;
&lt;p&gt;No external accounts.
No cloud dashboards.
No algorithmic layer.&lt;&#x2F;p&gt;
&lt;p&gt;Just folders and feeds.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;scale&quot;&gt;Scale&lt;&#x2F;h2&gt;
&lt;p&gt;I currently track 6,000+ articles across:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Rust&lt;&#x2F;li&gt;
&lt;li&gt;Polkadot&lt;&#x2F;li&gt;
&lt;li&gt;Solana&lt;&#x2F;li&gt;
&lt;li&gt;Security advisories&lt;&#x2F;li&gt;
&lt;li&gt;Systems programming blogs&lt;&#x2F;li&gt;
&lt;li&gt;General software engineering&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;All organized.
All searchable.
All in one place.&lt;&#x2F;p&gt;
&lt;p&gt;It replaces:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Dozens of open tabs&lt;&#x2F;li&gt;
&lt;li&gt;Social media scrolling&lt;&#x2F;li&gt;
&lt;li&gt;Random bookmarking&lt;&#x2F;li&gt;
&lt;li&gt;“I’ll read this later” lists&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;the-real-advantage&quot;&gt;The Real Advantage&lt;&#x2F;h2&gt;
&lt;p&gt;RSS creates a pull-based information system.&lt;&#x2F;p&gt;
&lt;p&gt;You are not fed content.
You poll your sources.&lt;&#x2F;p&gt;
&lt;p&gt;This small inversion has large consequences:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;No FOMO&lt;&#x2F;li&gt;
&lt;li&gt;No engagement pressure&lt;&#x2F;li&gt;
&lt;li&gt;No missing updates because an algorithm deprioritized them&lt;&#x2F;li&gt;
&lt;li&gt;No context switching into unrelated content&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It is closer to how engineers think:&lt;&#x2F;p&gt;
&lt;p&gt;Deterministic input.
Controlled sources.
Minimal noise.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;when-it-makes-sense&quot;&gt;When It Makes Sense&lt;&#x2F;h2&gt;
&lt;p&gt;RSS works best if:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;You care about specific ecosystems&lt;&#x2F;li&gt;
&lt;li&gt;You follow technical releases closely&lt;&#x2F;li&gt;
&lt;li&gt;You want signal over volume&lt;&#x2F;li&gt;
&lt;li&gt;You value focus over discovery&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It is not optimized for entertainment.&lt;&#x2F;p&gt;
&lt;p&gt;It is optimized for clarity.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;final-thought&quot;&gt;Final Thought&lt;&#x2F;h2&gt;
&lt;p&gt;If you feel like you are drowning in tabs,
or missing important updates because a feed decided they were “low engagement,”&lt;&#x2F;p&gt;
&lt;p&gt;try RSS.&lt;&#x2F;p&gt;
&lt;p&gt;Sometimes the most boring technology
is the most effective one.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Running Multiple Claude Instances in Parallel</title>
          <pubDate>Fri, 12 Dec 2025 00:00:00 +0000</pubDate>
          <author>Nikolai Shelekhov</author>
          <link>https://nikolaishelekhov.com/blog/parallel-claude-instances/</link>
          <guid>https://nikolaishelekhov.com/blog/parallel-claude-instances/</guid>
          <description xml:base="https://nikolaishelekhov.com/blog/parallel-claude-instances/">&lt;p&gt;The first time I waited twenty minutes for Claude to finish implementing a feature — only to realize it went in the wrong direction — I thought:&lt;&#x2F;p&gt;
&lt;p&gt;There has to be a better way.&lt;&#x2F;p&gt;
&lt;p&gt;There is.&lt;&#x2F;p&gt;
&lt;p&gt;Instead of running one AI assistant sequentially, I run multiple Claude Code instances in parallel. Each works on the same problem in isolated git worktrees. When they finish, I compare results and keep the best parts.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-core-insight&quot;&gt;The Core Insight&lt;&#x2F;h2&gt;
&lt;p&gt;AI assistants are not deterministic.&lt;&#x2F;p&gt;
&lt;p&gt;Same prompt.&lt;br &#x2F;&gt;
Same model.&lt;br &#x2F;&gt;
Different results.&lt;&#x2F;p&gt;
&lt;p&gt;Sometimes the first attempt is excellent.&lt;br &#x2F;&gt;
Sometimes it drifts.&lt;br &#x2F;&gt;
Sometimes it confidently builds the wrong abstraction.&lt;&#x2F;p&gt;
&lt;p&gt;If you work sequentially, each attempt is a gamble.&lt;br &#x2F;&gt;
You wait, evaluate, retry.&lt;&#x2F;p&gt;
&lt;p&gt;Parallelizing removes the waiting loop.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-git-worktrees&quot;&gt;Why Git Worktrees&lt;&#x2F;h2&gt;
&lt;p&gt;Branches alone aren’t enough. They are just pointers.&lt;&#x2F;p&gt;
&lt;p&gt;Git worktrees create:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Separate working directories&lt;&#x2F;li&gt;
&lt;li&gt;Each with its own checked-out branch&lt;&#x2F;li&gt;
&lt;li&gt;Sharing the same repository history&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;That means you can have multiple implementations evolving simultaneously without stashing or context switching.&lt;&#x2F;p&gt;
&lt;p&gt;Same repo.&lt;br &#x2F;&gt;
Same base commit.&lt;br &#x2F;&gt;
Multiple active solutions.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;my-workflow&quot;&gt;My Workflow&lt;&#x2F;h2&gt;
&lt;p&gt;I use a small helper command:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;git parallel &amp;quot;add-auth&amp;quot; --agents 3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Creates three worktrees:
&lt;ul&gt;
&lt;li&gt;add-auth-1&lt;&#x2F;li&gt;
&lt;li&gt;add-auth-2&lt;&#x2F;li&gt;
&lt;li&gt;add-auth-3&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Launches Zellij&lt;&#x2F;li&gt;
&lt;li&gt;Starts Claude Code in each pane&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Then I:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Give each instance the same prompt&lt;&#x2F;li&gt;
&lt;li&gt;Let them run in parallel&lt;&#x2F;li&gt;
&lt;li&gt;Come back later to compare outputs&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;what-happens-in-practice&quot;&gt;What Happens in Practice&lt;&#x2F;h2&gt;
&lt;p&gt;Typically:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;One implementation is overengineered&lt;&#x2F;li&gt;
&lt;li&gt;One misses edge cases&lt;&#x2F;li&gt;
&lt;li&gt;One is clean and well-structured&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Sometimes:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Each has a strong idea worth keeping&lt;&#x2F;li&gt;
&lt;li&gt;The final solution becomes a synthesis&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Instead of restarting the same assistant three times, I evaluate three candidates.&lt;&#x2F;p&gt;
&lt;p&gt;Total elapsed time is roughly the same as one attempt.&lt;&#x2F;p&gt;
&lt;p&gt;The quality of outcome is consistently better.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;where-this-works-best&quot;&gt;Where This Works Best&lt;&#x2F;h2&gt;
&lt;p&gt;This approach shines when:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Designing new features&lt;&#x2F;li&gt;
&lt;li&gt;Refactoring complex modules&lt;&#x2F;li&gt;
&lt;li&gt;Exploring architectural directions&lt;&#x2F;li&gt;
&lt;li&gt;Working in ambiguous problem spaces&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It is unnecessary for:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Small bug fixes&lt;&#x2F;li&gt;
&lt;li&gt;Mechanical changes&lt;&#x2F;li&gt;
&lt;li&gt;Deterministic tasks&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Parallelization only makes sense when multiple valid solutions exist.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-mindset-shift&quot;&gt;The Mindset Shift&lt;&#x2F;h2&gt;
&lt;p&gt;The mistake is treating AI as an oracle.&lt;&#x2F;p&gt;
&lt;p&gt;It isn’t.&lt;&#x2F;p&gt;
&lt;p&gt;It is a probabilistic generator.&lt;&#x2F;p&gt;
&lt;p&gt;The better framing:&lt;&#x2F;p&gt;
&lt;p&gt;You are running experiments.&lt;&#x2F;p&gt;
&lt;p&gt;Each agent instance is a sample from a distribution of possible implementations.&lt;&#x2F;p&gt;
&lt;p&gt;Your job is evaluation and selection.&lt;&#x2F;p&gt;
&lt;p&gt;This turns AI assistance from a linear conversation into a parallel search process.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tradeoffs&quot;&gt;Tradeoffs&lt;&#x2F;h2&gt;
&lt;p&gt;Is it more resource-intensive?&lt;&#x2F;p&gt;
&lt;p&gt;Yes.&lt;&#x2F;p&gt;
&lt;p&gt;Does it consume more tokens?&lt;&#x2F;p&gt;
&lt;p&gt;Yes.&lt;&#x2F;p&gt;
&lt;p&gt;But developer time is expensive.
Waiting is frustrating.
Context switching is costly.&lt;&#x2F;p&gt;
&lt;p&gt;I would rather review three implementations once than restart one implementation three times.&lt;&#x2F;p&gt;
&lt;p&gt;Parallel AI feels closer to how we approach distributed systems:&lt;&#x2F;p&gt;
&lt;p&gt;Spawn workers.&lt;br &#x2F;&gt;
Collect results.&lt;br &#x2F;&gt;
Select the best outcome.&lt;&#x2F;p&gt;
&lt;p&gt;It turns uncertainty into leverage.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
