While our team creates and leads the next generation of software engineering patterns, we follow our industry best practices as well.
We do Cloud-Native, because we consider our infrastructure to be Cloud based by default. Read more on our Cloud Adoption program here.
Software delivery to us involves full application functionality to serve the needs of stakeholders, as well as its underlying design and how the application is built in terms of quality patterns and sufficient level of automation. We take into account many minimum standards, architecture, engineering and quality assurance patterns which you can find some of them below.
We believe in cloud-native development patterns, which relies on a collection of small independent and loosely coupled micro-services, built to be environment
agnostic, scaled up and down independently to meet the demand, run on public, private or hybrid clouds and in short, Anywhere.
We typically leverage the power of micro-services containerisation to achieve that purpose.
We are also a firm believer in building cross-platform and OS-agnostic software applications. Run our apps on Windows, or Linux,
and avoid tight coupling to any operating system to minimise the cost of your Run and Support functions, depending on your commercial arrangements.
We rely on Microsoft .Net Core to enable cross-platform development.
Functions such as Quality Assurance, Change Management, Alerting, Build and Deployment could be easily performed using Automation, as part of
all our applications' pipelines. The pipelines are all codified and stored in our repos to achieve a higher level of audit and governance.
Ultimately, the goal is to enable features to be deployed to Production safely and automatically while satisfying organisations' non-negotiables.
Documentation as another non-negotioable, covers high level architecture, functional/non-functional design decisions, low-level implementation details and how the system works to make our software more maintainable. It's version controlled and stored in repos as code, every code change accompanies documentation changes too to ensure our guides stay current and they could published to any other third-party tool such as Confluence.
Enforcing policies/best practices at scale manually is a challenging work, and requires a lot of effort and coordination which leads to inconsistent adoption of those practices across the organisation. Consistent, cheaper and faster application of standards, risk metrics, policies, coding standards and non-negotiables at scale are the results of shifting the enforcement of these standards to the left, on the developer machines in an automated fashion.
Proactive minimisation of incidents' customer impact, and the time required for a fix to be applied require sufficient level of applications logs and proper monitoring tools. This is to identify the incident or a trend in application health, and to notify the right stakeholders automatically to apply the fix. Detecting gradual performance degradation due to infrastructure issues or ever increasing number of customers could be among other benefits.
API reusability and loose-coupling come first when we develop our microservices based systems, and Web or Mobile apps are thin clients of these APIs.
API first makes our development process faster as scrum teams are independent, cheaper as we have reusable APIs as first-class citizens, more flexible and scaleable as APIs can scale independently.
Several rounds of usability testing are done by our teams to produce the ultimate productive experience for users. We observe user behaviour while they interact with our proto-types and software, as we remove friction from our system, and improve it. We also embed a lot of the UX best practices and accessibility guidelines in our shared reusable control libraries, to save development time and make the user experience consistent across the entire ecosystem.