Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

หลังจาก RailsConf:ฉันยังควรเรียนรู้ TDD หรือไม่

ฉันเขียนเกี่ยวกับ TDD มากมาย จึงไม่แปลกใจเลยที่ตอนที่ฉันเผยแพร่บทความที่แล้วเกือบ นาทีที่แน่นอน David Heinemeier Hansson พูดถึง TDD ในระหว่างการกล่าวสุนทรพจน์ RailsConf ฉันมีคำถาม:

คุณเห็นด้วยกับความคิดเห็นของ DHH เกี่ยวกับ TDD หรือไม่? คุณยังคงแนะนำ TDD หรือไม่? ถ้าไม่ฉันควรทำอย่างไรแทน?

สิ่งที่ DHH พูด

หากคุณพลาดประเด็นสำคัญ เรียงความของ DHH จะจับส่วนสำคัญของมัน:

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

เพียงพอ. ไม่มีอีกแล้ว ฉันชื่อ David และฉันไม่ได้เขียนซอฟต์แวร์ทดสอบก่อน ฉันปฏิเสธที่จะขอโทษสำหรับเรื่องนั้นอีกต่อไป ซ่อนน้อยกว่านั้นมาก ฉันรู้สึกขอบคุณสำหรับสิ่งที่ TDD ทำเพื่อลืมตาไปสู่การทดสอบการถดถอยอัตโนมัติ แต่ฉันได้เปลี่ยนจากหลักความเชื่อในการออกแบบมานานแล้ว

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

เนื้อหาทั้งหมดน่าอ่าน แต่ฉันแยกประเด็นหลักบางส่วนออก:

  1. TDD เป็นโปรแกรมแฮ็กใจเพื่อสนับสนุนการทดสอบการถดถอยอัตโนมัติ
  2. การใช้วาทศิลป์ครั้งแรกในการทดสอบความโกรธนำไปสู่ความโศกเศร้าและความสิ้นหวัง
  3. TDD นำไปสู่เว็บที่ซับซ้อนเกินไปของวัตถุและทางอ้อม
  4. คุณควรเลือกใช้การทดสอบระบบแบบแยกส่วนมากกว่าการทดสอบหน่วย
  5. แต่คุณไม่ควรเปลี่ยนความชอบนั้นเป็นศาสนาอื่น
  6. ด้วยเหตุผลเหล่านี้ การทดสอบก่อนจึงไม่ใช่แนวทางปฏิบัติด้านการออกแบบที่คุณควรใช้อีกต่อไป

ในเรียงความ ประเด็นเหล่านี้ส่วนใหญ่เชื่อมโยงกัน พวกเขามีเหตุผลในตัวเอง แต่ไม่ได้เกี่ยวพันกันอย่างที่คิดไว้

ถ้าคุณไม่แยกประเด็นออกจากกัน การโต้เถียงประเด็นหนึ่งจะถือว่ามีประเด็นอื่นๆ ที่คุณอาจไม่เห็นด้วยจริงๆ เมื่อคุณรวมสิ่งนี้เข้ากับความขุ่นเคืองของ Twitter และขีดจำกัดอักขระ 140 ตัว คุณจะจบลงด้วยความสับสน

แต่ฉันจะพูดถึงประเด็นเหล่านี้แยกกันต่างหาก

TDD นำไปสู่เว็บที่ซับซ้อนเกินไปของวัตถุและทางอ้อม

เมื่อเร็ว ๆ นี้ ฉันได้เห็นการตั้งค่าในชุมชนการทดสอบ Ruby สำหรับ "เว็บที่ซับซ้อนของวัตถุและทางอ้อม" ฉันคิดว่านี่เป็นสิ่งที่ไม่ดี (นี่เป็นหนึ่งในเหตุผลที่ฉันเริ่มใช้ Java!) แต่ฉันไม่เห็นด้วยว่า TDD เป็นสาเหตุ

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

การแยกการทดสอบออกจากระบบเป็นเพียงการเพิ่มประสิทธิภาพ และ YAGNI กล่าวว่าอาจยังไม่สำคัญทั้งหมด นอกจากนี้ ฉันควรได้รับการเร่งความเร็วทั่วกระดานจากการโหลด SSD และการโหลดแอปล่วงหน้า แทนที่จะพยายามเพิ่มประสิทธิภาพการทดสอบแต่ละรายการ

ที่กล่าวว่า TDD ยังคงมีผลต่อการออกแบบระบบของคุณ

TDD ขยายโค้ดของคุณแบบออร์แกนิก นี้สามารถเป็นสิ่งที่ดี! แต่บางครั้ง นักพัฒนาซอฟต์แวร์ที่มีทักษะสามารถเขียนโค้ดที่ดูดีกว่า TDD ที่ออกแบบไว้ อาจแนบแน่นกว่ากับโค้ดอื่น ๆ อาจไม่เป็นไปตามกฎ OOD ทั้งหมด แต่มีความชัดเจน ตรงไปตรงมา และเรียบง่าย (ดีเอชเอช ปิงปอง มีตัวอย่างดีๆ)

TDD ยังสามารถล็อกคุณเข้าสู่การออกแบบ API ของอ็อบเจ็กต์ได้ ก่อนที่คุณจะรู้ว่าคุณกำลังสร้างอะไรอยู่ ทำให้ยากต่อการเปลี่ยน API ในภายหลัง และความเสียดทานนั้นอาจทำให้คุณเลือกดีไซน์ที่แย่กว่านั้นได้

Test-first ไม่ใช่แนวทางปฏิบัติด้านการออกแบบที่คุณควรใช้อีกต่อไป

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

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

นอกจากประโยชน์เหล่านั้นแล้ว ยังช่วยให้คุณฝึกฝน การทดสอบ เพราะคุณมักจะเขียนแบบทดสอบก่อนเสมอ คุณจะต้องสอบ มาก มากกว่าที่จะลองทดสอบตามความเป็นจริง . คุณจะรู้ได้ทันทีว่าการทดสอบของคุณถูกต้องหรือไม่ (เพราะจะล้มเหลวก่อน) นอกจากนี้ คุณไม่มีข้ออ้างที่จะข้ามการทดสอบ “ครั้งนี้ครั้งเดียว”

วาทศาสตร์ก่อนการทดสอบด้วยความโกรธนำไปสู่ความโศกเศร้าและความสิ้นหวัง

เห็นด้วยอย่างยิ่ง 100% ใช่ ฉันกำลังโพสต์สิ่งนี้อีกครั้ง แต่ถ้าบางคนไม่ได้ TDD เพราะพวกเขาไม่รู้เกี่ยวกับประโยชน์ที่ได้รับ หรือพวกเขายังไม่ได้เรียนรู้วิธีการทำ หรือรู้สึกไม่สบายใจกับมัน วิธีการที่ถูกต้องไม่ใช่การทำให้พวกเขาอับอาย มันคือ ช่วยเหลือ เหล่านั้น หาก TDD มีประโยชน์สำหรับคุณ แสดงให้พวกเขาเห็นว่าสิ่งนี้ช่วยคุณได้อย่างไร หากพวกเขาสนใจ โปรดช่วยพวกเขาเริ่มต้น

หากพวกเขาไม่ได้ TDDing เพราะพวกเขาต้องการวิธีที่โค้ดปรากฏโดยไม่มี TDD ก็ปล่อยให้พวกเขาไป

เมื่อคุณสร้างความเชี่ยวชาญ คุณจะพัฒนาสัญชาตญาณของคุณเอง รสนิยมของคุณเอง และเทคนิคที่คุณชอบสำหรับการพัฒนาซอฟต์แวร์ และไม่มีข้อโต้แย้งทางอินเทอร์เน็ตที่จะสอนผู้เชี่ยวชาญให้เพิกเฉยต่อสิ่งเหล่านั้น

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

คุณควรใช้ TDD ต่อไปหรือไม่

ใช่! ฉันขอแนะนำอย่างยิ่งให้คุณเรียนรู้และฝึกฝนมัน

ฉันให้เครดิต TDD ในการสอนวิธีทดสอบให้ฉัน และฉันยังได้รับประโยชน์มหาศาลเมื่อทำ TDD ไม่สมบูรณ์แบบ แต่ไม่มีเทคนิคใดเป็นกุญแจสำคัญในการสร้างโค้ดที่ดีขึ้นอย่างน่าอัศจรรย์

คุณต้องเรียนรู้รูปแบบ เทคนิค และเครื่องมือใหม่ๆ อยู่เสมอ ฝึกใช้จนกว่าคุณจะใช้รูปแบบที่ถูกต้องในสถานที่ที่เหมาะสมเพราะ รู้สึกใช่ .

ขณะที่คุณเรียนรู้ ให้ใช้เวลาในการแก้ไข ปรับโครงสร้างใหม่ และทดลองกับโค้ดของคุณ ดูรหัสเก่าและรหัสใหม่ของคุณ หาคนที่มีประสบการณ์มากกว่าคุณมาทบทวน คุณทำให้มันดีขึ้นหรือไม่? นั่นคือวิธีที่คุณเติบโต