21 คะแนน โดย xguru 2020-09-21 | 8 ความคิดเห็น | แชร์ทาง WhatsApp

"โค้ด Oracle Database 12.2 ที่มีขนาด 25 ล้านบรรทัด"

คำตอบจากอดีตพนักงาน Oracle ที่ไปตอบไว้ใน HN

"มันคือความสยองที่เกินจะจินตนาการได้ คุณไม่สามารถเขียนโค้ดได้แม้แต่บรรทัดเดียว ถ้ายังไม่ผ่านการทดสอบเดิม 1,000 รายการ

มีแมโครลึกลับที่ถ้าไม่ค่อย ๆ แกะด้วยการจดลงสมุดด้วยมือตัวเองก็ไม่มีทางเข้าใจ และการจะเข้าใจการทำงานของแมโครจริง ๆ ใช้เวลาประมาณ 1 ถึง 2 วัน

บางครั้งคุณต้องเข้าใจค่ากับผลกระทบของแฟล็ก 20 ตัว เพื่อคาดเดาว่าโค้ดจะทำงานอย่างไรในสถานการณ์ที่ต่างกัน

บางทีก็เกิน 100 ตัวด้วยซ้ำ ไม่ได้พูดเกินจริง

เหตุผลเดียวที่ผลิตภัณฑ์นี้ยังอยู่รอดและยังทำงานได้ ก็เพราะมีเทสต์นับล้านรายการอย่างแท้จริง"

ชีวิตของนักพัฒนา Oracle DB

  1. เริ่มทำงานกับบั๊กใหม่

  2. ใช้เวลา 2 สัปดาห์เพื่อทำความเข้าใจแฟล็ก 20 ตัวที่โต้ตอบกันอย่างลึกลับและเป็นต้นเหตุให้เกิดบั๊กนี้

  3. เพิ่มแฟล็กอีก 1 ตัวเพื่อรองรับสถานการณ์พิเศษใหม่ เขียนโค้ดเพิ่มอีกไม่กี่บรรทัดเพื่อตรวจสอบแฟล็กนี้ และเพิ่มโค้ดอีกไม่กี่บรรทัดเพื่อแก้สถานการณ์ปัญหาและป้องกันบั๊ก

  4. ส่งการเปลี่ยนแปลงโค้ดเข้า test farm ที่ประกอบด้วยเครื่อง 100~200 เครื่อง จากนั้นก็สร้าง Oracle DB ตัวใหม่และกระจายรันเทสต์นับล้านรายการ

  5. กลับบ้าน วันรุ่งขึ้นค่อยมาเริ่มงานอื่น เทสต์ต้องใช้เวลา 20~30 ชั่วโมงกว่าจะเสร็จ

  6. กลับบ้าน วันรุ่งขึ้นมาดูผลเทสต์ วันที่ดีก็จะมีเทสต์ล้มสักประมาณ 100 รายการ วันที่แย่ก็อาจล้มประมาณ 1,000 รายการ เลือกบางเทสต์จากพวกนี้มาดูว่า สมมติฐานของตัวเองผิดตรงไหน เป็นไปได้ว่าคงมีแฟล็กอีกประมาณ 10 ตัวที่ต้องเอามาพิจารณาเพื่อเข้าใจแก่นแท้ของบั๊ก

  7. เพิ่มแฟล็กอีกสองสามตัวเพื่อแก้ปัญหานี้ แล้วส่งเข้า test farm อีกรอบ จากนั้นก็รออีก 20~30 ชั่วโมง

  8. วนซ้ำแบบนี้อยู่ 2 สัปดาห์ เพื่อปรับให้การผสมกันของแฟล็กเหล่านี้ทำงานได้ดี

  9. ในที่สุด "วันดีวันหนึ่ง" เทสต์ทั้งหมดก็ไม่ล้มเหลวอีก

  10. เพิ่มเทสต์มากกว่าร้อยรายการสำหรับการเปลี่ยนแปลงที่ตัวเองทำไว้ เพื่อไม่ให้นักพัฒนาคนถัดไปที่โชคร้ายมาทำให้การแก้นี้พัง

  11. ส่งอีกครั้งเพื่อทดสอบรอบสุดท้าย แล้วส่งเพื่อรีวิว ซึ่งรีวิวอาจใช้เวลาอีก 2 สัปดาห์ถึง 2 เดือน ระหว่างนั้นก็ย้ายไปเริ่มทำบั๊กอื่น

  12. หลังจาก 2 สัปดาห์ถึง 2 เดือน เมื่อทุกอย่างจบลง โค้ดก็จะถูก merge เข้า main branch

นี่คือชีวิตของโปรแกรมเมอร์ Oracle ที่แก้บั๊ก ไม่ได้พูดเกินจริง

ลองจินตนาการดูว่านี่จะเป็นความสยองแค่ไหนถ้าต้องพัฒนาฟีเจอร์ใหม่

การพัฒนาฟีเจอร์เล็ก ๆ หนึ่งอย่างใช้เวลา 6 เดือนถึง 1 ปี บางครั้งก็ 2 ปีเลยทีเดียว (เช่น การเพิ่มการยืนยันตัวตนแบบใหม่อย่าง Active Directory)

การที่ผลิตภัณฑ์นี้ยังทำงานได้ถือเป็นปาฏิหาริย์

ตอนนี้ผมไม่ได้ทำงานที่ Oracle แล้ว และจะไม่กลับไปทำงานที่ Oracle อีกเด็ดขาด

8 ความคิดเห็น

 
neocoin 2020-09-28

โค้ดที่แย่ที่สุดที่คุณเคยเห็นจนถึงตอนนี้คืออะไร?

Test Cycle คือ

  1. Write Code

  2. Write Test

  3. Refactor Code , go to 1

แต่พอข้อ 1,2 ใช้เวลานานเกินไป สุดท้ายผลรวมก็คือข้อ 3 ถูกตกหล่นอยู่เรื่อย ๆ นั่นเอง

 
kunggom 2020-09-21

มาถึงตรงนี้ก็ขอกลับไปดูการบรรยายของ Martin Fowler อีกครั้ง ดูเหมือนว่า Oracle Database จะมี ‘คุณภาพภายใน’ (Internal Quality) ที่ไม่ค่อยดีนัก

https://th.news.hada.io/topic?id=2752

 
kbumsik 2020-09-21

ถ้ามองจากมุมของ Oracle ก็เหมือนจะเป็นอะไรที่ดูปกติมาก ๆ และยิ่งทำให้รู้สึกเชื่อถือได้ด้วยซ้ำว่า ซอฟต์แวร์นั้นสมกับเป็นสำหรับองค์กรจริง ๆ...

แต่ก็เหมือนในบทความนั้นแหละ ฉันคงไม่อยากทำงานที่นั่น

 
exitmusic 2020-09-21

ผมกลับรู้สึกว่าเป็นเพราะวัฒนธรรมการพัฒนาแบบยึดการทดสอบเป็นศูนย์กลางต่างหาก ที่ทำให้กระบวนการพัฒนาพังไปหรือเปล่า

เหมือนพัฒนากันแบบว่า ไม่ว่าจะทำทางไหน ขอแค่ผ่านเทสต์ก็พอ... ถ้าเป็นสภาพแวดล้อมแบบนั้น ก็คงไม่ต้องหวังเรื่องรีแฟกเตอร์ริงเลยครับ

 
sduck4 2020-09-22

แทนที่จะเป็นปัญหาเรื่องการทดสอบ ผมว่าปัญหาด้านการออกแบบที่ทำให้ต้องคำนึงถึงแฟลก 20~100 ตัวเพื่อแก้ไข/เพิ่มฟีเจอร์ น่าจะใหญ่กว่านะครับ?

แม้ก็ดูเหมือนว่าจะเลี่ยงไม่ได้เพราะความซับซ้อนของ DBMS ก็ตาม

 
kunggom 2020-09-21

เพราะท้ายที่สุดแล้ว แม้แต่เทสต์ก็เป็นโค้ดที่นักพัฒนาต้องเขียนเองเหมือนกัน พอนึกขึ้นมาได้เลยขอแนะนำบทความเกี่ยวกับการทดสอบสักชิ้นครับ

https://th.news.hada.io/topic?id=2883

 
ffdd270 2020-09-21

ถ้าโปรเจ็กต์ไม่ได้อยู่ในระดับนั้น การมีเทสต์น่าจะช่วยรับประกันได้อย่างต่อเนื่องว่า ต่อให้รื้อแก้อินเทอร์เฟซแล้วพฤติกรรมก็ยังเหมือนเดิม เลยทำให้กล้ารีแฟกเตอร์มากขึ้นเสียอีกครับ ช่วงนี้ผมกำลังทำอีมูเลเตอร์อยู่ และเพิ่งมีงานที่ต้องรื้อพารามิเตอร์จากค่า BYTE ให้เป็นค่า Enum นี่แหละครับ ถึงบิลด์จะผ่าน แต่เทสต์กลับล้มเหลว เลยได้คิดว่าถ้าไม่มีเทสต์จะทำยังไง คือตกใจอยู่เหมือนกันครับ

ถ้าเป็นโค้ดเบสระดับนั้น จะบอกว่าจะรีแฟกเตอร์ดีไหม... แค่คิดก็ท้อแล้ว เพราะมันใหญ่เกินไปจนสุดท้ายยอมแพ้ แล้วโค้ดก็ถูกพอกเพิ่มเข้าไปอีก... ผมเลยเดาอย่างระมัดระวังว่าอาจจะตกอยู่ในลูปไม่รู้จบแบบนั้นก็ได้ครับ

 
xguru 2020-09-21

ผมก็เข้าใจได้ว่าคนคนนั้นคงลำบากไม่น้อย

แต่ในอีกแง่หนึ่ง มันเป็นบทความที่ทำให้รู้สึกว่า "การทดสอบสำคัญได้ถึงขนาดนี้เลยสินะ" ก็เลยลองแปลดูครับ

ในโพสต์คำถามต้นฉบับของคำตอบนี้ มีคำตอบทั้งหมด 578 ข้อ

Ask HN: What's the largest amount of bad code you have ever seen work?

https://news.ycombinator.com/item?id=18442637

แค่อ่านเฉพาะคำตอบระดับ 1 ก็น่าสนุกแล้วครับ ทำให้รู้สึกว่าไม่ว่าคนจะอยู่ที่ไหน ชีวิตการทำงานก็คล้าย ๆ กัน