มันเป็นสัญญาณที่ไม่ดีที่ฉันมักจะออกแบบใหม่ในขณะที่ฉันพัฒนาโครงการหรือไม่?


39

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

  • "เฮ้ฉันต้องการเรียนเพื่อทำ_ _. ฉันไม่เคยคิดถึงเรื่องนี้มาก่อนเลย"
  • "เดี๋ยวก่อนฟังก์ชั่นนี้ควรอยู่ในชั้นเรียนนั้นแทนที่จะเป็นแบบนี้ฉันจะย้ายมันไป"
  • "นี่ควรจะเป็นสองคลาสแทนหนึ่งฉันจะแยกมันออก"
  • "ฉันควรทำให้คลาสแบบสแตนด์อโลนทั้งสามนี้สืบทอดมาจากคลาสนามธรรม"
  • Etcetera, Etcetera

มันเป็นสัญญาณที่ไม่ดีที่ฉันมักจะออกแบบใหม่เช่นนี้เมื่อฉันไปตาม? นี่หมายความว่าฉันเป็นโปรแกรมเมอร์ที่ยากจนหรือเป็นเรื่องปกติ

คำตอบ:


41

นี่เป็นส่วนหนึ่งของการพัฒนาตามปกติ หลักสำคัญสองประการของการออกแบบอย่างต่อเนื่องคือ:

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

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

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


3
+1 นี่คือเหตุผลที่ฉันมักจะประจบประแจงเมื่อมีคนพูดถึงการทำให้เป็นอันดับวัตถุในฐานข้อมูล -> แล้วถ้าพรุ่งนี้ชั้นเรียนของคุณถูกระเบิดในหลายส่วน ฉันชอบทางเลือกอื่นของ Protobuf (คลาสเฉพาะสำหรับการจัดเก็บ / แลกเปลี่ยนข้อความ) ที่คลาสหลักของคุณมีอิสระในการพัฒนาและคุณเพียงแค่ต้องปรับเลเยอร์ซีเรียลไลซ์
Matthieu M.

@Matthieu - คุณเขียนการย้ายฐานข้อมูล ใช้เวลานานกว่าหนึ่งชั่วโมงในการเขียนและทดสอบ Ruby on Rails มีระบบอำนวยความสะดวกที่ดีมากสำหรับการย้ายฐานข้อมูล
วินไคลน์

1
@ เควิน: เราไม่มีฐานข้อมูลเดียวกันฉันเดาว่าฉันมีหลายร้อยล้านบรรทัด การโยกย้ายไม่ใช่ตัวเลือก
Matthieu M.

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

12

สิ่งที่คุณกำลังทำอยู่เรียกว่า "ฟื้นฟู" หากคุณหยุดทำเช่นนั้นคุณมีปัญหา

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


10

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

การพัฒนาซอฟต์แวร์แบบ Agileนั้นมีวิธีปฏิบัติเพื่อรองรับสิ่งนี้ซึ่งแตกต่างจากแบบจำลองของน้ำตก


5

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

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

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


6
ขั้นตอนที่ 1: สร้างไดอะแกรม UML ขั้นตอนที่ 2: เขียนรหัส ขั้นตอนที่ 3: โยนแผนภาพ UML ออกไปเพื่อให้ไม่มีใครเห็นและสับสนเกี่ยวกับวิธีการทำงานของรหัส
kubi

4

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

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


2

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

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


0

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

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