In my free time, I find myself reading a lot of technology-related blogs, articles, and essays. It’s interesting to hear the perspectives of engineers and VCs who have their pulse on the technology industry. I’ve also read some great career advice, and I will feature four of these articles and essays in this post.
Patrick McKenzie – Don’t Call Yourself A Programmer (2011)
This essay is one of the most influential essays that I’ve ever read about career advice for software engineers. It is a must read for computer science majors looking to break into the tech industry. Here are a couple of takeaways that I found important.
Software solves business problems
Software often solves business problems despite being soul-crushingly boring and of minimal technical complexity.
The majority of software engineering work exists to solve business problems. Sometimes these problems are interesting from a technical perspective, but most often, they are not. Patrick gives the example of an expense reporting tool for internal company use. It might be only a simple CRUD app, but it might be worth developing, especially if it decreases costs or increases revenue by a lot.
Don’t call yourself a programmer
[D]escribe yourself by what you have accomplished for previously employers vis-a-vis increasing revenues or reducing costs. If you have not had the opportunity to do this yet, describe things which suggest you have the ability to increase revenue or reduce costs, or ideas to do so.
This is the #1 rule for writing a résumé, aside from keeping it to one page. On a related note, don’t obsess too much over title; you can always make a good case for yourself if you have made good impact in your work and you properly showcase it.
Also, calling yourself a “coder”, “programmer”, or (God forbid) a “code monkey” demeans yourself and the profession of software engineering. A lot of people can code; even typing
echo Hello World into the terminal can make you a programmer. But what separates mere programmers from professional software engineers the ability to work with others on a codebase, plan future releases and features, and understand unfamiliar tools and systems—things that help a company decrease costs or increase revenue. (This is a recurring theme in this essay.) Remember, there is so much more to software engineering than just writing code.
You are not defined by your chosen software stack
I consider myself a Pythonista, but I rarely introduce myself as such because it really doesn’t matter. What matters is that I can reason about a codebase and make meaningful contributions as part of a team, which is related to increasing revenue or decreasing costs.
One year ago, I didn’t know Ruby. Then, I accepted a summer internship offer from Stripe, which uses Ruby to power its backend. I learned how to write idiomatic Ruby code in quick order over the summer. It didn’t matter that I didn’t know how to iterate through a list in Ruby; what mattered was that I had the previous work experience on my résumé, which got me the interviews, which I generally did well on.
So if you describe yourself as a “Java/.NET/Node.js/$LANGUAGE_OR_FRAMEWORK developer/specialist/guru/$COOL_NOUN” on your résumé, please change that. You shouldn’t be married to a specific stack; it will cut you off from a lot of opportunities.
Your most important professional skill is communication
You should be able explain what you do and your past accomplishments effectively to anybody regardless of their technical knowledge. Failing to do so will cost you job opportunities and hamper your effectiveness as a software engineer.
Communication is a skill. Practice it: you will get better. One key sub-skill is being able to quickly, concisely, and confidently explain how you create value to someone who is not an expert in your field and who does not have a priori reasons to love you. If when you attempt to do this technical buzzwords keep coming up (“Reduced 99th percentile query times by 200 ms by optimizing indexes on…”), take them out and try again. You should be able to explain what you do to a bright 8 year old, the CFO of your company, or a programmer in a different specialty, at whatever the appropriate level of abstraction is.
Work to live, don’t live to work
Your happiness should not be determined by your career. Landing that dream internship or job might mean a lot right now, but your priorities change in the future. Life is so much more than getting a good job. Have some hobbies, explore new places, hang out with friends and family. Those activities will actually make you happy.
Joel Spolsky – Advice For Computer Science College Students (2005)
Even though this article was written in 2005, I think it is still pretty relevant a decade later as solid advice for students in computer science. However, I would like to add a few things.
Learning C is important, but not that important
I agree with Joel that C is important, but I think he is overstating its actual importance for today’s computer science students, which is understandable since his advice is more than a decade old. I believe that any solid computer science curricula should include at least one semester of low-level systems programming that requires students to code in C. At UIUC, this course was CS 241. It taught me the concepts of memory management, concurrency, and networking, and exposed me to working in a UNIX environment. All of this is indeed valuable to learn. However, these are topics related to programming in C, and can apply to higher-level languages, too.
I understand the gist of what Joel intends with this piece of advice. But contrary to what he implies, mastery of the C programming language isn’t absolutely essential for many software engineering jobs.
GPA is important, but not that important
In the article, Joel wrote: “Don’t blow off non-CS classes just because they’re boring […] Never underestimate how big of a deal your GPA is.” I don’t think that’s the most relevant advice for college students today. The common advice today is that a GPA above a 3.0 will not raise any red flags for many tech companies. Personally, I have been just fine getting interviews and offers with a 3.1-3.2 GPA for the majority of my college career. Instead, I focused on maximizing my learning through taking tough classes and doing personal projects, even at a modest expense of my GPA. Recruiters and interviewers today recognize that GPA is not the best indicator for predicting software engineering ability; instead previous work/internship experience and personal projects are better indicators.
Summer internships aren’t the only good work experience
Joel’s advice for students is that “[n]o matter what you do, get a good summer internship.” I would also add that doing interesting research or TA’ing a computer science class is as good as doing a summer internship.
Today, many universities offer research opportunities for undergrads (also known as REUs); I know of many classmates at UIUC who have done or are doing research for various professors and at the National Center for Supercomputing Applications. Also, working as TA for a core computer science class shows that you understand the material well enough to teach it to students (see “Your most important professional skill is communication” above).
Finally, you aren’t restricted to working or doing research in the summer. Many REUs and TA positions that allow for part-time work during the school year. So with this many options, you don’t have to “fall behind” on work experience if you don’t get a good summer internship.
2 by 22 – You Cannot Afford To Be Average (2017)
2 by 22 is a relatively new blog that focuses on how to navigate the recruitment process and land an internship or job at top tech companies. This is something that I wish existed in my freshman or sophomore year, and I highly recommend reading and following it.
My favorite post from 2 by 22 is “You Cannot Afford To Be Average.” You always hear about the average salary for each school or each major. When these studies compare these average salaries to student debt, they conclude, or lead you to conclude, that college is a bad investment.
But those figures don’t tell the entire picture. They assume that you, and everyone else, are average—that what you get paid in the first job out of college is purely a function of what university you attended and what major you studied.
However, this doesn’t account for the vast variance in salaries of new grad jobs. According to a study done by Michigan State University, the average compensation for electrical engineering, considered a more renumerative major, is $62k; and the high-end compensation for English, considered a less renumerative major, is $63k. And the ranges in compensation for some majors span over $100k!
Furthermore, thinking of yourself as merely average or deserving only of an average salary is harmful. You would always make excuses for your career dissatisfaction: “If only I attended Harvard/Stanford/MIT/$ELITE_SCHOOL. If only I had majored in computer science. If only I did an internship at Google/Facebook/Microsoft/$FAMOUS_TECH_COMPANY my freshman year. Oh well, nobody in my position does that well. I guess I’m doing okay for myself.”
The truth is that a job with high-end compensation is entirely within your reach if you change your approach toward career development and self-improvement. Students who earn above-average salaries have taken the time to learn and master skills that are in demand, and eventually develop rare and valuable skills that can be exchanged for even better compensation and even more autonomy and control. You, too, can set yourself apart from the average, even in a competitive tech industry.
Julia Evans – Questions I’m Asking In Interviews (2013)
Have you ever been at a loss for words when your interviewer asks you, “Do you have any more questions?” Do you find yourself asking common and uninsightful questions like “What is the culture like?” to recruiters? Then, this article is a must read for you!
Keep in mind that some questions are more effective than others in different contexts. For example, you probably wouldn’t ask your recruiter questions about the engineering practices; instead you’d ask your interviewer about that after 45 minutes of answering medium/hard Leetcode questions. I recommend everyone who’s looking for an internship or new grad job to look over these questions and pick a couple that you think would be useful. Ask your recruiters and interviewers these questions, and you will stand out from the crowds of applicants who ask the same, generic questions.