Development Principles

In essence, Ingenious's development principles are a blend of best practices, modern methodologies, and a commitment to quality. By adhering to these principles, we ensure that our software remains robust, agile, and primed for the challenges of tomorrow.

In the realm of software development, principles aren't just guidelines; they are the bedrock upon which reliable, scalable, and maintainable systems are built. At Ingenious, our development principles are crafted to ensure that our software not only meets current needs but is also future-proof, resilient, and agile. This article delves into the core principles that guide our development endeavors.

1. Version Control in Mono-Repos

We champion the use of mono-repositories for our codebase. By housing all our code in a single repository, we streamline access, simplify versioning, and foster collaboration among developers. This approach ensures consistency and facilitates easier code reviews and integrations.

2. Embracing the Pull-Request Flow

Every code alteration is routed through a pull-request (PR) flow. This methodology ensures that changes are meticulously reviewed and tested before integration, promoting code quality and preventing potential regressions.

3. Isolation and Explicit Declaration of Dependencies

Dependencies are the lifeline of any software project. We explicitly declare and isolate our dependencies, be it through Docker for system dependencies, Maven for Java projects, NPM for JavaScript ecosystems, or Composer for PHP undertakings. This approach guarantees that our environments remain consistent, replicable, and isolated from potential external disruptions.

4. Separation of Configuration from Deployment

Configuration and deployment are two distinct entities in our workflow. By keeping them separate, we ensure flexibility in deployments across various environments without altering the core application configuration.

5. Centralized Deployment Workflow

Our deployment process, spanning testing, database migrations, builds, and promotions through staging, pre-production, and production, is centralized. This centralization ensures uniformity in deployment processes, minimizes errors, and promotes efficiency.

6. Declarative Descriptions for Build/Deployment

We believe in clarity and predictability. By using declarative formats to describe our build and deployment processes, we eliminate ambiguities, ensure repeatability, and facilitate easier onboarding of new team members.

7. Containerization with OCI Images (Docker)

Embracing modern development practices, we containerize our applications using OCI-compliant Docker images. This ensures that our applications are environment-agnostic, scalable, and isolated, fostering consistency across development and production setups.

8. Minimizing Divergence between Environments

One of our core tenets is to ensure that our development environment mirrors production as closely as possible. This minimization of divergence enables continuous deployment, promoting agility and reducing the chances of environment-specific anomalies.

9. Scalability without Overhauls

Our tools, architecture, and practices are chosen with scalability in mind. As our user base or application demands grow, we can scale up (adding resources) or out (adding instances) without undergoing significant changes or retooling.

10. Emphasis on Ephemeral Processes: Applications and deployments at Ingenious are executed as one or more processes, and these processes are designed to be ephemeral. They can be swiftly initiated or terminated, ensuring agility and optimal resource utilization.