มีจำนวนมากของความคิดเห็นที่แข็งแกร่งโดยรอบการอภิปราย แต่จะเห็นได้ชัดนี้ไม่เป็นความจริงเรื่องของความคิดเห็นเป็นเรื่องของข้อเท็จจริง ดังนั้นเราควรจะมองไปที่การวิจัยเชิงประจักษ์ และหลักฐานจากที่ชัดเจน:
ใช่พิมพ์คงมีมูลค่าการค้าไม่ชอบ - และไม่เพียงแค่เล็กน้อย แต่ในความเป็นจริงอย่างมาก ในความเป็นจริงหลักฐานที่มั่นคงแสดงให้เห็นว่าการพิมพ์แบบคงที่สามารถลดจำนวนข้อบกพร่องในรหัสได้อย่างน้อย 15% (และนี่เป็นการประมาณการที่ต่ำ นั่นเป็นจำนวนที่สูงอย่างน่าตกใจ : ฉันคิดว่าแม้ผู้เสนอแบบคงที่ส่วนใหญ่คงไม่คิดว่ามันสร้างความแตกต่างอย่างมาก
ลองพิจารณาสิ่งนี้: ถ้ามีคนบอกคุณว่ามีวิธีง่ายๆในการลดข้อบกพร่องในโครงการของคุณ 15% ในชั่วข้ามคืนนั่นควรจะเป็นเรื่องที่ไม่ต้องคิดอะไร 1 เกือบจะเป็นกระสุนเงินสุภาษิต
มีการนำเสนอหลักฐานในกระดาษเพื่อพิมพ์หรือไม่พิมพ์: การตรวจหาปริมาณแมลงที่ตรวจพบได้ในจาวาสคริปต์โดย Zheng Gao, Christian Bird และ Earl T. Barr ฉันขอแนะนำให้ทุกคนอ่านมันเป็นบทความที่ดีที่นำเสนองานวิจัยที่เป็นแบบอย่าง
เป็นการยากที่จะสรุปรวบยอดว่าผู้เขียนทำการวิเคราะห์อย่างจริงจังเพียงใด แต่นี่เป็นโครงร่างที่หยาบ (หยาบมาก):
TypeScriptและFlowเป็นภาษาการเขียนโปรแกรมสองภาษาโดยยึดตามจาวาสคริปต์ซึ่งในขณะที่ยังคงใช้งานร่วมกันได้ให้เพิ่มการระบุประเภทและการตรวจสอบประเภทสแตติก ซึ่งอนุญาตให้เพิ่มรหัสที่มีอยู่ตามประเภทและจากนั้นให้พิมพ์ตรวจสอบ
นักวิจัยได้รวบรวมโครงการโอเพ่นซอร์สที่เขียนด้วย JavaScript จาก GitHub ดูรายงานข้อผิดพลาดที่ได้รับการแก้ไขและพยายามที่จะลดข้อผิดพลาดที่รายงานแต่ละรายการให้เป็นชิ้นส่วนของรหัสที่จะถูกตรวจจับโดยตัวตรวจสอบชนิดคงที่ของ สิ่งนี้ทำให้พวกเขาประมาณขอบเขตล่างของเปอร์เซ็นต์ของบั๊กสามารถแก้ไขได้โดยใช้การพิมพ์แบบสแตติก
นักวิจัยใช้ความระมัดระวังอย่างเข้มงวดเพื่อให้แน่ใจว่าการวิเคราะห์ของพวกเขาจะไม่พิจารณาข้อผิดพลาดที่เกี่ยวข้องกับประเภทที่ไม่เกี่ยวข้องกับประเภท 2
เปรียบเทียบกับการศึกษาที่ผ่านมาการศึกษาใหม่นี้มีจุดแข็งเฉพาะ:
- มีการเปรียบเทียบโดยตรงของการพิมพ์แบบสแตติกvsไดนามิกโดยมีปัจจัยรบกวนน้อย (ถ้ามี) เนื่องจากความแตกต่างเพียงอย่างเดียวระหว่าง JavaScript และ TypeScript / Flow คือการพิมพ์
- พวกเขาทำการจำลองแบบข้ามมิติต่าง ๆ โดยการตรวจสอบทั้ง TypeScript และ Flow (เช่นระบบประเภทที่แตกต่างกัน) และโดยให้คนอื่นสร้างคำอธิบายประกอบประเภท (ด้วยตนเอง) เพื่อแก้ไขข้อบกพร่อง และพวกเขาทำสิ่งนี้กับฐานรหัสจำนวนมากจากโครงการที่แตกต่างกัน
- กระดาษวัดผลกระทบโดยตรงจากการพิมพ์แบบคงที่ในข้อบกพร่องที่แก้ไขได้ (มากกว่าคุณภาพที่คลุมเครือมากขึ้น)
- ผู้เขียนกำหนดรูปแบบที่เข้มงวดของสิ่งที่จะวัดและวิธีการล่วงหน้า นอกจากนี้คำอธิบายของพวกเขายังชัดเจนอย่างไม่น่าเชื่อและทำให้ง่ายต่อการวิเคราะห์ข้อบกพร่อง (ดีเสมอเมื่อรายงานการวิจัยเปิดตัวขึ้นมาเพื่อโจมตี: หากไม่มีการโจมตีใดที่จัดการกับข้อโต้แย้ง 3
- พวกเขาทำการวิเคราะห์พลังงานที่เหมาะสมเพื่อให้ขนาดตัวอย่างของพวกเขาเพียงพอและการวิเคราะห์ทางสถิติที่ตามมาของพวกเขาคือสุญญากาศ
- พวกมันมีความอนุรักษ์นิยมมากเกินไปที่จะไม่รวมคำอธิบายที่สับสนและวัดได้เพียงส่วนเดียวที่เคลื่อนไหว นอกจากนี้พวกเขายัง จำกัด การวิเคราะห์ข้อบกพร่องที่สามารถแก้ไขได้ทันทีโดยรวมถึงประเภทและแยกสิ่งที่อาจต้องมีการปรับโครงสร้างขั้นสูงเพิ่มเติมเพื่อรองรับการพิมพ์ ดังนั้นในความเป็นจริงเอฟเฟกต์น่าจะใหญ่กว่ามาก แต่แน่นอนไม่น้อยไปกว่าที่พวกเขารายงาน
- และในที่สุดพวกเขาไม่พบผลกระทบเล็กน้อย แต่มีความแตกต่างที่น่าทึ่ง แม้จะมีขั้นตอนที่อนุรักษ์นิยมมากเกินไปแม้ในช่วงท้ายสุดของช่วงความมั่นใจ 95% พวกเขาพบว่ามีข้อผิดพลาดอย่างน้อย 10% ที่จะหายไปเมื่อมีการตรวจสอบประเภทเพิ่มน้อยที่สุด
หากไม่มีข้อบกพร่องพื้นฐานในกระดาษที่ยังไม่มีใครค้นพบกระดาษจะสรุปได้อย่างชัดเจนว่ามีประโยชน์มากในการพิมพ์แบบสแตติกไม่มีค่าใช้จ่ายเลย 4
ในบันทึกประวัติศาสตร์การวิจัยเกี่ยวกับการพิมพ์สาขาวิชาในการเขียนโปรแกรมได้เริ่มต้นด้วยหินเพราะเป็นเวลานานหลักฐานไม่ชัดเจนเลย เหตุผลสำหรับสิ่งนี้คือการทำการทดลองอย่างเป็นระบบเพื่อตรวจสอบผลของการพิมพ์แบบคงที่และแบบไดนามิกไม่ใช่เรื่องง่าย: การทดสอบอย่างเป็นระบบจะต้องแยกเอฟเฟกต์ที่เรากำลังตรวจสอบ และน่าเสียดายที่เราไม่สามารถแยกเอฟเฟ็กต์ของวินัยการพิมพ์เนื่องจากมันเชื่อมโยงกับภาษาการเขียนโปรแกรม
จริงๆแล้วมีภาษาโปรแกรมที่อนุญาตให้พิมพ์ทั้งแบบคงที่และแบบไดนามิกในภาษาที่แตกต่างกัน (เช่น VB กับOption Strict
On
หรือOff
หรือพิมพ์ Lisp แบบคงที่) อย่างไรก็ตามสิ่งเหล่านี้ไม่เหมาะสำหรับการเปรียบเทียบโดยตรงสิ่งสำคัญที่สุดเนื่องจากไม่มีฐานรหัสขนาดใหญ่ที่มีอยู่เพียงพอที่สามารถทำการเปรียบเทียบโดยตรงได้ ที่ดีที่สุดเราสามารถเปรียบเทียบพวกเขาใน "การตั้งค่าห้องปฏิบัติการ" โดยที่ผู้ทดสอบจะทำการสุ่มแก้ปัญหาในภาษาที่แปรผันแบบคงที่หรือแบบไดนามิก
น่าเสียดายที่การมอบหมายการเขียนโปรแกรมประดิษฐ์เหล่านี้ไม่สามารถจำลองการใช้งานจริงได้ดี โดยเฉพาะอย่างยิ่งพวกเขาหลายคนมีขอบเขตขนาดเล็กและแก้ปัญหาที่กำหนดไว้อย่างดีซึ่งสามารถสรุปได้ในครึ่งหน้าของข้อความ
โชคดีที่ในอดีตนั้นเป็นเพราะ TypeScript, Flow และ JavaScript เป็นภาษาเดียวกันยกเว้นการพิมพ์แบบสแตติกและเนื่องจากมีชุดข้อมูลรหัสและข้อบกพร่องมากมายในโลกแห่งความเป็นจริง
1แรงบันดาลใจจากคำพูดจากกระดาษต้นฉบับ
2ฉันไม่มีความสุขกับสิ่งนี้อย่างใดอย่างหนึ่ง: จุดแข็งหลักอย่างหนึ่งของภาษาที่พิมพ์แบบคงที่คือปัญหาที่ไม่เกี่ยวข้องกับประเภทที่สามารถอธิบายได้ในรูปแบบที่สามารถตรวจสอบประเภทแบบคงที่ได้ แปลงข้อผิดพลาดตรรกะหลายชนิดเป็นข้อผิดพลาดซึ่งอย่างมากเพิ่มอัตราของบักที่สามารถจับโดยการพิมพ์แบบคงที่ ในความเป็นจริงกระดาษประมาณคร่าวๆประเภทข้อบกพร่องที่ไม่เกี่ยวข้องกับประเภทและฉันยืนยันว่าในความเป็นจริงส่วนใหญ่จะถูกจับโดยการพิมพ์แบบคงที่
3ฉันขอเชิญชวนทุกคนโดยเฉพาะอย่างยิ่งผู้สนับสนุนของการพิมพ์แบบไดนามิกเพื่อพยายามหาข้อบกพร่องที่ไม่ได้รับการแก้ไขในการวิเคราะห์ ฉันไม่คิดว่ามีจำนวนมาก (ถ้ามี) และฉันมั่นใจว่าไม่มีข้อบกพร่องที่เป็นไปได้ที่จะเปลี่ยนแปลงผลลัพธ์อย่างมีนัยสำคัญ
4ฉันสงสัยว่าค่าใช้จ่ายจริงของการพิมพ์สแตติกในโครงการจริงขนาดใหญ่นั้นไม่มีอยู่จริงเนื่องจากมันจะกลายเป็นส่วนหนึ่งของสถาปัตยกรรมและอาจทำให้การวางแผนง่ายขึ้น การแก้ไขข้อผิดพลาดประเภทคงที่ต้องใช้เวลา แต่น้อยกว่าข้อผิดพลาดที่ค้นพบในภายหลัง สิ่งนี้ได้รับการศึกษาเชิงประจักษ์อย่างกว้างขวางและเป็นที่รู้จักกันมานานหลายทศวรรษ (ดูเช่นรหัสเสร็จสมบูรณ์ )