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

หลัง RailsConf: ควรเรียน TDD ต่อหรือไม่?

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

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

DHH พูดอะไร

ถ้าพลาด keynote essay ของ DHH จับใจความ:

อาจจำเป็นต้องใช้ test-first เป็น ram ที่ counterintuitive เพื่อล้ม lack of automated regression testing ของอุตสาหกรรม อาจเป็น parable ที่ไม่ได้ intended เป็น literal description ของวันต่อวันของ software writing แตอะไรก็ตามที่มันเริ่มต้น มันเร็วๆ นี้ corrupt ใช้เป็นค้อน毆 nonbelievers ประกาศว่า unprofessional unfit สำหรับเขียน software A litmus test.

พอแล้ว ไม่แล้ว ชื่อผม David และผมไม่เขียน software test-first ผมปฏิเสธขอโทษอีกแล้ว ไม่ซ่อนอีก ผมขอบคุณ TDD ที่เปิดตาผมให้รู้ automated regression testing แตผม move on จาก design dogma นานแล้ว

…

ใช่ test-first ตายแล้วสำหรับผม แตแทนที่จะเต้นบนหลุมศพ ผมเลือกเกียรติ contributions ของมัน ไม่ค้างที่ travesties มัน mark phase สำคัญในประวัติศาสตร์ แตเวลา move on

ทั้งหมดคุ้มค่าอ่าน แตผมแยก main points:

  1. TDD เป็น mind hack ส่งเสริม automated regression testing
  2. Angry test-first rhetoric นำไปสู่ sadness และ despair
  3. TDD นำไปสู่ overly complex webs of objects และ indirection
  4. ควร prefer isolated system tests กว่า unit tests
  5. แตไม่ควรทำ preference นั้นกลายเป็น religion อีก
  6. จากเหตุผลเหล่านี้ test-first ไม่ใช่ design practice ที่ควรใช้แล้ว

ใน essay points เหล่านี้ผูกกัน มันทำ sense เอง แตไม่ intertwined อย่างที่แสดง

ถ้าไม่แยกพวกมันออก โต้แย้ง point หนึ่ง assume points อื่นที่คุณอาจไม่ agree ผสมกับ twitter outrage และ 140-character limit ได้ confusion, strawmen, flamewars

แทนจะพูด points แยกกัน

TDD นำไปสู่ overly complex webs of objects และ indirection

근래 Ruby testing community ชอบ "complex webs of objects and indirection" ผมคิดนี่ bad (เหตุผลหนึ่งผมหนีจาก Java!) แตไม่ agree ว่า TDD cause มัน

ผม TDD เกือบ decade ไม่ isolate tests จาก database Controller-level functional tests และ integration test suite ที่ robust มีค่าใน total test suite ไม่ว่าจะช้าแค่ไหน

Isolate tests จาก system แค่ optimization และ YAGNI บอกว่า maybe not important yet นอกจากนี้ ผมชอบ across-the-board speed boosts จาก SSDs และ app preloading แทน optimize แต่ละ test

แต TDD ยังมี effect ต่อ system design

TDD เติบโตโค้ดแบบ organic อาจดี! แตบางครั้ง skilled developer เขียนโค้ดดูดีกว่า TDD อาจ design มัน coupled กับโค้ดอื่น ไม่ follow OOD rules ทั้งหมด แตชัด ตรงไปตรงมา และ simple (DHH Ping Pong มีตัวอย่างดี)

TDD อาจ lock คุณใน object API design ก่อนรู้ว่ากำลังสร้างอะไร ทำให้ยากเปลี่ยน API ภายหลัง และ friction นั้นอาจทำให้ accept design ที่แย่ลง

Test-first ไม่ใช่ design practice ที่ควรใช้แล้ว

TDD เป็น tool ดีสร้าง flexible, well-tested code ผม totally disagree กับ point นี้ ผมพูด benefits ของ TDD ในบทความก่อน:

  • คุณจะได้ flexible, tested object model มากขึ้น (นี่ arguably main benefit)
  • System โดยนิยาม testable ทำให้ future tests ถูกกว่า
  • คุณ amortize testing costs ทั่ว development process ทำให้ estimates accurate
  • เก็บคุณใน flow เพราะไม่ต้อง decide what to do next

นอกจาก benefits นี้ ช่วย ฝึก testing เพราะเขียนทดสอบก่อน คุณจะทดสอบ เยอะ กว่า test-after รู้ทันทีว่าทดสอบถูกต้อง (เพราะล้มเหลวก่อน) บวกไม่มีข้ออ้างข้ามทดสอบ "ครั้งนี้"

Angry test-first rhetoric นำไปสู่ sadness และ despair

เห็นพ้อง 100% ใช่ ผมโพสต์อีกครั้ง แตถ้าใครไม่ TDD เพราะไม่รู้ benefits หรือยังเรียนไม่จบ หรือ uncomfortable approach ถูกต้องไม่ใช่ shame พวกเขา แต่ ช่วย พวกเขา ถ้า TDD useful ให้คุณ แสดงว่าช่วยยังไง สนใจ ช่วยเริ่มต้น

ถ้าไม่ TDD เพราะชอบโค้ดที่ออกมาดีกว่า ให้พวกเขา

ตอนสร้าง expertise คุณพัฒนา intuition, sense of taste, techniques ของตัวเอง และ internet argument ไม่สอน expert ignore สิ่งเหล่านั้น

ถ้าจะ criticize ใครไม่ follow best practices ของคุณ คุณ Either hurting ability to learn หรือ scream into nothingness Waste of time กรณีดี และ hurt cause กรณีแย่

ควร TDD ต่อไหม?

ใช่! ผมแนะนำให้เรียนและฝึกอย่างแน่นอน

ผม credit TDD สอนผมทดสอบ และยังได้ประโยชน์เยอะตอน TDD มันไม่สมบูรณ์ แตไม่มี technique ไหน key วิเศษผลิตโค้ดดี

แทนจะต้องเรียน patterns, techniques, tools ใหม่ฝึก用จน用 pattern ถูกที่ถูกที่เพราะ รู้สึกถูก

ตอนเรียน ใช้เวลา modify, refactor, experiment กับโค้ด ดูโค้ดเก่าและใหม่ ขอคน experienced review คุณทำให้ดีขึ้น? นั่นคือวิธีโต