บทความนี้ได้รับการแปลเป็นภาษารัสเซีย ขอบคุณ Leonid Suschev
คุณเพิ่งเปลี่ยนทีมที่ทำงาน หรือเพิ่งเริ่มงานใหม่ หรือคุณพบบั๊กในแอป open-source ที่ชอบ และต้องการเขียน pull request แรก แต่หลังจาก git clone และเปิด app/models คุณหลงทางหมดแล้ว แม้โครงสร้าง Rails จะเหมือนกับที่คุณเคยคุ้นเคย แต่ก็หาทางเข้าไปใน โค้ด ไม่ได้เลย ดังนั้นวิธีเร็วที่สุดในการเรียนรู้แอป Rails ที่ไม่คุ้นเคยคืออะไร?
สร้างคำศัพท์ของโปรเจกต์
Player คืออะไร? Session คืออะไร? Account กับ User กับ Provider ต่างกันอย่างไร?
ทุกแอปใช้คำศัพท์และ隐喻ที่ต่างกัน และหากคุณไม่เข้าใจคำศัพท์ของแอปนั้น คุณจะเสียเวลาไปกับการ瀏覽 app/models ทุกครั้งที่เห็นชื่อคลาสใหม่ หรือแย่กว่านั้น คุณจะทำสมมติฐานผิดเกี่ยวกับการทำงานของฟีเจอร์ต่างๆ
ดังนั้น ขั้นแรกที่ต้องทำคือ สร้างคำศัพท์นั้นขึ้นมา เรียนรู้ว่าแอปนี้ประกอบด้วยอะไรบ้าง และถ้าต้องการทำได้เร็ว ให้เริ่มจากการอ่าน db/schema.rb คุณจะได้รู้คำศัพท์ที่แอปใช้ และข้อมูลทั้งหมดเชื่อมโยงกันอย่างไร ให้ใส่ใจพิเศษที่คอลัมน์ *_id เพื่อดูว่าโมเดลต่างๆ เชื่อมต่อกันอย่างไร
ถ้าคุณเป็นคนเรียนรู้แบบภาพลักษณ์ ลองใช้ rails-erd gem มันจะสร้างแผนภาพจากโมเดล Rails แสดงตาราง คอลัมน์ และการโต้ตอบทั้งหมด พิมพ์ไว้วางบนโต๊ะ และคุณจะเข้าใจส่วนที่เหลือของแอปได้ง่ายขึ้น
ต่อยอดกับโมเดลและ Plain Ruby Objects
ในแอป Rails ที่ออกแบบได้ดี ไม่ใช่ทุกอย่างที่ backed โดยตารางฐานข้อมูล เพื่อต่อยอดการสร้างคำศัพท์โปรเจกต์ ให้ดูใน app/models หาคลาสและ attribute เพิ่มเติมที่ไม่อยู่ใน db/schema.rb
อย่าใช้เวลานานเกินไปที่นี่ มันง่ายที่จะหลงทางในรายละเอียดการทำงาน คุณอยู่ที่นี่เพื่อเติมเต็มคำศัพท์โปรเจกต์เท่านั้น
เมื่อคุณรู้จักส่วนประกอบของแอปมากขึ้น คุณอาจสงสัยว่า ทำไม บางออบเจ็กต์จึงมีอยู่ หรือทำไมมันถึงเข้ากันได้แบบนั้น จุดประสงค์ของขั้นตอนถัดไปก็คือการตอบคำถามนี้
ลองใช้แอป และหาคำตอบ "Why"
เมื่อคุณรู้จักออบเจ็กต์ที่แอปใช้งานแล้ว ให้เริ่มรันแอปขึ้นมา คลิกสำรวจดู ถ้ามีเอกสารประกอบ อาจช่วยนำทางได้ ไม่ก็แค่ดูคำศัพท์ที่เพิ่งเรียนรู้มา "มีชีวิต" ขึ้นมา
ขณะใช้งาน คุณจะเริ่มมองแอปจากระดับสูงขึ้น คุณจะสังเกตว่ามีเหตุผลว่าทำไมโมเดลถึงมี associations แบบนั้น ทำไมจึงจัดกลุ่มแบบนั้น ทำไมจึงเลือกชื่อคลาสแบบนั้น อาจเพราะมันปรากฏร่วมกันบนหน้าเดียวกัน หรือถูกสร้างจากฟอร์มเดียวกัน
และเมื่อเริ่มเข้าใจส่วนประกอบและเหตุผลที่มันมีอยู่ คุณก็พร้อมที่จะเข้าใจว่า "มันทำงานอย่างไร"
เข้าใจ "How"
ตอนนี้คุณรู้พอที่จะเรียนรู้แอปนี้ละเอียด คุณจะไม่หลงทางจากคำศัพท์ใหม่หรือการโต้ตอบใหม่ คุณสามารถเลือกหัวข้อที่อยากเรียนรู้ และติดตามมันจนจบ
มีหลายวิธีในการทำต่อไป นี่คือวิธีที่ผมชอบ:
- เบราว์เซอร์ UI และคิดว่า: ฟีเจอร์นี้อาจสร้างได้อย่างไร จากสิ่งที่คุณรู้เกี่ยวกับส่วนประกอบ? ทายได้ไหม? ใช้ debugger ยืนยันการทาย หรือค้นพบว่ามันทำงานจริงอย่างไร
- เลือก test case และติดตามมันผ่านทั้งแอป อ่านโค้ด หรือสำรวจด้วย debugger
- เลือก route หรือ controller action หาทางไปถึง controller action นั้นจาก UI ได้ไหม
นี่เป็นเวลาที่ดีในการกลับไปดูโมเดลและ plain Ruby objects อีกครั้ง และคราวนี้คุณ สามารถ ลงรายละเอียดได้แล้ว
มีความสงสัยต่อแอป หาช่องว่างของความรู้ และปิดมันด้วย debugger และโค้ด
ทำไมไม่เริ่มจาก Tests?
ผมเคยได้ยินคนพูดว่า "ถ้าอยากเข้าใจ codebase ให้เริ่มจาก tests! Tests คือ executable documentation!"
แต่มันไม่เคยใช้กับผม Test cases แคบเกินไป เฉพาะเจาะจงเกินไป ถ้าผมเรียนจาก tests ผมรู้สึกว่าพลาดภาพใหญ่ของแอป
เพื่อเข้าใจสิ่งใหญ่อย่างแอป Rails ผมต้องการ overview ก่อน ต้องรู้ว่าแอปประกอบด้วย components อะไรบ้าง และทำไมมันถึงมีอยู่
แต่แน่นอน ให้แน่ใจว่า tests รันผ่าน ถ้ารันไม่ผ่าน ระบบเสียแล้ว และคุณไม่อาศัยสิ่งที่ค้นพบจากระบบที่เสียได้
What → Why → How
เพื่อเข้าใจแอป Rails ใหม่ ให้ผ่าน 3 階段นี้ ตามลำดับ:
- What ส่วนประกอบอะไรบ้างที่ประกอบแอปนี้?
- Why ทำไมส่วนเหล่านั้นจึงมีอยู่? ทำไมจึงประกอบรวมกันแบบนั้น?
- How แต่ละชิ้นทำงานอย่างไร?
วิธีนี้จะให้มุมมองกว้างและความรู้ลึกที่คุณต้องการ เพื่อทำให้แอปใหม่นั้น "เป็นของคุณ"
P.S. ผมจะปล่อย Practicing Rails สัปดาห์หน้า ถ้าอยากได้ส่วนลด 25% สำหรับ early access ให้สั่งเร็วๆ นะ!