ไม่มีสิ่งที่เรียกว่า Clean Code
(steveonstuff.com)- ผู้คนพยายามเขียนโค้ดให้ 'สะอาด' แต่คำว่า 'สะอาด' ไม่ใช่ตัวชี้วัดที่มีประโยชน์
- โค้ดไม่ได้แค่ 'สะอาด' ได้เฉยๆ เพราะคำว่า 'สะอาด' ไม่ได้อธิบายอะไรเกี่ยวกับโค้ดเลย
- เวลาที่คนบอกว่าโค้ดสะอาด โดยมากหมายถึงโค้ดนั้นยอดเยี่ยมในบางแง่มุม
Clean Code เป็นโค้ดที่ดีจริงหรือ?
-
โค้ดอาจยอดเยี่ยมได้ด้วยหลายเหตุผล
→ อ่านง่าย, เข้าใจง่าย, เรียบง่าย, ประสิทธิภาพดี, ปลอดภัย, สง่างาม, ทดสอบได้, มีการห่อหุ้ม, ขยายต่อได้, บำรุงรักษาได้, นำกลับมาใช้ซ้ำได้.. -
แต่คุณลักษณะเหล่านี้ในบางด้านก็ขัดแย้งกันเอง
→ โค้ดที่เรียบง่ายที่สุดอาจไม่ใช่โค้ดที่ทดสอบได้ง่ายที่สุด
→ interface และ dependency ที่ถูก inject เข้ามาช่วยให้ทดสอบสะดวกขึ้น แต่ก็ห่างไกลจากความเรียบง่าย
→ การใช้ singleton มากๆ อาจทำให้เข้าใจง่าย แต่ก็อาจไม่ใช่แอปพลิเคชันที่บำรุงรักษาได้ดี -
บางอย่างในนี้ขัดกันในระดับพื้นฐาน จึงอาจยากที่จะทำให้ครบทั้งหมดพร้อมกัน
→ เพราะวิศวกรรมคือ Trade-off (การประนีประนอม) ทีมจึงอาจหยิบประเด็นเรื่องจุดสมดุลเหล่านี้มาพูดคุยกันได้
ถ้าโค้ดยอดเยี่ยม เราควรพูดให้ได้ว่า "เพราะอะไร"
- เวลามีใครบอกว่าโซลูชันหนึ่ง 'สะอาด' มักหมายถึงเขาอธิบายเหตุผลนั้นอย่างมีตรรกะไม่ได้ และเพียงบอกว่ามันเป็นทางเลือกที่ดีกว่า
- หากต้องการถกเถียงเชิงสร้างสรรค์เกี่ยวกับโซลูชันทางเทคนิค เราต้องอธิบายให้ชัดได้ว่าเหตุใดโซลูชันหนึ่งจึงดีกว่าอีกโซลูชัน
→ แทนที่จะพูดแค่ว่า 'สะอาด' ให้พูดว่า 'มีการแยกส่วน, เข้าใจง่าย, ทดสอบง่าย..'
เราควรใช้คำศัพท์ที่แม่นยำ
- โดยทั่วไปการเขียนโค้ดเป็นกีฬาประเภททีม ตอนแฮ็กคนเดียวอาจทำอะไรก็ได้ตามใจ แต่เมื่อทำงานกับทีมก็ต้องพูดคุยแลกเปลี่ยนไอเดียกัน
- การใช้ภาษาชุดหนึ่งเพื่อพูดคุยเรื่องโซลูชันทางเทคนิค และทำให้ทั้งทีมมีความเข้าใจร่วมกัน เป็นสิ่งสำคัญมากต่อการเข้าใจกันและกัน
- คำว่า 'Clean Code' มีความหมายไม่เหมือนกันสำหรับแต่ละคน
→ สำหรับบางคนหมายถึงสถาปัตยกรรมที่นิยามไว้ดี สำหรับบางคนหมายถึงโค้ดที่เขียนอย่างเรียบง่ายด้วยรูปแบบการจัดฟอร์แมตที่สม่ำเสมอ.. - คำอย่าง 'encapsulation', 'ทดสอบได้', 'นำกลับมาใช้ซ้ำได้' มีความหมายที่เราทุกคนพอจะเห็นตรงกัน
- เมื่อเราใช้คำที่เฉพาะเจาะจงกว่าในการอธิบายคุณลักษณะของโค้ด เราจะมั่นใจได้มากขึ้นว่าเราเข้าใจตรงกัน
- 'สะอาด' มีความแม่นยำพอๆ กับคำว่า 'ดี'
แล้ว 'Clean Code' คืออะไรกันแน่?
-
ผมได้ข้อสรุปว่า เวลาที่ผมอธิบายโค้ดว่า 'สะอาด' หลายครั้งมันหมายถึง 'โค้ดนี้ดีแหละ แต่ผมยังไม่มั่นใจเต็มที่ว่าทำไม'
→ หรืออาจรู้ว่าโค้ดนั้นดีเพราะอะไร แต่ยังหาคำที่อธิบายได้ชัดเจนไม่เจอ -
การพัฒนาสัญชาตญาณแบบนั้นเป็นเรื่องดี แต่ไม่ควรหยุดแค่นั้น ควรขุดลึกลงไปอีกเพื่อทำความเข้าใจว่า 'ทำไมโค้ดนี้ถึงดี'
→ โค้ดนี้มีคุณสมบัติอะไรที่อย่างอื่นไม่มีหรือไม่? แล้วคุณสมบัตินั้นเหมาะกับโปรเจ็กต์ของเราที่สุดหรือเปล่า? อาจเป็นไปได้ว่ามันไม่ใช่โซลูชันที่ถูกต้องก็ได้ -
หวังว่าเราจะมั่นใจได้ว่าสิ่งที่ต้องการไม่ใช่ Clean Code แต่คือโค้ดแบบ ______
6 ความคิดเห็น
ขอบคุณสำหรับบทความดี ๆ ครับ ~~
อย่าไปเตะโค้ดเลกาซีส่งเดช
แกเคยทำให้ requirement แรกสำเร็จได้สักครั้งบ้างหรือยัง
เห็นด้วยครับ
ดูเหมือนว่าใน 'หนังสือเล่มนั้น' clean code ที่ผู้เขียนพูดถึงจะเน้นไปที่สองข้อนี้คือ 'เข้าใจได้ง่าย' และ 'ทดสอบได้' แน่นอนว่าผมคิดว่าทั้งสองอย่างเป็นตัวชี้วัดที่สำคัญมาก แต่ก็มีอยู่บ้างที่ต้องใช้สิ่งที่เรียกว่า 'hack' เพราะสเปกที่ยังไม่เป็นรูปแบบตายตัวหรือไลบรารีที่ยังไม่เสร็จสมบูรณ์ และในลักษณะนี้ การยอมสละคุณภาพของโค้ดเพื่อคุณภาพของโปรแกรมก็ดูจะเป็นสิ่งที่หลีกเลี่ยงไม่ได้
เห็นด้วยครับ/ค่ะ เมื่อมองว่า “คลีน” หมายถึง “คุณภาพสูง” (อย่างที่ Weinberg เคยกล่าวไว้) คุณภาพก็คือสิ่งที่มีคุณค่าสำหรับใครบางคน ดังนั้นผม/ดิฉันคิดว่าจำเป็นต้องมีเกณฑ์และคำนิยามของคุณภาพภายในทีม
บทความนี้เสนอว่าแทนที่จะพูดแบบกำกวมว่า 'โค้ดสะอาด' ก็ควรพูดให้ชัดเจนและเจาะจงไปเลย
ในเรื่องนี้บน Hacker News ก็มีการพูดคุยกันหลากหลายเกี่ยวกับการตีความของคำว่า 'โค้ดสะอาด' ลองอ่านคอมเมนต์ประกอบด้วย
There’s No Such Thing as Clean Code https://news.ycombinator.com/item?id=30111516
แม้หัวข้อจะต่างกันเล็กน้อย แต่ลองดูบทความด้านล่างที่เคยโพสต์ไว้ก่อนหน้านี้ด้วย