← All questions

From the Archives

answered May 26

I wanted to reach out and ask what makes a good/successful software engineer, both in terms of your opinion and perhaps what you notice the industry tends to value. 

I feel that school has taught me some things about computer science, but really nothing at all about software engineering, and I really struggled to adapt during my internship. My manager's main feedback to me was that I was not at the expected level of technical proficiency and recommended that I work on some open-source projects to gain experience.

I tried that for a bit but I didn't feel like I could glean any insights on things like why the code was written in any particular way, and the maintainers seemed pretty stretched thin and weary about having to deal with first time contributors who may be using AI for the entire PR (which I was not doing). I'm not sure if this is part of a larger trend across open source or if I was just unlucky in picking my first project, but it's made me feel hesitant to try open source again for now, especially now as I wonder if I even have sufficient skills to be contributing to open source. 

My internship project revolved around getting the company's AI to automate my actual project of performing some API migrations. I think that I made the significant mistake of offloading certain tasks such as ramping up to the codebase and debugging build errors to the AI, which only gave me a weak foundation to reason about the changes I was making later on. I also felt that the presence of the tool itself gave the expectation to my manager and mentor that I would be much faster at making changes, and this coupled with my feeling overloaded with information surrounding the project and not recognizing it seemed to contribute greatly to me struggling. 

I'm not trying to shift blame here - I acknowledge that someone more skilled than me probably wouldn't have done as poorly, and I did not have those skills. I felt that I struggled to understand the internals of the microservice I was working on, and that the team was so busy that getting help often felt difficult. The main thing is, I can't tell if I was really just that bad at software engineering, or if maybe the expectations were artificially inflated by the presence of an AI tool that didn't actually work that well, and also the problems caused by me being overly dependent on it. Or maybe something else I didn't think about. 

But regardless, the only thing I can work on is improving my own skills, so I wanted to ask (alongside the original question of what do you think makes a good engineer) if you have any resources or recommendations for how I can learn fundamental software engineering skills/patterns and debugging skills as well. And also any other advice that you might have. 

Philip

Sorry to hear the internship didn't go as well as possible. Here are a variety of thoughts.

First, the only way to grow is to:

  1. Know what you need to grow

  2. Put work into growing

  3. Learn from the right people how best to grow, or figure it out yourself.

Knowing what you need to grow is about asking for feedback effectively and internalizing that feedback. It sounds like you have a fairly good idea what can improve. You now need to dedicate effort to growing. The open source projects were a good example of trying, but I don't know how much time you put into it. You need to put a lot of time into these things to become noticeably better; otherwise, the improvements are too small to notice.

The best people to grow from are usually directly from your workplace. Are you still at the internship? If so, seize the opportunity to find one or two senior engineers, or you manager, to ask their advice on how best to grow. They'll also be able to give concrete feedback on your PRs so that you can improve specific things.

Most open source projects have maintainers that never get back to you. I had a 4-year PR open on Firebase which the maintainer just punted two weeks ago because, in the past four years, they moved past the feature I helped them fix. I think it's hard to get traction on those projects. Much better to build something with a strong peer of yours and learn together. Or do https://adventofcode.com. Do every year, every problem. You will get much faster as you learn which architectures work and which ones don't. Do not use any AI at all to help you code those solutions. There's no substitute for generating a bunch of code by hand in order to improve how you code.

If you're not in the internship anymore, get feedback much sooner next time during the internship so that you can make adjustments quickly. I recommend asking for feedback weekly for the first month, and then maybe every other week.

There's not an easy way to get better at these things than to put real time into it, and to learn from the best people. Why don't you work on this past year's Advent of Code and LMK how far you get in a week or so?

Want a private 1:1 answer from Philip Su? Ask on Reach.VIP