ดูความพยายามของ Ron Jeffries ในการสร้างตัวแก้ซูโดกุด้วย TDDซึ่งน่าเสียดายที่ใช้งานไม่ได้
อัลกอริทึมจำเป็นต้องมีความเข้าใจที่สำคัญของหลักการออกแบบอัลกอริทึม ด้วยหลักการเหล่านี้เป็นจริงที่เป็นไปได้ที่จะดำเนินการแบบค่อยเป็นค่อยไปกับแผนเช่นปีเตอร์นอร์วิกได้
ในความเป็นจริงสำหรับอัลกอริทึมที่ต้องใช้ความพยายามในการออกแบบที่ไม่สำคัญมันก็มักจะเป็นความพยายามที่เพิ่มขึ้นในธรรมชาติ แต่ "การเพิ่มขึ้น" แต่ละอันซึ่งมีขนาดเล็กในสายตาของนักออกแบบอัลกอริทึมดูเหมือนว่าการก้าวกระโดดควอนตัม (เพื่อขอยืมวลีของคุณ) ให้กับบุคคลที่ไม่มีความเชี่ยวชาญหรือความรู้เดียวกันกับอัลกอริทึมตระกูลนี้โดยเฉพาะ
นี่คือเหตุผลที่การศึกษาขั้นพื้นฐานในทฤษฎี CS รวมกับการฝึกเขียนโปรแกรมอัลกอริทึมจำนวนมากมีความสำคัญเท่าเทียมกัน การรู้ว่ามี "เทคนิค" (หน่วยการสร้างขนาดเล็กของอัลกอริธึม) อยู่เป็นทางยาวไปสู่การเพิ่มจำนวนควอนตัมแบบก้าวกระโดด
มีความแตกต่างที่สำคัญบางอย่างระหว่างความก้าวหน้าที่เพิ่มขึ้นในอัลกอริทึมและ TDD
หนึ่งในความแตกต่างได้รับการกล่าวถึงโดยJeffO : การทดสอบที่ตรวจสอบความถูกต้องของข้อมูลเอาต์พุตนั้นแยกจากการทดสอบที่ยืนยันประสิทธิภาพระหว่างการใช้งานที่แตกต่างกันของอัลกอริทึมเดียวกัน (หรืออัลกอริทึมที่แตกต่างกัน
ใน TDD จะเพิ่มข้อกำหนดใหม่ในรูปแบบของการทดสอบและการทดสอบนี้จะไม่ผ่าน (สีแดง) จากนั้นความต้องการก็พอใจ (สีเขียว) ในที่สุดรหัสจะถูก refactored
ในการพัฒนาอัลกอริทึมความต้องการมักจะไม่เปลี่ยนแปลง การทดสอบการตรวจสอบความถูกต้องของผลลัพธ์นั้นจะถูกเขียนขึ้นเป็นอันดับแรกหรือไม่นานหลังจากร่างเสร็จสมบูรณ์ การทดสอบความถูกต้องของข้อมูลนี้ไม่ค่อยมีการเปลี่ยนแปลง หนึ่งไม่เปลี่ยนเป็นล้มเหลว (สีแดง) เป็นส่วนหนึ่งของพิธี TDD
อย่างไรก็ตามในแง่นี้การวิเคราะห์ข้อมูลแตกต่างจากการพัฒนาอัลกอริธึมอย่างชัดเจนเนื่องจากข้อกำหนดการวิเคราะห์ข้อมูล (ทั้งชุดอินพุตและผลลัพธ์ที่คาดหวัง) มีการกำหนดเพียงอย่างเดียวในการทำความเข้าใจของมนุษย์ ดังนั้นความต้องการจึงเปลี่ยนบ่อยในระดับเทคนิค การเปลี่ยนแปลงอย่างรวดเร็วนี้ทำให้การวิเคราะห์ข้อมูลอยู่ระหว่างการพัฒนาอัลกอริธึมและการพัฒนาแอพพลิเคชั่นซอฟต์แวร์ทั่วไป - ในขณะที่ยังมีอัลกอริธึมที่หนักหน่วงความต้องการก็เปลี่ยน "เร็วเกินไป" เป็นรสนิยมของโปรแกรมเมอร์
หากความต้องการมีการเปลี่ยนแปลงโดยทั่วไปจะเรียกหาอัลกอริทึมที่แตกต่างกัน
ในการพัฒนาอัลกอริทึมการเปลี่ยนแปลง (การกระชับ) การทดสอบการเปรียบเทียบประสิทธิภาพเป็นล้มเหลว (สีแดง) นั้นไร้สาระ - มันไม่ได้ให้ข้อมูลเชิงลึกเกี่ยวกับการเปลี่ยนแปลงอัลกอริทึมของคุณที่จะปรับปรุงประสิทธิภาพ
ดังนั้นในการพัฒนาอัลกอริทึมทั้งการทดสอบความถูกต้องและการทดสอบประสิทธิภาพไม่ใช่การทดสอบ TDD แต่ทั้งสองมีการทดสอบการถดถอย โดยเฉพาะการทดสอบการถดถอยที่ถูกต้องจะป้องกันไม่ให้คุณทำการเปลี่ยนแปลงอัลกอริทึมที่จะทำลายความถูกต้องของมัน การทดสอบประสิทธิภาพป้องกันไม่ให้คุณทำการเปลี่ยนแปลงอัลกอริทึมที่จะทำให้มันทำงานช้าลง
คุณยังสามารถรวม TDD เป็นสไตล์การทำงานส่วนบุคคลได้ยกเว้นว่า"พิธีกรรมสีแดง - เขียว - refactor" ไม่จำเป็นอย่างเคร่งครัดในหรือไม่เป็นประโยชน์อย่างยิ่งต่อกระบวนการคิดของการพัฒนาอัลกอริทึม
ฉันจะยืนยันว่าการปรับปรุงอัลกอริทึมเป็นผลมาจากการสุ่มเปลี่ยน (ไม่จำเป็นต้องถูกต้อง) ไปยังไดอะแกรมการไหลของข้อมูลของอัลกอริทึมปัจจุบันหรือผสมและจับคู่ระหว่างการใช้งานที่รู้จักกันก่อนหน้านี้
TDD จะใช้เมื่อมีข้อกำหนดหลายประการที่สามารถเพิ่มได้เพิ่มขึ้นในชุดทดสอบของคุณ
อีกทางเลือกหนึ่งถ้าอัลกอริทึมของคุณเป็นตัวขับเคลื่อนข้อมูลข้อมูลการทดสอบ / กรณีทดสอบแต่ละชิ้นสามารถเพิ่มได้แบบเพิ่มหน่วย TDD ก็จะมีประโยชน์เช่นกัน ด้วยเหตุนี้วิธีการแบบ "คล้าย TDD" ของ "เพิ่มข้อมูลการทดสอบใหม่ - ปรับปรุงรหัสเพื่อให้จัดการกับข้อมูลนี้อย่างถูกต้อง - refactor" จะทำงานสำหรับการวิเคราะห์ข้อมูลแบบปลายเปิดซึ่งวัตถุประสงค์ของอัลกอริทึมถูกอธิบายในมนุษย์ - คำพูดที่เป็นศูนย์กลางและการวัดความสำเร็จของมันก็ตัดสินตามเงื่อนไขที่มนุษย์นิยามไว้
มันอ้างว่าจะสอนวิธีที่จะทำให้มันล้นหลามน้อยกว่าการพยายามทำตามข้อกำหนดทั้งหมด (หลายสิบหรือหลายร้อย) ในการทดลองครั้งเดียว กล่าวอีกนัยหนึ่ง TDD จะถูกเปิดใช้งานเมื่อคุณสามารถกำหนดได้ว่าข้อกำหนดหรือเป้าหมายที่ยืดออกสามารถถูกละเว้นได้ชั่วคราวในขณะที่คุณกำลังใช้ร่างโซลูชันแรก ๆ ของคุณ
TDD ไม่ได้ใช้แทนวิทยาการคอมพิวเตอร์ มันเป็นไม้ยันรักแร้ทางจิตวิทยาที่ช่วยให้โปรแกรมเมอร์สามารถรับมือกับความต้องการที่หลากหลายในครั้งเดียว
แต่ถ้าคุณมีการนำไปใช้งานหนึ่งอย่างซึ่งให้ผลลัพธ์ที่ถูกต้องแล้ว TDD จะพิจารณาเป้าหมายที่สำเร็จและรหัสที่พร้อมจะถูกส่งออกไป (เพื่อปรับโครงสร้างใหม่หรือให้ผู้ใช้โปรแกรมเมอร์คนอื่น) ในบางแง่ก็แนะนำให้คุณไม่เพิ่มประสิทธิภาพรหัสของคุณก่อนกำหนดโดยการให้สัญญาณว่าโค้ดนั้น "ดีพอ" (เพื่อผ่านการทดสอบความถูกต้องทั้งหมด)
ใน TDD จะมีการมุ่งเน้นที่ "ข้อกำหนดไมโคร" (หรือคุณสมบัติที่ซ่อนอยู่) เช่นกัน ตัวอย่างเช่นการตรวจสอบความถูกต้องของพารามิเตอร์การยืนยันการยกเว้นและการจัดการเป็นต้น TDD ช่วยรับรองความถูกต้องของเส้นทางการดำเนินการที่ไม่ได้ใช้งานบ่อยครั้งในการดำเนินการตามปกติของซอฟต์แวร์
โค้ดอัลกอริทึมบางประเภทมีสิ่งเหล่านี้เช่นกัน สิ่งเหล่านี้เป็นหน้าที่ของ TDD แต่เนื่องจากเวิร์กโฟลว์ทั่วไปของอัลกอริทึมไม่ใช่ TDD การทดสอบดังกล่าว (ในการตรวจสอบความถูกต้องของพารามิเตอร์การยืนยันและการโยนและการจัดการข้อยกเว้น) จึงมีแนวโน้มที่จะถูกเขียนหลังจากรหัสการติดตั้งใช้งานแล้ว