- วิศวกรคอมไพเลอร์ คือ สายงานวิศวกรรมซอฟต์แวร์ ที่ไม่ได้ออกแบบภาษาโปรแกรมขึ้นมาโดยตรง แต่ทำให้ภาษาที่มีอยู่ทำงานได้เร็วและมีประสิทธิภาพมากขึ้น
- งานสายนี้มีอยู่เพียงส่วนน้อยมากเมื่อเทียบกับตำแหน่งวิศวกรซอฟต์แวร์ทั้งหมด และ มีอุปสรรคในการเข้าสู่วงการสูงพร้อมทั้งความต้องการที่จำกัด
- บริษัทที่รับสมัครมีหลากหลายทั้ง สตาร์ตอัป บริษัทเทคขนาดใหญ่ แวดวงวิชาการ ภาคการเงิน และโครงการโอเพนซอร์ส แต่ส่วนใหญ่ยังคงเน้นผู้มีประสบการณ์
- ในการสัมภาษณ์มักประเมินเรื่อง การเขียนอัลกอริทึมด้วย C++, การออกแบบภาษา, การเพิ่มประสิทธิภาพคอมไพเลอร์, และความรู้ด้านระบบระดับล่าง เป็นหลัก
- การเตรียมตัวด้วยคอร์สจาก MIT และแหล่งเรียนรู้โอเพนซอร์ส รวมถึง การสร้างเครือข่ายอย่างต่อเนื่องและการขอ referral คือกุญแจสำคัญสู่ความสำเร็จในการหางาน
วิศวกรคอมไพเลอร์คืออะไร
- คอมไพเลอร์คือ เครื่องมือซอฟต์แวร์ ที่แปลงโค้ดซึ่งเขียนด้วยภาษาโปรแกรมหนึ่งไปเป็นอีกภาษาหนึ่ง
- วิศวกรคอมไพเลอร์รับผิดชอบ การทำให้ภาษาเหล่านี้ใช้งานได้จริงและการเพิ่มประสิทธิภาพ
- บทบาทนี้ไม่ค่อยเน้นการออกแบบภาษาใหม่ แต่เน้นทำให้ภาษาที่มีอยู่รันได้มีประสิทธิภาพมากขึ้น
- ผู้เขียนบทความทำงานที่บริษัทเทคขนาดใหญ่ในเขตอ่าวซานฟรานซิสโก โดยรับผิดชอบด้าน การเพิ่มประสิทธิภาพของภาษาโปรแกรม
เหตุผลที่เขียนบทความนี้
- เนื่องจากข้อมูลออนไลน์เกี่ยวกับการหางานในสายคอมไพเลอร์มีน้อยมาก จึงเขียนขึ้นเพื่อเป็น คู่มือเชิงปฏิบัติสำหรับนักศึกษาจบใหม่และผู้เริ่มต้น
- แม้จะมีข้อมูลเกี่ยวกับแมชชีนเลิร์นนิงหรือฟูลสแตกมากมาย แต่ คอนเทนต์เกี่ยวกับคอมไพเลอร์ยังขาดแคลน
- ผู้เขียนแบ่งปันประสบการณ์ที่กว่าจะได้งานต้องลองผิดลองถูกอยู่ราว 1 ปี
สรุปเส้นทางอาชีพส่วนตัว
- จบจาก MIT ในปี 2023 ด้วย ปริญญาคู่ด้านคณิตศาสตร์และวิทยาการคอมพิวเตอร์
- หลังหยุดเรียนปริญญาโทสายวิจัย ได้ไปทำงานที่สตาร์ตอัปในนิวยอร์กเมื่อปี 2024 เพื่อทำ งานขยายภาษาโอเพนซอร์ส
- จากนั้นย้ายไปทำงานต่อที่บริษัทเทคจดทะเบียนในตลาดหลักทรัพย์ที่ซานฟรานซิสโก
ที่ไหนบ้างที่จ้างวิศวกรคอมไพเลอร์
- จาก Indeed คำว่า “software engineer” มี 116,000 ตำแหน่ง ขณะที่ “compiler engineer” มีเพียงราว 400 ตำแหน่ง
- สตาร์ตอัป: มีโอกาสรับคนจบใหม่มากกว่า และผู้เขียนเองก็เริ่มงานแรกที่สตาร์ตอัป
- บริษัทเทคขนาดใหญ่: พบมากในบริษัทสายฮาร์ดแวร์และยานยนต์ เช่น Tesla, Waymo, Nvidia
- สำหรับบริษัทกลุ่ม FAANG ก็มีกรณีที่ได้เข้าทำงานผ่านการแปลงจากฝึกงานเป็นพนักงานประจำ
- แวดวงวิชาการ: โอกาสค่อนข้างจำกัดจากการลดลงของงบวิจัย
- บริษัทการเงินเชิงควอนต์: เช่น Jane Street, Five Rings ที่ต้องการทักษะด้านคอมพิวติ้งสมรรถนะสูง
- โครงการโอเพนซอร์ส: มีบางสตาร์ตอัปที่เปิดรับคนทำงานด้านนี้
กลยุทธ์เรซูเม่และการสร้างเครือข่าย
- referral คือแนวทางที่ได้ผลที่สุด
- ขอการแนะนำจากคนรู้จักหรือคนรู้จักของคนรู้จัก
- ผู้เขียนระบุความสนใจไว้ในโปรไฟล์โซเชียลว่า "Rona likes compilers" เพื่อเปิดโอกาสด้านการสร้างเครือข่าย และก็เชื่อมไปถึงการสัมภาษณ์จริงได้
- ภูมิหลังส่วนตัว เช่น การมีสัญชาติอเมริกันและวุฒิจาก MIT ก็ช่วยให้ได้เปรียบ
รูปแบบการสัมภาษณ์
- อัลกอริทึมสไตล์ LeetCode: โจทย์ whiteboarding ด้านโครงสร้างข้อมูล เช่น BFS, priority queue โดยส่วนใหญ่ใช้ C++
- การออกแบบภาษา: เขียน ไวยากรณ์ (grammar) ของภาษาง่าย ๆ ภายใต้ข้อจำกัดที่กำหนด
- คำถามเกี่ยวกับภาษาโปรแกรม: เช่น ชอบภาษาโปรแกรมใดและเพราะอะไร
- ตัวแทนระดับกลาง (IR): การตีความและแปลง x86 assembly รวมถึงโจทย์ที่อิงกับ MLIR
- optimization pass: ในโจทย์ MLIR มีการเขียน algebraic simplification optimization pass รวมถึงทำ pass สำหรับ constant propagation และ dead code elimination
- พื้นฐานคอมไพเลอร์: อธิบายองค์ประกอบของคอมไพเลอร์ เทคนิคการเพิ่มประสิทธิภาพ และความต่างระหว่าง static กับ dynamic compiler
- ทฤษฎีกราฟ: มีคำถามเกี่ยวกับการแทนคอมไพเลอร์แบบอิงกราฟ เช่น control flow graph และ register allocation (ได้รับอิทธิพลจากหัวข้อวิทยานิพนธ์ระดับปริญญาตรีของผู้เขียน)
- หัวข้อระบบระดับล่าง: เช่น deadlock, race condition, special-purpose register, instruction pipeline, memory allocation, การแทนค่าแบบไบนารีและการคำนวณ, garbage collection
- คำถามเชิงพฤติกรรม: เช่น “ทำไมถึงอยากทำงานด้านคอมไพเลอร์” ที่เน้นแรงจูงใจเป็นหลัก
กระบวนการเตรียมสัมภาษณ์
- เรียนเป็นหลักจาก MIT OCW
- Computation Structures: pipeline, assembly, การคำนวณแบบไบนารี และแนวคิดระดับล่างอื่น ๆ
- Computer Language Engineering: ประสบการณ์กับ C++ และโค้ดเบสขนาดใหญ่
- Performance Engineering: เน้นการเพิ่มประสิทธิภาพ และมีบทบาทสำคัญมากต่อการได้งานปัจจุบัน
- Theory of Computation: ช่วยให้เข้าใจการออกแบบไวยากรณ์ของภาษา
- ยังอ้างอิงการเรียนด้วยตนเองจาก Advanced Compilers ของ Cornell ด้วย
สิ่งที่ควรปรับปรุงและบทเรียนที่ได้
- ไม่มีเมนเทอร์: ทำให้ตระหนักว่าจำเป็นต้องสร้างเครือข่ายผ่าน LinkedIn
- หนังสือเฉพาะทาง (Engineering a Compiler, Dragon Book) มีประโยชน์สำหรับทบทวนแนวคิด แต่มีข้อจำกัดเมื่อใช้เตรียมสัมภาษณ์จริง
- ไม่ได้จดคำถามสัมภาษณ์ไว้: การไม่บันทึกคำถามหลังสัมภาษณ์เพื่อกลับมาทบทวนถือเป็นความผิดพลาด
- มีส่วนร่วมกับโอเพนซอร์สน้อยเกินไป: เคยดูโปรเจกต์อย่าง Carbon, Mojo แต่ไม่ได้มีส่วนร่วมจริง ทั้งที่โอเพนซอร์ส มีประโยชน์มากต่อการเรียนรู้และการสร้างเครือข่าย
เหตุผลที่เลือกสายคอมไพเลอร์
- เดิมเคยคิดจะเรียนต่อปริญญาเอกคณิตศาสตร์ แต่หลังเข้าร่วมโครงการวิจัยภาคฤดูร้อน REU ก็พบว่าต้องการ งานที่สร้างผลกระทบได้ทันทีมากกว่า จึงเพิ่มวิชาเอกวิทยาการคอมพิวเตอร์ควบคู่เข้าไป
- รู้สึกหลงใหลใน ความคล้ายกันระหว่างการคิดเชิงทฤษฎีกับการเขียนโปรแกรมระดับล่าง
- การเขียนโปรแกรมระดับล่างมีเสน่ห์ตรงที่ ให้ความรู้สึกเหมือนสร้างโลกทั้งใบขึ้นมาจากหลักการพื้นฐาน คล้ายคณิตศาสตร์
- เมื่อเทียบกับลักษณะเชิงประจักษ์ของแมชชีนเลิร์นนิง ผู้เขียนชอบ แนวทางที่เหมือนสร้างจักรวาลทั้งใบจากสัจพจน์ มากกว่า
- ที่ MIT มี ผู้คนในคอมมูนิตีคอมไพเลอร์จำนวนมากที่ผู้เขียนชอบ และเพราะสายนี้มีทั้งเงินและชื่อเสียงน้อยกว่าสาขาอื่น จึงอาจต้องมี ความเป็นมาโซคิสม์เล็กน้อย
ตลาดงานสายเทคและคำแนะนำ
- เพื่อนของผู้เขียนในโอเรกอน (เช่น Oregon State และมหาวิทยาลัยรัฐที่ไม่ได้มีชื่อเสียงมาก) สมัครงานเป็นร้อยตำแหน่งแต่ได้สัมภาษณ์เพียงราว 4 ครั้ง
- ใช้ทรัพยากรที่มีให้เต็มที่และสร้างความแตกต่าง: เข้าร่วมคอมมูนิตีโอเพนซอร์ส ใช้โซเชียลมีเดีย และใช้ทรัพยากรของมหาวิทยาลัยให้เป็นประโยชน์ (แม้จะเป็นชมรมที่ไม่มีใครมา ก็ลองเริ่มเอง)
- พบปะกันตัวต่อตัว: เช่น เข้าร่วมกลุ่มอ่านหนังสือด้านระบบ (มีการกล่าวถึงกลุ่ม systems ในนิวยอร์กของ Eric)
- ยังคิดจริงจังถึงการเริ่มช่อง YouTube เกี่ยวกับคอมไพเลอร์ด้วย (แม้จะรู้สึกเขินหน้ากล้อง)
- สิ่งเหล่านี้ ไม่ได้การันตีว่าจะได้งานโดยตรง แต่ช่วยเพิ่มโอกาสให้มากขึ้น
บทสรุปและประสบการณ์ส่วนตัว
- ก่อนเข้าสตาร์ตอัปในปี 2024 ผู้เขียนไม่มีประสบการณ์ในอุตสาหกรรมที่เกี่ยวกับคอมไพเลอร์มาก่อน
- ในกระบวนการสมัครงานปี 2025 ยังเคยสมัครตำแหน่งที่ ค่าจ้างรายชั่วโมงต่ำ ด้วย แต่โอกาสตกไปอยู่กับผู้สมัครระดับปริญญาเอก
- หลังสัมภาษณ์หลายสิบครั้งตลอด 10 เดือน ในที่สุดก็ได้งาน และตอนนี้กำลังโฟกัสกับการ ปรับปรุงประสิทธิภาพของโปรแกรมในระดับมิลลิวินาที
- ผู้เขียนชวนให้คนในสายคอมไพเลอร์ติดต่อเข้ามา พร้อมกล่าวถึง การเริ่มต้นใหม่ในย่าน Palo Alto
- ปิดท้ายด้วยการแชร์ข่าวการออกนวนิยายของตัวเองชื่อ 『You Had Me at Hello World』
2 ความคิดเห็น
เมื่อเทียบกับสายงานอื่นแล้ว เงินและชื่อเสียงน้อยกว่า เลยต้องมีความเป็นมาโซคิสม์อยู่นิดหน่อย
หืมม
ความคิดเห็นจาก Hacker News
ถ้าใครสนใจคอมไพเลอร์ ขอแนะนำให้เริ่มมีส่วนร่วมกับโปรเจ็กต์ ClangBuiltLinux หรือ issue tracker ของ LLVM
ดูได้จาก รายการอีชชู Linux kernel with LLVM และ
รายการ good first issue ของ LLVM
รู้สึกว่าประเด็นของบทความออกแนวโปรโมตตัวเอง
แต่ถ้าอยากเป็น วิศวกรคอมไพเลอร์ จริง ๆ หัวใจสำคัญคือการลองสร้างคอมไพเลอร์ด้วยตัวเอง
การเข้าใจแนวคิดพื้นฐานอย่าง tokenizing, การสร้าง AST, type checking, IR (Intermediate Representation) เป็นเรื่องสำคัญ
ขอแนะนำ LLVM tutorial
ไม่จำเป็นต้องเป็นอัจฉริยะระดับ MIT แค่เนื้อหาระดับวิชา CS หนึ่งเทอมก็พอเริ่มต้นได้
เพราะงานสายนี้มีน้อย หลายคนเลยย้ายไปสายอื่นอย่าง AI
น่าแปลกใจที่แม้จะจบจาก MIT ก็ยังหางานสาย วิศวกรรมคอมไพเลอร์ ได้ไม่ง่าย
วงการนี้แคบกว่าที่คิด และดูเหมือนเป็น ตลาดที่เน้นคนซีเนียร์ มากกว่าระดับเริ่มต้น
ตอนฟองสบู่ดอตคอมแตกปี 2001 ก็หางานยาก แต่ตอนนี้ก็ดูหนักไปอีกแบบ
และก็มีผู้สมัครจำนวนมากที่ความรู้ด้าน system programming ยังไม่พอ
ถึงเธรดจะแตกไปหลายทาง แต่ขอสรุปรายชื่อที่ที่จ้างวิศวกรคอมไพเลอร์
มี AMD, Nvidia, Intel, Apple, Google, Jane Street, Bloomberg, Qualcomm, Modular, AWS, ARM เป็นต้น
ข้อมูลเพิ่มเติมดูได้ที่ รายการ CompilerJobs
ในความเป็นจริงคือ จำนวนผู้สมัครมากกว่าจำนวนงานอย่างมาก
การมีส่วนร่วมกับโปรเจ็กต์อย่าง LLVM, Rust, Swift, Carbon คือเส้นทางเข้าวงการที่เป็นจริงที่สุด
แหล่งอ้างอิง: PL Resources,
How to Learn Compilers (LLVM Edition),
ช่อง YouTube Compilers
รู้สึกว่าชื่อหนังสือ “You Had Me At Hello World” ที่เธอพูดถึงน่ารักมาก
ตกใจที่อยู่ ๆ มีประโยคว่า “นี่คือรูปของฉัน” โผล่มากลางบทความ
ย้อนกลับไปยุค 80 เคยฝันอยากเป็น วิศวกรคอมไพเลอร์ ถึงขั้นเรียนปริญญาโทและตีพิมพ์งานเรื่อง LR parsing
แต่ตอนนั้นก็แทบไม่มีงานอยู่แล้ว เลยประคองตัวด้วยการอ่านซอร์สของ PCC กับ GCC
หลังจากนั้นก็ย้ายไปทำ GUI development และหลังจาก Java/Swing ออกมา โอกาสในสายนั้นมีมากกว่ามาก
กลับสงสัยมากกว่าว่าเธอได้สัญญาหนังสือเปิดตัวกับ Simon & Schuster ตั้งแต่อายุยี่สิบต้น ๆ ได้อย่างไร
ประโยคที่ว่า “กำลังคิดอยู่ว่าจะทำช่อง YouTube เรื่องคอมไพเลอร์ดีไหม” ฟังดูน่าประทับใจ
คิดว่าแค่จัดระเบียบเนื้อหายาก ๆ ลงบล็อกก็มีคุณค่ามากพอแล้ว
เหมือนกับว่าถ้าอยากเป็นช่างซ่อมรถ ก็ต้องสร้างรถเองและถ่ายวิดีโอตอนขับให้ดูด้วย
บังเอิญมาอ่านโพสต์นี้ก่อนสัมภาษณ์งานคอมไพเลอร์พอดีเลยรู้สึกขอบคุณมาก
ตอนนี้กำลังเรียนจาก Crafting Interpreters(ลิงก์) และเพิ่งตระหนักได้ว่า interpreter กับ compiler ไม่เหมือนกัน
แม้ก่อนสัมภาษณ์จะไม่มีเวลาแล้ว แต่หลังจากนั้นตั้งใจจะค่อย ๆ อ่าน หนังสือ interpreter ที่เขียนด้วย Go(ลิงก์) และเอกสารเทคนิคที่ Rona แนะนำ
ช่วยให้เข้าใจอัลกอริทึมฝั่ง backend ได้มาก Dragon Book ก็อ้างอิงได้เหมือนกัน แต่ข้ามส่วน parsing ไปก็ได้