มีใบเสนอราคาโดยAlan J. Perlisที่พูดว่า:
มีสองวิธีในการเขียนโปรแกรมที่ปราศจากข้อผิดพลาด เฉพาะอันที่สามเท่านั้น
ฉันเพิ่งได้ยินคำพูดนี้จากเพื่อนของฉันและไม่สามารถเข้าใจความหมายที่ลึกกว่านั้น
Perlis พูดถึงอะไรที่นี่?
มีใบเสนอราคาโดยAlan J. Perlisที่พูดว่า:
มีสองวิธีในการเขียนโปรแกรมที่ปราศจากข้อผิดพลาด เฉพาะอันที่สามเท่านั้น
ฉันเพิ่งได้ยินคำพูดนี้จากเพื่อนของฉันและไม่สามารถเข้าใจความหมายที่ลึกกว่านั้น
Perlis พูดถึงอะไรที่นี่?
คำตอบ:
หมายความว่าไม่มีโปรแกรมที่ปราศจากข้อผิดพลาด คำพูดที่ลึกซึ้งเกี่ยวกับวิธีการหลีกเลี่ยงข้อผิดพลาดที่มีข้อผิดพลาดนั้นเป็นเรื่องล้อเลียน
ไม่มีวิธีที่สาม
ไม่มีวิธีเขียนโปรแกรมที่ปราศจากข้อผิดพลาด
ฉันจะตอบด้วยคำพูดอื่น ...
เกมที่แปลก การย้ายที่ชนะเท่านั้นไม่สามารถเล่นได้
;-)
ในฐานะที่เป็นคำตอบอื่น ๆ อีกมากมายได้ชี้แล้วออกมีวิธีการเขียนโปรแกรมปราศจากข้อผิดพลาดใด ๆ
แต่สิ่งที่ฉันอยากจะชี้ให้เห็นก็คือธรรมชาติของเมตาที่มีศักยภาพของคำพูด มันเป็นข้อผิดพลาดนอกขอบเขต ในคำสั่งแรกเขากำหนดจักรวาลหรือ "รายการ" มีเพียงสองความเป็นไปได้หรือองค์ประกอบ แต่ในคำแถลงที่สองเขาอ้างถึงบุคคลที่สาม ซึ่งไร้สาระ! ผิดกฎหมายแม้แต่! องค์ประกอบที่สามที่กำหนดขอบเขตองค์ประกอบที่สองเป็นข้อผิดพลาด
ลึกซึ้งอย่างแท้จริงในการอ้างว่าสามารถที่จะแสดงให้เห็นถึงสาระสำคัญมากที่จะอ้างอิง
ซึ่งหมายความว่าโปรแกรมที่ไม่น่ารำคาญทั้งหมดจะมีข้อบกพร่อง มันเป็นวิธีที่ตลกที่จะบอกว่าไม่มีวิธีเขียนโปรแกรมที่ปราศจากข้อผิดพลาด
เป็นไปได้ที่จะเขียนโปรแกรมที่ปราศจากข้อผิดพลาดแม้กระทั่งโปรแกรมที่ไม่น่ารำคาญและยังพิสูจน์ว่าถูกต้อง พิจารณาตัวอย่างภาษาเช่น Coq, Epigram หรือ Agda ที่ทำสิ่งนี้
ลังเลปัญหากล่าวว่ามันเป็นไปไม่ได้ที่จะทำเช่นนี้สำหรับโปรแกรมทั่วไป
สิ่งนี้ทำให้ฉันนึกถึงเสื้อเนิร์ดที่ฉันเห็น: มีคน 10 ประเภทในโลกนี้ ผู้ที่รู้เลขฐานสองและผู้ที่ไม่รู้จัก
นอกจากนี้ยังอาจเล่นกับความจริงที่ว่าบางครั้งรายการมีการจัดทำดัชนี 0 $ var = array ('First', 'Second', 'Third'); และคุณสามารถเข้าถึงรายการนี้ได้เช่น: $ var [0] = 'First' $ var [1] = 'ที่สอง' $ var [2] = 'Third'
ดังนั้นดัชนีอาเรย์ตัวอักษร 2 ชี้ไปที่ดัชนี "สาม"
สิ่งนี้มีการอธิบายในคำอื่น ๆ แต่ไม่ชัดเจนเท่าที่ฉันคิดว่ามันควรจะเป็น หมายความว่าคุณจะลองทั้งสองวิธีพวกเขาจะมีข้อผิดพลาดและสุดท้ายคุณจะแก้ไขข้อบกพร่องของคุณและมีโปรแกรมที่ปราศจากข้อผิดพลาด เปรียบเทียบกับข้อความอ้างอิงอื่น:
วิธีเดียวสำหรับข้อผิดพลาดที่จะเกิดขึ้นในโปรแกรมคือการวางโดยผู้เขียน ไม่ทราบกลไกอื่น ๆ โปรแกรมไม่สามารถรับข้อบกพร่องด้วยการนั่งรอบ ๆ กับโปรแกรมบั๊กกี้อื่น ๆ - โรงงานฮาร์ลาน
(อีกวิธีหนึ่งคุณสามารถอ่านสิ่งนี้ได้ตามที่ปิแอร์พูด (ซึ่งฉันคิดว่ายืดออกได้) (วิธีที่สามซึ่งไม่มีอยู่ในโดเมนใช้งานได้) อย่างที่ฉันพูดมันยืดออก แต่จริง
นี่เป็นคำพูดเดียวกับที่พ่อของฉันใช้บอกฉันเมื่อฉันแก้ตัว คำพูดมีแนวโน้มที่จะเป็นเช่น: "มี 3 ด้านของเรื่องราวด้านของคุณด้านของคุณและด้านขวา / จริง / ถูกต้อง"
การใส่สิ่งนี้เข้ากับบริบทของการพัฒนา (และเป็นผู้ทดสอบซอฟต์แวร์โดยศ.) ฉันจะบอกว่าเนื่องจากมีหลายวิธีในการเขียนโค้ดบางอย่างที่ควรใช้กับ "มีการเข้ารหัส 3 ด้านรหัสของคุณรหัสของพวกเขาและ รหัสการปรับโครงสร้างใหม่ "
ฉันคิดว่าเป็นเพราะโปรแกรมเมอร์ / นักพัฒนามักจะ refactor เมื่อผลิตภัณฑ์มีเสถียรภาพซึ่งส่วนใหญ่สายเกินไป แต่ส่วนใหญ่ refactor ทำเพื่อปรับปรุงสิ่งที่คุณและเพื่อนไม่ได้ทำในครั้งแรก
หวังว่านี่จะช่วยได้
ฉันคิดว่าในทางเทคนิคแล้วคุณสามารถเขียนโปรแกรมที่ไม่ใช่ข้อผิดพลาดได้ฟรี แต่เนื่องจากปัญหา Halting มันเป็นไปไม่ได้ที่จะพิสูจน์ว่ามันปราศจากข้อผิดพลาด ดังนั้นเราต้องทำงานภายใต้สมมติฐานที่ว่าทุกโปรแกรมมีข้อบกพร่องเนื่องจากไม่สามารถพิสูจน์ได้เป็นอย่างอื่น
http://en.wikipedia.org/wiki/Halting_problem
อัปเดต: คุณสามารถพิสูจน์ได้ว่าอัลกอริทึมเฉพาะจะส่งคืนคำตอบที่ถูกต้อง แต่นั่นไม่ใช่สิ่งเดียวกับการพิสูจน์ว่ามันถูกต้องทั้งหมด http://en.wikipedia.org/wiki/Correctness_(computer_science )
อย่างไรก็ตามประเด็นของฉันคือการอ้างถึงความจริงที่ว่าต้องถือว่าโปรแกรมมีข้อบกพร่องเสมอและพยายามอธิบายว่าทำไมเป็นกรณี http://en.wikipedia.org/wiki/Software_bug#Bug_management
ในฐานะที่เป็นข้อมูลเชิงลึกเพิ่มเติม "สองวิธี" อาจเป็นการอ้างอิงถึงคำพูดของTony Hoare :
มีสองวิธีในการสร้างการออกแบบซอฟต์แวร์: วิธีหนึ่งคือทำให้ง่ายจนไม่มีข้อบกพร่องที่เห็นได้ชัดและวิธีอื่นคือทำให้มันซับซ้อนจนไม่มีข้อบกพร่องที่เห็นได้ชัด วิธีแรกยากกว่ามาก มันต้องการทักษะเดียวกันความทุ่มเทความเข้าใจและแม้แต่แรงบันดาลใจในการค้นพบกฎทางกายภาพที่เรียบง่ายซึ่งรองรับปรากฏการณ์ที่ซับซ้อนของธรรมชาติ
ลองคิดดูสักหน่อยแล้วคุณจะเห็นว่าเขาพูดในสิ่งเดียวกัน: ถ้าชิ้นส่วนซอฟต์แวร์ของคุณไม่ไร้สาระก็มีข้อบกพร่อง (แต่ทำให้ซับซ้อนพอและไม่เป็นข้อบกพร่องที่เห็นได้ชัด )