คุณจะทำอย่างไรถ้าคุณถึงจุดจบของการออกแบบในวิธีวิวัฒนาการเช่น Agile หรือ XP


11

ขณะที่ฉันอ่านโพสต์บล็อกที่โด่งดังของ Martin Fowler Is Design Dead? หนึ่งในความประทับใจที่น่าประทับใจที่ฉันได้รับคือความจริงที่ว่าใน Agile Methodology และ Extreme Programming การออกแบบและการเขียนโปรแกรมนั้นเป็นวิวัฒนาการ

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

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

ฉันไม่ได้สนับสนุนการปฏิบัติที่ไม่ใช่แบบ Agileที่นี่ แต่ฉันต้องการทราบจากผู้ที่ฝึกฝนวิธีการพัฒนาแบบว่องไวหรือวนซ้ำหรือแบบวิวัฒนาการเพื่อประสบการณ์ที่แท้จริงของพวกเขา

คุณเคยไปถึงจุดจบแล้วหรือยัง? คุณมีวิธีจัดการเพื่อหลีกเลี่ยงหรือหนีออกมาได้อย่างไร? หรือมีมาตรการเพื่อให้แน่ใจว่าการออกแบบยังคงสะอาดและยืดหยุ่นตามที่วิวัฒนาการ

คำตอบ:


17

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

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

เนื่องจากฉันมาจากดินแดน OO สำหรับฉันแต่ละบล็อกเป็นคลาสและพื้นที่ผิวของบล็อกนั้นเป็นส่วนต่อประสานสาธารณะ (สิ่งที่มองเห็นได้จากคลาสภายนอกหรือคลาสที่ได้รับ) ถ้าคุณทำตามหลักการ SOLID ที่ดีคุณจะต้องแน่ใจว่าแต่ละบล็อคนั้นง่ายมากและมีส่วนต่อประสานสาธารณะที่ใช้งานง่าย กลับไปที่การเปรียบเทียบของฉันคุณต้องการให้แน่ใจว่ารหัสของคุณสร้างรูปร่างที่เรียบง่ายเท่านั้น เมื่อใดก็ตามที่คุณสร้างคลาสที่ซับซ้อนเกินไป (ฟังก์ชั่นมากมายหลายตัวแปร) คุณสร้างรูปร่างที่ยากที่จะนำมาใช้ใหม่เมื่อความต้องการเปลี่ยนแปลง

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

ตราบใดที่คุณใช้เวลาในการถอยกลับและพูดว่าเดี๋ยวก่อนชั้นนี้มีสมาชิก 15 คนแล้วให้ฉันแยก 6 ตัวเหล่านี้และใส่ในชั้นเรียนของพวกเขาเองซอฟต์แวร์ของคุณจะเบามาก น้ำหนักเบายืดหยุ่นและนำมาใช้ใหม่ได้ แน่นอนว่า PMs มาพร้อมกับเปลี่ยนความต้องการผลิตภัณฑ์ครึ่งหนึ่งของคุณคุณอาจต้องถอดบล็อกบางส่วนออกวางบนชั้นวางแล้ววาดใหม่ (เช่นเมื่อสร้างปราสาทคุณอาจไม่ได้ใช้ทั้งหมด ถังของคุณ) แต่ ณ จุดนั้นนั่นเป็นเพียงส่วนหนึ่งของการทำธุรกิจ ความต้องการเปลี่ยนแปลงและด้วยการรักษารหัสของคุณให้มีความยืดหยุ่นและเป็นโมดุลคุณควรจะสามารถเปลี่ยนผลิตภัณฑ์ให้สอดคล้องกับทิศทางธุรกิจใหม่ของคุณได้

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

ฉันแค่พยายามจะบอกว่าฉันคิดว่าตัวเองค่อนข้างดีในการออกแบบซอฟต์แวร์ ในเวลาเดียวกันถ้าคุณขอให้ฉันเขียนเอกสารการออกแบบ 100 หน้ามอบให้ coder และคาดหวังให้มันทำงานฉันอาจไม่สามารถออกแบบตัวเองออกจากถุงกระดาษได้ เมื่อเริ่มทำงานบางครั้งฉันจะร่างไดอะแกรม UML ที่คล้ายกัน (ง่ายมากไม่เต็มภาษา) แต่เมื่อฉันเริ่มเขียนโค้ดฉันจะ refactor ตามความต้องการและรหัสสุดท้ายของฉันจะไม่เหมือนที่ฉันวาด แม้ว่าฉันจะใช้เวลาหนึ่งหรือสองเดือนคิดเกี่ยวกับรายละเอียดเล็ก ๆ น้อย ๆ ทุกอย่าง แต่ฉันไม่สามารถถ่ายภาพคนอื่นที่สามารถนำไดอะแกรมของฉันมาใช้กับซอฟต์แวร์ที่เป็นของแข็งได้โดยไม่ต้องดัดแปลงการออกแบบเนื่องจากพวกเขากำลังเขียนโค้ด

อีกด้านหนึ่งของสเปกตรัมปัจจุบันในทีมของฉัน (ตอนนี้เปรียวและฉันสนับสนุนอย่างเต็มที่) เรามีผู้ชายสองคนที่เข้าร่วมกับเราจากดินแดนฝังตัวที่พวกเขาทำ C ในช่วง 15 ปีที่ผ่านมา เห็นได้ชัดว่าฉันช่วยในการวางแผนเริ่มต้นและออกชั้นเรียน แต่ฉันก็แน่ใจว่าได้ติดตามความคิดเห็นเกี่ยวกับรหัสปกติและการประชุมระดมสมองที่เราจะพูดคุยเกี่ยวกับการประยุกต์ใช้ SOLID และหลักการออกแบบ พวกเขาสร้างรหัสสปาเก็ตตี้ที่ทำให้ฉันประจบประแจงเพียงเล็กน้อย แต่ด้วยความดุดันเล็กน้อยจากฉันพวกเขาเริ่มต้นการซ่อมแซมสิ่งที่ผลิตไปแล้วและส่วนที่ตลกคือหนึ่งในนั้นกลับมาหาฉันในไม่กี่วันต่อมาและพูดว่าฉันเกลียด ที่จะพูด แต่หลังจากที่ย้ายรหัสนั้นออกไปแล้วจะมีลักษณะที่สามารถอ่านและเข้าใจได้ง่ายขึ้น หันหน้าไปทาง Dead-end จุดที่ฉัน พยายามทำคือแม้แต่คนที่ใหม่ OO สามารถสร้างรหัสที่ค่อนข้างดีตราบใดที่เขามีที่ปรึกษาที่มีประสบการณ์มากกว่าเพื่อเตือนเขาว่า "การออกแบบวิวัฒนาการ" ไม่เหมือนกับ "ไม่มีการออกแบบ" และแม้กระทั่งบางส่วนของ "ความซับซ้อนมากขึ้น" ของเขาก็ไม่ได้น่ากลัวเพราะแต่ละชั้นไม่มีความรับผิดชอบมากขนาดนั้น (นั่นคือไม่ได้รหัสมาก) ดังนั้นที่เลวร้ายที่สุดมาถึงเลวร้ายยิ่งถ้าชั้นหนึ่ง "ปลายตาย" เรา เชยและเขียนคลาสทดแทนที่มีส่วนต่อประสานสาธารณะแบบเดียวกัน (จนถึงตอนนี้ฉันไม่เคยเห็นความจำเป็นที่จะเกิดเหตุการณ์นี้ในทุกสิ่งที่เราเขียนและฉันทำรีวิวโค้ดสองครั้งต่อสัปดาห์)

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

แดงฉันเขียนมาก ขอโทษสำหรับเรื่องนั้น.


1
+1 มันคุ้มค่าสำหรับทุกคำ ฉันเจอสถานการณ์เหล่านี้ตามที่คุณอธิบายและหลังจากถึงกำหนดเวลาแล้วขอให้พวกเขาทำความสะอาด (อ่าน refactor) ให้มากขึ้นจากสิ่งที่ฉันคิดว่าเป็นเรื่องของการออกแบบ แต่บ่อยครั้งที่ผู้คนพบคำถามเดียวกันซ้ำแล้วซ้ำอีก - ทำไมฉันถึงทำสิ่งเดียวกันนี้อีกครั้ง? ฉันเดาว่าตอนนี้ฉันมีคำตอบ - ถ้าคุณต้องการเวลาเร็วกว่าในการทำตลาดและอนุญาตให้ออกแบบเพื่อการพัฒนาการปรับโครงสร้างใหม่ไม่ใช่การชดเชยบาปเก่าของคุณ แต่จริงๆแล้วเป็นสิ่งที่ถูกต้องตามกฎหมาย
Dipan Mehta

ใช่คุณเขียนมาก แต่มันเป็นสิ่งที่ดี ชอบอ่านมันจริงๆ :)
Radu Murzea

11

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

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

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

คุณจะหลีกเลี่ยงปลายตายได้อย่างไร

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

คุณจะทำอย่างไรถ้าคุณมีคนตาย?

"Dead-End" ไม่แตกต่างจากบล็อกทางเทคนิคอื่น ๆ ที่คุณจะได้รับระหว่างการพัฒนาสิ่งที่เป็นนวนิยาย สิ่งแรกที่ต้องตระหนักคือไม่มี "ความตาย" ที่แท้จริงที่บังคับให้คุณต้องย้อนรอยอย่างสมบูรณ์ อย่างน้อยที่สุดการเรียนรู้ของคุณจนถึงจุดนี้คือสิ่งที่ช่วยให้คุณก้าวไปข้างหน้าดังนั้นความพยายามจึงไม่สูญเปล่า เมื่อคุณกดสิ้นตายคุณมีปัญหา ปัญหาคือสิ่งที่จำเป็นต้องเปลี่ยนแปลงเพื่อให้ตรงตามข้อกำหนดใหม่ (หรือเก่า) บางอย่างและวิธีเพิ่มประสิทธิภาพในการเปลี่ยนแปลงนี้ สิ่งที่คุณต้องทำตอนนี้คือแก้ปัญหานี้ ขอขอบคุณที่เป็นซอฟต์แวร์และไม่ใช่เช่นการออกแบบเครื่องบินเพราะการเปลี่ยนแปลงนั้นง่ายกว่ามาก ระบุปัญหาแก้ไขได้ == refactor == วิศวกรรมซอฟต์แวร์ บางครั้งงานจำนวนมากเข้ามาเกี่ยวข้อง ...

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

ความต้องการอันโด่งดังบางประการได้เปลี่ยนแปลงไปจากโลกของระบบปฏิบัติการที่อยู่ในใจฉัน

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


Windows NT รุ่นแรก ๆ นั้นใช้ "Hardware Extract Layer" และรองรับ DEC Apha และ x86 เนื่องจากไม่มีใครเคยซื้อเครื่องจักรที่ใช้ DEC อัลฟ่าจึงถูกทิ้งอย่างเงียบ ๆ ฉันคิดว่า "ความเป็นอิสระของเครื่องจักร" นี้ยังคงอยู่ในรูปแบบร่องรอยในรุ่นปัจจุบันดังนั้นพอร์ต ARM อาจไม่ยาก
James Anderson

3

ฉัน refactor โครงการของฉันอย่างถาวรและใช้แผนภาพคลาส UML ฉันหมายถึงฉันสร้างไดอะแกรมคลาสหนึ่งหรือหลายแพ็กเกจตามแพ็คเกจ แต่ละไดอะแกรมจะถูกบันทึกไว้ที่รูทของแพ็คเกจ ตัวแยกประเภท UML แต่ละรายการมีรหัสของตัวเองซึ่งถูกแมปกับรหัส Java ที่เกี่ยวข้อง หมายความว่าเมื่อฉันเปิดไดอะแกรมจะมีการอัปเดตการเปลี่ยนแปลงการเปลี่ยนรหัสใหม่ล่าสุดโดยอัตโนมัติ ฉันยังสามารถเปลี่ยนไดอะแกรมชั้นเรียนของฉันในระดับกราฟิกโดยตรงและโครงการทั้งหมดของฉันจะได้รับการปรับโครงสร้างใหม่ทันที มันใช้งานได้ดี แต่มันจะไม่มีวันมาแทนที่มนุษย์ แผนภาพคลาส UML ของฉันเป็นเพียงมุมมองกราฟิกของโค้ดของฉัน มันสำคัญมากที่จะไม่ผสมโค้ดและตัวแบบเช่น EMF eclipse กำลังทำอยู่เพราะทันทีที่ทำการปรับโครงสร้างเสร็จแล้วข้อมูลโมเดลก็จะสูญหายเช่นกัน ฉันไม่เคยใช้ตัวสร้างรหัสแบบจำลองการขับเคลื่อนการพัฒนาเพราะไม่มีประโยชน์ ฉันไม่ '

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

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

ขออภัยที่จะยาว แต่ฉันคิดว่าเราควรให้โอกาสที่สองกับคลาสแผนภาพ UML หากใช้เป็นมุมมองกราฟิกของโครงการของเราเท่านั้น หมายความว่า UML ครอบคลุมโครงการเต็มรูปแบบและมีรูปแบบเดียวที่ประกอบด้วยไดอะแกรมชั้นเรียนขนาดใหญ่ที่แสดงถึงโครงการทั้งหมด มันจะไร้สาระที่จะมีมุมมองเล็ก ๆ นับร้อยและแบบจำลองสำหรับแต่ละมุมมองภายในโครงการที่มีมุมมองเป็นร้อย :-)


1
+1 เพื่อแสดงแนวคิดของรหัสโพสต์ UML! น่าสนใจพอเราไม่เคยกลับไปที่เอกสารไดอะแกรมหลังจากรหัส!
Dipan Mehta

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

3

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

ฉันเข้าหาแต่ละกรณีด้วยวิธีเดียวกันซึ่งดูเหมือนจะทำงานได้ดี:

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

ค่าใช้จ่าย:

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

ประโยชน์ที่ได้รับ:

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

2

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

วิธีการแก้ปัญหาของเรา (และสิ่งที่ฉันเชื่อว่าเป็นมาตรฐานเดียวสำหรับ SCRUM) คือการทุ่มเทการวิ่งทั้งหมด (~ 2 สัปดาห์) ให้เหลือ แต่การปรับปรุงใหม่ ไม่มีการเพิ่มฟังก์ชันการทำงานใหม่ในช่วงเวลานี้ แต่เราสามารถคิดเกี่ยวกับ codebase ปัจจุบันและออกแบบระบบที่ดีกว่าสำหรับสิ่งที่เรากำลังทำอยู่

เราผ่านพ้นสิ่งกีดขวางนั้นไปแล้วและได้เพิ่มคุณสมบัติใหม่อีกครั้ง


นี่เป็นอีกแรงเสียดทานที่ยิ่งใหญ่ในการค้นหา ต้องบอกกับลูกค้า - ตอนนี้เรากำลังสร้างสิ่งเดียวกัน - คุณสมบัติที่ไม่มีอะไรใหม่หลังจากส่งมอบเวอร์ชั่นแรก! คุณจะสามารถบอกเรื่องนี้กับลูกค้าได้บ่อยครั้งและบ่อยครั้งเพียงใด (ถ้าเคย) หรือคุณอธิบายได้อย่างไร
Dipan Mehta

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

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

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

2

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


2

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

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

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


1

Fred Brooks ที่พูดอะไรบางอย่างเช่น "วางแผนว่าจะโยนลูกแรกออกไป" หรือไม่? อย่ามัวกังวลเกี่ยวกับมันมากเกินไปการออกแบบเดด - เอนด์ก็ปรากฏขึ้นในโปรเจ็กต์ที่พยายามทำการออกแบบทั้งหมดด้วยเช่นกัน การออกแบบใหม่เกิดขึ้นในการพัฒนาทุกประเภทไม่ว่าจะเป็นเพราะมันเป็นการออกแบบที่ไม่สามารถใช้งานได้ตั้งแต่เริ่มต้น (เมื่อ 20% ที่ผ่านมาซึ่งมันวาวมากกว่า - "ปีศาจอยู่ในรายละเอียด") หรือเพราะลูกค้าเปลี่ยนโฟกัสของพวกเขา ไม่มีความต้องการระฆังปลุกจริง ๆ ไม่ต้องกังวลเกินไป

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