Agility
...in software delivery is considered to be the fulcrum on which a technology-based business can beat its competition. An agile process is inherently characterized by how quickly and reliably, continuously evolving software can be made available to its end-users. At Avadhut, we strive to create platforms that enable your engineering teams to cope with rapidly changing business requirements and user-feedback.
Performance
...in any context cannot be addressed without the necessary definition of measurement, and so it is with software delivery too. We have a concrete and measurable definition of software delivery performance adapted from the several "State of DevOps" yearly reports over the last decade (almost) as a guide to inform us about where we stand and what set of actions will most effectively mediate our short-comings.
Metric | Elite | High | Medium | Low |
---|---|---|---|---|
Deployment frequency (How often do new changes get deployed to production) | On-demand (multiple times per day) | Once a week - once a month | Once a month - once in 6 months | Fewer than once in 6 months |
Lead time to change (How long does it take for new changes to be deployed to production) | Less than one hour | One day - one week | One month - six months | More than six months |
Time to restore (How long does it take to restore services in case of an incident or defect on production) | Less than one hour | Less than one day | One day - one week | More than six months |
Change failure rate (How many deployments on average result in degraded services or downtime) | 0% - 15% | 16% - 30% | 16% - 30% | More than 30% |
Development vs. Delivery
The considerations for software delivery differ from those for software development in significant ways, and hence the approaches taken to maximize benefits for the two also differ.
Development | Delivery |
---|---|
Creates new products and services that solve the customer's problems. | Enables fast flow from development to production with reliable releases by standardizing work, and reducing variability and batch sizes. |
Feature design and implementation may require work that has never been performed before. | Integration, testing and deployment must be performed continuously, and as quickly as possible. |
Estimates are highly uncertain. | Cycle times should be well-known and predictable. |
Outcomes are highly variable. | Outcomes should have low variability. |
Challenges and solutions
Infrastructure
agility
Systems that serve a large user-base can have signigicantly complex infrastructure. Further infrastructure also needs to remain agile in order to reliably cope with evolving system requirements. Adding, removing or reconfiguring infrastructure components is best managed in a declarative and composable way. Further, we always want our infrastructure to be congruent with our understanding of its entire configuration. Our preferred IaC tools for the job are Terraform and Pulumi .
Configuration
management
Changes to one part of the system can often necessitate corresponding changes to other parts of the system. When configuration management is not comprehensive, it can easily lead to misconfigured infrastruture or deployments that can cause defects to ripple across other services and cause severe downtime. This can be avoided by fully automating everything: build, test, deploy, as well as provisioning cycles. Thereby, any change to the environment, or the deployments that run in it, is directly applied from version-control. Unvetted changes that fail a review cannot make their way into the system.
Service
orchestration
Given that every service can have its own lifecycle pre-conditions, events and actions, that may be interdependent on those of other services, it becomes imperative to manage these with a sophisticated tool beyond a certain scale and complexity, such as the combination of Consul and Nomad , or even Kubernetes with its large ecosystem of plugins and operators.
Continuous
integration
The process of vetting a version of software as fit for deployment to production can comprise of several tedious steps such as (in order of increasing complexity, roughly) unit-testing, performance-regression testing, security-compliance testing, integration testing, end-to-end testing, scalability testing, and other more specific concerns depending on the nature of the project. These steps make up the feedback cycle for a development engineer among others, and as such, must run as quickly as possible. Each of them must be performed for every branch of changes. By the use of tools like GitHub Actions , GitLab CI and several others, including those that are cloud-native, like Argo this beast of a challenge can be tamed.
Continuous
monitoring
To ensure uptime and service quality all indicators of live components and services need to be monitored continuously, on all the layers of a system. Site-reliability and support engineers need to be alerted when any anomaly is detected. Some of these are common across services while other may be specific. Logs from all layers of a system need to also be accessible to teams to perform tracing, debugging and root-cause analysis of a particular fault. We use several comprehensive tool-chains, including cloud-native ones like Prometheus or Mimir , Tempo , Loki and Graphana , besides others, to achieve this goal.
Why hire us?
We are a group of passionate engineers who live and breathe software everyday - not just for putting food on our table, but also as an enjoyable hobby. We are enamoured by its science, and are delighted at every opportunity to apply that science. Spending most of our time developing our craft has made us adept at tackling technical problems and engineering challenges skillfully and efficiently. By hiring us, you provide us an opportunity to be excited, and in turn get a passionate team to work for you. It gives us great pleasure to see our world become more and more efficient with the help of computers.