This book is about accelerating your career as a programmer. It is not about programming.
Moving up the ladder from a first or second job to a senior role requires a set of skills that coding boot camps and computer science degrees don’t typically cover and that programmers often have to teach themselves.
There are plenty of books that offer new ideas and technical concepts to help you write better code. You can find books and courses that cover the ins and outs of a programming language, and tutorials that show how to build something while learning a new language or framework.
But much of the work you do during your career will be planning, reviewing, strategizing, collaborating, and many other things that don’t involve coding. To excel in your career as a programmer requires soft skills that are different from your technical abilities. As you’ll learn throughout this book and throughout your career, the soft skills are often what set you apart from other programmers and increase the impact of your work. They will factor into your manager’s decisions when it comes time for a promotion. And the best part is that almost none of them will be outdated in a few years, even as the industry evolves.
The practice of programming may feel like an individual activity, but the process of building software involves collaborating with other people, both technical and nontechnical. While reading, writing, and debugging code will challenge you, possibly the hardest thing you learn over the course of your career is how to work effectively with other people. You learn how to compromise and collaborate with people that may have different personalities and opinions than you do. You learn how to communicate your ideas and listen to other people’s points of view. All these skills are needed in a senior role.
Unfortunately, there aren’t many books that teach these soft skills. Many of these skills are developed with experience. You’ll make mistakes along the way, and that’s okay, because everyone does. What matters most is that you learn from your failures and gain the wisdom to avoid those same mistakes in the future. And you may learn enough to pass that wisdom along to others so they can learn to avoid similar situations. In fact, that is one that sets a senior programmer apart from others—the ability to lift their team to greater heights.
I started my programming career at a small startup called Mertado, soon after they completed the Winter 2010 batch at Y Combinator. Nine months into my new role, we were acquired by Groupon to help build out their Groupon Goods platform soon after they had gone public. After the dust had settled, I was placed on the team that built the machine learning system to personalize 100 million emails sent to inboxes each morning. I was responsible for taking the personalized outputs from the MapReduce jobs, rendering the results in our HTML email templates, and performing multivariate tests on different audiences in order to increase the conversion rate, where a one percent increase meant millions of dollars in additional revenue.
It turns out that working at a small, ten-person startup is vastly different from working at a public company on a large engineering team. Not only was I exposed to new technologies, development workflows, build systems, and enormous codebases, I also got first-hand experience observing how high-performing teams deliver software at scale. I started to see how all of my coworkers juggled different tasks and priorities, and as I observed, I started to learn from them.
What I noticed early on was that they didn’t just sit there and code all day with their headphones on. Yes, my coworkers delivered clean and robust code at a fast pace—but they were good at the entire software development process. The most impactful engineers combine technical depth with a broad set of soft skills, people skills, and product skills.
I’ve made many mistakes throughout the course of my career. It took hard work and trial and error to learn how to navigate office politics, manage risk, and work well with others to deliver quality software. I had to learn most of these soft skills on the job and by observing others as I navigated my career.
But I wish I’d had better resources to prepare me for the obstacles on the path to becoming a senior software engineer. My goal in writing this book is to pass along the knowledge I’ve gained so far in the hope that it will help the next generation of programmers be team players and build fulfilling careers.
This guide is focused on providing junior and mid-level programmers the tools they need to excel in their careers—the journey from first full-time engineering job to earning a first promotion.
This book is primarily for individual contributors: it does not cover the broader topic of managing other junior and mid-level programmers—but engineering managers and senior engineers may still find some of the material useful for mentoring or sharing with their team members or direct reports.
New programmers. If you’re just starting to learn how to program by teaching yourself, or you’re enrolled in school or a coding bootcamp, congrats! You’re just getting started on a fun and exciting journey. While this book won’t teach you how to program, it will prepare you for what to expect when you land your first full-time programming job. There’s a lot to learn, so be patient and take things one step at a time. You got this!
Junior programmers. If you’ve already landed your first full-time programming role, nice job! You’ve proven that you can build programs and solve difficult problems, so now it’s time to focus on being a team player. You may already know some of the topics covered in this book, but it never hurts to reinforce those ideas and build good habits. You’ll be reading a lot of unfamiliar code and asking questions, so you may find those sections especially useful.
Mid-level programmers. If you’ve been working as a full-time programmer for a few years, you’re probably starting to get the hang of things. You may know your way around the codebase and be comfortable working on a team, so some of the topics covered in this book may already be second nature to you. This book will still be helpful if you use it to focus on honing those skills even further to solidify those good habits. The latter half of the book should be especially useful to mid-level programmers as you begin to make more impactful technical decisions.
Senior programmers, mentors, and managers. We all had to start somewhere in our careers, and by now, almost all of the information in this book should be familiar to senior programmers and programming managers. It’s easy to forget just how far you’ve come and how difficult it was to learn certain skills. This book offers perspective to experienced programmers and reminds them of areas they can offer assistance in when mentoring and managing junior and mid-level programmers.
This book is meant to be a resource for junior and mid-level programmers on soft skills required to excel as a professional programmer. It’s meant to be your career guide as you learn to navigate the workplace, from learning the lingo and how the business operates to working as part of a team producing quality software and real value for your customers.
The book is not necessarily designed to be read from cover to cover, so feel free to skip around to different sections if a topic seems particularly relevant to you at the moment.
My goal is to help you establish a personal roadmap to guide you as you start your programming career or reach that next level of responsibility. I hope this becomes a book you revisit regularly to review your progress and recalibrate your priorities for your next career goal.
Let’s look at what we’ll cover:
Growing Your Career. In the first section, you’ll start off by learning how and why you should set expectations for your career. You’re at the very beginning of a years-long journey to becoming a senior programmer, so it’s important to set some long-term goals to work towards.
What Makes You a Senior Engineer? In this section, we’ll dive into specific characteristics that differentiate a senior engineer from a junior engineer. You’ll gain a better understanding of what you should focus on if you’re working towards a promotion to a senior title.
You’re Not an Impostor. Next, you’ll learn that everyone deals with impostor feelings during their career. You’ll learn how to recognize and understand these feelings as well as ways to reduce them when you’re overwhelmed.
Working with Your Manager. You don’t have to be friends with your manager. But, they’ll have a big influence on your career, so it’s important that the two of you work well together. In this section, you’ll learn how to understand your manager’s style and align your goals so both of you can succeed.
How to Recover from Mistakes. Even the best programmers make mistakes. What sets the best apart is how they respond when things go wrong. In this section, you’ll learn what you can do when you make a mistake and how you can recover quickly.
How to Ask Better Questions. Asking good questions is a simple and effective way to supercharge your learning early in your career. Here, I share tips and techniques for learning as much as you can from your coworkers and for tapping into their experience.
How to Read Unfamiliar Code. You’ll read lots of other people’s code throughout your career, which will have a big influence on how you write your own code. In this section, you’ll learn how to get up to speed quickly in an unfamiliar codebase.
How to Add Value. One of your main responsibilities as a programmer is to add value for your customers and for your employer. In this section, we’ll cover specific ways in which you can do this.
How to Manage Risk. Another top priority for programmers is to identify areas of risk and manage them in a way that’s consistent with business objectives. We’ll cover types of risk common in software development and ways you can help mitigate them in your own role.
How to Deliver Better Results. At the end of the day, your job is to ship code and deliver value to your customers. This section offers specific things you can do to work efficiently and to increase your productivity when writing code.
How to Communicate More Effectively. Communicating well sounds simple but can be deceivingly difficult in fast-paced work environments. In this section, you’ll learn how to improve your speaking and listening skills to better convey your ideas and stand out among your peers.
Work-Life Balance. Life isn’t all about work, so in this section, we’ll go over the importance of creating a work-life balance that works for you. We’ll cover ways in which you can expand your horizons and prevent burnout that can affect your productivity and the quality of your work.
Asking for the Promotion. This is it. This is where you ask the big question to your manager. You’ll learn what you should do to prepare for this moment and how you should approach the conversation. At this point, you’ll be ready to take on more responsibility.
By the end of this book, you should have a deeper understanding of the soft skills required to succeed as a software engineer, along with a path forward for applying those skills as you work towards a promotion to a senior role. At that point, it’s up to you to put these ideas into practice and make it happen. So, with that said, let’s get started!
Key points are highlighted like this:
important An important note.
caution A caution.
confusion A confusion or reminder.
In addition, you’ll find examples highlighted:
exampleAn example or scenario.
doAn illustration of something that’s recommended.
don’tAn illustration of something that’s not recommended.
important If you’re reading this Holloway Edition of the book online, please remember you can add comments and suggestions. This will help the guide improve in future revisions, and your helpful comments will be published to assist other readers.
This book is only possible because of the mountain of support from family, friends, coworkers, and new acquaintances I’ve met through people involved with this book.
I want to thank my parents for their unwavering support, for always believing in me, and for providing the foundation for me to build a life and a career.
Thank you to my brother, Brian, for inspiring me to begin writing down my thoughts on how to help people build a successful programming career.
Thank you to all my current and former coworkers who have had an impact on me, big or small, throughout my programming career.
To my current and former managers who have taught me so much about all aspects of planning, designing, building, and maintaining software systems. The process can be messy at times, but you’ve taught me how to embrace the chaos and trust the process.
To Mehul Shah, for taking a chance on me and kick-starting my professional programming career.
A special thank you to everyone who helped review and revise early drafts of this book. It’s hard to put into words how much better this book turned out thanks to the following people: Josh Levy, Wes Cowley, Rachel Jepsen, Robert Swisher, Tim Sorweid, Yuri Subach, Ozzie Osman, Nitin Sharma, Ryan Rusnak, and anyone else I’ve regrettably forgotten.
And finally I want to thank my wife, Julia, for all her love and support, and for cheering me on every step of the way.
You’re here because you want to learn how to be a better software engineer. You may already know how to code, or you might still be learning your first programming language. But that’s not what this book is about. This book won’t teach you how to write cleaner code or architect better systems. While the ability to write elegant and scalable programs are important skills to have as a programmer, they alone do not make you a successful programmer.
This book will teach you everything else you need to be a well-rounded programmer—a team player who collaborates well with others, who communicates effectively, and who knows how to manage risk while delivering value to customers. These skills, called soft skills, become increasingly important as you climb the career ladder.
In fact, while many programmers reach a certain level of technical ability during their career, not all of them possess the soft skills necessary to have the greatest impact on a team. Simply put, these soft skills are what separate good programmers from great ones in the later stages of their careers. They will help you unlock new opportunities as you take on increased responsibility and accountability.