ข้อบกพร่องเป็นส่วนหนึ่งของหนี้ทางเทคนิคหรือไม่


44

Scrum Master ของเรายังคงอ้างถึงข้อบกพร่องเป็นหนี้ทางเทคนิค เขาคิดถูกไหมข้อบกพร่องถือเป็นหนี้ทางเทคนิคในโลกของ Agile หรือไม่?


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

@BryanOakley ข้อบกพร่องบางอย่างสามารถบล็อกคุณในแบบที่บังคับให้คุณหลีกเลี่ยงพวกเขาแนะนำหนี้ทางเทคนิคมากยิ่งขึ้น ข้อผิดพลาดเหล่านี้อาจแพงเกินไปที่จะแก้ไข
BћовиЈ

4
@BryanOkley - ฉันคิดเสมอว่าหนี้ทางเทคนิคคือการออกแบบหรือการปรับโครงสร้างใหม่ที่จำเป็นในการปรับปรุงการใช้งาน แต่ไม่สามารถทำได้ในปัจจุบันเนื่องจากข้อ จำกัด ด้านเวลา / งบประมาณ ฉันคิดว่ามันเป็นสิ่งสำคัญที่จะใช้คำศัพท์ที่ถูกต้อง ฉันอาจจะผิดหรือเขาอาจจะผิดซึ่งเป็นสาเหตุที่ฉันถามคำถาม
user86834

ฉันเข้าใจ. ทำไมการเรียกหนี้ทางเทคนิคจึงมีความสำคัญ คุณกำลังบอกว่าถ้าคุณจัดว่าพวกเขาเป็น "หนี้ทางเทคนิค" ที่คุณจะรักษาข้อบกพร่องเหล่านั้นแตกต่างจากข้อบกพร่องอื่น ๆ ?
ไบรอัน Oakley

1
คุณสามารถมีฝ่ายเทคนิคจำนวนมากและไม่มีบั๊กเดี่ยว ฝ่ายเทคนิคเป็นตรงกันข้ามกับรหัสที่เขียนได้ดีและออกแบบมาอย่างดี รหัสที่เขียนได้ดีนั้นง่ายต่อการบำรุงรักษาทดสอบและเพิ่ม ฝ่ายเทคนิคชะลอการพัฒนาทำให้ยากต่อการติดตามบั๊กและเพิ่มโอกาสที่โค้ดใหม่จะแนะนำบั๊ก
Luis Perez

คำตอบ:


35

ฉันคิดว่าคำตอบที่นี่ค่อนข้างง่าย - คุณสมบัติที่สำคัญของหนี้ทางเทคนิคคือสิ่งที่เราต้องทำโดยเลือก

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

ข้อผิดพลาดไม่ใช่สิ่งที่เราเลือกที่จะมีในรหัสของเรา - ดังนั้นความจริงไม่ใช่หนี้ทางเทคนิค

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


ในฐานะที่เป็นคำลงท้าย - ฉันไม่เห็นด้วยกับการยืนยันว่าหนี้ทางเทคนิคนั้นจะนำไปสู่ข้อบกพร่องในตัวมันเองซึ่งทำให้ข้อสันนิษฐานหลายข้อเกี่ยวกับลักษณะของตัวเลือกที่ทำ ตัวอย่างเช่นคุณสามารถเขียนโค้ดที่มีโครงสร้างที่ดีการทดสอบที่ครอบคลุมซึ่งยังคงทำให้ - พูด - การประนีประนอมทางสถาปัตยกรรมสำหรับการส่งในช่วงต้น ในทำนองเดียวกันคุณสามารถเลือกที่จะไม่ทำให้กระบวนการปรับใช้ของคุณเป็นอัตโนมัติซึ่งจะไม่นำไปสู่ข้อบกพร่อง แต่อาจนำไปสู่ความเครียดและความเจ็บปวดมากมาย แน่นอนถ้าหนี้คือคุณได้เขียนโค้ดที่ไม่ใช่ SOLID (หรืออะไรก็ตาม) ใช่แล้ว ... แต่นั่นไม่ใช่กรณีเสมอไป


1
+1 ฉันคิดว่าคำตอบของBЈовићนั้นค่อนข้างถูกต้อง แต่คำตอบของคุณก็กระทบเล็บที่หัว (ฉันบิตสับสนโดยการใช้งานของคำพฤตินัย . แต่ผมไม่คิดว่าคุณสามารถบอกว่าทางนิตินัย , ข้อผิดพลาดเป็นหนี้ทางเทคนิค?)
ruakh

การใช้ภาษาเป็นเรื่องสนุก ... ลองทำสิ่งนี้: en.wikipedia.org/wiki/De_facto - อ่านมันว่า "สำหรับทุกเจตนารมณ์และวัตถุประสงค์" ซึ่งใกล้เคียงกับความตั้งใจของฉันมาก
Murph

"ฉันคิดว่าคำตอบที่นี่ค่อนข้างง่าย - คุณสมบัติที่สำคัญของหนี้ทางเทคนิคคือสิ่งที่เราเลือกได้" คุณดึงคำจำกัดความนี้มาจากไหน ฉันไม่คิดว่ามันถูกต้อง นั่นเป็นส่วนหนึ่งของหนี้ทางเทคนิคส่วนอื่น ๆ เป็นนัยและมักจะเกิดจากความไม่รู้และการปฏิบัติที่ไม่ดี
gphilip

de jure du jure พรุ่งนี้โดยพฤตินัย QED
Radarbob

1
ตามเทคนิคหนี้ Quadrant โดยมาร์ตินฟาวเลอร์คุณสามารถระบุข้อบกพร่องและรหัสไม่ดีเท่า "ประมาทเลินเล่อ" หนี้: martinfowler.com/bliki/TechnicalDebtQuadrant.html ฉันคิดว่าประเด็นคือถ้าคุณทำเครื่องหมายข้อบกพร่องที่ละเอียดอ่อนบางอย่างเป็นหนี้คุณสามารถเข้าใจได้ว่าพวกเขาเสียค่าใช้จ่ายเท่าไรและคุณจำเป็นต้องกำจัดมันออกไปหรือไม่ ตัวอย่างเช่นคุณมีโมดูลที่เขียนเลอะเทอะซึ่งมีการเปลี่ยนแปลงเพียงครั้งเดียวในหนึ่งปีและจะใช้เวลาหลายสัปดาห์ในการเขียนใหม่ - คุณอาจจะต้องเก็บไว้เหมือนเดิมเนื่องจากการจ่ายดอกเบี้ยสำหรับหนี้นี้มีขนาดเล็กมาก
shershen

20

ใช่.

หนี้ทางเทคนิค (หรือเรียกอีกอย่างว่าหนี้การออกแบบหรือหนี้รหัส) เป็นคำเปรียบเทียบที่เกี่ยวข้องกับผลที่เกิดขึ้นในที่สุดของสถาปัตยกรรมซอฟต์แวร์ที่น่าสงสารหรือการพัฒนาซอฟต์แวร์และการพัฒนาซอฟต์แวร์ในรหัสฐาน

ที่มา: Wikipedia

อ่านหนี้ทางเทคนิคเป็นสิ่งที่คุณสามารถหลีกเลี่ยงได้โดยมีเวิร์กโฟลว์ที่ดีขึ้น (ตัวอย่างเช่นการทำสถาปัตยกรรมอย่างถูกต้องก่อนที่จะกระโดดไปยังการเข้ารหัสทำ TDD ฯลฯ ) การเขียนโค้ดที่ดีขึ้น ฯลฯ

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


หลังจากอ่านคำตอบของBЈовићฉันเห็นว่ามันอาจไม่ง่ายอย่างที่คิด

  • ตัวอย่างเช่นข้อบกพร่องเป็นส่วนหนึ่งของหนี้ทางเทคนิค? บทความอ้างว่ามีเพียงข้อบกพร่องที่คุณรู้ แต่ตัดสินใจที่จะไม่แก้ไขเป็นส่วนหนึ่งของหนี้ทางเทคนิค

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

  • ในที่สุดเมื่อสร้างแบบจำลองของหนี้สินทางเทคนิค ABCDE-Tฉันรวมข้อบกพร่องเป็นหนึ่งในหกปัจจัย แต่พวกเขาถือว่าแตกต่างกัน การมุ่งเน้นไม่ได้อยู่ที่ข้อบกพร่องของตัวเอง แต่เกี่ยวกับวิธีการรวบรวมจัดลำดับความสำคัญและแก้ไข บั๊กเองปรากฏเป็นผลมาจากหนี้ทางเทคนิค (เช่นในตัวอย่างก่อนหน้า) แต่ไม่ปรากฏว่าตัวเองเป็นปัจจัยของหนี้ทางเทคนิค

สิ่งนี้ถูกกล่าวว่าฉันยังคงมีแนวโน้มที่จะตอบว่าข้อบกพร่อง - ข้อบกพร่องใด ๆ - เป็นส่วนหนึ่งของหนี้ทางเทคนิค

อาร์กิวเมนต์แรก:

การอ่านคำพูดของ Jeff Atwood ข้อบกพร่องส่วนใหญ่จะมีคุณสมบัติเป็น:

ความพยายามพิเศษที่เราต้องทำในการพัฒนาในอนาคตเนื่องจากทางเลือกที่รวดเร็วและสกปรก

ในแอปพลิเคชันทางธุรกิจเกือบทุกข้อบกพร่องมาจากตัวเลือกการออกแบบที่รวดเร็วและสกปรกหรือการปฏิบัติที่ไม่ดี (จะเป็นการขาดการทดสอบการใช้เทคโนโลยีที่นักพัฒนาไม่รู้จักเพียงพอขาดการสื่อสารขาดความเข้าใจในโดเมน ฯลฯ ) ซึ่งหมายความว่า"โดยการปรับการออกแบบที่รวดเร็วและสกปรกให้เป็นการออกแบบที่ดีขึ้น"และด้วยการปรับวิธีปฏิบัติที่ดีขึ้นธุรกิจสามารถแก้ไขข้อบกพร่องส่วนใหญ่ได้

อาร์กิวเมนต์ที่สอง:

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

  • ต้องจัดการกับข้อบกพร่องเหล่านั้นก่อนที่จะสร้างคุณสมบัติใหม่ (จุดที่ 5 ของการทดสอบ Joel: คุณแก้ไขข้อบกพร่องก่อนที่จะเขียนรหัสใหม่หรือไม่?)

  • หรือเก็บบั๊กรักษา / เพิ่มทางหนี้ทางเทคนิค


1
โดยส่วนตัวฉันไม่คิดว่าข้อบกพร่องเป็นหนี้ทางเทคนิคแม้ว่าการโต้แย้งที่นำเสนอในคำตอบนี้จะได้ผล แต่ก) มันไม่สำคัญว่าเราจะกำหนด IMO หนี้ทางเทคนิคได้อย่างไรและข) นี่เป็นคำตอบที่ดีมากที่ฉันเขียน m ลงคะแนนมันต่อไป +1!
ไบรอัน Oakley

13

Jeff Atwood ในบทความของเขาการชำระหนี้ทางเทคนิคของคุณให้คำตอบที่ดีเกี่ยวกับหนี้ทางเทคนิคคือ:

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

พูดอย่างเคร่งครัดข้อบกพร่องไม่ได้เป็นส่วนหนึ่งของหนี้ทางเทคนิคถ้าพวกเขาไม่ชะลอการพัฒนาซอฟต์แวร์เพิ่มเติม (การเปลี่ยนแปลงสิ่งต่าง ๆ การเพิ่มคุณสมบัติใหม่ ฯลฯ ) เป็นข้อบกพร่องของซอฟต์แวร์

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


1
ที่จริงแล้วพวกเขาทำเพราะข้อบกพร่องอาจนำไปสู่การทำงานพิเศษเกี่ยวกับคุณสมบัติใหม่ที่จะไม่จำเป็นโดยไม่ต้องข้อบกพร่อง ฉันเคยเห็นโค้ดที่พัฒนาไปในทิศทางที่ไม่ดี (สร้างหนี้ด้านเทคนิคมากขึ้น) เนื่องจากข้อผิดพลาดที่พัฒนาเป็นอย่างใดอย่างหนึ่ง "มันไม่ใช่ข้อผิดพลาด แต่เป็นฟีเจอร์" เพราะลูกค้าเขียนสคริปต์หรืออะไรก็ตามที่ขึ้นอยู่กับพฤติกรรมบั๊กกี้
Marjan Venema

@MarjanVenema จุดที่ดี ฉันไม่ได้คิดอย่างนั้น
BЈовић

โปรดทราบว่าคำพูดนี้ไม่ได้มาจากเจฟฟ์แอดก็จะนำมาจากการโพสต์ของมาร์ตินฟาวเลอร์ Jeff พูดสิ่งนี้เช่นกันในโพสต์บล็อกของเขา
Uooo

6

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

ผู้กระทำผิดที่ใหญ่ที่สุดของหนี้ทางเทคนิคคือ "การแก้ไขข้อผิดพลาดชั่วคราว" คุณรู้ว่าสิ่งที่คุณทำเพื่อผ่านการทดสอบและได้รับการยอมรับเรื่องที่คุณสัญญาไว้กับตัวเองว่าคุณจะ refactor ในภายหลัง แต่ไม่เคยทำ เนื่องจากการแก้ไขชั่วคราวเหล่านี้มีการแก้ไขและสิ่งอื่น ๆ สะสมรหัสจึงกลายเป็นความยุ่งเหยิงที่ไม่จำเป็นยากที่จะอัปเดตและทดสอบและโดยทั่วไปแล้วเป็นฝันร้าย แต่ก็ยังทำงานได้

สำหรับการสนับสนุนความคิดเห็นนี้ฉันไปที่แหล่งข่าว Ward Cunningham เกี่ยวกับเรื่องนี้วอร์ดทำการสัมภาษณ์ที่ดีสักพักหนึ่งกับ Capers Jones มันคุ้มค่ากับการดู

การโต้วาทีทางเทคนิคกับ Ward Cunningham & Capers Jones

บทความที่ควรค่าแก่การอ่านคือ Martin Fowler

Martin Fowler เกี่ยวกับหนี้ทางเทคนิค

ภายในบทความของ Martin โปรดค้นหาลิงก์ไปยังการอ้างถึงต้นฉบับของหนี้ทางเทคนิคโดย Ward Cunningham จาก OOPSLA92:

ระบบการจัดการพอร์ตการลงทุนของ WyCash

อ้างจากบทความข้างต้น:

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

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


"ไม่ควรส่งมอบซอฟต์แวร์ที่มีข้อบกพร่องในตอนแรก" ซอฟต์แวร์ทั้งหมดยกเว้นโปรแกรมที่ง่ายที่สุดมีข้อบกพร่อง คุณตั้งค่าแถบนี้สูงเกินไป
bhspencer

2

คำตอบสำหรับคำถามของคุณอย่างเคร่งครัดคือไม่

หนี้ทางเทคนิคสามารถ (และอาจจะ) นำไปสู่ข้อบกพร่อง แต่สรุปว่าข้อผิดพลาดใด ๆ ที่เป็นผลมาจากหนี้ทางเทคนิคมีการวางการตีความระหว่างสองข้อเท็จจริง: มีข้อผิดพลาดและมีหนี้ทางเทคนิค (สมมติว่าสามารถสรุปได้ว่าเป็นความจริง)

หากนายการต่อสู้ของคุณระบุว่า 'เป็นทฤษฎี' ที่ข้อบกพร่องเป็นผลมาจากหนี้ทางเทคนิคเขากำลังตัดมุม หากเขาพูดถึงข้อผิดพลาดบางอย่างที่ปรากฏขึ้นอีกครั้งเขาอาจพูดถูก - เราไม่สามารถเห็นคุณภาพของรหัสได้จากที่นี่ ;-)

เขาอาจมีการร้องเรียนอย่างต่อเนื่องเกี่ยวกับคนที่ไม่ฟังเขาเกี่ยวกับหนี้ทางเทคนิคและดังนั้นจึงติดป้ายทุกข้อผิดพลาดเป็นหนี้ทางเทคนิค แต่ตอนนี้ฉันคาดเดา


2

ในความคิดของฉันมันไม่สำคัญว่าคุณจะพูดว่าข้อบกพร่องเป็นส่วนหนึ่งของหนี้ทางเทคนิค ... หรือไม่

ความจริงธรรมดาคือข้อบกพร่องที่มีอยู่แสดงถึงการทำงานพิเศษที่อาจจำเป็นต้องดำเนินการในอนาคตเพื่อแก้ไขปัญหาหรือเพื่อแก้ไขปัญหา

หนี้ทางเทคนิค (ตามปกติแล้วจะใช้ป้ายกำกับ) นอกจากนี้ยังหมายถึงงานพิเศษที่อาจต้องดำเนินการในอนาคต ... ไม่ทางใดก็ทางหนึ่ง

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

ดังที่ลูอิสคาร์โรลเขียนว่า:

'เมื่อฉันใช้คำหนึ่ง' Humpty Dumpty กล่าวด้วยน้ำเสียงที่ดูถูกเหยียดหยาม 'มันหมายถึงสิ่งที่ฉันเลือกให้หมายถึง - ไม่มากไปหรือน้อยไป' .

ที่จริงแล้วภาษาธรรมชาติทำงานอย่างไร คำหมายถึงสิ่งที่ผู้คนคิดว่าพวกเขาหมายถึง คำจำกัดความของพจนานุกรมและอื่น ๆ เป็นเพียงเอกสารวิธีการใช้คำและไม่จำเป็นต้องเป็นเอกสารที่ถูกต้อง หาก Scrum Master ของคุณต้องการอ้างถึงข้อบกพร่องที่รู้จักกันว่าเป็นหนี้ทางเทคนิคใครจะพูดว่าเขาเป็น "ผิด"?


1 - การอ้างอิงผู้คนเช่น Ward Cum Birmingham และ Caper Jones ไม่ได้ช่วยอะไรเช่นกัน อย่างดีที่สุดมันบอกเราว่าพวกเขาหมายถึง (หรือหมายถึง) เมื่อพวกเขาใช้ (ใช้) วลี พวกเขาไม่ได้ "เจ้าของ" วลี แม้ว่าพวกเขาจะมีอำนาจอย่างไม่ต้องสงสัยในประเด็นเหล่านี้ แต่ก็เป็นเพียงความคิดเห็นของพวกเขา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.