This Q&A is geared towards high school or post-secondary students, but those who are interested in breaking into software engineering or computer science will probably find this useful as well.
I’m a software engineer at Facebook and I’ve been here for two years. I work on Messaging Infrastructure for WhatsApp. Some examples of areas I focus on are message storage and delivery, supporting new product features and configuration management.
In 2012 — due to my desire to build robots that help people — I went into the 5 year Mechatronics Engineering co-op program at the University of Waterloo. After a couple of software engineering internships, I discovered I really enjoyed the work and lifestyle of a software engineer. I also realized instead of building robots, I could build software to help people. This prompted me to switch into Software Engineering after second year. Switching programs put me back one year, but it also gave me two extra internships; this brought me to a total of 8 internships at companies like Yelp, Snapchat, Uber and Facebook. My internships were split between Canada and the US, software engineering and data science, and small and large companies. I eventually graduated in 2018 and joined Facebook shortly after that.
I love building products and features that impact millions, if not billions, of people. There’s nothing like the feeling of telling your friends and family that you built this feature in their app. I enjoy the variety of responsibilities that being a software engineer entails like coding, system design and collaborating with others. Most importantly, I enjoy solving difficult problems. I get to exercise my brain everyday in fun and creative ways. The people are amazing as well; they’re usually really ambitious and inspiring people. Work is one of the reasons I’m excited to get up everyday.
Firstly, you should research and understand what the job entails and what skills you need to succeed. You should make sure this aligns with your aspirations and personality. For example, one misconception is software engineers code all day, but we also lead design discussions, communicate with stakeholders and collaborate with peers. Do some research and ask yourself if the day-to-day work and the overall job is something you’d enjoy.
Next, you should start to learn how to code; learn coding fundamentals like how to use variables, loops, functions and classes. You can learn how to code in computer science (CS) classes at your school or online. You should start building software because it’s one of the best ways to apply what you’ve learned; you can start by building something simple like Tic-Tac-Toe. Collaborating with others is even better; you can work with friends, attend hackathons or even contribute to open-source software. Eventually you can even start dabbling in more advanced topics like concurrency, operating systems and distributed systems.
After that, you should try to gain real work experience. This is one of the best ways to grow technically and gain all the soft skills required for the job. I’d recommend trying to get an internship as early as possible; if it’s in high school, that’s even better. It doesn’t have to be at a big company. It can be anywhere, like your high school or family friend’s business. I’d also suggest learning basic algorithms and data structures because they are essential in technical interviews for internships and full-time positions. For internships, I think it’s important to find organizations with exceptional engineers who can help you grow by mentoring and creating growth opportunities for you.
One of the most important takeaways were the basic programming foundations and concepts you learn from lectures, projects and labs. School provides the building blocks for your career which enables you to: explore more advanced topics, brainstorm innovative solutions, and facilitate in-depth discussions. In addition, you’ll probably forget most of what you learn in school; most of it isn’t useful in your day-to-day work anyways. When you start working, you’ll use and cultivate only a few basic concepts. Even if you forget these concepts, they’ll be easier to re-learn because you’ve learned them before.
I believe my school experience helped foster my creative thinking which is critical in software engineering. Creative thinking is important because when you design solutions to problems with a lot of requirements, it requires brainstorming ideas that satisfy all the constraints while being easy to understand and efficient for the system — engineering is an art in this aspect. There are many ways to solve the same problem; each with their own tradeoffs. Creativity is exercised in school through: exploring open ended projects, working on side projects with friends, and attending hackathons. In addition, by studying multiple distinct subjects you can create unique solutions through cross-disciplinary thinking. Having in-depth knowledge in diverse topics has been shown to be effective in creative thinking, even outside of software engineering.
If you go into university without adapting your time management skills, you’ll quickly realize you won’t have enough time to do everything you want. Prioritization is an important aspect of time management; you should figure out what tasks are urgent and focus your time and energy on those, like studying for those difficult, core classes or spending less time with people you’re not close with. You can also use a task manager, like Asana, and a calendar application, like Google Calendar, to help manage your tasks, plan your schedule, and hold yourself accountable. Time management is important in software engineering because you can have many things on your plate, especially as you become more senior. You’re usually working on multiple projects concurrently; on top of that, you can be also mentoring newcomers or consulting and collaborating with colleagues.
I’d recommend taking computer science (CS) classes in every grade that it’s offered in high school. CS classes focus on the fundamentals that are important for programming. I’d also focus on math, especially discrete math, because it involves a lot of concepts that transfer to CS, like number and graph theory. In general, math and science teaches you how to think logically, understand abstract concepts, and solve problems. When I say solve problems, I mean the ability to read a problem, comprehend it, break it down, decide on what calculations to do, execute the calculations, and finally, communicate the results — this logical approach is something you’ll do often in software engineering.
From my experience, “successful” software engineers are usually: visionary, detail-oriented, hard-working and always learning. When I was in school, I didn’t think these qualities were as important as I do now.
The most important “secret” I have is I have an explicit goal to live a happy life. Happiness to me means a few things: helping others to achieve their idea of happiness; having wonderful memories with people I love and cherish; and having a long-lasting positive impact on this world, whether it’s raising great children or building useful software products. I try to make decisions in a way that will eventually lead to happiness for me and for others. I try to maximize positive — and long-lasting — experiences, memories, and relationships. Work is also an important part of your life and it should contribute to your happiness. If it doesn’t make you happy then figure out why; maybe it’s time to switch teams, companies or careers; or perhaps you need a break to figure things out. Pursuing happiness is like running a marathon, not a sprint. It might be better to trade off short-term happiness for greater happiness later on. This is something I do often and this is known as delayed gratification. It has been shown to correlate with greater happiness in life.
I feel fortunate to be in an industry where most software engineers are unaffected. Technology is an industry that is somewhat strengthened by COVID-19. For example, people are using food delivery, video streaming and video calling apps much more than before. Working remotely as a software engineer is straightforward, most of your work can be done individually and the only physical tool you need is a computer.
Collaborating and holding discussions is more challenging than before. But like other sectors, we’ve adapted to using video conferencing software, like Zoom, and text-based, asynchronous communication tools, like email. It’s not the same as doing things in-person, but it’s as good as it gets. Fortunately, there are many companies focusing on making remote work better.
Working remotely was an option that previously existed, but the transition to universal remote work has been accelerated by COVID-19. I think remote work is good for software engineers because it gives us access to opportunities that were strictly location-based, like working for an American company from your hometown in Canada. Working remotely gives us flexibility to work closer to our friends and family, or live in a city with a more preferable culture and environment.
My best career decision was joining Facebook for an internship, and eventually joining Facebook as a full-time software engineer. I’m happy at Facebook because I think the company, the culture, the people and the benefits are fantastic. Facebook gives you a lot of resources and opportunities to help you grow your career, like being able to mentor an intern or work on high-risk, high-reward projects. They have great benefits that make life simpler, like on-site gyms, 3 meals a day, and company shuttles to and from work. The culture is open, transparent, and impact-driven. I work on WhatsApp which is used by over 2 billion people; at that scale, the work is incredibly challenging, interesting and high-impact. Keep in mind that Facebook isn’t for everyone; your experience might vary team to team.
If I have time, I usually weigh the pros and cons, get input and feedback from others, and think about the opportunity cost. My decision making process is typically logical and rational with a bit of gut feeling. I’m terrible at being spontaneous and I usually make poor decisions when it has to be made quickly. I try to position myself in a way that gives me ample time and space to make decisions.
I think I’m good at setting goals, understanding and rationalizing my motivations, and executing on these goals. I keep my long term goals in mind when planning and executing short and medium term goals. I remind myself to be flexible because goals can change, like when plans don’t go as expected or priorities change. In software engineering, creating, communicating and executing goals is important; especially for your team — like developing and executing your team’s roadmap — and yourself — like delivering projects and managing your career.
Another strength I have is I’m an open person — in every sense of the word. I enjoy trying new things, like new experiences, foods and activities. I’m open to hearing new, and even controversial, ideas; especially from those with different upbringings and/or political views. I’m receptive to feedback because it’s a great way to become better and improve everyone’s life around me. I don’t lie: I’m honest, straightforward and transparent. My openness builds trust and camaraderie with my team, which has helped me grow and develop in my career. Being open has helped me in my personal life, by allowing me to try new experiences and see a world beyond what I could’ve previously imagined.
I’m particular in the ways I want some things done; others might consider this trivial or nit-picky. Sometimes, I’m too outspoken and strongly opinionated, which can create tension or awkward situations. I’ve realized everybody has distinct working and communication styles. I have to accept that what’s most efficient and productive for me might not be the same for somebody else.
I don’t always empathize enough. This can sometimes create friction with others. Even when I try to empathize, the other person’s unique characteristics and cultural upbringing can make this difficult. I’ve tried to reduce friction with others by being more open, patient and polite about my thoughts and ideas.
I used to follow the herd mentality in university, especially when it came to pursuing internships. I was pursuing certain internships because I thought they were considered “prestigious” or were sought after by many people. I didn’t think carefully why I should pursue these internships, so I ended up wasting a lot of time and energy. I chased other people’s dreams and not my own. I’ve gotten better these days at figuring out my aspirations and passions, by having more thoughtful personal reflections and consultations with family and friends.
In high school, I only read for school. In university, I used to read many articles on engineering, career growth and the latest technology trends. But since I’ve become more established and comfortable with my career, I’ve started to read broader topics with the goal of better understanding how everything works; from politics to personal finance and psychology to astronomy. In terms of books, I read both fiction and non-fiction books. I also read Quora and Medium occasionally and read daily newsletters, like Morning Brew and New York Times.
If you found this useful or have any thoughts, I’d love to hear them in the comments below. Thanks for reading!
Create your free account to unlock your custom reading experience.