<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Vlad Dyachenko on Medium]]></title>
        <description><![CDATA[Stories by Vlad Dyachenko on Medium]]></description>
        <link>https://medium.com/@wowinter13?source=rss-e8e1b50dd038------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*fSQnJfu7ltXRoqEfN-Ff_g.jpeg</url>
            <title>Stories by Vlad Dyachenko on Medium</title>
            <link>https://medium.com/@wowinter13?source=rss-e8e1b50dd038------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 17 May 2026 12:59:58 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@wowinter13/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Why mono-repos? Mono-repos, Monoliths and Dependencies.]]></title>
            <link>https://levelup.gitconnected.com/why-mono-repos-mono-repos-monoliths-and-dependencies-c7f57dc826e9?source=rss-e8e1b50dd038------2</link>
            <guid isPermaLink="false">https://medium.com/p/c7f57dc826e9</guid>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[best-practices]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[software-architecture]]></category>
            <dc:creator><![CDATA[Vlad Dyachenko]]></dc:creator>
            <pubDate>Sun, 28 Sep 2025 19:49:12 GMT</pubDate>
            <atom:updated>2025-09-28T19:49:12.354Z</atom:updated>
            <content:encoded><![CDATA[<h4><em>We’ve moved past the hype of overly complex microservices architectures. Now it’s time to have a grounded discussion about the real challenges mono-repos aim to solve.</em></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*UNYA8jRyEFG40Z3aXfgw3w.png" /><figcaption>Or how to build a mental model for understanding large codebases, the tools and techniques used for managing them.</figcaption></figure><h3>Intro</h3><p>Modern engineering teams often ask: “Should we use a mono-repo?” But this question usually hides deeper ones: How are our applications and teams structured? How are responsibilities and dependencies managed?</p><p>Let’s build a mental model for thinking about mono-repos and dependencies beyond just tools. I’ll demystify terms like “monolith” and “mono-repo” through real examples and practical stories.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7c8hZMAGPiWpkxqsN61eNQ.png" /><figcaption>Is the monolith…not scalable?</figcaption></figure><h3>Definitions: Same Thing, Different Names</h3><p>In purely technical terms, there’s no difference between mono-repos and monoliths. They both refer to a single source repository that contains multiple applications with related code, but multiple separate “outputs”</p><p>The biggest difference lies in how these “outputs” are structured:</p><ul><li>The monolith: Multiple APIs and web pages exposed, but the entire repository is deployed together</li><li>Modern mono-repos: Different parts can potentially be deployed independently</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ohcXBji7vGv-AIMw.jpg" /><figcaption>Monolith” (probably) derived from “<em>Monolithic architecture describes buildings which are carved, cast or excavated from a single piece of material, historically from rock”</em></figcaption></figure><p>Think of a monolith like monolithic architecture in buildings carved from a single piece of material. It may have multiple uses, but it’s fundamentally one thing.</p><p>Let’s start with something familiar — our oldest mono-repo. The monolith has:</p><ul><li>One shared database (MongoDB)</li><li>Multiple JSON APIs</li><li>Multiple HTML UIs (some forms, settings, admin)</li><li>Separate “engines” for different functionalities</li></ul><p>The key insight: these outputs share <strong>the same database</strong>, so they also need to share <strong>the same model logic</strong>. If you change anything in MongoDB, you’ll often need to update multiple engines.</p><p>This shared dependency is exactly what mono-repos help us manage.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FolxoNDBp6Rg%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DolxoNDBp6Rg&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FolxoNDBp6Rg%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/ade2d16b91bd699d5d5897f34c2acb7f/href">https://medium.com/media/ade2d16b91bd699d5d5897f34c2acb7f/href</a></iframe><h4>From Simple to Complex</h4><p>Every application starts simple (maybe just one file). As you add features, you naturally create dependencies:</p><pre>// Feature 1 imports shared utilities<br>import { sharedFunction } from &#39;./utils&#39;;<br><br>// Feature 2 also uses the same utilities<br>import { sharedFunction } from &#39;./utils&#39;;</pre><p>This creates a dependency tree where both features depend on shared utilities. It’s the DRY principle (Don’t Repeat Yourself) in action.</p><h4>The Russian Nesting Dolls Paradigm 🪆</h4><ol><li>What happens when our application needs to become more than one single application?</li><li>What happens when two parts of the application need to be in different repositories/languages?</li><li>How does that relate to dependencies?</li></ol><p>As applications grow, we extend this paradigm from file-level to application-level dependencies. Just like Matryoshka dolls, it’s the same concept at a larger scale.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/0*nA7HvEib0osnU5dy.gif" /></figure><h3>Dependency Classification: Strict vs. Loose</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Xec2_KPJewxoYURPP1uyQg.png" /><figcaption>Classifying dependencies by Usage</figcaption></figure><p>Understanding dependency types is crucial for mono-repo decisions:</p><h4>Strict Dependencies</h4><ul><li>Internal imports/includes: Breaking changes are manageable because you control all the code</li><li>Dependent tasks: If one fails, dependent tasks will fail quickly</li><li>Database structure changes: You can see all affected areas immediately</li></ul><h3>Loose Dependencies</h3><ul><li>HTTP APIs: Should be robust and handle changes gracefully</li><li>External packages: Versioned and can be updated at your pace</li></ul><p>Key insight: If you’re working with mostly strict dependencies, you’ll benefit from a mono-repo. If working with mostly loose dependencies, separate repositories might be better.</p><h3>Separation of Concerns</h3><p>Mono-repos allow us to create hard boundaries and explicit dependencies in our codebase. Common reasons include:</p><h4>1. Shared Dependencies (Tightly Coupled)</h4><p>Example: Monolith engines sharing MongoDB access</p><h4>2. Ordered Task Execution</h4><p>Example: Integration tests needing the application running successfully first. Or building a Typescript application requires type-checking to pass.</p><h4>3. Package Boundaries</h4><p>Example: Exposing part of an application as a package while preventing internal dependencies from bleeding out</p><h4>4. Team Ownership</h4><p>Example: Different squads responsible for different engines, but all sharing core infrastructure</p><h3>Decision Framework: Mono-repo vs. Separate Repos</h3><p>Here’s a practical guide for making the choice:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Uld6jefcq6PtYuZsKGGlDw.png" /></figure><p>Remember: Synchronized deployments between separate repos are always painful and should be avoided if possible.</p><h3>“It Depends”</h3><p>There’s no universal best practice for mono-repos. You need to understand that mono-repos exist to manage dependencies and separation of concerns.</p><p>Key principles:</p><ul><li>Understand your dependency types (strict vs. loose)</li><li>Identify shared code and utilities</li><li>Consider team structure and ownership</li><li>Evaluate deployment requirements</li><li>Choose consistent development processes</li></ul><h3>TLDR;</h3><ul><li>Mono-repos and monoliths are technically the same thing</li><li>The decision hinges on dependency management and separation of concerns</li><li>Strict dependencies favor mono-repos; loose dependencies favor separate repos</li><li>There are no universal best practices — it depends on your specific context</li><li>Understanding these concepts becomes crucial as AI changes how we write code</li></ul><p>The goal isn’t to follow trends or use the latest tools. It’s to build maintainable systems that serve your team and users effectively. Whether that’s a mono-repo, multiple repositories, or something in between depends entirely on your specific dependencies and constraints.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c7f57dc826e9" width="1" height="1" alt=""><hr><p><a href="https://levelup.gitconnected.com/why-mono-repos-mono-repos-monoliths-and-dependencies-c7f57dc826e9">Why mono-repos? Mono-repos, Monoliths and Dependencies.</a> was originally published in <a href="https://levelup.gitconnected.com">Level Up Coding</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[I’m Tired of Reviewing AI Slop]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://ai.gopubby.com/im-tired-of-reviewing-ai-slop-cae831b3408c?source=rss-e8e1b50dd038------2"><img src="https://cdn-images-1.medium.com/max/600/0*TSObFl_u0V5Kkxfe.gif" width="600"></a></p><p class="medium-feed-snippet">Or: Basic Counterespionage Techniques to Make Your Code Better with Prompt-Driven Development.</p><p class="medium-feed-link"><a href="https://ai.gopubby.com/im-tired-of-reviewing-ai-slop-cae831b3408c?source=rss-e8e1b50dd038------2">Continue reading on AI Advances »</a></p></div>]]></description>
            <link>https://ai.gopubby.com/im-tired-of-reviewing-ai-slop-cae831b3408c?source=rss-e8e1b50dd038------2</link>
            <guid isPermaLink="false">https://medium.com/p/cae831b3408c</guid>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[interview]]></category>
            <category><![CDATA[ruby]]></category>
            <category><![CDATA[rust]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Vlad Dyachenko]]></dc:creator>
            <pubDate>Tue, 12 Aug 2025 01:19:46 GMT</pubDate>
            <atom:updated>2025-08-12T01:19:46.532Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[The Transparency Problem in Solana and how getIDL is helping to solve it]]></title>
            <link>https://itnext.io/the-transparency-problem-in-solana-and-how-getidl-is-helping-to-solve-it-5ed472754221?source=rss-e8e1b50dd038------2</link>
            <guid isPermaLink="false">https://medium.com/p/5ed472754221</guid>
            <category><![CDATA[reverse-engineering]]></category>
            <category><![CDATA[rust]]></category>
            <category><![CDATA[anchor]]></category>
            <category><![CDATA[solana-network]]></category>
            <category><![CDATA[pinocchio]]></category>
            <dc:creator><![CDATA[Vlad Dyachenko]]></dc:creator>
            <pubDate>Tue, 17 Jun 2025 22:28:17 GMT</pubDate>
            <atom:updated>2025-06-17T22:28:17.393Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/854/1*nVzz-qozPLwko7E2Rg_Fmw.gif" /></figure><p>In the fast-paced world of blockchain development, Solana stands out as a high-performance platform for decentralized applications (dApps). Yet, a persistent challenge complicates the experience for developers and security researchers alike: many Solana programs are closed-source and do not publish their Interface Definition Language (IDL). This article delves into why IDLs matter, the problems their absence creates, and how tools like getIDL.xyz are stepping in to address the issue, fostering greater transparency in the Solana ecosystem.</p><h3>What is an IDL and Why Does It Matter?</h3><p>An Interface Definition Language (IDL) in Solana is a JSON file that acts as a blueprint for interacting with a Solana program. It outlines the program’s public interface, detailing account structures, instructions, and error codes. Think of it as an instruction manual akin to an Application Binary Interface (ABI) in Ethereum that tells developers how to call functions, pass parameters, and interpret responses.</p><p>IDLs are invaluable for several reasons:</p><ul><li><strong>Simplified Integration:</strong> They allow developers to generate client-side code quickly, streamlining the process of building dApps that communicate with Solana programs.</li><li><strong>Consistency:</strong> By standardizing program interactions, IDLs reduce errors and ensure reliable communication between dApps and on-chain programs.</li><li><strong>Security Analysis:</strong> For researchers, IDLs provide critical insights into a program’s structure, making it easier to audit for vulnerabilities.</li></ul><p>Without an IDL, interacting with a Solana program becomes a guessing game, requiring developers to reverse-engineer the interface – a task that’s both time-intensive and prone to mistakes.</p><h3>The Problem: A Lack of Transparency</h3><p>The Solana ecosystem faces a notable transparency gap. Recent data reveals that only about 50% of the top 100 Solana programs and a mere 20% of the top 1,000 publish their IDLs. This scarcity poses significant hurdles:</p><ul><li><strong>For Developers:</strong> Integrating with a closed-source program without an IDL means painstakingly deciphering its bytecode or transaction data. This extra work slows down development and increases the risk of errors.</li><li><strong>For Security Researchers:</strong> Analyzing a program’s security without an IDL is like assembling a puzzle with missing pieces. It hampers efforts to identify vulnerabilities, raising the stakes for the entire ecosystem.</li></ul><p>As one researcher put it, “Every integration and every meaningful security analysis starts with a fundamental question: how do I even talk to that program?” Without an IDL, answering that question demands unnecessary effort and introduces opacity where clarity is needed most.</p><h3>Enter getIDL: Recovering the Missing Manual</h3><p>To tackle this issue, I created a tool called getIDL.xyz that has emerged as a practical solution. Designed to recover IDLs from closed-source Solana programs (particularly those built with the Anchor framework) getIDL uses clever analysis to reconstruct the instruction manual that developers and researchers crave.</p><h3>How getIDL Works (for Anchor-based programs)</h3><p>getIDL leverages the structure of Anchor, a widely used framework for Solana development that embeds specific markers into program bytecode. Here’s a high-level look at its process:</p><ol><li><strong>Instruction Detection:</strong> Anchor inserts a function at the start of each instruction handler. getIDL scans the bytecode to identify these entry points and uncover the program’s instructions.</li><li><strong>Account Analysis:</strong> Using Anchor’s try_account function, the tool follows the control flow to determine the accounts required for each instruction, along with constraints like mutability or signer status.</li><li><strong>Parameter Inference:</strong> Parameters are trickier, lacking clear patterns. getIDL employs a mix of simulation, trial-and-error, and educated guesses to infer parameter types and lengths.</li></ol><p>The result? A reconstructed IDL that, while not flawless, captures critical details like instruction names, account requirements, and basic parameters. It may miss nuances like structural account relationships or bump seeds, but it provides a solid foundation for further exploration.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*cTq1Irg1LfXeOsrw.gif" /><figcaption>As easy as taking candy from a baby</figcaption></figure><h3>Limitations and Strengths</h3><p>getIDL shines with Anchor-based programs, where its accuracy is impressive, but right now it’s less effective for programs built without Anchor or with heavy customization. Still, its ability to save hours of manual reverse-engineering makes it a game-changer for many use cases, from dApp integration to transaction decoding.</p><h3>Moving Forward: Transparency as a Goal</h3><p>While getIDL is a powerful aid, it’s not a full substitute for published IDLs. The ideal solution remains for developers to share their programs’ IDLs openly, reducing reliance on recovery tools. Transparency benefits everyone: speeding up development, enhancing security, and fostering collaboration.</p><p>For now, tools like getIDL serve as a bridge, illuminating the workings of closed-source programs and easing the burden on the community. Available open-source on GitHub, alongside a detailed technical breakdown on sec3.dev, it invites contributions and exploration from anyone interested in advancing Solana’s ecosystem.</p><p>In a blockchain world where openness drives progress, the push for accessible IDLs and the tools that support it, remains a vital step forward.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5ed472754221" width="1" height="1" alt=""><hr><p><a href="https://itnext.io/the-transparency-problem-in-solana-and-how-getidl-is-helping-to-solve-it-5ed472754221">The Transparency Problem in Solana and how getIDL is helping to solve it</a> was originally published in <a href="https://itnext.io">ITNEXT</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[2025: Open Source as the Only Way to Enter the Job Market]]></title>
            <link>https://levelup.gitconnected.com/2025-open-source-as-the-only-way-to-enter-the-job-market-59fbc249972d?source=rss-e8e1b50dd038------2</link>
            <guid isPermaLink="false">https://medium.com/p/59fbc249972d</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[blockchain]]></category>
            <category><![CDATA[open-source]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Vlad Dyachenko]]></dc:creator>
            <pubDate>Fri, 06 Jun 2025 03:32:40 GMT</pubDate>
            <atom:updated>2025-06-06T03:32:40.619Z</atom:updated>
            <content:encoded><![CDATA[<blockquote>How to find your first open source crypto project and why right now it’s more important than ever.</blockquote><p><em>(Just a bit of native ads)</em> TLDR: just use <a href="https://opencryptolist.xyz">https://opencryptolist.xyz</a> and find your first issue literally in 3 clicks.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*D8Zcjjm85HCO0r3R_saY2A.png" /></figure><h3>(I) Preamble for oldfags: 💀 Juniors RIP (soon) 💀</h3><p>I’ve been reading Hacker News comments and noticing that the barrier to entry into IT is rising. Junior developers are being laid off en masse and replaced by LLMs.</p><p>Remember how people used to enter the profession? You’d get hired by a company, be given small tasks, and learn the job that way. Well, AI is disrupting that process now. A lot of basic operations: from debugging code to handling documents can easily be done by language models.</p><p>These kinds of tasks used to be a sort of “playground” for newcomers. Through small assignments, people would get familiar with the specifics of the work and gain experience to grow further. But now, thanks to AI, that stepping stone on the career ladder is disappearing. Beginners are being forced to learn and master skills on the fly, essentially skipping the traditional “start from the basics.”</p><p>At the same time, according to Indeed, in two thirds of all job positions, more than half of the required skills can already be performed by generative AI, which only makes the situation worse.</p><p>For now, the demand for junior staff hasn’t vanished, although it has clearly become much harder for graduates to find a job. Companies expect junior specialists to already possess advanced skills: a basic understanding of how to work with AI, the ability to learn independently, and so on.</p><h3>(II) Why Contribute to Open Source?</h3><p>There are two main reasons to contribute to open source:</p><ol><li><strong>Give Back:</strong><br>If you’ve benefited from software written and freely shared by others, you might want to pay it forward. Contributing is a great way to say thanks to the community.</li><li><strong>Advance Your Career:</strong><br>Especially if you’re new to coding, contributing to open source gives you real-world experience. It boosts your resume and helps you network with other developers. Many opportunities come through open-source visibility.</li></ol><p>Whatever your motivation, most open-source projects are happy to have contributors, as long as you follow the guidelines and make meaningful contributions.</p><h3>(III) So, Why Now?</h3><p>Let’s say you’re a college student who just started learning blockchain development.</p><p>Or maybe you’re already a software engineer, but you’ve never touched blockchain before. You want to get experience by contributing to a real open-source repository.</p><p><strong>So, what should juniors do?</strong><br>Want to grow as a developer and land a great job? Start building real experience. Work on real projects. Do it now – before it’s too late. And of course, do it with your Cursor-bro (but be careful with Opus 4, it can get expensive).</p><p><strong>Don’t waste your time just sitting around — get involved in open source projects.</strong><br>It’s the easiest way to get into top-tier dev teams and add real projects to your resume, instead of showing off some random code snippets.</p><p>But let’s be honest: finding the right project to contribute to is hard. That’s when laziness and excuses start creeping in – and with them comes a lack of professional growth, no meaningful feedback from experienced devs, burnout, and stagnation.</p><h3>(IV) My Personal Experience</h3><h4>What separates us from LLMs?</h4><p>When we see repetitive code, we abstract it into functions, classes, libraries.<br>When a DB is hard to work with, we build a framework or ORM.<br>We define responsibilities, test in isolation, reuse code. That’s DRY.<br>If LLMs take away that pain, DRY might disappear altogether. Code will turn into unreadable spaghetti. Projects will bloat to the point where no human and no LLM can manage them.</p><p>Open source is the ultimate form of DRY.</p><h4>OSS has helped me get jobs, more than once:</h4><ul><li>I skipped live coding interviews because hiring managers were impressed by my open-source libs</li><li>I got invited to interviews because people were <em>using</em> my tiny library (only 15 stars!)</li><li>An interviewer had read my article about ActionCable and was using my code snippet — our whole interview went in a different, better direction</li><li>HR bots scan GitHub activity for keywords and contributions, which triggers interview invites</li><li>A public repo means you never have to provide “a sample of your code” again. It’s already out there</li></ul><p>Take this example.<br>If someone adds support for authenticated proxies in gocolly, I can instantly tell four things:</p><ul><li>He writes in Go</li><li>He works with proxies</li><li>He ran into a non-trivial problem</li><li>He spent time analyzing the lib and didn’t just smash two buttons: “vibe-code” + “apply”</li></ul><p>That’s what OSS signals: proactive problem solving. Not just a quick monkeypatch in your codebase, but sharing a fix with the community.</p><h3>(V) Sold. Let’s start contributing</h3><p>There are tons and tons of open source projects on GitHub that need help from contributors. Sometimes, the GitHub search bar is not the best for trying to find issues and projects. I cannot tell you how many times I have stumbled upon a random repository trying to understand whether I want to contribute there or not.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*P5UIloJDy_FrR2NXqUOUhw.png" /><figcaption>Okay, we need to check 43 repos to decide on how to contribute to Solana.</figcaption></figure><p>So, contributors. Here’s the issue — it’s issues. Issues are important for tracking development and progress in a project. There’s a wide range of issues from fixing mere spelling mistakes to figuring out how to build a space-time continuum in your backyard (okay, maybe not that crazy) but you get what I mean.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zbX6tSIhZ7N0Dd6ji0FVew.png" /><figcaption>Okay, anza-xyz/agave seems nice, what now?</figcaption></figure><p>There’s so many projects and issues out there, but trying to find the right one for you is another story. So I went on the hunt to find other resources that made finding projects and good first issues on GitHub easier, but haven’t found any related to blockchain industry. Soooo I created my own.</p><p>Say hi to this little boy – <a href="https://opencryptolist.xyz/?ref=medium"><strong>OpenCryptoList.xyz</strong></a>. Find your first issue literally in 3 clicks.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*egzyHM5qbs5FtahfYlk67w.gif" /><figcaption>Discover beginner-friendly issues in Web3, DeFi, and cryptocurrency projects.</figcaption></figure><p>This is a non-commercial project, therefore I don’t have any guilt in advertising it. BUT!</p><p><strong>It would not be honest not to mention alternatives. What are they?</strong></p><ol><li><strong>goodfirstissue.dev</strong>: You can find several good first issues with the option to choose your preferred language through a friendly user interface. While limited to filtering only by a given programming language, it generally inspired me to make goodfirstissue for web3.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*QcbssOStrpir8cab" /></figure><p>2. <strong>Up-for-grabs.net</strong> is one of the most popular websites to find good open-source projects</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*JF8_LJh-IiR7kFiO.png" /></figure><p>3. <strong>https://firstcontributions.github.io/</strong> is a website where you can search projects from a pre-defined list using your preferred language as a filter.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*fDe084Z59IrxuEZw.png" /></figure><p>4. <a href="https://github.com/trending"><strong>https://github.com/trending</strong></a> — trending repositories</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*n4cOkxthGOzdmMP0X4-SMw.png" /></figure><h3>(V) Extra: Pro Tips for First-Time Contributors</h3><ul><li><strong>Start small</strong>: You don’t have to jump into solving a critical issue right away. Start by fixing typos, improving documentation, or working on small bugs to familiarize yourself with the codebase.</li><li><strong>Ask for help</strong>: The open-source community is welcoming. Don’t hesitate to ask questions on GitHub or community forums.</li><li><strong>Learn as you go</strong>: Every contribution is a learning opportunity. You’ll improve your blockchain knowledge and coding skills by diving into real-world problems</li></ul><p>Thanks for reading this article! Drop your PRs in the comments section :)</p><p><strong>Follow me on the internet:</strong></p><ul><li><a href="https://github.com/wowinter13">https://github.com/wowinter13</a></li><li><a href="https://x.com/not_wowinter13">https://x.com/not_wowinter13</a></li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*_ki0QcDsikU_4gtCDH30DA.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=59fbc249972d" width="1" height="1" alt=""><hr><p><a href="https://levelup.gitconnected.com/2025-open-source-as-the-only-way-to-enter-the-job-market-59fbc249972d">2025: Open Source as the Only Way to Enter the Job Market</a> was originally published in <a href="https://levelup.gitconnected.com">Level Up Coding</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[MCP 101: Developing your first MCP in Rust]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://ai.gopubby.com/mcp-101-developing-your-first-mcp-in-rust-31800346ebd6?source=rss-e8e1b50dd038------2"><img src="https://cdn-images-1.medium.com/max/1964/1*USzHGt8Qf80CENliEpWdQg.png" width="1964"></a></p><p class="medium-feed-snippet">IMO, we&#x2019;re racing toward a singularity point where your imagination and creativity won&#x2019;t be limited by your technical skills. Want to&#x2026;</p><p class="medium-feed-link"><a href="https://ai.gopubby.com/mcp-101-developing-your-first-mcp-in-rust-31800346ebd6?source=rss-e8e1b50dd038------2">Continue reading on AI Advances »</a></p></div>]]></description>
            <link>https://ai.gopubby.com/mcp-101-developing-your-first-mcp-in-rust-31800346ebd6?source=rss-e8e1b50dd038------2</link>
            <guid isPermaLink="false">https://medium.com/p/31800346ebd6</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[rust]]></category>
            <category><![CDATA[mcp-server]]></category>
            <category><![CDATA[programming]]></category>
            <dc:creator><![CDATA[Vlad Dyachenko]]></dc:creator>
            <pubDate>Thu, 24 Apr 2025 14:02:37 GMT</pubDate>
            <atom:updated>2025-04-24T14:02:37.089Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How Well Do You Understand Transactions? Debunking 8 Common Myths]]></title>
            <link>https://wowinter13.medium.com/how-well-do-you-understand-transactions-debunking-8-common-myths-b853030a9c6d?source=rss-e8e1b50dd038------2</link>
            <guid isPermaLink="false">https://medium.com/p/b853030a9c6d</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[sql]]></category>
            <category><![CDATA[ruby]]></category>
            <category><![CDATA[database]]></category>
            <category><![CDATA[backend]]></category>
            <dc:creator><![CDATA[Vlad Dyachenko]]></dc:creator>
            <pubDate>Fri, 07 Mar 2025 00:12:13 GMT</pubDate>
            <atom:updated>2025-03-07T00:13:16.502Z</atom:updated>
            <content:encoded><![CDATA[<p><em>No paywall @ wowinter13.com</em></p><p>My second favourite thing in an interview — right after the classic “A user browses to X in their browser; describe the request lifecycle in detail” — is the section of high-level database questions. This is where everything depends on the interviewer’s level of meticulousness. A profound, detailed response can either impress or paint you as <em>that guy</em> — you know, the stuffy one who knows too much and overcomplicates everything. But here’s the thing: database transactions are a minefield of misconceptions, especially when you’re expected to give short, snappy answers in an interview. Today, I want to dive into ten common myths about database transactions, exploring why they’re oversimplified half-truths in interview contexts, and why, in reality, they’re often <em>complete nonsense</em><strong>.</strong></p><figure><img alt="Disclaimer: shit may hit the fan. Author (me) didn’t specify a particular database, nor the definitions he’s talking about." src="https://cdn-images-1.medium.com/max/640/1*w7XDrzWgkLx0IHEuzgUGoA.jpeg" /><figcaption><strong>Disclaimer: Shit might hit the fan.<br></strong>The author (me) didn’t specify a particular database or exact definitions upfront, so behavior might differ across systems like PostgreSQL, MySQL, or MongoDB</figcaption></figure><h3>Myth 1: A Transaction Always Completes Successfully</h3><p><strong>Short answer: </strong>“Sure, transactions are designed to succeed!”</p><p><strong>Why it’s true in general:</strong> In an ideal spherical vacuum, a transaction commits all changes when done.</p><p><strong>Reality check:</strong> Nope, not even close.</p><p>Transactions can fail due to crashes, timeouts, or deadlocks. If the server dies mid-transaction, rollback isn’t guaranteed, and data can end up inconsistent.</p><p>Imagine you’re transferring $100 between bank accounts — database says “debit account A,” but the server dies before “credit account B” happens. Transaction fails, and you’re left cursing the gods of ACID.</p><p>While <strong>WAL</strong> (Write-Ahead Logging) is designed to prevent partial transactions from being committed during recovery, real-world implementations can have edge cases. Database crash recovery depends on log integrity and proper fsync operations. If the transaction log itself becomes corrupted or truncated during the failure, the database might fail to identify and roll back the partial transaction. However, in well-configured systems (e.g., with <strong>fsync</strong> enabled), this risk is minimized.</p><pre>def transfer_money(from_account, to_account, amount)<br>  ActiveRecord::Base.transaction do<br>    from_account.update!(balance: from_account.balance - amount)<br>    to_account.update!(balance: to_account.balance + amount)<br>  end<br>end</pre><p>If the database connection drops after from_account updates but before to_account, the transaction <em>should</em> roll back — ActiveRecord relies on the database’s rollback mechanism. But if the server crashes hard (e.g., power loss) right after the first update hits the transaction log but before the second, the log might be incomplete.</p><h3>Myth 2: A Transaction Locks Data Until It Completes</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*4sURGTS2ni_-ti3p.png" /><figcaption>Database anomalies depending on the transaction isolation levels (<a href="https://jlvbcoop.com/en/transaction-isolation-levels-2/">jlvbcoop</a>)</figcaption></figure><p><strong>Short answer:</strong> “Yes, transactions lock data to ensure consistency.”</p><p><strong>Why it’s true in general:</strong> Locking ensures isolation — a safe, solid answer.</p><p><strong>Reality check:</strong> Not always. It depends on the isolation level. With READ COMMITTED, locks might drop after a read, letting others check the data before the transaction’s done. SERIALIZABLE keeps locks tight until the end. So, no, data isn’t always locked until the end — sometimes it’s a free-for-all.</p><pre>BEGIN;<br>SELECT * FROM accounts WHERE id = 1 FOR UPDATE;<br>UPDATE accounts SET balance = balance + 100 WHERE id = 1;<br>COMMIT;</pre><p>FOR UPDATE grabs a write lock. In READ COMMITTED, another session can read id=1’s committed value <em>before</em> this transaction ends — say, post-SELECT but pre-UPDATE. If the server dies mid-UPDATE, the lock vanishes on crash, and nothing commits unless the log’s written. SERIALIZABLE would block that read — stricter rules apply.</p><h3>Myth 3: Transactions Are Always Atomic</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/875/1*-seV-dKl31aJx7xq2k3czA.jpeg" /></figure><p><strong>Short answer:</strong> “Yep, atomicity is a pillar of ACID!”</p><p><strong>Why it’s true in general:</strong> Atomicity — everything happens or nothing does — is a defining trait of transactions.</p><p><strong>Reality check:</strong> They’re <em>supposed</em> to be atomic, but reality’s messier. Atomicity fails in crashes or distributed systems if commit/rollback doesn’t fully execute.</p><p>Atomicity relies on the transaction log’s integrity. In a crash, the database uses the log to ensure either all changes are applied or none are. However, if the log is incomplete or corrupted, recovery might leave partial changes.</p><pre>BEGIN;<br>UPDATE accounts SET balance = balance - 100 WHERE id = 1;<br>UPDATE accounts SET balance = balance + 100 WHERE id = 2;<br>COMMIT;</pre><p>If the server crashes after the first UPDATE logs but before the second, and the log’s incomplete, recovery might leave id=1 down 100 with no change to id=2. This happens if the crash hits post-log-write for the first but pre-log-write for the second. Atomicity lives or dies by the log’s integrity.</p><h3>Myth 4: If an Operation Completes Successfully, All Data Has Been Updated</h3><p><strong>Short answer:</strong> “Yes, success means all changes are done.”</p><p><strong>Why it’s true in general:</strong> In a simple world, a successful transaction implies all intended updates are locked in.</p><p><strong>Reality check:</strong> Define “operation.” If we mean the whole transaction, a commit <em>should</em> mean all data’s updated — but “should” isn’t “does.” If “operation” is one query in a transaction, others could still fail, triggering a rollback. Plus, even after a commit, data might stay in memory before hitting disk (dirty pages). Success isn’t as final as it sounds. Committed data might stay in memory, not disk. A crash post-commit can lose it if the WAL isn’t durable yet. In databases like PostgreSQL, with asynchronous commit, there’s a small window where committed data hasn’t been flushed to disk. Proper configuration (synchronous_commit=on) minimizes this risk, ensuring durability at the cost of performance.</p><pre>BEGIN;<br>UPDATE users SET name = &#39;Alice&#39; WHERE id = 1;<br>COMMIT;</pre><p>COMMIT succeeds, but the data might sit in the buffer. If the server dies post-COMMIT but pre-flush (no fsync), and the WAL isn’t durable yet, the update’s gone on restart. This window’s small — milliseconds — but real.</p><h3>Myth 5: Atomicity Always Guarantees No Conflicts</h3><p><strong>Short answer:</strong> “Atomicity keeps everything conflict-free!”</p><p><strong>Why it’s true in general:</strong> Atomicity’s about indivisibility, so it’s easy to assume it avoids conflicts.</p><p><strong>Reality check:</strong> Ha, nope. Atomicity ensures a transaction’s all-or-nothing, but it doesn’t stop concurrent transactions from clashing. Deadlocks, lost updates — those are isolation problems, not atomicity’s job. Two atomic transactions can still fight over the same row. Atomicity is per-transaction, while isolation governs how transactions interact. Even with atomic transactions, poor isolation can lead to anomalies like dirty reads or lost updates.</p><pre>BEGIN;<br>SELECT * FROM accounts WHERE id = 1 FOR UPDATE;<br>SELECT * FROM accounts WHERE id = 2 FOR UPDATE;<br>UPDATE accounts SET balance = balance + 100 WHERE id = 1;<br>UPDATE accounts SET balance = balance - 100 WHERE id = 2;<br>COMMIT;</pre><p>If another transaction locks id=2 first, then tries id=1, we’re deadlocked. If the server dies mid-deadlock, one might commit partially if the log’s written up to an UPDATE — timing matters. Atomicity’s per-transaction, not system-wide.</p><h3>Myth 6: Write Operations to Caches or File Systems Are Also Atomic</h3><p><strong>Short answer:</strong> “Uh, yeah, atomicity extends everywhere (and covers everything)”</p><p><strong>Why it’s true in general: </strong>You might assume transaction atomicity covers related systems.</p><p><strong>Reality check:</strong> Depends entirely on the system. Database transactions might be atomic, but caches and file systems? Some caches (like Redis with transactions) can pull it off, but most don’t worry. File systems vary — some support atomic writes, others leave you with half-written files if power cuts out. Atomicity stops at the database entrance unless explicitly built elsewhere. Redis, for example, offers command-level atomicity, but multi-command scripts aren’t transactional unless wrapped in a MULTI/EXEC block. Even then, if the server crashes mid-script, partial updates can stick.</p><p>If Redis crashes mid-SET, the write might truncate or corrupt — say, after writing half the value. No rollback here; Redis’s atomicity is command-level, not transaction-level. If the server dies during a multi-command script, partial updates stick.</p><h3>Myth 7: Rollback Is Always Possible</h3><p><strong>Interview short answer:</strong> “You can always roll back a transaction”</p><p><strong>Why it’s true in general:</strong> Rollback’s a cornerstone of ACID’s “abort” option.</p><p><strong>Reality check:</strong> Not in every universe. NoSQL systems? Many don’t even offer it. Commit’s final, or failures leave you with manual cleanup. Physical failures (disk crash mid-transaction) can also make rollback a fantasy. MongoDB, for instance, only supports rollbacks in replica sets (post-4.0). In standalone mode, there’s no rollback — writes stick. Even in relational databases, if the server crashes mid-transaction and the log is partial, recovery might commit partial changes.</p><pre>Mongoid::Session.default.with_transaction do<br>  User.create!(name: &quot;Alice&quot;)<br>end</pre><p>MongoDB only rolls back in replica sets. If the server dies mid-transaction and the session drops — say, after create!(), but before commit — writes might stick. Standalone mode? No rollback.</p><pre>BEGIN;<br>INSERT INTO users (name) VALUES (&#39;Alice&#39;);<br>COMMIT;</pre><p>Rollback works pre-COMMIT in PostgreSQL. But if the server dies mid-INSERT and the log’s partial — say, after writing the row but before transaction end — recovery might leave it committed. NoSQL like MongoDB might not even offer rollback; writes stick post-failure.</p><h3>Myth 8: Atomic Operations Are Always Fast</h3><p><strong>Short answer:</strong> “Yes! ”</p><p><strong>Why it’s true in general:</strong> It’s a feel-good assumption. Golang creators wouldn’t call a package containing fast sync primitives — atomic.</p><p><strong>Reality check:</strong></p><p>Atomicity can slow down with big data or contention. Atomic doesn’t mean fast. Big data or slow resources (disks, networks) can drag it out. Speed’s not part of the deal. An atomic operation locking a million rows or syncing across a slow network can crawl. Atomicity’s about correctness, not performance. A complex transaction can be atomic and still take ages. In databases, atomic operations often require locks, which can block other transactions and degrade performance, especially with large datasets or high contention. For example, updating a million rows in a single transaction will hold locks for the duration, potentially causing bottlenecks.</p><pre>BEGIN;<br>UPDATE users SET last_login = NOW();<br>COMMIT;</pre><p>This locks the table atomically. With millions of rows, it crawls — locks block reads/writes until done. If the server dies mid-UPDATE, partial writes might commit if the log’s written up to that point.</p><p><strong>Conclusion:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*3g-kK9c5MBizapfgTOBFIQ.jpeg" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b853030a9c6d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Interstate 60: Driving down the road of Defensive Coding, Fault Tolerance, and Idempotency]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://effective-programmer.com/interstate-60-driving-down-the-road-of-defensive-coding-fault-tolerance-and-idempotency-a3a62788dcc5?source=rss-e8e1b50dd038------2"><img src="https://cdn-images-1.medium.com/max/2432/1*_643SuXRv2q0jwFB2ecpnA.jpeg" width="2432"></a></p><p class="medium-feed-snippet">Defensive coding is like driving down a winding road&#x200A;&#x2014;&#x200A;you&#x2019;re constantly scanning for threats: deer, potholes, or that unexpected sharp&#x2026;</p><p class="medium-feed-link"><a href="https://effective-programmer.com/interstate-60-driving-down-the-road-of-defensive-coding-fault-tolerance-and-idempotency-a3a62788dcc5?source=rss-e8e1b50dd038------2">Continue reading on Effective Programmer »</a></p></div>]]></description>
            <link>https://effective-programmer.com/interstate-60-driving-down-the-road-of-defensive-coding-fault-tolerance-and-idempotency-a3a62788dcc5?source=rss-e8e1b50dd038------2</link>
            <guid isPermaLink="false">https://medium.com/p/a3a62788dcc5</guid>
            <category><![CDATA[ruby]]></category>
            <category><![CDATA[rails]]></category>
            <category><![CDATA[best-practices]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[ruby-on-rails]]></category>
            <dc:creator><![CDATA[Vlad Dyachenko]]></dc:creator>
            <pubDate>Wed, 15 Jan 2025 20:02:00 GMT</pubDate>
            <atom:updated>2025-03-09T05:21:00.216Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Rails & React on Kubernetes. A definitive Step-by-Step guide. 1/2]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://wowinter13.medium.com/rails-react-on-kubernetes-a-definitive-step-by-step-guide-1-2-12de4dda751a?source=rss-e8e1b50dd038------2"><img src="https://cdn-images-1.medium.com/max/2600/1*5U8teI-dy1xglYUYDvH73A.png" width="3800"></a></p><p class="medium-feed-snippet">Learn how to deploy a Rails backend and a React web app on Kubernetes using DOKS and Helm charts</p><p class="medium-feed-link"><a href="https://wowinter13.medium.com/rails-react-on-kubernetes-a-definitive-step-by-step-guide-1-2-12de4dda751a?source=rss-e8e1b50dd038------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://wowinter13.medium.com/rails-react-on-kubernetes-a-definitive-step-by-step-guide-1-2-12de4dda751a?source=rss-e8e1b50dd038------2</link>
            <guid isPermaLink="false">https://medium.com/p/12de4dda751a</guid>
            <category><![CDATA[ruby]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[ruby-on-rails]]></category>
            <category><![CDATA[kubernetes]]></category>
            <dc:creator><![CDATA[Vlad Dyachenko]]></dc:creator>
            <pubDate>Fri, 03 Jun 2022 08:20:14 GMT</pubDate>
            <atom:updated>2022-06-03T08:59:44.012Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[ActionCable: Handling client connection errors on server side]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://wowinter13.medium.com/actioncable-handling-client-connection-errors-on-server-side-93ea74178d03?source=rss-e8e1b50dd038------2"><img src="https://cdn-images-1.medium.com/max/800/1*y0RoUsyzWWsBOzWmt523Ww.jpeg" width="800"></a></p><p class="medium-feed-snippet">TLDR: a full code snippet at the end of the article.</p><p class="medium-feed-link"><a href="https://wowinter13.medium.com/actioncable-handling-client-connection-errors-on-server-side-93ea74178d03?source=rss-e8e1b50dd038------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://wowinter13.medium.com/actioncable-handling-client-connection-errors-on-server-side-93ea74178d03?source=rss-e8e1b50dd038------2</link>
            <guid isPermaLink="false">https://medium.com/p/93ea74178d03</guid>
            <category><![CDATA[ruby]]></category>
            <category><![CDATA[actioncable]]></category>
            <category><![CDATA[websocket]]></category>
            <category><![CDATA[ruby-on-rails]]></category>
            <category><![CDATA[rails]]></category>
            <dc:creator><![CDATA[Vlad Dyachenko]]></dc:creator>
            <pubDate>Wed, 05 May 2021 10:57:41 GMT</pubDate>
            <atom:updated>2021-07-21T14:52:44.091Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[5 sins of the Junior Ruby Developer]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://wowinter13.medium.com/5-sins-of-the-junior-ruby-developer-7859ba18aa84?source=rss-e8e1b50dd038------2"><img src="https://cdn-images-1.medium.com/max/1487/1*-ZzcotM4HZjopmE9DNrI4Q.png" width="1487"></a></p><p class="medium-feed-snippet">Based on my experience I&#x2019;ve built a list of sins that, almost every junior Ruby on Rails developer had made through his own career.</p><p class="medium-feed-link"><a href="https://wowinter13.medium.com/5-sins-of-the-junior-ruby-developer-7859ba18aa84?source=rss-e8e1b50dd038------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://wowinter13.medium.com/5-sins-of-the-junior-ruby-developer-7859ba18aa84?source=rss-e8e1b50dd038------2</link>
            <guid isPermaLink="false">https://medium.com/p/7859ba18aa84</guid>
            <category><![CDATA[ruby-on-rails]]></category>
            <category><![CDATA[learning-and-development]]></category>
            <category><![CDATA[junior-developer]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[ruby]]></category>
            <dc:creator><![CDATA[Vlad Dyachenko]]></dc:creator>
            <pubDate>Mon, 10 Jun 2019 08:50:09 GMT</pubDate>
            <atom:updated>2025-08-03T19:02:45.414Z</atom:updated>
        </item>
    </channel>
</rss>