ฉันรู้วิธีการโปรแกรมและวิธีการเรียนรู้วิธีการเขียนโปรแกรม แต่คุณเรียนรู้วิธีการสร้างระบบได้อย่างถูกต้องที่ไหน? [ปิด]


11

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

PS: อย่าลังเลที่จะแก้ไขแท็กของฉันฉันไม่รู้ว่าฉันกำลังพูดถึงอะไร

แก้ไข: ฉันถือว่าตัวอย่างบางส่วนที่ฉันเขียนนำไปใช้กับระบบประเภทอื่นเช่นกันฉันก็ไม่รู้ตัวอย่างที่ดีอื่น ๆ เพราะฉันมีส่วนเกี่ยวข้องกับงานเว็บเป็นส่วนใหญ่

คำตอบ:


10

เท่าที่ฉันสามารถบอกได้โปรแกรมเมอร์มืออาชีพเรียนรู้สิ่งเหล่านี้สามวิธีหลัก:

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

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


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

1
ฉันเห็นด้วย Shadur แต่ฉันคิดว่าประสบการณ์เลวร้ายบางอย่างจำเป็นต้องเป็นของคุณเอง บางคนพยายามนั่งข้างสนามรอจนกว่าพวกเขาจะสามารถทำสิ่งที่สมบูรณ์แบบได้ แต่พวกเขาต้องการเพียงแค่เข้าไปที่นั่นและเริ่มทำถ้าพวกเขาต้องการพัฒนาทักษะของพวกเขา
William Pietri

4

เมื่อพูดถึงเว็บแอปมีข้อมูลที่ดีรวบรวมไว้ในคำตอบนี้มากกว่าที่อื่น ๆ ที่ฉันเคยเห็น

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


ดังนั้นฉันคิดว่ามันต่างกันสำหรับสิ่งที่แตกต่างกันใช่มั้ย
MetaGuru

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

3

ฉันชอบคำตอบของ William Pietri มาก (+1) แต่ฉันเชื่อว่าต้องเพิ่ม แม้แต่สันนิษฐานว่าสิ่งที่คุณหมายถึงโดยระบบประกอบด้วยซอฟต์แวร์เพียงอย่างเดียว

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

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

  1. นักวิเคราะห์ธุรกิจ

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

    นี่เป็นครั้งแรกที่สิ่งที่ระบบต้องทำคือการเริ่มต้นของการคิดอย่างจริงจัง

  2. สถาปนิกระบบ

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

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

  3. ผู้ออกแบบระบบ

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

    คาดว่าจะมีการปรับปรุงสถาปัตยกรรมของระบบต่อไปและอาจเป็นการวิเคราะห์ธุรกิจ

  4. ผู้จัดการการทดสอบ

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

นั่นเป็นบทสรุปสั้น ๆ

คน / gals เหล่านั้นเป็นเพียงการดำเนินการทั่วไปของคนในโรงสีเพื่อคิดเกี่ยวกับสิ่งที่ต้องคิด

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

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

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

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

HPH, asm


2

ที่นี่เพื่อเรียนรู้มีหนังสือเกี่ยวกับสิ่งประเภทนี้หรือไม่?

ไม่ใช่ "หนังสือ" หนังสือมากมาย.

ไม่มีถนนหลวง

อย่างที่ฉันบอกว่าดูเหมือนว่าจะมีความแตกต่างอย่างมากระหว่างการเขียนโค้ดและการเขียนรหัสที่ถูกต้อง

ขวา.

คุณกำลังพูดถึง "สถาปัตยกรรม" การเขียนโปรแกรมในขนาดใหญ่

ขั้นตอนที่ 1 อ่านรหัสจำนวนมาก ของจริงมาก ๆ คิดถึงสิ่งที่คุณต้องการจะทำ ค้นหาโครงการโอเพ่นซอร์สที่เกี่ยวข้อง อ่านรหัส ทั้งหมดของมัน.

ขั้นตอนที่ 2 อ่านรหัสเพิ่มเติม มากขึ้น

ขั้นตอนที่ 3 อ่านหนังสือเกี่ยวกับสถาปัตยกรรม


2
อ่านอ่านอ่าน แต่ฉันต้องแนะนำว่ามันไม่เหมือนกับสิ่งที่คุณเรียนรู้เมื่อคุณใช้ระบบจริง
quentin-starin

@qes: คำถามคือ "คุณเรียนรู้วิธีสร้างระบบที่เหมาะสมได้ที่ไหน" คุณไม่ได้เรียนรู้ด้วยการสร้างระบบที่ไม่ดี แท้จริงแล้วการใช้ระบบจริงอย่างไม่ดีเป็นสิ่งที่ตรงกันข้ามกับการเรียนรู้
S.Lott

3
จาก Code Complete หนึ่งในสิ่งที่ฉันชอบที่สุด: "สาขาวิศวกรรมซอฟต์แวร์ทำให้การใช้ตัวอย่างที่ จำกัด อย่างมากเป็นพิเศษสำหรับความสำเร็จและความล้มเหลวในอดีตหากคุณสนใจสถาปัตยกรรมคุณต้องศึกษาภาพวาดของ [สถาปนิกที่มีชื่อเสียง] ... เยี่ยมชมอาคารบางแห่ง ... ".
จาค็อบ

@ S.Lott: ใครพูดอะไรเกี่ยวกับการทำมันไม่ดี?
quentin-starin

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

1

เพื่อขยายอ่านหนังสือจำนวนมาก ....

ตอนนี้คุณรู้ว่าคุณมีปัญหามีบางจุดที่บอกให้คุณอ่านหนังสือเหล่านี้ (ก่อนที่คุณจะทำงานจริงมีประเด็นเล็ก ๆ น้อย ๆ ในการอภิปรายหนังสือเหล่านี้)

รูปแบบการออกแบบโดย Gamma, Helm, Johnson และ Vlissides รูปแบบภาษาของการออกแบบโปรแกรม 1,2,3 และ 4

แต่อย่าพยายามใช้ทุกลายที่คุณเห็นว่าสามารถใช้งานได้

นั่นก็เป็นสิ่งเลวร้ายเช่นกัน

หวังว่านี่จะช่วยได้


1

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

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

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

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


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