Ask Me Anything: Career Development
What questions would you like to ask a Software Engineer about Career Development? I will try to answer your questions submitted through the form below.
- What is a senior software engineer supposed to do?
- What are the most important qualities and capabilities of a leader?
- If I want to do full-stack development, which language should I learn in 2020?
- How can I land a job as a UI developer in countries like the USA, Canada, or Germany?
- Is there anything you miss from freelancing and/or contracting when comparing to corporate development?
- I am looking to join FAANG companies. What should I do to prepare?
- What are some tips to quickly advance in your career (in terms of compensation, responsibilities, impact)?
- Freelancing or building a side business and generate passive income?
- What do you think has been a mistake made in your career?
- How should I go about starting my career?
- How do you structure your project code?
- Do you think front-end development is hard to break into for someone who has just started? Should I focus on full-stack?
Asked by Anonymous.
I assume this question is about the differences between Junior and Senior levels, please correct me if I'm wrong.
In most companies, the definition of "senior" will vary. However, if you're working in freelance or doing contract development, there is a chance you are senior without knowing it.
Many companies define seniority as having enough technical know-how to be autonomous. That doesn't mean that you know everything, or that you won't ever need to ask for help. My biggest mistake in my career was assuming that I couldn't allow myself to be vulnerable and ask for help. I still use Google every day, and so does everyone else in the industry. What changes is that it becomes easier to figure out what it is you're searching for.
The more senior an engineer, the more it becomes about impact and influence. Your contributions become centered around efforts that have a greater return on investment. And your thoughts and ideas become contagious - influencing others to become more thoughtful and aligned. Higher-level senior engineers, such as principal or architects - can go weeks or months without writing a line of code.
Asked by SnowWhite
I had to really think about this question because there are so many potential answers, and people tend to disagree depending on their philosophy.
As a software engineer who has learned from circumstances and worked with awesome leaders:
- Emotional Intelligence
- Being Proactive
And I could go on. A good leader above all is able to communicate with their team in a way that is reassuring and motivating. Emotional intelligence is necessary for making people feel heard. Ask anyone who has worked in an organization, and most will tell you they've had a difficult conversation with a leader and walked away feeling disconnected.
Humility is important for team culture and organizational health because nobody wants to be around a jerk. Leaders that want to nurture a healthy environment will be the first ones to admit when they make mistakes. The fear of making mistakes can in some cases be more paralyzing than the mistakes themselves. A good leader recognizes that a mistake can also be a learning and growth opportunity.
Confidence is important in a leader because people need a direction to follow. People often confuse confidence with certainty. Good leaders are confident when they are certain, however, they are also confident in recognizing and identifying ambiguity or uncertainty. Trust goes hand-in-hand with confidence - people need to trust the direction they're given.
A good leader overcommunicates. There is a great book by Patrick Lencioni called "The Advantage" that talks about why overcommunication is important. Essentially it's an important tool for ruling out ambiguity, establishing trust and confidence, and ensuring alignment across a team. In theory, overcommunicating sounds like it would be unnecessary, but in practice, it makes a huge impact.
Being proactive is the last thing I will mention but definitely not the last. A leader that is reactive is also unpredictable, and this causes a lot of emotional burden on the team. An unpredictable leader is unapproachable and as a result, the ambiguity we previously mentioned is going to cause friction and hinder the process.
This is my perspective on the qualities and capabilities that I have seen in leaders that have made a big impact on my career. Qualities like emotional intelligence, humility, confidence, trust, overcommunication, and being proactive - these are skills that leaders cultivate to help build a strong team of individuals that eventually become leaders themselves.
Here are some other great examples from my colleague, Naz Delam:
Asked by Sandesh.
Sandesh is working with Vue.js, and wondering whether Angular or React is worth learning. In the question, there is a concern whether a backend language is required to succeed with front-end experience.
There are a lot of biases towards one framework or another, however, all three of the frameworks mentioned above are still totally valid choices in 2020. When choosing a framework in a team setting, what matters most is community support. When you need help with the framework, or you're trying to solve a problem, the community makes a big difference. Whether you want to learn any other framework is up to you, and whether that framework solves the problems that you're facing, or otherwise takes you in a direction you want to go.
Whether you want to specialize in front-end development or generalize in full-stack, those are both great options. For example, I am a full-stack engineer but my role is front-end focused. Some companies prefer to hire separate front-end and back-end engineers, where each is focused on their respective roles. Other companies prefer to hire full-stack. In my experience, it's worth specializing in a single focus first. If you're starting in front-end, I recommend becoming proficient before trying to take on the back-end. This is helpful for understanding the bigger picture, and how the two connect.
Asked Sandeep Chikhale.
Asked by Augustus.
Totally! I miss having more flexibility to choose and adapt my stack. When you're working on a team you have to make personal sacrifices for the better of the organization. When you're joining a company, you're inheriting a new stack and trying to find ways to bring your own ideas to it. Tools can have a huge impact on productivity, and so it can easily feel like learning to walk all over again. Ramping up in a new stack takes time and it can feel overwhelming.
Most people will say they miss the autonomy and flexibility. My situation is unique in that now I have even more of that, and I'm not living paycheck to paycheck anymore. I did enjoy the fast-paced nature of getting to build new things all the time. There's an adrenaline rush to constantly shipping, and pacing myself has taken me time to adjust to. Looking back though, I realize a lot of that contributed to some burn out which is why in the bigger picture, I am much happier now :)
Asked by Anonymous
OP has mentioned that he has a certain number of years as a Java developer.
The best advice I can give you if you're looking to work at a larger tech company is to focus on essential skills. Often called "soft skills," these are the attributes and values that will make you a more attractive candidate. These are the skills that will help you nail the interview, work more effectively and collaborate, and make an impact at any company.
The other side of interviews are the coding questions. Depending on your role (front-end, back-end), these can vary. I always spend time before any interview running over common exercises or coding challenges. What's more important than actually solving the problem, however, is demonstrating that you can talk through it. This goes back to the essential skills, but I've been in a few interviews where I couldn't complete the problem (whether because of time, or there was a piece I was missing). This wasn't a reflection of my technical ability, sometimes solving a palindrome algorithm is not for everyone. I generally recommend thinking out loud in interviews and leaning into those essential skills.
The last piece of advice I can give you: read about the company. Become familiar with its culture and treat the interview as a bi-directional process. You are not only interviewing for the role, but you are also the interviewer. You are interviewing the company to see if they are a good fit for you as well.
Asked by Anonymous
This is a great question because when software engineers are asked what they want out of their role, it usually comes down to compensation, responsibilities, and impact. However, many developers make the mistake of assuming it in that order.
I generally think of it the opposite way around: impact, responsibilities, and compensation.
Impact is the most important because that is how you acquire more responsibility. Most of the time, folks who are given responsibilities are already doing the work. Focusing on impact-first allows you to assess your value, and how much that value matters to your employer.
Once your impact has become your responsibility, the dominoes fall into compensation. If you are taking on more responsibility and having a higher impact, your compensation should reflect the value that you're bringing. If you're not seeing that value, it's time to take your impact and responsibilities elsewhere. In most cases, however, you can talk with your manager and assess your impact and responsibilities. This often happens in yearly review cycles, and that's most often when compensation is measured and adjusted.
If you are only chasing compensation, you may find yourself unsatisfied most of the time. Is it worth leaving a great job just to get an extra thousand dollars? Most definitely not.
Asked by Anonymous
This is a great question because both of those options will pay the bills. I generally recommend both and picking and choosing as you go. When I was freelancing and generating passive income - I was often doing both at the same time. However, time is a precious resource, as is money. So if you find yourself needing to pay the bills, pick up a few freelancing gigs.
Generating a passive income is a really great opportunity. I've done it several times in my career and it's given me a safety net and allowed me to take bigger risks in jobs. When you're trying to generate a passive income and balance a full-time job - it becomes a matter of time and priority. On the other hand, I have also secured more lucrative offers and connections from freelancing and doing great work for clients.
So why not both?
Asked by Anonymous
I've made plenty of mistakes so it's hard to pick just one, but it sounds like this question is more about a mistake that has had an impact on my career trajectory.
The biggest mistake I've made in my career trajectory is not advocating for myself, and not networking. I spent a lot of time working in a silo because I didn't know any better. I had no idea there were other opportunities out there for me and I spent way too much time at lower level rungs. Once I started networking and looking to see what's out there, my potential and impact grew exponentially.
Advocating for yourself is hard because you need to have the right information to be able to do that. As a self-taught engineer, I learned most everything through trial and error. The context and time in which I started programming - people weren't publishing friendly tutorials online and it was difficult asking for help online. As a result, it was difficult to be vulnerable to my peers and my managers. Advocating for yourself not only means standing up for yourself, but it also means allowing yourself to be vulnerable when you need help. These were issues that held me back in many ways.
Asked by Garrett.
Garrett's story is about breaking into tech later in life. He's mentioned the possibility of doing internships, open-source, and building an online presence.
These are all great options for getting your foot into the door. Of all the options mentioned, Networking is going to have the largest impact on finding a job and leveling up from there. So as you're considering internships, open-source, or building an online presence - don't forget to network along the way. Make friends with other developers and take an interest in their work. And share openly about your work. There is no cutoff for starting your career in tech: I know a number of folks who have done it across their lifetimes.
Since COVID-19, networking requires some additional creativity. I always recommend trying open source because it's a great way to build experience and connections. Find your favorite repositories and fix some bugs, or add documentation and tests. Find out where those maintainers are socializing and go to there. Don't wait for the network to come to you.
Asked by Nokol.
It will depend on whether there is a team working on the project or not. When I work privately, I tend to experiment more and follow the least path of resistance. This will mean that I am okay with some sloppy code because nobody else will have to share the ownership. Usually, I will use a framework to get started and handle the heavy lifting. My preferred stack right now is:
- Next.JS (React Framework)
- Emotion (CSS-in-JS)
- Contentful for when I need a headless CMS API.
- Apollo Server for a GraphQL API
- Relay for GraphQL client
When working in a job or a team, I will structure my code differently to make it easier to maintain and update. This means that if someone else is looking at my code, it's clearer to understand what is going on, it's documented, and even easy to delete. After I check in my code, I no longer think of it as "my" code, but rather "our" code. And when I'm writing new code I try to think about how I am writing it to fit into this model. Generally, I am anticipating how someone else might need to update the code, and what decisions I can make today that would make that easier for them to do.
Asked by Anonymous.
I started in web development about 15 years ago in 2005. Before that I was toying around with Java automation because I was terrible at the game RuneScape, and didn't have enough time to get any better. Then I started making websites for my bots. I operated on the fringes, slicing PSDs into HTML templates and creating themes. I never advertised my work, but If I saw an opportunity I would reply. That led me from one opportunity to another.
Fast forward to today, it is not any harder to get started with web development. My understanding is that it's more accessible now than it ever was - but it's hard to break past the entry-level ceiling. It's hard to break past that ceiling *because* it's so accessible and there's a larger pool of candidates to choose from. This has driven rates down for basic freelance and contract work. Services like Freelancer and Upwork have saturated the market with web developers that are undercutting each other. So how does a web dev get more experience?
To break into main-stream web development, today the options unfortunately require a lot of investment with not much immediate return on investment. This takes the form in open-source work, unpaid internships, and bootcamps. On top of any of these options, Networking is critical. As far as the fringes go - they're still there. I can't tell you where to look, I don't even know myself anymore. However there are always those niche specialties that can give someone a foot in the door.
Your mileage may vary - everyone's experience is different. I do recommend open-source work as a great place to start gaining experience and building connections. It can start with something small as updating some docs or fixing an open bug in a repository. Or even writing tests. In tandem to this - start building connections. Make friends with people in the industry - because more often than not, they will be the source of your next opportunity.
As far as whether to start with front-end or full-stack, I'd recommend focusing on one facet. Whether that's front-end or back-end, it's helpful to grow an understanding in one area before trying to expand horizontally in another. I would suggest to start with front-end because the barrier to entry is less, and browsers are installed everywhere!
Photo by AbsolutVision.