Choosing the right company size as a software engineer

I recently changed jobs and one aspect I struggled with was figuring out how large of a company I wanted to work for. I had only worked for small companies (<100 SWEs), though I had a few years of exposure to what engineering work at Facebook was like through my consulting there. I did a lot of research into which would be best for me and wanted to share some of my findings here.

Different sizes for different times in your career

Different sizes yield different experiences. For a large company, you'll likely end up focused on a very narrow subject matter and learning that to much greater depth. For a smaller company, you'll likely get much more breadth of exposure but likely won't learn any of the technologies with as much depth. So if you're just starting out in your career and you go to a smaller company, you'll have a lot more you can put on your resume, but might not be able to answer more complex questions about those technologies. The same applies to role: if you want opportunities to get outside your programming comfort zone and dabble in project management, user experience, business strategy, leadership, or management, you're much more likely to find that in a startup. I've dabbled in all of these and it was incredibly valuable experience. I would recommend it even if you want to stay in engineering.

The other major difference between small and large companies is the compensation. Benefits and salary are usually much higher at large companies, especially for senior engineers. It's common to see senior engineers at large tech companies making $400K+ total annual compensation (salary + bonus + equity). That same group would be lucky to make half of that at a small company. This discrepancy is much less significant as a junior level engineer. Sources like levels.fyi are helpful for comparisons here.

I've experienced many company sizes, starting from freelancing and gradually increasing to large companies as I progressed in my career. I think this gave me the best of both worlds: near the beginning, I got a wide breadth of experience and individual freedom to experiment with different roles without missing out on too much compensation. I also got much quicker promotions than I would have if I had gone for a large company immediately. As a result, I was able to progress very quickly to senior engineer at a large company.

Freelancing

Freelancing is a great way to start your career. You have freedom to explore any technology you want, and can do so on your own schedule. However, it can be stressful if you are relying on this income to pay the bills. If you are going to do freelancing, and need the income in the short term, I would recommend doing it as a side job, not as a primary source of income, as the revenue stream is often unreliable. I started freelancing when I was 13 and that was a great learning experience, but it didn't pay very well.

Tiny startup (<10 FTEs)

Whether you're starting your own or joining someone else's startup, this is unlikely to pay well, if at all. If you don't need the money, or have the time to do this as a side job, this can be extremely valuable experience even if the startup fails. My greatest experiences have come from failed business ideas that I invested significant time in. This taught me to optimize for speed and business value above long-term maintainability. Long-term maintainability won't matter if the business is dead in a few years, which is the most likely case with startups. In large companies, there's more nuance to this but it's very valuable to have felt the pain of a failed business, or the satisfaction of a successful one. I recommend having at least one failed, and ideally one semi-successful, startup under your belt by the time you make it to senior engineer. It's a great talking point in interviews; hiring managers appreciate initiative, flexibility, and willingness to talk about failures that you've learned from.

Medium sized startups (10-100 SWEs)

These companies will sometimes pay competitive salaries, but the other benefits rarely compare to large companies. The equity is a lottery: it could be worth nothing or millions - don't have high expectations. This is generally a good middle-ground for mid-level engineers or very recently senior engineers. You're much more likely to get opportunities to experience new roles/technologies than at a large company, but will be compensated less. This is probably the best place to be getting experience and promotions as a junior or mid-level engineer.

Large companies (100-1000 SWEs)

These companies often provide the best compensation for top talent (strong senior ICs, EMs etc.) - sometimes even better than mega (FAANG size) companies. That may be counter-intuitive, but the mega companies have strict compensation bands that require director-level approval to move outside of. It's very rare to see mega size companies hiring above senior level (staff, manager, etc.). Companies in this range have a bit more flexibility to out-bid the mega companies on top talent. The equity compensation here can be incredibly valuable if the company grows quickly. Also, these companies are more quick to give promotions than mega companies due to rapid growth and less bureaucracy, especially above senior level (staff/EM).

This range is where communication often starts to become a more critical skill for engineers. You'll start to spend a lot more of your time interacting with other engineers or non-engineers, especially if you are more senior. This range is also where bureaucracy starts to become a limiter on speed, especially in highly regulated industries.

This range is also where companies need to start balancing long-term maintainability against speed of development, so you may end up spending significant time cleaning up old tech debt. At this point things become a lot more "software engineering" and a lot less "programming." Senior engineers here will regularly be asking themselves questions like: how expensive will it be to maintain this system? How difficult will it be to replace this system when it becomes legacy? Is this change creating tighter or looser coupling against other teams? These are interesting challenges but do slow down development. However, you may still have very significant user impact due to the larger number of users.

Mega companies (1000+ SWEs)

Here, you have potential to have very significant user impact if you're lucky enough to be working on a top company project. However, most end up working on some very narrow area, perhaps switching teams if they need a breath of fresh air. The compensation here is very good across the board, but promotions and new experiences are significantly harder to come by. A top tech company of this size (e.g. FAANG) is unbeatable on the resume since the hiring standards are so high - after this you'll have an easier time getting in anywhere else. Bureaucracy here can be a significant burden: want to change the color of a button? Be ready to fill out a form for approval, chat with a few different teams, and run a multi-week A/B experiment to test the results.

Consulting

An honorable mention here is the possibility of working for a small consulting company that services larger companies. This is what I did for Codazen for 3 years, where I was tech lead on some very high visibility Facebook projects including the launch of the Oversight Board and Portal. This was invaluable experience for me: I had lots of new responsibilities while having high impact. I would recommend Codazen as a good place to find a balance of small company growth opportunities with large company impact.

My choice

I ended up receiving senior engineer offers from Facebook and Upstart, and a maybe from Google after the onsite. I did not wait to hear whether I got an offer from Google because the recruiter told me it was going to be weeks and I really liked Upstart. Additionally, Google is not remote and it's very hard to get promoted there. I chose Upstart because the interview process was very compelling, the company mission of credit based on true risk is important to me, and the compensation was very competitive - better than Facebook/Google.

Conclusion

Everything here is a generalization, there are extreme cases in any of these categories. For example, Facebook has a very "move fast and break things" approach with less bureaucracy than most similar companies. Some general questions which helped me to pin down my top choice: will you be happier being laser focused on one area and slowly moving the needle there, or would you rather have unclear scope and potentially affect results across the entire company? Do you want to try your hand at different roles/technologies, or stick to the ones you've already learned? Can you sacrifice a little compensation now for much more later? Do you want to have a chance to have impact on millions/billions of users, or would a definite impact on thousands be enough? There's a gradient on all of these aspects between different sized companies. Overall, I'm very happy with my choice to start with small companies and gradually increase target company size as I grew in my career.

Comments

Popular posts from this blog

Crossing the Rubycon

The many benefits of working in small increments

Building up tests via context and let in Ruby