Sitemap
Satyananda Sahu (Satya)

Satyananda Sahu (Satya)

Engineering Leader in the Software Industry.

First by Design: Software Development

12 min readNov 1, 2026

--

Press enter or click to view image in full size

In the past, particularly during the era of monolithic application development, security, scalability and upgradability were often classified as non-functional requirements (NFRs) in software development. Although these requirements were documented alongside functional requirements, they were frequently treated as secondary priorities and addressed later in the development lifecycle rather than being incorporated into the design and implementation from the outset.

Modern software development has significantly changed this perspective. Today, security, scalability and upgradability are considered fundamental architectural principles and key success factors. Organizations now adopt a “First by Design” mindset, where these qualities are embedded into the product from the beginning rather than being added after implementation. My writings are influenced by my experience in the software industry, working on enterprise applications built using Java and related technologies.

Security First by Design

Security First by Design, often referred to as Secure by Design, is an architectural principle in which security is treated as a foundational requirement from the very beginning of the software development lifecycle. Rather than being addressed as a final checklist item before testing or deployment, security considerations are integrated into architectural design, development, testing and operations from day one of the software development.

Engineering teams proactively identify potential threats, model attack scenarios and implement security controls early in the design phase. Security validation continues throughout the development phase through automated code scanning, vulnerability assessments and continuous testing.

From my own experience at Unisys, my team and I invested significant effort in planning, designing and developing unit test cases for both functional and security requirements before writing the actual application code. We followed a Test-Driven Development (TDD) approach, ensuring that security and quality requirements were validated throughout the development lifecycle rather than after implementation.

Key Strategies for Adopting a Security First by Design Approach

➤ Zero Trust Architecture

  • Never trust, always verify.
  • No user, device, application or network should be trusted by default, even if it operates within a private network.
  • Continuous authentication, authorization and validation are required.

Read my article for further insights into Zero-Trust & Privacy-First Security

➤ Secure by Default

  • Configure applications, infrastructure and platforms with the most secure settings as the default baseline.
  • Reduce the need for users or administrators to manually enable security features.

➤ Principle of Least Privilege (PoLP)

  • Grant users, applications and services only the minimum permissions required to perform their designated tasks.
  • Minimize the attack surface and limit potential damage from compromised accounts.

➤ Threat Modeling

  • Identify potential threats, vulnerabilities and attack vectors during the design phase.
  • Implement appropriate controls to mitigate risks before development begins.

➤ Shift-Left Security

  • Integrate security testing early into the development lifecycle.
  • Use automated security scans, secure coding practices and code reviews throughout the CI/CD pipeline.

Read my article for further insights into REST API Security titled: REST API Security

Scalability First by Design

Scalability First by Design is an architectural principle where scalability is considered, validated and incorporated during the initial design phase of a software product or application. Systems are designed to efficiently handle future growth in users, transactions, workloads and data volumes without requiring major architectural redesigns.

Rather than addressing scalability challenges after a system has been successfully deployed, organizations can proactively focus on building new features and implementing change requests while continuously monitoring performance, reliability, and user experience.

People often confuse scalability with performance. Performance focuses on the speed and efficiency of executing a task under a fixed workload or for a single user or fixed numbers of users and is typically measured by metrics such as response time, latency and throughput. Scalability, on the other hand, refers to a system’s ability to handle increasing workloads, user traffic or data volumes by adding resources or nodes, while maintaining acceptable performance levels.

Two primary scaling methods used in system design at hardware resources level to increase capacity and efficiently handle growing workloads and traffic demands

  • Vertical Scaling (Scale Up): Increasing the capacity of a single server or instance by adding more CPU, memory, storage or other resources.
  • Horizontal Scaling (Scale Out): Increasing capacity by adding multiple servers or instances and distributing the workload across them.
Press enter or click to view image in full size

➤ Strategies for Adopting a Scalability-First-by-Design Approach at the Application and Software Layers

✦ Modular Boundaries:

  • Separate business domains such as User Management, Billing, Orders and Payments into independent services with well-defined interfaces, following Service-Oriented Architecture (SOA) — Microservices architectural principles.
  • Enable independent scaling and future service decomposition through containerization technologies such as Docker and orchestration platforms like Kubernetes.
  • Implement the Database-per-Service pattern to ensure loose coupling between services and their underlying data stores.

✦ API-First Design

  • Design APIs with a plug-and-play architecture that enables seamless integration and replacement of software components, hardware devices, utility services and external dependencies.
  • Minimize expensive database operations and avoid direct access to another service’s database. Instead, consume data through well-defined service APIs to preserve service boundaries and data ownership. Where multiple services need to consume data from different services, you can use an API Gateway or Workflow Orchestration approach to aggregate and utilize the required data efficiently.
  • Use connection pooling through XA DataSources managed by the Application Server for database connectivity to improve application performance and scalability, rather than creating direct database connections from the application.

➤ Strategies for Adopting a Scalability-First-by-Design Approach at the Data Layer

✦ Use the Proper Database

  • Select the most appropriate database technology based on the nature, structure, volume, scalability and access patterns of the data, whether using an RDBMS, NoSQL or Vector database.
  • Use globally unique identifiers (UUIDs) to support distributed systems, data partitioning, and seamless horizontal scaling.
  • Plan data partitioning and sharding strategies early in the design phase rather than waiting for scalability challenges to emerge.
  • Adopt a database clustering approach to enable the seamless addition of database nodes for workload distribution, improved availability, enhanced performance and future scalability.
  • Use database replication to distribute read workloads across replica nodes, improving scalability, availability, and fault tolerance while reducing load on the primary database.

➤ Cloud Environment: Cloud platforms provide built-in auto-scaling capabilities across multiple infrastructure and application layers through a wide range of managed services and components. When designing applications for the cloud, carefully select the appropriate infrastructure, services and deployment models to take full advantage of auto-scaling, high availability and performance optimization. This ensures that resources can scale up or down based on demand, allowing organizations to optimize costs and pay only for the resources they consume.

Read my article for further insights into Cloud Technology titled:

Examples of Auto Scaling Components

Note: This image is not properly aligned. I tried to align it but Gemini AI declined to make the changes after several tries. Sometimes AI tools can be quite error-prone, so AI user may end up doing it manually.

Press enter or click to view image in full size

Upgradability First by Design

Upgradability-First-by-Design is the principle of building systems that can continuously evolve to meet changing business needs, regulatory requirements, and technological advancements. The architecture, deployment model, and software components are designed from the outset to support enhancements, upgrades, integrations, and platform transitions with minimal disruption, reduced risk, and lower operational overhead.

Rather than creating products that become difficult to modify over time, engineering teams build adaptable systems that remain sustainable throughout their lifecycle while ensuring they are not overengineered.

Strategies for Adopting a Upgradability-First-by-Design Approach

  • SOA-Microservice Architecture: Design components with clear responsibilities and well-defined interfaces while minimizing dependencies between modules. This approach makes it easier to integrate additional business-domain applications and extend functionality without impacting existing systems.
  • Ensure Backward Compatibility: Ensure that new releases continue to support existing integrations wherever required for legacy systems such as mainframes and older versions of applications, thereby reducing disruption during upgrades and migrations.
  • API Versioning: Support the gradual adoption of new functionality while protecting existing consumers by versioning APIs based on business requirements, release cycles or vendor-specific integration needs.
  • Configuration-Driven Architecture: Use configurable business rules instead of hard-coded logic. Leverage workflow frameworks such as BPMN based, or descriptive based to enable plug and play capabilities for business rules, process flows and decision-making logic.
  • Platform Independence: Reduce dependencies on specific hardware, operating systems, or deployment environments by building applications using platform-independent frameworks or code-generation tools.
  • Technology Refresh Planning: Regularly upgrade frameworks, libraries, operating systems, databases and runtime environments before they become obsolete to maintain security, compatibility, supportability and long-term scalability.

Over time, a software product may become obsolete due to advancements in technology, frameworks or platforms. At a certain stage, further upgrades or enhancements may no longer be practical or cost-effective. When the product reaches the end of its lifecycle, it may need to be retired and replaced with a newly developed solution built on technologies and architectural principles, that support advancement.

Evolving business requirements should not bring a product’s lifecycle to an end. If they do, it is a strong indication that the product was not designed with an Upgrade-First-by-Design approach. A well-architected application should be flexible enough to accommodate new business requirements without or with very minimal disruption, allowing new capabilities to be integrated as the business evolves.

In most cases, a product reaches the end of its lifecycle not because of changing business requirements but because the underlying technologies become obsolete, unsupported, insecure or incapable of meeting modern technical demands. Factors such as technology advancements, security vulnerabilities, architectural limitations and supportability concerns are typically what drive the need for a complete redesign or replacement of a software product.

Get Satyananda Sahu (Satya)’s stories in your inbox

Join Medium for free to get updates from this writer.

The evolution of software engineering has transformed security, scalability and upgradability from traditional non-functional requirements into core architectural principles. Modern engineering teams must adopt a Security First, Scalability First and Upgradability First mindset to build systems that are secure, resilient, adaptable and capable of supporting long term business growth.

Knowledge Enhancer

Data Partitioning and Data Sharding are closely related concepts used to improve database scalability, performance, and manageability.

Data Partitioning

Data partitioning is the process of dividing a large table or dataset into smaller, more manageable partitions while still logically appearing as a single database object.

Common partitioning strategies include:

Range Partitioning: Data is divided based on a range of values.
Orders_2024
Orders_2025
Orders_2026

List Partitioning: Data is divided based on predefined values.
US Customers
Europe Customers
India Customers

Hash Partitioning: Data is distributed using a hash function.
CustomerID % 4

Benefits:

  • Faster query performance
  • Easier maintenance
  • Improved manageability
  • Better archival and purging

Data Sharding

Sharding is a form of horizontal partitioning where data is distributed across multiple database servers or nodes.

Example:

Shard-1 : Customer ID 1 - 1,000,000
Shard-2 : Customer ID 1,000,001 - 2,000,000
Shard-3 : Customer ID 2,000,001 - 3,000,000

or

India Customers -> DB Server A
US Customers -> DB Server B
Europe Customers -> DB Server C

Benefits:

  • Horizontal scalability
  • Increased storage capacity
  • Distributed workload
  • Improved write throughput
  • Reduced database bottlenecks
Press enter or click to view image in full size

Note:

  • Partitioning helps when a single database is becoming large.
  • Sharding helps when a single database server can no longer handle the required data volume or traffic.

Database Replication

Database Replication is the process of copying and synchronizing data from one database server (primary) to one or more replica databases or Database replication is the process of copying and maintaining database data across multiple servers or nodes.

Press enter or click to view image in full size

Here is how the architecture works and why it is used, based on the diagram:

Core Architecture

  • Primary DB (Master): Handles all write and update traffic from application servers. When data changes, it captures those changes and streams them to replicas.
  • Secondary DB (Replica): Receives the replication stream from the primary database. This can happen synchronously (ensuring data is written to the replica before confirming) or asynchronously (replica updates shortly after).
  • Application Servers: Split their traffic intelligently. Write traffic is sent exclusively to the primary database, while read traffic is routed to secondary replicas to reduce load.

Key Use Cases

  • High Availability (HA) / Failover: If the primary database crashes, a secondary replica can be promoted to take its place, minimizing downtime.
  • Load Balancing / Scaling Reads: By offloading read-heavy queries to replicas, the system prevents the primary database from becoming a bottleneck. Data Backup amp;
  • Redundancy: Replicas provide an up-to-date secondary copy of the data for safety and disaster recovery

Database Clustering

Database clustering is an architecture where multiple database servers (nodes) work together as a single, unified system to handle data processing, storage, and requests.

Press enter or click to view image in full size

Core Architecture

  • Nodes and Interconnect: The cluster consists of multiple active nodes (e.g., Node 1, Node 2, and Node 3) connected via a high-speed interconnect, allowing them to communicate and synchronize instantly.
  • Load Balancer: Incoming requests from application servers pass through a load balancer, which distributes traffic across the cluster nodes.
  • Shared Storage: Nodes often connect to a shared storage array (like a SAN or NAS) via a distributed file system, ensuring all nodes can access the same underlying data.

Key Benefits

  • High Availability and Failover: If one node fails, another node automatically takes over with minimal downtime because the system maintains a fault-tolerant boundary and shared access to data.
  • Read and Write Scalability: Unlike standard replication (which often splits reads and writes), clusters can distribute both read and write operations across multiple nodes for horizontal scaling.
  • Data Integrity and Consistency: Real-time, synchronous updates across all nodes ensure a single, consistent view of the data.
Press enter or click to view image in full size

SOA vs Microservice

Microservices architecture is best understood as an evolutionary refinement or a specialized subset of Service-Oriented Architecture (SOA) designed for modern cloud and distributed environments.

The Core Common Ground

  • Distributed Services: Both architectures break down monolithic applications into smaller, independent services that communicate across a network rather than running as a single tightly coupled codebase.
  • Business Alignment: Both aim to align software design with business capabilities, making systems easier to understand, maintain, and scale.

How Microservices Evolved from SOA? While microservices share DNA with SOA, they address the bottlenecks of traditional enterprise SOA by removing centralization:

  • Communication: Traditional SOA heavily relied on a centralized Enterprise Service Bus (ESB) and heavy protocols like SOAP/WSDL to integrate services. Microservices abandon the ESB entirely, favoring smart endpoints and dumb pipes (lightweight protocols like REST, gRPC, or asynchronous message brokers).
  • Data Management: In classic SOA, multiple services often shared a single centralized database. In a microservice architecture, each service strictly owns its dedicated database, ensuring complete data encapsulation and loose coupling.
  • Governance and Deployment: SOA often involved centralized governance and larger deployment units. Microservices push decentralized governance to autonomous teams, allowing each service to be independently developed, deployed, and scaled without impacting the rest of the system.

In short, microservices take the core service-oriented philosophy of SOA and optimize it for cloud-native, highly distributed systems by prioritizing decentralization and operational autonomy.

Read my article for further insights into Microservice titled: From Monolith to Microservices: Key Patterns Explained

Docker

Docker is an open-source platform that automates the deployment, scaling, and management of applications by packaging them into containers.

A container packages everything an application needs to run (code, runtime, system tools, libraries, and settings) into a single lightweight, standalone unit. This ensures that the application runs reliably and identically across different computing environments-from a developer’s local laptop to production servers in the cloud.

Read my article for further insights into docker titled: Docker Basics: A Beginner’s Guide

Kubernetes

Kubernetes (often abbreviated as K8s) is an open-source container orchestration platform designed to automate the deployment, scaling, and management of containerized applications (like those created with Docker) across a cluster of computers.

While Docker helps you build and run individual containers, Kubernetes manages thousands of them at scale. It handles critical production needs such as:

  • Load balancing: Distributing network traffic to keep applications stable.
  • Auto-scaling: Automatically increasing or decreasing container instances based on CPU usage or custom metrics.
  • Self-healing: Automatically restarting failed containers, replacing them, or killing containers that don’t respond to user-defined health checks.

Note: If you are interested in discussing this topic or learning more, you are welcome to connect with me anytime.

In this article, some content reflects my personal viewpoints while few are drawn from their respective sources.

The knowledge Enhancer section of this article includes information drawn from internet sources, though not all of its content is derived from them, some of them are mine. If you would like to learn more, you can visit the websites mentioned either alongside of the content.

Mr. Satyananda Sahu(Satya)

Originally published at https://www.linkedin.com. by Mr. Satyananda Sahu(Satya)

--

Satyananda Sahu (Satya)
Satyananda Sahu (Satya)

Written by Satyananda Sahu (Satya)

Engineering Leader in the Software Industry.