สรุปประสบการณ์เกี่ยวกับ Rust ต้นค.ศ. 2019

ผมเคยลองเขียนโปรแกรมจัดการ tree และ alignment ด้วย Rust ทั้งตัว เพราะหวังว่า static type มันน่าจะช่วยหาข้อผิดพลาดได้มาก ผลที่ได้คือผมเสียเวลามากไปกับสิ่งที่เป็นรายละเอียดของ Rust เอง ไม่ใช่ใจความหลักของโปรแกรม แล้วก็มีปัญหาช่วง runtime พอ ๆ กับผมเขียน Ruby เลย สุดท้ายก็ต้องมาเขียน automated tests หรือมา test แบบ manual อยู่ดี แน่นอนว่าผมยังไม่แตกฉาน Rust ก็ได้ แต่ด้วยเหตุอะไรก็ตาม ถ้าต้องเขียนโปรแกรมภาษาแรกที่ผมนึกถึงไม่ใช่ Rust

แต่ถ้าเป็นโปรแกรมทางธุรกิจที่ไม่ได้หลากหลายมาก โครงสร้างข้อมูลนิ่ง ๆ ล้อตาม SQL มาอยู่แล้ว อันนี้ใช้ Rust ก็อาจจะดีก็ได้เพราะว่า struct มันก็ชัดเจนดี บางทีอาจจะพิมพ์ชื่อ field ผิด ลืมใส่บาง field อันนี้มันก็หาให้ได้ แต่แบบหลังนี่ผมยังไม่เคยลอง

ส่วนที่ใช้ Rust แล้วรู้สึกว่าดีคือเขียนโปรแกรมตัดคำ อันนี้เร็วขึ้นมาก ๆ เร็วขึ้นจากใช้ภาษา dynamic type สัก 10 เท่าได้ เทียบกับพวก Kotlin บน JVM ก็เร็วขึ้นสัก 2 เท่า อันนี้ชัดเจนเลยว่าถ้าอยากได้พวกที่ใช้ CPU เยอะ ๆ แล้วเร็วขึ้นนี่มันได้ผลมาก อีกโปรแกรมที่คล้าย ๆ กันคือเอามาเขียนหาพวก shortest path บน graph อันนี้ก็เร็วอีกเหมือนกัน; อีกงานหนึ่งคือเอาจัดการกฎการแปลที่เป็น tree หลาย ๆ ต้น เอามาสร้างเป็น TRIE เพื่อที่จะทำให้แปลได้เร็ว ๆ อันนี้ก็เขียนออกมาแล้วก็เร็วขึ้นจริง

สิ่งหนึ่งที่ไม่คิดมาก่อนว่ามันจะดีคือ error handling ที่ตรงไปตรงมามาก ถ้าไม่อยากยุ่งอะไรก็ใส่ unwrap() ไปก่อน หรือปล่อยผ่านไปออกเลยก็ใช้ ? เช่น funcdosth(x)?; ก็คือปล่อยออกไปได้เลยถ้า function ที่หุ้มอยู่มัน return Result ที่ type ใช้กันได้ ท่าแบบนี้มันเขียนน้อย แต่เมื่อไหร่อยากจะกลับมา handle แต่ละจุดให้ดี ๆ ก็แค่ search unwrap กับ ? ใน text editor ก็มาตามอุดได้แล้ว อันนี้ผมเดาว่าเป็นเหตุให้ desktop app ใหม่ ๆ ที่ใช้ GTK+ ถึงเขียน Rust กันเยอะหรือเปล่า ?

สุดท้ายคือพวก concurrency ข้อดีตามในตำราคือมัน check type ให้ว่า ถ้าอยู่ดี ๆ คือเอาพวก mutable state ไปเที่ยวแชร์กันข้าม thread ไม่ได้ ต้อเอา RWLock หรือ Mutex ไปหุ้มก่อน ถ้าจะตัดปัญหาก็ใช้ channel เอา แต่สิ่งที่สังเกตได้หลัง ๆ คือ library เช่น library ที่ทำ Web Socket หรือว่า coroutine ของ Rust ส่วนมาก code อ่านรู้เรื่อง แล้วใครอยากจะทำ library แบบไหนก็ทำได้แทบจะตามจิตนาการเลย คล้าย ๆ กับ C เพราะว่าคนที่เขียน Library ขึ้นมาไม่ต้องไปยุ่งกับ Garbage collector ใน runtime เลย เพราะว่ามันไม่มี 😅 ก็ทำให้ตัดเรื่องยุ่งยากหลัก ๆ ออกไปได้เลย และสำหรับผม code มันอ่านง่ายกว่า C