ความผิดพลาดกับ Mars Rover มูลค่า 500 ล้านดอลลาร์ของผม
(chrislewicki.com)- ในเดือนกุมภาพันธ์ 2003 ที่ห้องคลีนรูมของ JPL ยานสำรวจดาวอังคาร Spirit เหลือเวลาอีก 2 สัปดาห์ก่อนถูกส่งไปยังฐานปล่อย และความผิดพลาดในการต่อ break-out-box เพียงครั้งเดียวอาจทำลายยานอวกาศมูลค่า 500 ล้านดอลลาร์ได้
- Spirit และ Opportunity คือภารกิจยานสำรวจดาวอังคารฝาแฝดของ NASA ที่ใช้งบเกือบ 1 พันล้านดอลลาร์ และแทบไม่มีเวลาเผื่อสำหรับซ่อมความเสียหายใหญ่ตามกำหนดการ
- ทันทีหลังพัลส์ไฟฟ้าไหลเข้าไปทางฝั่งยานอวกาศแทนที่จะเป็นมอเตอร์ เทเลเมทรีก็ขาดหายไป แต่ยังไม่สามารถยืนยันได้ทันทีว่ามีความเสียหายหรือสาเหตุคืออะไร
- วันถัดมามีการยืนยันว่าการสูญเสียเทเลเมทรีเกิดจากการถอดสายวัดของ Fluke 87III multimeter และประเด็น surge จริงยังคงถูกวิเคราะห์ในช่อง H-Bridge motor driver
- หลังการวิเคราะห์หลายสัปดาห์ โครงการตัดสินให้ฮาร์ดแวร์ Use As Is แก้ไขขั้นตอนการทำงาน แล้วทดสอบแบบเดิมต่อไป และมอเตอร์ตัวดังกล่าวของ Spirit ก็ทำงานได้ตามปกติบนดาวอังคาร
อุบัติเหตุระหว่างการทดสอบบน Spirit ก่อนปล่อยไม่นาน
- ในเดือนกุมภาพันธ์ 2003 ที่คลีนรูม Building 179 High Bay 1 ของ NASA JPL ยานสำรวจดาวอังคาร Spirit เหลือเวลาอีกเพียง 2 สัปดาห์ก่อนถูกขนส่งไป Cape Canaveral
- Spirit และ Opportunity เป็นภารกิจยานสำรวจดาวอังคารฝาแฝด และในเวลานั้นเป็นยานอวกาศที่ซับซ้อนซึ่ง NASA ลงทุนไปเกือบ 1 พันล้านดอลลาร์
- ในขั้นตอนประกอบและทดสอบ จำเป็นต้องทดสอบทุกระบบอย่างละเอียดและยืนยันว่าทำงานปกติก่อนปิดยานเป็นครั้งสุดท้ายบนโลก
- ยานทั้งสองลำมี brushed-type motor 62 ตัว
- ขับเคลื่อนและบังคับเลี้ยวล้อ
- ควบคุมแขนกล
- เล็งกล้อง
- หันทิศเสาอากาศไปทางโลก
- กลไกกางและคลี่ตัวหลังลงจอด
- คืนนั้นอุปกรณ์ที่ทดสอบคือมอเตอร์ RAT-Revolve ภายใน Rock Abrasion Tool(RAT) ที่ปลายแขนกลของ Spirit
- มอเตอร์ RAT-Revolve ทำหน้าที่หมุน grinder และ brush บนหินดาวอังคาร
ขั้นตอนตรวจสอบสถานะมอเตอร์ด้วยสัญญาณไฟฟ้า
- การถอดมอเตอร์ออกมาตรวจภายในหลังการทดสอบสภาพแวดล้อมทุกครั้งไม่ใช่วิธีที่ใช้งานได้จริง
- จึงแยกมอเตอร์ออกจากยานอวกาศ แล้วต่อเข้ากับแหล่งจ่ายไฟภายนอกและ strip chart recorder เพื่อตรวจสอบสมรรถนะทางไฟฟ้า
- มอเตอร์ปกติจะมีกระแสลดลงอย่างราบรื่นเป็นรูปเอ็กซ์โพเนนเชียลระหว่าง spin-up และหากมีความผิดปกติจะมี blip ปรากฏในสัญญาณ
- การทดสอบใช้ break-out-box และหากต่อผิด กระแสขนาดใหญ่สามารถไหลไปผิดที่และสร้างความเสียหายร้ายแรงได้
- ในการตรวจสอบล่วงหน้า มีการยืนยันแล้วว่าอินเทอร์เฟซการเชื่อมต่อ การตั้งค่าแหล่งจ่ายไฟ การตั้งค่า strip chart และพัลส์ทดสอบสั้น ๆ กับมอเตอร์อ้างอิง ล้วนถูกต้อง
พัลส์ไฟฟ้าที่ไหลเข้าไปผิดทิศทาง
- ทันทีที่จ่ายพลังงานให้มอเตอร์ RAT-Revolve สัญญาณบน strip chart แสดงรูปแบบที่ไม่คุ้นเคย และไม่เหมือนสัญญาณของมอเตอร์เสียตามปกติ
- เมื่อตรวจตามสาย จึงพบว่าเพราะ ความผิดพลาดของ break-out-box พัลส์ไฟฟ้าไม่ได้เข้าไปที่มอเตอร์ แต่ไหลย้อนเข้าไปทางฝั่งยานอวกาศซึ่งอยู่คนละด้านของอินเทอร์เฟซคอนเน็กเตอร์
- ขณะนั้น Spirit เหลือเวลาเพียง 2 สัปดาห์ก่อนขนย้ายเพื่อเตรียมปล่อย ดังนั้นถ้าเกิดปัญหาใหญ่ก็จะไม่มีเวลาฟื้นฟู
- เหตุการณ์ถูกแจ้งให้ Leo ซึ่งเป็น test conductor ทราบทันที และในเวลาเดียวกันก็ได้รับคำตอบว่าเทเลเมทรีจากยานอวกาศขาดหายไป
- ทีมจึงดำเนิน ขั้นตอนปิดฉุกเฉิน ทันที และได้รับคำสั่งให้ออกจากคลีนรูมเพื่อประเมินลำดับเหตุการณ์และความเสียหาย
การสูญเสียเทเลเมทรีและการประเมินเบื้องต้น
- ข้อเท็จจริงที่ยืนยันได้ทันทีหลังเหตุการณ์มีอยู่สองอย่าง
- มีพัลส์ไฟฟ้าขนาดใหญ่ไหลเข้าไปผิดจุดจากที่ตั้งใจ
- เทเลเมทรีของยานอวกาศหยุดทำงาน
- ความเชื่อมโยงระหว่างสองเหตุการณ์นี้ยังไม่ชัดเจนในทันที
- ทีมมองว่ามีความเป็นไปได้สูงที่ surge ไฟฟ้าจะเข้าไปในวงจร H-Bridge motor driver
- H-Bridge เป็นวงจรที่ใช้ควบคุมการไหลของกระแสไฟฟ้า
- และเป็นหนึ่งในส่วนที่ออกแบบให้ทนพลังงานเพิ่มจาก back-EMF บนยานสำรวจได้
- ยานอวกาศถูกปิดอยู่แล้ว และทีมตัดสินใจตรวจว่าปัญหาจะหายไปหรือไม่เมื่อจ่ายไฟกลับเข้าไปใหม่
- ใกล้เที่ยงคืน รายงานเหตุการณ์ได้ถูกส่งต่อไปถึงผู้จัดการโครงการ Pete และมีความเป็นไปได้ว่าต้องวางแผนใหม่สำหรับโครงการขนาดประมาณ 1,000 คน
การรีบูตที่ไม่สำเร็จและสาเหตุจริงที่พบในวันถัดมา
- มีการรันขั้นตอนจ่ายไฟให้ยานอวกาศตามมาตรฐานอีกครั้ง แต่หลังจากอุปกรณ์อิเล็กทรอนิกส์และซอฟต์แวร์เริ่มทำงานแล้ว เทเลเมทรีก็ยังไม่กลับมา
- ที่ rack ของ ground support equipment มีไฟสีแดงที่ติดขึ้นเมื่อได้รับพัลส์ในแต่ละ clock cycle และทำหน้าที่เหมือนการเต้นของหัวใจของหุ่นยนต์ที่ความถี่ 8 ครั้งต่อวินาที
- แหล่งจ่ายไฟแสดงระดับแรงดันและการเปลี่ยนแปลงกระแสตามที่คุ้นเคย แต่ไฟแสดงสถานะไม่ติด และเทเลเมทรีก็ไม่ออกมา
- วันถัดมา ระหว่างทบทวนลำดับเหตุการณ์อีกครั้ง Fluke 87III digital multimeter กลายเป็นเบาะแสสำคัญ
- ระหว่างค้นหา multimeter ที่จำเป็นต่อการทดสอบในวันก่อน มีการถอดสายวัดของ multimeter ที่ดูเหมือนกำลังมอนิเตอร์ bus voltage ใกล้ยานอวกาศออก
- แท้จริงแล้ว multimeter เครื่องนี้กำลังทำให้วงจรไฟเลี้ยงเทเลเมทรีสำหรับการทดสอบภาคพื้นของยานอวกาศครบวงจร
- ทันทีที่ถอดสายวัด การเชื่อมต่อไฟเลี้ยงเทเลเมทรีก็ถูกตัด
Spirit ยังมีชีวิตอยู่ และฮาร์ดแวร์ถูกใช้งานต่อไปตามเดิม
- ทีมทำให้ multimeter กลับไปทำหน้าที่เดิม แล้วเปิดไฟให้ยานอวกาศอีกครั้ง
- เทเลเมทรีกลับมาทำงานอีกครั้ง และยืนยันได้ว่า Spirit ไม่ได้ตาย
- ความเสียหายจริงกินเวลาเพียงไม่กี่ชั่วโมง และการทดสอบก็กลับมาดำเนินต่อ
- หลังจากนั้นอีกหลายสัปดาห์ มีการวิเคราะห์ ช่อง H-Bridge ของมอเตอร์ RAT-Revolve และมีการอภิปรายเชิงลึกเกี่ยวกับความเป็นไปได้ของ thin-film demetallization
- ในที่สุดโครงการตัดสินให้ฮาร์ดแวร์ดังกล่าวเป็น Use As Is
- การเตรียมปล่อยยานดำเนินต่อไป และหลังจาก Spirit ไปถึงดาวอังคาร มอเตอร์ RAT-Revolve ก็ทำงานได้ตามปกติ
วิธีรับมือกับประสบการณ์ความล้มเหลว
- เหตุการณ์นี้นำไปสู่ความเชื่อว่าการแบ่งปันประสบการณ์ความล้มเหลวสามารถเป็นบทเรียนได้ทั้งต่อผู้เล่าและผู้ฟัง
- ที่ Planetary Resources มีการขอให้ผู้สมัครแบ่งปัน failure story ของตนเองในกระบวนการรับสมัครและวัฒนธรรมทีม
- ระหว่างวิกฤต Ernie พูดไว้ว่า “ครั้งหน้าที่ต้องอนุมัติว่าอะไรสักอย่างโอเค ให้จำความรู้สึกนี้ไว้”
- หลังเหตุการณ์ บางคนมองว่าควรหยุดการทดสอบที่เสี่ยงอันตราย แต่เพราะความสำคัญของการยืนยันว่าสามารถให้มอเตอร์ทำงานได้ตามปกติบนดาวอังคาร การทดสอบจึงดำเนินต่อ
- ผู้จัดการโครงการ Pete ให้คนเดิมเป็นผู้นำการทดสอบต่อ โดยตัดสินในทำนองว่า “เราได้จ่ายค่าเล่าเรียนของเขาไปแล้ว และเขาคือคนที่มีโอกาสน้อยที่สุดที่จะทำผิดพลาดแบบนี้ซ้ำอีก”
- หลังจากนั้นได้มีการแก้ไขขั้นตอนเพื่อไม่ให้เกิดความผิดพลาดเดิมซ้ำ และทำการทดสอบแบบเดียวกันนี้ซ้ำอีกหลายครั้ง
- ประสบการณ์นี้กลายเป็นจุดอ้างอิงที่ทำให้นึกถึงความกลัวและความเสียใจในตอนนั้นทุกครั้งที่ต้องให้การอนุมัติหรือรับรองสิ่งสำคัญ
1 ความคิดเห็น
ความเห็นจาก Hacker News
เขียนได้ดีมาก
ในฐานะวิศวกรซอฟต์แวร์ มันทำให้นึกถึงเหตุการณ์คล้ายกันที่เจอช่วงต้นอาชีพจนถึงทุกวันนี้ ราว 10 ปีก่อนตอนเป็นที่ปรึกษาให้ลูกค้ารายหนึ่ง ผมใช้เวลาหลายเดือนทำเวอร์ชันใหม่ของเว็บเซอร์วิสของพวกเขา และรับหน้าที่ deploy ในวันเปิดตัว ตอนนั้นขั้นตอนพัฒนาและ deploy เกือบทั้งหมดเป็นงานทำมือ ผมทำส่วนที่พอทำอัตโนมัติได้ด้วยสคริปต์และ SQL แล้วพอกด Enter เพื่อรันการทดสอบสุดท้ายก่อน deploy ก็เพิ่งนึกได้ว่าผมเพิ่งสลับไปใช้ credentials ของ production
พอ error เริ่มกองและบริการไม่ตอบสนอง ผมมั่นใจว่าเผลอลบฐานข้อมูลไปแล้ว แต่โชคดีที่ไม่กี่ชั่วโมงก่อนหน้านั้นมีคนเพิ่งทำแบ็กอัปไว้รับการเปิดตัว จึงกู้กลับมาได้เกือบทั้งหมด หลังจากนั้นเวลาต้องแตะฐานข้อมูลหรือระบบ production คำว่า ระวัง ยังไม่พอด้วยซ้ำ และผมก็ตั้งใจว่าจะไม่ให้เกิดแบบนั้นอีก
test suite จะลบแล้วสร้างตารางใหม่ หรือไม่ก็ล้างตารางระหว่างรัน วันหนึ่งหัวหน้าทีม dev เข้าไปไล่แก้บั๊กบน production DB แล้วรัน
make testต่อทันที โค้ดทดสอบเลยตาม environment variables เดิมและไปต่อ production แทน Docker จากนั้นก็กระหน่ำลบและสร้างตาราง production เหล่านั้นใหม่หลายสิบรอบโชคดีที่แต่ละไซต์ลูกค้ามี local DB ที่ซิงก์กับ DB กลาง ทำให้ตัวผลิตภัณฑ์ยังทำงานได้แม้การเชื่อมต่อจะขาด เขาเลยทำงานหนักอยู่ 3-4 วัน เอาแบ็กอัปเก่ามาผสมกับข้อมูลจากลูกค้าเพื่อสร้าง master DB ขึ้นใหม่
อีก 1 วินาทีต่อมามันกลับมาหมด ที่จริงแค่ view รีเฟรชใหม่ UI แย่มากจริง ๆ
ผมเขียนคำสั่ง
UPDATEสั้น ๆ เพื่อเปลี่ยนข้อความการตลาดของสินค้า แต่ทันทีที่มันไม่จบทันที ผมก็รู้ว่าพังแล้ว เพราะผมอัปเดตทั้งชุดโดยไม่มีเงื่อนไข ทำให้คำอธิบายสินค้าหลายพันรายการถูกเปลี่ยนทั้งหมด DBA ที่เข้าถึงแบ็กอัปได้อยู่คนละเขตเวลาและเลิกงานไปแล้ว ต้องโทรตามอยู่นานกว่าชั่วโมงถึงจะกู้กลับมาได้การแก้เร็ว ๆ ตอนเดินออกจากออฟฟิศกลายเป็นงานกู้สถานการณ์หลายชั่วโมง เพื่อนฝ่ายการตลาดขอโทษไม่หยุด แต่ความผิดเป็นของผมเอง ที่ลูกค้าไม่ว่าอะไรมากคงเพราะตอนนั้นเป็นวันศุกร์ 5 โมงเย็นก่อนสุดสัปดาห์วันหยุด
sudoก่อนกด Enter ต้องมี อีกคนหนึ่งช่วยตรวจคำสั่ง ก่อน อาจเอานโยบายหรือธรรมเนียมคล้ายกันไปใช้กับทุกอย่างที่ทำบน production ได้ประโยคที่นึกขึ้นมาได้คือ ถ้าเด็กฝึกงานลบฐานข้อมูล production นั่นไม่ใช่ เด็กฝึกงานที่แย่ แต่เป็น กระบวนการที่แย่
จะบอกว่าเป็นปัญหาของ process หรือของคนก็อาจตัดสินยาก เพราะเราคาดหวังจากพนักงานประจำมากกว่า แต่พอลองอินกับมุมของเขา ก็สัมผัสได้ถึงความหวาดกลัวและความเจ็บปวดในวินาทีที่เขารู้ว่าเกิดอะไรขึ้น รวมถึงความรู้สึกเหมือนเห็นแสงแห่งความหวังกลับมาอีกครั้งหลังความล้มเหลว ผมไม่เคยรับผิดชอบโปรเจกต์ที่คนจำนวนมากพึ่งพาขนาดนั้น
สำหรับผม ทุกคนคือฮีโร่
ในสาย postmortem ประโยคแรกคือ “เราจะไม่โทษคนที่สร้างธุรกรรมพวกนั้น มันเป็นความผิดพลาดโดยสุจริต ทีนี้มาคุยกันดีกว่าว่าทำไมนักพัฒนาถึงเรียก production trading API ได้โดยไม่ต้องยืนยันตัวตน”
ถ้าโทษแต่คน คนคนนั้นก็จะถูกไล่ออกและทั้งองค์กรก็อ่อนแอลง เหมือนคุณปล่อยคนเดียวที่ได้บทเรียนราคาแพงที่สุดออกไป ช่วงเดียวที่ควรเอาผิดกับตัวบุคคลคือเมื่อมีเจตนาจะก่ออันตราย ซึ่งกรณีนั้นกฎหมายอาจเข้ามาเกี่ยวข้องได้
หลายปีต่อมาตอนใกล้ลาออก ผมได้เปลี่ยนไซต์ที่เปราะบางและไม่น่าไว้ใจนั้นให้กลายเป็นระบบที่มี automated tests, แบ็กอัปหลายชั้น, ระบบ failover ข้ามหลายดาต้าเซ็นเตอร์, รวมถึงการฝึกและ onboarding นักพัฒนาใหม่ ตอนนั้นยังเป็นยุคแรก ๆ ของ AWS ยังไม่ใช่สมัยที่ deploy เว็บไซต์ production ได้ในคลิกเดียว
เพราะประสบการณ์นั้น ผมจึงได้เรียนรู้เรื่อง version control ที่เหมาะสม, development environment, Redis, sharding และ clustering, VM, replication ของ Postgres และ MySQL, wiki, monit, DNS, load balancer, reverse proxy และอีกมากมาย ก็เพราะไม่อยากทำเว็บไซต์ล่มอีกแล้ว
มันเป็นบริษัทเล็ก ๆ ที่จ้างเด็กมัธยมปลายไม่จบซึ่งพอมีประสบการณ์ WordPress อยู่บ้างด้วยค่าแรงชั่วโมงละ 15 ดอลลาร์ ให้มาดูแลเว็บไซต์ production แต่หลังความผิดพลาด พวกเขาไม่ไล่ผมออก กลับให้ทั้งอิสระและความไว้วางใจให้เรียนรู้หน้างานและปรับปรุงระบบ ซึ่งผมยังรู้สึกขอบคุณจนถึงทุกวันนี้
การมีกฎเยอะและ process ดีขึ้นไม่ได้แปลว่าดีเสมอไป บางครั้งระบบราชการก็ทำให้ NASA ที่ช้าอยู่แล้วช้าลงไปอีก ในภารกิจแบบที่ไม่เคยมีมาก่อน บางครั้งคุณก็ต้องพึ่งคนมากกว่า process และยอมรับความเสี่ยง
แปลว่ามีส่วนหนึ่งที่อยู่นอกเหนือความสามารถของผู้เขียนในการตัดสินใจ และเขาก็อาจถูกจดจำไปตลอดกาลว่าเป็นคนที่ทำรถสำรวจพังอย่างที่เขากลัวไม่ต่างกัน
เรื่องนี้เชื่อมโยงกับประสบการณ์ของผมมากเหมือนกัน ผมมักเลือกทำโปรเจกต์ที่ยากและเสี่ยงที่สุดในสายการบินขนาดใหญ่ และหนึ่งในนั้นคือการเร่งติดตั้ง ผู้ให้บริการชำระเงิน รายใหม่ให้กับเว็บไซต์ เว็บไซต์นั้นขายตั๋วมูลค่าหลายล้านยูโรต่อวัน
หลัง deploy ไปไม่กี่วินาที ผมพลาดความต่างระหว่าง environment ทดสอบกับ production และพบว่าตัวแปรสำคัญตัวหนึ่งว่างเปล่าใน production เป็นเรื่องที่น่าจะคาดได้ถ้าอ่านเอกสารและเตรียมตัวให้มากกว่านี้ ยอดขายหยุดสนิทและใจผมหายวาบ หลังขั้นตอน rollback อันยาวนาน การขายหยุดไปหลายชั่วโมง ลูกค้าโกรธกันมาก และความเสียหายสูงถึงหลายล้านยูโร
ผมดัก CEO ที่ลิฟต์แล้วบอกว่าเป็นความผิดของผมทั้งหมด และผมยอมรับผลทุกอย่างรวมถึงการถูกไล่ออก เขากลับหัวเราะแล้วตอบทำนองว่า “จะไล่คุณออกไปทำไม? เราเพิ่งจ่ายเงินหลายล้านเพื่อฝึกคุณนะ ตอนนี้คุณทำงานได้ดีกว่าเมื่อวานแล้ว” ประสบการณ์นี้หล่อหลอมผมในหลายด้าน รวมถึงทำให้เห็นภาวะผู้นำที่แท้จริง และหลังจากนั้นผมก็ปิดโปรเจกต์ความเสี่ยงสูงอีกหลายงานได้สำเร็จ
อินเทอร์เน็ตโดยรวมก็พังบ่อยเหมือนกัน ตอนจ่ายเงินช่วง Black Friday เว็บช็อปของ Nike ก็ error แล้วทางช่วยเหลือก็บอกประมาณว่า “ให้ใช้แอป”
ในความเป็นจริง ผมไม่คิดว่าเวลาระบบล่มจะถูกแปลงเป็นความสูญเสียทั้งหมดตรงๆ Twitter ยุคแรกๆ ก็ล่มบ่อยเพราะความนิยมและสถาปัตยกรรมของมัน แต่คนก็ไม่ได้เลิกใช้ Twitter
สำหรับบริการออนไลน์ การล่มไม่ใช่หายนะหรือจุดจบของบริษัทเสมอไป จะต่างออกไปถ้าเป็นอุปกรณ์อวกาศหรือซอฟต์แวร์ซื้อขายความถี่สูงที่อาจทำให้บริษัทล้มละลายได้ ซึ่งนั่นยิ่งต้องมีมาตรการควบคุมที่เข้มงวดกว่า ในทางทฤษฎีก็ใช่ แต่ในความจริง บางครั้งระบบในวงการอวกาศหรือการซื้อขายความถี่สูงกลับแย่กว่า CRUD เว็บเซอร์วิสหละหลวมที่อ้างว่าทำตามแนวปฏิบัติที่ดีซึ่งเรียนมาจากวงการเหล่านั้นเสียอีก
การ deploy ขึ้น production อาจต้องมีคนอีกคนที่ทำหน้าที่เหมือนนักบินผู้ช่วย คอยตรวจร่วมกันและมีสิทธิ์หยุด rollout ได้ พร้อมกับมีมาตรการป้องกันแบบ DevOps ทั่วไปประกอบกัน
คนที่รับงาน ความเสี่ยงสูง มักถูกประเมินค่าต่ำไป ผู้จัดการหลายคนชอบพนักงานที่เสถียรแต่ไม่สร้างคุณค่าอะไรเลย มากกว่าคนที่มีค่าคาดหวังเป็นบวกแต่มีความผันผวน
ผมทำงานในวงการทีวี เมื่อ 30 ปีก่อนในงานแรกที่สถานีโทรทัศน์ท้องถิ่นเล็กๆ ผมได้รับการฝึกเป็น tape operator สำหรับรายการข่าว ม้วนเทปออกอากาศถูกกองเป็นตั้งใหญ่ และมี VTR สำหรับ playback อยู่สี่เครื่อง หน้าที่ของผมคือใส่เทปแต่ละม้วนแล้วตั้งไปที่จุด preroll 1 วินาที
พอเทปเล่นจบและถึงเวลาต้องเอาออก มันง่ายมากที่จะเผลอกดปุ่ม eject ของ VTR ที่กำลังออกอากาศอยู่ตอนนั้น แทนที่จะเป็นเครื่องที่เพิ่งเล่นจบ คนที่ฝึกผมจะส่งเสียงเตือนดังๆ แบบกัดฟันสูดลมหายใจทุกครั้งที่เห็นผมเอื้อมมือไปที่ปุ่ม eject และเพราะเสียงนั้นผมจึงหยุดแล้วเช็กสองรอบสามรอบก่อนเอาเทปออก
มันน่ารำคาญมาก แต่ได้ผลในการฝึกให้ระวังตัวจริงๆ นโยบายของสถานีคือ ถ้าดึงเทประหว่างออกอากาศเป็นครั้งแรก จะถูกพักงานหนึ่งวันโดยไม่รับค่าจ้าง ครั้งที่สองคือติดภาคทัณฑ์ ครั้งที่สามคือไล่ออก เพื่อนร่วมงานบางคนตกงานและทำข่าวพังเพราะความสะเพร่าเรื้อรัง ต้องขอบคุณเทรนเนอร์ที่น่ารำคาญคนนั้น ผมเลยติดนิสัยตรวจแล้วตรวจอีก และไม่เคยดึงเทประหว่างออกอากาศเลย
เห็นด้วยว่าคนที่เคยทำพลาดแบบนั้น มักจะไม่ทำพลาดซ้ำอีก ดังนั้นการไล่คนที่ทำผิดพลาดทางเทคนิคและเห็นได้ชัดว่าทุกข์ใจมากออก มักเป็นการตัดสินใจที่ไม่ดี
แต่ผมไม่คิดว่านั่นคือบทเรียนที่ “แท้จริง” เมื่อพิจารณาเรื่องต้นทุนและความเสี่ยง บทเรียนคือชิ้นส่วนที่ถูกทดสอบด้วยไฟกระชากกำลังสูงควรมี ขั้วต่อทดสอบเฉพาะทาง ที่ใช้ร่วมกับชิ้นส่วนที่ควันขึ้นง่ายไม่ได้
นี่ไม่ใช่โปรเจ็กต์บนเบรดบอร์ดเล็ก ๆ แต่เป็นโปรเจ็กต์ขนาดมหึมาที่สร้างโดยผู้คนมากมายในหน่วยงานรัฐ ซึ่งขั้นตอนทางการทำให้เสียทั้งเวลาและเงิน และบางครั้งยังโดนล้ออีกด้วย ตรรกะว่า “ให้คนอายุ 28 ดูแลหุ่นยนต์มูลค่า 500 ล้านดอลลาร์ที่ถ้าพลาดอาจระเบิดได้” ฟังดูประหลาดมาก
โดยเฉพาะระหว่างการทดสอบ มักต้องจัดการกับสายเคเบิล ขั้วต่อ และวงจรแบบปรับแต่งที่ต่างจาก “การจัดวางปกติ” ผมคิดว่าบทเรียนคือ งานสำคัญควรใช้ หลัก 4-eyes ให้มากที่สุด คือให้คนหนึ่งทำ อีกคนตรวจทุกขั้นก่อนเดินหน้าต่อ วิธีนี้มีประสิทธิภาพมากในการจับ “ความผิดพลาดงี่เง่า” แบบในบทความ
อย่างไรก็ดี เพราะแรงกดดันด้านกำหนดการและปัจจัยอื่น ๆ ในทางปฏิบัติไม่อาจให้คนสองคนมาดูการทดสอบเดียวกันได้เสมอไป ดังนั้นความผิดพลาดแบบนี้จึงเกิดขึ้นได้ ต้องทำให้ทั้งระบบมีความทนทาน
ในงานคอมพิวติ้งก็มีงานคล้ายกันมากมาย เช่น การอัปเกรดหรือย้ายระบบที่ต้องทำกับฐานข้อมูล production หรือการตั้งค่าเราเตอร์เพียงครั้งเดียว บางครั้งต้นทุนในการสร้างระบบป้องกันสูงกว่าการระมัดระวังตั้งแต่แรก เราไม่อาจระวังได้สมบูรณ์แบบเสมอไป แต่เราก็สร้างระบบป้องกันได้ไม่สมบูรณ์แบบเสมอเช่นกัน และบางทีก็พลาดในทำนองเดียวกันเพราะไว้ใจระบบป้องกันที่มีข้อบกพร่อง
ในสถานการณ์ในเรื่องนี้ อาจควรมีคู่หูแบบฮาร์ดแวร์เวอร์ชันของ pair programming ที่มีหน้าที่เพียงตรวจสอบว่าทุกอย่างที่ผู้เขียนทำถูกต้อง ไม่ใช่ผู้ช่วยที่แบ่งบทบาทช่วยกันแบบ Mary แต่เป็นคนที่มีหน้าที่เดียวคือคอยตามดูและยืนยัน
ถ้าไฟเข้าไปที่สายข้อมูลของตัวควบคุมมอเตอร์ มีโอกาสสูงว่าจะมีอะไรไหม้ไปแล้ว จะตัดความเป็นไปได้เรื่องชนิดขั้วต่อที่ต่างกันออกไปไม่ได้ แต่ขั้วต่อสองตัวที่ถูกต่อผิดนั้นก็น่าจะถูกกำหนดให้เป็นชนิดเดียวกันจริง
โดยเฉพาะขั้วต่อ มักมีข้อกำหนดแบบอนุรักษนิยมมากมาย เช่น ต้องเป็นผลิตภัณฑ์ที่ผ่านการรับรองแล้ว ต้องมี derating เฉพาะ ระยะห่างขา และ backshell แบบต่อลงกราวด์ สุดท้ายจึงเหลือซีรีส์ขั้วต่อที่ใช้งานและเก็บสต็อกจริงแค่ไม่กี่แบบ และไม่ว่าทุ่มต้นทุนแค่ไหน ก็ไม่สมจริงที่จะทำให้ไม่มีส่วนซ้ำกันเลย โดยทั่วไปจึงมักพยายามทำให้สัญญาณแบบเดียวกันเป็นมาตรฐานเดียวกัน หรือพยายามทำให้แต่ละจุดไม่ซ้ำกันเท่าที่ทำได้
ตัวอย่างเช่น ขั้วต่อภายนอกยานอวกาศต้องใช้ขั้วต่อแบบซ็อกเก็ตเพื่อป้องกันการลัดวงจรระหว่างการหยิบจับ และ harness ตรงกลางจะไม่ถูกถอดออกเลย ทำให้ขั้วต่อแบบพินอาจมาต่อกันแบบสมมาตรได้ แล้วพอมีความจำเป็นต้องใช้ breakout box สำหรับการทดสอบ ก็เกิดโอกาสที่จะเสียบกล่องกลับด้าน
หรือ breakout box ด้านหนึ่งอาจเป็นขั้วต่อ 100 พิน แต่อีกด้านต้องต่อเข้ากับอุปกรณ์ทดสอบ 25 ชิ้น คุณก็ไม่มีขั้วต่ออีก 25 แบบให้เลือก และก็ไม่อาจบังคับข้อกำหนดเฉพาะกับอุปกรณ์ทดสอบทุกชิ้นได้
ทุกวันนี้ยานอวกาศกำลังค่อย ๆ เปลี่ยนไปใช้ไมโครคอนโทรลเลอร์ภายในเครื่องและระบบวินิจฉัยภายในมากขึ้น ทำให้อุปกรณ์ทดสอบแบบนี้สำหรับสัญญาณอนาล็อกทั้งหมดลดลง มอเตอร์เองถ้าเป็นปัจจุบันก็น่าจะเป็นแบบ brushless มากกว่า และน่าจะพึ่งข้อมูล telemetry จากไดรเวอร์มอเตอร์ระหว่างทดสอบและระหว่างบิน แทน breakout box แบบนี้
ขั้วต่อสำหรับงานอากาศยานอวกาศเองก็เริ่มปรับแต่งได้มากขึ้นตอนสั่งซื้อเหมือนในอุตสาหกรรมอื่น สามารถเพิ่ม key เพื่อให้ถึงจะมีขั้วต่อ “แบบเดียวกัน” 10 ตัว ก็เสียบได้เฉพาะตำแหน่งของตัวเอง ถึงอย่างนั้น การกำหนดให้อุปกรณ์ทดสอบทั้งหมดต้องคอนฟิกแบบนั้นก็ยังไม่สมจริงอยู่ดี
ขอเล่าเรื่องของตัวเองไว้เป็นบันทึกด้วย งานแรกหลังเรียนจบมหาวิทยาลัยของผมคือสตาร์ตอัปด้าน content marketing ที่ใช้ PHP กับ PerconaDB(MySQL) ผมไม่ได้มีประสบการณ์กับ PHP มากนัก แต่ก็มีความมั่นใจแบบเด็กจบใหม่ที่ไร้เหตุผล และเพราะหลังเรียนจบหางานไม่ได้อยู่ 6 เดือน ก็ยิ่งอยากสร้างความประทับใจที่ดี
ผมได้รับมอบหมายให้อัปเดต feature flag เพื่อเปิดฟีเจอร์ใหม่ให้ลูกค้าทุกราย ยกเว้นเฉพาะลูกค้าที่ต้องการปิดไว้อย่างชัดเจน โดย flag ถูกเก็บในฐานข้อมูลเป็นค่า 4 และ 5 แบบจำนวนเต็มภายในอาร์เรย์สตริง
เพื่อทำงานที่ต้องการ ผมใช้ฟังก์ชัน PHP array_reverse แต่เพราะไม่ได้อ่านเอกสาร จึงไม่รู้ว่าถ้าไม่มีอาร์กิวเมนต์ตัวที่สอง มันจะกลับเฉพาะค่า ไม่ใช่คีย์ ผลคือฐานข้อมูลพังในทางตรงกันข้ามกับสิ่งที่ต้องการเป๊ะ ๆ และที่แปลกคือมันผ่าน QA ด้วย
ผมมารู้ไม่กี่ชั่วโมงให้หลัง ตอนนั้นผมเดินทางไปกลับที่ทำงานเกือบ 3 ชั่วโมงต่อเที่ยว ดังนั้นตอนนั้นฝ่ายบริหารก็เข้ามาเกี่ยวข้องแล้ว แก้ได้ง่ายด้วยสคริปต์ย้อนกลับ แต่ก็ทำให้ปัญหาหลายอย่างโผล่มา เช่น QA และ ความล้มเหลวของการสำรองฐานข้อมูล
ผมยังจำได้และรู้สึกขอบคุณจนถึงตอนนี้ที่วันถัดมา lead architect เข้ามาบอกว่านี่เป็นความผิดพลาดแบบพิธีผ่านด่านของการทำงานกับ PHP และเขาเองก็เคยทำตอนต้นอาชีพเหมือนกัน สุดท้ายผมก็โดนไล่ออก และแม้มันจะช่วยให้ผมเติบโตในฐานะวิศวกร แต่ช่วงเวลานั้นกับอีกหลายสัปดาห์หลังจากนั้นก็ทำให้หมดกำลังใจไปมากจริง ๆ
array_reverseนั่นเลยเหรอเรื่องเขียนได้น่าติดตาม แต่ก็ชวนสับสนด้วย
ดูเหมือนว่าทีมนี้ไม่ได้พลาดแค่ครั้งเดียว แต่พลาดหลายครั้ง สิ่งที่ยังไม่ชัดคือผลลัพธ์นั้นสามารถทำให้ยานเสียหายจริงได้หรือไม่ หรือแค่ทำให้เสียเวลาและเกิดความสับสนกับสาเหตุที่ยานไม่ยอมเปิดเท่านั้น
ความผิดพลาดครั้งแรกคือไม่รู้ว่ามัลติมิเตอร์ไม่ได้แค่ทำการวัด แต่กำลัง ทำให้วงจรครบ อยู่ด้วย ฟังดูเหมือนการออกแบบที่แย่มาก และถ้าจำเป็นต้องทำแบบนั้นจริง ก็ไม่ควรแตะมัลติมิเตอร์นั้นเด็ดขาด นี่ไม่ใช่ความผิดของคนคนเดียว แต่เป็นปัญหาที่เกี่ยวข้องอย่างน้อยสองคน คนที่ดูแลพวกเขา และผู้รับผิดชอบที่ปล่อยให้มีระบบแบบนั้น
ความผิดพลาดครั้งที่สองอยู่ที่ฝั่ง breakout box พวกเขารายงานว่าส่งพลังงานผิดไปทางยาน และเมื่อยานไม่เปิดก็ตัดสินว่ากระแสไฟกระชากได้ทำให้ยานเสียหาย แต่จริง ๆ แล้วก็ไม่มั่นใจว่ากระแสไหลไปทางไหนและอะไรเสียหายบ้าง สุดท้ายก็สรุปผิด
เหตุผลที่ยานไม่เปิดคือก่อนเกิดเหตุพวกเขาได้ถอดมัลติมิเตอร์ออกจากวงจรไปแล้ว ประโยคที่บอกว่ามีการวิเคราะห์ช่อง H-bridge ของมอเตอร์ RAT-Revolve อยู่หลายสัปดาห์ รวมถึงการถกเรื่องความเป็นไปได้ของการ de-metallization ของฟิล์มบาง ก็ยังทำให้งงอยู่ว่าหมายถึงพวกเขาตัดสินว่ากระแสไฟกระชากที่ผิดพลาดอาจไหลเข้าช่องนั้นและทำให้เสียหายหรือไม่
ไฟฟ้าได้เข้าสู่วงจรนั้นจริง และตอนนั้นพวกเขากำลังพยายามประเมินว่ามันเสียหายหรือไม่ เพียงแต่มองว่า motor driver น่าจะไม่เสียหาย เพราะมันควรจะต้องทนต่อพลังงานที่ไหลย้อนกลับมาจากมอเตอร์ได้อยู่แล้ว
ในฐานะวิศวกรเครื่องกล/อากาศยาน ฉันหวังว่าเรื่องสยองที่สุดของฉันจะเป็นแค่การที่คอมพิวเตอร์หลักของโรเวอร์ไร้คนขับมูลค่า 500 ล้านดอลลาร์เกือบกลายเป็นก้อนอิฐ
ฉันเคยเป็นวิศวกรอาวุโสที่ทำ การอนุมัติความปลอดภัยวิกฤต สำหรับสิ่งที่บรรทุกชีวิตผู้คน ต้องรับมือกับความรู้สึกเวลาเห็นรูปชิ้นส่วนที่แตกหักหลังอุบัติเหตุร่วงตก แล้วคิดว่า “ถ้านั่นเป็นเพราะการคำนวณของฉันผิดล่ะ?”, “ถ้าเป็นเพราะรอยต่อที่ฉันออกแบบลื่นไถลล่ะ?”, “ถ้าเป็นเพราะขั้นตอนการทดสอบที่ไม่เหมาะสมในการพยากรณ์อายุความล้าจากการเร่งหรือรอยร้าวจากการกัดกร่อนภายใต้ความเค้นล่ะ?”, “ถ้าเป็นสิ่งที่หลุดรอดไปก่อนส่งมอบเพราะเร่งเอาเข้าสู่การผลิตล่ะ?”
การอ่านเรื่องราวความล้มเหลวในสายงานใกล้เคียงกันก็น่าสนใจอยู่ แต่เรื่องที่ถูกแชร์สาธารณะบน HN ทำให้ฉันรู้สึกว่า PTSD จากงานไม่ใช่เรื่องที่จะเอามาแข่งกัน สำหรับบางคนมันก็แค่ค่าบำบัดแพงกว่าเท่านั้น
ดีแล้วที่สามารถเอาพลังนั้นไปใช้ในทางที่ทำได้ดีขึ้น แต่ไม่ใช่ทุกคนจะตอบสนองต่อบาดแผลทางใจในแบบเดียวกัน และก็ไม่ง่ายที่จะเอาปฏิกิริยาแบบนั้นมาเปรียบเทียบกัน เช่น หากจะใช้เป็นคำถามในการรับสมัครงานก็รู้สึกว่ามีตัวแปรทางสังคมมากเกินไป
ต่อให้เป็นรายละเอียดที่กระบวนการจับไม่ได้ ก็ต้องมีใครสักคนที่รับผิดชอบในการออกแบบกระบวนการที่ดี แม้อาจมีหลายปัจจัย แต่ท้ายที่สุดก็ดูเหมือนจะมีคนที่ต้องรับผิดชอบโดยตรงอยู่ดี
พอมองในบริบทที่ความผิดพลาดส่วนบุคคลถูกทำให้เป็นของส่วนรวม เช่น วิศวกรรมซอฟต์แวร์หรือสังคมโดยรวม ก็เป็นประเด็นที่น่าสนใจ
ถ้าคุณมีความเห็นอกเห็นใจและไม่ได้ถือท่าทีว่า “หลังจากจรวดขึ้นไปแล้วมันจะตกที่ไหนไม่ใช่งานของแผนกฉัน” มันก็น่าจะหนักพอสมควร อยากให้มีกลุ่มสนับสนุนแบบเพื่อนช่วยเพื่อนสำหรับคนที่สร้างระบบความปลอดภัยวิกฤตหรือรับมือกับผลกระทบจากมัน บริษัทไม่ได้มีบริการให้คำปรึกษาที่ดีเสมอไป
สมาคมวิศวกรรมหรือองค์กรวิศวกรมืออาชีพอาจให้บริการแบบนี้จากค่าสมาชิกได้ แต่ก็น่าจะมีคนลังเลที่จะใช้เพราะกลัวเสียใบอนุญาตหรือคุณวุฒิรับรอง สมัยก่อนคนอาจไปเมาคุยระบายกับเพื่อนร่วมงานที่บาร์ แต่การพึ่งพาแอลกอฮอล์หรือการทำงานวันถัดไปแบบไม่พร้อมไม่ใช่เรื่องดี และวัฒนธรรมบาร์ก็ไม่เหมือนเดิมแล้ว
ทำให้นึกถึงเหตุการณ์ที่ดาวเทียม NOAA-N Prime ล้มคว่ำเพราะมีสลักเกลียวยึดกับแท่นทดสอบไม่เพียงพอ
สาเหตุรากฐาน หากจำไม่ผิดก็ช่วยแก้ไขได้ แต่คือ สลักเกลียวสำหรับการตรวจสอบด้วยรังสีเอกซ์ ที่ใช้ยึดดาวเทียมนั้นมีราคาแพงเกินไป จึงถูก “ยืมไป” ใช้กับโครงการอื่นและไม่ได้นำกลับมาคืน พอพลิกดาวเทียมในแนวนอน มันก็ร่วงลงพื้น และค่าซ่อมอยู่ที่ 135 ล้านดอลลาร์
https://en.m.wikipedia.org/wiki/NOAA-19
น่าสนใจที่ถ้าจัดเรียงตาม ลำดับเวลา ได้ดีกว่านี้ตั้งแต่แรก ก็น่าจะหลีกเลี่ยงความกังวลได้ หากมีการเปรียบเทียบการประทับเวลาของค่าที่อ่านได้จากการทดสอบกับการประทับเวลาสุดท้ายของระบบ telemetry ก็น่าจะรู้ได้ว่า telemetry ล้มเหลวไปแล้วตั้งแต่ก่อนเริ่มการทดสอบ
การใช้ถ้อยคำที่ไม่แม่นยำอย่าง "เหมือนว่า telemetry ของยานอวกาศจะหายไปทั้งหมดเมื่อกี้นี้" แทนการใช้การประทับเวลาที่แน่นอน ก็เป็นส่วนหนึ่งของสาเหตุเช่นกัน นี่เป็นบทเรียนว่าต้องตรวจสอบให้ชัดเจนว่าเหตุการณ์ต่าง ๆ ระหว่างอุบัติเหตุเชื่อมโยงกันอย่างไร เรามักเห็นสัญญาณสองอย่างที่ต่างกันแล้วสมมุติอย่างง่าย ๆ ว่ามีเหตุและผลในทิศทางหนึ่ง แต่ในความเป็นจริงอาจเป็นตรงกันข้ามก็ได้