ทำเสร็จแล้วกับการออกแบบซอฟต์แวร์ที่มั่นคง?


17

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

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

คำตอบ:


20

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

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

คำแนะนำที่ดี: ถ้าคุณต้องเลือกระหว่างสองตัวเลือกอย่าอวดอ้างรายละเอียดนานเกินไป บ่อยครั้งที่ไม่มี "ดี" หรือ "ไม่ดี" ในบางสถานการณ์ A จะดีกว่าในบาง B จะและโดยรวมความแตกต่างระหว่างทั้งสองอาจไม่คุ้มค่ากับเวลาเสมอไป

มีประสบการณ์มากมายในการออกแบบซอฟต์แวร์หรือเกมดังนั้นให้แน่ใจว่าคุณใช้เวลาในการค้นคว้า (เช่นการอ่านหนังสือเกี่ยวกับการออกแบบการอ่านเกี่ยวกับประสบการณ์ของผู้อื่นการพูดคุยกับเพื่อนโปรแกรมเมอร์เกี่ยวกับการออกแบบ ฯลฯ ) )


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

1
อ่า วิเคราะห์อัมพาต ศัตรูที่ยิ่งใหญ่ที่สุดของฉัน! ฉันควรสร้างเกมที่ให้บริการวิเคราะห์อัมพาตเป็น End-Boss ฉันควรเริ่มต้นด้วยการออกแบบสถาปัตยกรรมเกมก่อน ... Noooo! พูดเล่นกัน: คำตอบที่ดีและความคิดเห็นที่ดี!
bummzack

12

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

มีหลักการที่เรียกว่าYAGNIหรือที่เรียกว่า"คุณไม่ต้องการมัน" ซึ่งโดยทั่วไปบอกว่าคุณไม่ควรใช้อะไรจนกว่าคุณจะรู้ว่าคุณต้องการมัน

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

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


8

สิ่งนี้ประเมินว่าเป็นจริงในความคิดของฉันในวันนี้:

  • ลัทธินิยมนิยมมากกว่าอุดมการณ์
  • (1) ทำให้มันทำงาน (2) จากนั้นทำให้ถูกต้อง - เล่นเกมให้จบถ้าคุณลืมขั้นตอนที่ 2
  • ปล่อยมัน!
  • การออกแบบด้านหน้ามากเกินไปจะเป็นการเสียเวลา
  • TDDและClean Codeนำไปสู่การออกแบบซอฟต์แวร์ที่ง่ายขึ้นและมีเสถียรภาพมากขึ้น

คุณสามารถอธิบายรายละเอียดเกี่ยวกับการพัฒนาโดยใช้การทดสอบในการตั้งค่าเกมได้หรือไม่? นอกเหนือจากตรรกะพื้นฐานบางอย่างแล้วฉันไม่เคยพบโปรแกรมแบบโต้ตอบขั้นสูงที่เหมาะสำหรับสิ่งนี้ นอกจากนี้คุณกำลังเชื่อมโยงไปยังหน้าแก้ความกำกวม;)
drxzcl

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

@Ranier ขอบคุณแก้ไขลิงค์ ฉันยอมรับว่าการเริ่มต้นการทดสอบครั้งแรกสำหรับการจำลองสถานการณ์แบบโต้ตอบหรือเกมไคลเอนต์ - เซิร์ฟเวอร์อาจเป็นเรื่องยุ่งยาก นอกเหนือจากการทดสอบหน่วยของคุณคุณอาจต้องการทดสอบการใช้งานระดับสูงขึ้นและอาจเล่นเซสชันที่เล่นในบางช่วง ไม่ว่าในกรณีใดการคิดเกี่ยวกับการทดสอบครั้งแรกมีแนวโน้มที่จะจ่ายในหลาย ๆ สถานการณ์ ค้นหามุมมองที่น่าสนใจในgamedev.stackexchange.com/questions/1905/…
jmp97

5

ฉันเป็นเพื่อนกับการสร้างต้นแบบอย่างรวดเร็วของซอฟต์แวร์ โดยเฉพาะในช่วงพัฒนาเกม เหมาะสำหรับการเรียนรู้ทดสอบและใช้งานอย่างรวดเร็ว สำหรับการเขียนโปรแกรมฮาร์ดแวร์หรืออัลกอริทึมที่ซับซ้อนเป็นวิธีที่ดีที่สุดสำหรับฉัน

Theory();
RapidPrototype();
bool bOk = false;
while(!bOk)
{
 Testing();
 LotOfFixing();
 PlayingWith(); 
 bOk= AnalysingResults();
}
FinalFastAndNiceDataStructuresAndCode();

Rapid Prototype รุ่นของฉันต้องมีเปลือกต้นแบบที่เหมาะสม:

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

ข้อดี:

  • คุณสามารถปรับปรุงเปลือก RapidPrototype ระหว่างการพัฒนาทั้งหมด
  • คุณสามารถดูและตั้งค่ารหัสของคุณได้หลายวิธี
  • คุณสามารถมุ่งเน้นเฉพาะทฤษฎีและปัญหาที่คุณต้องแก้ไข
  • คุณสามารถพัฒนาส่วนใหม่ของโครงการได้อย่างรวดเร็วและลองกับส่วนที่เหลือของสิ่งสุดท้าย
  • คุณสามารถส่งสิ่งใหม่ ๆ เพื่อใช้ในการเติมเนื้อหาได้เร็วขึ้นและทำการสรุปในภายหลัง (โดยเฉพาะในกรณี sandbox)
  • คุณสามารถอธิบายและแสดงรายการราคาหรือวิธีแก้ปัญหาให้คนอื่นได้อย่างง่ายดาย ออนไลน์
  • ต้นแบบ Funcional และโปร่งใสเป็นแหล่งข้อมูลที่ดีที่สุดสำหรับรหัสสุดท้าย (ใคร ๆ ก็สามารถทำได้)

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


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

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

1

มีลักษณะที่พัฒนาซอฟต์แวร์เปรียว แม้ว่ามันจะไม่ใช่ bullet Silver แต่มันก็มีจุดมุ่งหมายที่จะทำทั้งสองอย่าง (ทำให้เสร็จและมีการออกแบบซอฟต์แวร์ที่แข็งแกร่ง)


2
ฉันไม่คิดว่าจะมีวิธีการพัฒนาใด ๆ ที่ไม่ได้อ้างว่า "ทำให้เสร็จและมีนักออกแบบซอฟต์แวร์ที่แข็งแกร่ง"

@ โจฉันคิดว่าวิธีการ "เฮฟวี่เวท" หลายครั้งมักจะชอบ CYA มากกว่าซอฟต์แวร์ที่เป็นของแข็ง แน่นอนประสบการณ์ที่ไม่คล่องแคล่วของฉันมีแนวโน้มที่จะเป็น "ไม่จำเป็นต้องถูกต้องตอนนี้ต้อง" ขณะที่ "เปรียว" มีจุดมุ่งหมายที่จะพูดว่า "ต้องเป็นตอนนี้ แต่ทำทุกอย่างที่คุณ สามารถทำสิ่งที่ถูกต้องในขณะที่คุณไปด้วย "
dash-tom-bang

ฉันจะเถียงว่าการพัฒนาที่คล่องตัวนั้นมีอิทธิพลเพียงเล็กน้อยต่อรหัสว่ามีความมั่นคงหรือไม่ สาระสำคัญของความคล่องตัวคือการใช้เวลาในการพัฒนาทั้งหมดกับสิ่งที่สำคัญ รหัสยังคงเป็นระเบียบเมื่อส่งมอบเนื่องจากคุณภาพของรหัส (หรือการขาดหนี้ด้านเทคนิค) ไม่ค่อยเป็นการวัดความสำเร็จในการจัดส่ง
Magnus Wolffelt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.