<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Software Engineering on Nalar</title>
    <link>https://nalar.dev/tags/software-engineering/</link>
    <description>Recent content in Software Engineering on Nalar</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 01 Sep 2026 00:00:00 +0700</lastBuildDate>
    <atom:link href="https://nalar.dev/tags/software-engineering/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Contract Tests for Reliable Service Boundaries</title>
      <link>https://nalar.dev/contract-tests-for-service-boundaries/</link>
      <pubDate>Tue, 01 Sep 2026 00:00:00 +0700</pubDate>
      <guid>https://nalar.dev/contract-tests-for-service-boundaries/</guid>
      <description>&lt;p&gt;Distributed systems fail in an awkward place: each service can pass its own tests while the interaction between two services is incompatible.&lt;/p&gt;&#xA;&lt;p&gt;A provider may rename a JSON field, tighten validation, change an enum, or stop returning a value that a consumer quietly depends on. Contract tests make those cross-service assumptions executable.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-a-contract-is&#34;&gt;What a contract is&lt;/h2&gt;&#xA;&lt;p&gt;A contract describes an observable interaction between a consumer and a provider.&lt;/p&gt;&#xA;&lt;p&gt;For an HTTP API, it might specify:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Evolving APIs Without Breaking Clients</title>
      <link>https://nalar.dev/evolving-apis-without-breaking-clients/</link>
      <pubDate>Tue, 01 Sep 2026 00:00:00 +0700</pubDate>
      <guid>https://nalar.dev/evolving-apis-without-breaking-clients/</guid>
      <description>&lt;p&gt;An API is not only an HTTP path or function signature. It is a contract about syntax, semantics, timing, errors, ordering, defaults, and lifecycle.&lt;/p&gt;&#xA;&lt;p&gt;Breaking changes often happen because a server remains syntactically compatible while changing one of those less-visible assumptions.&lt;/p&gt;&#xA;&lt;p&gt;Safe API evolution starts by identifying what clients can reasonably depend on and designing changes that allow old and new versions to coexist.&lt;/p&gt;&#xA;&lt;h2 id=&#34;compatibility-has-multiple-dimensions&#34;&gt;Compatibility has multiple dimensions&lt;/h2&gt;&#xA;&lt;p&gt;A change can preserve JSON shape and still break clients.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Feature Flags Without Long-Lived Technical Debt</title>
      <link>https://nalar.dev/feature-flags-without-technical-debt/</link>
      <pubDate>Tue, 01 Sep 2026 00:00:00 +0700</pubDate>
      <guid>https://nalar.dev/feature-flags-without-technical-debt/</guid>
      <description>&lt;p&gt;Feature flags decouple code deployment from feature release. A team can deploy dormant code, enable it for internal users, roll it out gradually, and disable it without rebuilding the application.&lt;/p&gt;&#xA;&lt;p&gt;The cost is hidden control flow. Every long-lived flag creates another possible system configuration, and interacting flags multiply those configurations quickly.&lt;/p&gt;&#xA;&lt;p&gt;The engineering goal is therefore not &amp;ldquo;use flags everywhere.&amp;rdquo; It is to make each flag temporary, observable, and owned.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
