ประตูทำงานไป 198 ครั้ง และผมเรียกมันว่า "ได้ผล"
ผมสร้าง "ประตู" (gate) ขึ้นมาเพื่อบล็อกโค้ดที่ไม่ดี มันบล็อกโค้ดไปได้ถึง 198 ชิ้น ผมเลยคิดว่าประตูนี้ทำงานได้ดีเยี่ยม เมื่อเห็นจำนวนการบล็อกที่สูง ผมก็รู้สึกว่าตัวเองประสบความสำเร็จ
แต่แล้วเมื่อผมลองไปดูเคสที่เกิดขึ้นจริง ผมก็พบว่าการบล็อกหลายครั้งนั้นเป็นความผิดพลาด ประตูนี้กำลังปฏิเสธโค้ดที่ดี มันปฏิเสธงานที่ตรงตามข้อกำหนดทุกประการ เพียงเพราะโครงสร้างของมันดูแปลกตาไปบ้าง
ผมทำพลาดในเรื่องที่พบได้บ่อย นั่นคือผมสับสนระหว่าง "ความเคลื่อนไหว" (activity) กับ "ความถูกต้อง" (correctness)
ประตูตรวจจับสามารถทำงานอย่างหนักและผิดพลาดอย่างมหันต์ได้ในเวลาเดียวกัน จำนวนการบล็อกที่สูงไม่ได้พิสูจน์ถึงคุณค่าของมัน แต่มันพิสูจน์แค่ว่าประตูนั้นกำลังทำงานอยู่เท่านั้น
นี่คือวิธีที่ผมเรียนรู้เพื่อตรวจสอบว่าประตูนั้นกำลังทำหน้าที่ของมันจริงๆ หรือไม่:
- ดูเหตุผลของการบล็อก ว่ามันตรวจพบข้อบกพร่อง (defects) จริงๆ หรือแค่ติดขัดกับรูปแบบผิวเผิน (surface patterns) เดิมๆ
- สังเกตการลองใหม่ (retries) ว่าการลองใหม่นั้นช่วยแก้ปัญหาที่แท้จริงได้หรือไม่ หรือโค้ดแค่เปลี่ยนรูปร่างเพื่อให้ผ่านประตูไปได้? หากโค้ดแค่เปลี่ยนรูปร่างโดยที่ไม่ได้พัฒนาขึ้น แสดงว่าตัวประตูนั้นแหละคือปัญหา
- ตรวจสอบผลลัพธ์สุดท้าย (final convergence) ว่างานนั้นสามารถผ่านไปได้ด้วยคุณภาพของมันเองหรือไม่? หากคุณต้องยอมลดมาตรฐานของประตูลงเพื่อให้งานผ่าน แสดงว่าประตูนั้นทำงานผิดพลาด
ประตูที่ทำงานได้ดีจะทำให้ระบบดีขึ้น แต่ประตูที่แย่จะทำให้ระบบต้องปรับตัวเข้าหาประตูแทน ผลลัพธ์ที่ได้คือคุณจะได้โค้ดที่ถูกเขียนขึ้นมาเพื่อเอาใจตัวตรวจสอบ (validator) มากกว่าจะเป็นโค้ดที่ดีจริงๆ
เลิกดูแค่จำนวนรวมทั้งหมดเสียที เพราะจำนวนรวมบอกเพียงแค่ "กิจกรรม" ที่เกิดขึ้น แต่การสุ่มตรวจตัวอย่าง (sample) ต่างหากที่จะบอก "ความจริง"
ลองสุ่มตรวจสอบ (audit) สิ่งที่ประตู, linter หรือ filter ของคุณบล็อกไว้ หากคุณทดสอบระบบป้องกันด้วย input ที่แย่เพียงอย่างเดียว คุณก็เหมือนกำลังถามคำถามที่ต้องการคำตอบที่น่าพึงพอใจเท่านั้น คุณต้องทดสอบด้วยว่าพวกมันยอมให้ input ที่ดีแต่มีรูปแบบไม่ปกติผ่านไปได้หรือไม่
คุณได้ลองสุ่มตรวจจำนวนการบล็อกของคุณบ้างไหม? และคุณตัดสินอย่างไรว่าการปฏิเสธนั้นสมเหตุสมผลแล้ว?
Source: https://dev.to/josephyeo/the-gate-fired-198-times-i-called-it-working-45fk
Optional learning community: https://t.me/GyaanSetuAi