成为编译器工程师
Becoming a Compiler Engineer

原始链接: https://rona.substack.com/p/becoming-a-compiler-engineer

## 闯入编译器工程:一位应届毕业生的经历 在经历了一段艰难的求职后,作者于2024年8月在旧金山湾区获得了一份编译器工程师的工作。编译器工程师是将代码在编程语言之间转换的人——他们是*实现*,而非*创造*这些语言。 鉴于缺乏面向有志于成为编译器工程师的人员的可访问信息,本文详细介绍了作者的道路并提供了建议。 作者是2023年麻省理工学院的毕业生(数学与计算机科学),通过硕士项目、纽约一家初创公司的职位,以及现在一家大型科技公司获得了经验。他们强调进入该领域的难度——职位较少且技能门槛较高——但也强调了潜在的雇主:初创公司、大型科技公司(尤其是汽车和硬件)、学术界,甚至量化金融领域。 成功取决于推荐和人脉。作者强调积极寻求推荐,即使人脉有限。面试涵盖LeetCode风格的问题(用C++)、语言设计、中间表示、优化、编译器基础以及低级系统概念。像麻省理工学院的计算结构和性能工程这样的课程将有益于准备。 最终,作者发现编译器具有吸引力,因为它们具有低级、基础的特性以及优化性能的挑战。他们鼓励有志于成为工程师的人们要足智多谋,参与开源项目,并在艰难的就业市场中坚持不懈。 **(附注:作者的首部小说《Hello World即刻倾心》,一部以黑客马拉松为背景的青少年浪漫小说,将于11月11日出版!)**

## 成为编译器工程师:总结 这次Hacker News讨论围绕一篇关于如何成为编译器工程师的文章展开。虽然这个领域小众且竞争激烈,但在大型科技公司(AMD、Nvidia、Intel、Apple、Google、Jane Street、Bloomberg)和较小的公司(Qualcomm、Modular、ARM)都存在机会。提供了一个有用的职位列表资源:[https://mgaudet.github.io/CompilerJobs/](https://mgaudet.github.io/CompilerJobs/)。 普遍认为,实践经验至关重要——大学课程通常不足以胜任。强烈建议参与到成熟的项目中,例如LLVM(或相关的Carbon、Swift和Rust),而对GNU GCC的经验需求较少。 对话强调了开源贡献和在LLVM聚会中建立人脉的重要性。尽管有兴趣,一些评论员指出即使拥有强大的资历,也很难进入这个领域。关于LLM的作用存在争论,一些人预测它们会通过提升主流语言的能力*减少*对新编译器的需求,而另一些人则认为LLM将*增加*对专业编译器和DSL的需求。最后,有人指出编译器工程吸引的是独特的人群,并且对正确性的强烈兴趣至关重要。
相关文章

原文

In August, after many months of job hunting, I finally started a new role in the San Francisco Bay Area as a compiler engineer. It’s wild, I have dental insurance now.

What is a compiler engineer, anyway?

I imagine the audience of this post is both “people who want a job in compilers” and “people who are curious about my life”, so for those in the latter category: Wikipedia says that “a compiler is software that translates computer code written in one programming language into another language.” Basically, I’m a software engineer who works on programming languages. I don’t make programming languages—there is an entire theoretical subfield for that, and it is very cool; I implement them, which requires less math.

If you’re in the latter category, most of the technical details in this post will probably be boring and irrelevant to you, so you can skip to the end where I talk more about why I do compilers, what my life is like these days, etc.

(By the way, my debut novel from Simon & Schuster is out on November 11th. It’s a young adult romance set at a hackathon. You can preorder it here.)

Why this post exists

When preparing for compiler interviews, I discovered there was very little information online about how to break into this niche as a new or recent grad. There were plenty of YouTube videos on machine learning/full-stack/a newfangled thing called “AI Engineer”, but nobody was talking about compilers, and maybe somebody less delusional would’ve taken that as a sign to switch subfields, but alas, I happen to be delusional, so instead I fumbled around in the dark for the better part of a year and eventually landed a job.

So maybe this post can help other people who are interested in compilers. Or maybe they will read all of this and decide this is so not worth the effort, which I guess is also a way of helping them.

A little about me

In 2023, I graduated from MIT with a double major in math and computer science. Then I began a fifth-year research-based master’s degree, where I was in a compilers lab group. I dropped out after that fall, but sadly cannot claim any cool “MIT dropout” cred because it was grad school. From June to October 2024, I was a compiler engineer at a startup in New York City. In that role, I worked on extending a preexisting open-source programming language.

I am now a compiler engineer at a large, post-IPO tech company in the San Francisco Bay Area. I work on making programming languages run faster.

Who even hires junior-level compiler engineers?

According to Indeed, there are 116,000 job postings for “software engineer” and only 400 job postings for “compiler engineer”. It’s brutal out here.


Compiler engineering roles are relatively rare due to limited demand (most companies don’t build their own compilers, and once a compiler is built, the work is mostly maintenance and optimization) and high barrier to entry. In the past year, I interviewed for twenty-ish opportunities.

Here are the different types of places that might hire a compiler engineer:

  • Startups: In my experience, startups are more amenable to hiring new grads for this position. My first role was at a startup, after all. Startups sometimes post their listings online; I had LinkedIn and Glassdoor alerts for the “compiler” keyword. Getting to unsubscribe from those alerts . . . that was a beautiful moment.

  • Larger tech companies: Automotive companies (Tesla, Waymo) have compiler positions, as well as hardware companies (Nvidia). While I do know junior compiler engineers at FAANG companies, they got those jobs by converting an internship into a full-time offer; they applied for “software engineering” and got placed on a compiler-specific team due to their skill set and interests.

  • Academia: Well, I was speaking to a professor who was hiring for his lab, and it would’ve been a cool chance to work on high-performance computing, but the opportunity disappeared after federal funding cuts. Oof.

  • Quant finance: I did not interview at any of these companies (I wanted to stay in the Bay Area, and these opportunities are predominantly in New York City and Chicago), but some of my classmates ended up at companies like Jane Street or Five Rings due to their interests in high-performance computing and low-level systems.

  • Open-source projects: I interviewed at one startup that makes an open-source library, but it wasn’t a good fit for my skills.

Okay, but how do you get these people to look at your resume?

If you are reading this because you’re a recent grad or graduating soon, there are many factors that are likely out of your control now, like your educational institution, your previous internship experience, whether you happen to be related to the CEO of a Fortune 500 tech company, etc.

But referrals help a lot! I ask plenty of people for referrals, even if we aren’t that close. I ask my friends if they know anybody at [insert company name] and if that person can refer me. I try to find a referral for every single job I apply to.

I also tell everyone that I like compilers (I even made my Twitter name “Rona likes compilers”, which got me an interview) because if they later hear about someone hiring for that role, they might think of me.

But of course, I am super-lucky in a lot of ways. I am an American citizen and don’t need visa sponsorship. My school name probably opens doors. I can’t pretend otherwise, that it was all because I hustled so hard and got so many referrals!

Later, I’ll talk more about the brutal job market and how one can stand out without a preexisting network.

What are the interviews like?

During my recruiting process, this is the #1 question I wished somebody online could’ve answered. Instead, this is what I found:

Yeah, the Internet was not very helpful.

So hello, fellow desperate interviewee who stumbled upon this post while searching “what is on a compiler interview” or “what is on a compiler interview reddit” or “is it too late to change careers?”

Here are the types of interview questions I got:

  • Leetcode-style data structures and algorithms whiteboarding: I heard that tech recruiting was moving beyond these types of questions, but surprisingly, many still focused on implementing breadth-first search or a priority queue. Unlike typical software engineering interviews, I was expected to solve everything in C++.

  • Language design principles: One of the most interesting final-round questions I got was to invent a simple programming language with specific constraints. I had to write a grammar, ensuring that it was unambiguous.

  • Programming languages: I never got anything too deep (nothing about formal verification, for example) but was definitely asked “What is your favorite programming language and why” in multiple interviews. Turns out, if you say brainfuck, you will not get the job. Oops.

  • Intermediate representation: I had multiple interviews where I was expected to read x86 assembly (or a pseudo version of it) and optimize or translate it into another language. I also had a take-home assignment that was in MLIR.

  • Optimization passes: The aforementioned MLIR take-home assignment wanted me to write an optimization pass for algebraic simplification; other interviews asked me to write optimization passes for constant propagation and dead code elimination.

  • Compiler fundamentals: I was asked to explain the different parts of a compiler, different compiler optimizations, static vs. dynamic compilers, etc.

  • Graph theory: This might’ve been due to my resume (I wrote a graph theory paper in undergrad), but I got some questions about graph-based representations in compilers, like control flow graphs and register allocation.

  • Other low-level topics: I was asked about deadlock, race conditions, special-purpose registers, instruction pipelines, memory allocation, binary representation and binary arithmetic, garbage collection, probably other things I’m forgetting right now.

  • Behavioral: The main question lobbed was “why do you want to do compilers” (which maybe you’re also wondering after reading this list); I’ll answer that later.

How do I prepare for all that?

I mostly have my MIT education to thank, which is probably an annoying answer for everybody who didn’t go there, but luckily, OCW has these classes available online for free!

The classes that were most helpful:

  • Computation Structures, which I also TA’d during my master’s program. Taught me many low-level fundamentals like pipelining, assembly, binary arithmetic.

  • Dynamic Computer Language Engineering, which does not seem to be available online, but its static counterpart is here. I took this class before I had taken the introductory programming course at MIT and that was like putting on your shoes before your socks, except if your shoes were also on fire. However, it taught me C++, what a compiler was, how to work with a huge codebase, and that mixing Red Bull and coffee while pulling an all-nighter is not the brightest idea.

  • Performance Engineering taught me the lion’s share of the above list and is the main reason I got my current position. Fun coincidence: for one of the jobs I interviewed for, they ended up going with somebody else—turns out the successful candidate was one of my project partners from this class.

  • Theory of Computation was not as helpful—it is a math course—but it helped me with that final round where I had to write my own grammar. It’s great for getting you to think about what a programming language needs to achieve on a mathematical level.

I also went through Cornell’s Advanced Compilers course, which was quite fun but perhaps a tad heavy-duty for the purpose of interviewing.

Things I would’ve done differently

  • I didn’t have a mentor in this space; I probably should’ve done more LinkedIn outreach to find people who had the jobs I wanted.

  • As part of my prep, I read several books, like Engineering a Compiler by Keith D. Cooper and Linda Torczon and the famous Dragon Book (Compilers: Principles, Techniques, and Tools). They were engaging, but they provided high-level overviews that I already knew, so weren’t that helpful for someone who had already taken the classes mentioned above.

  • I didn’t write down the interview questions I got, mostly because interviews are like a black hole for me and once they’re over I want to throw away my brain. That’s pretty silly, though. I should’ve recorded the questions I got, so I could go back and review.

  • I’m not involved in any open-source projects, but they seem like a fantastic way of learning more about this field and also meeting people with shared interests. I did look into Carbon and Mojo but didn’t end up making contributions.

Okay, so why compilers?

Here is the answer I give when an interviewer asks me so why do you want to work on compilers:

I was initially a math major, and I thought I wanted to do a math PhD. I went to an REU (a summer research program for undergrads) and wrote a paper. But I decided academia isn’t for me—I wanted to do something that felt more immediately impactful, so I added computer science as my second major.

When I started studying computer science, I was really attracted to low-level programming because, like math, it felt like reinventing the whole world from first principles. Here are these axioms. You can use them to build the whole universe. In contrast, I didn’t love the empirical nature of machine learning.

That’s my interview-ready answer. But I think I stumbled upon compilers with some serendipity, too. There was the foundational Computation Structures course, where I spent a lot of time going to office hours because my friends happened to be there, and where I spent a lot of time grinding on the final design project (which required low-level optimization) because my friends and I were good-naturedly competing with each other. There was the fact that, at MIT, this niche had a lot of people whom I liked. After all, you have to be a little masochistic to study compilers when other subfields have way more money and prestige.

And while this isn’t a post about my writing life (did I mention my novel is out on November 11th?), I’ve also wondered if my brain just really likes managing large systems with many moving parts and many different skill requirements for those parts, which is important in writing both compilers and novels.

About that job market

Look, I know the tech job market is brutal right now. I lurk r/csmajors. Also, I grew up in Oregon, and my friends back home (who attended Oregon State or other public, non-target universities) have applied to hundreds of jobs only to get maybe four interviews.

So how the hell does anybody get a job?

This is general advice for non-compilers people, too: Be resourceful and stand out. Get involved in open-source communities, leverage social media, make use of your university resources if you are still in school (even if that means starting a club that nobody attends, at least that demonstrates you’re trying). Meet people. There are reading groups (my friend Eric runs a systems group in NYC; I used to go all the time when it was held in Cambridge). I was seriously considering starting a compilers YouTube channel even though I’m awkward in front of the camera.

I don’t know if this will get you a job. But it’ll certainly improve your chances.

Good luck!

Before the startup I worked at in 2024, I didn’t have any industry experience in compilers. My internships were all full-stack web development. I got pretty lucky that my first full-time job took a chance on me, and even though it didn’t work out with them, I’m really grateful.

During my 2025 recruiting cycle, I applied to a compiler position that paid $28/hr (yes, far above California’s minimum wage, but below market rate for a software engineer) but required C++ experience, knowledge of deep-learning, and LLVM fundamentals. And then, after making it to the final round, I didn’t even get that job. It went to a PhD student.

Also, at one point, I made it to the final round for a position in Shanghai, and I was truly considering moving to China even though my Mandarin ability means I would only be able to fluently converse with five-year-olds.

It took a long time—ten months and so many interviews—but I did end up landing a job as a compiler engineer. Now I spend all day thinking about how to make programs run milliseconds faster. It’s awesome.

Also, if you work in compilers, please say hi! My email is rona at mit dot edu.

(I also recently moved to Palo Alto and don’t know many people here, so if you’re in the area, let’s be friends!)

Okay, shameless plug one last time: my debut novel from Simon & Schuster is out November 11th. It’s titled You Had Me at Hello World. You can get it here.

I’ll end with an excerpt from said book, coding-related to match the theme of this post:

联系我们 contact @ memedata.com