Defining the role of a software engineer
Below is a playbook I’ve used to describe the responsibilities of a software engineer for hiring and professional development purposes.
Software Engineers are responsible for delivering value to our customers and the business within our product development environment where:
- Outcomes are the focus, rather than outputs.
- Product teams consist of individuals with diverse skills, because no individual covers all bases.
- Ownership between teams and individuals is clear.
- Teams can make time for experimentation to reduce the risk around upcoming work. This helps teams to become more ambitious without jeopardising outcomes.
- Reusable patterns are valued and utilised.
- Teams work backwards from a desired outcome or goal rather than forwards towards a nebulous end state.
- Teams are high-leverage, meaning they’ve utilised reusable patterns and their body of research to achieve greater outcomes with less effort.
Responsibilities
All Engineers:
- Deliver high-quality software. Business-as-usual for Engineers is the delivery of solutions through high-quality contributions to our codebase. They do this by embracing our established reusable patterns and tooling, test automation, documentation, and collaboration with their peers.
- Explore solutions with your team and stakeholders. It’s not enough to simply execute — Engineers need to have ownership over their solutions. This includes participating in refinements, solutioning, and creating initiatives, user stories and tasks.
- Engage in the continuous improvement of your team. Every Engineer belongs to a team, and every team needs to constantly reflect on performance and effectiveness. In order for teams to self-improve, every member needs to be engaged in reflection (e.g., through reviews and retrospectives) and self-improvement.
Senior Engineers:
- Evolve our reusable patterns and tooling. To be high leverage, teams must rally around standardised patterns and tools, to avoid having to re-invent the wheel every time they tackle a common problem.
- Evolve our ways of working. Senior Engineers must champion software development practices that promote outcomes (over outputs) and work with their team to improve the operations of the team.
- Technical architecture/planning. While all Engineers contribute to the technical architecture of our product when developing new features, Senior Engineers (and above) are expected to have a more long-term, cross-initiative opinion on our future architecture. When solutioning an initiative, they must consider other future initiatives and our broader technical direction, to ensure we’re working towards our goals.
- Mentor the team. Senior Engineers (and above) should take responsibility for the success of others in their team.
Tech Leads:
- Lead the refinement and solutioning process. Tech Leads are responsible for their teams solutions. This includes leading refinements, solutioning, and creating initiatives, user stories and tasks.
- Manage our upstream dependencies. Our software is built with various upstream dependencies that need to be selected and maintained. Tech Leads should guide this process.
- Manage our reusable patterns and tooling. Tech Leads own the roadmap for pattern and tooling enhancements, which should be tied to our technical vision.
- Manage our ways of working. Tech Leads are responsible for the way of working for their team.