Chapter 10 Supporting and developing coding skills in your team

10.1 Different levels of coding at DfT

Previously, coding has often been seen as an optional skill for analysts in DfT, and people have been free to pick up skills and use them to a level that meets their personal interest. However, we have now reached a point where the ubiquity of coding across the analytical community is such that there aren’t many analysts who will never interact with code or make decisions about whether to use it or not as part of their role.

The aim of the coding L&D offer is therefore to make sure that there is a central core of essential skills that all analysts have or are working towards, but also to ensure that roles or teams where a greater knowledge of coding is needed are appropriately supported and able to train new starters. This model is represented by the “coding apple”:

10.1.1 The coding apple

This model outlines the structure that underpins good coding L&D:

  • Understanding of user needs (both the end user of your data and the users of code within your team)
  • Senior leaders empowered to make effective business decisions around coding and support their teams to adopt coding approaches
  • An expert community in CRAN which offers technical expertise, learning and development, and a network of peer support

And also outlines the three broad levels of coding expertise we will see in DfT analysts:

  • Core: Fundamental knowledge around coding; when it is appropriate to use, the tools we have available in DfT and in use within your team, and the ability to read and run someone else’s code with appropriate documentation and support. This level is an appropriate target for all analysts regardless of whether they write code themselves.

  • Slices: Working knowledge of beginner/intermediate level coding topics. This covers anything required for an analyst’s role, but will generally involve writing code to ingest, analyse and visualise data, as well as good practice around code. Analysts will be able to pick and choose “slices” relevant to their role, developing skills in mapping, report building, etc. depending on their personal interest and requirements.

  • Leaf: New growth into expert-level knowledge of specific topics. For analysts who work with code regularly, they may develop high level skills in one or two areas of expertise. This could be anything from building apps and tools, to creating packages, to machine learning. These kinds of skills will be showcased to analysts in Coffee and Coding talks, but probably won’t be widely practiced.

It is important to note that while these levels build upon each other, it shouldn’t be viewed as a ladder which analysts must “move up” as part of their development. In the same way that all analysts aim to be competent, but not necessarily experts, in skills such as presentation and stakeholder engagement, the coding core skills are a solid foundational level of knowledge for any analyst. Learning and development opportunities from CRAN will always ensure that there is sufficient support for any analyst to reach this core level of knowledge, regardless of their starting level.

Equally, skills beyond this level are valuable for analysts to learn for both their personal development and for possible future projects in your team, and these CRAN L&D opportunities will always be open to anyone with an interest, regardless of how frequently they code on a day-to-day basis.

10.2 Accessing core coding skills

The core coding skills are accompanied by an interactive pathway. You and your team can view this pathway here. Ways you may want to support your team in reaching this level:

  • Encourage all members of your team to use this as a self-assessment tool, and identify areas where they feel confident and where they feel like they would benefit from additional support. All sections come with recommended learning and links to it.

  • Build moving along the pathway into their professional development objectives, and ensure they have time to both develop and maintain their skills.

  • Look out for opportunities for them to make use of their core coding skills; can you ensure everyone in your team has the opportunity to run established code, or shadow someone who does?

  • Talk through points where knowledge is team-specific (particularly around SQL tools) and make sure your team are familiar with how these work.

  • Encourage this learning to be a collaborative process; consider organising L&D sessions for the whole team, or bitesize knowledge-sharing sessions within your team at team meetings.

  • Make use of peer-support opportunities; your team can apply for coding mentors through the CRAN network.

  • If any of your team have trouble with any aspect of the core coding training, make sure this feedback is relayed to your local CRAN rep so we know where support isn’t meeting needs!

10.3 Slices of coding knowledge relevant to your team

For anyone in your team who will be running and writing code, the next level of coding skills are highly dependent on their own development needs and the needs within your team. When guiding them in development, it’s useful to consider:

  • What are the key aspects of code that will be useful in your team? For many teams, these will be similar; data ingest, data cleaning and processing, and producing outputs such as charts and rmarkdown commentary.

  • Where are the development areas in your team’s workload: Developing skills in these areas will often quickly become a net timesaver for the team due to efficiency gains.

  • What skills are already present in the team?: At this level, it makes sense to ensure that the majority of your team are focussing on the same or similar working-level areas of knowledge. This allows them to support each other, and review each other’s code, as well as providing team resilience.

  • What areas are they interested in learning?: Having a keen interest in the code you’re learning is a massive help when it comes to working through the boring bits!

  • Do you have small projects available for people to practice on?: At this level, the best way to cement learning is to quickly be able to put it into practice on a real problem. Do you have a small project relevant to the learning that they can apply it to?

Within DfT there are a range of resources available to which can be used to both gain a broad knowledge of different coding areas, as well as gain a working knowledge of the code. You can signpost your team to:

  • Attend Coffee and Coding talks to learn what is going on in other teams. This allows you to see practical examples of packages of code applied to DfT-specific examples and to see what could work in your team.

  • Speak to your local CRAN rep regularly to understand what new developments have taken place in the coding tools available to you, and how that could benefit your future work plans.

  • Use Github to view existing coding projects from across analysis to understand what projects have already been completed using code, and where you can “borrow” example code to feed in to your own work. You can just browse through the Github or ask for suggestions on a specific topic on the CRAN teams channel.

  • Explore recordings and resources from past talks to understand applications and learn how to apply the code to your specific problem. These talks are grouped by topic in the CRAN wiki to make it easy to find them.

  • Request a coding mentor for a specific project. You can be matched with a fellow coder who can provide support, suggestions for improvements, and signposting to resources.

  • Make use of the CRAN team channel and drop in sessions! Beginner questions and beyond are encouraged, and it’s a quick and easy way to get support with just about anything.

  • Request a DataCamp licence for learning beyond that provided within DfT; ask on the CRAN Teams channel if you’re not sure if there’s appropriate resources there.

  • When you’ve written, make use of code reviewing network to request peer review. You’ll receive friendly and helpful tips on code efficiency and best practice, and help to ensure your code does what you expect in future!

10.4 Identifying beginner coding projects

Once members of your team have worked through introductory-level learning for their coding language, the best way to put their knowledge into practice is through a relevant, real-world example which allows them to think through a problem, identify the best approach, and implement their skills to deliver a simple output. However, identifying an appropriate project for a beginner is not always straightforward, especially if you aren’t sure what you should be looking for.

What to look for in a beginner project:

  • Ingest-tidy-output structure: A project which follows the steps ingest data -> clean data ready for use -> produce an output or visualisation is the most common format, and one which makes use of skills that beginners will have already developed in introductory-level sessions. These will be more suitable as practice projects than complex analytical, modelling or dashboarding projects.

  • Producing a simple output: Beginners will have experience of returning simple outputs from a project such as a tidied dataset, or a chart, and these are a good place to get started. Outputting a slightly more complex visualisation is also possible, but aiming to return a leaflet map, Shiny dashboard, rmarkdown, or formatted Excel tables will require a lot more time and support, and is probably more suitable for a future project.

  • Non-critical project: Giving a beginner a non-urgent or “nice-to-have” project is a great way to give them the space and time to develop it at their own pace while learning, and will avoid the temptation to skip good practice to get it complete to a deadline.

  • Logical steps to the analysis: Coding is easiest when the analysis you’re doing follows a set of logical rules and does not deviate from them. For every exception, whether that’s during processing or visualisation, the code will get more complex and increases the risk of the approach going wildly off tangent. Equally, coding in opportunities for human intervention in the analysis can become very difficult. Aim for a project with few exceptions or edge cases, and that requires little or no human decision making in the process.

  • Flexibility of approach: A very rigid idea of an output can make it more challenging to code for a beginner. More flexibility in the output can make the project much more beginner-friendly, even if it’s aspects as simple as “I don’t mind what font this uses. It doesn’t matter exactly where the legend appears”. Accepting that there might be small differences between coded and non-coded outputs increases the chance of the project being successful.

Alternatively, if you have no beginner-level projects available in your team, you can direct beginners to either of the below resources:

  • Tidy Tuesday Weekly datasets and data visualisation exercises provided for beginners to learn from

  • Learn R By Doing Transport-themed data cleaning and visualisation exercises designed for beginners to spend 90 minutes carrying out independent analysis.

10.5 Developing expert-level coders

If you have a team of analysts who code regularly, it’s inevitable that they’re going to make the jump into being experts into one or more areas of coding. While this is a brilliant opportunity in terms of what they can achieve and how they can support the rest of the team, it can also be a challenge to support as a line manager. There are still plenty of resources you can direct them to:

  • Making use of L&D channel in CRAN to request signposting and recommendations to guidance and resources.

  • Attend Coffee and Coding sessions in a broad range of topics to understand where their expertise can be applied and best practice around this.

  • Making use of online resources; there are a wide range of excellent books and tutorials available online, as well as community resources such as Stack Overflow. They should also be making use of more self-serve resources such as package documentation, and can access peer support to do this if they aren’t.

  • Make contact with cross-CS networks relevant to their interests; groups such as the data science network and NHS-R.

  • Consider making use of language-specific resources such as R Weekly, the PythonLadies group, and many more!

  • Encourage them to sign up as a code reviewer and a peer coding mentor

Use case: Mentor feedback

“I just solved a problem my mentee had in MS SQL and I feel really clever because I hate SQL. This coding mentoring is honestly so good. I’ve really enjoyed helping someone else and I’ve learnt loads in the process - trying to explain something complex in a simple way has helped my own understanding.”


In addition, as a manager you may want to consider the following points around your expert coders:

  • Accept they will likely be the expert in the code they’re writing in DfT! However, one of the best ways to ensure business continuity is to encourage them to share this knowledge, both within your team and as part of Coffee and Coding sessions.

  • Make sure you’re comfortable with the long-term resilience of code they’re developing; get familiar with the R coding standard or similar best practice guidelines enough to be able to ask “are you meeting best practice?” and “what’s the rationale for this new approach?”. Don’t be afraid to ask for peer code review from outside the team to ensure that complex approaches are still understandable and not convoluted.

  • Many expert coders express frustration when their own personal development stalls and they become a teacher/tech support for the team instead! Try to ensure they have opportunities to continue with their own coding development as well; reach out to coding focussed teams such as StatsAID for shadowing and paired coding opportunities, look out for hackathon events, and suggest training in areas such as code reviewing to allow them to continue to learn as they support the rest of the team.

10.6 The skills to support your team

While it can seem challenging to support your team in coding L&D if you’re not an expert, there’s plenty of support to do so!