[This was a message Ben Ross, a Group Engineering Manager in Office, sent to his new team as a way of making his expectations and value system very clear. ]
From: Ben Ross
Sent: Thursday, February 19, 2015 8:03 PM
Subject: Great Engineering
This email describes expectations for what makes a great engineer on our team: relentless focus on serving our customers, helping those around you succeed, executing on deliverables with efficiency, reliability, predictability, and transparency, laying the foundation for tomorrow, and leaving the product in a better place than you found it. Engineers should strive to be successful on all five dimensions.
Site Up: Today’s Customers Come First
Services succeed or fail based on their in-market customer experience: the reliability and performance of the service, and the speed and transparency with which issues are resolved. Service stability impacts customer satisfaction more than anything else we do, including delivering new functionality or growing the service. Therefore the first and highest priority for every engineer on the team is ensuring existing customers experience great reliability and performance, and better-than-SLA issue resolution speed and communication. Our team culture must prioritize continuous value, availability, reliability, performance, and incident management (TTx) over big-bang releases.
Great engineers focus on restoring service above all else when customers are impacted by service incidents, and are fully transparent with customers while doing so. Great engineers are diligent about root-cause analysis and about promptly fixing the resulting bugs such that incidents never reoccur. Great engineers are proactive about finding reliability and performance issues in production. They measure their code’s reliability instead of assuming it.
Great engineers write code that is structured to prevent incidents through reliable architecture and built-in testability, knowing that high-quality code is a necessary foundation for a high-quality service. Great engineers always write alerting, monitoring, and debugging logs as part of their features instead of as an afterthought.
Great engineers are excited to understand how today’s customers use the product and to fix problems that impact people today, and understand the incredible value of a direct feedback loop from the customer experience to the engineering team.
Make Others Great
Our team is most successful when engineers are invested in the success of those around them, including their peer engineers, program managers, operational staff, and their management chain. We achieve our maximum potential when the work of every individual is aligned with the team’s goals and when the strengths of each individual balance those around them. While this will manifest differently for every engineer depending on the individual’s experience, strengths, and situation, every engineer must actively work to help others around them achieve their full potential.
Great engineers write code that makes the job of those around them easier. They make the code more understandable and the product more testable for the benefit of the whole team. Great engineers keep their peers informed about the design of their features and how it impacts them, and are proactive about identifying and solving integration issues before check-in.
Great engineers keep the code stable and churn low so that others don’t have to deal with instability in the product. Great engineers are a resource others can look to for help in understanding difficult concepts.
Great engineers make the workplace an inviting space for people of different backgrounds and personalities. They are proactive about delivering training, advice, documentation, and tools that help others on the team do better work.
Execute on Your Deliverables
Each engineer has a continual stream of deliverables to work on: features to design, code, and stabilize; bugs to fix; documents to write. Engineers are expected to execute on their deliverables efficiently, with no unnecessary drama, at a high and constantly improving level of quality, and with maximum transparency.
Great engineers write code that is simple, clear, and easy to understand. They reduce the overall complexity of our system rather than add to it. They use architectural and coding patterns that encourage correctness so that their code is easy to stabilize and easy to maintain. Great engineers understand that understand that simplicity leads to reliability.
Great engineers understand the validation and rollout plan for their feature before they begin coding and prioritize automated validation and built-in correctness. Great engineers understand that the value of writing features as dark code always outweighs the cost, even when it is difficult and expensive. They take advantage of unit tests, scenario automation, deployment gates, alerting, monitoring, and slices in production to ensure correctness, and avoid relying on manual test passes. They know a feature isn’t done until it has been measured to be running correctly in production and explicitly budget time for validation, rollout, and post-rollout observation. Great engineers measure the quality of their code in production instead of assuming it.
Great engineers deliver features within the expected budget and without unnecessary drama. They understand their dependencies, the business needs and context driving their work, and have contingency plans for complications based on those understandings. They rely on prototypes to illuminate non-obvious issues. They are transparent about their execution on deliverables. They are diligent about updating peers and project leads on the progress of features so that the team can understand status and react accordingly. Great engineers are proactive about communicating with partners and building bridges across teams. Great engineers are open and honest when things don’t go according to plan, and ask for help when needed.
Great engineers look for ways to re-use code that others wrote, including open source projects where appropriate.
Plan for Tomorrow
While you are executing on your current projects, keep in mind what’s next and be intentional about how today’s work can lay a good foundation for tomorrow’s innovation. Great engineers build flexibility and extensibility into their architecture and code in ways that prove to be useful. Great engineers solve the problem at hand, and also identify and solve the next set of problems down the road. They break large problems down into manageable chunks that can be safely implemented and rolled out without introducing unmanageable entropy into the product. Great engineers make decisions informed by data and evidence rather than by speculation. They test their hypothesis, and are excited when their hypothesis is falsified.
Great engineers constantly learn new technologies and techniques that can make them more productive and their code more reliable. They invest in learning skills and patterns that will make them better at their job.
Great engineers know that others will need to work in their code years from now, and therefore write code that is easy to read, easy to learn, and easy to maintain without introducing bugs.
Great engineers inform their designs with insights from customers gathered through customer feedback channels and telemetry. They invest in the feedback channels necessary to understand how customers are using our product and where customers encounter frustrations.
Great engineers bring thought leadership to the team about how we can improve quality and reliability and new ways to provide customer value. They bring great ideas to the team.
Make The World Better
Every engineer should work to make their job easier: reduce complexity, change unproductive practices, automate repetitive tasks, and solve problems that make their job difficult. This can take the form of anything from refactoring problematic code, to automating test cases, to creating simple product architecture, to educating yourself and others on the team, to improving cross-team relationships.
Great engineers work to make their job and the jobs of those around them easier, and never make our job harder. Great engineers write great documentation and write code that is accessible to other engineers – code that is easy to learn and easy to debug. Great engineers are impatient with repetitive or failure-prone manual tasks and code them away. They constantly improve the unit test and automation coverage for our product. Great engineers both identify problems (technical and organizational), and also solve them.