In February, an engineer I’d managed for over a year moved to a new team. In one of our last 1:1s, I mentioned that he’d recently done some good project management. He replied that he’d had an epiphany about self-direction; he’d decided that he needed to own everything about his work, not just his code, to make sure his projects succeeded. I was impressed with him and, instantly, disappointed in myself — I’d long considered ownership the most important thing for young engineers to learn, but I’d somehow left this engineer to discover that for himself.
I decided then to write up the practices that I think lift a newly minted software engineer from amateur to professional: the path from fixing bugs as an “Engineer 1” to leading major projects as a “Senior Engineer.”
I firmly believe that those skills can be taught, but for my part, I learned the ideas you’ll read below The Hard Way over ten years in Silicon Valley. I’ve covered some ground in that decade; I hacked on the kernel at a well known fruit company in Cupertino for six years, threw away everything I knew to pursue an interest in distributed systems, spent a year at a startup that became a Unicorn and was subsequently acquired (AppDynamics), became a manager, ended up managing over 20 people at Uber, and eventually returned to my roots as an programmer. I hope that reading this list, however incomplete it may be, saves you some of the mistakes that educated me; I sure wish someone had sent it to me when I was 22.
- 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.