Bad Code ที่ใหญ่ที่สุดที่คุณเคยเห็นคืออะไร?
(news.ycombinator.com)"โค้ด Oracle Database 12.2 ที่มีขนาด 25 ล้านบรรทัด"
คำตอบจากอดีตพนักงาน Oracle ที่ไปตอบไว้ใน HN
"มันคือความสยองที่เกินจะจินตนาการได้ คุณไม่สามารถเขียนโค้ดได้แม้แต่บรรทัดเดียว ถ้ายังไม่ผ่านการทดสอบเดิม 1,000 รายการ
มีแมโครลึกลับที่ถ้าไม่ค่อย ๆ แกะด้วยการจดลงสมุดด้วยมือตัวเองก็ไม่มีทางเข้าใจ และการจะเข้าใจการทำงานของแมโครจริง ๆ ใช้เวลาประมาณ 1 ถึง 2 วัน
บางครั้งคุณต้องเข้าใจค่ากับผลกระทบของแฟล็ก 20 ตัว เพื่อคาดเดาว่าโค้ดจะทำงานอย่างไรในสถานการณ์ที่ต่างกัน
บางทีก็เกิน 100 ตัวด้วยซ้ำ ไม่ได้พูดเกินจริง
เหตุผลเดียวที่ผลิตภัณฑ์นี้ยังอยู่รอดและยังทำงานได้ ก็เพราะมีเทสต์นับล้านรายการอย่างแท้จริง"
ชีวิตของนักพัฒนา Oracle DB
-
เริ่มทำงานกับบั๊กใหม่
-
ใช้เวลา 2 สัปดาห์เพื่อทำความเข้าใจแฟล็ก 20 ตัวที่โต้ตอบกันอย่างลึกลับและเป็นต้นเหตุให้เกิดบั๊กนี้
-
เพิ่มแฟล็กอีก 1 ตัวเพื่อรองรับสถานการณ์พิเศษใหม่ เขียนโค้ดเพิ่มอีกไม่กี่บรรทัดเพื่อตรวจสอบแฟล็กนี้ และเพิ่มโค้ดอีกไม่กี่บรรทัดเพื่อแก้สถานการณ์ปัญหาและป้องกันบั๊ก
-
ส่งการเปลี่ยนแปลงโค้ดเข้า test farm ที่ประกอบด้วยเครื่อง 100~200 เครื่อง จากนั้นก็สร้าง Oracle DB ตัวใหม่และกระจายรันเทสต์นับล้านรายการ
-
กลับบ้าน วันรุ่งขึ้นค่อยมาเริ่มงานอื่น เทสต์ต้องใช้เวลา 20~30 ชั่วโมงกว่าจะเสร็จ
-
กลับบ้าน วันรุ่งขึ้นมาดูผลเทสต์ วันที่ดีก็จะมีเทสต์ล้มสักประมาณ 100 รายการ วันที่แย่ก็อาจล้มประมาณ 1,000 รายการ เลือกบางเทสต์จากพวกนี้มาดูว่า สมมติฐานของตัวเองผิดตรงไหน เป็นไปได้ว่าคงมีแฟล็กอีกประมาณ 10 ตัวที่ต้องเอามาพิจารณาเพื่อเข้าใจแก่นแท้ของบั๊ก
-
เพิ่มแฟล็กอีกสองสามตัวเพื่อแก้ปัญหานี้ แล้วส่งเข้า test farm อีกรอบ จากนั้นก็รออีก 20~30 ชั่วโมง
-
วนซ้ำแบบนี้อยู่ 2 สัปดาห์ เพื่อปรับให้การผสมกันของแฟล็กเหล่านี้ทำงานได้ดี
-
ในที่สุด "วันดีวันหนึ่ง" เทสต์ทั้งหมดก็ไม่ล้มเหลวอีก
-
เพิ่มเทสต์มากกว่าร้อยรายการสำหรับการเปลี่ยนแปลงที่ตัวเองทำไว้ เพื่อไม่ให้นักพัฒนาคนถัดไปที่โชคร้ายมาทำให้การแก้นี้พัง
-
ส่งอีกครั้งเพื่อทดสอบรอบสุดท้าย แล้วส่งเพื่อรีวิว ซึ่งรีวิวอาจใช้เวลาอีก 2 สัปดาห์ถึง 2 เดือน ระหว่างนั้นก็ย้ายไปเริ่มทำบั๊กอื่น
-
หลังจาก 2 สัปดาห์ถึง 2 เดือน เมื่อทุกอย่างจบลง โค้ดก็จะถูก merge เข้า main branch
นี่คือชีวิตของโปรแกรมเมอร์ Oracle ที่แก้บั๊ก ไม่ได้พูดเกินจริง
ลองจินตนาการดูว่านี่จะเป็นความสยองแค่ไหนถ้าต้องพัฒนาฟีเจอร์ใหม่
การพัฒนาฟีเจอร์เล็ก ๆ หนึ่งอย่างใช้เวลา 6 เดือนถึง 1 ปี บางครั้งก็ 2 ปีเลยทีเดียว (เช่น การเพิ่มการยืนยันตัวตนแบบใหม่อย่าง Active Directory)
การที่ผลิตภัณฑ์นี้ยังทำงานได้ถือเป็นปาฏิหาริย์
ตอนนี้ผมไม่ได้ทำงานที่ Oracle แล้ว และจะไม่กลับไปทำงานที่ Oracle อีกเด็ดขาด
8 ความคิดเห็น
โค้ดที่แย่ที่สุดที่คุณเคยเห็นจนถึงตอนนี้คืออะไร?
Test Cycle คือ
Write Code
Write Test
Refactor Code , go to 1
แต่พอข้อ 1,2 ใช้เวลานานเกินไป สุดท้ายผลรวมก็คือข้อ 3 ถูกตกหล่นอยู่เรื่อย ๆ นั่นเอง
มาถึงตรงนี้ก็ขอกลับไปดูการบรรยายของ Martin Fowler อีกครั้ง ดูเหมือนว่า Oracle Database จะมี ‘คุณภาพภายใน’ (Internal Quality) ที่ไม่ค่อยดีนัก
https://th.news.hada.io/topic?id=2752
ถ้ามองจากมุมของ Oracle ก็เหมือนจะเป็นอะไรที่ดูปกติมาก ๆ และยิ่งทำให้รู้สึกเชื่อถือได้ด้วยซ้ำว่า ซอฟต์แวร์นั้นสมกับเป็นสำหรับองค์กรจริง ๆ...
แต่ก็เหมือนในบทความนั้นแหละ ฉันคงไม่อยากทำงานที่นั่น
ผมกลับรู้สึกว่าเป็นเพราะวัฒนธรรมการพัฒนาแบบยึดการทดสอบเป็นศูนย์กลางต่างหาก ที่ทำให้กระบวนการพัฒนาพังไปหรือเปล่า
เหมือนพัฒนากันแบบว่า ไม่ว่าจะทำทางไหน ขอแค่ผ่านเทสต์ก็พอ... ถ้าเป็นสภาพแวดล้อมแบบนั้น ก็คงไม่ต้องหวังเรื่องรีแฟกเตอร์ริงเลยครับ
แทนที่จะเป็นปัญหาเรื่องการทดสอบ ผมว่าปัญหาด้านการออกแบบที่ทำให้ต้องคำนึงถึงแฟลก 20~100 ตัวเพื่อแก้ไข/เพิ่มฟีเจอร์ น่าจะใหญ่กว่านะครับ?
แม้ก็ดูเหมือนว่าจะเลี่ยงไม่ได้เพราะความซับซ้อนของ DBMS ก็ตาม
เพราะท้ายที่สุดแล้ว แม้แต่เทสต์ก็เป็นโค้ดที่นักพัฒนาต้องเขียนเองเหมือนกัน พอนึกขึ้นมาได้เลยขอแนะนำบทความเกี่ยวกับการทดสอบสักชิ้นครับ
https://th.news.hada.io/topic?id=2883
ถ้าโปรเจ็กต์ไม่ได้อยู่ในระดับนั้น การมีเทสต์น่าจะช่วยรับประกันได้อย่างต่อเนื่องว่า ต่อให้รื้อแก้อินเทอร์เฟซแล้วพฤติกรรมก็ยังเหมือนเดิม เลยทำให้กล้ารีแฟกเตอร์มากขึ้นเสียอีกครับ ช่วงนี้ผมกำลังทำอีมูเลเตอร์อยู่ และเพิ่งมีงานที่ต้องรื้อพารามิเตอร์จากค่า
BYTEให้เป็นค่าEnumนี่แหละครับ ถึงบิลด์จะผ่าน แต่เทสต์กลับล้มเหลว เลยได้คิดว่าถ้าไม่มีเทสต์จะทำยังไง คือตกใจอยู่เหมือนกันครับถ้าเป็นโค้ดเบสระดับนั้น จะบอกว่าจะรีแฟกเตอร์ดีไหม... แค่คิดก็ท้อแล้ว เพราะมันใหญ่เกินไปจนสุดท้ายยอมแพ้ แล้วโค้ดก็ถูกพอกเพิ่มเข้าไปอีก... ผมเลยเดาอย่างระมัดระวังว่าอาจจะตกอยู่ในลูปไม่รู้จบแบบนั้นก็ได้ครับ
ผมก็เข้าใจได้ว่าคนคนนั้นคงลำบากไม่น้อย
แต่ในอีกแง่หนึ่ง มันเป็นบทความที่ทำให้รู้สึกว่า "การทดสอบสำคัญได้ถึงขนาดนี้เลยสินะ" ก็เลยลองแปลดูครับ
ในโพสต์คำถามต้นฉบับของคำตอบนี้ มีคำตอบทั้งหมด 578 ข้อ
Ask HN: What's the largest amount of bad code you have ever seen work?
https://news.ycombinator.com/item?id=18442637
แค่อ่านเฉพาะคำตอบระดับ 1 ก็น่าสนุกแล้วครับ ทำให้รู้สึกว่าไม่ว่าคนจะอยู่ที่ไหน ชีวิตการทำงานก็คล้าย ๆ กัน