I graduated in December 2023, which turned out to be a tough time to graduate as a software engineer. At the time, I felt like I had done everything you were supposed to do: graduated with honors from a reputable university, had 2 internships under my belt, and had a successful senior project to show.
But amidst the shift in the economy and the software engineering job market in the wake of the COVID pandemic, it proved to be more difficult than I hoped to land a job. After my 2nd internship ended in August, I patiently waited for a job offer that never came. And as fall rolled around, I learned from a call to my team manager that they didn’t have allocation to extend full-time offers to me nor most of the other interns on my team, which was a first for them in years.
In total, it took me about four months to finally land a job, after over a hundred applications and only 2 interviews. I still felt like one of the lucky ones. A year on, it’s remained difficult for entry-level job seekers as the market continues to be very tight and competitive.
I’ve been wanting to write a post about my experience for a while, both to share what worked for me, and how I would do things differently if I could do it again. I’m getting close to the one-year mark in my first role as a software engineer, and I’ve learned a lot about what is actually valuable in a software engineer candidate compared to what I thought when I graduated, along with some strategies that have proven to be important when looking for work in a tough job market.
So if you’re thinking about starting a CS degree, or are already working through one, I hope this helps you prioritize what’s truly important to focus on while you’re in school, and helps you in forming a strategy to achieve your goals.
Success in engineering school is all about strategy and prioritization. As an engineering student, you are presented with a huge amount of information to learn in an impossibly short amount of time, paired with pressure and expectation to retain it.
But unless you have unlimited, exclusive time and resources to focus on school, you just can’t, and won’t, retain it all.
On top of that, if your goal is to get a job, you have the additional responsibility of owning your job search in this critical time, which is really a full-time job in itself.
So, we must prioritize our time and resources if we want to get something out of this experience. The hard part is knowing what exactly to prioritize, and what not to.
The principles that follow represent some of the values I think a CS student would do well to strive for in forming a strategy for getting the most out of a CS Degree.
The people you meet are probably the most valuable resource you gain from a CS degree. Make it your priority to surround yourself with the best engineers you can find.
You’ll meet a lot of very smart people in a CS program. But remember that raw technical prowess/math skills alone aren’t the mark of a great engineer.
Great engineers are the ones who are focused on building things, helping others, and are the best communicators. Usually, they’re the ones who aren’t too focused on grades or school performance. They’re probably also the ones who spend their free time building side-projects, have internships, or are already working as freelance developers.
Professors are another great resource, specifically for mentorship/advice. Make a point to seek out those with industry experience. Meet with them 1-1, and ask for advice and feedback on your work/personal projects.
If your goal is to get a job, these are the people you want as the foundation of your professional network. You will definitely need them!
Side note: Do everything you can to get into the best school possible. If you’re not accepted at first, ask their recruiters if they would allow you to transfer after taking classes at a smaller community college. Going to a school with a good reputation for Computer Science will give you a better chance of meeting like-minded engineers, a strong alumni network, and a significant advantage finding a job in a tough market.
There is a concept called multiplicative value, and essentially states that something with multiplicative value pays dividends over the long term, providing a positive feedback loop into other value creating sources. One good example is having a polished and refined resume. By making your resume bulletproof, you increase your chances of landing a job by a certain percentage for each job you apply to. Another is having a strong, healthy network - by making friends with other engineers, you open up pathways to employment in the future as everyone’s network grows.
As a college student, you must budget your time carefully. This means prioritizing the things that are most relevant to you and your goals, and accepting that you won’t be able to excel in everything that’s expected of you.
List out all the things you need to do to reach your goals, and prioritize them based on which ones provide the most multiplicative value. If your goal is to get a job, this includes things like building projects, formulating your technical specialty, networking, attaining real-world experience, and building up your portfolio. Pick which ones are the most important and where you are lacking the most, and set goals which enable them (check out OKRs and SMART Goal Framework).
The institution will reward academic excellence, and they will do everything to convince you that it’s in your best interest to prioritize that above everything. But the reality is, unless you are interested in pursuing masters or doctorate level research at a very reputable university or a career in academia, grades don’t matter all that much. Companies are much more interested in where you got your degree than your GPA.
If your goal is to get a job, you have to prioritize networking and real-world experience.
That doesn’t mean you should neglect academics, but you have to keep the temptation to obsess over it at bay - or run the risk of it taking up all your resources. For most Math/CS subjects, you’ll probably only encounter the most relevant 20% in your career, and may never encounter the other 80%. Don’t go overboard trying to master difficult concepts - there’s a good chance you’ll never see it again.
In very difficult courses, get used to finding the threshold of the minimum amount of work which produces the maximum result. Use systems to succeed - flash cards, group study, tutoring, etc. Focus your efforts on the first exam. It’s usually the easiest, and gives you breathing room for the rest of the class. Don’t pay attention to pressure from professors - it’s ok to just get by with a passing grade.
All this being said - remember that a CS curriculum is additive. Neglecting your fundamentals will lead to a snowball effect as you progress. It doesn’t matter what kind of software engineering you end up doing, the topics of programming paradigms, math, logic, and DS&A will form the foundation of your skill-set as an engineer. Remember that the greatest multiplicative-value act you can do is finish the degree. Take ownership of this, and make sure you are on track.
Finally, you’ll likely have the opportunity to take very interesting courses. If you are very interested in a class, plan ahead and give yourself extra time/space that semester to really dive in. If it’s a difficult technical course, you will definitely need as much as you can get.
A CS degree provides you with breadth of knowledge. You will study a little bit of every part of the discipline. While this is certainly valuable, it comes at the cost of depth, which can be frustrating if you really value knowing things deeply.
But the actual value of a CS degree doesn’t come from this breadth of knowledge. The true value comes from your proven ability to pick up and absorb hard concepts quickly.
Doing this for 4 years is akin to an olympic training regime, day-in, day-out. You become a super-athlete at picking up difficult technical concepts.
Focus on training this mental muscle - and remember that this exercise is the where the value of what you are doing is gained. Learning things quickly is all about the systems and process which you employ. You’ll notice some common traits of the best software engineers - they all have detailed notes systems, and they all ask the right clarifying questions.
If you take the time to master this, you’ll notice that when you do get your first job, you’ll be able to get up to speed quickly, will be resilient to changes in technology, will be an excellent communicator of difficult technical concepts, and will be totally comfortable solving problems in uncharted territory. This is because you spent the last four years doing those things constantly. These are the skills you really want to refine while you’re here, and will make you a very strong candidate when it comes time to interview.
Side note: Take advantage of cross-disciplinary classes, especially business communication, entrepreneurship, and economics classes. These are arguably even more valuable than many of the core curriculum classes you’ll take, as they show you how to communicate to busy people (like recruiters), how to explain technical concepts to non-technical people, and how to measure and translate the work you do in terms of business value.
Start building projects as soon as you can, outside of class. Build a portfolio website as soon as you can. Start building your resume right away. Start applying for internships right away. Always be refining your portfolio, and update it regularly. Anything is better than nothing - don’t be afraid of looking like a beginner.
You can assume that you will refine your portfolio many times, after many failures and rejections, over the course of your entire career. This is why it’s so important to start early - if failure is inevitable to attain success, let yourself fail early - when pressure is lower.
Do everything you can to gain real-world experience. This is the hardest thing to get, and simultaneously, the most valuable. The reality is that a computer science program alone isn’t enough to give you the skills you actually need to get a job as a software engineer. You just can’t understand what you really need to know as a software engineer until you actually do it. Don’t hesitate to take on work for free, offer to help others with their projects, and ask professors for research opportunities.
An internship should be your first goal. Always go to the career fair. This is how I got my first internship, yet it always amazed me how many people neglected to go, for no reason at all. Approach it with the mindset of being able to meet someone working in the field you want to join, and ask them about their work. Prove that you are resilient, tell them your story, and focus on what makes you different. And if you get passed over - ask for feedback! Get used to being open to refining your approach - you will do this for the rest of your career.
The absolute most important asset you gain from going to college is the friends you make. This goes beyond Principle 1, and more broadly applies to your relationships in life, rather than work.
Going to college is a unique opportunity to go through a very difficult, rewarding experience with other people who have similar interests and aspirations to you. For this reason, many of the people you meet here will likely become lifelong friends.
Take the opportunity to meet as many people as you can. Join clubs, explore your interests, ask everyone questions. If you can, live on campus for at least a year - it’s worth it.
Have fun, but don’t let yourself be distracted by people who only want to party. Balance is key. Share your goals with your friends, and ask them to hold you accountable to them. Don’t be afraid to let go of people who don’t respect your commitment to your goals.
Take care of the people in your corner. Ask them how they’re doing, and if you can help. Remember who helped you along the way. Make sure your friends know that you appreciate them.
By nurturing your friendships, you won’t need to worry about if ‘success’ will come or not. You’ll have a whole team of people behind you invested in your success.
If I could go back and do it again, I would have focused much more of my efforts on starting to build my portfolio and seek real-world experience as soon as possible, finding the best engineers around me, and nurturing my network, instead of focusing so much on academic performance.
In many cases, success is the result of luck. When I got my internship, it was because I connected with the hiring manager over our past experience studying jazz. And the reason why I got my job offer was because I had a personal recommendation from a teammate in my senior design group, who had been working there as an intern for over a year.
But remember that while luck is chance, it’s also proportional to both how often you show up and the size/quality of your network. That’s why it’s so important to spend the time in CS school meeting and working with as many people as you can. People who are very successful may seem to be experts in ‘making their own luck’, but they would probably describe it as trying, and failing, a whole lot more than the average person.
As an engineering student, remember you are at high risk of burnout. There will probably be (many) times where you will need to make sacrifices to your quality of sleep, personal fulfillment, relationships, and time off in order to fulfill your responsibilities.
If you are struggling, leverage your support network. Some of the most important resources for me were my school’s CAPS office (Counseling and Psychological Services), my class TA, the professors themselves, and the CS/Math department’s tutoring services. Remember - burnout, sleep deprivation, and personal neglect are all a form of debt. Keep a close eye on it, know you have help, take the time you need, and be your own biggest advocate.