The market is tough these days - just look at all the CS doomsday posts on Reddit and the hundreds of other applicants ahead of you on LinkedIn. Landing a job can prove to be an uphill challenge, especially if you aren’t from a traditional CS background. In this post, I will share my journey of how I managed to secure three offers as a Frontend/Software Engineer (including one at a social media tech giant, which I eventually chose) despite not having a traditional computer science background.
My forays into coding and web development began when I first took the CS50 and CS50 Web courses by Harvard as enrichment modules in my first year in university (where I majored in Communications). After completing a few initial personal projects, I ventured into freelance work to further hone my skills. Following an internship and an assortment of more polished projects, I believed I was ready to start searching for a full-time job.
By The Numbers
Before starting to look for a full-time job, I would advise any non-CS applicant to begin by getting your feet wet. The grind doesn’t start when you prepare for interviews. It starts the moment you decide to take this path. Learn the basics (through courses and such), get some projects done – and be sure to finish them! After that, seek out exposure.
And by exposure, I mean both in the work sense (through internships/freelancing / contributing to open-source) and the networking sense (getting to know people from the industry, actual CS students, and other developers). Exposure is important because this is a big part of what I’m missing out on without a CS degree. I think I’ve been really blessed to know some really smart and talented people over the years, and they have helped me a ton in my journey.
Before diving straight into the grind, I went through a couple of online courses and books on algorithms and data structures (if you’re a beginner, I highly recommend
For anything front-end related, I used
I think as job-seekers, we’re incredibly fortunate to have such carefully curated resources like these at our fingertips. But sometimes, it can leave us stranded with the
Credibility (whether the people behind the source have the necessary credentials to be teaching others).
Organization (whether the platform/site is organized in a manner suitable for structured, disciplined learning)
GreatFrontEnd checked these two boxes, and I decided to use it as my main platform for learning. It was still essential to supplement my learning with complementary resources.
While working through the exercises on GreatFrontEnd, I became aware of specific areas in JavaScript where my understanding was lacking (such as promises, async-await, and various ES6 features). GFE’s structured exercises served as a mirror, reflecting to me the areas where I needed to improve.
To bridge these gaps, I engaged in focused and targeted study sessions. I scoured through documentation, online tutorials, and coding exercises, practicing extensively until I felt confident in each area. This wasn't just about solving problems; it was about understanding the ‘why’ and ‘how’ behind each solution.
I really wanted to study both backend and frontend system design (see the differences
Understanding the mechanics behind these interfaces often led to enlightening 'ohhhh' moments for me. I began my preparation with a foundational study of databases, delving into various types, from relational to NoSQL, and key concepts like indexing and sharding. This foundational knowledge served as the backbone for my next step: understanding the broader architecture of software systems. I immersed myself in overall system design, learning about component interactions, load balancing, caching, and microservices to grasp how all the pieces of a system fit cohesively.
With a solid understanding of general system design in place, I shifted my focus to frontend-specific design patterns, utilizing the resources provided by GreatFrontEnd. These materials guided me through topics such as rendering patterns in React, performance optimization, and accessibility best practices. To supplement my learning, I used sources like patterns.dev, which offered invaluable insights into front-end design patterns and best practices.
When time permitted, I tackled user interface questions on GreatFrontEnd to apply the concepts I had learned in a practical context. I did not manage to get much done here, but I read through many of the provided solutions.
These were some of the topics tested for me:
System Design (e.g., URL shortener, GraphQL and REST APIs)
Object-Oriented Programming (e.g., Todo list, Interface design)
Leetcode Mediums
Frontend Knowledge (e.g., JS utilities, React, Async JS programming, CSS, React hooks, Redux, Rendering patterns)
Practical Challenges (e.g., Design a 3D editor)
In my experience interviewing for frontend roles, Leetcode questions generally don’t appear past the first round. Frontend knowledge and mastery over JavaScript fundamentals proved to be the clinchers. Also, I do believe that questions will be more tailored toward your job scope. Suppose you’re applying for a role in the e-commerce team (i.e., if you’re applying for a role in an e-commerce team, you might expect more async JS questions). The three companies that I interviewed for had very different business objectives and scope, so I faced a wider variety of questions. Testing OOP principles was surprising to me, but it made a lot of sense as it serves to demonstrate your understanding of structured programming, design patterns, and how to effectively model and organize complex software systems.
Consistency is key. I think I put in around 8 hours on a good day and 3 hours on a bad day. It’s better to study a little every day than to cram all at once. Spaced repetition helps in retaining information.
Even if you’ve studied a topic thoroughly, go back and revise. Memory is fleeting, and regular revision helps to reinforce your knowledge.
Aim for Understanding, Not Memorization
Strive to deeply understand concepts instead of rote memorization. This understanding will shine through in your interviews and in your work.
Use all the resources at your fingertips. Whether it’s asking on Reddit/Discord/Github/Stack Overflow/ChatGPT, never be afraid to ask and look for help. I’m thankful for these resources at my disposal, for the help from the geniuses at GreatFrontEnd and a couple of awesome friends (and brother) who gave me mock interviews and curated feedback.
It’s important to recognize and admit what you don’t know. This is not only a sign of humility but is also crucial for your learning process. It also helps in interviews, where you can demonstrate self-awareness when asking questions and solving problems.
While it’s important to be humble and aware of your weaknesses, it’s equally important to be confident in your skills and the work you have done. Know your worth.
Who you meet, the type of interviewers you get, how successful your projects are, etc. – there’s a small element of luck in everything. Recognizing this allows me to not dwell too heavily on my setbacks and instead focus on the things that I can control to further improve my chances.
The last four points were especially important for me, as I struggle a lot with imposter syndrome. Benchmarking myself, my skills, and my projects against my peers and the wider industry, I find myself falling short every time. In this ever-changing field, what you know almost always feels like a speck of dust in an infinite universe. Yet, pushing through the doubts and putting in the work, I still managed to land multiple offers and a job package that I'm happy with in a tough market. If you’re someone looking to embark on the same path but intimidated by the uphill battle against the odds, I hope my journey can inspire you to push forward.