Move from completing assigned tasks to owning features end-to-end, making sound technical trade-offs, and beginning to raise the quality bar for those around you.
End-to-End Feature Ownership
An intermediate engineer takes a feature from brief to production without hand-holding. This means clarifying requirements before writing code, designing the solution, implementing it, writing tests, getting it reviewed, deploying it, and verifying it in production. Ownership is about the outcome, not just the code.
Technical Trade-off Reasoning
Every design decision involves trade-offs. An intermediate engineer can identify the options, articulate the trade-offs clearly, and make a defensible choice rather than defaulting to whatever they have seen before. Being able to explain why you chose an approach is as important as the choice itself.
Component-Level Design
You should be able to design a moderately complex component independently - defining its API, data model, error handling strategy, and test surface. The goal is to produce a design a senior engineer can review and refine rather than rewrite.
Mentoring Graduates
Teaching is the fastest way to consolidate your own understanding. Start pairing with graduates, reviewing their code carefully, and helping them navigate unfamiliar parts of the codebase. You learn more about your own understanding when you try to explain something clearly.
Quality Advocacy
Intermediate engineers begin to raise the quality bar through code review, test standards, and technical conversations. This is not about being the testing police - it is about making quality a team norm rather than a personal heroic act.
Skills to Develop
Behaviours to Demonstrate
Use AI to explore alternative designs for a component you are building by asking it to generate three different approaches with trade-offs, and use that as input to your own thinking rather than a replacement for it.
Practice prompt engineering for technical tasks - learn how to frame context, constraints, and goals clearly enough that AI tools produce useful design sketches or code stubs.
When using AI to generate non-trivial logic, write your tests first, then use AI to suggest the implementation, and observe how often the generated code passes your tests without modification.
Learn to identify common AI failure modes in code generation including hallucinated library APIs, incorrect edge case handling, and overconfident performance assertions.
Use AI to critique draft design documents by asking it to identify gaps, ambiguities, or unconsidered failure modes.
Start building a personal library of effective prompts for engineering tasks you repeat regularly, and share the useful ones with your team.
A Philosophy of Software Design
The clearest articulation of what makes software designs good or bad, which is exactly what you need when taking ownership of component design.
Designing Data-Intensive Applications
Builds the mental models for reasoning about data systems, storage trade-offs, and consistency that every intermediate engineer needs as features get more complex.
The Art of Unit Testing
Goes beyond the basics to teach you what a good test actually looks like - the difference between a test suite that gives you confidence and one that just creates maintenance burden.
Accelerate
Understanding the research behind high-performing engineering teams helps you see why practices like small batches and continuous delivery matter, not just that they do.
The Staff Engineer's Path
Reading ahead to understand what senior and staff levels look like gives you a map for your own development and reveals which behaviours to start building now.
Clean Architecture and Design Patterns
Builds the vocabulary and mental models for discussing software design at a level beyond individual functions and classes.
Database Design and SQL for Developers
Many intermediate engineers discover their SQL and data modelling skills are weaker than their application code skills - this closes that gap.
Site Reliability Engineering: Measuring and Managing Reliability
Teaches you to think about systems through the lens of reliability and observability, which changes how you design and test features.
Docker and Kubernetes: The Complete Guide
Practical containerisation knowledge for an engineer who needs to own features all the way to production deployment.
Review the full expectations for both roles to understand exactly what good looks like at each level.
→ Junior Software Engineer Archetype → Intermediate Software Engineer Archetype