YAGNI (You Aren't Gonna Need It) — หลักการของการเขียนโปรแกรมแบบเอ็กซ์ตรีมที่กำหนดไม่ให้เพิ่มฟังก์ชันการทำงานจนกว่าจะจำเป็น ถูกกำหนดขึ้นโดย Ron Jeffries ในบริบทของระเบียบวิธี XP (Extreme Programming) จากการศึกษาของ University of Alabama (2020) โปรเจกต์ที่ปฏิบัติตาม YAGNI ช่วยลดเวลาในการนำ MVP ออกสู่ตลาดได้ 23% และลดจำนวนข้อบกพร่องลง 17% เมื่อเทียบกับโปรเจกต์ที่ implement ฟังก์ชัน “เผื่อไว้” YAGNI ไม่ใช่ความขี้เกียจ แต่เป็นการประหยัดทรัพยากรอย่างมีสติ
ประเด็นสำคัญ
YAGNI (You Aren't Gonna Need It) — หลักการของการเขียนโปรแกรมแบบเอ็กซ์ตรีม (XP) ที่หมายถึง “คุณจะไม่ต้องการมัน” กฎกล่าวว่า: อย่า implement ฟังก์ชันการทำงานที่ไม่จำเป็นโดยเรื่องราวผู้ใช้ปัจจุบัน ถ้าฟีเจอร์ไม่จำเป็นในวันนี้ — อย่าสร้างมัน แม้จะ “เผื่อไว้” ก็ตาม
คำนี้ถูก coined โดย Ron Jeffries หนึ่งในผู้ร่วมเขียนระเบียบวิธี XP (ร่วมกับ Kent Beck) Jeffries กล่าวว่า: “Implement สิ่งที่ง่ายที่สุดที่ใช้งานได้ และอย่าเพิ่มอะไรจนกว่าจะจำเป็น” YAGNI ไม่ใช่การห้ามวางแผน แต่เป็นการห้าม implement ก่อนเวลา
ตาม Standish Group CHAOS Report (2023) 64% ของฟังก์ชันในผลิตภัณฑ์ซอฟต์แวร์ทั่วไปถูกใช้น้อยมากหรือไม่เคยใช้เลย ถ้าขยายไปยังแอปมือถือ — มากกว่าครึ่งหนึ่งของโค้ดที่เขียนไม่นำคุณค่ามาสู่ผู้ใช้ YAGNI ป้องกันการสิ้นเปลืองทรัพยากรนี้
ใช้ YAGNI เป็นตัวกรองที่เข้มงวด: ทุกฟีเจอร์ต้องตอบคำถาม “มันแก้ปัญหาผู้ใช้เฉพาะอะไรตอนนี้?” ถ้าไม่มีคำตอบ — ฟีเจอร์นั้นไม่จำเป็น
YAGNI ไม่ใช่การปฏิเสธสถาปัตยกรรมที่มีคุณภาพ YAGNI ห้ามเขียนโค้ดที่ไม่จำเป็น แต่ไม่ห้ามเขียนโค้ดที่ถูกต้อง ถ้าฟีเจอร์ปัจจุบันต้องการเลเยอร์ abstraction ที่สะอาด — สร้างมัน ถ้าเลเยอร์ไม่จำเป็น — อย่าสร้าง ความแตกต่างหลัก: YAGNI เกี่ยวกับฟังก์ชันการทำงาน ไม่เกี่ยวกับคุณภาพ
นักพัฒนามักสับสน YAGNI กับการสะสมหนี้ทางเทคนิคโดยเจตนา (หนี้ทางเทคนิคมักเป็นการประนีประนอม YAGNI เป็นหลักการของประสิทธิภาพ) ความแตกต่าง คือหนี้ทางเทคนิคถูกรับรู้และบันทึกไว้ ในขณะที่การละเมิด YAGNI เป็นเพียงงานพิเศษ
ถามตัวเอง: “ถ้าฉันไม่สร้าง abstraction นี้ตอนนี้ การ refactoring จะใช้เวลาเท่าไหร่เมื่อจำเป็น?” ถ้าเวลา refactoring น้อยกว่าเวลาเขียนตอนนี้ — เลื่อนออกไป
การพัฒนามือถือ อ่อนไหวต่อการละเมิด YAGNI เป็นพิเศษด้วยสามเหตุผล: ขนาด APK/IPA ส่งผลโดยตรงต่ออัตราการแปลงการติดตั้ง เวลาคอมไพล์ของโปรเจกต์มือถือเพิ่มขึ้นเป็นเส้นตรงกับปริมาณโค้ด และทุกฟีเจอร์พิเศษเพิ่มจุดล้มเหลว YAGNI ไม่เกี่ยวกับความขี้เกียจ แต่เกี่ยวกับการโฟกัส
การศึกษาของ Google Play Console Data (2023) แสดงให้เห็น: ทุก 10 MB ของขนาด APK ลดความน่าจะเป็นในการติดตั้งลง 1.2% โค้ดที่ไม่ได้ใช้ไม่ใช่แค่ขยะใน repository — มันคือการสูญเสียทางการเงินโดยตรง ไลบรารีพิเศษ (สำหรับฟังก์ชันที่ “อาจจะเพิ่มทีหลัง”) เป็นแหล่งที่พบบ่อยที่สุดของ APK bloating
ตาม Gradle Build Performance Report (2024) แต่ละโมดูลเพิ่มเติมในโปรเจกต์ Android เพิ่มเวลา build ทั้งหมด 3–7 วินาที ถ้าคุณเพิ่ม 5 โมดูล “เผื่อไว้” — การเพิ่มขึ้นของเวลา build จะอยู่ที่ 15–35 วินาทีต่อ build ในหนึ่งปี ทีมนักพัฒนา 5 คนสูญเสียถึง 200 ชั่วโมงทำงานในการรอคอมไพล์
ติดตามขนาดไบนารีใน CI: กำหนดขีดจำกัดการเตือน (เช่น +500 KB ต่อ commit) ถ้าขนาดเพิ่มขึ้นโดยไม่มีฟีเจอร์ใหม่ — นั่นคือการละเมิด YAGNI ที่ต้องอภิปรายในการตรวจสอบโค้ด
Gold-plating — การเพิ่มฟังก์ชันการทำงานเกินความต้องการในความพยายามที่จะ “ปรับปรุง” ผลิตภัณฑ์ ตัวอย่างทั่วไป: นักพัฒนาเพิ่มอนิเมชัน transition ที่ซับซ้อนระหว่างหน้าจอ ทั้งที่ดีไซน์ระบุ fade ธรรมดา อนิเมชันใช้เวลา 2 วัน ผู้ใช้ไม่สังเกตเห็น และบั๊กบนอุปกรณ์ต่างๆ ตามหลอกหลอนโปรเจกต์เป็นปี
ตาม UX Collective Annual Report (2023) ผู้ใช้ 78% ประเมินแอปจากความเร็วและความเสถียร ไม่ใช่จากอนิเมชัน YAGNI บอกว่า: ถ้าอนิเมชันไม่ได้ระบุในความต้องการ — อย่า implement มัน นักออกแบบจะเพิ่มอนิเมชันเมื่อจำเป็นจริงๆ เพื่อแก้ปัญหา UX
Implement เฉพาะสิ่งที่อยู่ใน mockup ถ้านักออกแบบไม่ได้วาดอนิเมชัน — มันไม่ควรมีอยู่ การเบี่ยงเบนใดๆ จาก mockup คือการละเมิด YAGNI
ข้อผิดพลาดทั่วไปของ startup: สร้างการรองรับ 20+ ภาษาทันที “สำหรับการเข้าสู่ตลาดต่างประเทศในอนาคต” YAGNI แนะนำ: แปลเฉพาะภาษาของตลาดปัจจุบัน การเพิ่มภาษาใหม่แต่ละครั้งต้องใช้เวลาของนักแปล การทดสอบการตัดสตริง และการดีบักเลย์เอาต์ RTL
ตาม Deloitte Digital Globalization Survey (2022) แอปมือถือ 60% ไม่เคยออกจากตลาดแรกของพวกเขา ถ้าเป็นกรณีของคุณ — ทรัพยากรที่ใช้กับการรองรับหลายภาษาสูญเปล่า แนวทาง YAGNI: อังกฤษ (พื้นฐาน) + ภาษาของตลาดเป้าหมาย ส่วนที่เหลือ — เมื่อคุณเข้าสู่ภูมิภาคจริง
ใช้ YAGNI สำหรับการจัดลำดับความสำคัญ: ถ้าฟีเจอร์ไม่ได้อยู่ใน roadmap ของสองไตรมาสถัดไป — อย่าเริ่มมัน roadmap ต้องได้รับการบันทึกและอนุมัติโดยผู้จัดการผลิตภัณฑ์
โปรเจกต์ Android ประสบปัญหาไลบรารีเงินเฟ้อ นักพัฒนาเพิ่ม Retrofit, OkHttp, Gson, Room, Dagger Hilt, Navigation Component, DataStore — ก่อนที่จะเขียนบรรทัดแรกของตรรกะทางธุรกิจ YAGNI แนะนำ: เพิ่มไลบรารีตามความจำเป็นจริง ไม่ใช่เชิงป้องกัน
// การละเมิด YAGNI: การรวมไลบรารีเชิงป้องกัน
// build.gradle (module)
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
implementation("androidx.room:room-runtime:2.6.0")
// และแอปตอนนี้แค่แสดง "Hello World"
ไลบรารีคือ dependencies ที่มีความซับซ้อนของตัวเอง แต่ละไลบรารีต้องการการอัปเดตเวอร์ชัน การย้ายเมื่อมีการเปลี่ยนแปลงที่ทำลายความเข้ากันได้ และเพิ่มขนาด APK เพิ่ม ไลบรารีเมื่อมีงานเฉพาะที่ไลบรารีนั้นแก้ไขได้ เริ่มต้นด้วย OkHttp (HTTP client ขั้นต่ำ) เพิ่ม Retrofit เมื่อคุณต้องการ REST client และต่อไปเรื่อยๆ
SwiftUI เป็นเฟรมเวิร์กที่ทรงพลัง แต่การนำไปใช้ควรถูกขับเคลื่อนโดยความต้องการจริง ถ้าโปรเจกต์เริ่มต้นด้วย iOS 14+ และความต้องการ component UI ที่กำหนดเองมีน้อย — SwiftUI เป็นตัวเลือกที่ดี ถ้าโปรเจกต์ต้องรองรับ iOS 13 หรือต้องการ gesture ที่ซับซ้อน — UIKit ยังคงเป็นทางออกที่ถูกต้อง YAGNI ไม่เห็นด้วยกับการย้ายไป SwiftUI “เพราะมันกำลังมาแรง”
// YAGNI: ใช้ UIKit ตราบใดที่ยังไม่มีประโยชน์จริงจาก SwiftUI
class ProfileViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
title = "โปรไฟล์"
}
}
// หากต้องการ SwiftUI — รวมผ่าน UIHostingController
let swiftUIView = ProfileView()
let hostingVC = UIHostingController(rootView: swiftUIView)
การวิเคราะห์ของ Point-Free: “SwiftUI vs UIKit Decision Guide” (2024) แนะนำ: อย่าย้ายหน้าจอ UIKit ที่มีอยู่ไปยัง SwiftUI โดยไม่มีเหตุผลทางธุรกิจที่ชัดเจน (เช่น ความจำเป็นของ Live Preview สำหรับนักออกแบบ) การเขียนโค้ดที่ทำงานอยู่ใหม่เป็นการละเมิด YAGNI โดยตรง SwiftUI — สำหรับหน้าจอใหม่ UIKit — สำหรับหน้าจอที่มีอยู่
ข้อผิดพลาดที่อันตรายที่สุดคือการใช้ YAGNI เป็นข้ออ้างสำหรับสถาปัตยกรรมที่ไม่ดี “เราจะไม่สร้างเลเยอร์ repository เพราะ YAGNI — เราจะเขียน query ลงใน ViewModel โดยตรง” นี่ไม่ใช่ YAGNI นี่คือการสะสมหนี้ทางเทคนิค YAGNI ห้ามฟังก์ชันที่ไม่จำเป็น ไม่ใช่ความสมบูรณ์ของสถาปัตยกรรม
สถาปัตยกรรมคือการลงทุนในการบำรุงรักษา ถ้าคุณเขียนมากกว่า 3 หน้าจอ — เลเยอร์สถาปัตยกรรมพื้นฐาน (MVVM, repository) ก็สมเหตุสมผลแล้ว ถ้า 1 หน้าจอ — คุณสามารถใช้แนวทางที่ง่ายกว่า กุญแจสำคัญ: กำหนดขั้นต่ำทางสถาปัตยกรรมที่จำเป็นสำหรับฟีเจอร์ปัจจุบัน และอย่าเพิ่มมากกว่านั้น
แยกการตัดสินใจเป็น “เชิงสถาปัตยกรรม” และ “เชิงฟังก์ชัน” การตัดสินใจเชิงสถาปัตยกรรม (เลเยอร์ การนำทาง DI) ไม่ครอบคลุมโดย YAGNI — มันจำเป็นสำหรับการบำรุงรักษา การตัดสินใจเชิงฟังก์ชัน (ฟีเจอร์ ภาพหน้าจอ อนิเมชัน) — ครอบคลุม
อีกสุดขั้วหนึ่ง — การไม่สนใจสัญญา API ในอนาคต นักพัฒนาได้รับ JSON จาก backend พร้อม 5 ฟิลด์และ parse เพียง 3 เพราะ “ส่วนที่เหลือไม่จำเป็นตาม YAGNI” ปัญหา: เมื่อเพิ่มฟิลด์ backend อาจทำลายการ parse ถ้า response เปลี่ยนไป วิธีแก้คือ mapping ฟิลด์ response ทั้งหมด แม้ว่าจะไม่ได้ใช้ทั้งหมดตอนนี้
ตาม Meta API Design Guidelines (2023) client ต้อง parse ฟิลด์ทั้งหมดที่ server ส่งกลับ โดยไม่สนใจฟิลด์ที่ไม่ได้ใช้ แต่ไม่ทิ้งโครงสร้างทั้งหมด YAGNI ที่นี่เกี่ยวกับสิ่งอื่น: อย่าเพิ่มการจัดการฟิลด์ที่ยังไม่มีใน spec “เผื่อว่า backend จะส่งกลับมา”
Parse โครงสร้าง response ทั้งหมด (ฟิลด์ทั้งหมดที่ server ส่งกลับในปัจจุบัน) อย่าเพิ่มการจัดการฟิลด์ที่ไม่ได้อยู่ใน spec API ปัจจุบัน นี่คือสมดุลระหว่าง YAGNI และความยืดหยุ่นต่อการเปลี่ยนแปลง
คำถามที่พบบ่อย
YAGNI (You Aren't Gonna Need It) — หลักการ: อย่าทำสิ่งที่จำเป็นตอนนี้ ถ้าฟีเจอร์ไม่ได้อยู่ในความต้องการปัจจุบัน — อย่า implement มัน ถึงแม้ “จะต้องมีประโยชน์แน่ๆ ในหนึ่งเดือน” — เดือนนั้นอาจไม่มาถึง แต่โค้ดถูกเขียนไปแล้ว
KISS ต้องการความเรียบง่ายสูงสุดของโค้ด YAGNI ต้องการฟังก์ชันการทำงานน้อยที่สุด KISS: “ทำให้โค้ดง่าย” YAGNI: “ทำเฉพาะที่จำเป็น” พวกเขาเสริมซึ่งกันและกัน: ร่วมกันป้องกัน overengineering ในระดับโค้ดและฟีเจอร์
เมื่อใช้เป็นข้ออ้างสำหรับการขาดสถาปัตยกรรม YAGNI ไม่ห้ามการแยกเลเยอร์ การสร้าง abstraction และการออกแบบโมดูล มันห้าม implement ฟีเจอร์ที่ไม่จำเป็นตอนนี้ สถาปัตยกรรม ไม่ใช่ฟีเจอร์ แต่เป็นพื้นฐานสำหรับฟีเจอร์
ใน startup YAGNI มีความสำคัญ: ทรัพยากรมีจำกัดและเวลาในการออกสู่ตลาดเป็นปัจจัยสำคัญ โฟกัสที่ MVP (Minimum Viable Product) — ชุดฟีเจอร์ขั้นต่ำที่แก้ปัญหาของผู้ใช้ ทุกอย่างอื่นคือการละเมิด YAGNI
หนี้ทางเทคนิค คือการประนีประนอมอย่างมีสติ: คุณก่อหนี้เพื่อเร่งการส่งมอบและวางแผนที่จะชำระคืน YAGNI เกี่ยวกับการป้องกันงานที่ไม่จำเป็น สมดุล: อย่าทำงานพิเศษ (YAGNI) แต่ถ้าทำ — ทำให้ดี (หนี้ทางเทคนิคขั้นต่ำ)
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม