<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sarmad Ahmed Khalil</title>
    <description>The latest articles on DEV Community by Sarmad Ahmed Khalil (@sarmadkhalil).</description>
    <link>https://dev.to/sarmadkhalil</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3821157%2Ff03e9dc5-69a3-45f3-9bfd-1c50253f5f24.jpeg</url>
      <title>DEV Community: Sarmad Ahmed Khalil</title>
      <link>https://dev.to/sarmadkhalil</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sarmadkhalil"/>
    <language>en</language>
    <item>
      <title>SAP CAP Java: Why I still Code (and why Low-Code is holding you back)</title>
      <dc:creator>Sarmad Ahmed Khalil</dc:creator>
      <pubDate>Thu, 12 Mar 2026 23:26:53 +0000</pubDate>
      <link>https://dev.to/sarmadkhalil/sap-cap-java-why-i-still-code-and-why-low-code-is-holding-you-back-4le1</link>
      <guid>https://dev.to/sarmadkhalil/sap-cap-java-why-i-still-code-and-why-low-code-is-holding-you-back-4le1</guid>
      <description>&lt;p&gt;I’ve been seeing a lot of hype lately about "Citizen Developers" and how low-code is going to replace the need for actual programming in the SAP ecosystem.&lt;/p&gt;

&lt;p&gt;Look, if you’re building a simple form for a one-off task, fine. Use Build Apps. But if you’re trying to build a real enterprise-grade extension on SAP BTP—something that actually scales—low-code is a trap.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Visual Logic" Headache
&lt;/h2&gt;

&lt;p&gt;The biggest lie in low-code is that it's "faster."&lt;/p&gt;

&lt;p&gt;Maybe it’s faster for the first 10 minutes. But the moment you hit a real-world requirement—like handling complex document streams or a non-standard OData expansion—you hit a wall.&lt;/p&gt;

&lt;p&gt;In CAP Java, if I need to map a massive, messy external payload to my clean CDS entities, I’m not dragging boxes. I just pull in MapStruct. It’s type-safe, fast, and handles the "dirty work" so I can focus on the business logic. Look at how much cleaner this is than trying to find a "workaround" in a visual tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Mapper&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;componentModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"spring"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;InvoiceMapper&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Mapping messy external JSON to my CDS-based Entity&lt;/span&gt;
    &lt;span class="nd"&gt;@Mapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"ext_ref"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"referenceNumber"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nd"&gt;@Mapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"vendor_id"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"supplier"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nc"&gt;Invoice&lt;/span&gt; &lt;span class="nf"&gt;toEntity&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ExternalInvoiceDto&lt;/span&gt; &lt;span class="n"&gt;dto&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In a low-code tool, you’d spend an hour clicking through menus just to map those fields. In Java, it’s a single interface, and more importantly, it’s testable.&lt;/p&gt;

&lt;p&gt;Visual flowcharts aren't architecture. Architecture is about maintainability. How do you do a proper peer review on a visual block? How do you run a git diff to see what changed in a production hotfix? You can't. With CDS and Java, my logic is transparent, version-controlled, and solid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why CAP Java is the actual "Clean Core"
&lt;/h2&gt;

&lt;p&gt;For the backend extensions I'm building, I’m sticking with the Java stack for a few blunt reasons:&lt;/p&gt;

&lt;p&gt;Type-safety isn't a luxury: I want my compiler to scream at me if my data model is broken. I don't want to find out during a production demo that a field was missing because a drag-and-drop connection was loose.&lt;/p&gt;

&lt;p&gt;The JVM handles the heavy lifting: When you’re orchestrating high-volume data between BTP and S/4HANA, you need the performance of the JVM. Scripts and "flows" just don't have the same level of memory management.&lt;/p&gt;

&lt;p&gt;Integration Suite is for middleware, not business logic: I use the Integration Suite (iFlows) for what it’s good at: being the "handshake" between systems. But the moment you start burying business rules inside an iFlow, you’re creating technical debt. Keep your logic in the CAP layer where it belongs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;Programming is still relevant because it’s the only way to build software that lasts longer than a sales demo.&lt;/p&gt;

&lt;p&gt;I’m not saying I have all the answers. I’m still in the thick of it, navigating the BTP landscape every day. But what I do know is that shortcuts like "drag-and-drop" logic usually end up costing more time than they save.&lt;/p&gt;

&lt;p&gt;I’m sticking with the code because it’s the only way I can guarantee my architecture won't fall apart in six months. Whether I'm building a vendor portal or a complex integration flow, I want to know exactly what’s happening under the hood.&lt;/p&gt;

&lt;p&gt;The goal isn't just to make it "work" for a demo—it's to build something I'm actually proud to sign my name to.&lt;/p&gt;

</description>
      <category>sap</category>
      <category>java</category>
      <category>architecture</category>
      <category>btp</category>
    </item>
  </channel>
</rss>
