<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged code</title>
<link>https://coderlegion.com/tag/code</link>
<description>Powered by Question2Answer</description>
<item>
<title>How to Build an Interactive Web App Without Writing Code</title>
<link>https://coderlegion.com/30788/how-to-build-an-interactive-web-app-without-writing-code</link>
<description>&lt;p&gt;Building a web application no longer requires you to write every line of HTML, CSS, JavaScript, or backend code yourself. No-code development platforms allow users to design interfaces, organize data, configure application logic, and connect services through visual editors.&lt;/p&gt;
&lt;p&gt;These tools make it possible for entrepreneurs, small business owners, freelancers, and nontechnical professionals to develop applications that solve practical problems. Examples include appointment booking systems, customer portals, project management dashboards, membership platforms, internal business tools, and online directories.&lt;/p&gt;
&lt;p&gt;However, building an interactive application involves more than arranging buttons and choosing colors. A functional app needs a clear purpose, a reliable data structure, rules governing user actions, appropriate access controls, and a way to publish and maintain the finished product.&lt;/p&gt;
&lt;p&gt;This guide explains how to build an interactive web app without writing code, from choosing the right platform to testing and launching your application.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Define What Your Web App Will Do&lt;br&gt;
Before opening a no-code builder, establish the problem your application will solve.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A common mistake is starting with the design instead of the function. An attractive interface will not compensate for an application that fails to help users complete their tasks.&lt;/p&gt;
&lt;p&gt;Start by answering three questions:&lt;/p&gt;
&lt;p&gt;Who will use the application?&lt;br&gt;
What specific problem will it solve?&lt;br&gt;
What should users be able to accomplish inside it?&lt;br&gt;
For example, imagine you want to create an appointment booking application for a small business. Customers should be able to view available services, select a date, submit their contact information, and receive booking confirmation. The business owner should be able to review appointments and manage the schedule.&lt;/p&gt;
&lt;p&gt;These requirements establish the essential features before development begins.&lt;/p&gt;
&lt;p&gt;Create a short list of functions that the first version must include. For a booking application, that might mean service listings, appointment forms, availability management, booking records, and an administrative dashboard.&lt;/p&gt;
&lt;p&gt;Avoid adding every possible feature at the beginning. Build the smallest useful version first, then expand it after testing.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Choose a No-Code Platform&lt;br&gt;
Your platform determines which features you can build, how you manage application data, and how much technical flexibility you have.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Several platforms serve different types of projects.&lt;/p&gt;
&lt;p&gt;Bubble&lt;br&gt;
Bubble is worth considering when you need a web application with custom workflows, database operations, conditional logic, and interactive user interfaces. Its visual editor allows users to arrange interface elements and configure actions without manually writing application code.&lt;/p&gt;
&lt;p&gt;Bubble's documentation covers interface design, databases, responsive layouts, workflows, and conditional behavior. These capabilities make it relevant to applications that require more than a conventional informational website. Bubble documentation and responsive design guide.&lt;/p&gt;
&lt;p&gt;Examples include customer portals, booking systems, membership applications, and business dashboards.&lt;/p&gt;
&lt;p&gt;Glide&lt;br&gt;
Glide is useful when your application depends heavily on structured business data. Its platform supports data sources such as Glide Tables, Google Sheets, Excel, Airtable, and supported SQL databases, subject to the relevant plan and configuration requirements.&lt;/p&gt;
&lt;p&gt;Its visual development tools let users combine data with interface components and actions. Glide documentation.&lt;/p&gt;
&lt;p&gt;This makes Glide worth evaluating for inventory trackers, team directories, operational dashboards, and other applications that display and update organized records.&lt;/p&gt;
&lt;p&gt;Webflow&lt;br&gt;
Webflow is particularly relevant when visual website design, content management, and interactive website experiences are central to the project.&lt;/p&gt;
&lt;p&gt;Its CMS supports structured, reusable content that can appear across multiple pages. The platform also provides visual site-building and publishing tools. Webflow Help Center.&lt;/p&gt;
&lt;p&gt;For projects requiring complex application logic, extensive user-specific data, or advanced account management, assess whether Webflow alone meets the requirements or whether an additional application or integration is necessary.&lt;/p&gt;
&lt;p&gt;How to make the choice&lt;br&gt;
Do not select a platform solely because its interface looks easy to use. Check its database capabilities, supported integrations, authentication options, publishing arrangements, usage limits, and total cost.&lt;/p&gt;
&lt;p&gt;Build a short prototype before committing to a paid plan. Confirm that the platform can support the functions your project actually needs.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Plan the Application's Pages and Navigation&lt;br&gt;
Once you have selected a platform, map out the pages users will need.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A straightforward application might include:&lt;/p&gt;
&lt;p&gt;Home page: Explains the application's purpose and directs visitors to its main functions.&lt;br&gt;
Registration and login pages: Allow users to create accounts and access protected features, when accounts are required.&lt;br&gt;
Dashboard: Displays information relevant to the current user.&lt;br&gt;
Main function page: Provides the application's primary service, such as booking appointments or managing tasks.&lt;br&gt;
Profile or settings page: Allows users to manage permitted account details.&lt;br&gt;
Administrative page: Gives authorized staff access to management functions.&lt;br&gt;
Not every application requires all these pages. A public directory, for example, may not need registration, while a private client portal probably will.&lt;/p&gt;
&lt;p&gt;Sketch the navigation before building. Decide where each button leads and which pages require authentication. Keep important actions easy to locate, particularly on mobile screens.&lt;/p&gt;
&lt;p&gt;Use consistent typography, spacing, colors, and button styles. A coherent interface makes the application easier to navigate and maintain.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Design the Interface With Visual Components&lt;br&gt;
No-code builders generally provide visual components that can be placed on a page and configured through an editor.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Depending on the platform, these may include text blocks, buttons, forms, images, menus, tables, cards, navigation bars, and reusable containers.&lt;/p&gt;
&lt;p&gt;Start with the components required for your core workflow.&lt;/p&gt;
&lt;p&gt;For a booking app, you might create a service list, a date selection control, a contact form, a confirmation message, and a page showing existing appointments.&lt;/p&gt;
&lt;p&gt;Give each component a clear purpose. A button labeled &quot;Book Appointment&quot; communicates its function more directly than a vague label such as &quot;Continue&quot; when the action creates a booking.&lt;/p&gt;
&lt;p&gt;Pay attention to responsive design. Your application should remain usable on desktop computers, tablets, and smartphones. Bubble's responsive design documentation explains how layouts can adapt to different screen sizes within its visual editor. Read the responsive design guide.&lt;/p&gt;
&lt;p&gt;Test the layout at several screen widths. Check whether forms remain readable, navigation remains accessible, and buttons are easy to tap.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create the Database and Organize Your Data&lt;br&gt;
Interactive applications usually need to store information. A booking application needs appointment records, a task manager needs task records, and a customer portal needs customer information.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Your no-code platform may provide a built-in database or allow you to connect an external data source.&lt;/p&gt;
&lt;p&gt;Before adding records, identify the information your application must store.&lt;/p&gt;
&lt;p&gt;For a booking system, you might need the following data types:&lt;/p&gt;
&lt;p&gt;Users: Names, email addresses, and account identifiers.&lt;br&gt;
Services: Service names, descriptions, and durations.&lt;br&gt;
Appointments: Customer references, service references, dates, times, and booking statuses.&lt;br&gt;
Keep related information organized instead of placing every field into one large, unstructured table.&lt;/p&gt;
&lt;p&gt;Establish how records relate to one another. An appointment, for example, should reference the customer and service associated with it. This makes it easier to display booking details and manage records consistently.&lt;/p&gt;
&lt;p&gt;Use the platform's visual data editor to create fields, configure relationships, and connect page components to the appropriate records.&lt;/p&gt;
&lt;p&gt;If you use Glide, its documentation explains how to add and manage supported data sources through the Data Editor. External integrations may have plan requirements and synchronization considerations, so check those details before choosing your data architecture. Glide data source documentation.&lt;/p&gt;
&lt;p&gt;Before entering real customer information, establish appropriate access permissions and avoid collecting data that the application does not need.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add Interactivity With Workflows and Actions&lt;br&gt;
This is the stage that turns a collection of pages into a working application.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;An interactive feature responds to a user action. A button might save a record, a form might create an appointment, or a menu might display different content according to the user's permissions.&lt;/p&gt;
&lt;p&gt;No-code platforms let you configure many of these behaviors through visual workflows, action settings, and conditional rules.&lt;/p&gt;
&lt;p&gt;Consider a task management application. When a user clicks &quot;Add Task,&quot; the application should validate the submitted information, save the task, and display the new record in the task list.&lt;/p&gt;
&lt;p&gt;A workflow could follow this sequence:&lt;/p&gt;
&lt;p&gt;The user opens the task form.&lt;br&gt;
The user enters a task title and due date.&lt;br&gt;
The application checks whether required fields are completed.&lt;br&gt;
The user submits the form.&lt;br&gt;
The application creates a task record.&lt;br&gt;
The task list refreshes or displays the newly created task.&lt;br&gt;
The application confirms that the task was saved.&lt;br&gt;
Bubble documents workflows as sequences of actions triggered by events such as button clicks or page loads. Its visual tools also support conditions that determine how application elements behave. Bubble user manual.&lt;/p&gt;
&lt;p&gt;You can apply similar principles to booking confirmations, search filters, account settings, approval processes, and task status updates.&lt;/p&gt;
&lt;p&gt;Configure error messages as carefully as successful actions. If a required field is missing, explain what the user must correct. If an operation fails, do not display a success message.&lt;/p&gt;
&lt;p&gt;Test each workflow independently before connecting all the features together.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Connect External Services When Necessary&lt;br&gt;
Your application may need services that the no-code platform does not provide directly. Examples include email delivery, payment processing, calendar synchronization, customer relationship management, and external data sources.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Integrations can connect these services without requiring you to build every function yourself.&lt;/p&gt;
&lt;p&gt;Start by identifying the exact task that needs an external service. If your booking application must send appointment confirmations, investigate supported email integrations. If it must accept online payments, review compatible payment providers and their requirements.&lt;/p&gt;
&lt;p&gt;Check the following before connecting any service:&lt;/p&gt;
&lt;p&gt;Whether the integration supports your intended workflow.&lt;br&gt;
Whether it requires a paid subscription or usage-based fees.&lt;br&gt;
What permissions it requests.&lt;br&gt;
Whether it can exchange the necessary data with your application.&lt;br&gt;
How errors and failed transactions are handled.&lt;br&gt;
Some integrations require API credentials or configuration beyond basic drag-and-drop editing. Follow the provider's official documentation and never expose private API keys in publicly accessible page elements.&lt;/p&gt;
&lt;p&gt;Add integrations only when they serve a clear purpose. Each additional service introduces another dependency that may require monitoring and maintenance.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Configure User Accounts and Data Security&lt;br&gt;
If your application stores private information or offers different functions to different users, security must be part of the initial design.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Determine which users can view, create, edit, and delete each type of record. A customer should not automatically gain access to another customer's appointments merely because both accounts use the same application.&lt;/p&gt;
&lt;p&gt;For example, a booking application might have customer and administrator roles. Customers can view their own bookings, while authorized administrators can manage the overall schedule.&lt;/p&gt;
&lt;p&gt;Configure authentication, authorization, database privacy rules, and workflow conditions according to the platform's documentation. Hiding a button from a user is not sufficient protection if the underlying action or data remains accessible through another route.&lt;/p&gt;
&lt;p&gt;Bubble's official security documentation explains how privacy rules restrict access to database records and why application builders must configure those protections correctly. Read Bubble's privacy rules guide.&lt;/p&gt;
&lt;p&gt;Also consider secure account recovery, access to uploaded files, the handling of personal information, and the removal of access when a user no longer needs it.&lt;/p&gt;
&lt;p&gt;If the application handles payments, sensitive customer information, or business-critical records, assess whether you need professional security testing before launch.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Test Every Important Function Before Launch&lt;br&gt;
An application that works in the editor is not necessarily ready for public use.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Testing should cover the complete user journey, not just individual pages. Create test accounts and perform the same tasks that real users will perform.&lt;/p&gt;
&lt;p&gt;For a booking application, test whether a customer can select a service, submit a valid appointment, receive the expected confirmation, and view the correct booking record.&lt;/p&gt;
&lt;p&gt;Then test failure conditions. Submit an incomplete form, attempt to select an unavailable appointment time, and check what happens when a required integration fails.&lt;/p&gt;
&lt;p&gt;Use this practical checklist:&lt;/p&gt;
&lt;p&gt;All navigation links lead to the correct destinations.&lt;/p&gt;
&lt;p&gt;Forms validate required fields.&lt;/p&gt;
&lt;p&gt;Submitted records are saved correctly.&lt;/p&gt;
&lt;p&gt;Search and filtering return the intended results.&lt;/p&gt;
&lt;p&gt;Buttons trigger the correct actions.&lt;/p&gt;
&lt;p&gt;Users cannot access records they are not authorized to view.&lt;/p&gt;
&lt;p&gt;Pages remain usable on mobile and desktop screens.&lt;/p&gt;
&lt;p&gt;Error messages explain what users should do next.&lt;/p&gt;
&lt;p&gt;External integrations work as intended.&lt;/p&gt;
&lt;p&gt;The application has been tested with realistic sample data.&lt;/p&gt;
&lt;p&gt;Ask a few people who were not involved in building the app to test it. Their difficulties can reveal confusing navigation, unclear instructions, and errors that you overlooked.&lt;/p&gt;
&lt;p&gt;Bubble provides a preview environment for testing an application before deployment. Its documentation also explains the distinction between development and live environments. Read the app preview guide.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Publish the App and Monitor Its Performance&lt;br&gt;
When the application passes testing, prepare it for public use.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Review the platform's publishing requirements, domain options, subscription limits, and hosting arrangements. Configure the application's name, branding, and any required account or privacy information.&lt;/p&gt;
&lt;p&gt;If you intend to use a custom domain, follow the platform's instructions for connecting it. Confirm that the application loads correctly through its intended public address and that its navigation and integrations continue to work after deployment.&lt;/p&gt;
&lt;p&gt;Bubble, for example, documents deployment from its editor and distinguishes the development environment from the live application. Read the publishing guide.&lt;/p&gt;
&lt;p&gt;After launch, monitor user feedback, application errors, data quality, and usage limits. Fix defects before adding more features. Keep backups or appropriate recovery arrangements where available, and review access permissions as your user base grows.&lt;/p&gt;
&lt;p&gt;You should also review the platform's pricing as usage increases. A prototype with a few test users may have different resource requirements from a production application serving a large customer base. Check current plan terms rather than assuming that an initial free or low-cost arrangement will remain sufficient.&lt;/p&gt;
&lt;p&gt;What Are the Limitations of No-Code Development?&lt;br&gt;
No-code tools reduce the need to write application code, but they do not remove every technical constraint.&lt;/p&gt;
&lt;p&gt;Complex integrations, unusual business rules, specialized performance requirements, and advanced security needs may require expert assistance or custom development. Some platforms also impose restrictions on integrations, data sources, hosting, or access to application logic.&lt;/p&gt;
&lt;p&gt;Platform dependence is another consideration. Before building a business around a no-code application, understand how you can export your data, migrate to another service, maintain integrations, and recover from service interruptions.&lt;/p&gt;
&lt;p&gt;You remain responsible for designing the application correctly, protecting user information, complying with applicable requirements, and testing changes before they affect customers.&lt;/p&gt;
&lt;p&gt;The right platform is therefore not necessarily the one with the largest feature list. It is the one that can meet your specific requirements within your budget and technical capabilities.&lt;/p&gt;
&lt;p&gt;Final Consideration&lt;br&gt;
Building an interactive web app without writing code is a practical option for people who want to turn an idea into a working digital product without developing every component from scratch.&lt;/p&gt;
&lt;p&gt;The process starts with a defined problem, followed by platform selection, interface design, database organization, workflow configuration, integrations, security, testing, and deployment.&lt;/p&gt;
&lt;p&gt;For applications that require extensive custom workflows and database operations, evaluate Bubble. For data-driven business tools, consider Glide. For visually designed websites with structured content, investigate Webflow and determine whether additional application functionality is necessary.&lt;/p&gt;
&lt;p&gt;Start with one useful feature, test it thoroughly, and expand only when the initial version works reliably. A smaller application that performs its intended tasks correctly is a better starting point than a complicated product filled with unfinished functions.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/30788/how-to-build-an-interactive-web-app-without-writing-code</guid>
<pubDate>Mon, 12 Oct 2026 08:40:18 +0000</pubDate>
</item>
<item>
<title>Same Ingress, Different Defaults: What Changed When We Moved to HAProxy</title>
<link>https://coderlegion.com/30239/same-ingress-different-defaults-what-changed-when-we-moved-to-haproxy</link>
<description>&lt;p&gt;Over the last few weeks, we moved the customer-facing managed services on our &lt;a rel=&quot;nofollow&quot; href=&quot;https://nine.ch/en/products/kubernetes/&quot;&gt;NKE&lt;/a&gt; service clusters and &lt;a rel=&quot;nofollow&quot; href=&quot;https://nine.ch/en/products/deploio/&quot;&gt;Deploio&lt;/a&gt; from ingress-nginx to HAProxy: Grafana, Loki, ArgoCD, the container registry, Alertmanager, Tempo, OpenSearch, the Object Storage endpoints and all Deploio applications. Some clusters alone had more than 200 Ingresses.&lt;/p&gt;
&lt;p&gt;We have written about the motivation twice before. &lt;a rel=&quot;nofollow&quot; href=&quot;https://nine.ch/en/blog/retirement-of-the-ingress-nginx-project/&quot;&gt;In December&lt;/a&gt;, we explained what the retirement of ingress-nginx meant and which migration paths were open. &lt;a rel=&quot;nofollow&quot; href=&quot;https://nine.ch/en/blog/techtalk-29-our-ingress-odyssey/&quot;&gt;Our TechTalk #29&lt;/a&gt; recap covered our evaluation of Traefik, Gateway API and HAProxy, and why HAProxy became our default for classic Ingress on NKE.&lt;/p&gt;
&lt;p&gt;This post is about what happened after that decision.&lt;/p&gt;
&lt;p&gt;The &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.nine.ch/docs/managed-kubernetes/nke/ingress&quot;&gt;annotation mapping table in our documentation&lt;/a&gt; gets you a working Ingress on HAProxy in a few minutes. What it does not show is how the defaults shift underneath your workloads. Two ingress controllers can parse the same Ingress resource and still differ in how they talk to your backends, which status codes they send, how long they wait and how many connections they accept before refusing new ones.&lt;/p&gt;
&lt;p&gt;We found most of these differences in production, after the switch. One of them broke a customer’s website asset delivery. We are sharing them so you can check your own setup before you migrate.&lt;/p&gt;
&lt;h3 id=&quot;http-to-https-redirects&quot;&gt;HTTP to HTTPS Redirects&lt;/h3&gt;
&lt;p&gt;While comparing responses from both controllers, we noticed that plain HTTP requests were redirected with 302 Found on HAProxy, whereas nginx returned 308 Permanent Redirect.&lt;/p&gt;
&lt;p&gt;ingress-nginx sets http-redirect-code to 308 by default. haproxy-ingress defaults its corresponding ssl-redirect-code to a temporary 302. Browsers follow both, but API clients, search crawlers and intermediate caches treat them differently. A 302 allows clients to rewrite a POST into a GET on redirect, whereas a 308 preserves the request method and body.&lt;/p&gt;
&lt;p&gt;A silent downgrade to temporary redirects can break API consumers, so we set ssl-redirect-code: &quot;308&quot; globally on our managed controllers to keep the previous behaviour.&lt;/p&gt;
&lt;h3 id=&quot;connection-limits&quot;&gt;Connection Limits&lt;/h3&gt;
&lt;p&gt;During peak traffic, requests to Deploio applications slowed down and some new connections were refused.&lt;/p&gt;
&lt;p&gt;The cause was the connection limit. nginx and HAProxy calculate their ceilings differently:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;nginx multiplies worker_processes by worker_connections. With&lt;br&gt;
ingress-nginx setting worker_processes to the node’s CPU count and&lt;br&gt;
worker_connections to 16384, even a modest node can handle tens of&lt;br&gt;
thousands of concurrent connections.&lt;/li&gt;
&lt;li&gt;HAProxy enforces a single global maxconn, which haproxy-ingress&lt;br&gt;
exposes as max-connections and sets to 2,000 per pod by default.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once a pod reaches that ceiling, HAProxy stops accepting new connections. They then queue in the kernel’s accept backlog, which caused the slowdown. Once the backlog is full, they are dropped.&lt;/p&gt;
&lt;p&gt;We raised max-connections to 20,000 across all managed controllers.&lt;/p&gt;
&lt;h3 id=&quot;timeouts&quot;&gt;Timeouts&lt;/h3&gt;
&lt;p&gt;Shortly after we migrated Deploio, some customers saw requests fail with 504 Gateway Timeout.&lt;/p&gt;
&lt;p&gt;haproxy-ingress defaults timeout-client and timeout-server to 50 seconds, while ingress-nginx waits 60 seconds. Ten seconds make no difference for typical web requests, but data exports or reports that reliably finished in 55 seconds suddenly failed with a 504.&lt;/p&gt;
&lt;p&gt;To avoid cutting off requests that used to succeed, our managed controllers set both timeout-client and timeout-server to 60 seconds. You can still override the timeout per Ingress with haproxy-ingress.github.io/timeout-server in place of nginx.ingress.kubernetes.io/proxy-read-timeout.&lt;/p&gt;
&lt;h3 id=&quot;upstream-http-version&quot;&gt;Upstream HTTP Version&lt;/h3&gt;
&lt;p&gt;In July, we moved an S3-compatible &lt;a rel=&quot;nofollow&quot; href=&quot;https://nine.ch/en/products/objectstorage/&quot;&gt;Object Storage&lt;/a&gt; endpoint to HAProxy. A customer served website assets through their own nginx reverse proxy in front of that endpoint. Right after the cutover, every asset request failed with 400 Bad Request.&lt;/p&gt;
&lt;p&gt;The cause: nginx’s proxy_pass talks to upstreams over HTTP/1.0 by default. ingress-nginx always spoke HTTP/1.1 to backends, regardless of the client’s protocol, and so it silently upgraded the customer’s HTTP/1.0 requests. HAProxy forwards the request with the protocol version the client sent. The Object Storage backend rejected HTTP/1.0 requests, which produced the 400 errors.&lt;/p&gt;
&lt;p&gt;The fix was for the customer to add proxy_http_version 1.1 to their reverse proxy configuration:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;location / {
    proxy_pass http://storage-endpoint;
    proxy_http_version 1.1;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you run a reverse proxy in front of an NKE or Deploio Ingress, check which HTTP version it sends.&lt;/p&gt;
&lt;h3 id=&quot;basic-auth&quot;&gt;Basic Auth&lt;/h3&gt;
&lt;p&gt;After we had migrated most managed services, one of the controllers spiked to more than two full CPU cores while serving only 155 concurrent connections. Almost all traffic to that pod hit two endpoints protected by HTTP basic authentication, one of them our metrics ingestion pipeline.&lt;/p&gt;
&lt;p&gt;HAProxy verifies basic authentication via crypt(3) synchronously on every request, without caching. A bcrypt hash with a cost factor of 10, the default in most standard libraries and in Helm’s htpasswd template function, takes about 50 ms of CPU time to verify. At 50 ms per check, twenty requests per second are enough to saturate a whole CPU core.&lt;/p&gt;
&lt;p&gt;This also applies to nginx, as its auth_basic module verifies every request synchronously and caches nothing either. Because each nginx worker is a single-threaded event loop, a 50 ms verification stalls every connection on that worker. But workers are separate processes, so a controller with eight workers can verify eight passwords in parallel.&lt;/p&gt;
&lt;p&gt;HAProxy uses the thread-safe crypt_r(3) only on glibc and FreeBSD. On every other platform, including the Alpine-based image that haproxy-ingress ships, it wraps the plain crypt(3) call in a single process-wide spinlock. Only one thread can verify a password at a time, which caps the whole pod at roughly twenty verifications per second, no matter how many cores it has. And because it is a spinlock, waiting threads do not sleep. They keep their cores busy until it is their turn. That is how a pod serving 155 connections ended up using more than two cores.&lt;/p&gt;
&lt;p&gt;The &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.haproxy.org/3.0/configuration.html#3.4-user&quot;&gt;HAProxy manual&lt;/a&gt; warns that hashed passwords “can quickly become a major factor in HAProxy’s overall CPU consumption” and notes that musl’s hash implementations are slower than glibc’s. An upstream request to cache successful basic authentication results has been open since 2019 in &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/haproxy/haproxy/issues/370&quot;&gt;haproxy/haproxy#370&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For credentials we generate internally, we reduced the bcrypt cost to 4, where verification takes under one millisecond. This is safe because those passwords are long, machine-generated strings of 20 random characters, which makes brute-force attacks computationally infeasible regardless of the cost factor. Helm’s built-in htpasswd function always hashes with bcrypt’s default cost of 10 and offers no way to change it (&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/Masterminds/sprig/blob/v3.3.0/crypto.go#L61&quot;&gt;Sprig source&lt;/a&gt;), so chart-generated credentials need to be hashed outside Helm.&lt;/p&gt;
&lt;p&gt;The annotation syntax is simpler on HAProxy. Setting haproxy-ingress.github.io/auth-secret alone enables authentication, auth-type is deprecated. The secret format stays the same: an htpasswd file stored under the auth key.&lt;/p&gt;
&lt;h3 id=&quot;x-forwarded-for&quot;&gt;X-Forwarded-For&lt;/h3&gt;
&lt;p&gt;On paper, this looks like a change in behaviour. In practice it is not one, but it does add a header.&lt;/p&gt;
&lt;p&gt;ingress-nginx replaced any incoming X-Forwarded-For with the connecting IP unless the cluster-wide compute-full-forwarded-for option was enabled, and on our shared controllers it was off.&lt;/p&gt;
&lt;p&gt;HAProxy’s option forwardfor on its own behaves differently: it appends the connecting IP, so if the client already sent an X-Forwarded-For, the backend receives both. Applications behind a CDN or reverse proxy would then see the whole proxy chain instead of the single value ingress-nginx gave them.&lt;/p&gt;
&lt;p&gt;haproxy-ingress closes that gap. Its forwardfor key defaults to add, which deletes any incoming X-Forwarded-For before HAProxy inserts the connecting IP. Your application therefore sees the same as before: a single address, the one that connected directly to the ingress, for example your CDN.&lt;/p&gt;
&lt;p&gt;What is new is one extra header. If the request already carried an X-Forwarded-For, haproxy-ingress copies its original value to X-Original-Forwarded-For before discarding it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;X-Forwarded-For: &amp;lt;cdn-or-proxy-ip&amp;gt;
X-Original-Forwarded-For: &amp;lt;whatever-the-client-sent&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On its own, X-Original-Forwarded-For is untrusted input. It is copied verbatim from whoever connected to the ingress, and anyone can put anything into it.&lt;/p&gt;
&lt;p&gt;It becomes useful once your application checks who connected. X-Forwarded-For holds the address that opened the TCP connection to HAProxy, which the client cannot forge. If that address belongs to a CDN you trust, for example one of the published edge IPs of your provider, then X-Original-Forwarded-For is the header that CDN sent. Its rightmost entry is the address the CDN saw connecting to it.&lt;/p&gt;
&lt;h3 id=&quot;hsts-headers&quot;&gt;HSTS Headers&lt;/h3&gt;
&lt;p&gt;haproxy-ingress defaults its Strict-Transport-Security header to max-age=15768000 (six months). ingress-nginx sent max-age=31536000 (one year).&lt;/p&gt;
&lt;p&gt;RFC 6797 leaves the duration to the operator, and the two projects measure against different yardsticks. Six months is the minimum &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ssllabs/research/wiki/SSL-Server-Rating-Guide&quot;&gt;Qualys SSL Labs&lt;/a&gt; has required for an A+ grade since January 2014. HAProxy’s own &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.haproxy.com/blog/haproxy-and-http-strict-transport-security-hsts&quot;&gt;documentation examples&lt;/a&gt; use a value just above it, max-age=16000000, described as “a bit more than 6 months”. When HAProxy published those examples, the &lt;a rel=&quot;nofollow&quot; href=&quot;https://hstspreload.org/&quot;&gt;HSTS preload list&lt;/a&gt; accepted a max-age shorter than one year. It has since raised the minimum to one year.&lt;/p&gt;
&lt;p&gt;For standard web traffic, this has no functional impact. If your domain is on the HSTS preload list, however, six months fails validation. We therefore override the haproxy-ingress default and send max-age=31536000 (one year), the same value ingress-nginx did.&lt;/p&gt;
&lt;p&gt;If you need a different duration, set spec.forProvider.hsts.maxAge on the IngressHAProxy resource (a duration, for example 8760h). For a single Ingress, set haproxy-ingress.github.io/hsts-max-age (in seconds).&lt;/p&gt;
&lt;h3 id=&quot;request-buffering&quot;&gt;Request Buffering&lt;/h3&gt;
&lt;p&gt;Under ingress-nginx, high-volume write endpoints produced warnings like this in the controller logs:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[warn] a client request body is buffered to a temporary file /tmp/nginx/client-body/0000000123
  request: &quot;POST /loki/api/v1/push HTTP/1.1&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A while back, one node in our service cluster ran at 98% CPU, with its nginx pod using 1.4 cores mainly to write and clean up temporary disk buffers. On nginx, the fix was to set nginx.ingress.kubernetes.io/proxy-request-buffering: &quot;off&quot; on write-heavy Ingresses such as Loki, Promscale and container registries.&lt;/p&gt;
&lt;p&gt;HAProxy streams request bodies to backends by default. There is no equivalent buffering annotation, because HAProxy does not write incoming payloads to disk.&lt;/p&gt;
&lt;h3 id=&quot;where-this-leaves-you&quot;&gt;Where This Leaves You&lt;/h3&gt;
&lt;p&gt;If you still use our managed ingress-nginx on NKE: as announced, support ended on 1 October 2026. HAProxy is available for every NKE cluster, and our &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.nine.ch/docs/managed-kubernetes/nke/ingress&quot;&gt;migration documentation&lt;/a&gt; is the place to start.&lt;/p&gt;
&lt;p&gt;If you are unsure how one of these differences affects your workloads, write to us at &lt;em&gt;Emails are not allowed&lt;/em&gt; and we will look at it with you.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/30239/same-ingress-different-defaults-what-changed-when-we-moved-to-haproxy</guid>
<pubDate>Thu, 08 Oct 2026 08:23:47 +0000</pubDate>
</item>
<item>
<title>Framer vs Webflow for Beginners: Which No-Code Builder is Best?</title>
<link>https://coderlegion.com/29941/framer-vs-webflow-for-beginners-which-no-code-builder-is-best</link>
<description>&lt;p&gt;Choosing a website builder is no longer simply a question of finding a platform that lets you publish a page without writing code. Modern no-code builders now combine visual design, content management, hosting, SEO controls, analytics, forms, localization, collaboration, and increasingly, AI-powered tools.&lt;/p&gt;
&lt;p&gt;Two platforms that attract a large share of attention in this category are Framer and Webflow. Both allow users to build websites visually, but they approach the process differently. Framer is strongly oriented toward visual design and rapid publishing, while Webflow provides a more extensive system for structured website development, content management, collaboration, and larger projects.&lt;/p&gt;
&lt;p&gt;For a beginner deciding between the two, the important question is not which platform has more features. The better question is which platform makes the type of website you want to build easier to create and manage.&lt;/p&gt;
&lt;p&gt;Framer and Webflow Take Different Approaches&lt;br&gt;
Framer began with a strong connection to interface and interaction design, and its current website builder continues to emphasize visual creation. Users can build responsive pages on a visual canvas, create CMS-driven pages, manage SEO settings, add forms, use analytics, and publish through Framer's hosting infrastructure.&lt;/p&gt;
&lt;p&gt;Webflow also uses a visual development environment, but its system is designed around greater control over website structure, content, interactions, hosting, collaboration, and business requirements. Its CMS is positioned for content-rich websites, while its broader platform includes hosting, localization, SEO, analytics, optimization, and other tools.&lt;/p&gt;
&lt;p&gt;That distinction matters for beginners.&lt;/p&gt;
&lt;p&gt;If the main goal is to create a polished portfolio, landing page, personal website, agency site, or other design-led project quickly, Framer can be an attractive starting point.&lt;/p&gt;
&lt;p&gt;If the goal is to learn a more extensive visual website development system that can accommodate sophisticated CMS structures, larger content operations, localization, and team workflows, Webflow deserves serious consideration.&lt;/p&gt;
&lt;p&gt;Which Platform Is Easier for Beginners?&lt;br&gt;
Framer has a strong advantage when simplicity and visual design are the immediate priorities.&lt;/p&gt;
&lt;p&gt;Its workflow keeps much of the website creation process inside a visual canvas. Pages can be designed responsively, CMS pages can be generated from collections, and users can manage website content without moving into a completely separate publishing system. Framer's current documentation also describes support for web pages, CMS pages, and design pages.&lt;/p&gt;
&lt;p&gt;This makes Framer particularly attractive to someone who thinks visually and wants to see the result while building.&lt;/p&gt;
&lt;p&gt;Webflow is also a visual platform, but beginners may encounter more concepts before becoming comfortable. Website structure, classes, responsive behavior, CMS collections, interactions, hosting settings, SEO controls, and other platform functions can require more time to understand.&lt;/p&gt;
&lt;p&gt;That is not necessarily a weakness. Greater control can be valuable once a user moves beyond basic websites. The tradeoff is that Webflow can require a larger learning investment.&lt;/p&gt;
&lt;p&gt;For someone building their first website, Framer is generally the easier place to begin.&lt;/p&gt;
&lt;p&gt;For someone willing to spend more time learning the platform in exchange for deeper control, Webflow can provide a stronger long-term development environment.&lt;/p&gt;
&lt;p&gt;Design and Creative Control&lt;br&gt;
This is one of the clearest areas where the platforms differ in practical use.&lt;/p&gt;
&lt;p&gt;Framer is built around a design-first workflow. Its visual canvas makes it possible to create responsive pages, navigation, effects, and different breakpoints directly within the design environment.&lt;/p&gt;
&lt;p&gt;That approach works especially well for designers, freelancers, creators, startups, portfolio owners, and anyone who wants the website itself to have a strong visual identity.&lt;/p&gt;
&lt;p&gt;Webflow also provides extensive visual design control. However, its interface is closely connected to concepts associated with professional web development, including structured styling and reusable systems.&lt;/p&gt;
&lt;p&gt;For a beginner, Framer can therefore feel more direct.&lt;/p&gt;
&lt;p&gt;For a user who wants to understand how a complex website is constructed and controlled at a deeper level, Webflow may offer more room to grow.&lt;/p&gt;
&lt;p&gt;CMS and Content Management&lt;br&gt;
The choice becomes more complicated when content management is a major requirement.&lt;/p&gt;
&lt;p&gt;Framer has a CMS that supports collections and dynamic pages. Its official documentation describes CMS pages generated from collection content, with templates that can be used for blog posts, news articles, product pages, case studies, and similar content.&lt;/p&gt;
&lt;p&gt;Framer also provides visual content editing and automatic SEO options for CMS pages. Its CMS documentation highlights dynamic titles and descriptions, schema, Open Graph tags, drafts, publishing, and localization capabilities.&lt;/p&gt;
&lt;p&gt;Webflow has a more established reputation for structured content management. Its CMS is designed for content-rich websites and allows teams to manage structured content while controlling how that content is presented visually.&lt;/p&gt;
&lt;p&gt;For a simple blog or small content site, either platform can work.&lt;/p&gt;
&lt;p&gt;For a website expected to contain a substantial amount of structured content, multiple content types, and more complicated publishing requirements, Webflow's broader CMS environment may be more suitable.&lt;/p&gt;
&lt;p&gt;SEO: Framer vs Webflow&lt;br&gt;
Both platforms provide built-in SEO controls, meaning users do not have to rely on a separate WordPress-style SEO plugin simply to manage fundamental search settings.&lt;/p&gt;
&lt;p&gt;Framer states that its websites are optimized for SEO by default. Its SEO tools include sitemap and robots.txt generation, custom page titles and descriptions, indexing controls, redirects, and structured data options.&lt;/p&gt;
&lt;p&gt;Framer also provides built-in analytics and allows integration with Google Analytics.&lt;/p&gt;
&lt;p&gt;Webflow provides comparable fundamental SEO controls, including page titles, meta descriptions, URLs, Open Graph settings, and CMS-based SEO fields.&lt;/p&gt;
&lt;p&gt;Webflow goes further when localization becomes important. Its Localize system supports localized URLs, metadata, sitemaps, hreflang implementation, and visitor routing.&lt;/p&gt;
&lt;p&gt;For a beginner creating a single-language website, neither platform has an obvious fundamental SEO disadvantage.&lt;/p&gt;
&lt;p&gt;For larger multilingual websites, Webflow offers a more extensive localization system.&lt;/p&gt;
&lt;p&gt;Forms and Analytics&lt;br&gt;
A modern business website needs more than attractive pages. It also needs a way to collect leads and measure visitor activity.&lt;/p&gt;
&lt;p&gt;Framer includes native forms and built-in analytics. Its documentation covers contact forms for leads, bookings, signups, and inquiries, as well as spam protection and analytics.&lt;/p&gt;
&lt;p&gt;Framer also allows users to assign tracking IDs to links and forms and view those events through Analytics Overview. The platform supports funnels and A/B testing as part of its analytics and testing capabilities.&lt;/p&gt;
&lt;p&gt;Webflow provides forms and a broader set of marketing and optimization tools within its platform. Its current platform includes Analyze and Optimize products, while its paid Site plans include different levels of functionality depending on the selected plan.&lt;/p&gt;
&lt;p&gt;For a small website, Framer's built-in tools may be enough.&lt;/p&gt;
&lt;p&gt;For a company that expects website analytics, optimization, localization, collaboration, and other marketing functions to become increasingly important, Webflow's broader platform can be more compelling.&lt;/p&gt;
&lt;p&gt;Pricing Matters for Beginners&lt;br&gt;
Pricing can change, so it is important to compare current plans rather than rely on old articles.&lt;/p&gt;
&lt;p&gt;As of October 2026, Framer lists a free plan, Basic at $10 per month, and Pro at $30 per month, with annual billing displayed on its pricing page. The Basic plan includes a custom domain, two CMS collections, 50 GB of bandwidth, and built-in SEO. The Pro plan increases the CMS collections limit to 10 and includes features such as redirects, staging, and branching with previews.&lt;/p&gt;
&lt;p&gt;Webflow currently offers a free Starter plan. Its Basic Site plan is listed at $15 per month when billed yearly, while its Premium plan is listed at $25 per month when billed yearly. The Premium plan includes Webflow CMS, while the Basic plan is intended for simpler websites without CMS requirements.&lt;/p&gt;
&lt;p&gt;Webflow also separates Site plans from Workspace plans, which means users need to understand the distinction between hosting a website and managing projects, staging environments, collaboration, and related Workspace functions.&lt;/p&gt;
&lt;p&gt;For a beginner comparing only the entry-level paid plans, Framer currently has the lower listed starting price.&lt;/p&gt;
&lt;p&gt;However, price alone should not determine the decision. A cheaper plan that lacks a feature you later require can become more expensive if it forces a move to another tier or platform.&lt;/p&gt;
&lt;p&gt;Localization and International Websites&lt;br&gt;
International websites introduce another important difference.&lt;/p&gt;
&lt;p&gt;Framer supports localization and provides tools for translating and adapting sites. Its current platform documentation also describes localization as part of its broader website-building system.&lt;/p&gt;
&lt;p&gt;Webflow has invested heavily in localization. Webflow Localize supports multiple locales, localized content and styles, localized page settings, SEO metadata, URLs, and sitemap functionality.&lt;/p&gt;
&lt;p&gt;Webflow's localization system can therefore become particularly relevant to companies operating across different countries or language markets.&lt;/p&gt;
&lt;p&gt;A beginner building a personal portfolio probably does not need to prioritize this feature.&lt;/p&gt;
&lt;p&gt;A business planning a multilingual website should examine it carefully before choosing a platform.&lt;/p&gt;
&lt;p&gt;Collaboration and Growing Teams&lt;br&gt;
The platform choice can change when a solo website becomes a team project.&lt;/p&gt;
&lt;p&gt;Framer introduced a new billing system in 2026 that includes different editor types, including Content Editors for people who manage CMS content without requiring full editing access.&lt;/p&gt;
&lt;p&gt;Webflow has a broader Workspace system with collaboration features, staging environments, seats, permissions, publishing workflows, and team-oriented plans. Its current Team plan is designed for growing organizations and includes features such as Localize, publishing workflows, page branching, single-page publishing, and additional governance capabilities.&lt;/p&gt;
&lt;p&gt;For a solo creator, these differences may not matter much.&lt;/p&gt;
&lt;p&gt;For agencies, marketing departments, and organizations with multiple people involved in website production, Webflow's collaboration architecture deserves close attention.&lt;/p&gt;
&lt;p&gt;Which One Is Better for a Portfolio?&lt;br&gt;
For a personal portfolio, designer portfolio, freelancer website, or creative landing page, Framer is a strong choice.&lt;/p&gt;
&lt;p&gt;The visual workflow allows beginners to concentrate heavily on the appearance and presentation of the website. Its hosting, CMS, SEO, analytics, and publishing functions are integrated into the same platform.&lt;/p&gt;
&lt;p&gt;Webflow can also produce excellent portfolios, but it may introduce more concepts than a beginner needs for a relatively small project.&lt;/p&gt;
&lt;p&gt;If the objective is to launch a visually impressive portfolio without spending weeks learning a complex platform, Framer is the more straightforward recommendation.&lt;/p&gt;
&lt;p&gt;Which One Is Better for a Business Website?&lt;br&gt;
The answer depends on the business.&lt;/p&gt;
&lt;p&gt;A small company that needs a professional homepage, services page, contact page, and a few supporting pages can use either platform successfully.&lt;/p&gt;
&lt;p&gt;Webflow becomes more attractive when the website requires a structured CMS, multiple content types, localization, advanced collaboration, extensive marketing operations, or a larger team.&lt;/p&gt;
&lt;p&gt;Framer remains a strong choice when visual design, rapid publishing, and ease of use are the highest priorities.&lt;/p&gt;
&lt;p&gt;Which One Is Better for a Blog?&lt;br&gt;
Both platforms can support blogs through their CMS systems.&lt;/p&gt;
&lt;p&gt;Framer's CMS can generate dynamic pages from collections, making it possible to create blog posts and other recurring content from reusable templates.&lt;/p&gt;
&lt;p&gt;Webflow's CMS is also designed for structured content and content-rich websites.&lt;/p&gt;
&lt;p&gt;For a small independent blog, either platform can work.&lt;/p&gt;
&lt;p&gt;For a publication that expects complicated content structures, larger editorial operations, multiple content types, or more advanced team workflows, Webflow is likely the stronger candidate.&lt;/p&gt;
&lt;p&gt;Framer vs Webflow: The Beginner's Verdict&lt;br&gt;
There is no universal winner because the platforms prioritize different aspects of website building.&lt;/p&gt;
&lt;p&gt;Framer is the better choice for beginners who want:&lt;/p&gt;
&lt;p&gt;A highly visual website-building workflow&lt;br&gt;
Fast project creation&lt;br&gt;
Design-focused websites&lt;br&gt;
Portfolio websites&lt;br&gt;
Landing pages&lt;br&gt;
Small business websites&lt;br&gt;
Straightforward CMS projects&lt;br&gt;
Built-in SEO and analytics tools&lt;br&gt;
A lower starting price for paid plans&lt;br&gt;
Webflow is the better choice for beginners who want:&lt;/p&gt;
&lt;p&gt;A deeper website development environment&lt;br&gt;
More extensive CMS capabilities&lt;br&gt;
Content-heavy websites&lt;br&gt;
Larger business websites&lt;br&gt;
Advanced collaboration&lt;br&gt;
Multilingual and international websites&lt;br&gt;
More extensive marketing and optimization capabilities&lt;br&gt;
A platform that can accommodate increasingly complex projects&lt;br&gt;
The important point is that Webflow is not automatically better because it has more features, and Framer is not automatically better because it is easier to approach.&lt;/p&gt;
&lt;p&gt;For a first website, Framer is probably the better starting point for most beginners who prioritize simplicity and visual design.&lt;/p&gt;
&lt;p&gt;For someone who intends to build more complex websites and is prepared to spend more time learning the platform, Webflow is the stronger long-term candidate.&lt;/p&gt;
&lt;p&gt;The best choice is therefore determined by the website being built, not by which platform has the longer feature list.&lt;/p&gt;
&lt;p&gt;Before committing to either service, beginners should also check the current pricing and feature limits. Both companies continue to update their products and plans, and Webflow made significant pricing and plan changes during 2026.&lt;/p&gt;
&lt;p&gt;If the goal is to get a polished website online quickly, start with Framer.&lt;/p&gt;
&lt;p&gt;If the goal is to develop deeper skills for building structured, content-rich, collaborative websites, start with Webflow.&lt;/p&gt;
&lt;p&gt;For most first-time users, that distinction is more useful than simply asking which platform is &quot;best.&quot;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/29941/framer-vs-webflow-for-beginners-which-no-code-builder-is-best</guid>
<pubDate>Tue, 06 Oct 2026 05:40:50 +0000</pubDate>
</item>
<item>
<title>How to Make Your Website Cookie Compliant (GDPR and CCPA Tools)</title>
<link>https://coderlegion.com/27927/how-to-make-your-website-cookie-compliant-gdpr-and-ccpa-tools</link>
<description>&lt;p&gt;A website can load dozens of cookies, tracking scripts, pixels, tags, local storage objects, and third-party services without the site owner realizing exactly what is running.&lt;/p&gt;
&lt;p&gt;Google Analytics, advertising platforms, embedded videos, social media widgets, payment systems, chat tools, security services, and marketing platforms can all introduce technologies that store or access information on a visitor's device.&lt;/p&gt;
&lt;p&gt;That creates a compliance problem.&lt;/p&gt;
&lt;p&gt;Cookie compliance is not simply about displaying a pop-up that says, &quot;We use cookies.&quot; For websites serving visitors in the European Economic Area, the United Kingdom, California, and other jurisdictions with privacy requirements, the website needs to identify its tracking technologies, explain their purposes, obtain consent where required, respect opt-out choices, and maintain appropriate records.&lt;/p&gt;
&lt;p&gt;The exact requirements depend on the visitor, the technology being used, the purpose of processing, and the laws that apply to the website.&lt;/p&gt;
&lt;p&gt;Here is how to build a practical cookie compliance system.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start With a Cookie and Tracker Audit&lt;br&gt;
Before installing a cookie banner, find out what your website actually uses.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A typical website may have:&lt;/p&gt;
&lt;p&gt;Essential cookies for authentication or security&lt;br&gt;
Preference cookies&lt;br&gt;
Analytics cookies&lt;br&gt;
Advertising cookies&lt;br&gt;
Social media trackers&lt;br&gt;
Tracking pixels&lt;br&gt;
Embedded third-party content&lt;br&gt;
Marketing and conversion tags&lt;br&gt;
Local storage and other device-access technologies&lt;br&gt;
The important point is that compliance is not limited to traditional cookies. The UK Information Commissioner's Office, for example, treats cookies, tracking pixels, web storage, fingerprinting, scripts, tags, and similar technologies as storage and access technologies.&lt;/p&gt;
&lt;p&gt;Run a scan of the website and create an inventory containing the technology name, provider, purpose, category, duration, and whether it is first-party or third-party.&lt;/p&gt;
&lt;p&gt;Do this before configuring the consent banner.&lt;/p&gt;
&lt;p&gt;Otherwise, you may create a polished banner while unknown scripts continue operating underneath it.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Separate Essential and Non-Essential Technologies&lt;br&gt;
The next step is classification.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Some technologies are necessary for the website to provide a service requested by the visitor. Examples can include authentication or maintaining an online shopping basket.&lt;/p&gt;
&lt;p&gt;Other technologies exist primarily for analytics, advertising, personalization, or tracking.&lt;/p&gt;
&lt;p&gt;The distinction matters because certain essential technologies may qualify for an exemption from consent requirements, while non-essential technologies generally require consent under applicable cookie rules.&lt;/p&gt;
&lt;p&gt;The ICO states that websites must obtain consent for non-exempt storage and access technologies and must not pre-enable them before consent.&lt;/p&gt;
&lt;p&gt;The European Commission also distinguishes operational cookies from analytics and third-party cookies on its own websites. Its cookie policy states that certain authentication and technical cookies are necessary for website operation, while visitors can refuse analytics cookies.&lt;/p&gt;
&lt;p&gt;Do not automatically classify every first-party cookie as essential. Classification should be based on what the technology actually does.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Build a Proper Consent Banner&lt;br&gt;
A compliant consent banner needs to give visitors meaningful control.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For GDPR-related consent, the European Commission states that consent must be freely given, specific, informed, and unambiguous. The request should clearly explain what the visitor is agreeing to and allow consent to be withdrawn.&lt;/p&gt;
&lt;p&gt;The European Data Protection Board has also published detailed guidance on the requirements for valid consent under the GDPR.&lt;/p&gt;
&lt;p&gt;A practical banner should therefore identify the main purposes of non-essential tracking and provide controls for accepting or refusing those purposes.&lt;/p&gt;
&lt;p&gt;For example, categories can include:&lt;/p&gt;
&lt;p&gt;Necessary: Required for website operation.&lt;br&gt;
Preferences: Used to remember visitor settings.&lt;br&gt;
Analytics: Used to measure website usage.&lt;br&gt;
Marketing: Used for advertising, retargeting, or related marketing purposes.&lt;br&gt;
The visitor should not have to accept analytics or advertising technologies simply to access the website.&lt;/p&gt;
&lt;p&gt;The ICO specifically states that merely continuing to browse a website does not constitute valid consent for non-essential cookies.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Do Not Load Tracking Scripts Before Consent&lt;br&gt;
This is one of the most important technical steps.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A consent banner is not enough if Google Analytics, advertising pixels, or other non-essential trackers have already loaded before the visitor makes a choice.&lt;/p&gt;
&lt;p&gt;The consent management platform should control the scripts themselves.&lt;/p&gt;
&lt;p&gt;For example, a visitor who rejects marketing cookies should not subsequently receive advertising trackers merely because the banner was displayed.&lt;/p&gt;
&lt;p&gt;The ICO states that non-exempt storage and access technologies must not be pre-enabled before consent.&lt;/p&gt;
&lt;p&gt;This means your implementation needs to connect the consent system to Google Tag Manager, analytics tools, advertising scripts, embedded content, and other relevant third-party services.&lt;/p&gt;
&lt;p&gt;Test this with browser developer tools rather than assuming the configuration works.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Give Visitors a Way to Change Their Choice&lt;br&gt;
Cookie consent should not be a one-time decision with no practical way to change it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Your website should provide a visible mechanism for reopening the privacy preferences panel.&lt;/p&gt;
&lt;p&gt;This can be a persistent &quot;Cookie Settings,&quot; &quot;Privacy Settings,&quot; or similar control in the footer.&lt;/p&gt;
&lt;p&gt;The ICO recommends making it easy for users to enable or disable non-essential technologies and says consent should be specific to the purposes involved.&lt;/p&gt;
&lt;p&gt;Your system should therefore support both initial consent and later withdrawal.&lt;/p&gt;
&lt;p&gt;If a visitor originally accepts analytics cookies and later withdraws that permission, the website should honor the new preference.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Understand the CCPA Difference&lt;br&gt;
GDPR and CCPA should not be treated as identical cookie laws.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;California's privacy framework gives consumers rights concerning their personal information, including rights to opt out of the sale or sharing of personal information. The California Attorney General states that businesses subject to these requirements must provide appropriate methods for consumers to submit opt-out requests.&lt;/p&gt;
&lt;p&gt;California also recognizes user-enabled opt-out preference signals, including Global Privacy Control (GPC), for applicable opt-out requests.&lt;/p&gt;
&lt;p&gt;The California Privacy Protection Agency's regulations effective January 1, 2026, clarify that a cookie banner by itself is not an acceptable method for submitting a request to opt out of the sale or sharing of personal information.&lt;/p&gt;
&lt;p&gt;That distinction matters.&lt;/p&gt;
&lt;p&gt;A website may need both a cookie preference mechanism and a separate California privacy control, such as an appropriate &quot;Do Not Sell or Share My Personal Information&quot; or &quot;Your Privacy Choices&quot; mechanism, depending on its obligations.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use a Consent Management Platform&lt;br&gt;
For a small website, manually managing dozens of scripts can become difficult.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A Consent Management Platform, or CMP, can automate several parts of the process.&lt;/p&gt;
&lt;p&gt;Common features include:&lt;/p&gt;
&lt;p&gt;Cookie and tracker scanning&lt;br&gt;
Cookie categorization&lt;br&gt;
Consent banners&lt;br&gt;
Preference centers&lt;br&gt;
Regional rules&lt;br&gt;
Script blocking&lt;br&gt;
Consent records&lt;br&gt;
Cookie policy generation&lt;br&gt;
Third-party integrations&lt;br&gt;
Privacy request tools&lt;br&gt;
Several commercial platforms offer these functions.&lt;/p&gt;
&lt;p&gt;OneTrust provides cookie scanning, tracker categorization, customizable consent banners, regional configuration, automated blocking, scheduled scanning, and consent records.&lt;/p&gt;
&lt;p&gt;Termly provides a cookie consent manager covering GDPR, ePrivacy, CCPA, and other privacy frameworks. Its platform includes consent banners, automatic cookie policy generation, consent logs, and tools for privacy requests and &quot;Do Not Sell or Share&quot; links.&lt;/p&gt;
&lt;p&gt;Complianz is particularly relevant to WordPress websites. Its plugin provides cookie scanning, consent management, script and iframe blocking, consent records, regional configurations, and integrations with third-party services.&lt;/p&gt;
&lt;p&gt;These tools can reduce implementation work, but installing one does not automatically make a website legally compliant. Configuration still has to match the website's actual technologies, data practices, visitors, and applicable laws.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Keep Your Cookie Policy Accurate&lt;br&gt;
Your cookie policy should match what is actually operating on the website.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;At minimum, the policy should explain the types of cookies or similar technologies being used, their purposes, relevant providers, and applicable retention periods where required.&lt;/p&gt;
&lt;p&gt;Do not publish a generic cookie list and assume the job is finished.&lt;/p&gt;
&lt;p&gt;If you install a new advertising platform, analytics service, chatbot, embedded video service, or marketing tool, scan the website again and update the relevant disclosures.&lt;/p&gt;
&lt;p&gt;The European Commission's own cookie policy demonstrates this approach by listing individual cookies, their services, purposes, types, and durations.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Test the Website Before Going Live&lt;br&gt;
Cookie compliance should be tested technically.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Open the website in a fresh browser session and inspect what happens before making a consent decision.&lt;/p&gt;
&lt;p&gt;Check whether:&lt;/p&gt;
&lt;p&gt;Non-essential cookies load before consent.&lt;br&gt;
Advertising scripts execute before consent.&lt;br&gt;
Analytics technologies activate before permission.&lt;br&gt;
Rejecting optional cookies actually prevents their activation.&lt;br&gt;
Embedded third-party content bypasses the consent mechanism.&lt;br&gt;
Changing preferences later is respected.&lt;br&gt;
Consent records are generated where required.&lt;br&gt;
California opt-out signals are handled where applicable.&lt;br&gt;
Repeat the test after installing plugins, changing tag-manager configurations, adding advertising tools, or redesigning the website.&lt;/p&gt;
&lt;p&gt;A cookie audit is not a one-time project. Websites change continuously.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Treat Compliance as an Ongoing Process&lt;br&gt;
The biggest mistake is treating cookie compliance as a banner installation task.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Websites evolve.&lt;/p&gt;
&lt;p&gt;A marketing employee can install a new tracking pixel. A developer can add a new analytics service. A WordPress plugin can introduce another third-party script. A redesign can add embedded content from an external provider.&lt;/p&gt;
&lt;p&gt;Each change can affect the site's privacy obligations.&lt;/p&gt;
&lt;p&gt;The ICO recommends considering storage and access technologies during the design and implementation of online services and maintaining appropriate arrangements with third parties.&lt;/p&gt;
&lt;p&gt;For that reason, schedule regular scans and review the results.&lt;/p&gt;
&lt;p&gt;A practical process is:&lt;br&gt;
Audit: Identify cookies, scripts, pixels, tags, and other technologies.&lt;/p&gt;
&lt;p&gt;Classify: Determine which technologies are necessary and which require permission or other controls.&lt;/p&gt;
&lt;p&gt;Configure: Connect the CMP to the website's scripts and third-party services.&lt;/p&gt;
&lt;p&gt;Disclose: Maintain accurate cookie and privacy documentation.&lt;/p&gt;
&lt;p&gt;Test: Verify the website's behavior before and after each consent choice.&lt;/p&gt;
&lt;p&gt;Monitor: Rescan the website whenever technologies or vendors change.&lt;/p&gt;
&lt;p&gt;Before calling a website cookie-compliant, verify that you have:&lt;/p&gt;
&lt;p&gt;Audited cookies and similar tracking technologies.&lt;br&gt;
Identified third-party services.&lt;br&gt;
Classified technologies according to their purpose.&lt;br&gt;
Prevented applicable non-essential technologies from running before consent.&lt;br&gt;
Created a clear consent mechanism.&lt;br&gt;
Provided granular choices where required.&lt;br&gt;
Made refusal reasonably accessible.&lt;br&gt;
Provided a method for withdrawing or changing consent.&lt;br&gt;
Published accurate cookie information.&lt;br&gt;
Implemented applicable California opt-out mechanisms.&lt;br&gt;
Considered Global Privacy Control where applicable.&lt;br&gt;
Maintained consent records where required.&lt;br&gt;
Tested the website technically.&lt;br&gt;
Established a process for future cookie and tracker changes.&lt;br&gt;
The objective is not simply to put a cookie banner on the homepage. A properly implemented system connects the banner, tracking technologies, privacy documentation, consent records, and user controls.&lt;/p&gt;
&lt;p&gt;For websites operating across multiple jurisdictions, the requirements can differ substantially. GDPR, UK rules, and California privacy requirements should therefore be assessed according to the actual visitors, services, technologies, and data practices involved. A CMP can automate much of the technical work, but it cannot replace proper configuration and legal review.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/27927/how-to-make-your-website-cookie-compliant-gdpr-and-ccpa-tools</guid>
<pubDate>Mon, 21 Sep 2026 11:12:09 +0000</pubDate>
</item>
<item>
<title>Manage Your Infrastructure at Nine in Code</title>
<link>https://coderlegion.com/27114/manage-your-infrastructure-at-nine-in-code</link>
<description>&lt;p&gt;If you’ve ever managed infrastructure through a web interface, you know how easy it is to lose track of which settings you changed, when, and why. It’s convenient in the moment, but difficult to reproduce, review, or automate later. Especially when multiple people work on the same infrastructure.&lt;/p&gt;
&lt;p&gt;That’s where Infrastructure as Code (IaC) comes in. Instead of describing your infrastructure through clicks in a UI, you describe it in code. That code can be version controlled, reviewed through pull requests, reused, and executed repeatedly to produce the same result every time.&lt;/p&gt;
&lt;p&gt;Infrastructure as Code is just a part of the picture. Modern platforms are also driven by APIs, command-line tools, deployment platforms, configuration management, and GitOps workflows. Together, these tools make it possible to interact with and automate your infrastructure entirely through code.&lt;/p&gt;
&lt;p&gt;This is especially valuable if you’re building a platform for other teams to use. Standardizing how infrastructure is provisioned, whether through Terraform modules, Ansible playbooks, or GitOps repositories, gives every team a consistent, reviewable way to work instead of each team inventing its own approach. It also makes it much easier to see where infrastructure costs actually come from, since resources tied to a specific team or project are defined explicitly in code rather than scattered across a shared account.&lt;/p&gt;
&lt;p&gt;Whatever your preferred workflow, there’s a good chance we already have a tool, example, or guide to help you get started.&lt;/p&gt;
&lt;h2 id=&quot;your-toolkit-for-interacting-with-us-through-code&quot;&gt;Your toolkit for interacting with us through code&lt;/h2&gt;
&lt;p&gt;Tool / What it does / Best for&lt;br&gt;
Nine API / Direct REST access to all Nine resources / Custom integrations, your own tooling&lt;br&gt;
nctl/ CLI built on the Nine API / Day-to-day operations, scripting, CI/CD&lt;br&gt;
Deploio / Managed application platform (git push to deploy) / Deploying applications without managing infrastructure&lt;br&gt;
Terraform / Declarative provisioning of cloud resources / Versioned, reviewable environments (clusters, databases, storage)&lt;br&gt;
Ansible / Orchestration of multi-step workflows / Provisioning, configuring, and validating in one playbook&lt;br&gt;
ArgoCD / GitOps continuous delivery for Kubernetes / Keeping deployed applications in sync with a Git repository&lt;/p&gt;
&lt;h2 id=&quot;the-nine-api&quot;&gt;The Nine API&lt;/h2&gt;
&lt;p&gt;The Nine APIs are the foundation of automation on our platform. They expose all our public services through a REST API based on Kubernetes concepts, making them familiar to anyone already working with cloud native tooling.&lt;/p&gt;
&lt;p&gt;You can interact with the API using:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;curl&lt;/li&gt;
&lt;li&gt;kubectl&lt;/li&gt;
&lt;li&gt;or your own applications and automation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If none of the existing tools fit your workflow, you can build your own. The API is open, standards based, and designed to be integrated into your own scripts, applications, or internal platforms.&lt;/p&gt;
&lt;p&gt;Full documentation is available at docs.nine.ch/api.&lt;/p&gt;
&lt;p&gt;To learn more about the ideas behind the API, read our blog post Introducing the Nine Self-Service API.&lt;/p&gt;
&lt;h3 id=&quot;nctl-the-nine-command-line-interface&quot;&gt;nctl: The Nine Command Line Interface&lt;/h3&gt;
&lt;p&gt;nctl is our command line client built on top of the Nine API. It provides a convenient interface for creating, updating, and inspecting your Nine resources directly from the terminal, without having to use HTTP requests or Kubernetes manifests yourself.&lt;/p&gt;
&lt;p&gt;It’s a great choice if you want to automate repetitive tasks, integrate us into shell scripts or CI/CD pipelines, or simply prefer working from the command line. Behind the scenes, nctl uses the same public API, so anything you learn with nctl also helps you understand the underlying platform.&lt;/p&gt;
&lt;p&gt;The nctl documentation contains installation instructions, getting started guides, and examples for working with Kubernetes clusters, databases, object storage, virtual machines, Deploio applications, and many other Nine services.&lt;/p&gt;
&lt;h3 id=&quot;deploio&quot;&gt;Deploio&lt;/h3&gt;
&lt;p&gt;Deploio is our managed application platform. Instead of provisioning infrastructure yourself, you simply point Deploio at your Git repository. It clones your source code, builds it into an OCI container image, deploys a new release, and exposes your application automatically.&lt;/p&gt;
&lt;p&gt;Out of the box, Deploio supports several popular languages and frameworks through Cloud Native Buildpacks. If your application requires more control, you can also build it using your own Dockerfile, making it possible to run virtually any web application.&lt;/p&gt;
&lt;p&gt;Although the platform hides much of the operational complexity, it doesn’t turn deployment into a black box. Using nctl you can inspect build and release logs, retry failed builds or releases, execute a shell inside a running application, or even pull the generated OCI image to your local machine for debugging.&lt;/p&gt;
&lt;p&gt;Browse our Deploio examples repository, which contains sample applications for different languages and frameworks. If your favorite technology is missing, let us know - we’re always happy to expand our examples.&lt;/p&gt;
&lt;p&gt;You can also learn more in our blog:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Using Git to Release and Run Your Web App on Deploio&lt;/li&gt;
&lt;li&gt;Why We Added Dockerfile Support to Deploio&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;terraform-classic-infrastructure-as-code&quot;&gt;Terraform: classic Infrastructure as Code&lt;/h3&gt;
&lt;p&gt;If you’re already comfortable managing individual resources with nctl or the API directly, you might wonder when Terraform makes more sense. nctl and the API are ideal for quick, imperative changes, scripting, and day-to-day operations. Terraform is the better fit once you need to provision and version an entire environment declaratively, for example a Kubernetes cluster together with its databases and storage buckets as a single reviewable, repeatable unit, especially when that state needs to be shared and reviewed across a team.&lt;/p&gt;
&lt;p&gt;Terraform is a popular Infrastructure as Code tool for provisioning cloud resources. Instead of creating infrastructure manually, you describe the desired state in code and let Terraform determine which resources need to be created, updated, or removed.&lt;/p&gt;
&lt;p&gt;This makes it easy to version your infrastructure, review changes through pull requests, and recreate identical environments whenever needed. Terraform is an excellent choice for provisioning long lived infrastructure such as Kubernetes clusters before handing them over to application deployment tools like ArgoCD.&lt;/p&gt;
&lt;p&gt;Our Terraform examples show how to provision Nine resources entirely through code and can serve as a starting point for your own infrastructure.&lt;/p&gt;
&lt;h3 id=&quot;ansible-automating-infrastructure-setup&quot;&gt;Ansible: automating infrastructure setup&lt;/h3&gt;
&lt;p&gt;While Terraform focuses on provisioning infrastructure, Ansible excels at orchestrating complete workflows. Using simple, human readable YAML playbooks, you can provision resources, wait for them to become available, retrieve connection details, configure services, validate the deployment, and automate any follow-up tasks.&lt;/p&gt;
&lt;p&gt;Our guide From Zero to Infra: Building a Production-Ready Setup Using Our API &amp;amp; Ansible demonstrates how to combine Ansible with the Nine API and nctl to provision a production like environment consisting of a PostgreSQL database, a Redis instance, and a virtual machine. Along the way, the playbooks also retrieve connection information and verify that each service is ready to use.&lt;/p&gt;
&lt;h3 id=&quot;argocd-continuous-delivery-the-gitops-way&quot;&gt;ArgoCD: Continuous Delivery the GitOps way&lt;/h3&gt;
&lt;p&gt;ArgoCD brings the GitOps approach to Kubernetes. Instead of deploying applications manually, you store your Kubernetes manifests or Helm charts in a Git repository. ArgoCD continuously monitors that repository and ensures that your cluster always matches the desired state defined in Git.&lt;/p&gt;
&lt;p&gt;This means every deployment is version controlled, reviewed through pull requests, and easy to roll back if necessary. If someone makes a manual change to the cluster, ArgoCD detects the drift and can automatically reconcile it, keeping your applications in the state you’ve declared.&lt;/p&gt;
&lt;p&gt;Our ArgoCD example applications demonstrate how to deploy applications on Nine using Helm and GitOps workflows. Feel free to use them as a starting point for your own projects.&lt;/p&gt;
&lt;p&gt;To see this in practice, read how we helped mühlemann+popp introduce ArgoCD to give their healthcare customer full visibility into deployments while migrating to Nine Kubernetes Engine.&lt;/p&gt;
&lt;h2 id=&quot;explore-contribute-and-improve&quot;&gt;Explore, Contribute and Improve&lt;/h2&gt;
&lt;p&gt;All our open source projects are available on our GitHub&lt;/p&gt;
&lt;p&gt;Browse the repositories, fork them, submit pull requests, or simply use them as inspiration for your own projects. We always welcome feedback and contributions.&lt;/p&gt;
&lt;h2 id=&quot;join-the-conversation&quot;&gt;Join the Conversation&lt;/h2&gt;
&lt;p&gt;Is there a tool, example, or integration you’d like to see? Open an issue on the relevant GitHub repository and tell us what’s missing or unclear. We’d love to hear how you’re managing your infrastructure at Nine in code.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/27114/manage-your-infrastructure-at-nine-in-code</guid>
<pubDate>Mon, 14 Sep 2026 04:44:42 +0000</pubDate>
</item>
<item>
<title>The Unseen Intuition: Decentralization, Human Prompting, and the Art of Readable Code</title>
<link>https://coderlegion.com/24312/the-unseen-intuition-decentralization-human-prompting-and-the-art-of-readable-code</link>
<description>&lt;p&gt;Open source software was built to defragment monoliths, serving as the ultimate catalyst for developer productivity and collective innovation. Ostensibly, many open source ecosystems face a subtle paradox: governance models that quietly centralize motives. When legacy stewards hold weighted influence — the open-minded spirit shifts. True evolution relies on distributed momentum, not administrative inertia. Sustainable growth requires dynamic environments where updates happen fluidly, every contributor’s voice carrying input.&lt;/p&gt;
&lt;p&gt;As software development rapidly integrates AI and Agentic systems, speed increases exponentially. But machine efficiency alone misses a vital layer: human context. While AI generates vast architectures in seconds, human intuition provides the nuanced vision behind it — a reality reflected in the prompts humans craft. Whether guiding media generation, writing complex logic, or refining copy, a prompt reveals how an individual perceives, abstracts, and solves a problem.&lt;/p&gt;
&lt;p&gt;To bridge this gap, human developers who take the lead in documenting processes directly within the code enhance output. Elevating readability through explicit annotations — /&lt;em&gt; tips, hints, and tricks &lt;/em&gt;/ — is not just about standard documentation; it is about preserving individual intuition. Lines of code should be an open map, readily deciphered and freely tailored. Because at its core, code is fluid art: anything and everything can be customized, repurposed, and reshaped.&lt;/p&gt;
&lt;p&gt;Preserving open source optimistically requires protecting creative independence, decentralization, and ensuring human perspective remains legible within an automated world.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/24312/the-unseen-intuition-decentralization-human-prompting-and-the-art-of-readable-code</guid>
<pubDate>Sun, 09 Aug 2026 04:52:59 +0000</pubDate>
</item>
<item>
<title>Book Your Movie Tickets with Python</title>
<link>https://coderlegion.com/22359/book-your-movie-tickets-with-python</link>
<description>&lt;p&gt;My simple Python &lt;em&gt;Movie Ticket Booking Calculator&lt;/em&gt; that helps users simulate booking a ticket by changing ticket types , prices and more and then calculating the total cost in a clear and easy way &lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Movie Ticket Booking Calculator&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;base_price = 15 # Place Holder
age = 21 # Place Holder
seat_type = &quot;Gold&quot; # Place Holder
show_time = &quot;Evening&quot; # Place Holder

if age &amp;gt; 17:
    print(&quot;User is eligible to book a ticket&quot;)

if age &amp;gt;= 21:
    print(&quot;User is eligible for Evening shows&quot;)
else:
    print(&quot;User is not eligible for Evening shows&quot;)

is_member = False # Place Holder
is_weekend = False # Place Holder

discount = 0
if is_member and age &amp;gt;= 21:
    discount = 3
    print(&quot;User qualifies for membership discount&quot;)
else:
    print(&quot;User does not qualify for membership discount&quot;)
print(f&quot;Discount: ${discount}&quot;)

extra_charges = 0
if is_weekend or show_time == &quot;Evening&quot;:
    extra_charges = 2
    print(&quot;Extra charges will be applied&quot;)
else:
    print(&quot;No extra charges will be applied&quot;)
print(f&quot;Extra charges: ${extra_charges}&quot;)

if age &amp;gt;= 21 or age &amp;gt;= 18 and (show_time != &quot;Evening&quot; or is_member):
    print(&quot;Ticket booking condition satisfied&quot;)

    service_charges = 0
    if seat_type == &quot;Premium&quot;:
        service_charges = 5
        print(f&quot;Service charges: ${service_charges}&quot;)
    elif seat_type == &quot;Gold&quot; :
        service_charges = 3
        print(f&quot;Service charges: ${service_charges}&quot;)
    else:
        service_charges = 1
        print(f&quot;Service charges: ${service_charges}&quot;)
    final_price = extra_charges + service_charges + base_price - discount
    print(f&quot;Final price of ticket: ${final_price}&quot;)
else:
    print(&quot;Ticket booking failed due to restrictions&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;features&quot;&gt;Features&lt;/h3&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;Checks if the user is eligible to book a movie ticket&lt;/li&gt;
&lt;li&gt;Adds extra charges for evening shows or weekend bookings&lt;/li&gt;
&lt;li&gt;Applies a membership discount  only when the user qualifies&lt;/li&gt;
&lt;li&gt;Supports different seat types &lt;/li&gt;
&lt;li&gt;Uses clear conditional logic with if , elif, and else statements&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/22359/book-your-movie-tickets-with-python</guid>
<pubDate>Sun, 12 Jul 2026 07:55:51 +0000</pubDate>
</item>
<item>
<title>What Is SARIF and How Does It Help Security Tools Work Together?</title>
<link>https://coderlegion.com/21637/what-is-sarif-and-how-does-it-help-security-tools-work-together</link>
<description>
&lt;p&gt;Hello, I'm Ganesh. I'm building &lt;em&gt;git-lrc&lt;/em&gt;, an AI code reviewer that runs on every commit. It is free, unlimited, and source-available on Github. &lt;a href=&quot;https://github.com/HexmosTech/git-lrc?utm_source=chatgpt.com&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;Star git-lrc on GitHub&lt;/a&gt; to help more developers discover the project. Do give it a try and share your feedback for improving the product.&lt;/p&gt;

&lt;p&gt;If you've ever worked with tools like Semgrep, Trivy, Checkov, Gitleaks, or CodeQL, you've probably noticed that each tool produces results in a different format. Some output JSON, some use XML, while others generate plain text reports.&lt;/p&gt;

&lt;p&gt;This creates a problem: how do you aggregate multiple tools results from multiple tools into a single platform?&lt;/p&gt;

&lt;p&gt;That's where SARIF comes in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is SARIF?
&lt;/h2&gt;

&lt;p&gt;SARIF stands for &lt;strong&gt;Static Analysis Results Interchange Format&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is an open standard designed to represent findings from static analysis tools, security scanners, linters, and code quality tools in a common format.&lt;/p&gt;

&lt;p&gt;Think of SARIF as a universal translator.&lt;/p&gt;

&lt;p&gt;Instead of every tool speaking its own language:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;Semgrep -&amp;gt; Semgrep JSON
Trivy -&amp;gt; Trivy JSON
Checkov -&amp;gt; Checkov JSON
Gitleaks -&amp;gt; Gitleaks JSON
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SARIF allows all of them to communicate using a shared structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;Semgrep
Trivy
Checkov
Gitleaks
    &amp;darr;
   SARIF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why Was SARIF Created?
&lt;/h2&gt;

&lt;p&gt;Imagine a company running 20 different scanners in its CI/CD pipeline.&lt;/p&gt;

&lt;p&gt;Each scanner reports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Different severity levels&lt;/li&gt;
&lt;li&gt;Different file formats&lt;/li&gt;
&lt;li&gt;Different metadata&lt;/li&gt;
&lt;li&gt;Different output structures&lt;/li&gt;
&lt;li&gt;Different CVE&lt;/li&gt;
&lt;li&gt;Different CVSS scores&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building integrations for every tool becomes difficult and expensive.&lt;/p&gt;

&lt;p&gt;SARIF solves this problem by providing a standardized schema for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rule IDs&lt;/li&gt;
&lt;li&gt;Messages&lt;/li&gt;
&lt;li&gt;Severity&lt;/li&gt;
&lt;li&gt;File locations&lt;/li&gt;
&lt;li&gt;Code snippets&lt;/li&gt;
&lt;li&gt;Security metadata&lt;/li&gt;
&lt;li&gt;Fix suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows platforms to consume results from many tools without writing custom integrations for each one.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Simple Example
&lt;/h2&gt;

&lt;p&gt;Suppose a security scanner finds a vulnerability:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;File: app.py
Line: 42
Severity: High
Message: Possible SQL Injection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In SARIF, that information becomes structured JSON that any compatible platform can understand.&lt;/p&gt;

&lt;p&gt;The scanner changes, but the format remains the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  How SARIF Helps Developers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  One Format for Many Tools
&lt;/h3&gt;

&lt;p&gt;Instead of handling dozens of output formats:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;Tool A -&amp;gt; Format A
Tool B -&amp;gt; Format B
Tool C -&amp;gt; Format C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you can standardize on:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;Tool A
Tool B
Tool C
   &amp;darr;
 SARIF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Better Tool Interoperability
&lt;/h3&gt;

&lt;p&gt;A SARIF file generated by one tool can be consumed by another platform without modification.&lt;/p&gt;

&lt;p&gt;This makes integrations significantly easier.&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub Code Scanning Support
&lt;/h3&gt;

&lt;p&gt;One of the biggest reasons SARIF became popular is GitHub Code Scanning.&lt;/p&gt;

&lt;p&gt;GitHub accepts SARIF uploads and automatically displays:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security findings&lt;/li&gt;
&lt;li&gt;Code quality issues&lt;/li&gt;
&lt;li&gt;Vulnerabilities&lt;/li&gt;
&lt;li&gt;File-level annotations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;directly inside pull requests and repositories.&lt;/p&gt;

&lt;h3&gt;
  
  
  Easier Aggregation
&lt;/h3&gt;

&lt;p&gt;Organizations often run multiple scanners:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;Semgrep
Trivy
Checkov
Gitleaks
Bandit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SARIF makes it possible to combine all findings into a single report.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;SARIF is a common language that allows tools to exchange findings in a standard way.&lt;/p&gt;

&lt;p&gt;As the number of security and code analysis tools continues to grow, standards like SARIF help reduce integration complexity and make tool ecosystems work together more effectively.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;&lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnuphqwcp6bha9ol6pdo3.png&quot; alt=&quot;git-lrc&quot; width=&quot;360&quot; height=&quot;540&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Any feedback or contributors are welcome! It&amp;rsquo;s online, source-available, and ready for anyone to use.&lt;/p&gt;

&lt;p&gt;&amp;#11088; &lt;a href=&quot;https://github.com/HexmosTech/git-lrc?utm_source=chatgpt.com&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;Star git-lrc on GitHub&lt;/a&gt;&lt;/p&gt;
</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/21637/what-is-sarif-and-how-does-it-help-security-tools-work-together</guid>
<pubDate>Sat, 04 Jul 2026 16:06:30 +0000</pubDate>
</item>
<item>
<title>CodeMender IA — Universal Cloud Architect for VS Code</title>
<link>https://coderlegion.com/20194/codemender-ia-universal-cloud-architect-for-vs-code</link>
<description>&lt;p&gt;Stop Fixing Syntax. Start Architecting Solutions.&lt;/p&gt;
&lt;p&gt;For software developers, full-stack engineers, and cloud architects, standard linters are no longer enough. Standard linters only tell you where a syntax error is; they don't tell you why your software architecture will fail under production-level scale.&lt;/p&gt;
&lt;p&gt;To solve this gap, we built CodeMender IA—the first &quot;Bring Your Own Model&quot; (BYOM) DevOps Intelligence Engine designed directly for Visual Studio Code. It acts as a virtual Senior Software Architect sitting inside your editor, providing real-time analysis of logical fallacies, technical debt, and cloud scalability.&lt;/p&gt;
&lt;p&gt;Key Technical Capabilities:&lt;/p&gt;
&lt;p&gt;🔌 Universal API Support (BYOM): You are completely free from vendor lock-in. Connect CodeMender IA to your preferred model, including Google Gemini (fast/free tiers), OpenAI (GPT-4o), Anthropic (Claude 3.5 Sonnet), or run local offline models (Ollama/DeepSeek) for 100% data privacy.&lt;br&gt;
☁️ Cloud Native Auditing: Instantly scan your codebase for Kubernetes and cloud readiness, verifying 12-Factor App compliance, statelessness violations, and hardcoded env secrets.&lt;br&gt;
📊 Technical Debt Calculator: Analyze your logical complexity before compiling. CodeMender IA identifies inefficient algorithms (such as nested loops with O(n^2) time complexity) and estimates CPU/RAM usage spikes on serverless environments like AWS Lambda and Azure Functions.&lt;br&gt;
🗺️ Scalability Heatmaps &amp;amp; Migration Paths: Visualize which parts of your workspace are monolithic versus modular, and get step-by-step refactoring recommendations to transition complex functions into clean, independent microservices.&lt;/p&gt;
&lt;p&gt;Eliminate syntax bottlenecks, reduce cloud architecture overhead, and future-proof your codebase natively from your editor.&lt;/p&gt;
&lt;p&gt;👉 Install CodeMender IA directly from the Visual Studio Marketplace:&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=SEOSiri.codemender-ia&quot;&gt;https://marketplace.visualstudio.com/items?itemName=SEOSiri.codemender-ia&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/20194/codemender-ia-universal-cloud-architect-for-vs-code</guid>
<pubDate>Wed, 10 Jun 2026 16:50:39 +0000</pubDate>
</item>
<item>
<title>How I Review PRs with AI — Without Losing My Own Judgment</title>
<link>https://coderlegion.com/15907/how-i-review-prs-with-ai-without-losing-my-own-judgment</link>
<description>&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Originally published on Medium:&lt;/em&gt;&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://medium.com/@rajkundalia/how-i-review-prs-with-ai-without-losing-my-own-judgment-f930ad30dc60&quot;&gt;https://medium.com/@rajkundalia/how-i-review-prs-with-ai-without-losing-my-own-judgment-f930ad30dc60&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;Over the last few months, my code review queue has changed completely. With agentic coding, PRs are larger, faster, and harder to reason about.&lt;/p&gt;
&lt;p&gt;I needed a system that was faster, but I absolutely did not want to just hand things off to an AI and call it a review.&lt;/p&gt;
&lt;p&gt;Built-in tools exist. Claude Code has &lt;code&gt;/review&lt;/code&gt; or &lt;code&gt;/deep-review&lt;/code&gt;, and GitHub Copilot's PR review is decent out of the box. If you just want an AI pass, they work fine. But I am not optimizing for just an AI pass; I am optimizing for understanding and architectural signal.&lt;/p&gt;
&lt;p&gt;Here is a repeatable framework I use to let AI handle the heavy scanning, while I keep the heavy thinking and judgment firmly in my own hands.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Note: All the prompts referenced below are open-source in my GitHub repo:  &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/rajkundalia/ai-code-review-prompts&quot;&gt;https://github.com/rajkundalia/ai-code-review-prompts&lt;/a&gt;. They are tool-agnostic — paste them into Claude, ChatGPT, Cursor, or whatever you prefer.)&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-golden-rule-context-isolation&quot;&gt;The Golden Rule: Context Isolation&lt;/h3&gt;
&lt;p&gt;Before we get into the phases, there is one non-negotiable rule that makes this entire system work: &lt;strong&gt;One AI session per PR.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you mix your own daily work, multiple PR reviews, and random questions into a single AI session, you lose context. PR reviews are context-heavy. When a colleague replies to your comment four days later, having a dedicated, preserved AI session helps you instantly remember your mental model and why you left that comment in the first place.&lt;/p&gt;
&lt;p&gt;Keep the thread alive from the start of the review through the merge.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3opj335psubnicrc601c.png&quot; alt=&quot;Image description&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-4-phase-pr-review-workflow&quot;&gt;The 4-Phase PR Review Workflow&lt;/h3&gt;
&lt;p&gt;When I load my initial prompt, it gives me a starting point: a high-level summary, the files touched, and the core intent of the PR. From there, I move through four distinct phases. &lt;strong&gt;Do not skip ahead.&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&quot;phase-1-build-understanding-human-first-&quot;&gt;Phase 1: Build Understanding (Human First)&lt;/h4&gt;
&lt;p&gt;What happens next is entirely mine. I go file by file, line by line, and ask the AI questions until I have built my own understanding of the flow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is this doing?&lt;/li&gt;
&lt;li&gt;Where is this data model used further downstream?&lt;/li&gt;
&lt;li&gt;What breaks if this assumption changes?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is deliberately manual. Anything I still do not understand after interrogating the AI, I flag for a human comment.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;If you skip this phase, you're not reviewing the code — you're reviewing the AI's opinion of the code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h4 id=&quot;phase-2-ai-first-pass-filter-the-noise-&quot;&gt;Phase 2: AI First Pass (Filter the Noise)&lt;/h4&gt;
&lt;p&gt;This is where the AI does its first real pass, flagging standard issues and inconsistencies. This is intentionally a surface pass.&lt;/p&gt;
&lt;p&gt;The reason this is a separate phase from the deep review is simple: I want the obvious stuff caught and out of the way early. It gives me a chance to dismiss irrelevant suggestions immediately, ensuring the next phase isn't cluttered with noise.&lt;/p&gt;
&lt;p&gt; Think of this as signal extraction, not decision-making.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;phase-3-the-deep-review-pressure-testing-&quot;&gt;Phase 3: The Deep Review (Pressure Testing)&lt;/h4&gt;
&lt;p&gt;This is the heaviest phase, driven by a few specific forcing functions:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The &quot;Chief Programmer&quot; &amp;amp; &quot;Chief Architect&quot; Persona&lt;/strong&gt;&lt;br&gt;
Giving the AI a specific role produces sharper, more critical output than a generic &quot;review this code.&quot; You can adjust the role to fit your domain, e.g., chief AI engineer if you are reviewing prompt code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Real Coverage vs. Theater&lt;/strong&gt;&lt;br&gt;
AI agents generate a massive amount of tests. Left unchecked, they will write tests for data models with no logic, or tests that just verify Python works. I explicitly prompt the AI to look for meaningful behavior validation so we catch the noise upfront. It is better than constantly asking the AI to remove redundant tests.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Tests should prove behavior, not existence.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Playing Devil’s Advocate&lt;/strong&gt;&lt;br&gt;
I force the LLM to question its own assumptions. What could go wrong? Where would this fail in production three months from now?&lt;/p&gt;
&lt;p&gt;This surfaces edge cases that standard reviews easily miss.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;phase-4-the-verdict&quot;&gt;Phase 4: The Verdict&lt;/h4&gt;
&lt;p&gt;Finally, I combine my Phase 1 understanding with the AI's deep review insights. The AI helps me classify the findings into:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Must-fix blockers&lt;/li&gt;
&lt;li&gt;Good-to-have stylistic suggestions&lt;/li&gt;
&lt;li&gt;Noise to be discarded&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-author-s-duty-self-review&quot;&gt;The Author's Duty: Self-Review&lt;/h3&gt;
&lt;p&gt;Before your code ever reaches another human, it is your responsibility to review it.&lt;/p&gt;
&lt;p&gt;I converted my PR review framework into a self-review prompt. I run through the exact same phases on my own code. The output here is highly surgical: it tells me the file, the line, what is wrong, and what to do instead.&lt;/p&gt;
&lt;p&gt;The goal is simple:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;The comments you eventually get from your peers should be about high-level design decisions — not trivial things you could have caught yourself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You get serious brownie points for consistently raising high-quality, pre-vetted PRs.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;scaling-the-process&quot;&gt;Scaling the Process&lt;/h3&gt;
&lt;p&gt;Not every PR needs all four phases.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 10-line config change → quick pass&lt;/li&gt;
&lt;li&gt;A 1,000-line refactor → full deep review&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Match the depth of review to the risk and complexity.&lt;/p&gt;
&lt;p&gt;Over-reviewing small changes is wasteful.&lt;br&gt;
Under-reviewing large ones is dangerous.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h3&gt;
&lt;p&gt;I am not offloading my thinking to an AI. I am using it to explore faster, validate assumptions, and stress-test decisions. The thinking is still mine.&lt;/p&gt;
&lt;p&gt;The leverage is new.&lt;br&gt;
The responsibility isn’t.&lt;/p&gt;
&lt;p&gt;These tools are incredibly powerful — but you still need to hold the leash.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I’ve open-sourced the prompts and guidelines I use:&lt;br&gt;
 &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/rajkundalia/ai-code-review-prompts&quot;&gt;https://github.com/rajkundalia/ai-code-review-prompts&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you have better ideas, improvements, or ways to reduce noise — I’d genuinely like to see them.&lt;/p&gt;
</description>
<category>Tutorials</category>
<guid isPermaLink="true">https://coderlegion.com/15907/how-i-review-prs-with-ai-without-losing-my-own-judgment</guid>
<pubDate>Sun, 26 Apr 2026 14:07:05 +0000</pubDate>
</item>
<item>
<title>cursor-claude-personas: Give Your AI Coding Assistant a Domain Expert Brain in 30 Seconds</title>
<link>https://coderlegion.com/14653/cursor-claude-personas-give-your-ai-coding-assistant-a-domain-expert-brain-in-30-seconds</link>
<description>
&lt;p&gt;&lt;img src=&quot;https://blog.ratnesh-maurya.com/images/blog/cursor-claude-personas.png&quot; alt=&quot;cursor-claude-personas: Give Your AI Coding Assistant a Domain Expert Brain in 30 Seconds&quot;&gt;&lt;/p&gt;&lt;h1 id=&quot;cursor-claude-personas-give-your-ai-coding-assistant-a-domain-expert-brain-in-30-seconds&quot;&gt;cursor-claude-personas: Give Your AI Coding Assistant a Domain Expert Brain in 30 Seconds&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; &amp;mdash; &lt;code&gt;cursor-claude-personas&lt;/code&gt; is a free, open-source collection of 38 role-based AI persona packs for Claude Code, Cursor, and VS Code. Copy one folder into your project, reopen your editor, and your AI assistant instantly behaves like a seasoned specialist &amp;mdash; whether that's a senior Python developer, a DevOps engineer, a security expert, or a UI/UX designer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;the-problem-generic-ai-gives-generic-code&quot;&gt;The Problem: Generic AI Gives Generic Code&lt;/h2&gt;
&lt;p&gt;You have Claude Code or Cursor open. You ask it to add an endpoint. It writes something that works &amp;mdash; but it doesn't know your preferred framework patterns, it doesn't follow your domain conventions, and it certainly doesn't remember that you care deeply about SQL index hygiene or GraphQL schema design.&lt;/p&gt;
&lt;p&gt;The usual fix is a long system prompt you paste in every time. Or a &lt;code&gt;.cursorrules&lt;/code&gt; file you spend hours writing. Or endless back-and-forth corrections.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cursor-claude-personas solves this with a dead-simple copy-paste.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;what-is-cursor-claude-personas&quot;&gt;What Is cursor-claude-personas?&lt;/h2&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ratnesh-maurya/cursor-claude-personas&quot;&gt;cursor-claude-personas&lt;/a&gt; is a GitHub repository containing &lt;strong&gt;38 ready-made persona packs&lt;/strong&gt; for AI coding tools. Each persona is a folder with two hidden subdirectories:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;hljs language-text&quot;&gt;senior-python-developer/
&amp;#9500;&amp;#9472;&amp;#9472; .claude/
&amp;#9474;   &amp;#9500;&amp;#9472;&amp;#9472; rules/       &amp;larr; always-on instructions Claude Code reads at session start
&amp;#9474;   &amp;#9492;&amp;#9472;&amp;#9472; skills/      &amp;larr; auto-triggered skill docs for specific tasks
&amp;#9492;&amp;#9472;&amp;#9472; .cursor/
    &amp;#9500;&amp;#9472;&amp;#9472; rules/       &amp;larr; always-on instructions Cursor reads at session start
    &amp;#9492;&amp;#9472;&amp;#9472; skills/      &amp;larr; auto-triggered skill docs for specific tasks
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When you copy &lt;code&gt;.claude/&lt;/code&gt; or &lt;code&gt;.cursor/&lt;/code&gt; (or both) into the root of your project, your editor loads those configs automatically. No slash commands. No system prompts. The persona is live the moment you start a new chat session.&lt;/p&gt;
&lt;h3 id=&quot;supported-tools&quot;&gt;Supported tools&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What to copy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.claude/&lt;/code&gt; folder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.cursor/&lt;/code&gt; folder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VS Code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.claude/&lt;/code&gt; folder (when using Claude-based extensions)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&quot;how-to-use-it-step-by-step&quot;&gt;How to Use It &amp;mdash; Step by Step&lt;/h2&gt;
&lt;h3 id=&quot;step-1-clone-the-repo&quot;&gt;Step 1: Clone the repo&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;hljs language-bash&quot;&gt;git &lt;span class=&quot;hljs-built_in&quot;&gt;clone&lt;/span&gt; &lt;a href=&quot;https://github.com/ratnesh-maurya/cursor-claude-personas.git&quot; rel=&quot;nofollow&quot;&gt;https://github.com/ratnesh-maurya/cursor-claude-personas.git&lt;/a&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You only need to clone it once. Keep it around as your personal AI persona library.&lt;/p&gt;
&lt;h3 id=&quot;step-2-pick-the-persona-that-matches-your-current-work&quot;&gt;Step 2: Pick the persona that matches your current work&lt;/h3&gt;
&lt;p&gt;Browse the table in the next section or visit the &lt;a rel=&quot;nofollow&quot; href=&quot;https://ratnesh-maurya.github.io/cursor-claude-personas/&quot;&gt;GitHub Pages site&lt;/a&gt; to filter by technology or tag.&lt;/p&gt;
&lt;h3 id=&quot;step-3-copy-the-persona-into-your-project&quot;&gt;Step 3: Copy the persona into your project&lt;/h3&gt;
&lt;p&gt;Navigate to your cloned copy and run:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;hljs language-bash&quot;&gt;&lt;span class=&quot;hljs-comment&quot;&gt;# Claude Code only&lt;/span&gt;
&lt;span class=&quot;hljs-built_in&quot;&gt;cp&lt;/span&gt; -R cursor-claude-personas/senior-python-developer/.claude /path/to/your-project/

&lt;span class=&quot;hljs-comment&quot;&gt;# Cursor only&lt;/span&gt;
&lt;span class=&quot;hljs-built_in&quot;&gt;cp&lt;/span&gt; -R cursor-claude-personas/senior-python-developer/.cursor /path/to/your-project/

&lt;span class=&quot;hljs-comment&quot;&gt;# Both tools&lt;/span&gt;
&lt;span class=&quot;hljs-built_in&quot;&gt;cp&lt;/span&gt; -R cursor-claude-personas/senior-python-developer/.claude /path/to/your-project/
&lt;span class=&quot;hljs-built_in&quot;&gt;cp&lt;/span&gt; -R cursor-claude-personas/senior-python-developer/.cursor /path/to/your-project/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Replace &lt;code&gt;senior-python-developer&lt;/code&gt; with any persona slug from the list below.&lt;/p&gt;
&lt;h3 id=&quot;step-4-reopen-your-editor-or-start-a-new-session&quot;&gt;Step 4: Reopen your editor or start a new session&lt;/h3&gt;
&lt;p&gt;Claude Code and Cursor reload configuration at session start. From that point on, the AI follows the persona's rules, applies its skills automatically, and behaves as a domain expert &amp;mdash; without you typing a single extra word.&lt;/p&gt;
&lt;h3 id=&quot;bonus-enable-the-auto-skill-router&quot;&gt;Bonus: Enable the auto-skill router&lt;/h3&gt;
&lt;p&gt;Each persona includes a special rule file called &lt;code&gt;rules--auto-skill-router.mdc&lt;/code&gt; (&lt;code&gt;.mdc&lt;/code&gt; is the Cursor/Claude rule file format &amp;mdash; it is just Markdown with optional YAML frontmatter). This rule tells the AI to automatically select the right skill doc based on what you're working on &amp;mdash; so you never need to type &lt;code&gt;/skill&lt;/code&gt; commands manually.&lt;/p&gt;
&lt;p&gt;It is already included when you copy the persona folders. No extra steps required.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;all-38-personas&quot;&gt;All 38 Personas&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Persona&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;3d-frontend-developer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Three.js, WebGL, 3D UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ai-agent-developer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LLM agents, tool use, orchestration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ai-ml-engineer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Model training, pipelines, MLOps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azure-developer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Azure services, ARM/Bicep, AKS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;blockchain-web3-developer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Smart contracts, DeFi, Web3 tooling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;blog-website-developer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Content sites, CMS, static generators&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;data-engineer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pipelines, dbt, Spark, warehouses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;devops-cloud-engineer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CI/CD, Kubernetes, IaC, observability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ecommerce-specialist&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shopify, WooCommerce, checkout flows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fullstack-saas-mvp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rapid SaaS prototyping, full-stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;functional-programming&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Haskell, Clojure, FP patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;game-developer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unity, Godot, game loops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;health-tech-developer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;FHIR, HL7, medical data systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;legal-finance-analyst&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Contracts, compliance, financial models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;marketing-automation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Email, CRM integrations, analytics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mobile-developer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;React Native, Flutter, iOS/Android&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;n8n-automation-specialist&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;n8n workflows, low-code automation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;odoo-erp-specialist&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Odoo modules, ERP customization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;open-source-maintainer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OSS governance, reviews, releases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;platform-integrations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;APIs, webhooks, third-party services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;product-manager&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Roadmaps, specs, user stories&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qa-testing-engineer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Test strategy, automation, coverage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;saas-startup-founder&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GTM, metrics, early-stage decisions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;security-engineer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Threat modeling, hardening, audits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;senior-dotnet-developer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;C#, ASP.NET Core, Azure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;senior-elixir-developer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Elixir, Phoenix, OTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;senior-frontend-developer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;React, TypeScript, frontend architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;senior-golang-developer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go, microservices, concurrency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;senior-java-developer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Java, Spring Boot, enterprise patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;senior-python-developer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Python, APIs, automation, data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;senior-rust-developer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rust, systems programming, WASM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;seo-specialist&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Technical SEO, Core Web Vitals, schema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;system-architect&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Service boundaries, scalability, design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;system-designer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Low-level system design, algorithms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;technical-writer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Docs, onboarding, API clarity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ui-ux-designer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Design systems, accessibility, UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;voice-ai-developer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Voice interfaces, TTS, STT, ASR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wordpress-specialist&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;WordPress, WooCommerce, theme dev&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Not sure where to start? Try &lt;code&gt;senior-python-developer&lt;/code&gt; or &lt;code&gt;senior-frontend-developer&lt;/code&gt; &amp;mdash; both are polished starting points that work for a wide range of projects.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;What Makes This Different From a &lt;code&gt;.cursorrules&lt;/code&gt; File?&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;.cursorrules&lt;/code&gt; file (a single plain-text file at the project root) you write yourself usually contains two or three paragraphs of general instructions. Cursor also supports a &lt;code&gt;.cursor/rules/&lt;/code&gt; directory of individual rule files for more granular control. Both are fine for broad guidance, but neither gives your AI assistant real domain depth out of the box.&lt;/p&gt;
&lt;p&gt;cursor-claude-personas packs in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multiple focused rule files&lt;/strong&gt; &amp;mdash; each covering a specific concern (schema design, security, pagination, query patterns, etc.) rather than one sprawling blob of text.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skill documents&lt;/strong&gt; &amp;mdash; structured reference files that are automatically surfaced when the AI detects it needs them, without you prompting it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Both tool formats simultaneously&lt;/strong&gt; &amp;mdash; the same expertise loads whether you are using Claude Code, Cursor, or VS Code Copilot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero prompt engineering on your part&lt;/strong&gt; &amp;mdash; you copy two folders and you are done.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The key design principle is &lt;strong&gt;depth over breadth&lt;/strong&gt;: one sharp specialist beats five vague generalists.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;real-world-example&quot;&gt;Real-World Example&lt;/h2&gt;
&lt;p&gt;Imagine you are building a Python REST API with PostgreSQL. You copy in the &lt;code&gt;senior-python-developer&lt;/code&gt; persona. From that point on, when you write a query, the AI:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Warns you against &lt;code&gt;WHERE id IN (SELECT ...)&lt;/code&gt; and rewrites it as &lt;code&gt;WHERE id = ANY(ARRAY[...])&lt;/code&gt; with a note about the 10&amp;times; speedup.&lt;/li&gt;
&lt;li&gt;Adds &lt;code&gt;WHERE deleted_at IS NULL&lt;/code&gt; partial indexes automatically when it sees soft-delete columns.&lt;/li&gt;
&lt;li&gt;Flags missing foreign key indexes before you even run &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Enforces proper connection pool limits and prepared statement patterns.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of that required you to type a single instruction. It was all encoded in the rules and skills you copied in.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;how-the-folder-structure-works-under-the-hood&quot;&gt;How the Folder Structure Works Under the Hood&lt;/h2&gt;
&lt;p&gt;Each persona ships with two kinds of config files:&lt;/p&gt;
&lt;h3&gt;Rules (&lt;code&gt;rules/&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;Rules are always-on markdown files the editor reads at the start of every session. They define the persona's defaults, code style, anti-patterns to avoid, and domain-specific best practices. They are named with a &lt;code&gt;rules--&lt;/code&gt; prefix so they sort together and are easy to identify.&lt;/p&gt;
&lt;h3&gt;Skills (&lt;code&gt;skills/&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;Skill documents are structured markdown files with YAML frontmatter. The auto-skill router rule tells the AI to load the relevant skill when it detects you are working on a related task. For example, if you start writing an index migration, the SQL indexing skill is surfaced automatically. If you start wiring up an authentication flow, the auth skill fires.&lt;/p&gt;
&lt;p&gt;This means the AI pulls in deep, specific guidance exactly when it is relevant &amp;mdash; not all at once, cluttering its context.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;switching-personas-mid-project&quot;&gt;Switching Personas Mid-Project&lt;/h2&gt;
&lt;p&gt;You can swap personas at any time. Just delete the existing &lt;code&gt;.claude/&lt;/code&gt; and &lt;code&gt;.cursor/&lt;/code&gt; folders in your project and copy in a different persona. Reopen your session and the new persona is live.&lt;/p&gt;
&lt;p&gt;You can even mix rules from multiple personas manually if you know what you are doing, but most of the time a single focused persona is all you need.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;contributing-a-new-persona&quot;&gt;Contributing a New Persona&lt;/h2&gt;
&lt;p&gt;The project is open source under the MIT license and welcomes contributions. If you want to add a new persona:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fork the repository.&lt;/li&gt;
&lt;li&gt;Create a new folder named after the role (e.g., &lt;code&gt;data-science-researcher&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Add matching &lt;code&gt;.claude/&lt;/code&gt; and &lt;code&gt;.cursor/&lt;/code&gt; subdirectories with rules and skills.&lt;/li&gt;
&lt;li&gt;Make sure the two directories are in sync &amp;mdash; the parity check in &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; validates this.&lt;/li&gt;
&lt;li&gt;Open a pull request.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;See &lt;a rel=&quot;nofollow&quot; href=&quot;CONTRIBUTING.md&quot;&gt;CONTRIBUTING.md&lt;/a&gt; for branch naming conventions, commit message format, and the full persona checklist.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;where-to-get-it&quot;&gt;Where to Get It&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub repository&lt;/strong&gt;: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ratnesh-maurya/cursor-claude-personas&quot;&gt;https://github.com/ratnesh-maurya/cursor-claude-personas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Pages site&lt;/strong&gt; (browse and filter personas): &lt;a rel=&quot;nofollow&quot; href=&quot;https://ratnesh-maurya.github.io/cursor-claude-personas/&quot;&gt;https://ratnesh-maurya.github.io/cursor-claude-personas/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;License&lt;/strong&gt;: MIT &amp;mdash; free for personal and commercial use.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If it saves you time, star the repo. It helps other developers discover it.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What it is&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;38 role-based AI persona packs for Claude Code, Cursor, and VS Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What it does&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shapes your AI coding assistant into a domain specialist &amp;mdash; instantly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;How to install&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clone the repo, copy one persona folder, reopen your editor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Time to set up&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Under 30 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free and open source (MIT)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Requires&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Claude Code, Cursor, or VS Code with Copilot&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Clone it, copy a persona, and ship better code.&lt;/p&gt;
</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/14653/cursor-claude-personas-give-your-ai-coding-assistant-a-domain-expert-brain-in-30-seconds</guid>
<pubDate>Fri, 17 Apr 2026 22:44:50 +0000</pubDate>
</item>
<item>
<title>I’ve been producing bad code (because of AI)</title>
<link>https://coderlegion.com/13922/ive-been-producing-bad-code-because-of-ai</link>
<description>
&lt;p&gt;I&amp;rsquo;ve been producing bad code for the past year. Not because I forgot how to code&amp;mdash;because I&amp;rsquo;ve been trying to delegate everything to AI.&lt;/p&gt;



&lt;p&gt;New research shows experienced developers are &lt;strong&gt;19% slower with AI&lt;/strong&gt;&amp;mdash;but feel 20% faster. That&amp;rsquo;s a 40 percentage point gap between perception and reality.&lt;/p&gt;



&lt;figure class=&quot;wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio&quot;&gt;&lt;div class=&quot;wp-block-embed__wrapper&quot;&gt;
&lt;iframe title=&quot;I've Been Producing Bad Code (Because of AI)&quot; width=&quot;640&quot; height=&quot;360&quot; src=&quot;https://www.youtube.com/embed/oI6kTr5WFRk?feature=oembed&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;&lt;/figure&gt;



&lt;p&gt;In this video, I walk through three major studies that prove what many of us suspect but don&amp;rsquo;t want to admit: AI isn&amp;rsquo;t making us faster. It&amp;rsquo;s making us understand less, trust less, and ship code we can&amp;rsquo;t debug.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;What You&amp;rsquo;ll Learn&lt;/h2&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;The Speed Mirage:&lt;/strong&gt; Why you feel productive but the data says otherwise&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Confidence Boundary:&lt;/strong&gt; What to delegate vs what to keep&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Infrastructure First:&lt;/strong&gt; Specs + ADRs that make AI actually useful&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;This isn&amp;rsquo;t anti-AI. I use it every day. But the lie that it makes everything magically faster? That needs to die.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Confidence over throughput.&lt;/strong&gt; That&amp;rsquo;s the bet I&amp;rsquo;m making.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;p&gt;&lt;em&gt;Research sources and full transcript available in the video description.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; href=&quot;https://sudoish.com/ive-been-producing-bad-code-because-of-ai/&quot;&gt;I&amp;rsquo;ve been producing bad code (because of AI)&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; href=&quot;https://sudoish.com&quot;&gt;sudoish&lt;/a&gt;.&lt;/p&gt;

</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/13922/ive-been-producing-bad-code-because-of-ai</guid>
<pubDate>Fri, 03 Apr 2026 19:37:30 +0000</pubDate>
</item>
<item>
<title>How to use the DHT22 sensor with ESP8266?</title>
<link>https://coderlegion.com/13371/how-to-use-the-dht22-sensor-with-esp8266</link>
<description>
&lt;p&gt;Hello, I'm Ganesh. I'm building &lt;em&gt;git-lrc&lt;/em&gt;, an AI code reviewer that runs on every commit. It is free, unlimited, and source-available on Github. &lt;a href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;Star Us&lt;/a&gt; to help devs discover the project. Do give it a try and share your feedback for improving the product.&lt;/p&gt;

&lt;p&gt;In this article, I will be explaining how to use DHT22 sensor with ESP8266.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup Requirements
&lt;/h2&gt;

&lt;p&gt;Most of use confuse with DHT11 and DHT22.  &lt;/p&gt;

&lt;p&gt;Both are temperature and humidity sensors. But they have different specifications. &lt;/p&gt;

&lt;p&gt;DHT22 is more accurate than DHT11.  &lt;/p&gt;

&lt;p&gt;For visual identification, DT22 comes in white color while DHT11 comes in blue color. &lt;/p&gt;

&lt;p&gt;Once this is correctly identified, and have a datasheet with us. We can proceed with the setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrate Using Pre-built Libraries.
&lt;/h2&gt;

&lt;p&gt;Most of the sensor manufacturers provide libraries for their sensors. Also if they don't provide libraries, we can find libraries for them in the internet.&lt;/p&gt;

&lt;p&gt;Mostly we can use arduino IDE for searching libraries. &lt;/p&gt;

&lt;p&gt;Or &lt;/p&gt;

&lt;p&gt;we can use platformio by just adding the library name in the lib_deps section of platformio.ini file.&lt;/p&gt;

&lt;h2&gt;
  
  
  PlatformIO Setup
&lt;/h2&gt;

&lt;p&gt;Go to PlatformIO extension in VSCode. &lt;/p&gt;

&lt;p&gt;Click on Create New Project.&lt;/p&gt;

&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgttb0fqr6wg260zga5q8.png&quot; class=&quot;article-body-image-wrapper&quot;&gt;&lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgttb0fqr6wg260zga5q8.png&quot; alt=&quot;&quot; width=&quot;800&quot; height=&quot;344&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Give Project Name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the board in my case it was NodeMCU 1.0 (ESP-12E Module).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Framework as Arduino.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6vekey1cq3m9c7aotcxw.png&quot; class=&quot;article-body-image-wrapper&quot;&gt;&lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6vekey1cq3m9c7aotcxw.png&quot; alt=&quot;&quot; width=&quot;800&quot; height=&quot;422&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see platformio.ini file with the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight plaintext&quot;&gt;&lt;code&gt;; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; &lt;a href=&quot;https://docs.platformio.org/page/projectconf.html&quot; rel=&quot;nofollow&quot;&gt;https://docs.platformio.org/page/projectconf.html&lt;/a&gt;
; Common settings for both environments
; Common settings for both environments
[env]
platform = espressif8266
board = nodemcuv2
framework = arduino
monitor_speed = 115200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to Code for DHT22 Sensor with ESP8266?
&lt;/h2&gt;

&lt;p&gt;Now we setup project&lt;/p&gt;

&lt;p&gt;Let's add library for DHT sensor.&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight ini&quot;&gt;&lt;code&gt;&lt;span class=&quot;py&quot;&gt;lib_deps&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; 
    &lt;span class=&quot;s&quot;&gt;adafruit/DHT sensor library@^1.4.4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the main code let's add the following code.&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;#include&lt;/span&gt; &lt;span class=&quot;cpf&quot;&gt;&quot;DHT.h&quot;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;
&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Define the NodeMCU pin connected to the DHT22 data pin&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#define DHTPIN D2     
&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Define the sensor type&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// If yours is DHT11, then change it to DHT11&lt;/span&gt;

&lt;span class=&quot;cp&quot;&gt;#define DHTTYPE DHT22   
&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Initialize the DHT sensor&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;DHT&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;dht&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DHTPIN&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DHTTYPE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// Start the serial communication&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;115200&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;DHT22 Sensor Test with NodeMCU!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Start the sensor&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;dht&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;begin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;loop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// Wait a few seconds between measurements.&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// The DHT22 requires about 2 seconds to stabilize between readings.&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;delay&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Read humidity&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;float&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;h&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dht&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;readHumidity&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// Read temperature as Celsius (the default)&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;float&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dht&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;readTemperature&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// Read temperature as Fahrenheit (isFahrenheit = true)&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;float&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dht&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;readTemperature&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Check if any reads failed and exit early (to try again).&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isnan&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;isnan&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;isnan&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Failed to read from DHT sensor!&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Compute heat index in Fahrenheit (the default)&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;float&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hif&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dht&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;computeHeatIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// Compute heat index in Celsius (isFahreheit = false)&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;float&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hic&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dht&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;computeHeatIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Print the results to the Serial Monitor&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Humidity: &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;%  Temperature: &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&amp;deg;C &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&amp;deg;F  Heat index: &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&amp;deg;C &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hif&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;Serial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&amp;deg;F&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In here we are setting up the DHT22 sensor with ESP8266.&lt;/p&gt;

&lt;p&gt;Initialize DHT sensor.&lt;/p&gt;

&lt;p&gt;Start DHT sensor.&lt;/p&gt;

&lt;p&gt;Read humidity.&lt;/p&gt;

&lt;p&gt;Read temperature.&lt;/p&gt;

&lt;p&gt;Read heat index.&lt;/p&gt;

&lt;p&gt;Print the results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compile and Connection of DHT22 with ESP8266
&lt;/h2&gt;

&lt;p&gt;Now we can see tick mark in the bottom of the VSCode.&lt;/p&gt;

&lt;p&gt;On clicking it we can verify the code is compiling.&lt;/p&gt;

&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnjpw19nkgywkh6jsnwn.png&quot; class=&quot;article-body-image-wrapper&quot;&gt;&lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnjpw19nkgywkh6jsnwn.png&quot; alt=&quot;&quot; width=&quot;446&quot; height=&quot;204&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Output 1:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;Checking size .pio/build/sensor_node_1/firmware.elf
Advanced Memory Usage is available via &lt;span class=&quot;s2&quot;&gt;&quot;PlatformIO Home &amp;gt; Project Inspect&quot;&lt;/span&gt;
RAM:   &lt;span class=&quot;o&quot;&gt;[===&lt;/span&gt;       &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;  34.5% &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;used 28236 bytes from 81920 bytes&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
Flash: &lt;span class=&quot;o&quot;&gt;[===&lt;/span&gt;       &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;  26.3% &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;used 274819 bytes from 1044464 bytes&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;=======================================================================&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;SUCCESS] Took 0.56 seconds &lt;span class=&quot;o&quot;&gt;=======================================================================&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After compilation we can upload the code to the ESP8266 by clicking the upload button.&lt;/p&gt;

&lt;p&gt;Now we can connect the vin pin of DHT22 to 3V3 pin of ESP8266 and gnd pin of DHT22 to gnd pin of ESP8266.&lt;br&gt;
Data pin of DHT22 to D2 pin of ESP8266.&lt;/p&gt;
&lt;h2&gt;
  
  
  Uploading the code to ESP8266
&lt;/h2&gt;

&lt;p&gt;Connect ESP8266 to the computer and click on arrow button.&lt;/p&gt;

&lt;p&gt;Output 2:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;Writing at 0x0002c000... &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;92 %&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
Writing at 0x00030000... &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;100 %&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
Wrote 278976 bytes &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;204732 compressed&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; at 0x00000000 &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;18.0 seconds &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;effective 123.7 kbit/s&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally we can see the output in the serial monitor on clicking socket button.&lt;/p&gt;

&lt;p&gt;Output 3:&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;DHT22 Sensor Test with NodeMCU!
Humidity: 51.80%  Temperature: 31.30&amp;deg;C 88.34&amp;deg;F  Heat index: 33.51&amp;deg;C 92.31&amp;deg;F
Humidity: 51.80%  Temperature: 31.30&amp;deg;C 88.34&amp;deg;F  Heat index: 33.51&amp;deg;C 92.31&amp;deg;F
Humidity: 51.80%  Temperature: 31.30&amp;deg;C 88.34&amp;deg;F  Heat index: 33.51&amp;deg;C 92.31&amp;deg;F
Humidity: 51.70%  Temperature: 31.30&amp;deg;C 88.34&amp;deg;F  Heat index: 33.49&amp;deg;C 92.27&amp;deg;F
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Now we could able to setup and test DHT22 sensor with ESP8266.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;&lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabn6nl3iehrohehnxgje.png&quot; alt=&quot;git-lrc&quot; width=&quot;800&quot; height=&quot;373&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Any feedback or contributors are welcome! It&amp;rsquo;s online, source-available, and ready for anyone to use. &lt;br&gt;
&amp;#11088; Star it on GitHub: &lt;a href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;https://github.com/HexmosTech/git-lrc&lt;/a&gt;&lt;/p&gt;


</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/13371/how-to-use-the-dht22-sensor-with-esp8266</guid>
<pubDate>Fri, 03 Apr 2026 10:24:39 +0000</pubDate>
</item>
<item>
<title>Introduction to Go generics?</title>
<link>https://coderlegion.com/13377/introduction-to-go-generics</link>
<description>
&lt;p&gt;&lt;em&gt;Hello, I'm Ganesh Kumar. I'm working on &lt;a href=&quot;https://hexmos.com/livereview/git-lrc/&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;git-lrc&lt;/a&gt;: a Git hook for Checking AI generated code.AI agents write code fast. They also silently remove logic, change behavior, and introduce bugs -- without telling you. You often find out in production.git-lrc fixes this. It hooks into git commit and reviews every diff before it lands. 60-second setup. Completely free.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In my previous post, I explained how to work with an interface.&lt;/p&gt;

&lt;p&gt;Now let's understand go generics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is Go Generics needed?
&lt;/h2&gt;

&lt;p&gt;Before I start explaining go generics, let me give an example of a simple code without using go generics.&lt;/p&gt;

&lt;p&gt;Let's have a simple function for finding the index of the element.&lt;br&gt;
We can see that both internal workings are the same, but the parameters and return variable types are different&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight go&quot;&gt;&lt;code&gt;


&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;



&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IndexInt&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;range&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

 &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; 
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IndexString&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;range&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

 &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; 
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(){&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;integer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;35&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;45&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IndexInt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;integer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;35&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; 

    &lt;span class=&quot;n&quot;&gt;strings&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;hello&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;world&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;IndexString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;example&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; 
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;As we can see, both are working in the same way.&lt;br&gt;
Output:&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;gk@jarvis:~/exp/code/rd/go-exmaple&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;go run main.go 
3
&lt;span class=&quot;nt&quot;&gt;-1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;So, why can't we have a single function that does the same task with passing different types? This is how go generics play a major role in this.&lt;/p&gt;
&lt;h2&gt;
  
  
  What is Go Generics?
&lt;/h2&gt;

&lt;p&gt;It is a feature that allows developers to write reusable, type-safe code that works with multiple types.&lt;/p&gt;

&lt;p&gt;That means we can use Go generics to solve our problem.&lt;/p&gt;

&lt;p&gt;In the example below, we will solve the above problem. &lt;/p&gt;
&lt;h2&gt;
  
  
  Using Go Generics
&lt;/h2&gt;

&lt;p&gt;There are many constraints to using go generics.&lt;/p&gt;

&lt;p&gt;For our case let's just use a &lt;code&gt;comparable&lt;/code&gt; constraint.&lt;/p&gt;

&lt;p&gt;let't create function &lt;code&gt;Index&lt;/code&gt; with &lt;code&gt;[T comparable]&lt;/code&gt; with using T as type.&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight go&quot;&gt;&lt;code&gt;
&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;



&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;comparable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;range&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

 &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; 
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(){&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;integer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;35&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;45&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;integer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;35&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; 

    &lt;span class=&quot;n&quot;&gt;strings&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;hello&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;world&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;example&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; 
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;As we expected, we got the same results with one function.&lt;/p&gt;

&lt;p&gt;Output&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;gk@jarvis:~/exp/code/rd/go-exmaple&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;go run main.go 
3
&lt;span class=&quot;nt&quot;&gt;-1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Go Generics was introduced recently we might be using it in a few cases where it is necessary.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://hexmos.com/livereview/git-lrc/&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;&lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifqf83t1qjl4u0g6aj4l.png&quot; alt=&quot;git-lrc&quot; width=&quot;800&quot; height=&quot;381&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; Check out: &lt;a href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;git-lrc&lt;/a&gt;&lt;br&gt;
Any feedback or contributors are welcome! It&amp;rsquo;s online, open-source, and ready for anyone to use.&lt;br&gt;
&amp;#11088; Star it on GitHub:&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;ltag-github-readme-tag&quot;&gt;
  &lt;div class=&quot;readme-overview&quot;&gt;
    &lt;h2&gt;
      &lt;img src=&quot;https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg&quot; alt=&quot;GitHub logo&quot;&gt;
      &lt;a href=&quot;https://github.com/HexmosTech&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;
        HexmosTech
      &lt;/a&gt; / &lt;a href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;
        git-lrc
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Free, Unlimited AI Code Reviews That Run on Commit
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class=&quot;ltag-github-body&quot;&gt;
    
&lt;div id=&quot;readme&quot; class=&quot;md&quot;&gt;
&lt;div&gt;
&lt;a rel=&quot;noopener noreferrer nofollow&quot; href=&quot;https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667&quot;&gt;&lt;img width=&quot;60&quot; alt=&quot;git-lrc logo&quot; src=&quot;https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667&quot;&gt;&lt;/a&gt;
&lt;p&gt;&lt;strong&gt;git-lrc&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Free, Unlimited AI Code Reviews That Run on Commit&lt;/strong&gt;&lt;/p&gt;
&lt;br&gt;
&lt;/div&gt;



&lt;div&gt;
&lt;a href=&quot;https://www.producthunt.com/products/git-lrc?embed=true&amp;amp;utm_source=badge-top-post-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-git-lrc&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;img alt=&quot;git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt&quot; width=&quot;250&quot; height=&quot;54&quot; src=&quot;https://camo.githubusercontent.com/87bf2d4283c1e0aa99e254bd17fefb1c67c0c0d39300043a243a4aa633b6cecc/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f746f702d706f73742d62616467652e7376673f706f73745f69643d31303739323632267468656d653d6c6967687426706572696f643d6461696c7926743d31373731373439313730383638&quot;&gt;&lt;/a&gt;
&lt;/div&gt;




&lt;p&gt;AI agents write code fast. They also &lt;em&gt;silently remove logic&lt;/em&gt;, change behavior, and introduce bugs -- without telling you. You often find out in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;git-lrc&lt;/code&gt; fixes this.&lt;/strong&gt; It hooks into &lt;code&gt;git commit&lt;/code&gt; and reviews every diff &lt;em&gt;before&lt;/em&gt; it lands. 60-second setup. Completely free.&lt;/p&gt;

&lt;div class=&quot;markdown-heading&quot;&gt;
&lt;h2 class=&quot;heading-element&quot;&gt;See It In Action&lt;/h2&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;See git-lrc catch serious security issues such as leaked credentials, expensive cloud
operations, and sensitive material in log statements&lt;/p&gt;
&lt;/blockquote&gt;


  
    

    &lt;span class=&quot;m-1&quot;&gt;git-lrc-intro-60s.mp4&lt;/span&gt;
  

  

  


&lt;div class=&quot;markdown-heading&quot;&gt;
&lt;h2 class=&quot;heading-element&quot;&gt;Why&lt;/h2&gt;

&lt;/div&gt;


&lt;ul&gt;

&lt;li&gt; &lt;strong&gt;AI agents silently break things.&lt;/strong&gt; Code removed. Logic changed. Edge cases gone. You won't notice until production.&lt;/li&gt;

&lt;li&gt; &lt;strong&gt;Catch it before it ships.&lt;/strong&gt; AI-powered inline comments show you &lt;em&gt;exactly&lt;/em&gt; what changed and what looks wrong.&lt;/li&gt;

&lt;li&gt; &lt;strong&gt;Build a habit, ship better code.&lt;/strong&gt; Regular review &amp;rarr; fewer bugs &amp;rarr; more robust code &amp;rarr; better results in your team.&lt;/li&gt;

&lt;li&gt; &lt;strong&gt;Why git?&lt;/strong&gt; Git is universal. Every editor, every IDE, every AI&amp;hellip;&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class=&quot;gh-btn-container&quot;&gt;&lt;a class=&quot;gh-btn&quot; href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;



</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/13377/introduction-to-go-generics</guid>
<pubDate>Mon, 30 Mar 2026 21:36:35 +0000</pubDate>
</item>
<item>
<title>Your Code Works. Your Architecture Doesn’t.</title>
<link>https://coderlegion.com/13575/your-code-works-your-architecture-doesnt</link>
<description>
&lt;p&gt;&lt;em&gt;Why working code without architecture predictably collapses &amp;mdash; and what to do about it.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/lA9sk_y_sSE&quot; title=&quot;Your Code Works. Your Architecture Doesn't.&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Prefer watching? The full video covers everything in this post &amp;mdash; with visuals and code walkthroughs.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;The Code That Almost Took Down Black Friday&lt;/h2&gt;
&lt;p&gt;This code passed code review. Three senior developers approved it. It's been in production, serving real customers.&lt;/p&gt;
&lt;p&gt;And it almost took down Black Friday.&lt;/p&gt;
&lt;p&gt;Not because of a bug. Not because of performance. The code &lt;strong&gt;works&lt;/strong&gt;. The architecture doesn't.&lt;/p&gt;
&lt;p&gt;I've seen this exact story play out at every company I've worked at over the past decade. Different languages, different teams, same pattern. It's predictable. And it's preventable.&lt;/p&gt;
&lt;h2&gt;The Handler&lt;/h2&gt;
&lt;p&gt;Here's the code. Tell me if this looks familiar.&lt;/p&gt;
&lt;p&gt;One handler function. About a hundred and seventy lines. And it does everything.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Top third&lt;/strong&gt; &amp;mdash; database queries to get product prices, discount calculations, tax logic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Middle&lt;/strong&gt; &amp;mdash; Stripe payment processing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bottom&lt;/strong&gt; &amp;mdash; saving to the database, sending confirmation emails.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Business logic, infrastructure, third-party APIs &amp;mdash; all in one function. Mixed together.&lt;/p&gt;
&lt;p&gt;And if you're being fair? This code is fine. It works. It's readable. It handles errors properly. Three senior developers approved this PR. I would too.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And that's the trap.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Because it's not about whether this code works today. It's about what happens when you try to extend it.&lt;/p&gt;
&lt;h2&gt;The Timeline: From Ship It to Rewrite&lt;/h2&gt;
&lt;p&gt;Let me walk you through what actually happens. Week by week. This isn't theoretical &amp;mdash; I've lived through this pattern multiple times.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Week one.&lt;/strong&gt; Feature ships. Everyone's happy. PR approved, tests pass, production is stable. The team feels fast. And they ARE fast. This is real.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Week three.&lt;/strong&gt; New requirement: show product prices in the cart endpoint. Developer needs product prices. Opens the order handler. Sees the query. Copy-pastes it into the new handler. Fastest way to meet the deadline. Small duplication. Seems fine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Week five.&lt;/strong&gt; Someone notices the duplication. Creates a helper function. Good instinct. But the order handler still has the inline version. The cart handler still has the copy-pasted version. Only new code uses the helper. Now you have &lt;strong&gt;three&lt;/strong&gt; ways to get a product price in the same codebase.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Week seven.&lt;/strong&gt; Three developers, three different approaches. One returns just the price. Another returns an object. A third returns a dictionary. No agreed pattern. Everyone solving the same problem their own way.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Week ten.&lt;/strong&gt; Circular dependencies start forming. Orders depend on products. Products depend on discounts. Discounts depend on orders for loyalty calculations. Everything depends on everything. Can't test anything in isolation. Can't change one thing without breaking another.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Month six.&lt;/strong&gt; The test suite takes forty-five minutes. Nobody runs it anymore. Production bugs are weekly. Simple changes take days because everyone's scared of breaking something.&lt;/p&gt;
&lt;p&gt;And the developer who wrote that first handler? The one who shipped on time, passed code review, got the thumbs up? They're looking at the same code thinking &amp;mdash; &lt;em&gt;how did we get here? I did everything right.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;And here's the sentence I've heard at every single one of these companies:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;We're talking about a rewrite.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Six months. Working code. Senior developers. Good intentions. And you're talking about throwing it all away.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Every codebase has an architecture. If you didn't choose one, you got one anyway &amp;mdash; by accident.&lt;/strong&gt; That handler? That IS an architecture. It's just not one anyone decided on. It's the one that happened when nobody made a choice.&lt;/p&gt;
&lt;p&gt;And accidental architecture always ends the same way.&lt;/p&gt;
&lt;h2&gt;The AI Amplifier&lt;/h2&gt;
&lt;p&gt;Now here's where it gets worse.&lt;/p&gt;
&lt;p&gt;Everything I just described? That timeline assumed humans writing code at human speed. Add AI to a codebase with no architecture and you don't just get the same problems. You get them &lt;strong&gt;ten times faster&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Think about it. You prompt your AI: &quot;add a loyalty points discount feature.&quot; The AI looks at your codebase. It sees four different patterns for handling discounts. It picks one. Maybe creates a fifth. It generates code following that pattern &amp;mdash; whatever pattern it found first.&lt;/p&gt;
&lt;p&gt;Now you have five patterns. The AI didn't fix anything. It photocopied the mess at ten times the speed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI doesn't fix architecture. It amplifies whatever exists.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Good architecture? AI follows clean patterns. You get consistency at ten times the speed. No architecture? AI copies chaos. You get spaghetti at ten times the speed.&lt;/p&gt;
&lt;p&gt;If you're planning to use AI &amp;mdash; and you should be &amp;mdash; you need &lt;strong&gt;better&lt;/strong&gt; architecture, not less.&lt;/p&gt;
&lt;h2&gt;What To Actually Do&lt;/h2&gt;
&lt;p&gt;So what do you actually do about it?&lt;/p&gt;
&lt;p&gt;Let me take that same handler and show you one decision that changes everything. You don't need to rewrite this. You need to pull it apart.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step one: Take the business logic out.&lt;/strong&gt; Discount rules, tax calculations, order totals &amp;mdash; that's your business. It doesn't need to know about HTTP. It doesn't need to know about Stripe. It's just math.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step two: Take the infrastructure out.&lt;/strong&gt; Stripe, the database, email &amp;mdash; those are tools. They serve the business logic. They shouldn't live with it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step three: What's left is the glue.&lt;/strong&gt; Your handler just receives a request and passes it along. That's all it should ever do.&lt;/p&gt;
&lt;p&gt;Now look at what you've got:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;domain/
  models.py             &amp;mdash; business rules
services/
  order_service.py      &amp;mdash; orchestration
adapters/
  stripe_payment.py     &amp;mdash; payment infra
  db_repositories.py    &amp;mdash; data access
routes/
  orders.py             &amp;mdash; HTTP, thin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That's hexagonal architecture.&lt;/p&gt;
&lt;p&gt;You didn't plan it on a whiteboard for six months. You just asked one question about the code you already had: &lt;strong&gt;what belongs together, and what doesn't?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I'm not telling you to architect everything before writing your first line of code. That first handler? Ship it. Get it working. Pass code review. But somewhere between that first handler and the moment your codebase starts growing &amp;mdash; &lt;strong&gt;before&lt;/strong&gt; the copy-paste starts, &lt;strong&gt;before&lt;/strong&gt; three developers create three patterns &amp;mdash; make the decision.&lt;/p&gt;
&lt;p&gt;Because the window where this is easy? It closes fast. Week one, it's a two-hour refactor. Month six, it's a rewrite. The only difference is when you chose to think about structure.&lt;/p&gt;
&lt;p&gt;And once you have it &amp;mdash; look at what changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Debugging a discount bug?&lt;/strong&gt; One file. Twenty-five lines. Pure math.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New developer joins?&lt;/strong&gt; They know where code goes on day one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tests?&lt;/strong&gt; Under a millisecond. You actually run them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI generates code?&lt;/strong&gt; It sees clean separation. It follows the pattern instead of copying chaos.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Three Things To Do This Week&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;One.&lt;/strong&gt; Ask your team: &quot;Where does new code go?&quot; If nobody has a clear answer &amp;mdash; that's your window. It's still open.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Two.&lt;/strong&gt; Pick one piece of business logic buried in a handler. Extract it into a pure function. No dependencies. Just inputs and outputs. Write a test. Feel how fast it runs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Three.&lt;/strong&gt; Next time someone opens a PR with copy-pasted logic &amp;mdash; don't just approve it. That's the moment the spaghetti starts. Be the person who says &quot;let's extract this.&quot;&lt;/p&gt;
&lt;p&gt;None of these take more than thirty minutes. All of them compound.&lt;/p&gt;
&lt;h2&gt;The Honest Trade&lt;/h2&gt;
&lt;p&gt;I'm not going to pretend there's no cost. Your first feature with architecture takes a bit longer. You're thinking about structure, defining boundaries.&lt;/p&gt;
&lt;p&gt;But here's the thing that doesn't show up in sprint metrics but everyone feels: &lt;strong&gt;developer confidence.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When your code has clear boundaries, you're not scared to change things. You run your tests, they pass in seconds, you deploy. No sweating. No &quot;let me check if this breaks the payment flow.&quot;&lt;/p&gt;
&lt;p&gt;That feeling? That's what architecture gives you. Not just speed. Confidence. The confidence that the next Black Friday won't be yours.&lt;/p&gt;
&lt;h2&gt;Quick Gut Check&lt;/h2&gt;
&lt;p&gt;How many of these sound like your codebase right now?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;We're talking about a rewrite.&quot;&lt;/li&gt;
&lt;li&gt;&quot;I don't know which version of this function is the right one.&quot;&lt;/li&gt;
&lt;li&gt;&quot;The new developer asked where to put their code and nobody had an answer.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If any of those hit &amp;mdash; you don't have technical debt. You have an architecture problem.&lt;/p&gt;
&lt;p&gt;Hexagonal architecture is what I showed you today. It's what worked for me across many different projects and languages. But it's not the only answer. There's microkernel, event-driven, and dozens of other proven patterns. Go take a software architecture course on LinkedIn Learning or Coursera &amp;mdash; people have spent decades figuring this stuff out. You don't have to invent the wheel. You just have to actually &lt;strong&gt;use&lt;/strong&gt; one.&lt;/p&gt;
&lt;p&gt;Because the difference between a codebase that scales and one that collapses? It's not talent. It's not the language. It's not even the framework. It's whether someone sat down and made a plan.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;There's also a &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/sudoish/order-system-bad-example&quot;&gt;GitHub repo&lt;/a&gt; with the code so you can see this pattern for real. If you want to see the practical side &amp;mdash; how to actually refactor this into clean architecture, step by step &amp;mdash; that's the next video. &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.youtube.com/@sudoish&quot;&gt;Subscribe&lt;/a&gt; so you don't miss it.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; href=&quot;https://sudoish.com/your-code-works-your-architecture-doesnt/&quot;&gt;Your Code Works. Your Architecture Doesn&amp;rsquo;t.&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; href=&quot;https://sudoish.com&quot;&gt;sudoish&lt;/a&gt;.&lt;/p&gt;

</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/13575/your-code-works-your-architecture-doesnt</guid>
<pubDate>Sat, 28 Mar 2026 02:50:21 +0000</pubDate>
</item>
<item>
<title>The Repo Is Right There. Why Are You Checking Their CV?</title>
<link>https://coderlegion.com/13563/the-repo-is-right-there-why-are-you-checking-their-cv</link>
<description>&lt;h3 id=&quot;choose-a-b-or-c&quot;&gt;&lt;strong&gt;Choose A, B or C&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/896/1*Fe7LIt2IxZ_CSluOka9D8g.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Someone posts this on LinkedIn:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“I implemented a numerical algorithm to validate string theory vacuum consistency. Built with NumPy, not PyTorch. Repo below.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;What do you do first?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A)&lt;/strong&gt; Open their profile. University, publications, credentials.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;B)&lt;/strong&gt; Click the repo. Read the README. Try to run it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C)&lt;/strong&gt; Scroll past.&lt;/p&gt;
&lt;p&gt;C means you’re not in this field. Fine.&lt;/p&gt;
&lt;p&gt;But if you work in AI, you chose A or B. That instinct reveals more about where this industry is cracking than any benchmark announcement in 2026.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;your-answer-depends-on-your-destination&quot;&gt;Your answer depends on your destination&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/896/1*hJJ7BE5cZBIxpgv1ZunIjg.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;If you chose A, you are probably operating inside a world where that instinct makes sense. That’s not a criticism — it’s the logic of the job.&lt;/p&gt;
&lt;p&gt;A researcher’s destination is reputation. Citations, SOTA results, conference invitations. Checking credentials is rational in that world. A paper from an unknown author with no affiliation is genuinely harder to evaluate. The system makes sense, inside that world.&lt;/p&gt;
&lt;p&gt;An engineer’s destination is something that runs. Ships. Doesn’t break at 2am. The only signal that matters is the working artifact. That system makes sense, inside a different world.&lt;/p&gt;
&lt;p&gt;Neither instinct is wrong. The problem is that both worlds now use the same words for different things.&lt;/p&gt;
&lt;p&gt;I’ve built enough systems that looked correct in testing and failed in production to know the difference. A result that doesn’t survive real conditions isn’t a result. It’s a failure with good cosmetics. That understanding changes how you read a repo. It changes which questions you even think to ask.&lt;/p&gt;
&lt;p&gt;A researcher reading the same repo is asking: is this idea novel? Does this advance the field? Real questions. Just not the ones I need at 2am.&lt;/p&gt;
&lt;p&gt;This looks like a communication problem on the surface. It isn’t. It is an incentive problem with a vocabulary leak. Before 2025, the gap was mostly about speed — how long research took to reach production. What changed is the nature of the gap itself. It became semantic. The same words now describe different realities depending on who’s using them.&lt;/p&gt;
&lt;p&gt;That leak has a cost. And it accumulates.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-field-is-drowning-in-unconsumed-insight&quot;&gt;The field is drowning in unconsumed insight&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/896/1*AVmqhD7GMDQkjV02lWKg9Q.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;The AI field is not short on intelligence. It is drowning in unconsumed insight.&lt;/p&gt;
&lt;p&gt;Ideas that are real, verified, published, cited. Ideas that never survive the journey from the lab to somewhere something actually needs to run.&lt;/p&gt;
&lt;p&gt;Most people assume the bottleneck is the model. It isn’t.&lt;/p&gt;
&lt;p&gt;ML code is roughly 5% of a production system.&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.notion.so/The-Repo-Is-Right-There-Why-Are-You-Checking-Their-CV-3266f403d16e8068876cff475254b9d4?pvs=21&quot;&gt;1&lt;/a&gt; The other 95% is data pipelines, monitoring, error handling, cost controls. That’s where technical debt compounds. That’s also where researchers rarely look, because it doesn’t generate publishable results.&lt;/p&gt;
&lt;p&gt;A paper reports near-perfect efficiency on a benchmark dataset. Clean data, controlled compute, no legacy systems, no users doing unexpected things. When that paper meets a real system, the promised behavior sometimes doesn’t degrade. It simply doesn’t appear.&lt;/p&gt;
&lt;p&gt;Think of every research paper as a Michelin-starred recipe. Precise, rigorous, tested — in the chef’s kitchen. When someone else tries to cook the same dish, the recipe isn’t wrong. It was just never written for their kitchen, their ingredients, their equipment. Most AI papers are the same. The research works. The conditions don’t transfer.&lt;/p&gt;
&lt;p&gt;The recipe problem doesn’t stay in the lab. It follows the system into production — and there, the stakes change.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;&lt;h4 id=&quot;relatived-post-&quot;&gt;Relatived Post:&lt;/h4&gt;
&lt;p&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://(https://flamehaven.space/writing/when-the-michelin-recipe-fails-in-your-kitchen/)&quot;&gt;&lt;strong&gt;\[When the Michelin Recipe Fails in Your Kitchen\]&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;capability-and-reliability-do-not-scale-on-the-same-curve&quot;&gt;Capability and reliability do not scale on the same curve&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/896/1*dD-D9SiWJNRW5hkh820vGw.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Autonomous task duration in AI systems grew from 4 minutes in early 2024 to 14.5 hours by February 2026. Real progress. But chain 20 steps together in production, and end-to-end success rates fall to around 36%, even at 95% per-step reliability. Error multiplies. 91% of ML models degrade after deployment. Fewer than 10% of enterprises have anything resembling agent governance.&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.notion.so/The-Repo-Is-Right-There-Why-Are-You-Checking-Their-CV-3266f403d16e8068876cff475254b9d4?pvs=21&quot;&gt;2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Capability and reliability do not scale on the same curve.&lt;/p&gt;
&lt;p&gt;There’s also a perception problem that makes this harder to see. The METR study from 2025 tracked experienced software developers completing realistic engineering tasks — debugging, feature implementation, code review — using Cursor Pro with Claude 3.5/3.7 Sonnet. Objective measurement: 19% slower. Self-reported: 20% faster. A 39-point gap.&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.notion.so/The-Repo-Is-Right-There-Why-Are-You-Checking-Their-CV-3266f403d16e8068876cff475254b9d4?pvs=21&quot;&gt;3&lt;/a&gt; Not a technology failure. What happens when your destination (feeling productive) diverges from the destination that matters (the system works, the product ships).&lt;/p&gt;
&lt;p&gt;Researchers and engineers are measuring the same industry with instruments calibrated for different purposes. Both instruments work correctly. They just don’t measure the same thing.&lt;/p&gt;
&lt;p&gt;So who closes the gap? It starts with the vocabulary.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;when-the-same-word-means-opposite-things&quot;&gt;When the same word means opposite things&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/896/1*9M7o7d8FQL6gV0rExe0W2w.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;In October 2025, Andrej Karpathy appeared on the Dwarkesh Patel podcast and defined what he meant by “agent.” An employee. An intern you could actually delegate to. A system with enough intelligence, memory, and reliability to do the work.&lt;/p&gt;
&lt;p&gt;His listeners immediately noticed the problem. Blogger Simon Willison wrote: &lt;em&gt;“&lt;a rel=&quot;nofollow&quot; href=&quot;https://simonwillison.net/2025/Oct/18/agi-is-still-a-decade-away/&quot;&gt;It turns out Andrej is using a different definition of agents to the one that I prefer.&lt;/a&gt;”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nobody was wrong. They were just using the same word from different worlds.&lt;/p&gt;
&lt;p&gt;To a researcher, an agent is an autonomous goal-directed entity with planning capabilities and long-horizon reasoning. That definition comes from decades of AI literature and it’s precise within that tradition.&lt;/p&gt;
&lt;p&gt;To an engineer in 2026, an agent is something different. It’s a system with tool-calling, retry logic, and an observability layer that you’ve tuned until it stops crashing in ways that cost money. A 70% end-to-end success rate is cause for genuine celebration. Shipping at 36% is sometimes acceptable if the fallback is graceful enough.&lt;/p&gt;
&lt;p&gt;These aren’t different opinions about the same thing. They’re different objects that inherited the same name.&lt;/p&gt;
&lt;p&gt;The same drift happened to “scaling,” “alignment,” and “AGI.” Each word started in one world and got adopted by the other without the definition transferring. When a researcher and an engineer read the same post about agents and each thinks the other doesn’t understand, they’re often both right. They’re evaluating different claims.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“Agents in papers vs agents in prod — night and day.”&lt;/em&gt; That line circulated on r/AI_Agents in late 2025. It kept being cited not because it was clever. Because it named something people had been experiencing without language for it.&lt;/p&gt;
&lt;p&gt;So who builds the translation layer?&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-bridge-gets-built-by-individuals&quot;&gt;The bridge gets built by individuals&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/896/1*kxYUf7ow4K9afYc7C2IWRQ.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;The obvious answer is institutions. Academic-industry partnerships, joint research labs, government-funded translation programs.&lt;/p&gt;
&lt;p&gt;In practice, it rarely works cleanly. Authorship disputes, IP complications, publication timelines running perpendicular to shipping timelines. The institutions themselves are optimized for the wrong destination to close this gap.&lt;/p&gt;
&lt;p&gt;What actually closes the gap looks nothing like an institution. It looks like one person who needed the thing to run, and had enough theoretical grounding to make it run right.&lt;/p&gt;
&lt;p&gt;Ollama is one example. A small team was frustrated that running models locally required too much configuration. Now it’s &lt;code&gt;ollama run llama3&lt;/code&gt;. One command. 100,000+ GitHub stars. Not a university project. Just people who wanted it to work on their own machines.&lt;/p&gt;
&lt;p&gt;The honest counter: Ollama eventually attracted investment. So did Hugging Face, vLLM, and most of the other tools that closed the research-production gap. Institutions end up involved.&lt;/p&gt;
&lt;p&gt;The claim is about sequence. In each case, someone decided the paper wasn’t enough and built the bridge before any institution sanctioned it. The initial translation from “this works in a paper” to “this works in your terminal” came from individuals whose primary motivation was running the thing. Funding arrived after the bridge existed, not before.&lt;/p&gt;
&lt;p&gt;Big tech noticed. And drew exactly the wrong conclusion.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-the-talent-wars-actually-show&quot;&gt;What the talent wars actually show&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/896/1*G7ANKATrKFHWVzFuQJ9h0Q.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;If individuals close the gap, the logic goes, buy the individuals. Pay enough, and the outcome follows.&lt;/p&gt;
&lt;p&gt;Meta reportedly paid around $200M to bring Ruoming Pang from Apple in July 2025. He moved to OpenAI seven months later. The reporting around why is incomplete. But even if the details are contested, the pattern is familiar to anyone who has watched this play out inside organizations.&lt;/p&gt;
&lt;p&gt;Money can relocate a person. It can’t relocate their definition of done.&lt;/p&gt;
&lt;p&gt;OpenAI re-hired Pang. Both companies keep acquiring research prestige and attempting to convert it to production output. The conversion step is where the collision lives, every time.&lt;/p&gt;
&lt;p&gt;The ARR numbers — OpenAI at roughly $25B, Anthropic at roughly $19B — tell a limited story. OpenAI has the user base and capital. What’s factually observable is that Anthropic’s strongest growth is in enterprise and coding.&lt;/p&gt;
&lt;p&gt;Those buyers write reliability requirements into procurement documents. Whether that reflects the research-production gap being priced by the market, or simply different go-to-market choices, the data doesn’t settle it.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;this-is-the-actual-frontier&quot;&gt;This is the actual frontier&lt;/h3&gt;
&lt;p&gt;Research produces ideas in one language. Production tries to implement them in another. The translation layer between them still doesn’t exist. That gap is where most AI projects actually fail — not in the model, not in the benchmark, but in the distance between the two.&lt;/p&gt;
&lt;p&gt;The next meaningful advances won’t come from bigger benchmarks. They’ll come from whoever closes the distance between “works in the paper” and “works in the hospital, the factory, the government office, the small team with one overworked engineer.”&lt;/p&gt;
&lt;p&gt;Nobody is writing LinkedIn posts about that work. It doesn’t look like progress from the outside. It just looks like something finally running.&lt;/p&gt;
&lt;p&gt;The insight exists. The kitchen keeps failing it.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-two-clicks-that-reveal-everything&quot;&gt;&lt;strong&gt;The two clicks that reveal everything&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;So back to that LinkedIn post. The string theory algorithm. NumPy. Repo below.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A)&lt;/strong&gt; You opened their profile.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;B)&lt;/strong&gt; You clicked the repo.&lt;/p&gt;
&lt;p&gt;Has your answer changed?&lt;/p&gt;
&lt;p&gt;If it has, even slightly — that’s not small. The gap between those two instincts is the gap this field most needs to close.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;references&quot;&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Sculley, D. et al. “&lt;a rel=&quot;nofollow&quot; href=&quot;https://papers.nips.cc/paper_files/paper/2015/hash/86df7dcfd896fcaf2674f757a2463eba-Abstract.html&quot;&gt;Hidden Technical Debt in Machine Learning Systems.&lt;/a&gt;” &lt;em&gt;NIPS 2015.&lt;/em&gt; The 5% figure (ML code as fraction of total production system) originates here and has been widely cited since.&lt;/li&gt;
&lt;li&gt;Radoff, Jon. “&lt;a rel=&quot;nofollow&quot; href=&quot;https://meditations.metavert.io/p/the-state-of-ai-agents-in-2026&quot;&gt;The State of AI Agents in 2026.&lt;/a&gt;” &lt;em&gt;Metavert Meditations&lt;/em&gt; (Substack), February 24, 2026.&lt;/li&gt;
&lt;li&gt;Becker, Joel et al. “&lt;a rel=&quot;nofollow&quot; href=&quot;https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/&quot;&gt;Measuring the Impact of Early-2025 AI on Experienced Open-Source Developer Productivity.&lt;/a&gt;” METR, July 2025. — arXiv: 2507.09089 &lt;/li&gt;
&lt;li&gt;Willison, Simon. “&lt;a rel=&quot;nofollow&quot; href=&quot;https://simonwillison.net/2025/Oct/&quot;&gt;Notes from the Dwarkesh Patel / Andrej Karpathy podcast.&lt;/a&gt;” &lt;em&gt;simonwillison.net&lt;/em&gt;, October 2025.&lt;/li&gt;
&lt;/ol&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/13563/the-repo-is-right-there-why-are-you-checking-their-cv</guid>
<pubDate>Fri, 27 Mar 2026 15:05:49 +0000</pubDate>
</item>
<item>
<title>Understanding Methods in Go</title>
<link>https://coderlegion.com/13379/understanding-methods-in-go</link>
<description>
&lt;p&gt;&lt;em&gt;Hello, I'm Ganesh Kumar. I'm working on &lt;a href=&quot;https://hexmos.com/livereview/git-lrc/&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;git-lrc&lt;/a&gt;: a Git hook for Checking AI generated code.AI agents write code fast. They also silently remove logic, change behavior, and introduce bugs -- without telling you. You often find out in production.git-lrc fixes this. It hooks into git commit and reviews every diff before it lands. 60-second setup. Completely free.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In my previous post, I explained how closure works.&lt;/p&gt;

&lt;p&gt;In this article we will understand how to method works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method
&lt;/h2&gt;

&lt;p&gt;Method is a function with a receiver. &lt;/p&gt;

&lt;p&gt;This works like a class method in other languages.&lt;/p&gt;

&lt;p&gt;Here is the example of method.&lt;/p&gt;

&lt;p&gt;let's define a struct value and add method to it.&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight go&quot;&gt;&lt;code&gt;
&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;



&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;val2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;val2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;gk@jarvis:~/exp/code/rd/go-exmaple&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;go run main.go 
3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is a simple example of method.&lt;/p&gt;
&lt;h2&gt;
  
  
  Pointer receiver
&lt;/h2&gt;

&lt;p&gt;Pointer receiver is used to modify the value of the struct.&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight go&quot;&gt;&lt;code&gt;
&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;



&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;gk@jarvis:~/exp/code/rd/go-exmaple&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;go run main.go 
3
2 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;From this we can see that pointer receiver is used to modify the value of the struct.&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this article we understood how method works and how pointer receiver is used to modify the value of the struct.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://hexmos.com/livereview/git-lrc/&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;&lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifqf83t1qjl4u0g6aj4l.png&quot; alt=&quot;git-lrc&quot; width=&quot;800&quot; height=&quot;381&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; Check out: &lt;a href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;git-lrc&lt;/a&gt;&lt;br&gt;
Any feedback or contributors are welcome! It&amp;rsquo;s online, open-source, and ready for anyone to use.&lt;br&gt;
&amp;#11088; Star it on GitHub:&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;ltag-github-readme-tag&quot;&gt;
  &lt;div class=&quot;readme-overview&quot;&gt;
    &lt;h2&gt;
      &lt;img src=&quot;https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg&quot; alt=&quot;GitHub logo&quot;&gt;
      &lt;a href=&quot;https://github.com/HexmosTech&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;
        HexmosTech
      &lt;/a&gt; / &lt;a href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;
        git-lrc
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Free, Unlimited AI Code Reviews That Run on Commit
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class=&quot;ltag-github-body&quot;&gt;
    
&lt;div class=&quot;md&quot;&gt;
&lt;div&gt;
&lt;a rel=&quot;noopener noreferrer nofollow&quot; href=&quot;https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667&quot;&gt;&lt;img width=&quot;60&quot; alt=&quot;git-lrc logo&quot; src=&quot;https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667&quot;&gt;&lt;/a&gt;
&lt;p&gt;&lt;strong&gt;git-lrc&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Free, Unlimited AI Code Reviews That Run on Commit&lt;/strong&gt;&lt;/p&gt;
&lt;br&gt;
&lt;/div&gt;



&lt;div&gt;
&lt;a href=&quot;https://www.producthunt.com/products/git-lrc?embed=true&amp;amp;utm_source=badge-top-post-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-git-lrc&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;img alt=&quot;git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt&quot; width=&quot;250&quot; height=&quot;54&quot; src=&quot;https://camo.githubusercontent.com/87bf2d4283c1e0aa99e254bd17fefb1c67c0c0d39300043a243a4aa633b6cecc/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f746f702d706f73742d62616467652e7376673f706f73745f69643d31303739323632267468656d653d6c6967687426706572696f643d6461696c7926743d31373731373439313730383638&quot;&gt;&lt;/a&gt;
&lt;/div&gt;




&lt;p&gt;AI agents write code fast. They also &lt;em&gt;silently remove logic&lt;/em&gt;, change behavior, and introduce bugs -- without telling you. You often find out in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;git-lrc&lt;/code&gt; fixes this.&lt;/strong&gt; It hooks into &lt;code&gt;git commit&lt;/code&gt; and reviews every diff &lt;em&gt;before&lt;/em&gt; it lands. 60-second setup. Completely free.&lt;/p&gt;

&lt;div class=&quot;markdown-heading&quot;&gt;
&lt;h2 class=&quot;heading-element&quot;&gt;See It In Action&lt;/h2&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;See git-lrc catch serious security issues such as leaked credentials, expensive cloud
operations, and sensitive material in log statements&lt;/p&gt;
&lt;/blockquote&gt;


  
    

    &lt;span class=&quot;m-1&quot;&gt;git-lrc-intro-60s.mp4&lt;/span&gt;
  

  

  


&lt;div class=&quot;markdown-heading&quot;&gt;
&lt;h2 class=&quot;heading-element&quot;&gt;Why&lt;/h2&gt;

&lt;/div&gt;


&lt;ul&gt;

&lt;li&gt; &lt;strong&gt;AI agents silently break things.&lt;/strong&gt; Code removed. Logic changed. Edge cases gone. You won't notice until production.&lt;/li&gt;

&lt;li&gt; &lt;strong&gt;Catch it before it ships.&lt;/strong&gt; AI-powered inline comments show you &lt;em&gt;exactly&lt;/em&gt; what changed and what looks wrong.&lt;/li&gt;

&lt;li&gt; &lt;strong&gt;Build a habit, ship better code.&lt;/strong&gt; Regular review &amp;rarr; fewer bugs &amp;rarr; more robust code &amp;rarr; better results in your team.&lt;/li&gt;

&lt;li&gt; &lt;strong&gt;Why git?&lt;/strong&gt; Git is universal. Every editor, every IDE, every AI&amp;hellip;&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class=&quot;gh-btn-container&quot;&gt;&lt;a class=&quot;gh-btn&quot; href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;



</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/13379/understanding-methods-in-go</guid>
<pubDate>Wed, 25 Mar 2026 22:30:59 +0000</pubDate>
</item>
<item>
<title>Understanding Anonymous Functions in Go</title>
<link>https://coderlegion.com/13381/understanding-anonymous-functions-in-go</link>
<description>
&lt;p&gt;&lt;em&gt;Hello, I'm Ganesh Kumar. I'm working on &lt;a href=&quot;https://hexmos.com/livereview/git-lrc/&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;git-lrc&lt;/a&gt;: a Git hook for Checking AI generated code.AI agents write code fast. They also silently remove logic, change behavior, and introduce bugs -- without telling you. You often find out in production.git-lrc fixes this. It hooks into git commit and reviews every diff before it lands. 60-second setup. Completely free.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In my previous post, I explained what are maps and how to create them.&lt;/p&gt;

&lt;p&gt;Now let's see how anonymous functions created and understand how it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anonymous functions
&lt;/h2&gt;

&lt;p&gt;We assign a function to a variable and then call it.&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight go&quot;&gt;&lt;code&gt;
&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello World&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;Hello World
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Similarly we can also pass arguments to the anonymous function.&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight go&quot;&gt;&lt;code&gt;
&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;dev&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;to&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;dev to
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Passing function as an argument
&lt;/h2&gt;

&lt;p&gt;We are passing a function as an argument to another function.&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight go&quot;&gt;&lt;code&gt;
&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;anonymous&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello World&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;anonymous&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;Hello World
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If we want to pass arguments to the anonymous function, we can do it like this:&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight go&quot;&gt;&lt;code&gt;
&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;anonymous&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;dev&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;to&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;anonymous&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;As is the print statement is inside the anonymous function, it is printing the values passed to it.&lt;/p&gt;

&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;dev to
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We understood how the anonymous functions are created and how to pass them as arguments to another function.&lt;/p&gt;

&lt;p&gt;As go has the feature of passing functions as arguments to another function, go provides a feature called closure.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://hexmos.com/livereview/git-lrc/&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;&lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifqf83t1qjl4u0g6aj4l.png&quot; alt=&quot;git-lrc&quot; width=&quot;800&quot; height=&quot;381&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; Check out: &lt;a href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;git-lrc&lt;/a&gt;&lt;br&gt;
Any feedback or contributors are welcome! It&amp;rsquo;s online, open-source, and ready for anyone to use.&lt;br&gt;
&amp;#11088; Star it on GitHub:&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;ltag-github-readme-tag&quot;&gt;
  &lt;div class=&quot;readme-overview&quot;&gt;
    &lt;h2&gt;
      &lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg&quot; alt=&quot;GitHub logo&quot;&gt;
      &lt;a href=&quot;https://github.com/HexmosTech&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;
        HexmosTech
      &lt;/a&gt; / &lt;a href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;
        git-lrc
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Free, Unlimited AI Code Reviews That Run on Commit
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class=&quot;ltag-github-body&quot;&gt;
    
&lt;div class=&quot;md&quot;&gt;
&lt;div&gt;
&lt;a rel=&quot;noopener noreferrer nofollow&quot; href=&quot;https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667&quot;&gt;&lt;img width=&quot;60&quot; alt=&quot;git-lrc logo&quot; src=&quot;https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667&quot;&gt;&lt;/a&gt;
&lt;p&gt;&lt;strong&gt;git-lrc&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Free, Unlimited AI Code Reviews That Run on Commit&lt;/strong&gt;&lt;/p&gt;
&lt;br&gt;
&lt;/div&gt;



&lt;div&gt;
&lt;a href=&quot;https://www.producthunt.com/products/git-lrc?embed=true&amp;amp;utm_source=badge-top-post-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-git-lrc&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;img alt=&quot;git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt&quot; width=&quot;250&quot; height=&quot;54&quot; src=&quot;https://camo.githubusercontent.com/87bf2d4283c1e0aa99e254bd17fefb1c67c0c0d39300043a243a4aa633b6cecc/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f746f702d706f73742d62616467652e7376673f706f73745f69643d31303739323632267468656d653d6c6967687426706572696f643d6461696c7926743d31373731373439313730383638&quot;&gt;&lt;/a&gt;
&lt;/div&gt;




&lt;p&gt;AI agents write code fast. They also &lt;em&gt;silently remove logic&lt;/em&gt;, change behavior, and introduce bugs -- without telling you. You often find out in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;git-lrc&lt;/code&gt; fixes this.&lt;/strong&gt; It hooks into &lt;code&gt;git commit&lt;/code&gt; and reviews every diff &lt;em&gt;before&lt;/em&gt; it lands. 60-second setup. Completely free.&lt;/p&gt;

&lt;div class=&quot;markdown-heading&quot;&gt;
&lt;h2 class=&quot;heading-element&quot;&gt;See It In Action&lt;/h2&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;See git-lrc catch serious security issues such as leaked credentials, expensive cloud
operations, and sensitive material in log statements&lt;/p&gt;
&lt;/blockquote&gt;


  
    

    &lt;span class=&quot;m-1&quot;&gt;git-lrc-intro-60s.mp4&lt;/span&gt;
  

  

  


&lt;div class=&quot;markdown-heading&quot;&gt;
&lt;h2 class=&quot;heading-element&quot;&gt;Why&lt;/h2&gt;

&lt;/div&gt;


&lt;ul&gt;

&lt;li&gt; &lt;strong&gt;AI agents silently break things.&lt;/strong&gt; Code removed. Logic changed. Edge cases gone. You won't notice until production.&lt;/li&gt;

&lt;li&gt; &lt;strong&gt;Catch it before it ships.&lt;/strong&gt; AI-powered inline comments show you &lt;em&gt;exactly&lt;/em&gt; what changed and what looks wrong.&lt;/li&gt;

&lt;li&gt; &lt;strong&gt;Build a habit, ship better code.&lt;/strong&gt; Regular review &amp;rarr; fewer bugs &amp;rarr; more robust code &amp;rarr; better results in your team.&lt;/li&gt;

&lt;li&gt; &lt;strong&gt;Why git?&lt;/strong&gt; Git is universal. Every editor, every IDE, every AI&amp;hellip;&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class=&quot;gh-btn-container&quot;&gt;&lt;a class=&quot;gh-btn&quot; href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;&lt;a href=&quot;https://github.com/golang/go/blob/master/src/runtime/slice.go&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;https://github.com/golang/go/blob/master/src/runtime/slice.go&lt;/a&gt;&lt;/p&gt;


</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/13381/understanding-anonymous-functions-in-go</guid>
<pubDate>Mon, 23 Mar 2026 22:29:30 +0000</pubDate>
</item>
<item>
<title>What Is a 6-Digit Verification Code? Why Sharing It Is a Major Security Risk</title>
<link>https://coderlegion.com/13303/what-is-a-6-digit-verification-code-why-sharing-it-is-a-major-security-risk</link>
<description>
&lt;h1&gt;What Is a 6-Digit Verification Code? Why Sharing It Is a Major Security Risk&lt;/h1&gt;
&lt;p&gt;In our increasingly digital world, security is paramount. You have likely encountered a scenario where you try to log into an app or a bank website, and suddenly, your smartphone buzzes with a text message containing a random 6-digit number. This is a verification code, and while it seems like a simple, fleeting string of numbers, it is one of the most critical gatekeepers of your digital identity. Understanding what these codes are and, more importantly, why you should &lt;strong&gt;never&lt;/strong&gt; share them, is a fundamental aspect of staying safe online.&lt;/p&gt;
&lt;h2&gt;What Exactly Is a 6-Digit Verification Code?&lt;/h2&gt;
&lt;p&gt;A 6-digit verification code&amp;mdash;often referred to as a One-Time Password (OTP) or a Time-based One-Time Password (TOTP)&amp;mdash;is a security mechanism used for identity verification. It is a core component of Multi-Factor Authentication (MFA) or Two-Factor Authentication (2FA).&lt;/p&gt;
&lt;p&gt;When you attempt to log into a service, the system doesn&amp;rsquo;t just rely on your password. It sends a temporary, unique code to your registered device (usually via SMS, email, or an authenticator app) to prove that &lt;em&gt;you&lt;/em&gt; are the one attempting the access. The code is time-sensitive, often expiring in a matter of minutes, rendering it useless if intercepted later.&lt;/p&gt;
&lt;h3&gt;The Role of MFA/2FA&lt;/h3&gt;
&lt;p&gt;MFA is designed to add a layer of protection that goes beyond just a password. If a hacker manages to steal your password in a data breach, they still cannot access your account without that secondary factor&amp;mdash;the 6-digit code. It effectively bridges the gap between &amp;lsquo;what you know&amp;rsquo; (your password) and &amp;lsquo;what you have&amp;rsquo; (your phone).&lt;/p&gt;
&lt;h2&gt;Why You Should Never Share Your Verification Code&lt;/h2&gt;
&lt;p&gt;It sounds like common sense, but social engineering attacks rely on tricking users into divulging this code. Here is why sharing it is a dangerous mistake:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;It Grants Total Access:&lt;/strong&gt; To the service provider, whoever provides that code is the authorized user. By giving it to someone else, you are effectively granting them your digital &amp;lsquo;keys.&amp;rsquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bypassing Security:&lt;/strong&gt; Giving away your OTP renders your primary security layer (your password) completely obsolete.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Account Takeover (ATO):&lt;/strong&gt; This is the ultimate goal of the attacker. Once they have your code, they can change your account password, change recovery email addresses, and lock you out completely.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Financial Theft:&lt;/strong&gt; If the code is for your banking app or a digital wallet, the consequences can be immediate and devastating.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How Attackers Trick You Into Sharing Your Code&lt;/h2&gt;
&lt;p&gt;Hackers do not always &amp;lsquo;hack&amp;rsquo; systems; often, they &amp;lsquo;hack&amp;rsquo; humans. They use social engineering tactics to manipulate you into breaking your own security protocols. Here are common scenarios:&lt;/p&gt;
&lt;h3&gt;1. The Urgent Customer Support Scam&lt;/h3&gt;
&lt;p&gt;You receive a call or text claiming to be from your bank, Amazon, or a popular social media platform. They claim there is &amp;lsquo;suspicious activity&amp;rsquo; on your account. They then ask you to read back the &amp;lsquo;verification code they just sent&amp;rsquo; to &amp;lsquo;verify your identity&amp;rsquo; or &amp;lsquo;stop the unauthorized transaction.&amp;rsquo; They are the ones initiating the login attempt; they need your code to finalize the takeover.&lt;/p&gt;
&lt;h3&gt;2. The &amp;lsquo;Wrong Number&amp;rsquo; Text&lt;/h3&gt;
&lt;p&gt;Someone messages you saying they accidentally sent a verification code to your phone. They ask you to forward it to them so they can fix their account. If you do, you have just provided the credentials for &lt;em&gt;your own&lt;/em&gt; account, which they were attempting to hijack.&lt;/p&gt;
&lt;h3&gt;3. Fake Account Recovery Requests&lt;/h3&gt;
&lt;p&gt;An attacker may compromise a friend&amp;rsquo;s account and message you, pretending to be them, claiming they need your help to recover their account. They will instruct you to share a code that arrives on your phone. Never trust these, even if they come from a known contact.&lt;/p&gt;
&lt;h2&gt;What to Do If You&amp;rsquo;ve Shared Your Code&lt;/h2&gt;
&lt;p&gt;If you suspect you have mistakenly shared a verification code, act immediately:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Change Your Password:&lt;/strong&gt; Immediately log into the affected service and change your password to something unique and strong.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log Out Everywhere:&lt;/strong&gt; Check the account security settings for an option to &amp;lsquo;Log out of all devices&amp;rsquo; or &amp;lsquo;End all active sessions.&amp;rsquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check for Changes:&lt;/strong&gt; Verify if your recovery email, recovery phone number, or security questions have been changed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contact Support:&lt;/strong&gt; Reach out to the official customer support channel of the service immediately to report a compromised account.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitor Financial Activity:&lt;/strong&gt; If the account is linked to money, check your recent transactions and notify your bank if anything looks suspicious.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Best Practices for Keeping Your Accounts Secure&lt;/h2&gt;
&lt;p&gt;Beyond guarding your OTPs, here are proactive steps to enhance your security:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enable 2FA Everywhere:&lt;/strong&gt; Use MFA on every account that supports it, especially email, banking, and social media.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Authenticator Apps:&lt;/strong&gt; Whenever possible, use authenticator apps (like Google Authenticator, Authy, or Microsoft Authenticator) instead of SMS. SMS messages can be intercepted through SIM swapping attacks, while authenticator apps are safer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Never Trust Unexpected SMS:&lt;/strong&gt; If you receive a 6-digit code when you didn&amp;rsquo;t request one, delete the message. Do not respond to it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use a Password Manager:&lt;/strong&gt; A password manager helps you maintain complex, unique passwords for every site, reducing the risk of a breach affecting multiple accounts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The 6-digit verification code is a small string of numbers that holds immense power. It is designed to be your last line of defense against account takeover. By recognizing the social engineering tactics used by hackers and maintaining a strict policy of never sharing these codes with anyone&amp;mdash;under any circumstances&amp;mdash;you drastically increase your digital security. Remember: No legitimate organization will ever ask you to share a verification code that they have sent to you via SMS. Stay vigilant, stay skeptical, and keep your accounts locked down.&lt;/p&gt;
&lt;h2&gt;Frequently Asked Questions (FAQ)&lt;/h2&gt;
&lt;h3&gt;1. Can I share the code if a customer support representative asks for it?&lt;/h3&gt;
&lt;p&gt;No. Legitimate support agents will never ask for your verification code or password. If someone asks for it, it is a red flag for a scam.&lt;/p&gt;
&lt;h3&gt;2. What should I do if I get a code when I didn&amp;rsquo;t try to log in?&lt;/h3&gt;
&lt;p&gt;Do nothing. If you did not initiate a login attempt, ignore and delete the message. Someone may have your password and is trying to access your account, but as long as you do not give them the code, they cannot get in. You should consider changing your password for that account immediately as a precaution.&lt;/p&gt;
&lt;h3&gt;3. Are authenticator apps safer than SMS verification?&lt;/h3&gt;
&lt;p&gt;Yes. Authenticator apps generate codes locally on your device, making them immune to SMS interception techniques like SIM swapping. Always choose the authenticator app option when setting up 2FA.&lt;/p&gt;
&lt;h3&gt;4. What is a SIM swap attack?&lt;/h3&gt;
&lt;p&gt;A SIM swap attack occurs when a hacker convinces your mobile carrier to transfer your phone number to a SIM card in their possession. This allows them to receive your SMS messages, including your 2FA codes. This is why using an authenticator app or hardware security key is more secure than SMS.&lt;/p&gt;
&lt;h3&gt;5. Is there ever a safe reason to share a 6-digit code?&lt;/h3&gt;
&lt;p&gt;No. There is no legitimate scenario where a third party requires you to share a security code meant for your personal authentication.&lt;/p&gt;&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; href=&quot;https://insightginie.com/what-is-a-6-digit-verification-code-why-sharing-it-is-a-major-security-risk/&quot;&gt;What Is a 6-Digit Verification Code? Why Sharing It Is a Major Security Risk&lt;/a&gt; first appeared on &lt;a rel=&quot;nofollow&quot; href=&quot;https://insightginie.com&quot;&gt;Insight Ginie&lt;/a&gt;.&lt;/p&gt;
</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/13303/what-is-a-6-digit-verification-code-why-sharing-it-is-a-major-security-risk</guid>
<pubDate>Mon, 23 Mar 2026 12:31:38 +0000</pubDate>
</item>
<item>
<title>Understanding Closures in Go</title>
<link>https://coderlegion.com/13380/understanding-closures-in-go</link>
<description>
&lt;p&gt;&lt;em&gt;Hello, I'm Ganesh Kumar. I'm working on &lt;a href=&quot;https://hexmos.com/livereview/git-lrc/&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;git-lrc&lt;/a&gt;: a Git hook for Checking AI generated code.AI agents write code fast. They also silently remove logic, change behavior, and introduce bugs -- without telling you. You often find out in production.git-lrc fixes this. It hooks into git commit and reviews every diff before it lands. 60-second setup. Completely free.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In my previous post, I explained how anonymous functions created and understand how it works.&lt;/p&gt;

&lt;p&gt;In this article we will understand how closure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is closure
&lt;/h2&gt;

&lt;p&gt;A closure is a function value that references variables from outside its body. &lt;/p&gt;

&lt;p&gt;The function may access and assign to the referenced variables; in this sense the function is &quot;bound&quot; to the variables.&lt;/p&gt;

&lt;h2&gt;
  
  
  How closure is used?
&lt;/h2&gt;

&lt;p&gt;Each time new value updates the sum variable.&lt;/p&gt;

&lt;p&gt;Next time when we call the function, it will use the updated value of sum.&lt;/p&gt;

&lt;p&gt;So, It remembers the value of sum.&lt;br&gt;
&lt;/p&gt;

&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight go&quot;&gt;&lt;code&gt;
&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;adder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sum&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sum&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sum&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;n&quot;&gt;pos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;neg&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;adder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;adder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
   &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;pos&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;neg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;gk@jarvis:~/exp/code/rd/go-exmaple&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;go run main.go 
0 0
1 &lt;span class=&quot;nt&quot;&gt;-1&lt;/span&gt;
3 &lt;span class=&quot;nt&quot;&gt;-3&lt;/span&gt;
6 &lt;span class=&quot;nt&quot;&gt;-6&lt;/span&gt;
10 &lt;span class=&quot;nt&quot;&gt;-10&lt;/span&gt;
15 &lt;span class=&quot;nt&quot;&gt;-15&lt;/span&gt;
21 &lt;span class=&quot;nt&quot;&gt;-21&lt;/span&gt;
28 &lt;span class=&quot;nt&quot;&gt;-28&lt;/span&gt;
36 &lt;span class=&quot;nt&quot;&gt;-36&lt;/span&gt;
45 &lt;span class=&quot;nt&quot;&gt;-45&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Fibonacci series
&lt;/h2&gt;

&lt;p&gt;Here is the example of fibonacci series.&lt;br&gt;
initially we are initializing a and b with 0 and 1.&lt;/p&gt;

&lt;p&gt;then with each time calling the function it will return the return value of a.&lt;/p&gt;

&lt;p&gt;and update the value of a and b.&lt;/p&gt;

&lt;p&gt;So, hence creating a fibonacci series.&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight go&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fmt&quot;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;// fibonacci is a function that returns&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;// a function that returns an int.&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fibonacci&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;ret&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ret&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fibonacci&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;highlight js-code-highlight&quot;&gt;
&lt;pre class=&quot;highlight shell&quot;&gt;&lt;code&gt;gk@jarvis:~/exp/code/rd/go-exmaple&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;go run main.go 
0
1
1
2
3
5
8
13
21
34
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this article we understood how closure is used. closure is a function value that references variables from outside its body.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://hexmos.com/livereview/git-lrc/&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;&lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifqf83t1qjl4u0g6aj4l.png&quot; alt=&quot;git-lrc&quot; width=&quot;800&quot; height=&quot;381&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; Check out: &lt;a href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;git-lrc&lt;/a&gt;&lt;br&gt;
Any feedback or contributors are welcome! It&amp;rsquo;s online, open-source, and ready for anyone to use.&lt;br&gt;
&amp;#11088; Star it on GitHub:&lt;br&gt;
&lt;/p&gt;
&lt;div class=&quot;ltag-github-readme-tag&quot;&gt;
  &lt;div class=&quot;readme-overview&quot;&gt;
    &lt;h2&gt;
      &lt;img src=&quot;https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg&quot; alt=&quot;GitHub logo&quot;&gt;
      &lt;a href=&quot;https://github.com/HexmosTech&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;
        HexmosTech
      &lt;/a&gt; / &lt;a href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;
        git-lrc
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Free, Unlimited AI Code Reviews That Run on Commit
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class=&quot;ltag-github-body&quot;&gt;
    
&lt;div class=&quot;md&quot;&gt;
&lt;div&gt;
&lt;a rel=&quot;noopener noreferrer nofollow&quot; href=&quot;https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667&quot;&gt;&lt;img width=&quot;60&quot; alt=&quot;git-lrc logo&quot; src=&quot;https://camo.githubusercontent.com/948c8f2d5cf41b48985cd364d48c3a2dc9bfbfd42eab3e0a9a1b3e61f5f17ce3/68747470733a2f2f6865786d6f732e636f6d2f66726565646576746f6f6c732f7075626c69632f6c725f6c6f676f2e737667&quot;&gt;&lt;/a&gt;
&lt;p&gt;&lt;strong&gt;git-lrc&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Free, Unlimited AI Code Reviews That Run on Commit&lt;/strong&gt;&lt;/p&gt;
&lt;br&gt;
&lt;/div&gt;



&lt;div&gt;
&lt;a href=&quot;https://www.producthunt.com/products/git-lrc?embed=true&amp;amp;utm_source=badge-top-post-badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=badge-git-lrc&quot; rel=&quot;nofollow noopener noreferrer&quot;&gt;&lt;img alt=&quot;git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt&quot; width=&quot;250&quot; height=&quot;54&quot; src=&quot;https://camo.githubusercontent.com/87bf2d4283c1e0aa99e254bd17fefb1c67c0c0d39300043a243a4aa633b6cecc/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f746f702d706f73742d62616467652e7376673f706f73745f69643d31303739323632267468656d653d6c6967687426706572696f643d6461696c7926743d31373731373439313730383638&quot;&gt;&lt;/a&gt;
&lt;/div&gt;




&lt;p&gt;AI agents write code fast. They also &lt;em&gt;silently remove logic&lt;/em&gt;, change behavior, and introduce bugs -- without telling you. You often find out in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;git-lrc&lt;/code&gt; fixes this.&lt;/strong&gt; It hooks into &lt;code&gt;git commit&lt;/code&gt; and reviews every diff &lt;em&gt;before&lt;/em&gt; it lands. 60-second setup. Completely free.&lt;/p&gt;

&lt;div class=&quot;markdown-heading&quot;&gt;
&lt;h2 class=&quot;heading-element&quot;&gt;See It In Action&lt;/h2&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;See git-lrc catch serious security issues such as leaked credentials, expensive cloud
operations, and sensitive material in log statements&lt;/p&gt;
&lt;/blockquote&gt;


  
    

    &lt;span class=&quot;m-1&quot;&gt;git-lrc-intro-60s.mp4&lt;/span&gt;
  

  

  


&lt;div class=&quot;markdown-heading&quot;&gt;
&lt;h2 class=&quot;heading-element&quot;&gt;Why&lt;/h2&gt;

&lt;/div&gt;


&lt;ul&gt;

&lt;li&gt; &lt;strong&gt;AI agents silently break things.&lt;/strong&gt; Code removed. Logic changed. Edge cases gone. You won't notice until production.&lt;/li&gt;

&lt;li&gt; &lt;strong&gt;Catch it before it ships.&lt;/strong&gt; AI-powered inline comments show you &lt;em&gt;exactly&lt;/em&gt; what changed and what looks wrong.&lt;/li&gt;

&lt;li&gt; &lt;strong&gt;Build a habit, ship better code.&lt;/strong&gt; Regular review &amp;rarr; fewer bugs &amp;rarr; more robust code &amp;rarr; better results in your team.&lt;/li&gt;

&lt;li&gt; &lt;strong&gt;Why git?&lt;/strong&gt; Git is universal. Every editor, every IDE, every AI&amp;hellip;&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class=&quot;gh-btn-container&quot;&gt;&lt;a class=&quot;gh-btn&quot; href=&quot;https://github.com/HexmosTech/git-lrc&quot; rel=&quot;noopener noreferrer nofollow&quot;&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;



</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/13380/understanding-closures-in-go</guid>
<pubDate>Mon, 23 Mar 2026 10:11:14 +0000</pubDate>
</item>
<item>
<title>Vibe Coding vs Prompt-Driven Development: Generative AI</title>
<link>https://coderlegion.com/13097/vibe-coding-vs-prompt-driven-development-generative-ai</link>
<description>
&lt;h1 id=&quot;vibe-coding-vs-prompt-driven-development-generative-ai-and-software-development-security-and-code-quality&quot;&gt;Vibe Coding vs Prompt-Driven Development: Generative AI and Software Development, Security and Code Quality&lt;/h1&gt;

&lt;p&gt;The advent of generative artificial intelligences like ChatGPT, Claude, and GitHub Copilot has revolutionized how we design and write code. This transformation has given rise to two distinct approaches to AI-assisted development: &lt;strong&gt;Vibe Coding&lt;/strong&gt; and &lt;strong&gt;Prompt-Driven Development&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;introduction-two-philosophies-two-approaches&quot;&gt;Introduction: Two Philosophies, Two Approaches&lt;/h2&gt;

&lt;p&gt;In today&amp;rsquo;s software development ecosystem, we&amp;rsquo;re witnessing the emergence of two AI-assisted programming paradigms that reflect radically different philosophies:&lt;/p&gt;

&lt;h3 id=&quot;vibe-coding-the-intuitive-approach&quot;&gt;Vibe Coding: The Intuitive Approach&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Vibe Coding&lt;/strong&gt; represents a spontaneous and intuitive approach to AI code generation. This method prioritizes execution speed and accessibility, allowing even non-developers to create functional solutions in minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vibe Coding Characteristics:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Short and generic prompts&lt;/li&gt;
  &lt;li&gt;Focus on immediate results&lt;/li&gt;
  &lt;li&gt;Quick iterations and on-the-fly corrections&lt;/li&gt;
  &lt;li&gt;&amp;ldquo;It works, that&amp;rsquo;s good&amp;rdquo; approach&lt;/li&gt;
  &lt;li&gt;Maximum accessibility for all profiles&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;prompt-driven-development-the-structured-approach&quot;&gt;Prompt-Driven Development: The Structured Approach&lt;/h3&gt;

&lt;p&gt;In contrast, &lt;strong&gt;Prompt-Driven Development&lt;/strong&gt; (PDD) adopts a methodical and professional approach. This method treats AI as a sophisticated development partner, requiring precise and structured communication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt-Driven Development Characteristics:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Detailed prompts with technical context&lt;/li&gt;
  &lt;li&gt;Quality and security specifications&lt;/li&gt;
  &lt;li&gt;Defined architecture and patterns&lt;/li&gt;
  &lt;li&gt;Integrated tests and documentation&lt;/li&gt;
  &lt;li&gt;Maintenance and scalability as priorities&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;comparative-analysis-risks-and-benefits&quot;&gt;Comparative Analysis: Risks and Benefits&lt;/h2&gt;

&lt;h3 id=&quot;the-risks-of-vibe-coding&quot;&gt;The Risks of Vibe Coding&lt;/h3&gt;

&lt;h4 id=&quot;1-security-vulnerabilities&quot;&gt;1. Security Vulnerabilities&lt;/h4&gt;

&lt;p&gt;Vibe Coding often generates code with critical security flaws:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Typical Vibe Coding example - DANGEROUS
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;login&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;query&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;SELECT * FROM users WHERE username='&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;' AND password='&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fetchone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This code presents an obvious SQL injection vulnerability but may appear functional during basic testing.&lt;/p&gt;

&lt;h4 id=&quot;2-lack-of-structure-and-maintainability&quot;&gt;2. Lack of Structure and Maintainability&lt;/h4&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Vibe Coding generated code - unmaintainable&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;handleData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;active&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;user-&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;innerHTML&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;role&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;admin&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;admin-panel&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;display&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;3-absence-of-error-handling&quot;&gt;3. Absence of Error Handling&lt;/h4&gt;

&lt;p&gt;Vibe Coding generated code often neglects error handling and edge cases.&lt;/p&gt;

&lt;h3 id=&quot;the-benefits-of-prompt-driven-development&quot;&gt;The Benefits of Prompt-Driven Development&lt;/h3&gt;

&lt;h4 id=&quot;1-integrated-security&quot;&gt;1. Integrated Security&lt;/h4&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# Prompt-Driven Development with security
&lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;werkzeug.security&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;check_password_hash&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;sqlalchemy&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;logging&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;authenticate_user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Optional&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;
    Authenticates a user securely

    Args:
        username: Username (validated and escaped)
        password: Plain text password

    Returns:
        User object if authentication successful, None otherwise

    Raises:
        AuthenticationError: In case of authentication error
    &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;# Using parameterized query to prevent SQL injection
&lt;/span&gt;        &lt;span class=&quot;n&quot;&gt;query&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;SELECT id, username, password_hash, role FROM users WHERE username = :username&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'username'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fetchone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;check_password_hash&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;password_hash&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;logging&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Successful authentication for user: &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;logging&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;warning&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Failed authentication attempt for user: &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;except&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;logging&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Authentication error: &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;AuthenticationError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Authentication service unavailable&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;2-architecture-and-patterns&quot;&gt;2. Architecture and Patterns&lt;/h4&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Prompt-Driven Development with clear architecture&lt;/span&gt;
&lt;span class=&quot;kr&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;UserRepository&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;findById&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;User&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;findByUsername&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;User&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;UserService&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;userRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;UserRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;eventBus&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;EventBus&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;authenticateUser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;credentials&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;LoginCredentials&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;AuthResult&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;validation&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;validateCredentials&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;credentials&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;validation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isValid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;AuthResult&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;failure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;validation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;errors&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;userRepository&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;findByUsername&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;credentials&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;user&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;verifyPassword&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;credentials&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;passwordHash&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;warn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Failed authentication attempt&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;credentials&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;username&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;AuthResult&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;failure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Invalid credentials&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

            &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;eventBus&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;publish&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;UserAuthenticatedEvent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;AuthResult&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Authentication service error&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;AuthenticationServiceError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;Authentication unavailable&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;prompt-engineering-for-professional-development&quot;&gt;Prompt Engineering for Professional Development&lt;/h2&gt;

&lt;h3 id=&quot;structure-of-an-effective-prompt&quot;&gt;Structure of an Effective Prompt&lt;/h3&gt;

&lt;p&gt;A professional-quality prompt must include:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Precise technical context&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Detailed functional specifications&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Security and performance constraints&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Code standards and patterns&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Testing and documentation requirements&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;example-of-structured-prompt&quot;&gt;Example of Structured Prompt&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;CONTEXT:
E-commerce application in Node.js/TypeScript with PostgreSQL
Hexagonal architecture, unit tests with Jest
JWT authentication, validation with Joi

OBJECTIVE:
Create an order management service with functionalities:
- Order creation with business validation
- Automatic tax calculation based on geolocation
- Inventory management with availability check
- Client and admin notifications

TECHNICAL CONSTRAINTS:
- Use interfaces for dependency inversion
- Implement error handling with specific types
- Add structured logs for monitoring
- Unit tests with &amp;gt;90% coverage
- Complete JSDoc documentation

SECURITY CONSTRAINTS:
- Strict validation of user inputs
- Prevention of race conditions on inventory
- Audit trail for all operations
- Rate limiting on public endpoints

EXPECTED DELIVE&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/13097/vibe-coding-vs-prompt-driven-development-generative-ai</guid>
<pubDate>Thu, 19 Mar 2026 02:43:56 +0000</pubDate>
</item>
<item>
<title>AI Code Reviews Are Backwards (Do This Instead)</title>
<link>https://coderlegion.com/12338/ai-code-reviews-are-backwards-do-this-instead</link>
<description>
&lt;p&gt;A few weeks ago, I wrote about &lt;a rel=&quot;nofollow&quot; href=&quot;https://sudoish.com/the-review-bottleneck-why-ai-explanations-are-making-us-trust-less-not-more/&quot;&gt;The Review Bottleneck&lt;/a&gt; &amp;mdash; how AI-generated code comes with so much confident explanation that we&amp;rsquo;ve stopped actually reviewing it.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re not doing more engineering. We&amp;rsquo;re doing more &lt;strong&gt;trusting&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The response was overwhelming. Developers everywhere said: &amp;ldquo;I thought I was the only one.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;So I made a video breaking down what&amp;rsquo;s actually happening &amp;mdash; and what I&amp;rsquo;m trying instead.&lt;/p&gt;
&lt;figure class=&quot;wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio&quot;&gt;
&lt;div class=&quot;wp-block-embed__wrapper&quot;&gt;
&lt;iframe title=&quot;AI Code Reviews Are Backwards (Do This Instead)&quot; width=&quot;640&quot; height=&quot;360&quot; src=&quot;https://www.youtube.com/embed/gcnvjy1kQR4?feature=oembed&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/figure&gt;
&lt;h2&gt;The Core Problem&lt;/h2&gt;
&lt;p&gt;AI code reviews aren&amp;rsquo;t making us better reviewers. They&amp;rsquo;re making us &lt;strong&gt;worse&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Not because the AI is bad &amp;mdash; but because the volume of explanation has become impossible to process.&lt;/p&gt;
&lt;p&gt;When you&amp;rsquo;re staring at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;300 lines of code&lt;/li&gt;
&lt;li&gt;1,200 words of AI explanation&lt;/li&gt;
&lt;li&gt;800 words of AI review feedback&lt;/li&gt;
&lt;li&gt;15 inline comments about trade-offs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You&amp;rsquo;re not carefully evaluating. You&amp;rsquo;re skimming and trusting.&lt;/p&gt;
&lt;h2&gt;What I&amp;rsquo;m Doing Instead&lt;/h2&gt;
&lt;p&gt;The video walks through my current approach:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The 30-minute rule&lt;/strong&gt; &amp;mdash; If I can&amp;rsquo;t understand a PR in 30 minutes of focused review, it&amp;rsquo;s too big. Break it down.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No AI reviewer without human review&lt;/strong&gt; &amp;mdash; AI review is a supplement, not a replacement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The explain-it test&lt;/strong&gt; &amp;mdash; If I can&amp;rsquo;t explain the core logic to someone else, I don&amp;rsquo;t approve it.&lt;/p&gt;
&lt;p&gt;Does this slow me down? Yes.&lt;/p&gt;
&lt;p&gt;Does it help? I think so.&lt;/p&gt;
&lt;h2&gt;The Uncomfortable Truth&lt;/h2&gt;
&lt;p&gt;Research shows AI-generated code creates &lt;strong&gt;1.7x more issues&lt;/strong&gt; than human-written code. Yet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;46% of all code&lt;/strong&gt; is now AI-generated&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;84% of developers&lt;/strong&gt; use AI coding tools regularly&lt;/li&gt;
&lt;li&gt;Only &lt;strong&gt;30% of AI-suggested code&lt;/strong&gt; actually gets accepted&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;rsquo;re generating more code than ever. But we&amp;rsquo;re not reviewing it properly.&lt;/p&gt;
&lt;p&gt;The quality gate we automated away isn&amp;rsquo;t coming back.&lt;/p&gt;
&lt;p&gt;We need to figure out what replaces it.&lt;/p&gt;
&lt;h2&gt;Watch the Full Breakdown&lt;/h2&gt;
&lt;p&gt;The video goes deeper into:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why AI code review tools make the problem worse, not better&lt;/li&gt;
&lt;li&gt;The &amp;ldquo;automation bias&amp;rdquo; trap we&amp;rsquo;re all falling into&lt;/li&gt;
&lt;li&gt;Practical strategies for reviewing AI code honestly&lt;/li&gt;
&lt;li&gt;What comes next when the review bottleneck becomes permanent&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check it out and let me know what you think. Are you actually reviewing AI code? Or just hoping the explanation is right?&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Related:&lt;/strong&gt; Read the full analysis in &lt;a rel=&quot;nofollow&quot; href=&quot;https://sudoish.com/the-review-bottleneck-why-ai-explanations-are-making-us-trust-less-not-more/&quot;&gt;The Review Bottleneck: Why AI Explanations Are Making Us Trust Less, Not More&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; href=&quot;https://sudoish.com/ai-code-reviews-are-backwards-do-this-instead/&quot;&gt;AI Code Reviews Are Backwards (Do This Instead)&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; href=&quot;https://sudoish.com&quot;&gt;sudoish&lt;/a&gt;.&lt;/p&gt;

</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/12338/ai-code-reviews-are-backwards-do-this-instead</guid>
<pubDate>Tue, 03 Mar 2026 02:48:21 +0000</pubDate>
</item>
<item>
<title>A Tale of Accidental Architecture: How 50 Lines Became A Black Friday Disaster</title>
<link>https://coderlegion.com/12256/a-tale-of-accidental-architecture-how-50-lines-became-a-black-friday-disaster</link>
<description>
&lt;p&gt;Let me tell you about Sarah.&lt;/p&gt;



&lt;p&gt;This is a fictional story. But I bet you&amp;rsquo;ll recognize it.&lt;/p&gt;



&lt;p&gt;I&amp;rsquo;ve seen this pattern play out across different companies, different teams, different tech stacks.&amp;nbsp;&lt;strong&gt;The details change. The progression doesn&amp;rsquo;t.&lt;/strong&gt;&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Week 1: The Perfect Start&lt;/h2&gt;



&lt;p&gt;Sarah&amp;rsquo;s building a notification system for an e-commerce platform.&lt;/p&gt;



&lt;p&gt;First requirement: send an email when someone places an order.&lt;/p&gt;



&lt;p&gt;Simple. She writes one function. Webhook comes in, format the email, hit SMTP, done.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;The whole thing is maybe 50 lines.&lt;/strong&gt;&amp;nbsp;It works perfectly. Code review approves it. It ships.&lt;/p&gt;



&lt;p&gt;Sarah&amp;rsquo;s thinking:&amp;nbsp;&lt;em&gt;&amp;ldquo;It&amp;rsquo;s just one notification type. I&amp;rsquo;ll add proper abstraction when we actually need it.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;You&amp;rsquo;ve thought this too. So have I.&lt;/p&gt;



&lt;p&gt;Nothing wrong with it. Week 1, this is the right call.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Week 3: The First Copy-Paste&lt;/h2&gt;



&lt;p&gt;Product team loves the email notifications. Now they want SMS for order shipments.&lt;/p&gt;



&lt;p&gt;Mike picks up the ticket.&lt;/p&gt;



&lt;p&gt;He opens Sarah&amp;rsquo;s code. Sees the pattern.&amp;nbsp;&lt;strong&gt;Makes sense.&lt;/strong&gt;&amp;nbsp;He follows it.&lt;/p&gt;



&lt;p&gt;New handler. Receives the shipment webhook. Formats the SMS message. Connects to Twilio. Sends it.&lt;/p&gt;



&lt;p&gt;He copies some of Sarah&amp;rsquo;s email formatting logic because customers should see consistent information. Has to adjust it for the 160-character SMS limit, but the core logic is the same.&lt;/p&gt;



&lt;p&gt;Mike&amp;rsquo;s thinking:&amp;nbsp;&lt;em&gt;&amp;ldquo;There&amp;rsquo;s some duplication with the email code, but SMS is different enough that abstracting it would be premature. It&amp;rsquo;s only two notification types.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Deadline is tomorrow.&lt;/strong&gt;&amp;nbsp;This ships.&lt;/p&gt;



&lt;p&gt;Still nothing catastrophically wrong here. Two types, small duplication, it&amp;rsquo;s manageable.&lt;/p&gt;



&lt;p&gt;Right?&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Week 5: User Preferences&lt;/h2&gt;



&lt;p&gt;Customers start complaining.&lt;/p&gt;



&lt;p&gt;&amp;ldquo;I don&amp;rsquo;t want SMS notifications.&amp;rdquo;&lt;/p&gt;



&lt;p&gt;&amp;ldquo;Why am I getting emails for every status change?&amp;rdquo;&lt;/p&gt;



&lt;p&gt;Sarah adds user preferences. Creates a database table. Updates her email handler to check if the user wants that particular notification before sending.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;The handler triples in size.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Query the database. Check multiple preference flags. Handle the case where preferences don&amp;rsquo;t exist yet. Default values. Edge cases.&lt;/p&gt;



&lt;p&gt;Sarah&amp;rsquo;s thinking:&amp;nbsp;&lt;em&gt;&amp;ldquo;This is getting messy, but the deadline is tomorrow and this works. I&amp;rsquo;ll refactor it next sprint.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;I cannot tell you how many times I&amp;rsquo;ve heard &amp;ldquo;next sprint.&amp;rdquo;&lt;/p&gt;



&lt;p&gt;(Spoiler: next sprint never comes.)&lt;/p&gt;



&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.giphy.com/media/QMHoU66sBXqqLqYvGO/giphy.gif&quot; alt=&quot;This is fine dog meme - developer ignoring growing problems&quot;&gt;&lt;/figure&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Week 7: Two Ways to Do Everything&lt;/h2&gt;



&lt;p&gt;Mike needs to add notifications for order cancellations and delivery confirmations.&lt;/p&gt;



&lt;p&gt;He realizes hardcoding email bodies isn&amp;rsquo;t going to scale.&lt;/p&gt;



&lt;p&gt;So he builds a template system. Creates a templates directory. Writes a simple renderer. Updates his handlers to load templates, populate data, send.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;It&amp;rsquo;s actually pretty clean.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Meanwhile, Sarah&amp;rsquo;s handlers still use string formatting. She doesn&amp;rsquo;t know Mike built a template system. Mike didn&amp;rsquo;t announce it in Slack. It just&amp;hellip; exists now.&lt;/p&gt;



&lt;p&gt;The codebase now has&amp;nbsp;&lt;strong&gt;two different ways of generating notification content.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Sarah finds out later. Thinks:&amp;nbsp;&lt;em&gt;&amp;ldquo;I should probably switch to Mike&amp;rsquo;s templates&amp;hellip; but my code is working and I&amp;rsquo;m slammed with other features.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;And she is. Three new features this sprint. No time to refactor working code.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Week 9: The Third Approach&lt;/h2&gt;



&lt;p&gt;Emma joins the team.&lt;/p&gt;



&lt;p&gt;First task: add Slack notifications for the support team when high-value orders come in.&lt;/p&gt;



&lt;p&gt;She opens the notification code. Finds Sarah&amp;rsquo;s inline approach. Finds Mike&amp;rsquo;s templates.&amp;nbsp;&lt;strong&gt;Neither makes sense for Slack.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Slack needs structured JSON payloads, not formatted text.&lt;/p&gt;



&lt;p&gt;So Emma does what any good engineer would do: she creates a&amp;nbsp;&lt;strong&gt;&amp;ldquo;proper solution&amp;rdquo;.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Notification service class. Methods for each notification type. Handles destination-specific formatting internally. Clean. Testable. Well-designed.&lt;/p&gt;



&lt;p&gt;She shows it to the team in standup.&lt;/p&gt;



&lt;p&gt;Mike:&amp;nbsp;&lt;em&gt;&amp;ldquo;That&amp;rsquo;s nice, but I don&amp;rsquo;t have time to refactor my SMS code right now. Maybe later.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;Sarah:&amp;nbsp;&lt;em&gt;&amp;ldquo;I like it, but my code has been running in production for months. If it ain&amp;rsquo;t broke&amp;hellip;&amp;rdquo;&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;Emma&amp;rsquo;s service class gets used for Slack notifications.&amp;nbsp;&lt;strong&gt;Nothing else changes.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Now there are three ways to send notifications.&lt;/p&gt;



&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.giphy.com/media/l36kU80xPf0ojG0Erg/giphy.gif&quot; alt=&quot;Spider-Man pointing meme - three developers with different approaches&quot;&gt;&lt;/figure&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Week 12: The Chaos Compounds&lt;/h2&gt;



&lt;p&gt;Product wants:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Push notifications for the mobile app&lt;/li&gt;



&lt;li&gt;Digest emails (daily order summaries)&lt;/li&gt;



&lt;li&gt;Ability to snooze notifications&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Three developers. Three features. Same week.&lt;/p&gt;



&lt;p&gt;Each one discovers the existing fragmentation. Each one makes their own call.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Developer A&lt;/strong&gt;&amp;nbsp;tries to extend Sarah&amp;rsquo;s inline approach. Adds push notification logic directly in the handler.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Developer B&lt;/strong&gt;&amp;nbsp;uses Mike&amp;rsquo;s templates but creates a&amp;nbsp;&lt;strong&gt;new template format&lt;/strong&gt;&amp;nbsp;because the existing one doesn&amp;rsquo;t support digest layouts.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Developer C&lt;/strong&gt;&amp;nbsp;tries to use Emma&amp;rsquo;s service class but realizes it doesn&amp;rsquo;t handle scheduling or snoozing. So they add that logic directly in their handler instead.&lt;/p&gt;



&lt;p&gt;The notification preferences table is now being updated by&amp;nbsp;&lt;strong&gt;five different code paths.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Each developer added their own columns because they didn&amp;rsquo;t realize others had added similar fields. One stores preferences as JSON. Another uses boolean columns. Another created a&amp;nbsp;&lt;strong&gt;separate preferences table&lt;/strong&gt;&amp;nbsp;with foreign keys.&lt;/p&gt;



&lt;p&gt;I&amp;rsquo;ve seen this code review happen. Every PR gets approved. Every piece of code works.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Nobody did anything wrong.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;And yet.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;blockquote class=&quot;wp-block-quote is-layout-flow wp-block-quote-is-layout-flow&quot;&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;Every PR got approved. Every piece of code worked. Nobody did anything wrong. And yet.&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Week 15: Customer Complaints&lt;/h2&gt;



&lt;p&gt;Support tickets start flooding in.&lt;/p&gt;



&lt;p&gt;&amp;ldquo;I&amp;rsquo;m getting duplicate notifications.&amp;rdquo;&lt;/p&gt;



&lt;p&gt;&amp;ldquo;I disabled email but I&amp;rsquo;m still getting them.&amp;rdquo;&lt;/p&gt;



&lt;p&gt;&amp;ldquo;I&amp;rsquo;m not getting notifications at all for important orders.&amp;rdquo;&lt;/p&gt;



&lt;p&gt;Sarah investigates. Opens the codebase.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Six different code paths handle notifications.&lt;/strong&gt;&amp;nbsp;Some check preferences before sending. Some check during sending. Some don&amp;rsquo;t check at all because the developer assumed another layer was handling it.&lt;/p&gt;



&lt;p&gt;She finds the bug. It&amp;rsquo;s in her original email handler. The preference check is wrong.&lt;/p&gt;



&lt;p&gt;She fixes it. Deploys.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Three other notification types break.&lt;/strong&gt;&amp;nbsp;They were relying on her buggy behavior.&lt;/p&gt;



&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.giphy.com/media/3o7aCWJavAgtBzLWrS/giphy.gif&quot; alt=&quot;Domino effect - one bug fix breaks three other features&quot;&gt;&lt;/figure&gt;



&lt;p&gt;The team estimate to fix it properly:&amp;nbsp;&lt;em&gt;&amp;ldquo;We need to stop and refactor everything first, or we&amp;rsquo;ll just make it worse.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;Management: &amp;ldquo;We don&amp;rsquo;t have time for a refactor. Just fix the bugs.&amp;rdquo;&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Week 17: The Template Nightmare&lt;/h2&gt;



&lt;p&gt;Marketing wants to update email designs. New brand guidelines.&lt;/p&gt;



&lt;p&gt;The developer assigned to this opens the codebase.&lt;/p&gt;



&lt;p&gt;Templates are&amp;nbsp;&lt;strong&gt;everywhere.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Some in a&amp;nbsp;&lt;code&gt;/templates&lt;/code&gt;&amp;nbsp;directory. Some hardcoded as strings. Some in the database. Some fetched from an external CMS that one developer integrated without telling anyone.&lt;/p&gt;



&lt;p&gt;There&amp;rsquo;s no single source of truth.&lt;/p&gt;



&lt;p&gt;Worse: the data passed to templates is completely inconsistent.&lt;/p&gt;



&lt;p&gt;Email templates expect order objects with certain fields. SMS templates expect a flattened structure. Push notifications expect a completely different format.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;One design change requires touching dozens of files.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;The developer estimates: &amp;ldquo;Two weeks, maybe three.&amp;rdquo;&lt;/p&gt;



&lt;p&gt;Marketing: &amp;ldquo;It&amp;rsquo;s just a design update. How is that two weeks?&amp;rdquo;&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Week 20: Performance Crisis&lt;/h2&gt;



&lt;p&gt;Black Friday.&lt;/p&gt;



&lt;p&gt;The system crashes.&lt;/p&gt;



&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.giphy.com/media/1pA5hJo0ubWqG0cHqp/giphy.gif&quot; alt=&quot;Everything is on fire - Black Friday system crash&quot;&gt;&lt;/figure&gt;



&lt;p&gt;Investigation reveals: notification handlers are opening new database connections for&amp;nbsp;&lt;strong&gt;every single notification sent.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Some handlers properly close connections. Some don&amp;rsquo;t.&lt;/p&gt;



&lt;p&gt;Connection pools exhausted. Some handlers retry failed sends immediately and indefinitely,&amp;nbsp;&lt;strong&gt;amplifying the problem during the outage.&lt;/strong&gt;&amp;nbsp;One handler spawns a goroutine for each notification but never limits concurrency.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;The server runs out of memory processing a batch of 10,000 order confirmations.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Different developers made different assumptions about error handling.&lt;/p&gt;



&lt;p&gt;Some silently swallow errors and log them. Some retry with exponential backoff. Some fail fast. Some store failed notifications in one database table for retry. Others use a different table. One developer integrated a third-party queue system&amp;nbsp;&lt;strong&gt;that nobody else knew existed.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Notifications are getting lost between these systems.&lt;/p&gt;



&lt;p&gt;I&amp;rsquo;ve been on calls where the CTO asks: &amp;ldquo;How many notification systems do we have?&amp;rdquo;&lt;/p&gt;



&lt;p&gt;Nobody can answer.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Week 24: The Audit&lt;/h2&gt;



&lt;p&gt;Compliance team asks a simple question:&lt;/p&gt;



&lt;p&gt;&lt;em&gt;&amp;ldquo;Can you show us a record of all notifications sent to customer X in the past 90 days?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;The team cannot answer this.&lt;/p&gt;



&lt;p&gt;Notification logs are&amp;nbsp;&lt;strong&gt;scattered everywhere.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Some handlers log to stdout. Some to files. Some to a database table. Some don&amp;rsquo;t log at all.&lt;/p&gt;



&lt;p&gt;The log formats are completely different. Some include the full message content. Some just log &amp;ldquo;notification sent&amp;rdquo; without details. There&amp;rsquo;s no correlation between the notification and the triggering event.&lt;/p&gt;



&lt;p&gt;The auditor asks:&amp;nbsp;&lt;em&gt;&amp;ldquo;How do you ensure notifications contain required legal disclosures?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;Each template was created independently. Some include required legal text. Some don&amp;rsquo;t.&amp;nbsp;&lt;strong&gt;There&amp;rsquo;s no centralized enforcement.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;I&amp;rsquo;ve seen this audit happen. Teams spend weeks reconstructing logs manually.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;The Breaking Point&lt;/h2&gt;



&lt;p&gt;VP of Engineering asks for a simple feature:&lt;/p&gt;



&lt;p&gt;&lt;em&gt;&amp;ldquo;Add an unsubscribe link to all emails.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;The team estimates:&amp;nbsp;&lt;strong&gt;Three weeks.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;The VP is shocked.&lt;/p&gt;



&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.giphy.com/media/l3q2K5jinAlChoCLS/giphy.gif&quot; alt=&quot;Shocked reaction - three weeks to add an unsubscribe link?!&quot;&gt;&lt;/figure&gt;



&lt;p&gt;&amp;ldquo;It&amp;rsquo;s just adding a link. How is that three weeks of work?&amp;rdquo;&lt;/p&gt;



&lt;p&gt;The tech lead explains:&lt;/p&gt;



&lt;p&gt;&lt;em&gt;&amp;ldquo;We have seven different code paths that send emails. Each uses a different templating system. Some render templates on the server. Some fetch them from external systems. Some are hardcoded strings. We need to update each one individually, ensure the unsubscribe logic is consistent across all of them, add tracking for unsubscribe events, update the preferences system to handle unsubscribes properly, and test everything thoroughly because there&amp;rsquo;s no centralized testing strategy.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;Three weeks. For a link.&lt;/p&gt;



&lt;p&gt;The VP asks the obvious question:&amp;nbsp;&lt;strong&gt;&amp;ldquo;How did it get this bad?&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;What Went Wrong?&lt;/h2&gt;



&lt;p&gt;Here&amp;rsquo;s the thing that kills me about this story.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Nobody made a catastrophically bad decision.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Sarah&amp;rsquo;s Week 1 implementation was appropriate. Mike&amp;rsquo;s template system was a reasonable improvement. Emma&amp;rsquo;s service class was a genuine attempt to bring order.&lt;/p&gt;



&lt;p&gt;Every single developer was trying to do good work under deadline pressure.&lt;/p&gt;



&lt;p&gt;The problem wasn&amp;rsquo;t the individual decisions.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;It was the absence of a shared architectural vision.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Without clear boundaries and layers, each developer made reasonable local optimizations that created global chaos.&lt;/p&gt;



&lt;p&gt;The &amp;ldquo;I&amp;rsquo;ll refactor it later&amp;rdquo; moments never came because there was never a good time to stop feature development.&lt;/p&gt;



&lt;p&gt;The &amp;ldquo;let&amp;rsquo;s standardize this&amp;rdquo; conversations happened but never resulted in action because no one had time to migrate existing code.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;The codebase evolved organically.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;And organic growth without structure doesn&amp;rsquo;t produce a garden. It produces a weed-infested lot.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;&amp;ldquo;But This Is Just a Communication Problem&amp;rdquo;&lt;/h2&gt;



&lt;p&gt;You might be thinking: the real issue was that developers didn&amp;rsquo;t communicate.&lt;/p&gt;



&lt;p&gt;If Sarah and Mike had talked, they wouldn&amp;rsquo;t have built two different templating systems. If Emma had socialized her service class better, others would have adopted it.&lt;/p&gt;



&lt;p&gt;Better standups. Better code reviews. Better documentation.&amp;nbsp;&lt;strong&gt;That&amp;rsquo;s&lt;/strong&gt;&amp;nbsp;what was missing, not architecture.&lt;/p&gt;



&lt;p&gt;This is seductive because it&amp;rsquo;s partially true.&lt;/p&gt;



&lt;p&gt;But here&amp;rsquo;s why it misses the point:&amp;nbsp;&lt;strong&gt;architecture IS communication.&lt;/strong&gt;&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;blockquote class=&quot;wp-block-quote is-layout-flow wp-block-quote-is-layout-flow&quot;&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;Architecture IS communication. It&amp;rsquo;s the most important form of communication for technical decisions.&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;p&gt;It&amp;rsquo;s the most important form of communication for technical decisions.&lt;/p&gt;



&lt;p&gt;Think about what actually happened in the story.&lt;/p&gt;



&lt;p&gt;The team&amp;nbsp;&lt;strong&gt;DID communicate.&lt;/strong&gt;&amp;nbsp;Mike showed his template system in code review. Emma presented her service class and got positive feedback. They had a meeting in Week 11 trying to align on standards.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;The communication happened.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;What didn&amp;rsquo;t happen was turning those conversations into durable, enforceable decisions.&lt;/p&gt;



&lt;p&gt;This is the key difference:&lt;/p&gt;



&lt;p&gt;Conversation says&amp;nbsp;&lt;em&gt;&amp;ldquo;we should probably do X.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;Architecture says&amp;nbsp;&lt;em&gt;&amp;ldquo;X is how we do things here, and here&amp;rsquo;s where it lives.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;blockquote class=&quot;wp-block-quote is-layout-flow wp-block-quote-is-layout-flow&quot;&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;Conversation is ephemeral. Architecture is the artifact that persists after the meeting ends.&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;p&gt;When a new developer joins and asks &amp;ldquo;where should notification logic go?&amp;rdquo;, the answer shouldn&amp;rsquo;t require scheduling a meeting or hunting through Slack history.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;It should be obvious from looking at the codebase.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Communication without architecture leads to the problem Emma faced. She built something good. People agreed it was good. And then&amp;hellip;&amp;nbsp;&lt;strong&gt;nothing changed.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Without architectural decisions being explicitly made (&lt;em&gt;&amp;ldquo;from now on, all notifications go through NotificationService&amp;rdquo;&lt;/em&gt;), the good idea just becomes another option in an increasingly fragmented codebase.&lt;/p&gt;



&lt;p&gt;Good communication can prevent chaos. But it can&amp;rsquo;t survive bad processes.&lt;/p&gt;



&lt;p&gt;When developers are under deadline pressure, working on different features, joining the team at different times,&amp;nbsp;&lt;strong&gt;communication will have gaps.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Architecture is the safety net for when communication fails.&lt;/p&gt;



&lt;p&gt;It&amp;rsquo;s the shared context that makes it possible to work somewhat independently without creating complete divergence.&lt;/p&gt;



&lt;p&gt;So yes, the team in our story could have communicated better.&lt;/p&gt;



&lt;p&gt;But the solution isn&amp;rsquo;t&amp;nbsp;&lt;em&gt;&amp;ldquo;communicate more.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;It&amp;rsquo;s &amp;ldquo;communicate the architecture and make it stick.&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Document where things belong. Make architectural decisions explicit. Enforce them in code review. Build structure that persists beyond any individual conversation.&lt;/p&gt;



&lt;p&gt;Because at the end of the day, you can have all the Slack channels and standups and retros you want.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Without a shared architectural foundation, you&amp;rsquo;re just having the same conversations over and over while the codebase continues to fragment.&lt;/strong&gt;&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;What Should Have Happened in Week 1&lt;/h2&gt;



&lt;p&gt;Sarah should have spent 30 minutes writing this:&lt;/p&gt;



&lt;pre class=&quot;wp-block-code&quot;&gt;&lt;code&gt;# Notification System Architecture

## Where Things Live
- All notification logic &amp;rarr; services/notification_service.py
- Templates &amp;rarr; templates/ directory (Jinja2 format)
- Preference checks &amp;rarr; services/preference_service.py
- Delivery logging &amp;rarr; notification_log table

## How to Add a New Notification Type
1. Add template to templates/
2. Add method to NotificationService
3. Log delivery attempt (success or failure)
4. Add tests to test_notification_service.py

## Error Handling
- Retries: 3 attempts with exponential backoff (1s, 2s, 4s)
- Failed sends &amp;rarr; dead_letter_queue table
- All errors logged with correlation ID

## Preferences
- Check preferences BEFORE sending (not during)
- Default: all notifications enabled
- Unsubscribe &amp;rarr; set all preferences to false
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;strong&gt;That&amp;rsquo;s it.&lt;/strong&gt;&amp;nbsp;30 minutes of work. Would have saved months of chaos.&lt;/p&gt;



&amp;lt;hr class=&quot;wp-block-separator has-alpha-channel-
</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/12256/a-tale-of-accidental-architecture-how-50-lines-became-a-black-friday-disaster</guid>
<pubDate>Sat, 28 Feb 2026 03:46:54 +0000</pubDate>
</item>
<item>
<title>Nobody Knows How to Estimate Software Anymore (And It’s Not Your Fault)</title>
<link>https://coderlegion.com/11718/nobody-knows-how-to-estimate-software-anymore-and-its-not-your-fault</link>
<description>
&lt;p&gt;Here&amp;rsquo;s a pattern I keep seeing (and living):&lt;/p&gt;
&lt;p&gt;A feature that would have taken 2-3 weeks gets estimated at &amp;ldquo;2 days with AI.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;It ships in 4. Sometimes 5.&lt;/p&gt;
&lt;p&gt;Not because the AI was slow. Because there are three other &amp;ldquo;2-day AI projects&amp;rdquo; running simultaneously. Each one spiraling into bugs, edge cases, and integration issues nobody saw coming. Context-switching between half-finished features, fighting fires, somehow falling behind on all of them.&lt;/p&gt;
&lt;p&gt;The AI writes code faster than any human could.&lt;/p&gt;
&lt;p&gt;But we&amp;rsquo;re not shipping faster. We&amp;rsquo;re drowning.&lt;/p&gt;
&lt;p&gt;And here&amp;rsquo;s the uncomfortable part: we&amp;rsquo;re doing this to ourselves.&lt;/p&gt;
&lt;h2&gt;The Promise vs The Reality&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ve seen the headlines. AI coding tools boost productivity by 39%. Developers are shipping faster than ever. The future is here.&lt;/p&gt;
&lt;p&gt;What they don&amp;rsquo;t tell you is what happens next.&lt;/p&gt;
&lt;p&gt;Your manager sees those numbers too. And if AI makes you 39% more productive, why can&amp;rsquo;t you handle 60% more work? Why are estimates still slipping? Why are bugs still happening?&lt;/p&gt;
&lt;p&gt;The math doesn&amp;rsquo;t add up. And you&amp;rsquo;re stuck in the middle trying to explain why &amp;ldquo;AI writes the code&amp;rdquo; doesn&amp;rsquo;t mean &amp;ldquo;features appear instantly.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what the data actually shows:&lt;/p&gt;
&lt;p&gt;A UC Berkeley study found that &lt;strong&gt;AI doesn&amp;rsquo;t reduce work, it intensifies it.&lt;/strong&gt; One developer they interviewed said it perfectly: &amp;ldquo;You thought maybe you&amp;rsquo;d work less with AI. But you don&amp;rsquo;t work less. You just work the same amount or even more.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;TechCrunch reported last week: teams adopting AI workflows saw &lt;strong&gt;expectations triple, stress triple, but actual productivity only go up by maybe 10%.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And here&amp;rsquo;s the kicker: a METR study found developers &lt;em&gt;expected&lt;/em&gt; AI to speed them up by 24%. In reality? &lt;strong&gt;It slowed them down.&lt;/strong&gt; But they still &lt;em&gt;believed&lt;/em&gt; it made them 20% faster.&lt;/p&gt;
&lt;p&gt;The gap between perception and reality is dangerous. And most of us are living in it.&lt;/p&gt;
&lt;h2&gt;The High Expectations Problem&lt;/h2&gt;
&lt;p&gt;This isn&amp;rsquo;t just coming from management.&lt;/p&gt;
&lt;p&gt;Yes, leadership hears &amp;ldquo;AI can write massive amounts of code&amp;rdquo; and expects you to prompt your way through multiple features in no time. First try, maybe second. They don&amp;rsquo;t understand how AI actually works.&lt;/p&gt;
&lt;p&gt;But here&amp;rsquo;s the honest truth: &lt;strong&gt;we don&amp;rsquo;t either.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I thought I did. I thought &amp;ldquo;AI writes the code, I review it, we ship it&amp;rdquo; was the workflow. But that&amp;rsquo;s not what happens.&lt;/p&gt;
&lt;p&gt;What happens is: AI writes the code. I start reviewing it. I find issues. I ask the AI to fix them. It creates new issues. I start another feature while waiting. That one has issues too. Now I&amp;rsquo;m juggling three half-finished features, each with its own set of AI-generated bugs I&amp;rsquo;m trying to understand and fix.&lt;/p&gt;
&lt;p&gt;The promise was velocity. The reality is fragmentation.&lt;/p&gt;
&lt;p&gt;And I keep saying yes to more because &amp;ldquo;it&amp;rsquo;s just AI, how hard can it be?&amp;rdquo; But the cognitive load of reviewing, validating, debugging, and integrating AI code across multiple parallel tracks is crushing.&lt;/p&gt;
&lt;p&gt;Every feature &lt;em&gt;looks&lt;/em&gt; 80% done. None of them actually ship.&lt;/p&gt;
&lt;h2&gt;The Estimation Trap&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the confession I don&amp;rsquo;t want to make: &lt;strong&gt;I have no idea how to estimate tasks anymore.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Developers have always struggled with estimation. We underestimate until we get burned enough times to realize &amp;ldquo;add a simple feature&amp;rdquo; is never simple when there&amp;rsquo;s an existing codebase involved.&lt;/p&gt;
&lt;p&gt;But AI broke our calibration completely.&lt;/p&gt;
&lt;p&gt;A task that used to take 3 days now takes&amp;hellip; 2 hours? 4 days? Both? Neither? It depends on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How well I can describe what I want&lt;/li&gt;
&lt;li&gt;How many edge cases the AI misses&lt;/li&gt;
&lt;li&gt;How much integration complexity exists&lt;/li&gt;
&lt;li&gt;Whether the AI understands the existing patterns&lt;/li&gt;
&lt;li&gt;How many iterations it takes to get it right&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So now I swing between two extremes:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Under-estimating&lt;/strong&gt; because &amp;ldquo;AI will handle it&amp;rdquo; &amp;mdash; then spending 3 days debugging what the AI generated in 20 minutes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Over-estimating&lt;/strong&gt; because &amp;ldquo;who knows what AI will break&amp;rdquo; &amp;mdash; then looking slow when it actually works the first time.&lt;/p&gt;
&lt;p&gt;The old rules don&amp;rsquo;t apply. New ones haven&amp;rsquo;t emerged. And this isn&amp;rsquo;t just an academic problem:&lt;/p&gt;
&lt;p&gt;Sprint planning becomes guesswork. Roadmaps turn into fiction. Technical debt compounds faster than we can track it. Trust erodes when commitments slip repeatedly.&lt;/p&gt;
&lt;p&gt;When someone asks &amp;ldquo;how long will this take?&amp;rdquo; the honest answer is often &amp;ldquo;I don&amp;rsquo;t know anymore.&amp;rdquo;&lt;/p&gt;
&lt;h2&gt;The Hidden Costs Nobody&amp;rsquo;s Talking About&lt;/h2&gt;
&lt;p&gt;The expectation problem is obvious once you see it. But there are other traps hiding underneath:&lt;/p&gt;
&lt;h3&gt;You&amp;rsquo;re Not Writing Code Anymore. You&amp;rsquo;re Validating It.&lt;/h3&gt;
&lt;p&gt;One researcher described it perfectly: &amp;ldquo;A senior developer with Copilot doesn&amp;rsquo;t become a code-writing machine. They become a &lt;strong&gt;code-validation machine&lt;/strong&gt;.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;When AI generates 40% more code, you have 40% more code to review. But reviewing AI code is different than reviewing human code. Humans make predictable mistakes. AI makes plausible-sounding nonsense that looks right until you run it.&lt;/p&gt;
&lt;p&gt;Context switching between your work and reviewing AI output costs 20-30% of your focus &lt;em&gt;per switch&lt;/em&gt;. When you&amp;rsquo;re juggling multiple AI-started features, you&amp;rsquo;re switching constantly.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re not more productive. You&amp;rsquo;re just more exhausted.&lt;/p&gt;
&lt;h3&gt;You Say Yes to Everything&lt;/h3&gt;
&lt;p&gt;AI makes tasks that used to be &amp;ldquo;too expensive&amp;rdquo; feel trivial. So you say yes to things you would have declined or delegated.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Can you add that dashboard feature?&amp;rdquo;&lt;br&gt;
&amp;ldquo;Sure, AI can knock that out.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Can you refactor that module?&amp;rdquo;&lt;br&gt;
&amp;ldquo;Yeah, should be quick with AI.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Can you investigate that performance issue?&amp;rdquo;&lt;br&gt;
&amp;ldquo;I&amp;rsquo;ll have AI profile it.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Harvard Business Review calls this &lt;strong&gt;work intensification&lt;/strong&gt;: AI doesn&amp;rsquo;t reduce your workload, it makes you take on more.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re not automating your way to free time. You&amp;rsquo;re automating your way to more commitments.&lt;/p&gt;
&lt;h3&gt;The Quality-Speed Death Spiral&lt;/h3&gt;
&lt;p&gt;Here&amp;rsquo;s how it compounds:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;AI gives you an initial productivity surge&lt;/li&gt;
&lt;li&gt;That surge creates expectations for speed&lt;/li&gt;
&lt;li&gt;Speed pressure leads to cutting corners on review&lt;/li&gt;
&lt;li&gt;Lower quality creates more bugs&lt;/li&gt;
&lt;li&gt;More bugs mean more debugging and rework&lt;/li&gt;
&lt;li&gt;Debugging takes longer because you didn&amp;rsquo;t write the code&lt;/li&gt;
&lt;li&gt;You fall behind, pressure increases, quality drops further&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The Berkeley researchers warned: &amp;ldquo;The productivity surge enjoyed at the beginning can give way to lower quality work, turnover, and other problems.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;This is happening right now across teams. Features ship that &amp;ldquo;work,&amp;rdquo; but the developers don&amp;rsquo;t fully understand how. When they break, debugging becomes an archaeology project through code nobody wrote and barely reviewed. That&amp;rsquo;s not faster. That&amp;rsquo;s deferred pain.&lt;/p&gt;
&lt;h2&gt;What This Actually Feels Like&lt;/h2&gt;
&lt;p&gt;A software engineer named Siddhant Khare wrote about &amp;ldquo;AI fatigue&amp;rdquo; last week. It resonated with me immediately because &lt;strong&gt;it&amp;rsquo;s real and nobody talks about it&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;AI-era burnout doesn&amp;rsquo;t look like working 80-hour weeks. It looks like:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Decision fatigue&lt;/strong&gt; from validating endless AI outputs. Every line might be wrong. Every function might have a subtle bug. You can&amp;rsquo;t just skim.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cognitive load&lt;/strong&gt; from juggling multiple AI-started initiatives. Each one 80% done. None actually shipping.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Imposter syndrome&lt;/strong&gt; when you can&amp;rsquo;t tell if you&amp;rsquo;re productive or just busy. You wrote 3,000 lines this week. Zero features shipped. Are you slow? Or is the process broken?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anxiety&lt;/strong&gt; from commitments you can&amp;rsquo;t estimate. You said 2 days. It&amp;rsquo;s been 4. The AI generated the code in 20 minutes and you&amp;rsquo;ve been debugging it ever since.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Guilt&lt;/strong&gt; for not keeping up. Everyone else seems to be shipping faster with AI. Why aren&amp;rsquo;t you?&lt;/p&gt;
&lt;p&gt;The research shows that some developers see burnout risk drop 17% with AI &amp;mdash; but only if their workload doesn&amp;rsquo;t increase to fill the gap.&lt;/p&gt;
&lt;p&gt;In practice? Workload always increases.&lt;/p&gt;
&lt;h2&gt;The Team Lead&amp;rsquo;s Nightmare&lt;/h2&gt;
&lt;p&gt;If estimating one AI-assisted task is this chaotic, imagine coordinating an entire team.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re trying to plan a sprint. Every developer gives you an estimate. Half of them are wildly optimistic because &amp;ldquo;AI will handle it.&amp;rdquo; The other half are padding heavily because they&amp;rsquo;ve been burned.&lt;/p&gt;
&lt;p&gt;You don&amp;rsquo;t know which estimates to trust. You don&amp;rsquo;t know how to aggregate them into a roadmap. You don&amp;rsquo;t know how to explain to stakeholders why the team that just adopted &amp;ldquo;productivity-boosting AI tools&amp;rdquo; is still missing deadlines.&lt;/p&gt;
&lt;p&gt;And when the sprint ends? Half the stories are &amp;ldquo;80% done.&amp;rdquo; A quarter shipped but with bugs. The rest are stuck in AI-generated complexity no one fully understands.&lt;/p&gt;
&lt;p&gt;Tech leads are stuck in the middle. Can&amp;rsquo;t estimate their own AI-assisted work. Somehow supposed to help the team estimate theirs.&lt;/p&gt;
&lt;p&gt;Sprint planning feels like collective guessing. Retrospectives turn into &amp;ldquo;we don&amp;rsquo;t know what went wrong, the AI just&amp;hellip; took longer than expected.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The only solution I&amp;rsquo;ve found is the boring one: go back to basics.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Estimate anyway. Even if it&amp;rsquo;s totally wrong.&lt;br&gt;
Run retrospectives. Understand what actually happened.&lt;br&gt;
Repeat every cycle. Gather data.&lt;br&gt;
Adjust future estimates based on reality, not hope.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s unglamorous. It&amp;rsquo;s slow. But it&amp;rsquo;s the only path I see to understanding our true capacity with AI.&lt;/p&gt;
&lt;p&gt;You can&amp;rsquo;t optimize what you don&amp;rsquo;t measure. And right now, most teams aren&amp;rsquo;t measuring anything except &amp;ldquo;we&amp;rsquo;re using AI, we should be faster.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;After enough cycles, patterns emerge:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI features that touch legacy code take 3x longer than expected&lt;/li&gt;
&lt;li&gt;Net-new features hit estimates more reliably&lt;/li&gt;
&lt;li&gt;Code review adds 40% to any AI-heavy story&lt;/li&gt;
&lt;li&gt;Integration work still takes the same time regardless of AI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this is in the &amp;ldquo;AI boosts productivity 39%&amp;rdquo; headline. But it&amp;rsquo;s the reality of coordinating a team in the AI era.&lt;/p&gt;
&lt;p&gt;The boring strategies we&amp;rsquo;ve always used &amp;mdash; estimate, measure, learn, adjust &amp;mdash; they still work. They&amp;rsquo;re just slower to calibrate now because the variables changed.&lt;/p&gt;
&lt;h2&gt;What I&amp;rsquo;m Trying (Not Prescribing)&lt;/h2&gt;
&lt;p&gt;I don&amp;rsquo;t have this figured out. Nobody does yet. But here&amp;rsquo;s what&amp;rsquo;s helping in my experience:&lt;/p&gt;
&lt;h3&gt;The One-Thing Rule&lt;/h3&gt;
&lt;p&gt;Stop saying yes to multiple simultaneous AI features. One thing from start to shipped before starting the next.&lt;/p&gt;
&lt;p&gt;Does it feel slower? Yes.&lt;br&gt;
Do you actually ship more? Also yes.&lt;/p&gt;
&lt;p&gt;Multiple AI-started initiatives feel like progress until nothing&amp;rsquo;s actually done. Finishing one thing beats starting five.&lt;/p&gt;
&lt;h3&gt;Honest Estimates&lt;/h3&gt;
&lt;p&gt;When someone asks &amp;ldquo;how long will this take?&amp;rdquo; stop giving the optimistic AI-boosted number.&lt;/p&gt;
&lt;p&gt;Instead: &amp;ldquo;AI might generate it in an hour. Integration and debugging might take 3 days. Estimate 4 days to be safe.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;It feels slow. But estimates stop slipping constantly. And trust improves.&lt;/p&gt;
&lt;h3&gt;The Validation Budget&lt;/h3&gt;
&lt;p&gt;Timebox AI code review. If you can&amp;rsquo;t fully understand and validate what the AI built in the time it would have taken to write it yourself, don&amp;rsquo;t use the AI code.&lt;/p&gt;
&lt;p&gt;Sounds counterintuitive. But reviewing 800 lines of AI code you don&amp;rsquo;t understand for 6 hours defeats the purpose. Sometimes writing 200 lines yourself in 4 hours is actually faster.&lt;/p&gt;
&lt;h3&gt;Measuring What Matters&lt;/h3&gt;
&lt;p&gt;Stop tracking lines of code or features started. Track instead:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Features actually in production&lt;/li&gt;
&lt;li&gt;Bugs introduced per feature&lt;/li&gt;
&lt;li&gt;Time from &amp;ldquo;start&amp;rdquo; to &amp;ldquo;shipped&amp;rdquo; (not &amp;ldquo;AI generated code&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;Team stress level (are people sleeping okay?)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The numbers are uncomfortable. But they&amp;rsquo;re honest.&lt;/p&gt;
&lt;h3&gt;Using Speed for Quality, Not Quantity&lt;/h3&gt;
&lt;p&gt;When AI genuinely saves time, spend that time on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Better tests&lt;/li&gt;
&lt;li&gt;Clearer documentation&lt;/li&gt;
&lt;li&gt;Paying down technical debt&lt;/li&gt;
&lt;li&gt;Deeper thinking on architecture&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not just &amp;ldquo;more features.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The productivity gain is real. The question is: who captures it? If it all goes to &amp;ldquo;more output for the same salary,&amp;rdquo; you&amp;rsquo;re on a treadmill. If some goes to making work better and more sustainable, everyone might actually benefit.&lt;/p&gt;
&lt;h3&gt;At the Team Level: The Data Discipline&lt;/h3&gt;
&lt;p&gt;For tech leads and managers, the same boring-but-effective cycle applies:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Estimate&lt;/strong&gt; &amp;mdash; Even when it feels like guessing. Get the team&amp;rsquo;s best guess on record.&lt;br&gt;
&lt;strong&gt;Measure&lt;/strong&gt; &amp;mdash; Track actual time, not AI generation time. Start to shipped, not start to &amp;ldquo;AI wrote code.&amp;rdquo;&lt;br&gt;
&lt;strong&gt;Retrospect&lt;/strong&gt; &amp;mdash; What took longer than expected? What patterns are emerging?&lt;br&gt;
&lt;strong&gt;Adjust&lt;/strong&gt; &amp;mdash; Use the data. If AI stories touching legacy code are consistently 3x estimates, factor that in next sprint.&lt;/p&gt;
&lt;p&gt;After 4-5 cycles, you start seeing your team&amp;rsquo;s actual capacity with AI. Not the theoretical 39% boost. The real number.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s slower than anyone wants. But it&amp;rsquo;s the only path to honest planning.&lt;/p&gt;
&lt;h2&gt;The Uncomfortable Question&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s what I keep coming back to:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The 39% productivity gain might be real. But who&amp;rsquo;s capturing it?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Your company captures it as more output for the same salary.&lt;br&gt;
Your manager captures it as more ambitious roadmaps.&lt;br&gt;
The market captures it as higher expectations.&lt;/p&gt;
&lt;p&gt;You capture&amp;hellip; what? More stress? More context-switching? More debugging code you didn&amp;rsquo;t write?&lt;/p&gt;
&lt;p&gt;Unless you actively defend your boundaries, AI productivity tools become productivity &lt;em&gt;traps&lt;/em&gt; &amp;mdash; a treadmill that speeds up but never lets you off.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t want to sound cynical. AI is genuinely powerful. I use it every day. But the default path is work intensification, not work reduction. And if you don&amp;rsquo;t choose differently, the default will choose for you.&lt;/p&gt;
&lt;h2&gt;A Different Path&lt;/h2&gt;
&lt;p&gt;What if AI augmentation wasn&amp;rsquo;t about doing &lt;em&gt;more&lt;/em&gt;? What if it was about doing &lt;em&gt;better&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;What if productivity gains went toward:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deeper thinking on hard problems&lt;/li&gt;
&lt;li&gt;Mentoring junior developers&lt;/li&gt;
&lt;li&gt;Paying down technical debt&lt;/li&gt;
&lt;li&gt;Building more resilient systems&lt;/li&gt;
&lt;li&gt;Actually shipping polished features instead of half-finished experiments&lt;/li&gt;
&lt;li&gt;Sustainable pace instead of constant sprinting&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The technology is powerful. The question is: &lt;strong&gt;who decides what that power is for?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Right now, the default answer is &amp;ldquo;more output.&amp;rdquo; But you can choose differently.&lt;/p&gt;
&lt;p&gt;You can say no to the fifth simultaneous initiative.&lt;br&gt;
You can give honest estimates instead of optimistic ones.&lt;br&gt;
You can spend AI-gained time on quality instead of quantity.&lt;br&gt;
You can protect your boundaries instead of filling every efficiency gain with new commitments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The 39% productivity trap is only a trap if you don&amp;rsquo;t see it coming.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now you do.&lt;/p&gt;
&lt;h2&gt;What&amp;rsquo;s Next&lt;/h2&gt;
&lt;p&gt;This is still being figured out across the industry. Some weeks teams ship fast and feel great. Other weeks they&amp;rsquo;re drowning in half-finished AI features and wondering what went wrong.&lt;/p&gt;
&lt;p&gt;But patterns are emerging. Data is being gathered. Teams are learning to say no more often. And slowly, the industry is learning to use AI as a tool for better work, not just more work.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re feeling this too &amp;mdash; the expectations, the estimation chaos, the validation treadmill &amp;mdash; you&amp;rsquo;re not slow. You&amp;rsquo;re not behind. The system is broken, and you&amp;rsquo;re just the first to notice.&lt;/p&gt;
&lt;p&gt;The question is: what are you going to do about it?&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;If this resonated with you, I&amp;rsquo;d love to hear your experience. Are you in the productivity trap too? What are you trying? Find me on &lt;a rel=&quot;nofollow&quot; href=&quot;https://linkedin.com/in/pachecothiago&quot;&gt;LinkedIn&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Further Reading:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TechCrunch: &lt;a rel=&quot;nofollow&quot; href=&quot;https://techcrunch.com/2026/02/09/the-first-signs-of-burnout-are-coming-from-the-people-who-embrace-ai-the-most/&quot;&gt;&amp;ldquo;The first signs of burnout are coming from the people who embrace AI the most&amp;rdquo;&lt;/a&gt; (Feb 2026)&lt;/li&gt;
&lt;li&gt;Harvard Business Review: &lt;a rel=&quot;nofollow&quot; href=&quot;https://hbr.org/2026/02/ai-doesnt-reduce-work-it-intensifies-it&quot;&gt;&amp;ldquo;AI Doesn&amp;rsquo;t Reduce Work&amp;mdash;It Intensifies It&amp;rdquo;&lt;/a&gt; (Feb 2026)&lt;/li&gt;
&lt;li&gt;Fortune: &lt;a rel=&quot;nofollow&quot; href=&quot;https://fortune.com/2026/02/10/ai-future-of-work-white-collar-employees-technology-productivity-burnout-research-uc-berkeley/&quot;&gt;&amp;ldquo;AI is having the opposite effect it was supposed to&amp;rdquo;&lt;/a&gt; (Feb 2026)&lt;/li&gt;
&lt;li&gt;METR: &lt;a rel=&quot;nofollow&quot; href=&quot;https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/&quot;&gt;&amp;ldquo;Measuring the Impact of Early-2025 AI on Developer Productivity&amp;rdquo;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Business Insider: &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.businessinsider.com/ai-fatigue-burnout-software-engineer-essay-siddhant-khare-2026-2&quot;&gt;&amp;ldquo;AI fatigue is real and nobody talks about it&amp;rdquo;&lt;/a&gt; (Feb 2026)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; href=&quot;https://sudoish.com/nobody-knows-how-to-estimate-software-anymore/&quot;&gt;Nobody Knows How to Estimate Software Anymore (And It&amp;rsquo;s Not Your Fault)&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; href=&quot;https://sudoish.com&quot;&gt;sudoish&lt;/a&gt;.&lt;/p&gt;

</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/11718/nobody-knows-how-to-estimate-software-anymore-and-its-not-your-fault</guid>
<pubDate>Mon, 16 Feb 2026 01:23:57 +0000</pubDate>
</item>
<item>
<title>The Review Bottleneck: Why AI Explanations Are Making Us Trust Less, Not More</title>
<link>https://coderlegion.com/11595/the-review-bottleneck-why-ai-explanations-are-making-us-trust-less-not-more</link>
<description>
&lt;p&gt;Last week I spent 3 hours reviewing code that took 20 minutes to write.&lt;/p&gt;
&lt;p&gt;The AI was faster. The review wasn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;And I&amp;rsquo;m starting to realize: that&amp;rsquo;s the problem.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Less coding, more engineering.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I keep hearing this phrase everywhere. The idea is simple: AI handles the coding, so developers focus on the higher-level work. The engineering. The architecture. The review.&lt;/p&gt;
&lt;p&gt;But here&amp;rsquo;s what nobody&amp;rsquo;s talking about: AI isn&amp;rsquo;t just writing the code anymore. It&amp;rsquo;s reviewing it too.&lt;/p&gt;
&lt;p&gt;And the paradox is obvious once you see it: AI generates code faster, but reviewing it takes longer than ever.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what those 3 hours looked like:&lt;/p&gt;
&lt;p&gt;I read through 300 lines of code carefully. Checked the tests. Verified the logic flow. Examined edge cases.&lt;/p&gt;
&lt;p&gt;But that was only the first hour.&lt;/p&gt;
&lt;p&gt;The next two hours? Reading AI-generated explanations. Reviewing the AI code reviewer&amp;rsquo;s feedback. Cross-referencing the AI&amp;rsquo;s architectural justifications with the actual implementation. Trying to reconcile conflicting suggestions from different AI systems.&lt;/p&gt;
&lt;p&gt;By the end, I understood the code. But I&amp;rsquo;d spent more time processing AI commentary than reviewing actual logic.&lt;/p&gt;
&lt;p&gt;And here&amp;rsquo;s what bothered me: I see people in the industry are approving similar PRs in 20 minutes.&lt;/p&gt;
&lt;p&gt;Are they reading all of this? Or are they skimming the AI explanations and trusting by default?&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m pretty sure it&amp;rsquo;s the second one.&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t about being thorough versus lazy. It&amp;rsquo;s a recognition of something shifting.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;300 lines of actual code&lt;/li&gt;
&lt;li&gt;1,200 words of AI-generated explanation&lt;/li&gt;
&lt;li&gt;800 words of AI code review feedback&lt;/li&gt;
&lt;li&gt;15 inline comments from the AI about trade-offs and alternatives&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;I had more documentation to review than code.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;300 lines&lt;/strong&gt; of actual implementation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2,000+ words&lt;/strong&gt; of AI-generated commentary&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The code was the easy part. The cognitive load came from synthesizing multiple AI perspectives, each confident, each reasonable-sounding, some subtly contradicting each other.&lt;/p&gt;
&lt;p&gt;The tests passed. The linting passed. The AI explanations sounded reasonable. The AI reviewer&amp;rsquo;s concerns seemed addressed.&lt;/p&gt;
&lt;p&gt;So I trusted the process and moved on.&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s becoming the norm.&lt;/p&gt;
&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.tenor.com/QGrYb0YqJtAAAAAC/the-office-michael-scott.gif&quot; alt=&quot;&quot;&gt;&lt;/figure&gt;
&lt;p&gt;I&amp;rsquo;m not alone.&lt;/p&gt;
&lt;p&gt;At Anthropic&amp;mdash;the company building Claude&amp;mdash;engineers are generating 2,000 to 3,000 line pull requests regularly. Mike Krieger, their Chief Product Officer, openly admits: &amp;ldquo;pretty much 100%&amp;rdquo; of their code is now AI-generated.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And they&amp;rsquo;re using Claude to review it too.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Boris Cherny, head of Anthropic&amp;rsquo;s Claude Code team, hasn&amp;rsquo;t written a single line of code in over two months. He shipped 22 pull requests in one day, 27 the next.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Each one 100% written by Claude.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t the future. It&amp;rsquo;s happening right now, at the companies building the AI tools we&amp;rsquo;re all using.&lt;/p&gt;
&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.tenor.com/huPDQPlwrPUAAAAC/pheobe-wow.gif&quot; alt=&quot;&quot;&gt;&lt;/figure&gt;
&lt;h2&gt;The Confidence Trap&lt;/h2&gt;
&lt;p&gt;Code reviews were already hard. They required skill, domain knowledge, and patience.&lt;/p&gt;
&lt;p&gt;Now multiply that by the sheer volume AI generates.&lt;/p&gt;
&lt;p&gt;But volume isn&amp;rsquo;t even the real issue.&lt;/p&gt;
&lt;p&gt;The real issue is that AI writes &lt;strong&gt;confident&lt;/strong&gt; code. It comes with detailed explanations. Trade-off analysis. References. Architecture justifications.&lt;/p&gt;
&lt;p&gt;Enough well-articulated reasoning to make everything sound sensible.&lt;/p&gt;
&lt;p&gt;When you look at a 500-line PR with a 2,000-word explanation of why every decision was made, the cognitive load is enormous.&lt;/p&gt;
&lt;p&gt;You can dig in and verify every claim.&lt;/p&gt;
&lt;p&gt;Or you can trust that the explanation sounds reasonable and move on.&lt;/p&gt;
&lt;p&gt;Most developers are choosing &amp;ldquo;move on.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s where we are:&lt;/p&gt;
&lt;p&gt;Claude Code and Codex are generating code at unprecedented scale. &lt;strong&gt;46% of developers&amp;rsquo; code&lt;/strong&gt; is now AI-written across major tools like Claude Code, Codex, and GitHub Copilot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;84% of developers&lt;/strong&gt; use AI coding tools regularly.&lt;/p&gt;
&lt;p&gt;And here&amp;rsquo;s the kicker: while AI generates nearly half our code, &lt;strong&gt;only 30% of AI-suggested code actually gets accepted&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The rest gets rejected during review&amp;mdash;or should get rejected.&lt;/p&gt;
&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.tenor.com/N7Ppha1LglAAAAAC/brooklyn99-papers.gif&quot; alt=&quot;&quot;&gt;&lt;/figure&gt;
&lt;h2&gt;Then We Added AI Code Review&lt;/h2&gt;
&lt;p&gt;So teams did the obvious thing: bring in AI code review tools.&lt;/p&gt;
&lt;p&gt;Now every PR has:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The AI-generated code (500 lines)&lt;/li&gt;
&lt;li&gt;The AI&amp;rsquo;s explanation of what it built and why (2,000 words)&lt;/li&gt;
&lt;li&gt;The AI reviewer&amp;rsquo;s analysis (another 1,500 words)&lt;/li&gt;
&lt;li&gt;Sometimes multiple AI reviewers, each with their own opinions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You&amp;rsquo;re staring at 4,000+ words of confident, reasonable-sounding explanations from multiple AI systems.&lt;/p&gt;
&lt;p&gt;All of it well-structured. All of it articulate. Much of it contradicting itself in subtle ways.&lt;/p&gt;
&lt;p&gt;And you&amp;rsquo;re supposed to synthesize all of this, make a judgment call, and approve or reject.&lt;/p&gt;
&lt;p&gt;What actually happens?&lt;/p&gt;
&lt;p&gt;You skim the AI&amp;rsquo;s explanation. You skim the AI reviewer&amp;rsquo;s comments. If they roughly agree and the tests pass, you approve it.&lt;/p&gt;
&lt;p&gt;The AI&amp;rsquo;s confidence became your confidence by default.&lt;/p&gt;
&lt;p&gt;Research confirms what we all feel: AI-generated code creates &lt;strong&gt;1.7x more issues&lt;/strong&gt; than human-written code.&lt;/p&gt;
&lt;p&gt;Unclear naming. Mismatched terminology. Generic identifiers everywhere.&lt;/p&gt;
&lt;p&gt;All of it increasing cognitive load for reviewers.&lt;/p&gt;
&lt;p&gt;And here&amp;rsquo;s the kicker: all of it explained so confidently you don&amp;rsquo;t question it.&lt;/p&gt;
&lt;p&gt;This is what researchers call &amp;ldquo;automation bias&amp;rdquo;&amp;mdash;our tendency to accept answers from automated systems, even when we encounter contradictory information.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re not carefully evaluating the code. We&amp;rsquo;re trusting that the volume of explanation equals correctness.&lt;/p&gt;
&lt;h2&gt;More Explanation &amp;ne; More Understanding&lt;/h2&gt;
&lt;p&gt;The paradox is obvious once you see it:&lt;/p&gt;
&lt;p&gt;Adding AI code reviewers didn&amp;rsquo;t make reviews better. It made them worse.&lt;/p&gt;
&lt;p&gt;Not because the AI reviewers are bad. But because the sheer volume of explanation&amp;mdash;from the writer AI, from the reviewer AI, sometimes from multiple reviewer AIs&amp;mdash;has become impossible to actually process.&lt;/p&gt;
&lt;p&gt;We traded one problem (not enough context) for another (too much confident noise).&lt;/p&gt;
&lt;p&gt;And the human reviewer, the supposed quality gate, is now just the person who clicks &amp;ldquo;Approve&amp;rdquo; after skimming thousands of words they don&amp;rsquo;t have time to verify.&lt;/p&gt;
&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.tenor.com/MuM24FUXhJEAAAAC/this-is-fine.gif&quot; alt=&quot;&quot;&gt;&lt;/figure&gt;
&lt;p&gt;The bottleneck isn&amp;rsquo;t writing code anymore.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not even reviewing code.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s trusting code we don&amp;rsquo;t fully understand because we&amp;rsquo;re drowning in explanations that sound reasonable but are too expensive to verify.&lt;/p&gt;
&lt;p&gt;Even OpenAI acknowledges this in their Codex documentation: &amp;ldquo;It still remains essential for users to manually review and validate all agent-generated code.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;But are we actually doing that?&lt;/p&gt;
&lt;p&gt;The evidence suggests no.&lt;/p&gt;
&lt;h2&gt;Wait. See What Just Happened?&lt;/h2&gt;
&lt;p&gt;I need to be honest with you.&lt;/p&gt;
&lt;p&gt;I almost did the exact same thing to you.&lt;/p&gt;
&lt;p&gt;I almost buried this post in citations.&lt;/p&gt;
&lt;p&gt;16 footnotes. Statistics every other paragraph. Research from Anthropic, OpenAI, arXiv, CodeRabbit, Qodo. All credible. All well-sourced. All making the same point.&lt;/p&gt;
&lt;p&gt;And if you&amp;rsquo;re like most readers, you would have skimmed them. Trusted that they said what I claimed. Moved on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;That&amp;rsquo;s exactly what we&amp;rsquo;re doing with code reviews.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The volume of explanation&amp;mdash;even when accurate&amp;mdash;becomes its own problem. Too many words. Too much confidence. Not enough time to verify.&lt;/p&gt;
&lt;p&gt;So we trust by default.&lt;/p&gt;
&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.tenor.com/U5hbyMIDLqQAAAAC/mind-blown-mind.gif&quot; alt=&quot;&quot;&gt;&lt;/figure&gt;
&lt;h2&gt;What I&amp;rsquo;m Trying&lt;/h2&gt;
&lt;p&gt;I don&amp;rsquo;t have this solved. But here&amp;rsquo;s what&amp;rsquo;s working for me:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The 30-minute rule&lt;/strong&gt; &amp;ndash; If I can&amp;rsquo;t understand the PR in 30 minutes of focused review, it&amp;rsquo;s too big. Send it back or break it down.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No AI reviewer without human review&lt;/strong&gt; &amp;ndash; AI review is a supplement, not a replacement. I still need to read the actual code, not just the summary.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The explain-it test&lt;/strong&gt; &amp;ndash; If I can&amp;rsquo;t explain the core logic to someone else, I don&amp;rsquo;t approve it. Knowing &amp;ldquo;the tests passed&amp;rdquo; isn&amp;rsquo;t good enough.&lt;/p&gt;
&lt;p&gt;Does this slow me down? Yes.&lt;/p&gt;
&lt;p&gt;Does it help? I think so.&lt;/p&gt;
&lt;p&gt;But I&amp;rsquo;m also watching my team ship faster by trusting more. And I don&amp;rsquo;t know if I&amp;rsquo;m being careful or just stubborn.&lt;/p&gt;
&lt;h2&gt;Where This Leaves Us&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m caught in the same trap.&lt;/p&gt;
&lt;p&gt;I want to ship faster. But I also want to understand what I&amp;rsquo;m shipping.&lt;/p&gt;
&lt;p&gt;And the current tools make both feel impossible at the same time.&lt;/p&gt;
&lt;p&gt;Some days I slow down and review everything carefully. Other days I skim and trust.&lt;/p&gt;
&lt;p&gt;And I&amp;rsquo;m not sure which approach is right anymore.&lt;/p&gt;
&lt;p&gt;Anthropic&amp;rsquo;s Dario Amodei predicts the industry may be &amp;ldquo;just six to twelve months away from AI handling most or all of software engineering work from start to finish.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;25% of Google&amp;rsquo;s code&lt;/strong&gt; is already AI-assisted.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;30% of Microsoft&amp;rsquo;s code&lt;/strong&gt; is AI-generated.&lt;/p&gt;
&lt;p&gt;These aren&amp;rsquo;t small experiments. This is how we&amp;rsquo;re building software now.&lt;/p&gt;
&lt;p&gt;But here&amp;rsquo;s what we&amp;rsquo;re not saying out loud:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We&amp;rsquo;ve replaced code we wrote and didn&amp;rsquo;t fully understand with code AI wrote and we definitely don&amp;rsquo;t understand.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re not talking about this problem honestly enough.&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;less coding, more engineering&amp;rdquo; narrative assumes we&amp;rsquo;re still doing the review work.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re not.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re skimming AI-generated justifications and hoping for the best.&lt;/p&gt;
&lt;p&gt;Maybe that&amp;rsquo;s fine. Maybe the tests are good enough. Maybe AI review plus AI generation actually works.&lt;/p&gt;
&lt;p&gt;But we should stop pretending we&amp;rsquo;re still doing the review work.&lt;/p&gt;
&lt;p&gt;Because &amp;ldquo;less coding, more engineering&amp;rdquo; sounds great until you realize:&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re not doing more engineering.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re doing more &lt;strong&gt;trusting&lt;/strong&gt;.&lt;/p&gt;
&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.tenor.com/BE6Ld1mkp38AAAAC/the-office.gif&quot; alt=&quot;&quot;&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;So here&amp;rsquo;s my question:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Are you actually reviewing AI code? Or are you just hoping the explanation is right?&lt;/p&gt;
&lt;p&gt;Because if it&amp;rsquo;s the second one&amp;mdash;and the data suggests it is&amp;mdash;we need to start talking about what comes next.&lt;/p&gt;
&lt;p&gt;The quality gate we automated away isn&amp;rsquo;t coming back. We need to figure out what replaces it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Next up:&lt;/strong&gt; I&amp;rsquo;m going to share how I&amp;rsquo;m breaking down AI-generated features into bite-sized review sessions that force comprehension instead of trust. It&amp;rsquo;s slower. It&amp;rsquo;s deliberate. And it might be the only way to stay honest about what we&amp;rsquo;re shipping.&lt;/p&gt;
&lt;h2&gt;References &amp;amp; Further Reading&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Key Sources:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://fortune.com/2026/01/29/100-percent-of-code-at-anthropic-and-openai-is-now-ai-written-boris-cherny-roon/&quot;&gt;Fortune: &amp;ldquo;Top engineers at Anthropic, OpenAI say AI now writes 100% of their code&amp;rdquo;&lt;/a&gt; &amp;ndash; Mike Krieger and Boris Cherny interviews, January 2026&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.quantumrun.com/consulting/github-copilot-statistics/&quot;&gt;GitHub Copilot Statistics 2026&lt;/a&gt; &amp;ndash; 46% of code AI-generated&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.coderabbit.ai/blog/state-of-ai-vs-human-code-generation-report&quot;&gt;CodeRabbit: &amp;ldquo;AI code creates 1.7x more issues&amp;rdquo;&lt;/a&gt; &amp;ndash; Cognitive load study, 2025&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.index.dev/blog/developer-productivity-statistics-with-ai-tools&quot;&gt;Index.dev: Developer Productivity Statistics 2026&lt;/a&gt; &amp;ndash; 84% adoption, 30% acceptance rate&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://help.openai.com/en/articles/11369540-using-codex-with-your-chatgpt-plan&quot;&gt;OpenAI: Using Codex with ChatGPT&lt;/a&gt; &amp;ndash; Manual review guidance&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://link.springer.com/article/10.1007/s00146-025-02422-7&quot;&gt;Springer: Automation bias in human&amp;ndash;AI collaboration&lt;/a&gt; &amp;ndash; AI &amp;amp; Society, July 2025&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://indianexpress.com/article/technology/artificial-intelligence/anthropic-100-percent-code-ai-generated-claude-10522033/&quot;&gt;Indian Express: Anthropic&amp;rsquo;s 100% AI-generated code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://techcommunity.microsoft.com/blog/appsonazureblog/an-ai-led-sdlc-building-an-end-to-end-agentic-software-development-lifecycle-wit/4491896&quot;&gt;Qodo 2025 AI Code Quality Report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://arxiv.org/html/2508.18771v1&quot;&gt;arXiv: &amp;ldquo;Does AI Code Review Lead to Code Changes?&amp;rdquo;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://thedecisionlab.com/biases/automation-bias&quot;&gt;The Decision Lab: Automation Bias&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://addyo.substack.com/p/the-reality-of-ai-assisted-software&quot;&gt;Addy Osmani: AI-Assisted Engineering Reality&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; href=&quot;https://sudoish.com/the-review-bottleneck-why-ai-explanations-are-making-us-trust-less-not-more/&quot;&gt;The Review Bottleneck: Why AI Explanations Are Making Us Trust Less, Not More&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; href=&quot;https://sudoish.com&quot;&gt;sudoish&lt;/a&gt;.&lt;/p&gt;

</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/11595/the-review-bottleneck-why-ai-explanations-are-making-us-trust-less-not-more</guid>
<pubDate>Fri, 13 Feb 2026 21:02:40 +0000</pubDate>
</item>
<item>
<title>Are We Still Developers? The Hidden Cost of Vibe Coding</title>
<link>https://coderlegion.com/11284/are-we-still-developers-the-hidden-cost-of-vibe-coding</link>
<description>
&lt;hr&gt;
&lt;p&gt;I generated 847 lines of production code in 12 minutes.&lt;/p&gt;
&lt;p&gt;Not pseudocode. Not a prototype. Real, working Python with tests, error handling, API integration, and it works well. I described what I wanted to an AI agent, went to grab coffee, came back, and it was done.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It felt incredible.&lt;/strong&gt; Like unlocking god mode. Why would I ever go back to writing code line by line?&lt;/p&gt;
&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.tenor.com/cS_GHddn0bgAAAAC/the-big-bang-theory-jim-parsons.gif&quot; alt=&quot;&quot;&gt;&lt;/figure&gt;
&lt;h2&gt;The Promise &amp;amp; The Reality&lt;/h2&gt;
&lt;p&gt;This is the promise of AI-centric development tools like Zencoder, vibe-kanban, and even parts of Cursor. Steve Yegge calls it &amp;ldquo;vibe coding&amp;rdquo;: stop micromanaging, trust the AI, let it scaffold entire features while you focus on the big picture. And when you see it work, it&amp;rsquo;s intoxicating.&lt;/p&gt;
&lt;p&gt;But here&amp;rsquo;s what happened next.&lt;/p&gt;
&lt;p&gt;I had to review those 847 lines. Every function. Every edge case. Every assumption the AI made about my requirements. Did it handle validation correctly? Is this maintainable? Did it miss something subtle about the business logic?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The review took longer than writing it would have.&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.tenor.com/trcPOW0Gh0oAAAAC/this-is-fine-this-is-fine-dog-meme.gif&quot; alt=&quot;&quot;&gt;&lt;/figure&gt;
&lt;p&gt;And I still wasn&amp;rsquo;t confident. So I asked a different AI to review the first AI&amp;rsquo;s code. It found some issues. I fixed them. But now I&amp;rsquo;m reviewing AI-generated fixes to AI-generated code, and I&amp;rsquo;m three layers deep in a review process that feels more like managing a team of junior developers than writing software.&lt;/p&gt;
&lt;p&gt;Then comes the PR. Do I ask my teammates to review 847 lines of AI code? They&amp;rsquo;ll either spend hours on it (and resent me) or run it through AI themselves (and we&amp;rsquo;re all just trusting machines at that point).&lt;/p&gt;
&lt;h2&gt;The Identity Question&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;So I have to ask: what does this make us as developers?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If AI writes the code and AI reviews the code, and we&amp;rsquo;re just approving diffs we don&amp;rsquo;t fully understand&amp;hellip; are we developers anymore? Or are we product managers for code we didn&amp;rsquo;t write?&lt;/p&gt;
&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.tenor.com/-qYGCVN5vG0AAAAC/michaelscott-deadinside.gif&quot; alt=&quot;&quot;&gt;&lt;/figure&gt;
&lt;p&gt;Maybe that&amp;rsquo;s fine. Maybe AI is good enough now that we should embrace it.&lt;/p&gt;
&lt;p&gt;But I don&amp;rsquo;t think it is. Not yet. I find issues constantly: bugs the AI missed, patterns it didn&amp;rsquo;t understand, edge cases it overlooked. And the &amp;ldquo;big bang&amp;rdquo; feature implementations don&amp;rsquo;t feel right to me. &lt;strong&gt;I still value ensuring the AI is building the right thing according to my understanding of the problem.&lt;/strong&gt; And the only way to do that is to review in detail, stay close to the code, and actually understand what&amp;rsquo;s being built.&lt;/p&gt;
&lt;h2&gt;My Journey Through the Landscape&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been a Vim user for years. Not the &amp;ldquo;I use Vim btw&amp;rdquo; meme kind. The &amp;ldquo;my fingers know hjkl better than WASD&amp;rdquo; kind. The muscle memory runs deep. So when AI coding assistants exploded onto the scene, I had a choice: migrate to VS Code like everyone else, or figure out how to make AI work in my world.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s be clear: &lt;strong&gt;I didn&amp;rsquo;t stick with Vim out of stubbornness.&lt;/strong&gt; I explored the alternatives. I &lt;em&gt;keep&lt;/em&gt; exploring them.&lt;/p&gt;
&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.tenor.com/6DtrqBiq75sAAAAC/michael-scott.gif&quot; alt=&quot;&quot;&gt;&lt;/figure&gt;
&lt;h3&gt;Cursor: Too Distant&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;ve tried Cursor. It&amp;rsquo;s impressive: genuinely AI-first, with inline suggestions and chat that feels magical. But here&amp;rsquo;s the problem: it makes you &lt;em&gt;too distant from the code&lt;/em&gt;. You&amp;rsquo;re directing an AI that&amp;rsquo;s directing the editor. There&amp;rsquo;s a layer of abstraction I don&amp;rsquo;t trust yet. I want my hands closer to the metal.&lt;/p&gt;
&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.tenor.com/NwG3Si6srsIAAAAC/lazy-krysten-ritter.gif&quot; alt=&quot;&quot;&gt;&lt;/figure&gt;
&lt;h3&gt;Zed: Doesn&amp;rsquo;t Fit My Workflow&lt;/h3&gt;
&lt;p&gt;I tried Zed. Better balance. It&amp;rsquo;s code-centric with AI tools bolted on the side: you choose when to invoke them. I liked that. But Zed expects you to work on &lt;em&gt;one project at a time&lt;/em&gt;. That breaks my workflow immediately. I live in tmux with 3-4 projects open, constantly switching contexts, piping output from one terminal to another. Zed doesn&amp;rsquo;t fit that reality.&lt;/p&gt;
&lt;h3&gt;Zencoder &amp;amp; vibe-kanban: Even More Distant&lt;/h3&gt;
&lt;p&gt;Then I went to the other extreme: full AI-centric tools like vibe-kanban and Zencoder. &lt;strong&gt;I was motivated to try this route after reading Steve Yegge&amp;rsquo;s writings on vibe coding.&lt;/strong&gt; The idea is compelling: stop micromanaging the AI, trust the vibes, let it scaffold entire features while you focus on the big picture. So I gave it an honest shot.&lt;/p&gt;
&lt;p&gt;These tools are &lt;em&gt;wild&lt;/em&gt;. You describe what you want, and they scaffold entire features, write tests, integrate APIs. It feels like having a senior dev in a box. Zencoder especially caught my attention. You feel powerful. You ship fast.&lt;/p&gt;
&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.tenor.com/roHqgq0UdmsAAAAC/chris-pratt-american-actor.gif&quot; alt=&quot;&quot;&gt;&lt;/figure&gt;
&lt;p&gt;But here&amp;rsquo;s the catch: &lt;strong&gt;you&amp;rsquo;re absurdly distant from the code.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI writes it. AI organizes it. You review diffs like a manager reviewing PRs. And I don&amp;rsquo;t trust AI &lt;strong&gt;that much&lt;/strong&gt; yet. Every line it writes, I have to re-review. Does it meet standards? Is it maintainable? Did it miss an edge case? The review overhead is real.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What I realized:&lt;/strong&gt; I still need to review code in detail and ensure features are going in the right direction. The &amp;ldquo;trust the vibes&amp;rdquo; approach sounds liberating, but in practice, I&amp;rsquo;m doing &lt;em&gt;more&lt;/em&gt; cognitive work reviewing after the fact than I would have supervising during development.&lt;/p&gt;
&lt;h2&gt;The Solution: Bite-Sized Pair Programming&lt;/h2&gt;
&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.tenor.com/KZcXqqlfzoMAAAAC/mr-robot-elliot-alderson.gif&quot; alt=&quot;&quot;&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;So I found a middle ground: bite-sized pair programming with AI.&lt;/strong&gt; The AI does most of the coding. I supervise and keep it on track. I course-correct in real time instead of reviewing a massive diff later. And the best way I&amp;rsquo;ve found to do that is still &lt;strong&gt;Neovim + tmux&lt;/strong&gt;: AI in one pane, code in another, constant back-and-forth.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t write code the same way I used to. I used to open a file, think through the problem, and type. Now? I spin up a worktree, open an AI in a terminal pane, and direct the solution instead of typing it character by character. But I stay close. I supervise. I course-correct in real time.&lt;/p&gt;
&lt;p&gt;The AI does the heavy lifting. I do the thinking. It&amp;rsquo;s not full vibe coding. It&amp;rsquo;s not solo coding either. It&amp;rsquo;s &lt;strong&gt;collaborative&lt;/strong&gt;, with me staying close enough to catch problems early. The tools are different. The medium is the same: the terminal.&lt;/p&gt;
&lt;h3&gt;AI in the Terminal: Multiple Tools, One Workflow&lt;/h3&gt;
&lt;p&gt;The real shift wasn&amp;rsquo;t about finding one perfect plugin. It was about building a workflow that lets me use &lt;strong&gt;whatever AI tool fits the task&lt;/strong&gt; without leaving the terminal.&lt;/p&gt;
&lt;p&gt;For a while, I experimented with different approaches: Claude Code in a split buffer, Codex in a tmux pane, jumping between terminal windows to manage different tools manually. I wasn&amp;rsquo;t married to any particular setup.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;More recently, I&amp;rsquo;ve found somewhat of a sweet spot:&lt;/strong&gt; I use &lt;strong&gt;sidekick.nvim&lt;/strong&gt; as my interface layer. It gives me the flexibility to switch between different AI agents when I want to. But in practice? &lt;strong&gt;I mostly default to Claude Code&lt;/strong&gt;. Its rules and configuration are pretty robust right now, plus my company pays for it, so why not use it?&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the real advantage of the terminal workflow: &lt;strong&gt;the flexibility is there when you need it.&lt;/strong&gt; Want to test a new model? Swap it in. Want a second opinion on code? Switch agents mid-task. But you&amp;rsquo;re not forced to constantly context-switch. You can settle into what works and only switch when it makes sense.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And here&amp;rsquo;s a workflow trick I&amp;rsquo;ve been using:&lt;/strong&gt; implement a feature with one AI tool, then review or test it with a different one. You get a less biased second opinion. If Model A wrote the code and Model B flags the same issues you&amp;rsquo;re concerned about, you know it&amp;rsquo;s real. If Model B says &amp;ldquo;looks good,&amp;rdquo; you have more confidence. It&amp;rsquo;s like pair programming, but the second programmer is a completely different intelligence.&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;best&amp;rdquo; AI model changes constantly. Claude Code dominates today, but that changes by the hour. Being locked into one tool means you&amp;rsquo;re always playing catch-up. In the terminal, switching is trivial.&lt;/p&gt;
&lt;h2&gt;Why the Terminal Wins&lt;/h2&gt;
&lt;p&gt;Neovim scored 83% in StackOverflow&amp;rsquo;s 2024 Developer Survey as the most admired IDE, even though VS Code is the most used at 59%. That gap tells you something. People who use Vim don&amp;rsquo;t just tolerate it. They love it. And it&amp;rsquo;s not Stockholm syndrome.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what keeps me here.&lt;/p&gt;
&lt;h3&gt;Hands on the Keyboard&lt;/h3&gt;
&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.tenor.com/XMUJPiY0nioAAAAC/typing-fast-excited.gif&quot; alt=&quot;&quot;&gt;&lt;/figure&gt;
&lt;p&gt;When my hands never leave the keyboard, I stay in flow. Every time I reach for the mouse, there&amp;rsquo;s a micro-decision: where&amp;rsquo;s the cursor? What am I clicking? Did I miss? Those interruptions compound. Not just in seconds, but in mental overhead.&lt;/p&gt;
&lt;p&gt;Want to find a file? &amp;lt;leader&amp;gt;sf brings up Telescope. Search across everything? &amp;lt;leader&amp;gt;sg for live grep. Navigate between Vim splits, tmux panes, or even tmux windows? Ctrl+h/j/k/l handles it all seamlessly. Start a new task with a worktree and AI ready? &amp;lt;leader&amp;gt;at. Toggle a floating terminal? &amp;lt;leader&amp;gt;;.&lt;/p&gt;
&lt;p&gt;No mouse. No sidebars. No menu hunting. Just muscle memory.&lt;/p&gt;
&lt;p&gt;The AI tools I use (Claude Code, Codex, OpenCode) fit into this. I don&amp;rsquo;t context-switch to a browser or separate app. I invoke them in a split pane with a keybind. Everything stays in one place.&lt;/p&gt;
&lt;p&gt;Speed isn&amp;rsquo;t about typing fast. It&amp;rsquo;s about never stopping.&lt;/p&gt;
&lt;h3&gt;The Terminal is a Toolkit&lt;/h3&gt;
&lt;p&gt;The terminal isn&amp;rsquo;t one tool. It&amp;rsquo;s composable. Want to process JSON from an API? Pipe it to jq. Transform file paths? sed or awk. Run a command on 50 files? find | xargs. Monitor logs while coding? tmux split with tail -f.&lt;/p&gt;
&lt;p&gt;When you add AI to this composability, things get wild.&lt;/p&gt;
&lt;p&gt;I can prompt Claude Code in one pane, watch it write code in another, pipe the output through a test runner, grep the results, and feed errors back into the AI. All without leaving the terminal. All scriptable. All reproducible.&lt;/p&gt;
&lt;p&gt;Cursor can&amp;rsquo;t do that. You can&amp;rsquo;t pipe Cursor&amp;rsquo;s output through grep. You can&amp;rsquo;t script it to run in a loop. It&amp;rsquo;s a black box. The terminal is Lego blocks, and AI is just another piece.&lt;/p&gt;
&lt;h3&gt;Performance You Actually Feel&lt;/h3&gt;
&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.tenor.com/rD0hG1nAfm8AAAAC/typing-code.gif&quot; alt=&quot;&quot;&gt;&lt;/figure&gt;
&lt;p&gt;VS Code and Cursor are Electron apps. They&amp;rsquo;re running a full Chromium browser under the hood. Neovim is written in C. It opens instantly, uses around 50MB of RAM, and never lags.&lt;/p&gt;
&lt;p&gt;When I spin up 10 tmux tabs with Neovim and AI tools, my system barely blinks. Try opening 10 VS Code windows and listen to your fan scream.&lt;/p&gt;
&lt;p&gt;I juggle 5 to 10 worktrees at any given time. Each one is a separate environment. If each took 500MB of RAM and 3 seconds to load, my workflow would fall apart. Neovim and tmux? Instant, lightweight, snappy.&lt;/p&gt;
&lt;h3&gt;My Setup is Code&lt;/h3&gt;
&lt;p&gt;My entire development environment is 600 lines of dotfiles in a git repo. New machine? Clone it, run a script, and I&amp;rsquo;m back up in two minutes. Same keybinds, same plugins, same aliases, same AI integrations.&lt;/p&gt;
&lt;p&gt;GUI tools let you sync settings, but you&amp;rsquo;re at the mercy of their config systems. With terminal tools, the setup &lt;em&gt;is code&lt;/em&gt;. You can version it, diff it, review it, share it. I can recreate my entire workflow on a fresh VM faster than VS Code can install.&lt;/p&gt;
&lt;h3&gt;These Tools Have Staying Power&lt;/h3&gt;
&lt;p&gt;Vim came out in 1991. Neovim in 2014. tmux in 2007. They&amp;rsquo;ve outlived programming languages, frameworks, companies. They&amp;rsquo;ll outlive Cursor. They&amp;rsquo;ll outlive Zed. They might outlive JavaScript.&lt;/p&gt;
&lt;p&gt;The muscle memory I&amp;rsquo;m building, the keybinds, the workflow patterns: they&amp;rsquo;ll be relevant in 10 years. Will Cursor? Maybe. Probably not. Learning Vim is an investment that compounds. GUI tools are a bet on a company staying solvent.&lt;/p&gt;
&lt;h2&gt;The Control Gradient&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s how I think about the spectrum:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Full Control (Traditional Vim)&lt;/strong&gt;&lt;br&gt;
You write every character. You think through every problem. Slow, but you know exactly what&amp;rsquo;s happening.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI-Assisted (My Current Setup)&lt;/strong&gt;&lt;br&gt;
You direct the solution. AI accelerates execution. You stay close to the code. You review as it&amp;rsquo;s built, not after. You can do manual trivial actions where pertinent instead of asking everything to the agent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI-First (Cursor, Zed)&lt;/strong&gt;&lt;br&gt;
AI suggests, you accept/reject. Fast, but you&amp;rsquo;re reacting more than creating.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI-Centric (Zencoder, vibe-kanban)&lt;/strong&gt;&lt;br&gt;
AI builds, you review diffs. Fastest, but you&amp;rsquo;re a product manager for code you didn&amp;rsquo;t write.&lt;/p&gt;
&lt;p&gt;Right now, &lt;strong&gt;AI-assisted is the sweet spot.&lt;/strong&gt; I get speed without losing control. I stay in my flow. I trust the output because I was &lt;em&gt;there&lt;/em&gt; while it was written.&lt;/p&gt;
&lt;p&gt;But I&amp;rsquo;ll be honest: &lt;strong&gt;this might not last.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI is getting scary good at both writing &lt;em&gt;and&lt;/em&gt; reviewing code. It&amp;rsquo;s catching bugs I miss. It&amp;rsquo;s flagging patterns I overlook. If AI review becomes as reliable as human review, the argument for staying hands-on gets weaker.&lt;/p&gt;
&lt;p&gt;We might be transitioning to AI-centric whether we like it or not. The question is: how long do I have before &amp;ldquo;staying close to the code&amp;rdquo; becomes nostalgia instead of pragmatism?&lt;/p&gt;
&lt;p&gt;For now, I&amp;rsquo;m staying in the terminal. But I&amp;rsquo;m watching.&lt;/p&gt;
&lt;h2&gt;The Honest Uncertainty&lt;/h2&gt;
&lt;p&gt;This workflow makes me feel in control. I know where my code is, how it got there, and what&amp;rsquo;s happening at every step. I&amp;rsquo;m not watching an AI build something in the background and hoping it got it right. I&amp;rsquo;m directing it, reviewing as it goes, staying close to the work.&lt;/p&gt;
&lt;p&gt;That control matters. For now.&lt;/p&gt;
&lt;p&gt;But I&amp;rsquo;d be lying if I said I&amp;rsquo;m confident this is the future. AI is getting better at an absurd pace. It&amp;rsquo;s already catching bugs I miss. It&amp;rsquo;s writing code that would take me hours in minutes. It&amp;rsquo;s reviewing my work and finding patterns I overlooked.&lt;/p&gt;
&lt;p&gt;At some point, the argument for staying hands-on stops being pragmatic and starts being nostalgic. Maybe we&amp;rsquo;re already there and I just don&amp;rsquo;t want to admit it.&lt;/p&gt;
&lt;p&gt;I keep testing the AI-first tools. Zencoder, vibe-kanban, Cursor. Not because I think they&amp;rsquo;re worse, but because I want to know when the terminal workflow stops being the smart choice and starts being stubbornness.&lt;/p&gt;
&lt;p&gt;Maybe that happens next week. Maybe it already happened and I&amp;rsquo;m just slow to see it. AI-centric development might not be a distant future. It might be now, and I&amp;rsquo;m still clinging to a workflow that makes me comfortable.&lt;/p&gt;
&lt;p&gt;For today, I&amp;rsquo;m staying in the terminal. It&amp;rsquo;s faster for me. It fits how I think. It keeps me close to the code in a way that feels right.&lt;/p&gt;
&lt;p&gt;But tomorrow? Who knows.&lt;/p&gt;
&lt;p&gt;The terminal-centric workflow wins for me right now. But I&amp;rsquo;m watching the gap close. And when it does, I&amp;rsquo;ll probably switch. Not because I want to, but because it&amp;rsquo;ll be the obvious move.&lt;/p&gt;
&lt;p&gt;Until then, I&amp;rsquo;ll keep hitting &amp;lt;leader&amp;gt;at and letting the AI do the heavy lifting while I stay at the wheel.&lt;/p&gt;
&lt;figure class=&quot;wp-block-image&quot;&gt;&lt;img src=&quot;https://media.tenor.com/AaP5Vt8ZOncAAAAC/cheers-dominic-toretto.gif&quot; alt=&quot;&quot;&gt;&lt;/figure&gt;
&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; href=&quot;https://sudoish.com/are-we-still-developers-the-hidden-cost-of-vibe-coding/&quot;&gt;Are We Still Developers? The Hidden Cost of Vibe Coding&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; href=&quot;https://sudoish.com&quot;&gt;sudoish&lt;/a&gt;.&lt;/p&gt;

</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/11284/are-we-still-developers-the-hidden-cost-of-vibe-coding</guid>
<pubDate>Mon, 09 Feb 2026 04:22:59 +0000</pubDate>
</item>
<item>
<title>The Developer Identity Crisis</title>
<link>https://coderlegion.com/11286/the-developer-identity-crisis</link>
<description>
&lt;p&gt;I keep seeing variations of this pitch everywhere:&lt;/p&gt;



&lt;p&gt;&lt;em&gt;&amp;ldquo;A bug report hits Jira at 3 AM? Your autonomous agent wakes up, reproduces it, writes the fix, and opens the PR before your alarm goes off.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;That&amp;rsquo;s from Zencoder&amp;rsquo;s marketing site. But it&amp;rsquo;s not just marketing anymore, developers are actually doing this. They&amp;rsquo;re using tools like Zencoder, Claude code, Openclaw, and others to delegate entire features or bug fixes to AI agents that run autonomously while they sleep.&lt;/p&gt;



&lt;p&gt;The workflow is straightforward: assign a GitHub issue to the agent, let it work overnight in a sandboxed environment, wake up to a pull request with passing tests, review the diff, merge it.&lt;/p&gt;



&lt;p&gt;The tests pass. The code works. They ship it.&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-full&quot;&gt;&lt;img src=&quot;https://media.tenor.com/qG7PGA4wC10AAAAC/shipit-squirrel.gif&quot; alt=&quot;Ship it squirrel - the eternal developer mantra&quot;&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;And here&amp;rsquo;s the part that keeps me up at night: many of them admit they don&amp;rsquo;t fully understand every implementation detail. They review for correctness and patterns, but not line-by-line comprehension. And they&amp;rsquo;re shipping faster because of it.&lt;/p&gt;



&lt;p&gt;I&amp;rsquo;ve been thinking about this for weeks. Because I can&amp;rsquo;t do that. Not yet.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;My Workflow Isn&amp;rsquo;t There Yet&lt;/h2&gt;



&lt;p&gt;I use AI constantly. Claude Code and orchestrators like OpenClaw, they&amp;rsquo;ve transformed how I work. I can spin up features that would have taken days in a fraction of the time. The productivity gains are real.&lt;/p&gt;



&lt;p&gt;But I still review everything. I still read the diffs. I still make sure I understand what went into the codebase before I approve it. I don&amp;rsquo;t merge code I haven&amp;rsquo;t checked.&lt;/p&gt;



&lt;p&gt;And here&amp;rsquo;s the uncomfortable part:&amp;nbsp;&lt;strong&gt;I&amp;rsquo;m starting to wonder if that makes me slow.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;Because I&amp;rsquo;m watching people who&amp;nbsp;&lt;em&gt;don&amp;rsquo;t&lt;/em&gt;&amp;nbsp;review everything. They&amp;rsquo;re shipping faster. They&amp;rsquo;re building more. And their code&amp;hellip; works. Their products ship. Their companies grow.&lt;/p&gt;



&lt;p&gt;The question that keeps me up at night isn&amp;rsquo;t &amp;ldquo;can AI code?&amp;rdquo; anymore. It&amp;rsquo;s:&amp;nbsp;&lt;strong&gt;how much can I trust it before my caution becomes a liability?&lt;/strong&gt;&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-full&quot;&gt;&lt;img src=&quot;https://media.tenor.com/MYZgsN2TDJAAAAAC/this-is.gif&quot; alt=&quot;This is fine - dog sitting in burning room&quot;&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;The Job Changed Underneath Us&lt;/h2&gt;



&lt;p&gt;If you&amp;rsquo;ve been coding for more than a few years, you&amp;rsquo;ve felt it. The ground shifted. What we do day-to-day looks fundamentally different than it did even 18 months ago.&lt;/p&gt;



&lt;p&gt;We used to write code. Now we orchestrate AI agents that write code.&lt;/p&gt;



&lt;p&gt;We used to debug line by line. Now we describe the bug and let the agent fix it.&lt;/p&gt;



&lt;p&gt;We used to refactor carefully. Now we prompt for a rewrite and evaluate the output.&lt;/p&gt;



&lt;p&gt;The transformation isn&amp;rsquo;t subtle anymore. AI agent tools crossed some threshold. They&amp;rsquo;re not assistants anymore, they&amp;rsquo;re doing the actual work.&lt;/p&gt;



&lt;p&gt;And here&amp;rsquo;s what nobody wants to say out loud:&amp;nbsp;&lt;strong&gt;they&amp;rsquo;re often better at it than we are.&lt;/strong&gt;&amp;nbsp;Faster, definitely. More thorough in edge cases. Less prone to the lazy shortcuts we take when we&amp;rsquo;re tired.&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-full&quot;&gt;&lt;img src=&quot;https://media.tenor.com/0i0ZxbRgVyAAAAAC/meonly.gif&quot; alt=&quot;Confused math lady - trying to process all the changes&quot;&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;The role of &amp;ldquo;software developer&amp;rdquo; didn&amp;rsquo;t disappear. It just became something else entirely. We&amp;rsquo;re now:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Task organizers&lt;/strong&gt;&amp;nbsp;&amp;mdash; Breaking down requirements into agent-friendly chunks&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Configuration engineers&lt;/strong&gt;&amp;nbsp;&amp;mdash; Building rules, skills, and context for AI systems&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Quality evaluators&lt;/strong&gt;&amp;nbsp;&amp;mdash; Reviewing output for correctness, not writing it ourselves&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Visibility champions&lt;/strong&gt;&amp;nbsp;&amp;mdash; Advocating for our work because &amp;ldquo;just coding&amp;rdquo; is invisible now&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;If you&amp;rsquo;re a developer who just wants to code in peace, I have bad news for you: that job is disappearing.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;The Pioneers Are Already There&lt;/h2&gt;



&lt;p&gt;I&amp;rsquo;m not imagining this shift. Some of the sharpest minds in our industry are actively building for a future where human code review might be optional and their work reveals just how far the transformation has already gone.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Steve Yegge&amp;rsquo;s Gas Town: The Industrial Coding Factory&lt;/h3&gt;



&lt;p&gt;Steve Yegge&amp;mdash;the legendary blogger who gave us classics like &amp;ldquo;Stevey&amp;rsquo;s Google Platforms Rant&amp;rdquo;&amp;mdash;recently launched Gas Town, what he calls &amp;ldquo;a new take on the IDE for 2026.&amp;rdquo; It&amp;rsquo;s not an IDE in any traditional sense. It&amp;rsquo;s an orchestrator for running&amp;nbsp;&lt;em&gt;dozens&lt;/em&gt;&amp;nbsp;of Claude Code instances simultaneously.&lt;/p&gt;



&lt;p&gt;In his words:&amp;nbsp;&lt;em&gt;&amp;ldquo;Gas Town is an industrialized coding factory manned by superintelligent robot chimps.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;He describes an 8-stage evolution of the AI-assisted developer, from basic code completions all the way to running 10+ agents at once. If you&amp;rsquo;re not at stage 6 or 7?&amp;nbsp;&lt;em&gt;&amp;ldquo;You will not be able to use Gas Town. You aren&amp;rsquo;t ready yet.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;Yegge also created Beads, a persistent memory system for coding agents. Because when you&amp;rsquo;re running that many agents, you need infrastructure just to keep track of what they know. He&amp;rsquo;s literally building Kubernetes for AI coders.&lt;/p&gt;



&lt;p&gt;The pattern he describes:&amp;nbsp;&lt;strong&gt;Prompt &amp;rarr; Sleep &amp;rarr; Evaluate &amp;rarr; Keep or Toss.&lt;/strong&gt;&amp;nbsp;Work becomes &amp;ldquo;an uncountable substance that you sling around freely, like slopping shiny fish into wooden barrels at the docks.&amp;rdquo;&lt;/p&gt;



&lt;p&gt;That&amp;rsquo;s not coding as we knew it. That&amp;rsquo;s something else entirely. And Yegge&amp;rsquo;s doing it right now.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;ThePrimeagen&amp;rsquo;s 99: The Neovim Purist&amp;rsquo;s Answer&lt;/h3&gt;



&lt;p&gt;On the other end of the spectrum, ThePrimeagen, known for his Neovim evangelism, launched 99, which he describes as &amp;ldquo;the AI agent that Neovim deserves.&amp;rdquo;&lt;/p&gt;



&lt;p&gt;His philosophy is different from the full-orchestration approach. 99 is built for developers &amp;ldquo;who don&amp;rsquo;t have skill issues&amp;rdquo;, those people who want AI integrated into their existing workflow, not replacing it. It&amp;rsquo;s about restricted AI interactions: fill in a function, handle a visual selection, stop when you want.&lt;/p&gt;



&lt;p&gt;The interesting part? Even ThePrimeagen, arguably one of the most skilled traditional developers in the content space, is building AI tooling. He&amp;rsquo;s not fighting the wave; he&amp;rsquo;s figuring out how to ride it on his own terms.&lt;/p&gt;



&lt;p&gt;These aren&amp;rsquo;t fringe experiments. These are serious developers building serious tools because they see what&amp;rsquo;s coming.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Caught in the Middle&lt;/h2&gt;



&lt;p&gt;So where does that leave people like me?&lt;/p&gt;



&lt;p&gt;I see where this is going. I believe the future probably shifts heavily toward these &amp;ldquo;prompt and trust&amp;rdquo; workflows. The economics are too compelling. The speed advantages are too real. Companies will gravitate toward developers who ship faster, and right now, that means developers who trust AI more.&lt;/p&gt;



&lt;p&gt;But I&amp;rsquo;m not there yet. And I&amp;rsquo;m honestly not sure if my reluctance is:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&lt;strong&gt;Wisdom:&lt;/strong&gt;&amp;nbsp;A healthy caution born from experience with software that breaks in subtle ways&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Ego:&lt;/strong&gt;&amp;nbsp;An attachment to feeling like a &amp;ldquo;real programmer&amp;rdquo; who understands their code&lt;/li&gt;



&lt;li&gt;&lt;strong&gt;Fear:&lt;/strong&gt;&amp;nbsp;Discomfort with a world where my hard-won skills matter less&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Maybe it&amp;rsquo;s all three.&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-full&quot;&gt;&lt;img src=&quot;https://media.tenor.com/ThhEZbj8dVwAAAAC/squid-game-voting.gif&quot; alt=&quot;Squid Game voting buttons - the impossible choice&quot;&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;p&gt;The honest truth is: I don&amp;rsquo;t fully trust AI-generated code yet. Not because I&amp;rsquo;ve seen it fail catastrophically. But because the few times I&amp;nbsp;&lt;em&gt;have&lt;/em&gt;&amp;nbsp;caught issues, they were subtle. The kind of bugs that pass tests but cause problems in production. The kind that make you question everything you didn&amp;rsquo;t review carefully.&lt;/p&gt;



&lt;p&gt;And yet&amp;hellip; those catches are getting rarer. The AI is getting better. Every month the code quality improves, the edge cases get handled more gracefully, the architecture decisions get more sensible.&lt;/p&gt;



&lt;p&gt;At what point does my reviewing become theater? At what point am I just going through the motions because it feels wrong not to, even though I&amp;rsquo;m not actually catching anything?&lt;/p&gt;



&lt;p&gt;I don&amp;rsquo;t have an answer.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;The Uncomfortable Truths We&amp;rsquo;re Not Talking About&lt;/h2&gt;



&lt;p&gt;Whether you&amp;rsquo;re in the &amp;ldquo;trust fully&amp;rdquo; camp or the &amp;ldquo;review everything&amp;rdquo; camp, some things are happening to all of us.&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;Skill Atrophy is Real&lt;/h3&gt;



&lt;p&gt;I&amp;rsquo;ve noticed it in myself. There are language features I used to know cold that I now&amp;hellip; don&amp;rsquo;t. Not because I forgot them entirely, but because I haven&amp;rsquo;t actually typed them as often. The AI does it.&lt;/p&gt;



&lt;p&gt;When I do need to write code without AI assistance, I&amp;rsquo;m slower. Rustier. More likely to look things up that used to be automatic.&lt;/p&gt;



&lt;p&gt;Is this a problem? I don&amp;rsquo;t know. Maybe these skills don&amp;rsquo;t matter anymore. Maybe they do. But either way, they&amp;rsquo;re fading.&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-full&quot;&gt;&lt;img src=&quot;https://media.tenor.com/tmg4rinLay4AAAAC/animaniacs-pinky-and-the-brain.gif&quot; alt=&quot;Pinky and the Brain - what was the password again?&quot;&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;h3 class=&quot;wp-block-heading&quot;&gt;The Carelessness Creep&lt;/h3&gt;



&lt;p&gt;Even when I review code, I&amp;rsquo;ve caught myself being less thorough than I used to be. When the AI can regenerate something in seconds, the stakes for any individual piece feel lower. Made a mistake? Trash it and re-prompt.&lt;/p&gt;



&lt;p&gt;This creeping carelessness scares me. Not because every line needs to be perfect, but because I&amp;rsquo;ve noticed myself letting things slide that I wouldn&amp;rsquo;t have before. Small things. Subtle things. The kind of issues that compound.&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-full&quot;&gt;&lt;img src=&quot;https://media.tenor.com/WuDNxJBDte8AAAAC/eh-meh.gif&quot; alt=&quot;Meh shrug - when you stop caring about the details&quot;&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;h3 class=&quot;wp-block-heading&quot;&gt;Code Review Culture is Fragmenting&lt;/h3&gt;



&lt;p&gt;Here&amp;rsquo;s where it gets really weird: people are using AI to review code too.&lt;/p&gt;



&lt;p&gt;On one hand, this is powerful. AI can catch patterns and issues that humans miss. But on the other hand&amp;hellip; we&amp;rsquo;re now in a loop where AI writes code and AI reviews code and humans just glance at both and click approve.&lt;/p&gt;



&lt;p&gt;What happens when we stop deeply understanding the systems we&amp;rsquo;re building? When code becomes something we orchestrate but don&amp;rsquo;t really know?&lt;/p&gt;



&lt;h3 class=&quot;wp-block-heading&quot;&gt;The Disposable Code Question&lt;/h3&gt;



&lt;p&gt;Maybe code quality just doesn&amp;rsquo;t matter the way it used to.&lt;/p&gt;



&lt;p&gt;If AI can rewrite a module in 30 seconds, why spend hours making it elegant? Why obsess over structure, readability, maintainability? Just make it work. When it breaks or needs to change, throw it away and regenerate it.&lt;/p&gt;



&lt;p&gt;This feels wrong to me. But I can&amp;rsquo;t articulate exactly why. Maybe I&amp;rsquo;m just attached to an old way of working. Maybe &amp;ldquo;good code&amp;rdquo; was always just a means to an end, and now there&amp;rsquo;s a faster means.&lt;/p&gt;



&lt;p&gt;Maybe code doesn&amp;rsquo;t need to be human-readable anymore. Maybe it just needs to be AI-readable. And maybe that&amp;rsquo;s fine.&lt;/p&gt;



&lt;p&gt;I genuinely don&amp;rsquo;t know.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;The Paradox: Embrace or Fall Behind&lt;/h2&gt;



&lt;p&gt;Here&amp;rsquo;s the impossible choice: embrace AI coding fully and potentially lose something essential, or maintain your review discipline and risk becoming irrelevant.&lt;/p&gt;



&lt;p&gt;If you don&amp;rsquo;t use these tools you&amp;rsquo;re objectively slower than colleagues who trust more and verify less. You deliver less. You look less productive. In a world where companies are cutting costs and measuring output, that&amp;rsquo;s not sustainable.&lt;/p&gt;



&lt;p&gt;But if you do embrace them fully, you risk becoming dependent. Losing skills. Becoming someone who can&amp;rsquo;t actually code anymore, just prompt.&lt;/p&gt;



&lt;p&gt;I&amp;rsquo;m trying to find a middle path. Use AI heavily for generation, but maintain understanding. Trust but verify. It&amp;rsquo;s uncomfortable. It might not be sustainable. But it&amp;rsquo;s where I am right now.&lt;/p&gt;



&lt;p&gt;And here&amp;rsquo;s the kicker: the job now requires something that coding alone never did:&amp;nbsp;&lt;strong&gt;visibility&lt;/strong&gt;.&lt;/p&gt;



&lt;p&gt;It&amp;rsquo;s not enough to do good work. You have to be seen doing it. You have to advocate. Document. Communicate impact. Build relationships. The IC who just crushes code tickets in silence? That person is becoming a liability, because from the outside, it&amp;rsquo;s unclear what AI could or couldn&amp;rsquo;t do in their place.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;What Even Is a Developer Anymore?&lt;/h2&gt;



&lt;p&gt;Here&amp;rsquo;s where I diverge from the panic.&lt;/p&gt;



&lt;p&gt;A lot of developers are having an identity crisis because &amp;ldquo;AI can code now.&amp;rdquo; But honestly? I always thought being a developer was about more than writing code.&lt;/p&gt;



&lt;p&gt;The job was never just about typing syntax. It was always about:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Knowing&amp;nbsp;&lt;strong&gt;what&lt;/strong&gt;&amp;nbsp;to build (strategic thinking)&lt;/li&gt;



&lt;li&gt;Knowing&amp;nbsp;&lt;strong&gt;how to break it down&lt;/strong&gt;&amp;nbsp;(task decomposition)&lt;/li&gt;



&lt;li&gt;Knowing&amp;nbsp;&lt;strong&gt;how to evaluate quality&lt;/strong&gt;&amp;nbsp;(critical judgment)&lt;/li&gt;



&lt;li&gt;Knowing&amp;nbsp;&lt;strong&gt;how to communicate impact&lt;/strong&gt;&amp;nbsp;(visibility)&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Coding was just the tool we used to execute on those skills. A really important tool, sure.&lt;/p&gt;



&lt;p&gt;What&amp;rsquo;s happening now is that the tool is changing. The execution layer is being automated. But the thinking, the judgment, the strategy? That&amp;rsquo;s still ours.&lt;/p&gt;



&lt;p&gt;If anything, AI is forcing the industry to acknowledge what good developers have always known: the hard part was never the syntax. It was figuring out what to build, why it matters, and whether it actually works.&lt;/p&gt;



&lt;p&gt;The developers freaking out about &amp;ldquo;AI replacing us&amp;rdquo; are often the ones who built their identity entirely around code execution. And I get it, that was the most visible, most measurable part of the job. It&amp;rsquo;s what we practiced, what we got good at, what differentiated us.&lt;/p&gt;



&lt;p&gt;But it was never the whole job. And now we&amp;rsquo;re being forced to reckon with that.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;We&amp;rsquo;re the Canary in the Coal Mine&lt;/h2&gt;



&lt;p&gt;Software developers are experiencing this transformation first not because we&amp;rsquo;re special, but because we&amp;rsquo;re closest to the technology. We use AI to automate our own work. Of course it&amp;rsquo;s impacting us fastest.&lt;/p&gt;



&lt;p&gt;But every profession is next.&lt;/p&gt;



&lt;p&gt;The writer using AI to draft articles. The designer using AI to generate concepts. The analyst using AI to build models. The lawyer using AI to review contracts.&lt;/p&gt;



&lt;p&gt;Everyone is about to face their own version of this identity crisis:&amp;nbsp;&lt;em&gt;&amp;ldquo;What is my job when AI can do the execution better than I can?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;We don&amp;rsquo;t have answers yet. We&amp;rsquo;re navigating in real-time, making it up as we go.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Navigating the Blur&lt;/h2&gt;



&lt;p&gt;I don&amp;rsquo;t have a clean conclusion here. No five-step framework for staying relevant. No confident prediction about where this goes.&lt;/p&gt;



&lt;p&gt;What I do know:&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;The technology won&amp;rsquo;t slow down.&lt;/strong&gt;&amp;nbsp;We can&amp;rsquo;t wish our way back to a simpler time.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Skills still matter, but which ones is shifting.&lt;/strong&gt;&amp;nbsp;Deep technical knowledge isn&amp;rsquo;t obsolete, but it might not be sufficient anymore.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Intentionality is everything.&lt;/strong&gt;&amp;nbsp;We can drift into AI dependency without thinking, or we can engage with these tools critically, keeping what works, discarding what doesn&amp;rsquo;t, staying honest about trade-offs.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Trust isn&amp;rsquo;t binary.&lt;/strong&gt;&amp;nbsp;I&amp;rsquo;m somewhere on the spectrum between &amp;ldquo;review every line&amp;rdquo; and &amp;ldquo;ship without looking.&amp;rdquo; That&amp;rsquo;s probably where most of us are. And that&amp;rsquo;s okay, we&amp;rsquo;re all calibrating in real-time.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;We&amp;rsquo;re figuring this out together.&lt;/strong&gt;&amp;nbsp;Nobody has it solved. The developers who seem most confident are probably just better at hiding their uncertainty.&lt;/p&gt;



&lt;p&gt;The job is changing. Our identity as developers is changing with it. The only way through is acknowledging the discomfort and navigating it intentionally.&lt;/p&gt;



&lt;p&gt;I still &lt;strong&gt;check the code&lt;/strong&gt;. I still review the diffs. Maybe that makes me slow. Maybe that makes me careful. Maybe it&amp;rsquo;s just how I&amp;rsquo;m wired.&lt;/p&gt;



&lt;p&gt;But I&amp;rsquo;m watching the people who don&amp;rsquo;t. And I&amp;rsquo;m taking notes.&lt;/p&gt;



&lt;p&gt;We&amp;rsquo;re in uncharted territory.&lt;/p&gt;



&lt;p&gt;And honestly? That&amp;rsquo;s both terrifying and kind of exciting.&lt;/p&gt;


&lt;div class=&quot;wp-block-image&quot;&gt;
&lt;figure class=&quot;aligncenter size-full&quot;&gt;&lt;img src=&quot;https://media.tenor.com/N342b6qb0soAAAAC/back-to-the-future-marty-mcfly.gif&quot; alt=&quot;Back to the Future - ready for whatever comes next&quot;&gt;&lt;/figure&gt;
&lt;/div&gt;


&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;p&gt;&lt;em&gt;What&amp;rsquo;s your experience with this shift? Are you in the &amp;ldquo;trust fully&amp;rdquo; camp, the &amp;ldquo;review everything&amp;rdquo; camp, or somewhere in between like me? I&amp;rsquo;d genuinely love to hear how other developers are navigating this.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; href=&quot;https://sudoish.com/the-developer-identity-crisis/&quot;&gt;The Developer Identity Crisis&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; href=&quot;https://sudoish.com&quot;&gt;sudoish&lt;/a&gt;.&lt;/p&gt;

</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/11286/the-developer-identity-crisis</guid>
<pubDate>Mon, 09 Feb 2026 04:22:47 +0000</pubDate>
</item>
<item>
<title>Is AI Actually Making You Faster?</title>
<link>https://coderlegion.com/11287/is-ai-actually-making-you-faster</link>
<description>
&lt;p&gt;AI in software development is getting insanely powerful.&lt;/p&gt;



&lt;p&gt;LLMs, copilots, agents, multi-step workflows&amp;hellip;&lt;/p&gt;



&lt;p&gt;&amp;hellip;on paper, it all looks like massive productivity gains. And sometimes it &lt;em&gt;is&lt;/em&gt;. But in practice, I&amp;rsquo;ve seen something very different happen over and over again: developers actually &lt;strong&gt;lose time&lt;/strong&gt;, not gain it.&lt;/p&gt;



&lt;p&gt;The main reason is simple:&lt;br&gt;&lt;strong&gt;AI can produce code that looks correct, works on the surface, and is confidently explained, but is subtly wrong.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;And those subtle mistakes are often the most expensive ones.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;The real problem: &lt;strong&gt;distance from the code&lt;/strong&gt;&lt;/h2&gt;



&lt;p&gt;With modern AI tools, it&amp;rsquo;s very easy to become distant from the actual codebase.&lt;/p&gt;



&lt;p&gt;Instead of designing, reasoning, and implementing, we:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;write a big prompt&lt;/li&gt;



&lt;li&gt;wait for a large chunk of code&lt;/li&gt;



&lt;li&gt;skim it quickly&lt;/li&gt;



&lt;li&gt;trust that &amp;ldquo;the AI probably knows better&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;The code often &lt;em&gt;runs&lt;/em&gt;. Tests might even pass. And the AI will confidently tell you the solution is solid and production-ready.&lt;br&gt;The amount of agents and MCPs added to the AI coding tool is so big nowadays that it is increasingly harder to discover where things could go wrong. And worse, developers tend to trust it more and more because it gives the sense that the ideal prompt, rules, and custom agents will be able to handle hallucination properly.&lt;/p&gt;



&lt;p&gt;That&amp;rsquo;s where the danger is.&lt;/p&gt;



&lt;p&gt;Because now you still have to read the whole implementation of a code a &lt;em&gt;stranger&lt;/em&gt; has written, understand it, validate edge cases, debug weird behavior and repeat until things work as expected.&lt;/p&gt;



&lt;p&gt;Except now you&amp;rsquo;re doing it while fighting &lt;strong&gt;authority bias&lt;/strong&gt; &amp;mdash; there&amp;rsquo;s an &amp;ldquo;expert&amp;rdquo; telling you everything is fine.&lt;/p&gt;



&lt;p&gt;This is not faster. It&amp;rsquo;s verification debt.&lt;br&gt;It actually transforms developers into code reviewers of new &lt;strong&gt;cocky&lt;/strong&gt; and &lt;strong&gt;condescending&lt;/strong&gt; dev (the AI.&lt;/p&gt;



&lt;p&gt;Here is one dummy example to illustrate this:&lt;/p&gt;



&lt;p&gt;There is a feature in the backend that is used everywhere in the app. This function performs its action and then run some costly observability tasks.&lt;br&gt;These observability tasks should run in the background because the caller of the function doesn&amp;rsquo;t care about its response.&lt;br&gt;The correct approach is to schedule that extra processing asynchronously, fire and forget.&lt;/p&gt;



&lt;p&gt;But the AI-generated code did something very subtle:&lt;br&gt;it &lt;strong&gt;awaited&lt;/strong&gt; that processing instead of scheduling it as a background task.&lt;/p&gt;



&lt;p&gt;In Python terms, think:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;what should have been &lt;code&gt;asyncio.create_task(...)&lt;/code&gt;&lt;/li&gt;



&lt;li&gt;was instead written as &lt;code&gt;await some_processing()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;The result?&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;Everything still worked&lt;/li&gt;



&lt;li&gt;No obvious errors&lt;/li&gt;



&lt;li&gt;But every single call was now slower&lt;/li&gt;



&lt;li&gt;Latency quietly increased across the system&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;This may be an easy bug to catch, but imagine how subtle bugs like this may pile up and get lost in the mix?&lt;/p&gt;



&lt;p&gt;This happens because when developers rely too much on AI, they tend to &lt;strong&gt;read on the surface&lt;/strong&gt;, not line by line. And with large outputs, that tendency gets even worse.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;This hurts everyone, from juniors to seniors&lt;/h2&gt;



&lt;p&gt;For junior developers, this is especially dangerous.&lt;/p&gt;



&lt;p&gt;If you rely too much on AI early on, you tend to skip the learning phase, you don&amp;rsquo;t build strong mental models and you accept solutions that you don&amp;rsquo;t fully understand.&lt;/p&gt;



&lt;p&gt;But this isn&amp;rsquo;t just a junior problem.&lt;/p&gt;



&lt;p&gt;For experienced developers, the risk is &lt;strong&gt;skill atrophy&lt;/strong&gt;.&lt;br&gt;If you stop practicing fundamentals and let AI do most of the thinking you will most likely lose your instincts, code reviews get softer and your ability to spot subtle issues declines.&lt;/p&gt;



&lt;p&gt;And then validating AI output becomes harder and harder, exactly when it matters most.&lt;/p&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Ok, but what can we do now?&lt;/h2&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;First rule: ask yourself if you even need AI here&lt;/h2&gt;



&lt;p&gt;One habit I find extremely important is this:&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Before using AI, ask yourself:&lt;/strong&gt;&lt;/p&gt;



&lt;blockquote class=&quot;wp-block-quote is-layout-flow wp-block-quote-is-layout-flow&quot;&gt;
&lt;p&gt;&amp;ldquo;Is this actually faster with AI, or am I just outsourcing thinking?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;There are many cases where writing the code yourself is faster, clearer and safer, especially for core business logic, performance-critical paths, concurrency, security-sensitive code.&lt;/p&gt;



&lt;p&gt;On the other hand, AI is &lt;em&gt;excellent&lt;/em&gt; at things such as UI scaffolding, boilerplate, repetitive glue code, predictable transformations and, my favorite, reviewing my implementation helping me spot bugs.&lt;/p&gt;



&lt;p&gt;Use it where it shines. Don&amp;rsquo;t force it everywhere.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Design first, then let AI fill the boring gaps&lt;/h2&gt;



&lt;p&gt;A strategy that works extremely well is this:&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;You design the structure. The AI fills in the details.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;As an intermediate or senior developer, you usually already know what you want to build at a high level.&lt;/p&gt;



&lt;p&gt;For example, a simple contact page:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;frontend contact form&lt;/li&gt;



&lt;li&gt;validation&lt;/li&gt;



&lt;li&gt;backend API&lt;/li&gt;



&lt;li&gt;database table&lt;/li&gt;



&lt;li&gt;persistence logic&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;You don&amp;rsquo;t need the AI to decide &lt;em&gt;what&lt;/em&gt; exists.&lt;br&gt;You already know that.&lt;/p&gt;



&lt;p&gt;Instead:&lt;/p&gt;



&lt;ol class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;define the structure yourself&lt;/li&gt;



&lt;li&gt;break it into small, clear pieces&lt;/li&gt;



&lt;li&gt;ask the AI to implement one piece at a time&lt;/li&gt;
&lt;/ol&gt;



&lt;p&gt;This keeps context small, hallucinations lower, review manageable and you engaged with the code.&lt;/p&gt;



&lt;p&gt;And it&amp;rsquo;s &lt;strong&gt;much faster&lt;/strong&gt; than crafting one massive prompt and reviewing a massive output.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Small prompts, small context, small steps&lt;/h2&gt;



&lt;p&gt;Large prompts produce large hallucinations.&lt;/p&gt;



&lt;p&gt;If you want better results:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;reduce context&lt;/li&gt;



&lt;li&gt;reduce scope&lt;/li&gt;



&lt;li&gt;reduce responsibility per prompt&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Instead of:&lt;/p&gt;



&lt;blockquote class=&quot;wp-block-quote is-layout-flow wp-block-quote-is-layout-flow&quot;&gt;
&lt;p&gt;&amp;ldquo;Implement the entire feature end-to-end&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;Try:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;&amp;ldquo;Generate the frontend form UI&amp;rdquo;&lt;/li&gt;



&lt;li&gt;&amp;ldquo;Add input validation for these fields&amp;rdquo;&lt;/li&gt;



&lt;li&gt;&amp;ldquo;Implement this API handler with these constraints&amp;rdquo;&lt;/li&gt;



&lt;li&gt;&amp;ldquo;Write tests for this specific behavior&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;You stay in control, and the AI becomes a focused assistant &amp;mdash; not an architect making assumptions for you.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Use TDD as a guardrail (not as dogma)&lt;/h2&gt;



&lt;p&gt;One very powerful pattern is combining AI with &lt;strong&gt;TDD-style thinking&lt;/strong&gt;.&lt;/p&gt;



&lt;p&gt;You don&amp;rsquo;t even need to be strict TDD.&lt;/p&gt;



&lt;p&gt;Just:&lt;/p&gt;



&lt;ol class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;define acceptance criteria&lt;/li&gt;



&lt;li&gt;define what &amp;ldquo;correct&amp;rdquo; means&lt;/li&gt;



&lt;li&gt;ask the AI to help write tests first (or alongside the code)&lt;/li&gt;
&lt;/ol&gt;



&lt;p&gt;Tests force:&lt;/p&gt;



&lt;ul class=&quot;wp-block-list&quot;&gt;
&lt;li&gt;clarity&lt;/li&gt;



&lt;li&gt;explicit behavior&lt;/li&gt;



&lt;li&gt;less hand-wavy logic&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;They also give you confidence that the AI didn&amp;rsquo;t just produce something that &lt;em&gt;looks&lt;/em&gt; right.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Automate the boring validation&lt;/h2&gt;



&lt;p&gt;Linters, formatters, type checkers, static analysis &amp;mdash; all of these matter even more with AI-generated code.&lt;/p&gt;



&lt;p&gt;Humans skim.&lt;br&gt;Tools don&amp;rsquo;t.&lt;/p&gt;



&lt;p&gt;Let automation catch bad patterns, unsafe constructs, incorrect usage and inconsistent styles.&lt;/p&gt;



&lt;p&gt;These are cheap guardrails that pay off immediately. Additionally, these can easily become default rules for the ai in your project or personal configuration.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;Stay sharp: practice fundamentals on purpose&lt;/h2&gt;



&lt;p&gt;Here&amp;rsquo;s something I strongly believe:&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;The more AI advances, the more important fundamentals become.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;If you&amp;rsquo;re not practicing DSA, system design, concurrency basics, you slowly lose the ability to judge whether a solution is good or not.&lt;/p&gt;



&lt;p&gt;One simple habit I highly recommend:&lt;/p&gt;



&lt;blockquote class=&quot;wp-block-quote is-layout-flow wp-block-quote-is-layout-flow&quot;&gt;
&lt;p&gt;&lt;strong&gt;one LeetCode problem a day&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;It doesn&amp;rsquo;t have to be intense.&lt;br&gt;Just enough to keep your brain in shape.&lt;/p&gt;



&lt;p&gt;It makes you more engaged with code and more critical during reviews. It also helps you to be more capable of spotting subtle issues and better at validating AI output.&lt;/p&gt;



&lt;p&gt;And yes, it also helps when reviewing code written by teammates who are also using AI.&lt;/p&gt;



&lt;hr class=&quot;wp-block-separator has-alpha-channel-opacity&quot;&gt;



&lt;h2 class=&quot;wp-block-heading&quot;&gt;AI is a power tool not autopilot&lt;/h2&gt;



&lt;p&gt;AI is incredible.&lt;br&gt;It &lt;em&gt;can&lt;/em&gt; make you much more productive.&lt;/p&gt;



&lt;p&gt;But only if you stay engaged, keep thinking, keep practicing and stay in the driver&amp;rsquo;s seat. The goal isn&amp;rsquo;t to fight AI. The goal is to &lt;strong&gt;use it deliberately&lt;/strong&gt;, with good habits and strong guardrails.&lt;/p&gt;



&lt;p&gt;Otherwise you&amp;rsquo;re not saving time, you&amp;rsquo;re just postponing the cost.&lt;/p&gt;
&lt;p&gt;The post &lt;a rel=&quot;nofollow&quot; href=&quot;https://sudoish.com/is-ai-actually-making-you-faster/&quot;&gt;Is AI Actually Making You Faster?&lt;/a&gt; appeared first on &lt;a rel=&quot;nofollow&quot; href=&quot;https://sudoish.com&quot;&gt;sudoish&lt;/a&gt;.&lt;/p&gt;

</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/11287/is-ai-actually-making-you-faster</guid>
<pubDate>Mon, 09 Feb 2026 04:22:40 +0000</pubDate>
</item>
<item>
<title>Why Code Generation Needs Structure: How Programming Knowledge Graphs Are Changing the Game</title>
<link>https://coderlegion.com/10724/why-code-generation-needs-structure-how-programming-knowledge-graphs-are-changing-game</link>
<description>&lt;p&gt;Large Language Models (LLMs) have become indispensable tools for developers. They autocomplete functions, translate natural‑language instructions into code, and even solve algorithmic problems with surprising fluency. Yet, as anyone working with real‑world repositories knows, these models still stumble when the task requires deep contextual understanding. They hallucinate APIs, mis-handle variable scopes, and produce code that “looks right” but fails at runtime.&lt;/p&gt;
&lt;p&gt;Why does this happen? Because most LLMs treat code as text—long sequences of tokens—rather than as structured, interdependent systems. And that’s where a new idea is gaining traction: Programming Knowledge Graphs (PKGs).&lt;/p&gt;
&lt;p&gt;The Problem With Flat Retrieval&lt;/p&gt;
&lt;p&gt;Traditional Retrieval-Augmented Generation (RAG) systems try to help LLMs by pulling in relevant snippets from a codebase. But these systems rely on flat retrieval: chunking files into fixed token windows and embedding them for similarity search. This works for natural language, but not for code. Cut a paragraph in half and you still have meaning; cut a function in half and you break it.&lt;/p&gt;
&lt;p&gt;Flat retrieval often returns fragments that are semantically relevant but syntactically incomplete. The result? Models generate code that passes the “vibe check” but fails the compiler.&lt;/p&gt;
&lt;p&gt;Enter Programming Knowledge Graphs&lt;/p&gt;
&lt;p&gt;PKGs rethink retrieval from the ground up. Instead of treating code as text, they treat it as structure.&lt;/p&gt;
&lt;p&gt;• Code is parsed into Abstract Syntax Trees (ASTs)&lt;br&gt;
Functions, classes, and blocks become nodes in a graph.&lt;br&gt;
• Documentation becomes JSON-based DAGs&lt;br&gt;
Tutorials and guides are broken into structured, navigable fields.&lt;br&gt;
• Retrieval happens at the level of functions or blocks, not arbitrary chunks.&lt;/p&gt;
&lt;p&gt;This shift dramatically improves the quality of retrieved context. In benchmark tests like HumanEval and MBPP, PKG-based retrieval boosts pass@1 accuracy by up to 20–34% compared to dense or sparse retrieval alone.&lt;/p&gt;
&lt;p&gt;The Hidden Trade-Off&lt;/p&gt;
&lt;p&gt;But structure introduces a new challenge. When PKGs retrieve only the relevant block of code—say, a try/except clause—they often exclude the variable definitions or imports that block depends on. This leads to a spike in NameErrors and TypeErrors, even as logical correctness improves.&lt;/p&gt;
&lt;p&gt;In other words: PKGs help models think better, but sometimes give them incomplete ingredients.&lt;/p&gt;
&lt;p&gt;Toward Dynamic, Execution-Aware Retrieval&lt;/p&gt;
&lt;p&gt;To address this, researchers are now exploring a more adaptive architecture: the Dynamic Execution-Aware Knowledge Graph (DE-KG).&lt;/p&gt;
&lt;p&gt;This next-generation approach blends structural rigor with agentic reasoning:&lt;/p&gt;
&lt;p&gt;• Dependency-aware nodes that carry variable definitions&lt;br&gt;
• Hybrid sparse–dense–graph indexing for richer retrieval&lt;br&gt;
• Execution-guided reranking, where candidate code is tested before selection&lt;br&gt;
• Active graph traversal, allowing the system to “zoom out” when context is missing&lt;/p&gt;
&lt;p&gt;The goal is simple but ambitious: retrieval that understands not just what code looks like, but how it behaves.&lt;/p&gt;
&lt;p&gt;The Future of Code Generation&lt;/p&gt;
&lt;p&gt;The shift from text-based to structure-aware retrieval marks a turning point in AI-assisted programming. PKGs show that respecting the shape of code—its syntax, hierarchy, and dependencies—can dramatically improve generation quality. But the next leap will come from systems that combine structure with dynamic reasoning and execution feedback.&lt;/p&gt;
&lt;p&gt;In short, the future of code generation isn’t just bigger models. It’s smarter context.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/10724/why-code-generation-needs-structure-how-programming-knowledge-graphs-are-changing-game</guid>
<pubDate>Thu, 29 Jan 2026 23:35:45 +0000</pubDate>
</item>
<item>
<title>Third-Party Logic - When You Run Code You've Never Seen</title>
<link>https://coderlegion.com/10108/third-party-logic-when-you-run-code-youve-neverseen</link>
<description>&lt;p&gt;By Muhammad Ali Khan ICS/ OT Cybersecurity Specialist - AAISM | CISSP | CISA | CISM | CEH | ISO27001 LI | CHFI | CGEIT | CDCP&lt;/p&gt;
&lt;p&gt;&lt;em&gt;At some point on every plant floor, an uncomfortable truth gets quietly accepted:&lt;br&gt;
&quot;You are running code you've never seen, never reviewed, and don't fully control.&quot;&lt;br&gt;
And in OT and ICS environments, that is a daily operational reality.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;From OEM-supplied PLC blocks to vendor remote support tools, from safety logic libraries to AI-driven optimization modules, third-party logic is deeply embedded into modern industrial systems. It often arrives wrapped in trust, urgency, or contractual obligation. And once deployed, it tends to stay there for years, untouched, unquestioned, and largely invisible.&lt;br&gt;
That's where the danger begins.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Hidden Reality of Third-Party Logic&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Unlike IT software, third-party logic in OT is rarely transparent. Vendors routinely deliver compiled function blocks, encrypted ladder logic, or &quot;black box&quot; firmware updates that operators are discouraged, or contractually prohibited, from inspecting. As a result, asset owners end up executing logic whose behavior they infer rather than understand.&lt;br&gt;
Because of this, trust quietly replaces verification. The logic works, the process runs, and production targets are met, so nobody asks what else the code might be doing. However, operational success does not equal security assurance. In fact, in ICS environments, reliability often masks risk rather than eliminating it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why This Problem Is Unique to OT and ICS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In IT environments, running third-party code is expected, but it's surrounded by layers of visibility: source reviews, sandboxing, EDR, patch cycles, and rapid rollback. In OT, the situation is fundamentally different.&lt;/p&gt;
&lt;p&gt;To begin with, availability outweighs inspection. Plant teams are trained to avoid touching working systems, which means third-party logic often remains frozen in time. Additionally, many controllers lack native logging or runtime visibility, making it difficult to observe what logic is actually doing during execution.&lt;/p&gt;
&lt;p&gt;Furthermore, third-party logic often interacts directly with physical processes. This means a logic flaw is not only a cyber issue, it can translate into unsafe states, equipment damage, or environmental harm. In OT, software behavior has kinetic consequences.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How Third-Party Logic Becomes a Silent Attack Surface&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Because third-party logic is trusted by default, it often bypasses traditional security scrutiny. Vendors are given broad access privileges, remote connectivity is left enabled, and logic updates are applied without independent validation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;As a result, several risks quietly accumulate.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;First, malicious intent becomes hard to detect. A logic block that subtly alters thresholds, delays alarms, or suppresses fault conditions can blend seamlessly into normal operations. Second, unintentional vulnerabilities persist. Poorly written logic, hardcoded credentials, or insecure communication routines can sit unnoticed for years. And third, supply chain compromise becomes invisible. If a vendor's development environment is breached, compromised logic can enter your plant without triggering any alarms.&lt;/p&gt;
&lt;p&gt;Each of these risks exists not because teams are careless, but because the environment was never designed for transparency.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Contractual Trap of &quot;Vendor Intellectual Property&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One of the most overlooked aspects of this issue is legal rather than technical. Many vendors classify control logic as intellectual property, restricting access to source code or even detailed documentation. This places asset owners in a paradoxical position: they are responsible for the safety and security of systems they are not allowed to fully inspect.&lt;/p&gt;
&lt;p&gt;Consequently, cybersecurity governance stops at the vendor boundary. Risk assessments exclude logic internals. Incident response plans assume vendor availability. And security accountability becomes blurred between ownership and authorship.&lt;br&gt;
In practice, this means you are accountable for outcomes, but dependent on third parties for understanding causes.&lt;/p&gt;
&lt;p&gt;Cybersecurity threat in industrial control roomWhy Traditional Security Controls Don't Solve This&lt;br&gt;
It's tempting to assume that firewalls, network segmentation, and access controls are enough. While they are essential, they do nothing to address the logic itself. Once third-party code is running inside a PLC, safety controller, or industrial application, perimeter controls are irrelevant.&lt;/p&gt;
&lt;p&gt;Similarly, vulnerability scanning and patch management fall short. You can scan the device, but not the logic. You can patch the firmware, but not the hidden behavior embedded in function blocks. Without logic-level visibility, security remains superficial.&lt;/p&gt;
&lt;p&gt;Therefore, the real risk is authorized execution of unverified behavior.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Building Visibility Without Breaking Operations&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The solution is not to ban third-party logic; that's unrealistic. Modern industrial systems depend on vendor expertise and prebuilt functionality. Instead, the goal must be controlled trust.&lt;br&gt;
This begins with architectural visibility. Asset inventories should include not just devices, but logic ownership: who wrote it, who maintains it, and when it was last reviewed. Change management must extend to logic updates, even when provided by vendors.&lt;/p&gt;
&lt;p&gt;In addition, behavioral monitoring becomes critical. Instead of trying to read every line of code, organizations should focus on understanding expected behavior and detecting deviations at runtime. Process-aware anomaly detection, logic checksum validation, and configuration baselining provide practical ways to gain assurance without disrupting operations.&lt;/p&gt;
&lt;p&gt;Equally important is contractual evolution. Security review rights, incident disclosure requirements, and update transparency must be embedded into vendor agreements. Trust should be formalized, not assumed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Mindset Shift OT Needs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ultimately, the biggest change is cultural. OT teams must move from &quot;it works, don't touch it&quot; to &quot;it works, but do we understand it?&quot; Security teams, in turn, must respect operational constraints while pushing for deeper assurance.&lt;/p&gt;
&lt;p&gt;Third-party logic is not inherently dangerous. What makes it risky is invisibility combined with permanence. When code runs for a decade without review, it becomes infrastructure, and infrastructure is hard to question.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Final Thought&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Every PLC cycle executes instructions that shape physical reality. When those instructions come from sources you've never seen, you are operating on borrowed trust.&lt;/p&gt;
&lt;p&gt;In modern OT and ICS environments, cybersecurity is no longer just about keeping attackers out. It's about knowing what you've already let in.&lt;/p&gt;
&lt;p&gt;And the most dangerous code is not the one that crashes systems, it's the one that runs perfectly, silently, and unquestioned.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/10108/third-party-logic-when-you-run-code-youve-neverseen</guid>
<pubDate>Tue, 20 Jan 2026 19:30:32 +0000</pubDate>
</item>
<item>
<title>How to Verify a Smart Contract the Right Way (A Real, Practical Guide) Smart contract verification</title>
<link>https://coderlegion.com/8661/how-verify-smart-contract-the-right-way-real-practical-guide-smart-contract-verification</link>
<description>&lt;p&gt;How to Verify a Smart Contract the Right Way (A Real, Practical Guide)&lt;br&gt;
Smart contract verification is not just a “nice to have” — it’s a core trust signal in crypto. Whether you’re building a DeFi project, a utility token, or experimenting with blockchain tech, verification shows transparency and professionalism.&lt;br&gt;
Here’s a clear, real-world breakdown of how it’s actually done.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Deploy the Contract Correctly&lt;br&gt;
Before verification, your contract must already be deployed on-chain (BSC, Ethereum, etc.).&lt;br&gt;
Make sure:&lt;br&gt;
The deployed bytecode matches your source code&lt;br&gt;
You used a stable compiler version (don’t change it later)&lt;br&gt;
Constructor parameters are saved&lt;br&gt;
Mistakes here cause 90% of verification failures.&lt;/li&gt;
&lt;li&gt;Use the Same Compiler &amp;amp; Settings&lt;br&gt;
When verifying on BscScan / Etherscan:&lt;br&gt;
Compiler version must match exactly&lt;br&gt;
Optimization ON/OFF must be the same&lt;br&gt;
If optimization is ON, use the same runs number&lt;br&gt;
Even one small mismatch = verification fail.&lt;/li&gt;
&lt;li&gt;Use Clean, Readable Code&lt;br&gt;
Avoid:&lt;br&gt;
Hidden logic&lt;br&gt;
Obfuscated functions&lt;br&gt;
Unnecessary permissions&lt;br&gt;
A verified contract should be easy for anyone to read.&lt;br&gt;
If users can’t understand it, they won’t trust it.&lt;/li&gt;
&lt;li&gt;Verify on the Official Explorer&lt;br&gt;
Use:&lt;br&gt;
BscScan for BNB Smart Chain&lt;br&gt;
Etherscan for Ethereum&lt;br&gt;
Paste:&lt;br&gt;
Contract address&lt;br&gt;
Solidity code&lt;br&gt;
Constructor arguments (if any)&lt;br&gt;
Once verified, the contract becomes publicly readable and interactive.&lt;/li&gt;
&lt;li&gt;Add Token Metadata (Optional but Important)&lt;br&gt;
After verification:&lt;br&gt;
Add token logo&lt;br&gt;
Add social links&lt;br&gt;
Add description&lt;br&gt;
This improves visibility in wallets, explorers, and dApps.&lt;/li&gt;
&lt;li&gt;Why Verification Matters&lt;br&gt;
A verified contract:&lt;br&gt;
Builds investor confidence&lt;br&gt;
Reduces scam accusations&lt;br&gt;
Allows wallet integrations&lt;br&gt;
Enables analytics &amp;amp; listings&lt;br&gt;
Shows you have nothing to hide&lt;br&gt;
In crypto, transparency is value.&lt;br&gt;
Final Thought&lt;br&gt;
You don’t need hype to build trust.&lt;br&gt;
You need clean code, verified contracts, and consistency.&lt;br&gt;
Projects that focus on fundamentals always last longer.&lt;/li&gt;
&lt;/ol&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/8661/how-verify-smart-contract-the-right-way-real-practical-guide-smart-contract-verification</guid>
<pubDate>Sat, 20 Dec 2025 22:52:41 +0000</pubDate>
</item>
<item>
<title>Don’t Repeat Yourself (DRY) the Right Way: How to Reuse Code Without Creating a Mess</title>
<link>https://coderlegion.com/7810/dont-repeat-yourself-dry-the-right-way-how-to-reuse-code-without-creating-a-mess</link>
<description>&lt;p&gt;Every developer has heard “Don’t Repeat Yourself” (DRY)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;How much code reuse is too much?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Am I over-abstracting?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Should this be a helper? A util? A service? A hook?&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The truth:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bad DRY creates more problems than it solves.&lt;/li&gt;
&lt;li&gt;Good DRY makes your code predictable, clean, and future-proof.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DRY is not just removing duplication&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;it’s learning what deserves reuse and what deserves separation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This post walks you through how to write reusable code the right way&lt;/p&gt;
&lt;h3 id=&quot;why-dry-matters&quot;&gt;&lt;em&gt;Why DRY Matters&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Good reuse helps you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix bugs once instead of 5 times&lt;/li&gt;
&lt;li&gt;Scale faster&lt;/li&gt;
&lt;li&gt;Reduce cognitive load&lt;/li&gt;
&lt;li&gt;Keep your project consistent&lt;/li&gt;
&lt;li&gt;Avoid “copy-paste debt”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But bad reuse leads to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unnecessary abstractions&lt;/li&gt;
&lt;li&gt;Confusing utilities&lt;/li&gt;
&lt;li&gt;One giant file everyone is scared to touch&lt;/li&gt;
&lt;li&gt;“Helper” folders full of black magic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Let’s fix that.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;step-1-dry-only-when-the-behavior-repeats-not-the-code-&quot;&gt;&lt;strong&gt;Step 1: DRY Only When the Behavior Repeats (Not the Code)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Most developers refactor too early.&lt;/p&gt;
&lt;p&gt;Look at these two functions:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function createUser() {
  console.log(&quot;Creating user…&quot;);
  // some logic
}

function createProduct() {
  console.log(&quot;Creating product…&quot;);
  // some logic
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These look similar.&lt;br&gt;
But should they be merged?&lt;/p&gt;
&lt;p&gt;❌ No.&lt;br&gt;
The only repeated line is a console log the behavior is different.&lt;/p&gt;
&lt;p&gt;DRY is not about removing repeated lines.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It’s about removing repeated logic.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;step-2-start-with-local-reuse-before-global-reuse-&quot;&gt;&lt;strong&gt;Step 2: Start With “Local Reuse” Before “Global Reuse”&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Most developers jump straight to a /utils folder.&lt;/p&gt;
&lt;p&gt;Instead, follow this rules&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If only one feature uses it, keep it inside that feature.&lt;/li&gt;
&lt;li&gt;If two features use it, promote it to a shared place.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Example React structure:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/features
  /auth
    login.js
    useLogin.js
  /dashboard
    useDashboard.js
/shared
  /hooks
    useFetch.js   ← used by multiple features
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You “graduate” code only when needed.&lt;/p&gt;
&lt;h3 id=&quot;step-3-extract-reusable-code-the-smart-way&quot;&gt;&lt;strong&gt;Step 3: Extract Reusable Code the SMART Way&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Before extracting shared code, ask:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Will this logic change in different ways depending on the feature?&lt;/p&gt;
&lt;p&gt;   If yes → keep it local.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does this logic repeat AND behave the same?&lt;/p&gt;
&lt;p&gt;If yes → extract it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does extraction make the code clearer or more confusing?&lt;/p&gt;
&lt;p&gt;If confusing → stop. &lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;step-4-real-examples-of-good-reuse&quot;&gt;&lt;strong&gt;Step 4: Real Examples of Good Reuse&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Example: Reusable API Client&lt;/p&gt;
&lt;p&gt;Bad:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fetch(&quot;/api/users&quot;)
fetch(&quot;/api/products&quot;)
fetch(&quot;/api/orders&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Good:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export async function api(url, options = {}) {
  return fetch(url, options).then(res =&amp;gt; res.json());
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;step-5-the-dry-traps-avoid-these-at-all-costs-&quot;&gt;&lt;strong&gt;Step 5: The DRY Traps (Avoid These at All Costs)&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Over-abstracting early&lt;/p&gt;
&lt;p&gt;Don’t create files “just in case.”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Giant utility folders&lt;/p&gt;
&lt;p&gt; If you have a helpers.js with 37 functions, it’s time to rethink.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mixing unrelated logic&lt;/p&gt;
&lt;p&gt;utils/index.js containing API logic, string formatting, date parsing, and a random debounce function.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creating shared code for one-off logic&lt;/p&gt;
&lt;p&gt; Not everything needs reuse.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;step-6-when-to-refactor-for-reuse&quot;&gt;&lt;strong&gt;Step 6: When to Refactor for Reuse&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Refactor when:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Two modules copy-paste the same logic&lt;/li&gt;
&lt;li&gt;Fixing a bug means changing multiple files&lt;/li&gt;
&lt;li&gt;Code feels “the same but slightly different”&lt;/li&gt;
&lt;li&gt;You keep writing similar boilerplate&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;If you catch yourself repeating work, that’s your signal.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;final-thought&quot;&gt;&lt;strong&gt;Final Thought&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;DRY isn’t about having zero duplication, it’s about smart duplication and smarter reuse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good code is:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;clear&lt;/li&gt;
&lt;li&gt;predictable&lt;/li&gt;
&lt;li&gt;discoverable&lt;/li&gt;
&lt;li&gt;reusable when needed&lt;/li&gt;
&lt;li&gt;duplicated when necessary&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Yes, duplication is sometimes the right choice.&lt;/p&gt;
&lt;p&gt;Your goal isn’t to write fancy code.&lt;br&gt;
Your goal is to write code that future you, your teammates, and your project can trust.&lt;/p&gt;
</description>
<category>Java</category>
<guid isPermaLink="true">https://coderlegion.com/7810/dont-repeat-yourself-dry-the-right-way-how-to-reuse-code-without-creating-a-mess</guid>
<pubDate>Tue, 25 Nov 2025 16:28:41 +0000</pubDate>
</item>
<item>
<title>Software Testing for Beginners</title>
<link>https://coderlegion.com/6509/software-testing-for-beginners</link>
<description>&lt;p&gt;Software testing is an important phase in the Software Development Life Cycle (SDLC). It ensures that the software product is reliable, performs as expected, and meets user requirements. According to Robert Glass, the most important thing is user satisfaction.So, to make a compliant product as per the user requirements and needs, we need testing to ensure the quality of software is maintained and there are no defects in the software when it is made available to the end users.&lt;/p&gt;
&lt;p&gt;Testing is usually performed in multiple levels, starting from small code units to the complete system, to catch errors as early as possible.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;major-types-of-testing&quot;&gt;Major types of Testing&lt;/h3&gt;
&lt;p&gt;Even though there are many types of testing, we will focus on the major three listed below :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Unit Testing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integration Testing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;System Testing&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&quot;unit-testing&quot;&gt;Unit Testing&lt;/h3&gt;
&lt;p&gt;Unit Testing focuses on testing the &lt;strong&gt;smallest individual parts&lt;/strong&gt; of the software usually &lt;strong&gt;functions, methods, or classes&lt;/strong&gt; to ensure each component works correctly in isolation.The main goal is to &lt;strong&gt;verify that each unit performs as intended&lt;/strong&gt;, independent of other parts of the system. It is done by the developers during the coding/development phase.&lt;br&gt;
&lt;strong&gt;Example&lt;/strong&gt; : Suppose you are developing a calculator app, testing whether the &lt;code&gt;add()&lt;/code&gt; or &lt;code&gt;divide()&lt;/code&gt; function returns the correct result would be considered Unit Testing.&lt;/p&gt;
&lt;p&gt;Now the problem with testing an individual component is that it may be calling some other function or dependent on some other module. Now there is a high chance that other module is not ready yet. So to test our original module, we need some fake programs known as &lt;strong&gt;stubs&lt;/strong&gt; and &lt;strong&gt;drivers&lt;/strong&gt;.&lt;/p&gt;
&lt;h4 id=&quot;stub&quot;&gt;&lt;strong&gt;Stub&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;A &lt;strong&gt;stub&lt;/strong&gt; is a &lt;strong&gt;fake or temporary module&lt;/strong&gt; used to &lt;strong&gt;simulate a called function&lt;/strong&gt; that has not been developed yet.&lt;br&gt;
It provides dummy data or simple output to help test the main unit.&lt;/p&gt;
&lt;p&gt;To put it simply, Stub replaces the module that your code &lt;strong&gt;calls.&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&quot;driver&quot;&gt;&lt;strong&gt;Driver&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;A &lt;strong&gt;driver&lt;/strong&gt; is a &lt;strong&gt;temporary main program&lt;/strong&gt; used to &lt;strong&gt;call and test a module&lt;/strong&gt; that is not yet connected to the main system.&lt;br&gt;
It sends input to the unit and checks the output.&lt;/p&gt;
&lt;p&gt;To put it simply, Driver replaces the module that &lt;strong&gt;calls your code.&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&quot;real-world-example-e-commerce-platform-&quot;&gt;&lt;strong&gt;Real World Example (E-Commerce Platform)&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Imagine you are developing an &lt;strong&gt;e-commerce website&lt;/strong&gt;.&lt;br&gt;
There are three modules:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;LoginModule&lt;/code&gt; : handles user login.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;CartModule&lt;/code&gt; : adds and removes items.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;PaymentModule&lt;/code&gt; : processes payments.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Case 1: Using a &lt;strong&gt;Stub&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You want to test the &lt;strong&gt;CartModule&lt;/strong&gt;, but the &lt;strong&gt;PaymentModule&lt;/strong&gt; isn’t ready yet.&lt;br&gt;
The Cart module needs to “call” the Payment module to process payment.&lt;br&gt;
You create a &lt;strong&gt;stub&lt;/strong&gt; that pretends to be the Payment module and returns a fake success message.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;// Stub for PaymentModule
string processPayment(int amount) {
    return &quot;Payment Successful (Stub)&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So when you test the Cart module, it behaves as if the payment worked, even though the real payment system isn’t built.&lt;/p&gt;
&lt;p&gt;Case 2: Using a &lt;strong&gt;Driver&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now suppose the &lt;strong&gt;LoginModule&lt;/strong&gt; is not ready, but you want to test the &lt;strong&gt;CartModule&lt;/strong&gt; (which normally gets called after login).&lt;br&gt;
You create a &lt;strong&gt;driver&lt;/strong&gt; that simulates a login and directly calls the Cart module.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;// Driver for CartModule
int main() {
    cout&amp;lt;&amp;lt;&quot;Driver: Simulating Login...\n&quot;;
    addToCart(&quot;Laptop&quot;, 2);  // Calling the Cart module
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;strong&gt;driver&lt;/strong&gt; acts like a test launcher to check if the Cart module works properly — without waiting for the login feature.&lt;/p&gt;
&lt;h4 id=&quot;tools-used&quot;&gt;Tools Used&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JUnit&lt;/strong&gt; (Java)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;NUnit&lt;/strong&gt; (.NET)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PyTest&lt;/strong&gt; (Python)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Google Test&lt;/strong&gt; (C++)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Jest&lt;/strong&gt; (JavaScript)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;benefits&quot;&gt;Benefits&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Detects bugs early in the development.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Makes debugging easier.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Improves code reliability and maintainability.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;integration-testing&quot;&gt;Integration Testing&lt;/h3&gt;
&lt;p&gt;Integration Testing checks if &lt;strong&gt;different modules or components work together&lt;/strong&gt; correctly after being combined. So we combine multiple modules either incrementally or all at once(not followed in real life).&lt;/p&gt;
&lt;p&gt;Its goal is to &lt;strong&gt;verify the data flow&lt;/strong&gt; between integrated modules and to identify any kinds of interface defects. Example : Continuing the calculator program, after testing the &lt;code&gt;add()&lt;/code&gt; and &lt;code&gt;subtract()&lt;/code&gt; functions individually, you perform integration testing to ensure they work together correctly when combined in a larger “calculator module” or with the user interface. It is done right after unit testing, and it is usually done by the testing group. (Sometimes, it involves the developers too).&lt;/p&gt;
&lt;h4 id=&quot;types-of-integration-testing&quot;&gt;Types of Integration Testing&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Big Bang Approach&lt;/strong&gt; : All modules are integrated together at once.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Incremental Approach&lt;/strong&gt; : Modules are integrated and tested one by one:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Top-Down&lt;/strong&gt; (start from higher-level modules)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bottom-Up&lt;/strong&gt; (start from lower-level modules)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;big-bang-approach&quot;&gt;&lt;strong&gt;Big Bang Approach&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;In the Big Bang approach, &lt;strong&gt;all modules are integrated at once&lt;/strong&gt; and then tested as a complete system.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Easy to implement if all modules are ready.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simple process for small projects.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Hard to identify which module caused a failure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Debugging is difficult for large systems.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; On an e-commerce platform, the Cart, Payment, Login, and Product modules are all combined at the same time and tested together.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;incremental-approach&quot;&gt;&lt;strong&gt;Incremental Approach&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;In the Incremental approach, &lt;strong&gt;modules are integrated and tested one by one&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Easier to identify errors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bugs can be fixed immediately.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Takes more time than Big Bang.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Requires planning the order of integration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are &lt;strong&gt;two main types&lt;/strong&gt; of Incremental Integration:&lt;/p&gt;
&lt;h5 id=&quot;a-top-down-integration&quot;&gt;a) Top-Down Integration&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start testing from the higher-level modules&lt;/strong&gt; and move down to lower-level modules.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Test the overall Checkout module first, then integrate and test the Cart module, then the Payment module, and so on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Sometimes &lt;strong&gt;stubs&lt;/strong&gt; are needed to simulate lower-level modules that aren’t ready yet.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&quot;b-bottom-up-integration&quot;&gt;b) Bottom-Up Integration&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start testing from the lower-level modules&lt;/strong&gt; and move up to higher-level modules.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Test the Payment module first, then Cart module, then finally the Checkout module.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Sometimes &lt;strong&gt;drivers&lt;/strong&gt; are used to simulate higher-level modules that call the lower ones.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;tools-used-1&quot;&gt;Tools Used&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JUnit (for integration suites)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TestNG&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Postman&lt;/strong&gt; (for API integration)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Selenium&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;benefits-1&quot;&gt;Benefits&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Detects interface mismatches early.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensures smooth interaction between modules.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;system-testing&quot;&gt;System Testing&lt;/h3&gt;
&lt;p&gt;System Testing evaluates the &lt;strong&gt;entire integrated system&lt;/strong&gt; as a whole to verify that it meets the specified requirements.It ensures that &lt;strong&gt;all components and features function together properly&lt;/strong&gt; in the target environment.&lt;br&gt;
&lt;strong&gt;Example&lt;/strong&gt; : In the calculator app, system testing would verify that the full app including input handling, UI, and calculations works correctly on the user’s device.&lt;/p&gt;
&lt;h4 id=&quot;tools-used-2&quot;&gt;Tools Used&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Selenium&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;LoadRunner&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;QTP (UFT)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JMeter&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;benefits-2&quot;&gt;Benefits&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Validates end-to-end system behavior.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Checks compatibility, usability, and performance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Detects issues that only appear in the full system.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Unit Testing</category>
<guid isPermaLink="true">https://coderlegion.com/6509/software-testing-for-beginners</guid>
<pubDate>Thu, 16 Oct 2025 11:46:31 +0000</pubDate>
</item>
<item>
<title>When and Why to Rewrite OOP Code in Functional Style</title>
<link>https://coderlegion.com/3731/when-and-why-to-rewrite-oop-code-in-functional-style</link>
<description>&lt;hr&gt;
&lt;h3 id=&quot;when-and-why-to-rewrite-oop-code-in-functional-style&quot;&gt;When and Why to Rewrite OOP Code in Functional Style&lt;/h3&gt;
&lt;p&gt;Rewriting a large object-oriented programming (OOP) codebase into a functional programming (FP) style is a bold and often controversial move in software engineering. While the challenges are significant—including a steep learning curve, possible disruptions to productivity, and the complexity of transitioning a live system—the rewards can be equally transformative. Under the right circumstances, refactoring OOP code into a functional paradigm can bring enhanced maintainability, scalability, and even performance gains to your system. In this article, we’ll explore when such a rewrite makes sense, the benefits it offers, and the key considerations you must account for.&lt;/p&gt;
&lt;p&gt;This deep dive is intended for software architects, senior developers, and engineering managers who are contemplating or currently planning a paradigm shift in their software systems. We’ll detail the scenarios where this shift is not only justified but potentially game-changing.&lt;/p&gt;
&lt;h4 id=&quot;understanding-the-philosophical-divide-oop-vs-functional-programming&quot;&gt;Understanding the Philosophical Divide: OOP vs Functional Programming&lt;/h4&gt;
&lt;p&gt;Before diving into the &quot;when&quot; and &quot;why,&quot; it's essential to understand what distinguishes these two paradigms. Object-Oriented Programming organizes code around objects—collections of data and behavior—relying heavily on inheritance, polymorphism, and encapsulation. It's widely used and deeply entrenched in enterprise-level applications, particularly in languages like Java, C++, and C#.&lt;/p&gt;
&lt;p&gt;Functional Programming, on the other hand, emphasizes pure functions, immutability, and declarative code. Rather than modifying state, FP favors data transformations. Languages like Haskell, Elixir, and Clojure embody this approach, though functional styles can also be adopted in modern multi-paradigm languages such as Python, JavaScript, Kotlin, Scala, and even Java.&lt;/p&gt;
&lt;p&gt;These two paradigms don’t just differ in syntax; they represent fundamentally different ways of thinking about problems and solutions. Shifting from OOP to FP is like switching from building blueprints to designing ecosystems—each approach has its strengths and limitations.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;scenario-1-taming-complex-state-management&quot;&gt;Scenario 1: Taming Complex State Management&lt;/h3&gt;
&lt;p&gt;One of the most compelling reasons to move from an object-oriented to a functional codebase is to reduce the complexity of state management. In large systems, tracking state mutations across deeply nested objects and shared mutable data can become nearly impossible, leading to elusive bugs and maintenance nightmares.&lt;/p&gt;
&lt;p&gt;Functional programming enforces immutability and encourages the use of pure functions, which do not rely on or modify external state. This significantly simplifies reasoning about code. When each function has a clear input and output with no side effects, debugging and testing become much easier. Systems that previously required complex mocking and integration tests can now be validated with straightforward unit tests.&lt;/p&gt;
&lt;p&gt;For systems where state changes are a constant source of bugs—such as real-time applications, distributed systems, or financial transaction platforms—a functional rewrite can lead to dramatic improvements in both reliability and maintainability.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;scenario-2-scaling-for-concurrency-and-parallelism&quot;&gt;Scenario 2: Scaling for Concurrency and Parallelism&lt;/h3&gt;
&lt;p&gt;Modern applications must often scale across multiple processors or even distributed clusters. Object-oriented codebases often struggle in this regard because shared mutable state introduces race conditions and makes concurrency error-prone. Even with synchronization mechanisms like locks or semaphores, the risk of deadlocks, resource contention, and performance bottlenecks remains high.&lt;/p&gt;
&lt;p&gt;Functional programming offers a better fit for concurrent execution. Since functions avoid side effects and data is immutable, operations can be safely executed in parallel. Frameworks like Akka (for Scala) or Elixir’s OTP harness functional principles to achieve fault-tolerant concurrency at scale.&lt;/p&gt;
&lt;p&gt;If your application must support thousands of simultaneous users, handle parallel data streams, or interact with asynchronous services, rewriting critical portions in a functional style can drastically improve performance and reliability.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;scenario-3-reducing-technical-debt-in-legacy-systems&quot;&gt;Scenario 3: Reducing Technical Debt in Legacy Systems&lt;/h3&gt;
&lt;p&gt;Legacy codebases often evolve into monoliths riddled with tight coupling, hidden dependencies, and tangled inheritance hierarchies. As features are bolted on over years, the system becomes brittle and resistant to change—a state commonly referred to as technical debt.&lt;/p&gt;
&lt;p&gt;Functional programming encourages modularity, composition, and stateless design, which naturally lead to codebases that are easier to maintain and extend. Functions can be reused without worrying about the side effects of hidden states. When dealing with a legacy OOP system that’s becoming too costly to maintain, a functional rewrite—even partial—can serve as a strategic investment that reduces long-term costs.&lt;/p&gt;
&lt;p&gt;It’s worth noting that such rewrites can be done incrementally. Many languages support both paradigms, allowing for gradual adoption. For example, teams working in JavaScript can begin using functional libraries like Ramda or Lodash/fp before committing to a full architectural overhaul.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;scenario-4-improving-testability-and-reliability&quot;&gt;Scenario 4: Improving Testability and Reliability&lt;/h3&gt;
&lt;p&gt;Testing object-oriented systems often requires mocking complex objects, managing dependency injection, and simulating state changes—all of which can make writing tests a laborious process. This overhead frequently leads to insufficient test coverage and increased risk of bugs in production.&lt;/p&gt;
&lt;p&gt;In contrast, functional code is naturally testable. Pure functions can be tested with simple input/output comparisons, and the absence of side effects means there’s no need for elaborate setup or teardown routines. As a result, teams can achieve higher test coverage with less effort.&lt;/p&gt;
&lt;p&gt;Rewriting parts of an OOP system into a functional style can thus be a strategic move to increase confidence in the system’s correctness, reduce bugs, and streamline continuous integration processes.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;scenario-5-preparing-for-domain-driven-design-ddd-&quot;&gt;Scenario 5: Preparing for Domain-Driven Design (DDD)&lt;/h3&gt;
&lt;p&gt;Domain-Driven Design seeks to model complex domains in a way that reflects real-world business logic. While traditionally associated with OOP, DDD principles—like bounded contexts, aggregate roots, and domain events—also map well to functional programming.&lt;/p&gt;
&lt;p&gt;In fact, functional languages can provide better abstraction tools for modeling business logic due to their emphasis on algebraic data types, pattern matching, and immutability. These features make it easier to write clear, intention-revealing code that’s resistant to misuse and logically consistent.&lt;/p&gt;
&lt;p&gt;Organizations looking to modernize their architecture by adopting DDD may find a functional approach not just compatible but actually advantageous.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;scenario-6-enhancing-developer-productivity-and-onboarding&quot;&gt;Scenario 6: Enhancing Developer Productivity and Onboarding&lt;/h3&gt;
&lt;p&gt;While functional programming has a reputation for a steep learning curve, once developers become proficient, productivity often increases. Code tends to be shorter, more predictable, and less error-prone. Additionally, functional code encourages declarative thinking, which can reduce cognitive load.&lt;/p&gt;
&lt;p&gt;In a large OOP codebase, new developers may struggle to understand the intricate class hierarchies and implicit behaviors. By contrast, a well-structured functional codebase offers smaller, composable units that are easier to grasp in isolation.&lt;/p&gt;
&lt;p&gt;If your team is experiencing high turnover or scaling rapidly, a shift to a functional codebase could reduce onboarding time and improve code quality across the board.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;scenario-7-enforcing-a-more-disciplined-codebase&quot;&gt;Scenario 7: Enforcing a More Disciplined Codebase&lt;/h3&gt;
&lt;p&gt;In OOP, discipline is often left to the developer. It’s possible—and common—to misuse inheritance, allow state to leak, or create “god objects” that violate separation of concerns. Functional programming is more restrictive by nature, which can be a blessing in disguise.&lt;/p&gt;
&lt;p&gt;By enforcing immutability, discouraging side effects, and promoting composition, a functional style nudges developers toward better practices. This built-in discipline reduces the room for error and makes it easier to enforce architectural standards across teams.&lt;/p&gt;
&lt;p&gt;In large organizations where code quality and consistency are critical, this can lead to more maintainable and scalable systems over the long run.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;strategic-considerations-before-rewriting&quot;&gt;Strategic Considerations Before Rewriting&lt;/h3&gt;
&lt;p&gt;Despite the benefits, rewriting an entire codebase is risky. It’s time-consuming, potentially disruptive, and can introduce regressions if not done carefully. Before committing, it’s crucial to conduct a cost-benefit analysis and determine whether the gains from functional programming justify the investment.&lt;/p&gt;
&lt;p&gt;Often, a full rewrite isn’t necessary. Instead, consider refactoring specific modules—especially those with critical bugs, performance bottlenecks, or architectural issues—into a functional style. This hybrid approach allows teams to test the waters and gain experience before committing more fully.&lt;/p&gt;
&lt;p&gt;It’s also essential to ensure that your development team has—or is willing to acquire—the necessary skills. Functional programming introduces concepts like higher-order functions, monads, and recursion that may be unfamiliar to developers with a purely OOP background. Investing in training and mentorship is key to a successful transition.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;tools-and-languages-that-support-functional-refactoring&quot;&gt;Tools and Languages That Support Functional Refactoring&lt;/h3&gt;
&lt;p&gt;Thankfully, many modern languages are multi-paradigm and support functional features natively. JavaScript, for example, has first-class functions and libraries like RxJS and Ramda. Kotlin offers powerful FP constructs like data classes, extension functions, and coroutines. Even Java has introduced functional features such as streams and lambdas in recent versions.&lt;/p&gt;
&lt;p&gt;This means you don’t necessarily need to switch languages to adopt a functional approach. Instead, you can evolve your architecture gradually, leveraging functional principles where they make the most sense.&lt;/p&gt;
&lt;p&gt;For teams starting from scratch, languages like Scala, Elixir, or F# may offer a more idiomatic experience. These languages are designed with FP in mind and provide robust ecosystems for building scalable, maintainable applications.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;real-world-success-stories&quot;&gt;Real-World Success Stories&lt;/h3&gt;
&lt;p&gt;Companies like Twitter, Netflix, and Walmart have incorporated functional programming into their tech stacks to varying degrees. Twitter famously moved from Ruby on Rails to Scala to handle concurrency at scale. Netflix uses functional programming principles in its microservices architecture, leveraging RxJava and other reactive tools.&lt;/p&gt;
&lt;p&gt;These case studies demonstrate that FP is not just academic theory—it’s being used in production to solve real-world problems at scale. For teams facing similar challenges, these examples offer both inspiration and proof of viability.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;final-thoughts-1&quot;&gt;Final Thoughts&lt;/h3&gt;
&lt;p&gt;Rewriting a large object-oriented codebase in a functional style is not a decision to be taken lightly. It involves risk, effort, and a fundamental shift in how developers think about software. But under the right conditions—such as managing complex state, scaling for concurrency, or reducing technical debt—it can offer substantial rewards.&lt;/p&gt;
&lt;p&gt;The key is to approach the transition strategically. Start small, focus on high-impact modules, invest in training, and adopt a hybrid model if needed. With careful planning and the right mindset, functional programming can become a powerful tool in your software engineering arsenal.&lt;/p&gt;
&lt;hr&gt;
</description>
<category>Coding</category>
<guid isPermaLink="true">https://coderlegion.com/3731/when-and-why-to-rewrite-oop-code-in-functional-style</guid>
<pubDate>Sat, 05 Jul 2025 19:31:02 +0000</pubDate>
</item>
</channel>
</rss>