How I Got a Job in Compilers
Intro
I won't sugarcoat it: getting a job in compilers was kinda rough. SWE jobs have already been getting more and more competitive with the advent of AI, but compiler engineering specifically has always been a bit elusive, especially for junior folks. Most of the already-few postings for such engineers are targeted at people with at least 3-5 YoE.
That being said, I did it, and many others like me have as well. As a matter of fact, a former classmate of mine, Rona Wang, wrote a similar article on her blog that you should check out! It goes into much more detail than I will about what compiler engineers do and even has some resources on how you can prepare.
This post will be much more personal. What I'll be recounting here is my journey from senior year of college, having taken just one compiler course, to now working full-time as a compiler engineer. At the end, I'll also try to link some resources I found helpful.
Graduating into the Workforce
In my final year of college, I was faced with the task that every graduating senior dreads: finding a job. If you graduated during the years 2022-2026, you know just how borked the job market was for CS majors. Many companies didn't extend return offers to students who'd interned for them. Some even rescinded offers!
For me, I had spent the last 3 summers interning at Google on various different teams. At the end of my last internship, I got extremely positive feedback, so it seemed likely I would be returning after graduation. However, upon following up in the fall, recruiters began saying that all interns were not guaranteed return offers and they wouldn't have concrete details until spring. This put me into a bit of a panic, so I began the interview circuit.
My First Job
The Offer
My first job out of college was in fact not at Google. It was at an AI cloud startup named Crusoe. During my panic-induced interviewing spree, I was approached by a recruiter from the company, learned more about what they were building, and became interested in working there. Eventually I was offered a role on their Compute team, working on the virtualization of HPC hardware and kernel development. I genuinely liked the mission of the company: trying to make AI data centers more sustainable. Before accepting, I reached out to my Google recruiter one last time hoping to leverage the offer into getting some concrete details about a return offer. They still had nothing, so the decision was pretty easy.
Working at Crusoe
I enjoyed my year working at Crusoe. Everyone there was super friendly, knowledgeable, and hardworking. I learned so much about operating large data centers and got to play work with very powerful computing clusters. I picked up a lot of soft/people skills along the way.
That being said, the day-to-day work wasn't fulfilling for me. At times, it felt like babysitting a bunch of GPUs. And while inherently what we worked on was "low-level," we were still a Go shop. I knew I wanted to be a low-level systems programmer moving forward, so it felt like I wasn't making progress toward that goal staying at Crusoe.
On the other hand, our customers were working on problems I thought were very cool! Their work centered on pushing the hardware to its limits. Operating these clusters for them inadvertently taught me a lot about the AI software/hardware stack, and I became interested in how the two are co-designed to help customers hit their goals.
The Job Hunt
How I Landed on Compilers
At that point, I had a direction: I wanted to work on SW/HW co-design. My skillset as a SWE obviously leaned more to the SW side, so I began looking at jobs on that end. Typical jobs in this category are:
- Kernel/Optimization Engineer
- Device Driver Engineer
- Infrastructure Engineer
- Compiler Engineer
I actually spent a good amount of time exploring each archetype, some deliberately and some by accident. I worked through Programming Massively Parallel Processors, I wrote some Linux device drivers, my year at Crusoe gave me AI infra experience, and I followed along with an advanced compiler course.
Some things I realized about myself:
- Spending hours squeezing ounces of performance out of kernels is simply not fun to me.
- Device drivers are cool, but hard to get into if you don't really have a device to drive.
- AI infra is just boring (sorry).
- Compilers are very neat.
Compilers stuck with me in a way the others didn't. I had taken a compiler class senior year, and I'm not great at algorithms, so it was cool to see how many other avenues there are for optimizing code. The ways you can improve the UX, ergonomics, and usability of languages through things like instrumentation and runtime features were also super interesting to me. So I set my sights on compilers, linkers, language support, that whole space.
Upskilling
Unfortunately, besides my one compiler class, I had zero compiler experience. I didn't even really know what compiler engineers did day to day or who was hiring them. I first started by surveying LinkedIn and the careers pages of popular companies to get a feel for what they were looking for. From that, I put together a study plan with a few categories:
- Computer Architecture
- Compiler Theory
- Compiler Infrastructure
- Performance Optimization
- ML Engineering
From there, starting in November 2024, I spent about 6 months going through online courses, contributing to open-source, working on various (unfinished) side projects, and, of course, LeetCoding. The projects were mostly where I covered the compiler theory and infrastructure gaps, since that's where my knowledge was basically zero:
- slinky: a from-scratch ELF linker written in Rust
- llvm-golf: a playground for writing custom LLVM passes (opcode counters, call counters, a hand-rolled LICM pass, etc.)
- skylark: a from-scratch hardware accelerator designed in Verilog, with plans to build a compiler targeting it
- neo: a hand-written compiler for a custom C-like language, with a full frontend, a custom IR, and an in-progress ARM64 backend
I also made a few open-source contributions, which helped on the architecture and infrastructure side:
- cloud-hypervisor: documented how to set up a RISC-V dev environment using QEMU, since physical boards are basically impossible to get your hands on
- zig: ported
strcasecmpandstrncasecmpfrom musl C to native Zig, as part of their broader effort to migrate libc string functions away from musl - nicegraf: a handful of contributions to a cross-platform low-level graphics library (MSAA resolve support on the Metal backend, a scratch allocator refactor, some CMake and naming convention cleanup)
A quick aside:
While interviewing, I was faced with several ghostings and rejections without interviews. I was feeling very discouraged and lowkey was at my wit's end. At this point, I took a bit of a leap of faith and reached out to @FelixCLC_ on Twitter. He worked at Tenstorrent at the time and that was the epitome of what HW/SW looked like to me, so I asked him if he had time to chat about breaking into that space. One of the pieces of advice he shared that stuck with me the most was that interviewers and engineers at startups like this genuinely want to see that you give a shit. He went on to say that contributing to FOSS is one of the best ways to show this: you went out of your way and dedicated time and resources to a project you care about such that others' lives can be better. From then on, I made it a point to prioritize FOSS work, both while interviewing and even after landing the job.
Interviewing
I started interviewing in January 2025 and didn't sign until June. I applied to 31 places total, with varying degrees of success and failure during the process. If you want to see all the roles I applied to (and their results) you can check out this spreadsheet. The worst parts were timed coding assessments. The most fun were take-home projects and design interviews.
Some notable things from my interviews:
- Out of all the things I worked on, I think
neowas the project that got me the most mileage. I learned a lot about implementing an optimizing compiler from scratch, and interviewers actually read through the code and asked me about it! - I got roasted by one of the creators of MLIR for not having tests on
neo. - I hate the Roblox cognitive assessment.
What Kinds of Things I Was Asked
- How to write compiler passes to do XYZ
- How would you instrument code to learn XYZ
- C++ internals
- Optimizing simple kernels
- How to use kubectl
- Some LeetCode mediums
- Behavioral questions on ethics, teamwork, and conflict resolution
Evaluating Offers
The highest priority things for me were:
- Work: I wanted to work on compilers immediately, not transition to them later.
- Location: I wanted to stay in CA and not drive toooo far.
- Pay: I wanted to be paid more than I was already making.
- WLB: I enjoy having a life.
- Size: I wanted something smaller than my previous startup or full on big tech, nothing really in between.
A lot of the places I ended processes with did not meet one or more of these criteria. What drew me to Efficient was a few things: they had a strong academic culture (the founders are professors at CMU and most of the founding team are PhDs), which appealed to me since I was also considering grad school at the time. They had also already taped out a chip during their seed round, which is incredibly uncommon for a chip startup. Beyond that, the team seemed very nice and into what they were doing, with healthy work-life boundaries across the board. After meeting the team in person, I signed my offer.
10 Months Later
It has now been 10 months since I started at Efficient, and I honestly think it might be my dream job. I get to work on all of the things I wanted to. Some notable, public projects I've worked on are:
- Designing and implementing a profiler for our E-class line of chips.
- Bolstering our C++ frontend and runtime support (
libc++,libc++abi, several STL headers, some third-party libraries). - Support for loop auto-vectorization.
- Refactoring our internal compiler diagnostics and options implementations to use TableGen.
- Fixing alignment and section loading in our RV32 linker scripts.
- ...and more!
The team and culture are great, and I feel a genuine sense of ownership over our product that I didn't think was possible. I've never been this close to C-suite before (I've had PR reviews from both our CEO and CTO, alongside multiple in-person and online chats), and I've never worked somewhere where they were still genuinely hands-on and technical. Inspires a lot of confidence. It is definitely hard work at times, and the commute is killer (SF to SJ, 3 days/week). But I am genuinely happy with my decision to join.
Conclusion
This post is largely anecdotal: I am not prescribing what I did as advice on what YOU should do; this is just me recounting my own experience. My main takeaways were:
- Startups are generally more willing to meet you where you're at if you don't have all the required skills.
- Interviewing is shifting away from just LeetCode (thank GOD).
- Work on FOSS projects if possible. It's the most direct way to show off your work!
- It might be the best time ever to be a compiler engineer (more HW startups = more compiler engineering roles).
- If offered the chance, you should meet your team in person before signing! I did this both with Crusoe and Efficient.
Resources
As promised, here is a grab-bag of resources I used during my process:
Computer Architecture
- All of: The RISC-V Reader
- All of the 2024 slides of: MIT 6.5930: Hardware Architecture for Deep Learning (link now points to 2026)
Compiler Theory
- Entire course of: CS 6120: Advanced Compilers
- All of: MLIR: A Compiler Infrastructure for the End of Moore's Law, Monza, and HDCC for a certain embedded chip startup
Compiler Infrastructure
- Chapter 1-8 of: My First Language Frontend with LLVM
- Chapter 1-8 of: Getting Started with LLVM Core Libraries
Performance Optimization
- Manuals 1-3 in: Agner Fog's Optimization Manuals
- All of: RipTide: A Programmable, Energy-Minimal Dataflow Compiler and Architecture
ML Engineering
- Chapter 00-02 of: Learn PyTorch
- Parts 0, 1, 2, and 10 of: How to Scale your Model