ต้องใส่รายละเอียดเท่าไหร่ในการทำซ้ำครั้งแรกของโครงการ


15

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

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

  1. เขียนโค้ดคุณภาพสูงอย่างละเอียดตั้งแต่เริ่มต้นพร้อมการจัดการข้อยกเว้นทั้งหมดและอย่างที่คุณรู้ว่าคุณจะต้องใช้ในที่สุด

  2. เขียนแบบร่างคร่าวๆที่ทำงานน้อยที่สุดตั้งแต่เริ่มต้นและเข้าไปเพื่อเติมในส่วนย่อยทั้งหมดในภายหลัง

คำถามที่เกี่ยวข้อง: เมื่อไรที่จะเสียสละ "ความเรียบร้อย" ของการออกแบบเพื่อให้โครงการเสร็จ


1
หมายเหตุสำหรับผู้ตอบที่มีศักยภาพ: OP ได้ถามถึงวิธีการสร้างความสมดุลของคุณภาพของรหัสกับความเร็วในการพัฒนาในรอบแรกของการทำซ้ำ (สันนิษฐาน) คำถามไม่ได้หากผลิตภัณฑ์สุดท้ายควรมีคุณภาพสูง (การจัดการข้อผิดพลาด robus ฯลฯ ) แต่เมื่อต้นแบบควรเริ่มต้นรวมหรือแปลงเป็นรหัสที่มีคุณภาพสูง
Lilienthal

คำตอบ:


10

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

สิ้นสุดผลลัพธ์

คุณกำลังเขียนซอฟต์แวร์ควบคุม Mars Orbiter อยู่หรือไม่? จากนั้นคุณควรทำให้แน่ใจว่าคุณกำลังเขียนโค้ดที่มีประสิทธิภาพที่สุดเท่าที่จะเป็นไปได้คุณควรตรวจสอบทุกข้อยกเว้นในเรื่องที่มีสติ

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

คุณคาดหวังว่าจะไปที่นั่นได้อย่างไร?

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

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

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

ตอนนี้หาคำตอบของคุณเอง

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

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

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


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

1
@neuronet: บางครั้งความแข็งแกร่ง "มันเพิ่งจะได้ผล" ก็เพียงพอแล้ว วิธีหนึ่งในการคิดเกี่ยวกับมันคือการเปรียบเทียบความยุ่งยากที่คุณได้รับเมื่อทำงานกับซอฟต์แวร์กับความแข็งแกร่งที่ต้องการ ปัญหาที่น่าผิดหวังมากขึ้นของซอฟต์แวร์คือยิ่งมีความสำคัญต่อการแก้ไข
Bart van Ingen Schenau

11

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

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

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

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


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

ฉันหวังว่าฉันจะทำให้ชัดเจนว่าแม้ว่าคุณจะรู้สิ่งเหล่านี้ถ้าคุณไม่ต้องการพวกเขาแล้วคุณไม่ต้องการพวกเขา
Robert Harvey

4

มีวิธีการที่ง่ายและใช้งานได้จริงสำหรับโครงการขนาดเล็กถึงขนาดกลาง แม้ว่ามันอาจจะไม่ทำงานได้ดีสำหรับ Mars Explorers

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

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

จากคุณสมบัติทั้งหมดเหล่านี้จะทำหน้าที่สำคัญที่โปรแกรมต้องทำ - คุณสมบัติหลัก

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

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

จากนั้นคุณสามารถใช้งานคุณสมบัติที่เหลือได้ตามต้องการ

คุณภาพของรหัสเทียบกับฟีเจอร์

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

ทีนี้แล้วการจัดการข้อยกเว้นล่ะ

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

อย่างไรก็ตามมีข้อกำหนดขั้นต่ำสำหรับข้อยกเว้น: ตรวจสอบให้แน่ใจว่าผู้ใช้ได้รับแจ้งหากมีสิ่งผิดปกติ - ไม่ว่าผลลัพธ์ที่น่าเกลียดจะเป็นอย่างไร อย่ากลืนข้อยกเว้นบางแห่ง


1
"ฉันมักจะสันนิษฐานว่าฉันจะยุ่งมากจนฉันไม่มีเวลากลับมาที่ฟีเจอร์และแก้ไขมัน" นี่คือความกังวลที่ฉันมีที่ฉันควรจะพูดถึง ดีใจที่คุณพูดถึงมันและสำหรับโพสต์ที่เป็นประโยชน์
neuronet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.