<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Python on ppl-blog</title><link>https://rifqi-blog.vercel.app/tags/python/</link><description>Recent content in Python on ppl-blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 25 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://rifqi-blog.vercel.app/tags/python/index.xml" rel="self" type="application/rss+xml"/><item><title>Git, Linear, Discord: The Automation Layer That Replaced Manual Status Updates</title><link>https://rifqi-blog.vercel.app/posts/discord-linear-dev-workflow/</link><pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate><guid>https://rifqi-blog.vercel.app/posts/discord-linear-dev-workflow/</guid><description>&lt;p&gt;The friction in team development isn&amp;rsquo;t usually the code. It&amp;rsquo;s the overhead around the code: knowing what&amp;rsquo;s in review, who&amp;rsquo;s working on what, whether a ticket moved, whether that MR you were waiting on is finally merged. Most teams solve this by adding a status-update ritual — a daily standup field, a manual Discord message, a ticket that someone remembers to update after they&amp;rsquo;re done. This works until someone forgets, or the meeting cadence doesn&amp;rsquo;t match the merge cadence, or you&amp;rsquo;re on a different timezone.&lt;/p&gt;</description></item><item><title>Static Analysis Isn't Optional: How We Built a Three-Tier Quality Gate for SIRA</title><link>https://rifqi-blog.vercel.app/posts/static-analysis-three-tiers/</link><pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate><guid>https://rifqi-blog.vercel.app/posts/static-analysis-three-tiers/</guid><description>&lt;p&gt;There&amp;rsquo;s a version of static analysis that doesn&amp;rsquo;t work: you add a linter to CI, it flags style issues nobody fixes, the team learns to ignore the yellow warnings, and the tool becomes decoration. The failures it was supposed to catch go to production anyway.&lt;/p&gt;
&lt;p&gt;The version that works is where the tool is in the critical path. It blocks the commit, or blocks the merge, or blocks the deploy. When it fires, something stops until someone fixes it. The tool has teeth.&lt;/p&gt;</description></item><item><title>TDD Isn't Enough: How Benchmarks Turned Green Tests Into Real Evidence</title><link>https://rifqi-blog.vercel.app/posts/tdd-beyond-green/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://rifqi-blog.vercel.app/posts/tdd-beyond-green/</guid><description>&lt;p&gt;There&amp;rsquo;s a moment in TDD that every developer has hit: all the tests are green, coverage is at 90-something percent, and you&amp;rsquo;re still not confident the code is actually correct. Either the tests are testing the wrong things, or they&amp;rsquo;re testing the right things but missing a whole class of bugs that coverage metrics can&amp;rsquo;t see.&lt;/p&gt;
&lt;p&gt;I hit that moment twice on the same feature while building SIRA, a FastAPI-based invoice reminder system. What pulled me out of it wasn&amp;rsquo;t more tests — it was a different &lt;em&gt;kind&lt;/em&gt; of test.&lt;/p&gt;</description></item><item><title>Three SOLID Principles, One Design Decision: OCP, ISP, and LSP in a Real FastAPI Service</title><link>https://rifqi-blog.vercel.app/posts/three-solid-principles-one-protocol/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://rifqi-blog.vercel.app/posts/three-solid-principles-one-protocol/</guid><description>&lt;p&gt;Most SOLID explainers cover all five principles in one pass, give you a definition and a toy example for each, and move on. What they skip is showing up in a codebase that already works, finding where a principle is being violated, and making the case that fixing it actually changed anything.&lt;/p&gt;
&lt;p&gt;This post focuses on three: OCP, ISP, and LSP. They came up together in a single design decision on a FastAPI invoice-reminder service — and the interesting thing is that one construct in Python&amp;rsquo;s type system addresses all three at once.&lt;/p&gt;</description></item><item><title>Two Design Patterns I Applied in One MR</title><link>https://rifqi-blog.vercel.app/posts/two-design-patterns-one-mr/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://rifqi-blog.vercel.app/posts/two-design-patterns-one-mr/</guid><description>&lt;p&gt;There&amp;rsquo;s a specific kind of file you learn to dread. Not broken — tests pass, CI is green, customers are using it. But you avoid it anyway. You touch it only when you have to, and when you do, you spend the first few minutes re-orienting: which method calls what, what side effects lurk where, whether there&amp;rsquo;s another spot you&amp;rsquo;ll forget to update.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ClientService&lt;/code&gt; was that file. 354 lines, tested, shipping. But every time I touched anything PII-related, I&amp;rsquo;d Ctrl+F the file to find every spot that called &lt;code&gt;encrypt()&lt;/code&gt;, because I didn&amp;rsquo;t trust myself to remember all three. That reflex is the smell. I&amp;rsquo;d been ignoring it for weeks.&lt;/p&gt;</description></item></channel></rss>