This article discusses the architectural implications and trade-offs between using low-code platforms and custom code (specifically SAP CAP Java) for building scalable enterprise extensions on SAP BTP. It argues that while low-code may offer initial speed, it can lead to significant technical debt, maintainability issues, and limitations in handling complex business logic and integrations compared to a code-first approach.
Read original on Dev.to #architectureThe article highlights that low-code solutions often struggle with the complexities required for enterprise-grade applications. While seemingly faster for simple tasks, they become a hindrance when dealing with intricate data mapping, non-standard API interactions (like OData expansions), or high-volume data orchestration. This limitation forces developers into "workarounds" that are not transparent, testable, or maintainable, ultimately impacting the overall system architecture.
A core architectural argument against low-code is the difficulty in maintaining and observing changes. Unlike custom code, which benefits from clear version control (git diff), structured peer reviews, and type safety, visual low-code logic often lacks these fundamental engineering practices. This opacity can lead to significant technical debt, making it challenging to debug, audit, and evolve the system reliably over time.
System Design Implication: Technical Debt
Architects must weigh the immediate development speed of low-code against its potential to accrue substantial technical debt. Systems built with complex visual logic can become black boxes, hindering future enhancements, incident response, and developer productivity.
The author advocates for a code-first approach, specifically using SAP CAP Java, for building robust SAP BTP extensions. Key benefits from a system design perspective include:
@Mapper(componentModel = "spring") public interface InvoiceMapper { @Mapping(source = "ext_ref", target = "referenceNumber") @Mapping(source = "vendor_id", target = "supplier") Invoice toEntity(ExternalInvoiceDto dto); }The example demonstrates how MapStruct, a code-based solution, elegantly handles complex data mapping, a common requirement in enterprise integrations, in a way that is testable and version-controlled, contrasting it with the cumbersome visual equivalents in low-code.