ฉันเห็นปัญหาร้ายแรงบางอย่างสำหรับคำถามนี้ เริ่มกันเลย.
วิธีหยุดการสูญเสียเวลาในการออกแบบส่วนประกอบ
คำถามนี้ค่อนข้างโหลด นอกจากนี้คุณไม่ได้ออกแบบสถาปัตยกรรม คุณสถาปนิก สถาปัตยกรรมและการออกแบบเป็นกิจกรรมเสริมและกิจกรรมที่เกี่ยวข้อง แต่ไม่เหมือนกันแม้ว่าจะทับซ้อนกันก็ตาม
ในทำนองเดียวกันก็เป็นไปได้ที่จะเสียเวลาในการทำสถาปัตยกรรม (โดย over-architecting) คุณยังสามารถเสียเวลาไปกับการออกแบบและการเขียนโค้ดที่มากเกินไป (โดยการเข้ารหัสสิ่งต่าง ๆ ในลักษณะที่ซับซ้อนเกินกว่าที่จำเป็นหรือล้มเหลว รหัสสำหรับสิ่งที่จำเป็น)
สถาปัตยกรรมที่เหมาะสมมีวัตถุประสงค์เพื่อป้องกันของเสียในการเขียนโค้ด มันทำได้โดยการ จำกัด การ จำกัด และจัดทำเอกสารในวิธีที่เป็นไปได้ที่ระบบที่ซับซ้อนคือ 1) ออกแบบ 2) เขียนโค้ดและทดสอบ 3) ส่งมอบ 4) บำรุงรักษา 5) กู้คืนจากความล้มเหลวและ 6) ปลดประจำการในที่สุด
ประสบการณ์ของฉันคือการที่คนที่เพิ่งสนุกกับการเขียนโค้ดพวกเขาแค่เขียนโค้ดโดยไม่คิดว่าระบบจะทำงานและบำรุงรักษาในระยะยาวได้อย่างไรย้ายไปที่มันฝรั่งร้อนตัวต่อไปเพื่อทิ้งวิญญาณที่น่าสงสาร
แต่ฉันเชือนแช ...
นี่คือสิ่ง: สำหรับระบบที่ง่ายพอสถาปัตยกรรมมีความชัดเจนในตัวเองและเกิดจากการออกแบบเสียงและการใช้งาน
มันมีไว้สำหรับระบบขนาดใหญ่ที่เกี่ยวข้องกับคนจำนวนมากหรือซอฟต์แวร์ระดับระบบที่ทำสิ่งที่ซับซ้อนมากซึ่งต้องการสถาปัตยกรรมที่ชัดเจน
ฉันเพิ่งจบการศึกษาจากมหาวิทยาลัยและเริ่มทำงานเป็นโปรแกรมเมอร์ ฉันไม่พบว่ามันยากที่จะแก้ปัญหา "ทางเทคนิค" หรือทำการดีบั๊กสิ่งที่ฉันจะพูดมี 1 วิธี
นั่นเป็นขั้นต่ำที่จำเป็นสำหรับอาชีพนี้และฉันดีใจที่คุณไม่มีปัญหาในการทำ (ฉันจะเป็นกังวลหากคุณทำ)
แต่ดูเหมือนจะมีปัญหาหลายอย่างที่ไม่มีวิธีแก้ปัญหาเดียว
สิ่งเหล่านี้คือขนมปังและเนยในอาชีพของเราประเภทของปัญหาที่นายจ้างยินดีจ่ายเงินเดือน (โดยทั่วไป) ของเราที่สูงกว่าค่าเฉลี่ย
แท้จริงแล้วปัญหาที่ควรแก้ไขคือปัญหาที่มีมากกว่าหนึ่งวิธี ปัญหาโลกแห่งความจริงพวกเขาเป็นอย่างนั้น และโลกต้องการความเชี่ยวชาญของเราในฐานะนักพัฒนาซอฟต์แวร์เพื่อสร้างการแลกเปลี่ยนที่ยอมรับได้
- สิ่งต่าง ๆ เช่นสถาปัตยกรรมซอฟต์แวร์
สถาปัตยกรรมของสิ่งต่าง ๆ เป็นลักษณะที่หลีกเลี่ยงไม่ได้ของระบบที่ซับซ้อนไม่ว่าจะเป็นเสมือน / ซอฟต์แวร์หรือในโลกที่เป็นรูปธรรม ทุกระบบที่ทำงานจะรับอินพุตและสร้างเอาต์พุตมันจะซับซ้อนและมีสถาปัตยกรรม
เมื่อเราพัฒนาซอฟต์แวร์สำหรับระบบดังกล่าว (ระบบธนาคารระบบตรวจสอบพลังงานระบบขายตั๋ว ฯลฯ ) เรามุ่งมั่นที่จะผลิตซอฟต์แวร์ที่เลียนแบบฟังก์ชั่นและข้อกำหนดของระบบดังกล่าว
เราเพียงแค่ไม่สามารถปีกมันและรหัสมันสไตล์คาวบอย เราต้องการสถาปัตยกรรมบางอย่าง นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งหากโครงการต้องการวิศวกรจำนวนมากหากไม่มาก
สิ่งเหล่านี้ทำให้ฉันงงงวยและทำให้ฉันเป็นทุกข์มาก
ไม่เป็นไร มันไม่ใช่เรื่องง่ายที่จะเรียนรู้หรือสอนไม่ใช่การฝึกฝนมากมาย
ฉันใช้เวลาหลายชั่วโมงพยายามตัดสินใจว่าจะ "ออกแบบ" โปรแกรมและระบบของฉันอย่างไร ตัวอย่างเช่นฉันจะแบ่งตรรกะนี้ออกเป็น 1 หรือ 2 ชั้นฉันจะตั้งชื่อชั้นเรียนได้อย่างไรฉันควรตั้งคำถามส่วนตัวหรือสาธารณะเป็นต้นคำถามประเภทนี้ใช้เวลานานและทำให้ฉันหงุดหงิดอย่างมาก ฉันแค่ต้องการสร้างโปรแกรมสถาปัตยกรรมถูกสาป
น่าเสียดายที่นั่นไม่ใช่สถาปัตยกรรมซอฟต์แวร์
มันไม่ได้ออกแบบมา แต่เป็นรหัส ฉันจะให้คำแนะนำที่ด้านล่างของโพสต์นี้
ฉันจะผ่านช่วงสถาปัตยกรรมได้เร็วขึ้นและเข้าสู่ช่วงการเข้ารหัสและการดีบักที่ฉันสนุกได้อย่างไร
ฉันมีเวลายากที่จะหาวิธีตอบคำถามนี้เพราะมันค่อนข้างจะเป็นอารมณ์
เรากำลังพยายามทำให้งานสำเร็จหรือไม่หรือเราแค่พยายามเพลิดเพลินไปกับการฝึกฝน? มันยอดเยี่ยมมากเมื่อทั้งคู่เป็นคนเดียวกัน แต่ในชีวิตจริงหลายครั้ง
มันยอดเยี่ยมมากที่ได้ทำสิ่งต่าง ๆ ที่เราชอบ แต่ในอาชีพที่มีความซับซ้อนเช่นของเราที่จะมุ่งเน้นไปที่สิ่งที่เราชอบนั่นไม่ใช่การนำไฟฟ้าไปสู่อาชีพที่ประสบความสำเร็จ
คุณจะไม่ก้าวหน้าคุณจะไม่เติบโตหรือได้รับความรู้ใหม่
มีคำพูดนี้ในกองทัพบก "โอบกอดดูด"
วลีอื่น ๆ มีคำแนะนำที่คล้ายกัน "ถ้ามันไม่ดูดมันก็ไม่คุ้มค่า" และฉันชอบ "ถ้ามันดูด (และมันสำคัญ) ให้ทำจนกว่ามันจะหยุดดูด"
คำแนะนำของฉัน:
ดูเหมือนว่าคุณจะยังคงดิ้นรนที่จะเข้าใจความแตกต่างระหว่าง
การเข้ารหัส (วิธีการรหัสคลาสของคุณ, โมดูลหรือสิ่งใด, อนุสัญญาการตั้งชื่อ, การเปิดเผยการเข้าถึง, ขอบเขต, ฯลฯ ),
การออกแบบ (จำนวนเทียร์, front-end / back-end / db, แต่ละการสื่อสาร, สิ่งที่เกิดขึ้น) และการตัดสินใจทางสถาปัตยกรรมโดยปริยายซึ่งมาจากการออกแบบระบบที่เรียบง่าย
สถาปัตยกรรม (ตามที่พบในระบบที่ซับซ้อนที่ต้องใช้คนนับพันหากไม่นับแสนชั่วโมง)
ดังนั้นฉันขอแนะนำให้คุณเจาะลึกลงไปในหัวเรื่องแรก (การเข้ารหัส) เพื่อนำไปสู่ระดับถัดไป
ทำความสะอาดรหัส
Robert "Uncle Bob" Martin "Clean Code"เป็นจุดเริ่มต้นที่ดี
การทำงานร่วมกันของซอฟต์แวร์
นอกจากนี้ฉันขอแนะนำให้คุณทำความคุ้นเคยกับตัวชี้วัดซอฟต์แวร์เชิงวัตถุที่เรียกว่า LCOM หรือ LCOM4
มันอาจเป็นเรื่องทางคณิตศาสตร์มากกว่าและไม่ใช่การพิสูจน์ด้วยกระสุน แต่เป้าหมายของคุณควรเข้าใจและตรวจจับ (หรือลูกตาถ้าคุณต้องการ) ถ้าชั้นเรียนมีความเหนียวหรือถ้าขาดการเชื่อมโยงกัน
http://www.aivosto.com/project/help/pm-oo-cohesion.html#LCOM4
https://www.computing.dcu.ie/~renaat/ca421/LCOM.html
หลักการซอฟต์แวร์
สิ่งนี้เกี่ยวข้องอย่างใกล้ชิดกับ"หลักการความรับผิดชอบเดี่ยว"หรือ SRY ที่เราทุกคนควรคุ้นเคย SRY เป็นหนึ่งใน 5 "โซลิด"ที่เราทุกคนต้องคุ้นเคยถ้าเราต้องมีความเชี่ยวชาญในการเขียนโปรแกรม
ในขณะที่เราดำเนินการตามหลักการของ SOLID เราต้องทำความคุ้นเคยกับหลักการ"GRASP"ซึ่งควบคุมหรือแนะนำวิธีที่เราใช้รหัสคลาส
หนังสือเพิ่มเติม
สุดท้ายฉันขอแนะนำต่อไปนี้:
"Refactoring"โดย Martin Fowler และ Ken Beck จะเป็นหนังสือเล่มต่อไปที่ฉันอ่านในรายการนี้
"ออกแบบโดยสัญญาตามตัวอย่าง"โดย Richard Mitchell, Jim McKim และ Bertrand Meyer (ต่อมาจากชื่อเสียงของหอไอเฟล) หนังสือเล่มนี้พิมพ์ออกมา แต่คุณสามารถหาสำเนาราคาถูกได้ใน Amazon
ด้วยสิ่งนี้คุณควรเข้าใจวิธีการเริ่มต้นการเขียนโปรแกรมและการออกแบบและด้วยการฝึกฝนเพื่อย้ายและต้นแบบสถาปัตยกรรมซอฟต์แวร์ (หรืออย่างน้อยเข้าใจ)
ฉันแน่ใจว่าจะมีผู้เชี่ยวชาญคนอื่น ๆ ที่จะเพิ่มลบหรือคัดค้านคำแนะนำเหล่านี้ พวกเขาจะได้คำแนะนำอื่น ๆ ซึ่งน่าจะผ่านการตรวจสอบจากประสบการณ์ของพวกเขาเอง
ทั้งหมดที่ฉันสามารถพูดได้คือ - ไม่มีทางลัด
ทั้งหมดที่ดีที่สุด