Git Product home page Git Product logo

software-engineering-quality-framework's Introduction

Software Engineering Quality Framework

How to get started

See the Quick Start Guide

Purpose

This framework is concerned with using "good" software engineering to support rapid and safe delivery of high-quality software, at scale

It aims to:

  1. Describe a shared (across multiple teams) definition of "good" engineering
  2. Provide tools for teams to gain insight into their current engineering maturity levels and their level of technical debt
  3. Provide resources to support teams to increase their engineering maturity levels and manage their technical debt

Ecosystem

Philosophy

The philosophy underpinning this framework advocates:

  • Engineering led by user needs and service outcomes
  • Empowered delivery teams which are accountable for their products
  • Products must be actively maintained for their entire lifecycle
  • Rapid, iterative and incremental development: "Release early. Release often. And listen to your customers." (Eric S. Raymond in The Cathedral and the Bazaar)
  • Robust and comprehensive automation supporting and enforcing quality
  • Reliable & scalable services, remembering "Everything fails, all the time" (Werner Vogels), and treating operations as a software engineering challenge (as in Google's Site Reliability Engineering)
  • Loosely-coupled & cloud-native composable components as the default mode of construction
  • Continuous improvement, with prioritisation decisions based on data rather than sentiment

Context

The framework is a companion to:

Contents

The framework consists of:

Contributing

See our contributor's guide

software-engineering-quality-framework's People

Contributors

amaanibn-nasar1-nhs avatar andyblundell avatar arctangent avatar chrisclarknhsnet avatar clareyoungman avatar dlarkman avatar dlavender4 avatar edhiley avatar eperegrine avatar ivorc avatar iw-ezequiel avatar johnellwoodbjss avatar joshpencheon avatar karstenabc avatar lila1-work avatar nhsneal avatar nickpiff avatar patrickmoore-nc avatar stefaniuk avatar striggy77 avatar walteck avatar willndev avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

software-engineering-quality-framework's Issues

Add example implementations (as podcasts)

Add real NHSD examples to some of the principles, including:

  1. Cross-region SQL server on Azure (CB)
  2. Active/active Postgres read-replicas on AWS (DS)
  3. Ephemeral EC2 on AWS (NL)
  4. Multi-master cosmos DB on Azure (RS?)

Open source / inner source

Can we have some guidance around where open source should be used, and at a minimum we should be practicing "inner source".

https://en.m.wikipedia.org/wiki/Inner_source

I often find myself having to ask for read access to code within my own programme at NHS digital and my requests for read access to all developers by default falls on deaf ears.

Plan to keep up to date

Regarding https://github.com/NHSDigital/software-engineering-quality-framework/blob/master/practices/cloud-services.md

Ref "Keep up to date"

Very often when a new service is commissioned there is a failure to identify, plan, and charge for the entire systems development life cycle - including maintenance, periodic re-platforming, and the eventual decommissioning.

I'd suggest we put in something to ensure that these things are considered at the outset (or at least ASAP retrospectively) so that programme roadmaps can be adjusted and so that necessary resource (human and financial) can be identified well in advance.

CI/CD governance for repository security

I think it would be useful to be able to offer some enterprise governance around CI/CD approach If we can document our thinking around this area with some example use cases we could look to take that to appropriate boards. I think it further strengthens the case for GitHub here.

Originally posted by @walteck in #166 (comment)

Serverless is harder to test

Regarding: https://github.com/NHSDigital/software-engineering-quality-framework/blob/master/practices/cloud-services.md

Ref: "Prefer serverless platform as a service (PaaS) over infrastructure as a service (IaaS)"

I think it is important to recognise that serverless architecture is a good example of TANSTAAFL [1]. What you gain in simplifying the infrastructure you often lose (and more) due to the additional difficulty of testing and debugging a distributed software architecture.

The problem is often not with the code itself, which can be unit tested, but with how to test the config and integration with other services. It's easier to build an IaaS stack locally than it is to mock out cloud services on your development machine.

I'd suggest we say that serverless is useful for isolated (or isolatable) components, especially those where demand tends to be "bursty" e.g. processing user signups, but that IaaS has benefits where the system has many interdependencies (assuming that deployment monolithically via IaaS is a realistic alternative).

[1] https://en.wikipedia.org/wiki/There_ain%27t_no_such_thing_as_a_free_lunch

Add notes on abstraction / encapsulation

... in general, and specifically in the context of how this promotes portability in terms of cloud vendors.

With a cautionary note about the dangers of over or premature abstraction.

Possibly as part of everything-as-code?

Cloud neutral?

Regarding https://github.com/NHSDigital/software-engineering-quality-framework/blob/master/patterns/outsource-bottom-up.md

Ref: "Cloud native vs cloud agnostic"

I think you are very slightly implying cloud neutrality in this section but I don't think it would hurt to be more forward - we should be able to move entire services from one cloud provider to another if we want to. This would mean avoiding very niche components of each cloud in favour of commodity services (e.g. a PostgresDB is likely to be more or less the same regardless of which cloud it is in, and so this would be a more portable choice).

Testable requirements

In 'Build Quality In' is says 'Three amigos analysis and elaboration to ensure requirements are fully understood at the point the work will be done."

This is good, however I think that another quality attribute to the requirements being understood is that the requirements are also testable.

Having well-understood, testable requirements will ensure that pair sessions (whether it's between devs or dev/test) are productive and effective.

On-call rotas etc.

Regarding https://github.com/NHSDigital/software-engineering-quality-framework/blob/master/practices/service-reliability.md

Do we need a sub-bullet under "Understand reliability requirements" around what level of out-of-hours support should be made available? (Software devs are not routinely on call OOH in all parts of Product Development)

Example:

  • "Gold-level" services must have at least two software engineers and one infrastructure engineer available 24/7/365, all of whom must have experience in operating the system. Additional support/escalation must be available if service cannot be restored after 1 hour.
    ...
  • "Bronze-level" services are supported through normal office hours on a "reasonable efforts" basis. Outside these hours, no guarantees of availability are made.

Are we building the right thing?

Add a note (including in the review tool) that other concerns need to be considered alongside engineering concerns, e.g. are we building the right thing (even if we're building it in a good way)

Revisit observability page for simpler organisation

Ideas:

  • Summary/overview is long with a lot of detail, move some of that to specific sections
  • Break down basic requirements (e.g. logging, with meaningful logs) and advanced requirements (e.g. synthetic journeys)

Security and cloud roles

One consideration you might like to document is that when using cloud native services to deploy your infrastructure you have an additional security benefit in that the role which has permissions to amend your production infrastructure is only assumable by a cloud service (code build etc) and not assumable by any 'human' role.

Equally applying roles with different permissions to different stages in the deployment pipeline helps to ensure that, for example a deployment meant for a development account cannot actually be performed against a production account.

Behavioural software engineering

This quality framework is concerned with "rapid and safe delivery of high-quality software, at scale".

All types of engineering are influenced by human factors. I would argue that these human factors should be considered as part of this framework in order to ensure that delivery is rapid, safe, and sustainable.

Potential topics:

  • teamwork / team structure
  • relationships (e.g. with customers)
  • learning processes (individual and organisational)
  • "professional" behaviours and attitudes
  • psychology (e.g. motivation, cognitive load, mental health)
  • work/life balance

More Azure references

Some references to example cloud platform services which currently use AWS examples could be replaced or augmented with other examples, primarily from Azure.

Residency etc

Some other thoughts:

  1. UK residency option should be used for NHS repos
  2. User accounts should be work accounts (not sure if we should mention SSO or not)
  3. All projects should have a -members and an -admins team, no project should be open for edits by non-team members; all projects should have a code owners file in the right place (and which references the team rather than individuals)

Originally posted by @andyblundell in #166 (review)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.