- Kỹ sư compiler là một lĩnh vực kỹ thuật phần mềm không trực tiếp thiết kế ngôn ngữ lập trình, mà làm cho các ngôn ngữ hiện có chạy nhanh hơn và hiệu quả hơn
- Vị trí này chỉ chiếm một phần cực nhỏ trong tổng số việc làm kỹ sư phần mềm, với rào cản gia nhập cao và nhu cầu hạn chế
- Các đơn vị tuyển dụng rất đa dạng, gồm startup, tập đoàn công nghệ lớn, học thuật, tài chính và dự án mã nguồn mở, nhưng phần lớn vẫn ưu tiên người đã có kinh nghiệm
- Trong phỏng vấn, các hạng mục được đánh giá trọng tâm gồm cài đặt thuật toán bằng C++, thiết kế ngôn ngữ, tối ưu hóa compiler và kiến thức hệ thống mức thấp
- Quá trình chuẩn bị bằng các bài giảng của MIT và tài liệu học mã nguồn mở, cùng với networking bền bỉ và referral, là chìa khóa để tìm việc thành công
Kỹ sư compiler là gì
- Compiler là công cụ phần mềm chuyển đổi mã được viết bằng một ngôn ngữ lập trình sang ngôn ngữ khác
- Kỹ sư compiler phụ trách hiện thực và tối ưu hóa các ngôn ngữ như vậy
- Thay vì thiết kế ngôn ngữ mới, vai trò này tập trung vào việc nâng cao hiệu quả thực thi của các ngôn ngữ hiện có
- Tác giả hiện phụ trách cải thiện hiệu năng ngôn ngữ lập trình tại một tập đoàn công nghệ lớn ở vùng Vịnh San Francisco
Lý do viết bài
- Do gần như không có thông tin trực tuyến về việc tìm việc trong lĩnh vực compiler, bài viết được viết để cung cấp hướng dẫn thực tế cho người mới và sinh viên mới tốt nghiệp
- Tài liệu về machine learning hay full-stack thì nhiều, nhưng nội dung về compiler lại rất thiếu
- Tác giả chia sẻ trải nghiệm tìm được việc sau khoảng 1 năm thử sai
Tóm tắt sự nghiệp cá nhân
- Tốt nghiệp MIT năm 2023 với bằng kép Toán học và Khoa học máy tính
- Sau khi dừng chương trình thạc sĩ thiên về nghiên cứu, năm 2024 tác giả làm tại một startup ở New York, phụ trách mở rộng một ngôn ngữ mã nguồn mở
- Sau đó chuyển sang một công ty công nghệ niêm yết tại San Francisco
Nơi tuyển kỹ sư compiler
- Theo Indeed, “software engineer” có 116.000 tin tuyển dụng, trong khi “compiler engineer” chỉ khoảng 400
- Startup: khả năng tuyển người mới cao hơn, và tác giả cũng bắt đầu công việc đầu tiên ở một startup
- Tập đoàn công nghệ lớn: tập trung nhiều ở các công ty phần cứng và ô tô như Tesla, Waymo, Nvidia
- Với các công ty FAANG, cũng có trường hợp vào làm thông qua chuyển đổi từ thực tập
- Học thuật: cơ hội bị hạn chế do nguồn tài trợ nghiên cứu giảm
- Công ty tài chính định lượng: như Jane Street, Five Rings, yêu cầu năng lực tính toán hiệu năng cao
- Dự án mã nguồn mở: một số startup có tuyển các vị trí liên quan
Chiến lược CV và networking
- Referral là cách tiếp cận hiệu quả nhất
- Nhờ người quen hoặc người quen của người quen giới thiệu
- Tác giả ghi rõ mối quan tâm trên hồ sơ SNS bằng câu “Rona likes compilers”, qua đó tạo cơ hội networking và thực tế đã dẫn đến phỏng vấn
- Nền tảng cá nhân (quốc tịch Mỹ, bằng MIT, v.v.) cũng là lợi thế
Các dạng phỏng vấn
- Thuật toán kiểu LeetCode: whiteboard về cấu trúc dữ liệu như BFS, priority queue, phần lớn dùng C++
- Thiết kế ngôn ngữ: viết grammar cho một ngôn ngữ đơn giản dưới các ràng buộc cụ thể
- Câu hỏi về ngôn ngữ lập trình: ngôn ngữ lập trình yêu thích và lý do
- Biểu diễn trung gian (IR): diễn giải và biến đổi assembly x86, bao gồm cả bài tập dựa trên MLIR
- Optimization pass: trong bài tập MLIR, viết algebraic simplification optimization pass, cài đặt constant propagation và dead code elimination pass
- Kiến thức cơ bản về compiler: các thành phần của compiler, kỹ thuật tối ưu hóa, giải thích compiler tĩnh vs động
- Lý thuyết đồ thị: câu hỏi về biểu diễn compiler dựa trên đồ thị như control flow graph, register allocation (chịu ảnh hưởng từ chủ đề luận văn đại học của tác giả)
- Chủ đề hệ thống mức thấp: deadlock, race condition, thanh ghi mục đích đặc biệt, instruction pipeline, cấp phát bộ nhớ, biểu diễn và phép toán nhị phân, garbage collection, v.v.
- Câu hỏi hành vi: tập trung vào động cơ như “Vì sao bạn muốn làm compiler”
Quá trình chuẩn bị phỏng vấn
- Học chủ yếu từ các bài giảng MIT OCW
- Computation Structures: pipeline, assembly, phép toán nhị phân và các khái niệm mức thấp khác
- Computer Language Engineering: kinh nghiệm với C++ và codebase quy mô lớn
- Performance Engineering: tập trung vào tối ưu hiệu năng, đóng vai trò quyết định trong việc vào công việc hiện tại
- Theory of Computation: giúp hiểu thiết kế grammar ngôn ngữ
- Tác giả cũng tham khảo lộ trình tự học Advanced Compilers của Cornell
Điểm có thể làm tốt hơn và bài học rút ra
- Thiếu mentor: nhận ra sự cần thiết của networking qua LinkedIn
- Sách chuyên ngành (Engineering a Compiler, Dragon Book) hữu ích cho việc ôn lại khái niệm nhưng có giới hạn khi chuẩn bị cho phỏng vấn thực tế
- Không ghi lại câu hỏi phỏng vấn: không ghi chép để ôn lại sau phỏng vấn là một sai lầm
- Tham gia mã nguồn mở chưa đủ: đã xem xét các dự án như Carbon, Mojo nhưng chưa thực sự đóng góp. Mã nguồn mở rất hiệu quả cho cả học tập lẫn networking
Lý do chọn compiler
- Tác giả từng cân nhắc học tiến sĩ Toán, nhưng sau chương trình nghiên cứu hè REU đã muốn làm công việc tạo tác động trực tiếp hơn, nên học thêm chuyên ngành Khoa học máy tính
- Bị cuốn hút bởi sự tương đồng giữa tư duy lý thuyết và lập trình mức thấp
- Lập trình mức thấp hấp dẫn vì mang lại cảm giác xây cả một thế giới từ những nguyên lý cơ bản, giống như toán học
- Khác với tính thực nghiệm của machine learning, tác giả thích cách tiếp cận xây dựng cả một vũ trụ từ các tiên đề
- Ở MIT có nhiều người trong cộng đồng compiler mà tác giả yêu mến, và vì lĩnh vực này ít tiền bạc, ít hào quang hơn các mảng khác nên cần một chút khuynh hướng masochistic
Thị trường việc làm công nghệ và lời khuyên
- Bạn bè của tác giả ở Oregon (như Oregon State và các trường công lập ít danh tiếng hơn) chỉ giành được khoảng 4 cuộc phỏng vấn dù nộp hàng trăm hồ sơ
- Tận dụng tối đa nguồn lực và tạo khác biệt: tham gia cộng đồng mã nguồn mở, dùng mạng xã hội, tận dụng tài nguyên đại học (kể cả tự lập câu lạc bộ không ai đến)
- Gặp gỡ trực tiếp: tham gia các nhóm đọc sách về systems, như nhóm systems ở New York của Eric
- Tác giả cũng nghiêm túc cân nhắc mở kênh YouTube về compiler (dù thấy ngượng trước máy quay)
- Những hoạt động này không đảm bảo có việc ngay, nhưng làm tăng xác suất có cơ hội
Kết luận và trải nghiệm cá nhân
- Trước khi vào startup năm 2024, tác giả chưa có kinh nghiệm công nghiệp nào liên quan đến compiler
- Trong quá trình tuyển dụng năm 2025, tác giả còn ứng tuyển cả các vị trí mức lương theo giờ thấp, nhưng cơ hội lại rơi vào tay ứng viên đang học tiến sĩ
- Sau 10 tháng và hàng chục cuộc phỏng vấn, cuối cùng tác giả đã tìm được việc, và hiện tập trung vào việc cải thiện hiệu năng chương trình ở cấp độ mili giây
- Tác giả kêu gọi mọi người trong ngành compiler liên hệ, đồng thời nhắc đến khởi đầu mới ở khu vực Palo Alto
- Cuối bài là thông báo phát hành tiểu thuyết 『You Had Me at Hello World』 của chính tác giả
2 bình luận
So với các lĩnh vực khác thì tiền bạc và danh tiếng ít hơn, nên có lẽ cần một chút thiên hướng khổ dâm
Ghê thật
Ý kiến Hacker News
Nếu ai quan tâm đến compiler, mình khuyên nên bắt đầu đóng góp cho dự án ClangBuiltLinux hoặc trình theo dõi issue của LLVM
Có thể tham khảo danh sách issue Linux kernel với LLVM và
danh sách good first issue của LLVM
Chủ đề của bài viết tạo cảm giác như để quảng bá cá nhân
Nhưng nếu thực sự muốn trở thành kỹ sư compiler, cốt lõi là tự tay làm một compiler
Điều quan trọng là nắm được các khái niệm cơ bản như tokenizing, xây dựng AST, type checking, IR (Intermediate Representation)
Mình khuyên đọc tutorial LLVM.
Không cần phải là thiên tài cỡ MIT, chỉ cần bắt đầu với lượng kiến thức tương đương một môn CS kéo dài một học kỳ là đủ
Vì việc làm liên quan khá khan hiếm nên nhiều người chuyển sang các lĩnh vực khác như AI
Mình khá bất ngờ khi thấy ngay cả người tốt nghiệp MIT cũng khó tìm việc trong mảng kỹ thuật compiler
Lĩnh vực này hẹp hơn tưởng tượng, và có vẻ là thị trường thiên về senior hơn là người mới vào nghề
Khi bong bóng dotcom vỡ năm 2001 thì tìm việc đã khó, nhưng tình hình hiện tại dường như còn khó theo một kiểu khác
Cũng có nhiều ứng viên thiếu kiến thức về lập trình hệ thống
Dù thread đã tản ra nhiều hướng, mình thử tổng hợp những nơi tuyển kỹ sư compiler
Có AMD, Nvidia, Intel, Apple, Google, Jane Street, Bloomberg, Qualcomm, Modular, AWS, ARM, v.v.
Có thể xem thêm thông tin tại danh sách CompilerJobs
Thực tế là số ứng viên nhiều hơn việc làm rất nhiều
Con đường vào ngành thực tế nhất là đóng góp cho các dự án như LLVM, Rust, Swift, Carbon
Tài liệu tham khảo: PL Resources,
How to Learn Compilers (LLVM Edition),
kênh YouTube Compilers
Mình thấy tiêu đề cuốn “You Had Me At Hello World” mà cô ấy nhắc đến quá dễ thương
Đang đọc giữa bài thì đột nhiên thấy câu “đây là ảnh của tôi”, khá bất ngờ
Vào thập niên 80, mình từng mơ làm kỹ sư compiler, lấy bằng thạc sĩ và còn xuất bản cả bài báo về LR parsing,
nhưng ngay cả khi đó việc làm cũng gần như không có. Mình cầm cự bằng cách đọc mã nguồn PCC và GCC,
rồi sau đó chuyển sang phát triển GUI, và từ khi Java/Swing xuất hiện thì bên đó có nhiều cơ hội hơn hẳn
Điều khiến mình tò mò hơn là việc cô ấy ký được hợp đồng ra mắt với Simon & Schuster khi mới ngoài 20 tuổi
Câu “đang cân nhắc mở một kênh YouTube về compiler” làm mình ấn tượng
Có vẻ chỉ cần viết blog để sắp xếp các nội dung phức tạp thôi cũng đã đủ giá trị rồi
Cứ như thể muốn trở thành thợ sửa ô tô thì còn phải tự làm xe và quay video mình lái nó vậy
Mình tình cờ đọc được bài này ngay trước một buổi phỏng vấn về compiler nên rất cảm kích
Mình đang học bằng Crafting Interpreters(link),
và giờ mới nhận ra interpreter và compiler là hai thứ khác nhau
Tuy không còn nhiều thời gian trước buổi phỏng vấn, nhưng sau đó mình dự định sẽ học dần cuốn sách về interpreter viết bằng Go(link) cùng các tài liệu kỹ thuật mà Rona giới thiệu
rất hữu ích để hiểu các thuật toán backend. Dragon Book cũng đáng tham khảo, nhưng có thể bỏ qua phần parsing