At Uber, my colleague, Dan Heller is a developer who moved to being an engineering manager, then back to his roots as a developer. He wrote up advice that he would have given himself when he started his career as a software engineer. He shared this as advice for people on his team. It went viral within the company and after many requests to do so, he also shared it online.
I'm re-posting this advice, as it's something I still frequently refer to for new starts on my team, as well as when people ask me for tips on how to grow to being a great engineer. This advice is evergreen for anyone starting work at a tech company, a startup or working as part of a team, within a larger organization. I also could not agree more with the advice on writing: writing well is one of the very much undervalued skills for developers.
Reason about business value: Reason like a CEO. Understand the value of your work to your company and take responsibility for reasoning about quality, feature-richness, and speed. Your job isn’t just to write code; your job is to make good decisions and help your company succeed, and that requires understanding what really matters.
Unblock yourself: Learn to never, ever accept being blocked; find a way by persuasion, escalation, or technical creativity. Again, your job isn’t just to write the code and wait for everything else to fall into place; your job is to figure out how to create value with your efforts.
Take initiative: The most common misconception in software is that there are grown-ups out there who are on top of things. Own your team’s and company’s mission. Don’t wait to be told; think about what needs doing and do it or advocate for it. Managers depend on the creativity and intelligence of their engineers, not figuring it all out themselves.
Improve your writing: Crisp technical writing eases collaboration and greatly improves your ability to persuade, inform, and teach. Remember who your audience is and what they know, write clearly and concisely, and almost always include a tl;dr above the fold.
Own your project management: Understand the dependency graph for your project, ensure key pieces have owners, write good summaries of plans and status, and proactively inform stakeholders of plans and progress. Practice running meetings! All this enables you to take on much bigger projects and is great preparation for leadership.
Own your education: Pursue mastery of your craft. Your career should be a journey of constant growth, but no one else will ensure that you grow. Find a way to make learning part of your daily life (even 5 minutes/day); get on mailing lists, find papers and books that are worth reading, and read the manual cover to cover for technologies you work with. Consistency is key; build habits that will keep you growing throughout your career.
Master your tools: Mastery of editor, debugger, compiler, IDE, database, network tools, and Unix commands is incredibly empowering and likely the best way to increase your development speed. When you encounter a new technology or command, go deeper than you think you have to; you’ll learn tricks that will serve you well again and again.
Communicate proactively: Regular, well-organized communication builds confidence and goodwill in collaborators; knowledge-sharing creates an atmosphere of learning and camaraderie. Share knowledge and set a regular cadence of informing stakeholders on project goals, progress, and obstacles. Give talks and speak up judiciously in meetings.
Find opportunities to collaborate: Good collaboration both increases your leverage and improves your visibility in your organization. Advancing your craft as an engineer requires you to have an impact beyond the code you write, and advancing your career requires, to a certain degree, building a personal brand at your company. Cross-functional projects and professional, respectful collaboration are critical to both.
Be professional and reliable: Think of yourself as a professional and act like one. Come to meetings on time and prepared, then pay attention. Deliver what you say you will and communicate proactively when things go wrong (they will). Keep your cool and express objections respectfully. Show your colleagues respect and appreciation. Minimize your complaining; bring the people around you up, not down. Everyone appreciates a true professional; more importantly, it’s the right way to behave.
Credit to Dan Heller for sharing these principles.
About me: I'm an engineer turned engineering manager, working at the intersection of Silicon Valley & European startups and tech companies. Follow me here and on Twitter. I write longer essays on software engineering on my blog, The Pragmatic Engineer. I also send a monthly newsletter with extended notes on software engineering and tech leadership topics.