Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Info

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

...

Use Pull-Request flow

...

Explicitly declare and isolate dependencies (docker, maven, npm, composer)

...

separate config from deployment

...

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)

...

...

Minimize divergence between development and production, enabling continuous deployment for maximum agility.

...

scale up and out without significant changes to tooling, architecture, or development practices.

...

Execute Apps/Deployments as one or more processes, processed should be empheremal

Ingenious technology principles gear towards reliability in all levels, and follows SRE practices:

...

“We can characterize the health of a service from the most basic requirements needed for a system to function as a service at all to the higher levels of function…” – Site Reliability Engineering Book

...

Highly reliable, scalable, and flexible cloud environment using Google Cloud and Kubernetes

...

Unified System and Application Monitoring using PrometheusGrafana and Stackdriver Monitoring

...

Alerting-System, On-Call Duty, and structured incident response using PagerDuty

...

Postmortem analysis for inducing learning cycles

...

Focus on reliable and reproducible release processes

...

Capacity planning leveraging dynamic cloud environment

...

Rigorous focus on software quality, and testing strategies

...

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.