แนวคิดของความซับซ้อนในการคำนวณสำคัญสำหรับนักพัฒนาซอฟต์แวร์หรือไม่? [ปิด]


11

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

แนวคิดของความซับซ้อนในการคำนวณสำคัญสำหรับนักพัฒนาซอฟต์แวร์หรือไม่? และควรสอนในหลักสูตรระดับปริญญาตรีหรือไม่


1
เพื่ออธิบายคำถามโดยใช้ตัวอย่าง: ผู้สำเร็จการศึกษาที่ฉันเจอไม่ทราบความO(n^2)หมาย
Muhammad Alkarouri

1
คำถามที่เกี่ยวข้องที่น่าสนใจ: programmers.stackexchange.com/q/20832/6184
Muhammad Alkarouri

คำตอบ:


12

ในมหาวิทยาลัยส่วนใหญ่ฉันคิดว่า (ฉันหวังว่า!) เวลาและความซับซ้อนของความทรงจำนั้นเป็นส่วนหนึ่งของหลักสูตรของพวกเขา

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

ในทางตรงกันข้ามฉันคิดว่านักพัฒนาทุกคนควรตระหนักถึงความซับซ้อนของเวลา / พื้นที่ของโครงสร้างข้อมูลและอัลกอริทึมที่ใช้


8

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


6

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

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

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

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

แก้ไข:

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

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

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


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

1
@MuhammadAlkarouri ฉันได้แก้ไขคำตอบของฉันเพื่อแก้ไขปัญหานี้เล็กน้อย
Dmitri

4

ใช่

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

ปรับปรุง: ทำไมมันสำคัญ

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

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


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

หากโปรแกรมควรเสร็จใน 2 วัน แต่จะใช้เวลา 2 ปีแทนฉันจะบอกว่าพวกเขาล้มเหลวในการทำงานที่พวกเขาได้รับค่าจ้าง
dietbuddha

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

หรืออาจเป็นกระบวนการตัดสินใจที่นำไปสู่การจ้างคนที่ไม่มีคุณสมบัติเข้าโปรแกรมเป็น "ผู้พัฒนาซอฟต์แวร์" แทนที่จะเป็น "ผู้พัฒนาซอฟต์แวร์ jr." หรือ "ฝึกงาน"
dietbuddha

3

ฉันพบว่าการถามว่า "สำคัญหรือไม่" นั้นค่อนข้างคลุมเครือ

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

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

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

เป็นสิ่งสำคัญสำหรับโปรแกรมเมอร์ที่พัฒนา GUI สำหรับแอปพลิเคชันหรือไม่ อาจไม่เป็นเพราะกรอบงาน GUI ที่ประสบความสำเร็จเป็นนามธรรมทำให้รายละเอียดเล็ก ๆ น้อย ๆ เหล่านั้นหมดไป

เป็นเรื่องดีที่รู้อยู่เสมอเหมือนทุกอย่าง แต่มันไม่ได้ทำให้โปรแกรมเมอร์ (หรือแม้แต่ส่วนใหญ่) ไม่ได้ทำงานเพียงเพื่อความพึงพอใจของนายจ้าง

ในทางตรงกันข้ามถ้ามีใครลงทะเบียนเพื่อการศึกษาที่สูงขึ้นในการค้นหาการศึกษาขั้นพื้นฐานและเชิงทฤษฎีเราควรคาดหวังว่าจะเรียนรู้วิชาที่มีความหมายทางทฤษฎีมากกว่าการปฏิบัติ ในความคิดของฉันมันเป็นสิ่งสำคัญที่ CompSci นักเรียนเรียนรู้เกี่ยวกับความซับซ้อนเช่นเดียวกับสิ่งสำคัญที่พวกเขาเรียนรู้เกี่ยวกับแคลคูลัส

แต่อย่างไรก็ตามตั้งแต่ CompSci เมื่อใด โปรแกรมสอนคนวิธีการเป็นโปรแกรมเมอร์ที่ดี? เพื่อให้คุณมีโปรแกรมการฝึกอบรมเฉพาะและประสบการณ์การปฏิบัติ (ทั้งของคุณหรือเพื่อนโปรแกรมเมอร์ที่สามารถแบ่งปันของพวกเขากับคุณ)


1
ส่วนที่สองอาจคลุมเครือน้อยกว่า: ควรสอนให้นักเรียนที่เรียนหลักสูตร Compsci ในระดับ BSc หรือไม่
Muhammad Alkarouri

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