กูรู TDD มากขึ้นและบอกเราว่าTDD ไม่ได้เกี่ยวกับการทดสอบมันเป็นเรื่องเกี่ยวกับการออกแบบ ดังนั้นฉันรู้ว่านักพัฒนาบางคนที่สร้างการออกแบบที่ยอดเยี่ยมจริงๆโดยไม่มี TDD พวกเขาควรฝึกซ้อม TDD ไหม?
กูรู TDD มากขึ้นและบอกเราว่าTDD ไม่ได้เกี่ยวกับการทดสอบมันเป็นเรื่องเกี่ยวกับการออกแบบ ดังนั้นฉันรู้ว่านักพัฒนาบางคนที่สร้างการออกแบบที่ยอดเยี่ยมจริงๆโดยไม่มี TDD พวกเขาควรฝึกซ้อม TDD ไหม?
คำตอบ:
TDD ไม่เพียงช่วยฉันในการออกแบบขั้นสุดท้ายที่ดีที่สุดเท่านั้น แต่ยังช่วยให้ฉันไปถึงที่นั่นด้วยความพยายามน้อยลง
ฉันเคยมีปัญหาเกี่ยวกับการแทงสองหรือสามครั้งก่อนตัดสินใจออกแบบที่ฉันคิดว่าดีที่สุด ตอนนี้เวลาเดียวกันนั้นใช้การเขียนแบบทดสอบและเพ่งความสนใจไปที่การออกแบบที่ถูกต้อง และเป็นโบนัสมันทำให้ฉันมีชุดการทดสอบที่ทำซ้ำได้ ชนะ!
ที่กล่าวว่าจะมีคนที่ TDD ไม่ได้ให้อะไรเลยอย่างหลีกเลี่ยงไม่ได้ ตราบใดที่พวกเขายังมีการทดสอบแบบอัตโนมัติและทำซ้ำได้ในตอนท้ายมันก็ใช้ได้
forced
. ฉันไม่รู้ว่าทำไมคนทั่วไปถึงไม่ค่อยถูกรบกวนจากความถี่ของคำว่า "ถูกบังคับ" เพราะมันเกิดขึ้นในการอภิปรายเกี่ยวกับ TDD เราไม่จำเป็นต้องบังคับให้ออกแบบบางสิ่งอย่างถูกต้อง พวกเขาควรเรียนรู้วิธีออกแบบสิ่งต่าง ๆ อย่างถูกต้องแล้วดำเนินการต่อโดยไม่ถูกบังคับโดยเฉพาะอย่างยิ่งเมื่อการบังคับนั้นใช้เวลานานอย่างไม่น่าเชื่อ
สิ่งนี้โดยเฉพาะอย่างยิ่งกูรู TDD เป็นจริงพยายามที่จะพูดไม่ได้ว่า TDD เป็นขั้นตอนการออกแบบ (แม้ว่าผู้คนจำนวนมากได้ตีความน่าเสียดายที่มันเป็นอย่างนั้น) ข้อความที่นี่คือการใช้กระบวนการเช่น TDD หากคุณทำถูกต้องจะมีแนวโน้มที่จะปรับปรุงการออกแบบโดยรวมของคุณ
แนวคิดพื้นฐานคือแนวคิดที่เก่ากว่า TDD มาก การออกแบบเพื่อทดสอบความสามารถ หากคุณยึดมั่นในหลักการของSOLIDอย่างเคร่งครัดโดยเฉพาะหลักการความรับผิดชอบต่อเดี่ยวคุณจะพบว่าโค้ดทดสอบได้ง่ายมาก ในทางกลับกันถ้าคุณมีแนวโน้มที่จะเป็นคนขี้เกียจเล็กน้อยในการออกแบบของคุณคุณอาจพบว่าขั้นตอนการเขียนบททดสอบเพื่อบังคับให้คุณทำสิ่งนี้บ่อยขึ้นเพื่อหลีกเลี่ยงความยุ่งยากในการหาสิ่งที่ต้องการ ได้รับการทดสอบและ (b) ใช้เวลาในการตั้งค่าการพึ่งพามากกว่าการเขียนการทดสอบจริง
คุณไม่จำเป็นต้องทำตาม TDD เพื่อรับผลประโยชน์จากสิ่งนี้ แต่มันจะช่วยในการเขียนการทดสอบก่อน - โดยเฉพาะอย่างยิ่งในไม่ช้าหลังจากที่คุณใช้คลาสหากไม่ได้มาก่อนหรือระหว่าง หากคุณรอนานเกินไปคุณจะเสี่ยงกับการทดสอบ "สกปรกลูกผสม" ที่ผู้เขียนกำลังพูดถึงซึ่งไม่มีค่ามากนักเพราะพวกมันเปราะและมีแนวโน้มที่จะแตกหักในระหว่างการปรับสภาพที่ไม่เป็นอันตราย - ไม่ต้องพูดถึง - ขนาดออกแบบกระบวนการที่ยากเลือดตาแทบกระเด็น
คุณไม่สามารถรู้ได้ว่าคุณกำลังออกแบบเพื่อการทดสอบจริง ๆ หรือไม่ถ้าคุณไม่เขียนการทดสอบและ "การทดสอบคุณสมบัติ" โดยไม่ส่งผลต่อการครอบคลุมโค้ดเพียง 15%
แน่นอนคุณสามารถสร้างงานออกแบบที่ดีโดยไม่ต้องเขียนแบบทดสอบเพียงครั้งเดียว - แต่คุณแน่ใจหรือว่าพวกเขากำลังออกแบบที่ยอดเยี่ยม? คุณจะรู้ได้อย่างไรว่าพวกเขาไม่ได้ระบุอย่างชัดเจนจากการทดสอบ? การทดสอบจะเผยปัญหามากมายและในขณะที่กระบวนการ QA อาจพบข้อบกพร่องที่มองเห็นได้พวกเขาจะไม่เปิดเผยการตัดสินใจออกแบบที่ไม่ดี
คำตอบแบบง่ายๆมาจากคนที่พยายามเรียนรู้ TDD: คุณไม่ต้องการแต่ข้อดีหลัก ๆ ที่ให้คุณคือความมั่นใจค่อนข้างง่ายมั่นใจได้ว่าใบสมัครของคุณทำงานได้ มั่นใจได้ว่ากรณีใช้งานมีความพึงพอใจ มั่นใจว่าตรรกะของคุณจะเป็นเสียงสำหรับโมดูล "Foobar" ความมั่นใจว่ารหัสของคุณมีโครงสร้างที่เหมาะสมเพื่อให้สามารถบำรุงรักษาและขยายออกไปได้ถึงหกเดือนเมื่อ CEO ต้องการเพิ่มฟีเจอร์ใหม่ ๆ ที่เขาอ่าน ความมั่นใจว่าเมื่อแอปพลิเคชันของคุณเติบโตขึ้นฐานรากได้ถูกวางไว้เพื่อให้สถาปัตยกรรมไม่กระจุยหรือต้องมีแฮ็กแฮ็กที่ยุ่งเหยิงเพื่อให้ลูกเล่นใหม่ ๆ
ฉันรู้ว่าสิ่งที่กล่าวมาข้างต้นฟังดูน่าเชื่อถือเล็กน้อย แต่นั่นคือวิธีที่ฉันเห็นประโยชน์ของ TDD แม้ว่าคุณจะสามารถสร้างการออกแบบที่ดีแข็งแรงและออกแบบมาอย่างดีโดยใช้ TDD บังคับให้มือของคุณทำสิ่งที่ถูกต้องแล้วพิสูจน์ว่าสิ่งต่าง ๆ นั้นถูกต้องและที่สำคัญกว่านั้นก็เป็นพื้นฐานในการรักษาสิ่งต่าง ๆ ให้ถูกต้อง จากสิ่งเล็ก ๆ น้อย ๆ ที่ฉันทำใน TDD การใช้มันทำให้ฉันต้องทำความสะอาดโค้ดและทำตามแนวคิดด้านวิศวกรรมซอฟต์แวร์ที่เหมาะสมไม่เช่นนั้นฉันจะทำ "สิ่งที่เร็วที่สุดที่เป็นไปได้" ซึ่งมักจะทำให้รหัส "แฮ็ค" ยุ่งเหยิง
ฉันสามารถพูดคุยจากประสบการณ์ของฉันเท่านั้น สำหรับฉัน TDD นำสิ่งต่าง ๆ ที่ฉันไม่เคยมีมาก่อนในกล่องเครื่องมือลักษณะนิสัยการพัฒนาของฉัน แม้ว่ามันจะคุ้มค่าที่จะพูดอีกครั้งว่า TDD ไม่ใช่ทางออกสำหรับทุกสิ่ง ฉันพยายามแยกการดำเนินการสำรวจและการผลิตพร้อมเสมอ ไม่จำเป็นต้องใช้ TDD ในขั้นตอนการสำรวจและแม้กระทั่งกำลังชะลอตัวลง ในอีกด้านหนึ่งสำหรับการผลิตรหัสพร้อมมันนำประโยชน์หลายประการซึ่งในระยะสั้นและระยะยาวมีคุณค่ามากสำหรับสุขภาพจิตของนักพัฒนาและกรรมของโครงการ
มีสิ่งหนึ่งที่ TDD ไม่สามารถแก้ไขได้ หากคุณไม่ทราบวิธีการสร้างสิ่งที่คุณกำลังสร้าง TDD จะไม่สร้างทางออกให้คุณ คุณต้องมี "การออกแบบ" อย่างคร่าวๆหรือภาพรวมของปัญหาและวิธีแก้ไข TDD จะทำให้คุณใช้งานได้อย่างสวยงามและบำรุงรักษามากขึ้นด้วยรหัสที่มีคุณภาพสูงขึ้น
ในที่สุดฉันชอบคิดในแง่ BDD ซึ่งพึ่งพาวิธีปฏิบัติของ TDD BDD ทำให้ฉันใช้โซลูชันโดยใช้คำศัพท์ของโดเมนและทำให้ซอฟต์แวร์เหมาะสมกับปัญหาได้ดีขึ้น
อาจมีหลายวิธีในการบรรลุการออกแบบที่ยอดเยี่ยมและมีการตีความที่แตกต่างกันอย่างมากมายในสิ่งที่ถือว่า "ยอดเยี่ยม" - หรือแม้แต่ "ดี" ฉันสงสัยว่า TDDers ส่วนใหญ่จะไม่เห็นด้วยกับคุณเกี่ยวกับคำจำกัดความ - ว่าถ้าเราดูโค้ดที่คุณรู้สึกว่ายอดเยี่ยมเราจะพิจารณามันน้อยกว่าดี TDD ทำให้เรามีคุณสมบัติที่เฉพาะเจาะจงมากและคุณภาพเหล่านี้ไม่ค่อยพบในรหัสที่ไม่ใช่ TDD
เห็นได้ชัดว่าการทดสอบนั้นเป็นคุณสมบัติอย่างหนึ่งอย่างใดอย่างหนึ่ง วิธีการและคลาสที่เล็กมากอาจเป็นลักษณะย่อยและสิ่งนี้นำไปสู่การตั้งชื่อที่ยอดเยี่ยม บางทีคุณอาจรู้จักโปรแกรมเมอร์ที่มีคุณสมบัติเหล่านี้โดยไม่ใช้ TDD แต่ฉันก็ไม่รู้