โพสต์นี้อัปเดตเมื่อวันที่ 23 พฤษภาคม 2024 เพื่อชี้แจงความแตกต่างในโมเดลและการทำ persistence ระหว่าง Rails และ Hanami
Ruby on Rails เป็น web framework ยอดนิยมที่สุดในระบบนิเวศ Ruby มีผู้ใช้จำนวนมาก ตั้งแต่ฟรีแลนซ์จนถึงบริษัทใหญ่ที่มั่นคง ด้วยชุมชนผู้ใช้ที่แข็งแกร่งและเอกสารครบครัน สามารถใช้สร้างทุกอย่างตั้งแต่แอปพลิเคชันง่ายๆ จนถึงเว็บแพลตฟอร์มที่ซับซ้อน
อย่างไรก็ตาม มีผู้แข่งขันใหม่กำลังท้าทายความเป็นผู้นำของ Rails สำหรับตำแหน่ง full-stack Ruby framework: Hanami เป็น Ruby framework ที่เร็ว โมดูลาร์ มีประสิทธิภาพและ maintainability ที่ดีกว่า Rails
ในบทความนี้ เราจะสำรวจจุด mạnhและจุดอ่อนของแต่ละ framework ด้านประสิทธิภาพ คุณสมบัติ การทดสอบ และอื่นๆ ดังนั้นไม่ว่าคุณจะมองหาการสร้าง customer-facing web app, internal tool หรือ massively scalable API คุณควรจะได้รับข้อมูลที่เพียงพอในการตัดสินใจว่าจะใช้ framework ไหนสำหรับโปรเจกต์ถัดไป
มาเริ่มต้นด้วยการแนะนำสั้นๆ ของแต่ละ framework
แนะนำ Ruby on Rails
Ruby on Rails เป็น Ruby web application development framework ที่รู้จักมากที่สุด มีภารกิจเพิ่มประสิทธิภาพนักพัฒนา (โดยการทำสมมติฐานมากมายเกี่ยวกับวิธีสร้างแอป ซึ่งมักเรียกว่า "Rails way")
สมมติฐานบางอย่างรวมถึงการให้แน่ใจว่านักพัฒนาไม่ใช้เวลากำหนดค่าสิ่งต่างๆ หรือสิ่งที่เรียกว่า "convention over configuration" และเน้นการใช้หลักการ DRY ("don't repeat yourself") หลักการ DRY ส่งเสริให้นักพัฒนาหลีกเลี่ยงการทำซ้ำโค้ด แต่ใช้การแทนที่แบบ single และ focused ของฟังก์ชันแอป เพื่อให้มั่นใจได้ถึง maintainability และการจัดระเบียบ
แนะนำ Hanami
ในขณะที่ Rails เป็นที่รู้จักดีในชุมชน Ruby Hanami นิยมน้อยกว่า เป็น modern Ruby framework ที่ใหม่ค่อนข้าง พยายามจะเอาชนะ Rails ในพื้นที่ full-stack web framework
Hanami สร้างขึ้นตั้งแต่พื้นเพื่อให้มี memory footprint เล็ก และเน้น modularity ซึ่งทำให้ได้ framework ที่เร็วและ轻巧
แน่นอนว่าการแนะนำสั้นๆ นี้จะไม่ให้ข้อมูลทั้งหมดที่คุณต้องการในการตัดสินใจ framework ที่เหมาะสม สำหรับนั้น เราต้องเจาะลึกแต่ละ framework เริ่มจากโครงสร้างของมัน
โครงสร้างและสถาปัตยกรรมของ Rails และ Hanami
Rails และ Hanami คล้ายกันในบางอย่าง คือทั้งคู่เป็น Ruby framework อย่างไรก็ตาม วิธีที่แต่ละตัวสร้างขึ้นและ application architecture คือที่ที่คุณจะพบความแตกต่างส่วนใหญ่
เพื่อเริ่มต้น ใน Rails คุณมีไฟล์หรือ abstractions (บล็อกก่อสร้างที่คุณใช้สร้างแอป) น้อยกว่า ซึ่งมีแนวโน้มจะโตในขนาดเมื่อคุณพัฒนาแอป ในทางกลับกัน Hanami นำ abstractions ไปสู่ระดับใหม่ โดยมีไฟล์เยอะมากที่มีแนวโน้มเล็กลง
แผนภาพด้านล่างแสดงจุดนี้ชัดเจนกว่า มาเริ่มกับ Rails

ตอนนี้เปรียบเทียบแผนภาพ abstraction ของ Rails กับ Hanami ด้านล่าง

ตามที่เห็น แต่ละ framework โดยทั่วไปปฏิบัติตามโครงสร้าง model-view-controller (MVC) อย่างไรก็ตาม Hanami นำ abstraction ไปสู่ระดับถัดไป
นี่คือโครงร่างง่ายๆ ของการจัดระเบียบแต่ละ framework:
- Routes - แต่ละ framework มี routes definition พร้อม endpoints ของแอป
- Controllers vs actions - ใน Rails คุณได้ controllers พร้อม action หนึ่งหรือสอง action Controllers รับและตอบสนอง route requests โดยส่งไปยัง action ที่เกี่ยวข้อง ใน Hanami ไม่มี controllers แทนคุณไปตรงถึง self-contained actions (แต่ละ action มีคลาส self-contained ของตัวเอง)
- Models และ persistence - โมเดลเลเยอร์ของ Rails ดูแล validation ข้อมูลและการสื่อสารกับฐานข้อมูล รวมถึง queries ที่แอปอาจมี Persistence จัดการโดย Ruby Object Mapper (ROM) ใน Hanami โมเดลเลเยอร์เป็นนามธรรมกว่า แยกเป็น entities และ repositories Entities จัดการ domain logic และเป็น database-agnostic ในขณะที่ repositories (repos) ใช้สื่อสารกับฐานข้อมูล Hanami 2.0 ขึ้นไปส่งมอบโดยไม่มี persistence layer ที่ pre-configured ทำให้คุณเลือก Object Relational Mapper (ORM) ที่เหมาะสม หรือเขียน ORM-free ได้
- View rendering - เช่นเดียวกับ persistence layer Ruby on Rails views มักประกอบด้วยทุกอย่างที่คุณต้องการสำหรับการ render ข้อมูลสู่โลกภายนอกในที่เดียว รวมถึงโครงสร้าง HTML view helpers และ view logic เมื่อพูดถึง view rendering ใน Hanami สิ่งต่างๆ เป็นนามธรรมกว่า ตัวอย่างเช่น คุณมี views ที่ใช้ view helpers ที่แอปมี และ render template Template จัดการโครงสร้าง HTML จริง ในขณะที่ parts ดูแล presentation logic
ดังนั้น สิ่งนี้หมายถึงอะไรเมื่อสร้างแอป? ด้วย abstractions น้อยกว่า Rails เป็นตัวเลือกที่ดีสำหรับการเริ่มต้นแอปและเหมาะกับผู้เริ่มต้นมากกว่า (ตามที่เราจะเห็นในภายหลัง) ด้วย Rails คุณสร้าง monolith apps ที่แข็งแกร่งได้ แตโค้ดจะซับซ้อนขึ้นเรื่อยๆ เมื่อ scale ขึ้น ในทางกลับกัน โครงสร้างที่ซับซ้อนกว่าของ Hanami อาจทำให้เรียนรู้ยาก แต่จะช่วยให้คุณสร้างแอปพลิเคชันที่ scalable มาก และอาจทำให้จัดระเบียบโค้ดได้ดีกว่า
ต่อไป มาดู ecosystem ของแต่ละ framework
Ecosystem และ Community
เช่นที่กล่าวไว้ก่อนหน้า Rails เป็น framework ที่มั่นคงกว่า Hanami Rails มีมานานกว่า และมีชุมชนที่ใหญ่และโดดเด่นกว่า
ความแตกต่างของ ecosystem และ community สรุปได้ดังนี้:
- Documentation (เอกสาร) - ไม่ว่าคุณจะพยายามสร้างอะไร หากใช้ Rails คุณเข้าถึงเอกสารที่ทำได้ดีมาก คุณได้รับคำแนะนำทุกส่วนของการสร้างแอป ตั้งแต่ authentication, data persistence, view presentation และทุกอย่างในระหว่างนั้น นอกจากนี้ ยังมี third-party tutorials หลากหลายครอบเกือบทุกอย่างที่นึกออกได้เกี่ยวกับการสร้างแอปพลิเคชัน
อย่างไรก็ตาม สิ่งต่างๆ ไม่ได้มั่นคงเท่าไหร่ในฝั่ง Hanami เป็น framework ที่ใหม่ค่อนข้าง Hanami มี documentation base ที่จำกัดเมื่อเทียบ ทีม Hanami ทำ guides อย่างเป็นทางการได้ดีมาก แต่เทียบกับ Rails documentation base ไม่ค่อยใกล้เคียง
- Community (ชุมชน) - ในที่นี้เหมือนกับเอกสาร Rails เป็นผู้ชนะชัดเจน Rails มานานกว่า Hanami จึงถูกนำมาใช้มากที่สุด ไม่ว่าคุณจะเป็น beginner หรือ advanced developer คุณจะพบชุมชน Rails บน subreddits, Slack groups, Discords ฯลฯ ที่เกี่ยวข้อง ในทางกลับกัน Hanami ยังกำลังเติบโต หมายความว่ามีชุมชนเล็กกว่ามาก
- Gems และ libraries - เนื่องจาก Hanami และ Rails เป็น Ruby frameworks ทั้งคู่ อาจโต้แย้งได้ว่า gems ที่ทำงานใน Rails จะทำงานใน Hanami แม้จะเป็นจริงในทางเทคนิค แต่คุณมักจะพบว่า Rails มี gems และ libraries ที่มั่นคงกว่าสำหรับฟังก์ชันเฉพาะทางหลากหลาย
อย่างไรก็ตาม เนื่องจาก Hanami เน้น abstractions และ specialization มันมี gems ขั้นสูงบางอย่างที่อาจนำ Rails apps ของคุณไปสู่ระดับถัดไป ตัวอย่างเช่น dry-rb gems เริ่มต้นใน Hanami อาจนำ code organization และ abstraction ที่ดีกว่าเมื่อใช้ใน Rails apps
ต่อไป มาเปรียบเทียบ learning curve และ adoption ของแต่ละ framework
ความง่ายในการใช้งาน Adoption Governance และ Learning Curve
ด้วยเหตุผลที่ระบุในส่วนก่อนหน้า Ruby on Rails ชนะ Hanami อย่างง่ายดายในแง่ของความง่ายในการใช้งาน industry adoption และ learning curve โดยเฉพาะ:
- Learning (การเรียนรู้) - ทưởng像คุณเป็น beginner ที่อยากเรียน framework ใหม่ ความคิดแรกคือเช็ค online learning resources หาก framework มี learning materials ที่แพร่หลายครอบคลุมการสร้างแอปตั้งแต่ต้นจนจบ คุณน่าจะเลือก framework นั้นมากกว่า และเพราะ Rails มี documentation base ที่มั่นคงกว่า จึงชนะ Hanami เป็น framework ที่ beginner เลือก นอกจากนี้ Rails เป็นมิตรกับ beginner มากกว่า เพราะมันทำสมมติฐานมากภายใต้ hood (เทียบกับ Hanami ที่เสนอวิธีสร้างแอปที่นามธรรมกว่า) Abstractions ของ Hanami อาจทำให้แม่นักพัฒนา Rails ที่มีประสบการณ์ก็ยาก
- Industry adoption (การนำมาใช้ในอุตสาหกรรม) - ไม่รวม adoption ของ frameworks ยอดนิยมอื่นๆ เช่น Python, React, C# และอื่นๆ หากพิจารณา adoption ของ Ruby frameworks เท่านั้น Rails เกินกว่า Hanami โดยง่าย หน้าแรกของ Rails แสดงรายชื่อองค์กรใหญ่ๆ ที่ใช้ framework ในทางกลับกัน Hanami เป็นหนุ่มใหม่ ไม่ได้ถูกนำมาใช้กว้างขวาง จะต้องรอดูว่าจะเปลี่ยนในอนาคตหรือไม่
- Job market prospects (โอกาสตลาดแรงงาน) - ในแง่ของ job prospects คุณจะพบ job openings สำหรับ Rails developers มากกว่า Hanami developers
- Governance (การกำกับดูแล) - ด้านสำคัญอีกอย่างที่ไม่ควรละเลยคือ governance ภูมิทัศน์ที่เปลี่ยนแปลงนำทางว่า open-source frameworks พัฒนาและก้าวหน้าอย่างไร แต่มากกว่านั้น สมาชิก core team ของ frameworks เหล่านี้มักมีอำนาจมาก และสามารถ dictate ได้ว่าอะไรจะเข้าไปใน framework มันจะพัฒนาอย่างไร ฯลฯ
ตัวอย่างที่ดีคือประกาศในเดือนมกราคมโดย David Heinemeier Hansson (DHH) ผู้สร้าง Rails เขาบอกว่าในอนาคตเขาจะผลักดันให้ Rails ให้ first-class support สำหรับการสร้าง full-stack progressive web applications และ native notifications ฟีเจอร์เหล่านี้จะทำให้ Rails น่าสนใจสำหรับ mobile developers
ในทางตอบสนอง นักพัฒนาหลายคน บางคนอยู่นอกระบบนิเวศ Ruby และบางคนเคยเลิก Rails มาหลายปี ตอบรับอย่างกว้างขวางในแง่บวก ว่าพวกเขาจะยินดียก framework กลับมาหรือเรียนรู้มัน หาก DHH รักษาคำมั่นสัญญา ตัวอย่างนี้เพียงพอแสดงว่า governance เป็นการพิจารณาสำคัญมากในการตัดสินใจเลือก framework
มาเปลี่ยนหัวข้อไปดูเรื่อง technical มากขึ้น คือ application performance
ประสิทธิภาพ: Ruby on Rails vs Hanami
ในฐานะนักพัฒนา คุณจะกังวลเกี่ยวกับความน่าเชื่อถือ ความตอบสนอง และว่าแอปจะใช้ทรัพยากร server อย่างไรเมื่อ deploy บน production นี่คือกังวลพื้นฐานที่ส่งผลต่อการเลือก framework มาก
คุณสามารถใช้หลายวิธี run performance tests บนแอป หนึ่งในยอดนิยมคือ Apache JMeter มาใช้ benchmark numbers เปรียบเทียบ Hanami และ Rails
นี่คือ quick benchmark test แสดงจำนวน requests ที่แต่ละ framework จัดการต่อวินาที:

Hanami ชนะ Rails อย่างชัดเจน ด้วยความสามารถจัดการ requests 3 เท่าของ Rails
ภาพหน้าจอต่อไปแสดงค่า average latency ของแต่ละ framework:

อีกครั้ง Hanami ชนะ Rails ด้วย average latency time ที่สั้นกว่า 3 เท่า
หากคุณมองหา Ruby framework ที่เร็วสุดๆ (สมมติว่าคุณต้องทำงานบน fast และ hugely scalable API) คุณจะยากที่จะหาอะไรดีกว่า Hanami ในภูมิทัศน์ Ruby
Testing (การทดสอบ)
เมื่อพูดถึงการทดสอบโค้ด ทั้งสอง framework ค่อนข้างเทียบเท่า เพราะคุณสามารถทดสอบทั้งคู่ด้วย RSpec library ที่หลากหลาย
RSpec รวมผ่าน gem hanami-rspec สำหรับ Hanami apps ในขณะที่คุณต้องติดตั้ง gem rspec-rails เพื่อใช้ใน Rails app ตัวอย่างด้านล่างแสดง test spec พื้นฐานที่มาพร้อม Hanami app ใหม่:
การรันด้วย $ bundle exec rspec spec/requests/root_spec.rb ควรให้ passing test (สมมติว่าคุณไม่ได้แก้ไข default view template):
ฝั่ง Rails คุณต้องจัดการบางอย่างเอง ก่อนอื่น ต้องเพิ่ม RSpec gem ไปใน development/test block ใน Gemfile ตามด้านล่าง แล้วรัน bundle:
ขั้นตอนต่อไปคือรัน RSpec install ด้วยคำสั่ง bundle exec rails generate rspec:install เพื่อเตรียมพร้อมสำหรับ Rails project
สุดท้าย ก่อนเขียนและรัน tests ใดๆ คุณน่าจะต้องติดตั้ง gem อีกตัวเพื่อกำหนด test data สำหรับ Rails app: FactoryBot
และสมมติว่าคุณตั้งค่า test suite ให้เหมาะสมและกำหนด tests ไปแล้ว คุณสามารถรัน test ได้เหมือน Hanami ด้วย bundle exec rspec spec/models/user_spec.rb คุณจะได้ test results เหมือน Hanami app:
สุดท้าย มาดูว่า frameworks เปรียบเทียบกันยังไงเรื่อง deployment
Deployment (การปรับใช้)
ปัจจุบันมีตัวเลือกมากมายสำหรับ deploy Ruby apps ไป production
เริ่มต้น คุณอาจเลือก Platform-as-a-Service (PaaS) provider เช่น Heroku หรือ Fly เพื่อประสบการณ์ที่ราบรื่นกว่า คุณยังสามารถทำ DevOps เล็กน้อย: ตั้งค่า Docker installation บน VPS และ deploy แอปที่นั่น
ไม่ว่าคุณจะเลือกอะไร คุณคาดหวังว่า deployment จะค่อนข้างคล้ายกันในทั้งสองกรณี ข้อแตกต่างคือขาดเอกสารและ tutorials มากสำหรับการ deploy Hanami apps
เช่นที่ระบุไว้ก่อนหน้า เนื่องจากเป็น framework ใหม่ Hanami ยังไม่มีเอกสารครอบคลุมที่ครอบคลุมกระบวนการ deployment และ challenges ที่อาจเกิดขึ้น หากคุณไม่แคร์ hack around นี้ คุณควรจะโอเค
สรุป
ในบทความนี้ เราได้ดูสอง Ruby frameworks — Ruby on Rails และ Hanami — เปรียบเทียบพวกเขาในแง่ของ features, architecture, performance และอื่นๆ สุดท้ายเราต้องตอบคำถาม: "ฉันควรใช้ framework ไหน และทำไม?" เราสามารถสรุปได้ดังนี้:
- หากคุณเป็น beginner Ruby developer เริ่มต้นกับ Rails: มันง่ายต่อการเรียนรู้ หากคุณเป็น advanced Ruby developer ให้พัฒนา Hanami skillset เพราะจะช่วยให้คุณพัฒนา Ruby applications ที่แข็งแกร่งกว่า
- หากคุณต้องพัฒนาแอปที่ควรเร็ว เช่น API serving หลาย clients Hanami ด้วย memory footprint เล็ก การตอบสนองเร็วและ low latency จะช่วยคุณดี แต่ถ้าคุณแค่ต้องพัฒนา monolithic full-stack app เพื่อ validate SaaS idea Rails จะนำคุณไปถึงเป้าหมายเร็วกว่าแน่นอน
สุดท้าย สิ่งที่คุณเลือกก็ขึ้นอยู่กับคุณ ไม่ใช่ไอเดียที่แย่ที่จะได้ skill ทั้งสอง framework เพื่อที่คุณจะตัดสินใจ framework ที่ดีที่สุด ขึ้นอยู่กับความต้องการของโปรเจกต์
Happy coding!
P.S. หากคุณต้องการอ่านโพสต์ Ruby Magic ทันทีที่เผยแพร่ ให้สมัครสมาชิก newsletter Ruby Magic ของเรา และจะไม่พลาดโพสต์เด็ดๆ ไป!
P.P.S. คุณรู้ไหมว่า AppSignal มี integration สำหรับ Rails และ Hanami?