The effective training of sustainable software practices is increasingly recognised as crucial in building a capable research software community, and there are a multitude of training courses that impart skills critical to good research software development. As an example, the Carpentries has been instrumental in pioneering the development and delivery of effective and evidence-based training workshops across vast swathes of the research landscape, and there are many other recent examples of emerging training innovations and courses.
But how should courses be designed and pitched to appeal to their target audience whilst effectively teaching the skills they may not be aware of or think that they need (but experience tells us benefit learners in the long-term)? Furthermore after a course, what should be the next steps to support the uptake of those skills?
What learners ‘want’ vs ‘need’
Researchers who need to write software as part of their research may well have learnt a specific language, or think that this is what they need to learn in order to complete their research task. When faced with a particular piece of code which won’t work, how to solve it in the short term can easily become the focus, rather than looking at the bigger picture. In reality, the skills surrounding good software design and good practice may well be harder to learn and to do well, but in the long term will be more beneficial and also likely lead to the solution that was originally sought. These, however, are not usually at the forefront of researchers’ thinking.
The skills around defining a problem and formulating a solution are not necessarily immediately appealing to a researcher with a pressing coding issue. They may think that they need to learn the details of how to implement something in a specific language, but the reality is that they need to first learn key concepts such as how to structure the code using functions and modules, or how to apply tools, such as using version control. These will enable them to tackle more complex problems in ways which will be more sustainable in the long term.
Pitch a course that appeals to learners
Following on from the above, as teachers we are keen to impart what we know from experience to be important. In software development this often goes beyond the syntactical and technically interesting - which may have broad appeal to learners - to the fundamental concepts that are far more crucial and long-lived in terms of real value.
For example, pitching a course that teaches handy features in Python may be perceived as immediately beneficial and concrete. However, the less appealing, but far more important skills that underpin the software engineering process (such as good requirements management and extensible, maintainable software design) may be less appealing, but more broadly valuable and fundamental. The idea is to effectively sell the idea of a course such that learners perceive it as valuable, whilst ensuring the more fundamental skills are also effectively covered, if not taking centre stage. It's almost a "bait and switch"!
During a course there is also the challenge of pitching these fundamental concepts within a learning narrative to motivate learners. Using personal experience to inform anecdotes that show value can be very effective - either via the carrot (we did it this way, it saved us lots of time/problems) or the stick (we did it this way, it blew up a space rocket).
Teach software design that tolerates changing requirements
One aspect that makes software development in science different from many other domains is that requirements are not completely known up front and naturally change during its development. Most often the scientists gain more insights as the software evolves over time and adjust their software accordingly. In order to tolerate change the software needs to be designed appropriately, meaning that ideally different parts of the software can be changed without affecting others. (Affecting can literally mean breaking those other parts if they are not modified accordingly).
In order to achieve this, training also needs to focus on coupling aspects between software modules. Ideally those modules would be coupled as loosely as possible so that changes to one module don’t necessarily require changes to others, minimising the risk of breaking the software. Good practice and principles can be drawn from the software engineering discipline, as well as appropriate design patterns to effectively structure scientific codes.
Post-workshop support is key to maintain "uptake momentum"
Attending workshops and training courses are a key way of gaining and improving skills and learning best practices as a researcher. However, whether or not this learning is built on and integrated into day-to-day work is often a result of more than just what was learned at the course.
How these skills are recognised and valued by colleagues and peers will influence the importance the learner will place on them, and their motivation to use and develop them further. Having group leadership which understands the benefits of software skills to drive high quality and high impact research is important. This helps foster a culture of best practices within the group and will help a learner justify spending time and resources learning these skills.
Integrating the learning into everyday practice is also more likely if colleagues are using these tools and techniques too - having someone to ask questions to, or compare code with helps create a supportive environment where the learner can become comfortable using these new ideas.
Being able to signpost learners towards “the next steps” is another great way to set them up for success and ensure that what they’ve learnt will be a foundation for further knowledge, rather than the end of their learning journey. Having a well-curated list of a range of useful materials in various formats (e.g. cheat-sheets, tutorials, blog posts, videos of workshops or talks) can help to give the learner somewhere to dive in for further learning, or consolidate what they’ve learned during a course. Providing different depths and formats of material lets the learner choose the most relevant/appealing resources to them, rather than being put off by dry or overly complex materials. It also allows them to find some in-depth material to really dive into for self-study.
Remember that networks, mentoring schemes and community groups are also an important resource. They help give the learner somewhere to identify further opportunities for learning and training, new contacts, possible collaborations or to build their career. Being able to point learners towards ‘local’ experts who are happy to chat more about these skills helps them with any subsequent questions they might have and can help reduce barriers to the learner applying these skills in their own work.