We want to use a range of programming languages at GDS because we think using the right tool for the job will give us the best chance of building services that best meet users’ needs. This document does not apply to choosing ‘off the shelf’ software (open source or not).
We want to focus on using a small number of programming languages for core software development tasks.
This should make it easier for developers to:
- move around the organisation
- develop shared components
- improve their personal development
- master how they operate applications
GDS projects that use Node.js include:
- GOV.UK Frontend
- GOV.UK Pay
- Performance Platform
- GOV.UK PaaS (TypeScript)
- Passport Verify (TypeScript)
Node.js can be used to render a web interface for your service but should not be used to implement any significant ‘application logic’. For instance GOV.UK Pay has created thin, client-facing applications that do not store data (although they may retrieve data from an API).
TypeScript can be used when teams deem it appropriate. An example of this is the PaaS team choosing to use TypeScript because they are used to working with a statically typed, compiled language, and they felt that the compilation and static-analysis tooling was better for their workflow. There is more information about TypeScript on the Node.js page.
Our core languages for backend development are:
We’ve chosen these languages because they are successfully used by teams at the moment, and we are confident in how to host and operate applications written in them. We’d advise you to carry out new development in one of them.
New Python projects should be in Python 3. Python 2 will reach end of life in 2020. Python 3 is now well-supported by application frameworks and libraries, and is commonly used in production.
The GOV.UK router is built using Go, and it’s the core language for Cloud Foundry which runs our Platform as a Service.
Go is an appropriate language for systems programming, like proxying, routing, and transforming HTTP requests. However these sorts of components should only be written if there is no alternative maintained open source tool which could be used.
Go has a feature complete standard library, good concurrency primitives, and is a memory safe language; these features make it a good choice for backend application which aggregate or transform APIs, or have performance requirements.
Languages we won’t use for new projects
We used Scala in the early days of GDS. GOV.UK Licensing is the only remaining application written in Scala but we’ve found it hard to support because of a lack of skills in GDS. Do not use Scala for new projects.
Using other languages
There will be sensible reasons to not follow the above guidance on languages. For example when you’re:
- extending an existing codebase or ecosystem
- scripting in a particular environment
- experimenting during an alpha (with an expectation that it’s replaced by something we have more confidence in for beta)
- working in a very specific or unusual problem domain, like heavy use of WebSockets
The set of languages we’re comfortable supporting will change over time.
If you want to use a new language, talk to your technical architect and the Deputy Director Technology Operations and then create a prototype. If it goes well make a pull request to change this document.
If you’ve had problems using one of the languages we support, make a pull request to document the issues you’ve had.