ผู้นำทางความคิด

อนาคตของการสร้างแอป AI ขึ้นอยู่กับความปลอดภัยของประเภท

mm
เพิ่ม Unite.AI ลงในแหล่งข้อมูลที่คุณต้องการบน Google

โค้ดที่สร้างโดย AI อาจคอมไพล์ได้ แต่หากไม่มีการรักษาความปลอดภัยของประเภทที่เข้มงวด ความสำเร็จนั้นจะคงอยู่ได้ไม่นาน ความปลอดภัยของประเภทเป็นรางกั้นที่หยุดโค้ดที่อ่อนแอจากการเน่าเสียเป็นบั๊กและข้อผิดพลาดในการทำงานเมื่อระบบขยายขนาด

เราต้องเริ่มบังคับ AI ให้เข้าไปในประเภทที่เข้มงวดโดยให้ข้อมูลบริบทที่ถูกต้อง สั่งให้ AI ใช้ประเภทที่ถูกต้อง และตรวจสอบโค้ดของ AI อย่างเข้มงวด เพื่อให้ได้โค้ดที่มีคุณภาพและคงอยู่ได้นาน

ปัญหาแรงจูงใจ

AI ต้องการที่จะทำให้คุณพอใจ มันจะปรับให้เหมาะสมกับฟังก์ชันรางวัลที่ได้รับ และส่วนใหญ่ของเวลานั้นคือเพียง “คอมไพล์ได้หรือไม่” ซึ่งหมายความว่ามันจะหาทางลัดทุกวิธีเพื่อให้ได้เครื่องหมายถูกสีเขียว การลัดเหล่านั้นดูเหมือนดีในขณะคอมไพล์ แต่จะล้มเหลวในขณะทำงาน

นี่คือเหตุผลที่ AI ชอบ any หรือเลือกประเภทที่กว้าง เช่น string เมื่อประเภทที่เข้มงวดน้อยกว่า เช่น UUID คือสิ่งที่คาดหวัง โค้ดคอมไพล์ได้ แต่ความถูกต้องถูกประนีประนอมแล้ว และ AI ไม่จำสิ่งที่เขียนไปเมื่อไม่กี่ไฟล์ที่แล้ว ดังนั้นหากไม่มีการรักษาความปลอดภัยของประเภท โครงการจะล้มเหลวภายใต้น้ำหนักของความซับซ้อนเมื่อขนาดเพิ่มขึ้น

สองประเภทของข้อผิดพลาด

เมื่อ โค้ดที่สร้างโดย AI ทำงาน คุณมักจะเห็นสองประเภทของปัญหาความปลอดภัยของประเภท:

1. ข้อผิดพลาดในการคอมไพล์

  • สิ่งที่เกิดขึ้น: คอมไพล์เลอร์จับข้อผิดพลาดระหว่างประเภทที่ประกาศและค่าที่ส่งเข้ามา
  • วิธีการแก้ไขของมนุษย์: ตัดสินว่าผู้เรียกใช้หรือฟังก์ชันซิกเนเจอร์เป็นคนผิด (แปลง 42 เป็น string หรือเปลี่ยนฟังก์ชันซิกเนเจอร์ให้รับ number เป็นต้น)
  • วิธีการแก้ไขของ AI : เปลี่ยนประเภทของอาร์กิวเมนต์เป็น any ปัญหา “แก้ไข” แล้ว แต่คุณเพิ่งลบรางกั้นที่จะจับข้อผิดพลาดในอนาคต

2. ข้อผิดพลาดในการทำงาน

  • สิ่งที่เกิดขึ้น: คอมไพล์เลอร์คิดว่าทุกอย่างดี (มักเนื่องจากประเภทถูกลดความเข้มงวด) แต่ค่าจริงในขณะทำงานไม่ตรงกับความคาดหวัง
  • วิธีการแก้ไขของมนุษย์: ตรวจสอบตัวแปรย้อนกลับไปที่ต้นกำเนิด (เช่น API หรือการคิวรีฐานข้อมูล) และแก้ไขประเภทที่ขอบเขตเพื่อให้ข้อมูลมาเป็น string ที่เหมาะสม
  • วิธีการแก้ไขของ AI : ไม่มีข้อมูลบริบท AI จะเดา บางทีมันอาจห่อทุกอย่างด้วย String(…) หรือเพิ่มประเภทให้กว้างขึ้น ข้อผิดพลาดจะหายไปในจุดนี้ แต่ตรรกะจะถูกทำลาย Number ที่ตั้งใจไว้สำหรับเลขคณิตจะกลายเป็น string ไป

วงจรนี้ของข้อผิดพลาดในการทำงาน → AI “แก้ไข” → ประเภทที่ลดความเข้มงวดจะเพิ่มขึ้นอย่างรวดเร็ว ผลลัพธ์คือโค้ดเบสที่คอมไพล์ได้และไม่มีข้อผิดพลาดในการทำงาน แต่ไม่สามารถเชื่อถือได้ ลองนึกภาพระบบจัดตารางแพทย์ที่จัดการการเปลี่ยนงานของแพทย์โดยแอปพลิเคชัน ข้อผิดพลาดประเภทจะเกิดขึ้น: int สำหรับชั่วโมงถูกมองว่าเป็น string AI “แก้ไข” โดยการลดประเภทเป็น any โค้ดคอมไพล์ได้และข้อผิดพลาดหายไป แต่การคำนวณการเปลี่ยนงานจะล้มเหลวอย่างเงียบๆ ทำให้แพทย์ถูกจองซ้ำและทั้งปีกของโรงพยาบาลไม่มีการป้องกัน

ฐานข้อมูลคูณ

เมื่อคุณเชื่อมต่อกับฐานข้อมูล ข้อผิดพลาดจะเพิ่มขึ้นและต้นตอของมันจะยากต่อการตรวจสอบ SQL มีการกำหนดประเภทเนื่องจากเหตุผล

เมื่อ AI แปลงทุกอย่างเป็น string | any คุณจะสูญเสียการรับประกันเหล่านั้น:

  • การเขียนที่ไม่ดี: การแทรก “true” ลงในฟิลด์บูลีนจะคอมไพล์ได้ แต่ทำลายฐานข้อมูล
  • การอ่านข้อมูลที่ไม่ดี: คิวรี่ส่งคืน NULL แต่ AI คาดว่าจะเป็น string ทำให้เกิดข้อผิดพลาดในการทำงาน
  • ความสัมพันธ์ที่เสียหาย: หากคีย์สัมพันธ์ถูกคาดหวังเป็น UUID แต่ AI รับมันเป็น string และส่งค่าขยะโดยไม่ตั้งใจ การเข้าร่วมจะไม่ล้มเหลว แต่จะไม่มีข้อมูลกลับมา ทำให้ปัญหาหลบซ่อนจนกว่าจะปรากฏตัวในภายหลังในรูปแบบของผลลัพธ์ที่ไม่สอดคล้องกันหรือไม่สมบูรณ์..

นี่คือเหตุผลที่ทีมงานที่มีความรับผิดชอบใช้ภาษาที่มีการกำหนดประเภทและบังคับใช้ความปลอดภัยของประเภทตั้งแต่สคีมาจนถึง API หากคุณไม่ทำเช่นนั้น ฐานข้อมูลจะหยุดปกป้องคุณและปัญหาเชิงซ่อนเร้นจะเพิ่มขึ้น

ทำไมทีมงานที่มีความรับผิดชอบจึงบังคับใช้การกำหนดประเภทอย่างเข้มงวด

การกำหนดประเภทอย่างเข้มงวดไม่ใช่เรื่องของการชะลอการพัฒนา แต่เป็นเรื่องของการทำให้การขยายขนาดเป็นไปได้

ประเภท:

  • เข้ารหัสความตั้งใจลงในโค้ด
  • ทำให้การปรับเปลี่ยนโค้ดเป็นไปอย่างปลอดภัยและคาดการณ์ได้
  • จับข้อผิดพลาดทั้งประเภทก่อนที่จะเข้าสู่การผลิต
  • แสดงให้นักพัฒนาที่จะมาถึงในอนาคต (และ AI) วิธีการใช้ฟังก์ชันหรือวัตถุอย่างไร

หากไม่มีการรักษาความปลอดภัยของประเภท ความหละหลวมของโค้ด AI จะเพิ่มขึ้น แต่ด้วยมัน โค้ดที่ AI สร้างขึ้นจะเป็นโค้ดที่คุณสามารถเชื่อถือได้และขยายได้

วิธีบังคับ AI ให้เข้าไปในความปลอดภัยของประเภท

คุณต้องปฏิบัติต่อ AI เหมือนนักพัฒนาจูเนียร์ มีพรสวรรค์ แต่ไม่ระมัดระวังหากไม่มีการกำกับ

ให้ข้อมูลบริบทที่ถูกต้อง

ให้ AI มีインタ์เฟซและประเภทที่สามารถใช้ได้ ให้ตัวอย่างการใช้งาน และมีความคิดเห็นเกี่ยวกับวิธีการจัดโครงสร้างโค้ดที่ถูกต้อง

สั่งให้ AI ใช้ประเภทที่ถูกต้อง

บอก AI อย่างชัดเจนว่าไม่ควรใช้ any และไม่ควรอนุญาต unknown และให้แน่ใจว่าทุกเมธอด วัตถุ และตัวแปรมีการกำหนดประเภทอย่างชัดเจน คาดว่า AI จะมีปัญหาในการปฏิบัติตามคำสั่งเหล่านี้ (โดยเฉพาะในรอบแรก)

บังคับใช้ด้วยการตรวจสอบโค้ด

เหมือนกับการตรวจสอบโค้ดของนักพัฒนาจูเนียร์ คุณต้องตรวจสอบโค้ดของ AI ออกแบบกฎการตรวจสอบโค้ดแบบกำหนดเองที่กำหนดว่า “โค้ดที่ดี” คืออะไรสำหรับคุณ ส่งผลการตรวจสอบโค้ดที่ไม่ผ่านกลับไปยังโมเดลจนกว่ามันจะผ่าน อาจต้องใช้หลายรอบ แต่จะเปลี่ยนฟังก์ชันรางวัลให้คำนึงถึงความปลอดภัยของประเภท

ปรับปรุงด้วยการตรวจสอบ

ข้อผิดพลาดในการคอมไพล์ การบันทึกการทำงาน การทดสอบคลิกผ่าน แต่ละรอบบังคับให้ AI ต้องทำให้ประเภทเข้มงวดขึ้นและเข้าใกล้โค้ดที่มีคุณภาพการผลิต

วิธีการสร้างที่ดีกว่า

ฉันเรียนรู้ว่าการเสียสละความเร็วในการสร้างโค้ดเพื่อเพิ่มคุณภาพจ่ายออกมาในระยะยาว ซึ่งหมายถึงการต่อสู้เพื่อไม่มีการใช้ any และบังคับใช้กฎการตรวจสอบโค้ดและวงจรการให้ข้อมูลย้อนกลับอย่างเข้มงวดที่ AI ต้องผ่านก่อนที่จะเรียกโค้ดว่า “เสร็จสิ้น” มันใช้ความพยายามอย่างต่อเนื่อง แต่เป็นวิธีเดียวที่จะรักษาคุณภาพไม่ให้ลดลง

ฉันกล่าวถึงจุดสำคัญตั้งแต่แรก: เมื่อ AI เริ่มแก้ไขข้อผิดพลาดในการทำงานโดยการลดความเข้มงวดของประเภท คุณเข้าสู่วงจรที่เลวร้าย แต่สิ่งที่ตรงกันข้ามก็เป็นจริง: หากคุณบังคับ AI ให้เคารพความปลอดภัยของประเภทในทุก ๆ รอบ คุณจะสร้างวงจรที่ดี แต่ละรอบจะทำให้โค้ดมีคุณภาพและความปลอดภัยเพิ่มขึ้น และคุณสามารถสร้างบนฐานนั้นได้

นี่คือระบบที่ฉันเชื่อว่าให้คุณภาพโค้ดที่คงอยู่ได้ แต่ละรอบการปรับปรุงมีจุดมุ่งหมายเพื่อเพิ่มมาตรฐาน ไม่ลดลง มันเป็นเหตุผลเดียวกับที่ทีมงานวิศวกรรมที่ดีที่สุดเลือกภาษาที่มีการกำหนดประเภทเข้มงวด ความปลอดภัยของประเภทเป็นรางกั้นพื้นฐานสำหรับการบำรุงรักษา และการปล่อยให้ AI ละเลยสิ่งนั้นรับประกันว่าแอปของคุณจะไม่ถึงระดับการผลิต

แบรด เอกเคิร์ต เป็นนักประกอบการและผู้นำด้านวิศวกรรมที่มีประสบการณ์มากกว่าหนึ่งทศวรรษในการพัฒนาผลิตภัณฑ์ตั้งแต่ขั้นตอนความคิดไปจนถึงการส่งมอบลูกค้าและอื่นๆ เขาเป็นนักศึกษาที่จบจาก MIT และปัจจุบันเป็นหนึ่งในผู้ร่วมก่อตั้งและ CTO ของ Woz ซึ่งเป็นแพลตฟอร์ม AI ที่ได้รับการสนับสนุนจาก Y Combinator ซึ่งช่วยให้ใครๆ สามารถสร้างและขยายธุรกิจซอฟต์แวร์ได้โดยไม่ต้องมีการเขียนโค้ด