These are the evaluation criteria we use for performance evaluation and leveling on the Codecademy engineering team. Hooray! The compentencies at each level are broken down into four categories:
- Software Engineering & Design
- Execution & Results
- Collaboration & Communication
- Community & Citizenship
Jump to competencies for a particular level:
- Software Engineering Apprentice
- Software Engineer
- Software Engineer 2
- Senior Software Engineer
- Staff Software Engineer
- You write efficient and readable code, you ask for help evaluating pros and cons of various approaches, and your code is easy to maintain.
- You are learning and applying our standards around design, testing, error handling, monitoring, alerting, and documentation.
- You proactively maintain, debug, and fix problems in your code.
- You seek out and learn industry best practices and standards.
- You work with your manager and senior engineers to write technical proposals and solicit feedback from the team. You attend architecture review discussions.
- You effectively manage your time and know when to ask for help to unblock yourself. When blocked, you are resourceful and take initiative in finding other tasks to complete.
- You ask for help breaking down large tasks into smaller tasks that are easier to complete.
- You ask for help investigating existing components and services when approaching new projects and feature requests.
- You work collaboratively with your manager and senior engineers, gathering feedback on architecture and implementation decisions.
- You are responsive to peer feedback on code reviews and learn from it.
- You proactively communicate your progress and blockers to stakeholders (eg. PM, Design, Ops, etc.), your team, and manager and ensure timely project delivery.
- You work with your manager and senior engineers to challenge assumptions and make sure you are solving the right problems.
- You foster an inclusive team culture that supports constructive feedback and encourages diversity of thought.
- You do things to benefit your peers and community such as participating in meetings, including providing constructive feedback on ideas and initiatives.
- You advocate for yourself and others when something is unclear.
- You ask questions about approaches to solving problems and suggest alternate options.
- You write efficient and readable code, you evaluate the pros and cons of various approaches, and write high quality technical proposals.
- You are learning and applying our standards around design, testing, error handling, monitoring, alerting, and documentation.
- You proactively maintain, debug, and fix problems in your code.
- You seek out and learn industry best practices and standards.
- You effectively manage your time and know when to ask for help to unblock yourself. When blocked, you are resourceful and take initiative in finding other tasks to complete.
- You are given a set of large tasks and are able to effectively break them down into smaller tasks, which are easier to complete.
- You actively participate in your team's on-call rotation.
- You seek and provide feedback from engineers on the team in regards to design & technical decisions, technical proposals, and production readiness.
- You provide timely code reviews and are responsive to peer feedback on code reviews and learn from it.
- You proactively communicate your progress and blockers to stakeholders (eg. PM, Design, Ops, etc.), your team, and manager and ensure timely project delivery.
- You ask thoughtful questions and challenge assumptions to ensure you are solving the right problems.
- You foster an inclusive team culture that supports constructive feedback and encourages diversity of thought.
- You do things to benefit your peers and community such as participating in meetings, including providing constructive feedback on ideas and initiatives.
- You advocate for yourself and others when something is unclear.
- You ask questions about approaches to solving problems and suggest alternate options.
- You escalate early and often with feedback on product features, product bug reports, and constructive criticism.
- You fix out of date code, tests, scripts, runbooks, and documentation.
- You write efficient and readable code, you evaluate the pros and cons of various approaches, and write high quality technical proposals.
- You are applying our standards around design, testing, error handling, monitoring, alerting, and documentation.
- You proactively maintain, debug, and fix problems in your code.
- You take responsibility for delivery of your code including design, coding, testing, monitoring/alerts, deployment and rollout.
- Your code handles interactions between multiple systems/components that span multiple diffs to address complex projects.
- You seek out and learn industry best practices and standards, which you incorporate in your coding patterns, design & architecture
- You effectively manage your time and know when to ask for help to unblock yourself. When blocked, you are resourceful and take initiative in finding other tasks to complete.
- You break down well defined requirements into milestones and larger tasks.
- You actively participate in your team's on-call rotation.
- You seek feedback on your own design & technical proposals while encouraging other engineers on the team to follow the same best practices.
- You provide timely code reviews and are responsive to peer feedback on code reviews and learn from it.
- You ask thoughtful questions and challenge assumptions to ensure you are solving the right problems.
- You proactively communicate your progress and blockers to stakeholders (eg. PM, Design, Ops, etc.), your team, and manager and ensure timely project delivery.
- You help other engineers on the end to end delivery of their code from design, code, tests, monitoring/alerts, deployment and rollout.
- You foster an inclusive team culture that supports constructive feedback and encourages diversity of thought.
- You do things to benefit your peers and community such as participating in meetings, including providing constructive feedback on ideas and initiatives.
- You advocate for yourself and others when something is unclear.
- You ask questions about approaches to solving problems and suggest alternate options.
- You provide feedback on product features, file detailed bugs, and voice constructive comments in small- and large-group discussions.
- You fix out of date code, tests, scripts, runbooks, and documentation.
- You are interview-trained and share the interview load for your team.
- You have established a track record of writing efficient and readable code, you evaluate the pros and cons of various approaches, and write high quality technical documentation, that are easy to maintain for the next six months.
- You are applying and helping define our standards around design, testing, error handling, monitoring, alerting, and documentation.
- You proactively maintain, debug, and fix problems in your code.
- You have established a track record of handling the responsibility of delivery of your code including design, coding, testing, monitoring/alerts, deployment and rollout.
- Your code handles interactions between multiple systems/components that span multiple diffs to address complex projects.
- You have established a track record of seeking out and learning industry best practices and standards, which you incorporate in your coding patterns, design & architecture. You instill these best practices and standards into our engineering team.
- You have established a track record of effectively managing your time and know when to ask for help to unblock yourself. When blocked, you are resourceful and take initiative in finding other tasks to complete.
- You help create organization and structure around large projects & problems that aren’t well defined, thereby setting your team up to successfully deliver on initiatives.
- You have established a track record of investigating and vetting the reuse of existing components and services when approaching new projects and feature requests.
- You can orchestrate and coordinate projects & solve problems that span across multiple teams.
- You actively participate in your team's on-call rotation and consistently help identify root causes of issues and help resolve them. You proactively communicate with your peers on incident status and create post-mortems when appropriate.
- You seek feedback on your own design & technical proposals while facilitating technical discussions on the team and make sure other engineers follow the same best practices.
- You provide timely code reviews and are responsive to peer feedback on code reviews and learn from it.
- You ask thoughtful questions and challenge assumptions to ensure you and your team are solving the right problems.
- You listen attentively to team members’ ideas and concerns, consider their viewpoints, and ask clarifying questions that elicit clearer responses.
- You proactively communicate your progress and blockers to stakeholders (eg. PM, Design, Ops, etc.), your team, and manager and ensure timely project delivery.
- You help other engineers on the end to end delivery of their code from design, code, tests, monitoring/alerts, deployment and rollout.
- You start becoming a domain resource to engineers outside of your team and help them leverage the right solutions.
- You foster an inclusive team culture that supports constructive feedback and encourages diversity of thought.
- You do things that benefit your peers and community such as providing feedback on product features, filing detailed bugs and providing constructive comments.
- You fix out of date code, tests, scripts, runbooks, and documentation.
- You advocate for yourself and others when something is unclear.
- You ask questions about approaches to solving problems and suggest alternate options.
- You are interview-trained and share the interview load for your team.
- You mentor members of your team and help them grow and develop.
- You have established a track record of writing efficient and readable code, you evaluate the pros and cons of various approaches, and write high quality technical proposals that are easy to maintain for the next six months.
- You are applying and consistently defining our standards around design, testing, error handling, monitoring, alerting, and documentation.
- You proactively maintain, debug, and fix problems in your code.
- You have established a track record of handling the responsibility of delivery of your code including design, coding, testing, monitoring/alerts, deployment and rollout.
- Your code handles interactions between multiple systems/components that span multiple diffs to address complex projects.
- You have established a track record of seeking out and learning industry best practices and standards, which you incorporate in your coding patterns, design & architecture. You instill these best practices and standards into our engineering team.
- You have established a track record of writing high quality technical proposals, solicit feedback from the team, and host/attend architecture review discussions.
- You have established a track record of enabling others to successfully deliver on and implement end-to-end technical proposals.
- You have established a track record of effectively managing your time and know when to ask for help to unblock yourself. When blocked, you are resourceful and take initiative in finding other tasks to complete.
- You have established a track record of helping create organization and structure around large projects & problems that aren’t well defined, thereby setting your team and other engineering teams up to successfully deliver on initiatives.
- You have established a track record of investigating and vetting the reuse of existing components and services when approaching new projects and feature requests. I.e. you have delivered projects and work that shows this in a repeatable fashion
- You have established a track record of orchestrating and coordinating projects, solving problems, and delivering successful solutions that may span across multiple teams.
- You actively participate in your team's on-call rotation.
- You seek feedback on your own design & technical proposals while facilitating technical discussions on the team and making sure other engineers follow the same best practices.
- You provide timely code reviews and are responsive to peer feedback on code reviews and learn from it.
- You ask thoughtful questions and challenge assumptions to ensure you and your team are solving the right problems.
- You proactively communicate your progress and blockers to stakeholders (eg. PM, Design, Ops, etc.), your team, and manager and ensure timely project delivery.
- You help other engineers on the end to end delivery of their code from design, code, tests, monitoring/alerts, deployment and rollout.
- You are a domain resource to engineers outside of your team and help them leverage the right solutions.
- You foster an inclusive team culture that supports constructive feedback and encourages diversity of thought.
- You do things that benefit your peers and community such as providing feedback on product features, filing detailed bugs and providing constructive comments.
- You fix out of date code, tests, scripts, runbooks, and documentation.
- You are interviewing trained and share the interview load for your team.
- You mentor members both within and outside of your team to help them grow and develop.
- You introduce frameworks and abstractions that improve the efficiency of other engineers.
We've found that these four competency areas capture much of what's worked well for us. The attributes espoused here have been what we've commonly seen help engineers thrive at Codecademy and similar engineering organizations.
We believe a team should prosper and grow as a team: that its success is measured by both the quality and throughput of its output and the personal growth and enjoyment of its individual members. Strong technical achievements are only half of that. Fostering a collaborative community is also necessary for us to be a great place to work.
To be a strong engineer, you need strong development chops. That spans the gamut of the core tasks you'll be doing here, from the granular act of writing code to the larger-scale process of designing and maintaining systems. We actively appreciate that our industry is rapidly evolving and new best practices and standards are always around the corner. We need engineers who bring in those fresh ideas to be able to produce our best work.
On top of the core development fundamentals, successful engineers are ones who ship products and are able to reliably do so on time with high quality. They need to balance the various tasks they're given and, to an extent, manage their own time. Engineers have uniquely deep insight into their work, and often need to drive it forward.
Teams are more than the sum of their parts, and as an engineer, part of your responsibilities are that everyone is given the resources to work their best. Strong team members both communicate the current progress and blockers of their own work, in order to keep their peers from getting stuck, and share feedback regularly that shape the code and product to be the best it can be
Part of being on a team is contributing to benefit the whole -- beyond accomplishing your own todo list. We want everyone to push the team culture forward and actively participate in it. Strong team players will identify areas of improvement in our culture and work towards making them better.
When reading the engineering competencies for your level you should work with your manager to determine areas that you would like to work on and areas that they feel you need to work on to help you grow and attain the various skills that are described above. It is not expected that each engineer is working on all areas at any given point in time; rather, it is assumed that over time one demonstrates proficiency in all areas.
It is important to first focus on meeting the criteria at your current level, before focusing on the expectations at the level above you. Establishing a strong performance baseline at your level will further set you up for success to grow to the next level.
The further you progress in your career the more time it will take to demonstrate proficiency in specific areas. Certain competencies include “established a track record of”. Generally it takes a minimum of 3-4 quarters to be able to repeat a certain set of expectations and demonstrate consistent proficiency.
Yes! You can go the GitHub Page to see the interactive matrix view. It pulls from this markdown file so it should always be up to date.