การ Crash ที่เกิดขึ้นใน Production นั้นมักต้องการการแยกข้อผิดพลาดภายใต้การควบคุม เมื่อการทดสอบในเครื่องหรือ Log ไม่สามารถระบุเส้นทางการทำงานที่ล้มเหลวได้
ผู้พัฒนาได้เปิดใช้งาน Zombie Objects, เพิ่ม exception และ symbolic breakpoints ตรวจสอบการเป็นเจ้าของ (ownership) ของอ็อบเจกต์ที่ได้รับผลกระทบ และตรวจสอบเส้นทางแบบ Asynchronous ที่เตรียมข้อมูลเหล่านั้น นอกจากนี้ยังได้ทำให้การทำงานแบบ UI มีความชัดเจนมากขึ้นด้วย async และ await และ MainActor isolation
แม้ว่าโค้ดต้นฉบับจะอยู่ภายใต้นโยบายของบริษัท ทำให้ไม่สามารถเปิดเผยข้อมูลเชิงลึกได้ แต่การอภิปรายในชุมชนนักพัฒนา เช่น Stack Overflow ก็ช่วยให้เห็นแนวทางในการแก้ไขปัญหาได้
การแก้ไขครั้งนี้ประสบความสำเร็จเมื่อลายเซ็นของ Production นั้นปรากฏขึ้นในอัตราที่เหมาะสม ซึ่งบ่งชี้ว่าปัญหาได้รับการแก้ไขอย่างมีนัยสำคัญแล้ว
บทเรียนสำคัญคือ Swift initializer อาจดูปลอดภัย แต่ก็อาจซ่อนพฤติกรรมที่สืบทอดมาจาก Objective-C, Foundation, UIKit หรือแพลตฟอร์มเก่าๆ ได้
การเผชิญหน้ากับข้อมูล Crash ที่ไม่สมบูรณ์, การไหลของโค้ดที่ไม่สามารถทำซ้ำได้, และข้อจำกัดด้านทรัพย์สินทางปัญญา ถือเป็นส่วนที่ยากที่สุดในการแก้ไขครั้งนี้
ศัพท์ที่ควรรู้
- Zombie Objects – เป็นเทคนิคการดีบักที่ช่วยในการตรวจจับการทำงานของอ็อบเจกต์ที่อาจถูกทำลายไปแล้ว
- Symbolic breakpoints – คือจุดหยุดการทำงานในโค้ดที่นักพัฒนาตั้งไว้เพื่อตรวจสอบสถานะของโปรแกรม
- Asynchronous paths – คือเส้นทางการทำงานของโค้ดที่ไม่ได้ทำงานแบบเรียลไทม์ ทำให้ต้องมีการจัดการลำดับการทำงาน
- MainActor isolation – คือการบังคับให้โค้ดที่เกี่ยวข้องกับส่วนติดต่อผู้ใช้ (UI) ต้องทำงานบนเธรดหลักของแอปพลิเคชัน
- Foundation, UIKit, WebKit – คือเฟรมเวิร์กพื้นฐานของ Apple ที่ใช้ในการสร้างแอปพลิเคชัน iOS
ที่มา: infoq.com