บทความ

ทำไมเรา port Ash Framework สู่ 14 ภาษา

Ash Framework เป็น declarative application framework ของ Elixir ที่ให้คุณนิยาม resource ครั้งเดียว แล้วได้ actions, filtering, authorization, multitenancy, JSON:API และ GraphQL ตามมาโดยอัตโนมัติ เราที่ Anndream ใช้ Ash มาหลายปี และพบว่ามันเปลี่ยนวิธีที่เราคิดเรื่อง data layer ไปเลย

คำถามที่ตามมาคือ: ถ้า Ash ดีขนาดนี้ ทำไมภาษาอื่นจะไม่ได้ประโยชน์แบบเดียวกัน? คำตอบของเราคือ — ลองพอร์ตมันดู สิ่งที่เกิดขึ้นคือชุดโปรเจกต์Ashlar ที่ตอนนี้มี 14 ภาษาโปรแกรมมิ่ง

ทำไมต้องพอร์ต ไม่ใช่แค่เขียนใหม่

ทางเลือกแรกคือเขียน framework ของตัวเองตั้งแต่ศูนย์ แต่นั่นหมายถึงต้องตอบคำถาม เดิมทั้งหมดอีกครั้ง — validation, changesets, authorization, data layer Ash ใช้เวลาหลายปีในการตกผลึกคำตอบเหล่านั้น การพอร์ตช่วยให้เราสืบทอดการออกแบบที่พิสูจน์แล้ว และโฟกัสที่ความท้าทายที่แท้จริง: ทำอย่างไรให้แนวคิดแบบ declarative ทำงานได้ดีในภาษาเป้าหมาย

  • โครงสร้างโมดูล map กับ lib/ash ของ Elixir แบบ 1:1
  • เอกสาร spec แยกเป็นโฟลเดอร์ของตัวเองในทุก repo
  • ตัวอย่างแอปจริง (blog, todo) ให้เห็นภาพการใช้งาน

ภาษาที่รองรับ

ตอนนี้ Ashlar ครอบคลุมตั้งแต่ระบบ language ยอดนิยมไปจนถึงภาษาที่กำลังเติบโต: Rust, Go, Python, TypeScript, Kotlin, C#, PHP (Laravel), Clojure, Crystal, Swift, Nim, Zig, Gleam และ F#

แต่ละ repo มีลักษณะเฉพาะของตัวเอง — Rust ใช้ Cargo workspace, Kotlin เป็น Gradle multi-module, Laravel เป็น composer package, TypeScript เป็น pnpm monorepo — แต่แกนกลางคือการออกแบบเดียวกัน

บทเรียนที่ได้

สิ่งที่น่าสนใจที่สุดคือภาษาแต่ละภาษาบังคับให้เราคิดต่างกัน Rust สอนเราเรื่อง ownership กับ error handling, Go สอนเรื่อง simplicity, ส่วน Clojure สอนเรื่อง data-first design การพอร์ต 14 ครั้งทำให้เราเห็นชัดว่าแนวคิดใดของ Ash เป็นแก่นจริง และแนวคิดใดเป็นแค่ artifact ของ Elixir

Declarative resource model ไม่ใช่ฟีเจอร์ของภาษา — มันคือวิธีคิด ที่ควรมีในทุกภาษา

ทุก repo เป็น open source และเอกสาร spec ของแต่ละภาษาอยู่ในโฟลเดอร์*-docs ของ repo นั้น ดูรายละเอียดได้ที่หน้าOpen Source บนเว็บนี้