- กรณีศึกษาการนำ Rust มาใช้ของ Volvo: มีการใช้ Rust อย่างเงียบ ๆ ภายในองค์กรขนาดใหญ่มาก
- Julius Gustavsson รับบทเป็นสถาปนิกซอฟต์แวร์หลักของ ECU (หน่วยควบคุมอิเล็กทรอนิกส์) สำหรับโปรเซสเซอร์พลังงานต่ำของ Volvo มาตั้งแต่ปี 2019
- ECU นี้รับผิดชอบการจัดการพลังงานของรถยนต์ในส่วนที่ใช้พลังงานต่ำ โดยแม้รถยนต์ไฟฟ้าจะมีแบตเตอรี่แรงดันสูงขนาดใหญ่ แต่ก็ยังคงมีระบบสายไฟ 12V แบบเดิมอยู่
- ECU มีหน้าที่ปลุกระบบไฟฟ้าเมื่อจำเป็น เช่น ต้องเปิดระบบเมื่อมีคนเดินเข้าใกล้รถ
- Julius รู้จัก Rust อยู่แล้วตั้งแต่ตอนเข้าทำงานที่ Volvo ในปี 2017 และมองเห็นศักยภาพในการแทนที่โค้ด C และ C++ เดิม
- โปรเซสเซอร์พลังงานต่ำเหมาะอย่างยิ่งกับการใช้ Rust เพราะไม่ได้ถูกจัดเป็นส่วนประกอบที่มีความสำคัญต่อความปลอดภัย และใช้โปรเซสเซอร์ ARM Cortex-M จึงไม่มีอุปสรรคทั้งทางเทคนิคหรือทางระบบราชการต่อการใช้ Rust
- ปัจจุบัน EX90 และ Polestar 3 ถูกผลิตบนสายการประกอบที่ไม่สามารถทำงานได้หากไม่มี Rust
เหตุผลที่เลือก Rust
- งานแรกของ Julius คือการสร้างซอฟต์แวร์ควบคุมการจราจรทางอากาศที่ใช้ Ada อย่างหนัก ซึ่งในเวลานั้นความเห็นร่วมกันในบริษัทคือ Ada ซับซ้อนเกินไปและเป็นเทคโนโลยีปิด
- หลังจากนั้นราว 15 ปี เขาใช้ C และ C++ แบบผสมกัน และพบว่าบั๊กด้านหน่วยความจำเป็นปัญหาอยู่เสมอในทุกบริษัท
- โค้ดเบสส่วนใหญ่อาศัยสภาพที่ไม่เปลี่ยนแปลงและสมมติฐานต่าง ๆ ที่ไม่ได้ถูกระบุไว้อย่างเป็นทางการ แต่ทุกคนต้องปฏิบัติตาม และเมื่อโครงการซับซ้อนขึ้นพร้อมกับทีมที่ใหญ่ขึ้น สุดท้ายก็เลี่ยงความล้มเหลวได้ยาก
- เขารู้จัก Rust ตั้งแต่ปี 2015 ก่อนการออกเวอร์ชัน 1.0 และเริ่มสนใจมากขึ้นหลังเปิดตัว ตอนเข้าทำงานที่ Volvo เขามีประสบการณ์กับมันอยู่บ้างในฐานะงานอดิเรก
- การเลือก Rust สำหรับโครงการ ECU ไม่ได้เกิดขึ้นอย่างฉับพลัน ระหว่างการทำต้นแบบ เขาลองสร้าง HAL ที่ทำงานร่วมกับ Android ด้วย Rust เพื่อควบคุมระบบ และทันทีที่คอมไพล์ผ่าน พัดลมก็เริ่มทำงาน ซึ่งสร้างความประทับใจอย่างมาก
ความคืบหน้า
- โครงการนี้ไม่เพียงเหมาะกับ Rust เพราะไม่ใช่ระบบที่มีความสำคัญต่อความปลอดภัยและรันบนฮาร์ดแวร์ทั่วไปเท่านั้น แต่ยังตรงไปตรงมาอย่างมากเพราะมีชุดความสามารถที่จำกัด
- ในปี 2020 หลังจากสร้าง proof of concept แรกด้วย C แล้ว ทีมก็เดินหน้าโครงการต่อด้วย Rust โดยต้องสื่อสารกับระบบอื่น ๆ ของรถผ่าน CAN และต้องติดตั้งระบบวินิจฉัยทั้งหมดรวมถึงพอร์ตโปรโตคอลมาตรฐานของ Volvo
- แม้ต้องเขียนสิ่งต่าง ๆ ขึ้นใหม่จำนวนมาก แต่ก็พบว่าเขาสร้างบั๊กน้อยกว่าเมื่อเทียบกับ C และ C++ อย่างมาก
- ในการประชุมประจำกับทีมอื่น Julius แทบไม่ค่อยหยิบยกปัญหาขึ้นมา และเมื่อแสดงผลงานให้ดู เพื่อนร่วมงานก็มักประทับใจ
จะแนะนำ Rust ให้คนอื่นหรือไม่?
- Rust เป็นตัวเลือกที่ยอดเยี่ยมสำหรับทุกโครงการที่มีข้อกำหนดด้านความน่าเชื่อถือและความพร้อมใช้งานที่เข้มงวดมาก และต้องการความมั่นใจว่าซอฟต์แวร์ที่ปล่อยใช้งานนั้นถูกต้องจริง
- ด้วย Cargo และเครื่องมืออื่น ๆ ที่มีอยู่ ประสบการณ์ตลอดทั้งวงจรการพัฒนาซอฟต์แวร์คุณภาพสูงจึงดีมาก
- เพราะเมื่อคอมไพล์ผ่านแล้วมันก็มักจะทำงานได้จริง คนอื่นจึงรับช่วงโค้ดและแก้ไขได้อย่างปลอดภัย ทำให้เหมาะกับทีมที่มีการเปลี่ยนคนบ่อย
- สำหรับการทำต้นแบบ อาจไม่ใช่ตัวเลือกที่ดีที่สุด เพราะคอมไพเลอร์บังคับให้ต้องจัดการกับ edge case และรายละเอียดต่าง ๆ มากขึ้น
- ตอนนี้น่าจะมาถึงจุดที่แทนที่จะถามว่า "เราจะใช้ Rust กับสิ่งนี้ได้ไหม?" ควรถามว่า "ทำไมเราถึงใช้ Rust กับสิ่งนี้ไม่ได้?" แล้วค่อยถกเถียงกัน
อะไรคือข้อบกพร่องที่เป็นอุปสรรค?
- การสร้างซอฟต์แวร์ที่ตอบโจทย์ข้อกำหนดได้อย่างเหมาะสมนั้นไม่ง่ายนัก ซึ่งหลัก ๆ เป็นปัญหาเรื่องเครื่องมือ
- ตัวอย่างเช่น การรัน unit test บน embedded target ทำได้ยาก รวมถึงยังมีความยากในเรื่อง code coverage, runtime profiling, software BOM และการติดตามไลเซนส์
- เครื่องมืออย่างโครงการ Knurling ช่วยได้มาก แต่ก็ยังมีหลายอย่างที่ต้องทำเอง
ต่อไปจะใช้ Rust อีกหรือไม่?
- ใช่ Julius สนับสนุนอย่างแข็งขันให้เลือก Rust ในโครงการอื่น ๆ ด้วย
- ดูเหมือนว่าจะมีความกระตือรือร้นต่อ Rust อยู่ทั่วทั้งหลายระดับภายในบริษัท
- ในการนำเสนอโครงการขั้นสุดท้าย มีฉันทามติร่วมกันในหมู่ผู้บริหารว่าควรสำรวจการใช้ Rust ในพื้นที่อื่น ๆ เพิ่มเติม
บทสรุป
- จนถึงตอนนี้ การใช้ Rust ที่ Volvo ดูจะประสบความสำเร็จอย่างมาก ผู้คนพึงพอใจ คุณภาพผลิตภัณฑ์สูง และบริษัทก็ดูพร้อมจะใช้ Rust มากขึ้นในอนาคต
- แม้ยังมีงานอีกมากที่ต้องทำ แต่เมื่อมีเครื่องมือที่เน้นความปลอดภัยอย่าง Ferrocene ให้ใช้งาน Rust ก็พร้อมสำหรับการใช้งานในอุตสาหกรรมยานยนต์มากกว่าที่เคย
ความเห็นของ GN⁺
- การพัฒนาซอฟต์แวร์ embedded ด้วย Rust มีข้อดีอย่างมากในด้าน memory safety และความน่าเชื่อถือ โดยเฉพาะในอุตสาหกรรมยานยนต์ที่ความปลอดภัยสำคัญ การนำ Rust มาใช้จึงน่าจะเร่งตัวขึ้น
- อย่างไรก็ตาม เมื่อพิจารณาจากเลกาซีจำนวนมหาศาลของ ecosystem C/C++ และฐานนักพัฒนาที่มีอยู่ การนำมาใช้แบบค่อยเป็นค่อยไปน่าจะเป็นจริงได้มากกว่าการเปลี่ยนทั้งหมดในครั้งเดียว การปรับปรุงการทำงานร่วมกันระหว่าง Rust กับ C/C++ จึงน่าจะเป็นโจทย์สำคัญ
- toolchain ของ Rust สำหรับงาน embedded ยังไม่สมบูรณ์แบบ แม้จะพัฒนาอย่างรวดเร็วด้วยแรงขับจากชุมชน แต่สำหรับความเสถียรและการสนับสนุนในระดับเชิงพาณิชย์ ก็ดูจำเป็นต้องมีการลงทุนและการมีส่วนร่วมจากภาคธุรกิจ
- แม้ยังมี learning curve เมื่อเทียบกับ C++ แต่ระบบ type ที่แข็งแกร่งและแนวคิด ownership ของ Rust จะช่วยยกระดับประสิทธิภาพการพัฒนาและคุณภาพโค้ดในระยะยาว จึงควรมีการลงทุนด้านการศึกษาและ onboarding ควบคู่กันไป
- เช่นเดียวกับกรณีของ Volvo การเริ่มใช้ Rust อย่างค่อยเป็นค่อยไปจากโครงการใหม่เป็นกลยุทธ์ที่ดี การเขียนใหม่บางส่วนของโค้ดเบสเดิมและการรวม Rust component เข้าไปน่าจะเป็นแนวทางที่เป็นจริง
4 ความคิดเห็น
ความเห็นที่ว่า "Ada ทั้งเข้าใจยากเกินไปและเป็นแบบปิดผูกขาด" นี่ค่อนข้างน่าแปลกใจนะครับ จากมุมของคนที่เคยใช้ทั้งคู่ในการทำงาน ผมกลับรู้สึกว่า C++ เข้าใจยากกว่า Ada มาก...
อย่างไรก็ดี ก็หวังว่าจะมีสภาพแวดล้อมการพัฒนา Rust ที่ "ผ่านการรับรอง" และสามารถใช้กับงาน Safety-Critical ได้ออกมาไว ๆ ตอนนี้ AdaCore ก็กำลังพยายามอยู่ ดังนั้นสักวันก็น่าจะได้ใช้กันใช่ไหม?
GNAT Pro for Rust: สภาพแวดล้อมการพัฒนา Rust สำหรับงาน Embedded
ปัญหาคือเรื่องการรับรอง... ถ้าแก้ได้ก็น่าจะเริ่มมีการนำไปใช้ในที่ต่าง ๆ มากขึ้นเรื่อย ๆ
ขณะเดียวกัน Uber ก็ใช้งาน Zig ค่อนข้างกว้างขวาง และรายได้ของ Zig Foundation เกือบครึ่งหนึ่งพึ่งพา Uber
2024 Financial Report and Fundraiser
ไม่ใช่ฝั่ง embedded โดยตรง แต่ดูเหมือนว่าภายในบริษัทของผมเองก็มีทีมที่กำลังพิจารณากันภายในเพิ่มขึ้นเรื่อย ๆ
โดยเฉพาะมีการพูดต่อ ๆ กันถึงกรณีที่พัฒนา interop library สำหรับโค้ด Python ของ Airflow ด้วย Rust แล้วได้ผลลัพธ์ที่ค่อนข้างคุ้มค่า เลยทำให้หลายคนสนใจมากครับ