ฉันจำเป็นต้องเข้าใจอัลกอริทึมและโครงสร้างข้อมูลเพื่อที่จะเรียกว่าโปรแกรมเมอร์หรือไม่? [ปิด]


37

หกปีแล้วที่ฉันเขียนโปรแกรม การเขียนโค้ดลงในทุกสิ่งเช่น ActionScript, JavaScript, Java, PHP, Ajax, XML HTML, ASP และอื่น ๆ ฉันใช้อาร์เรย์, แผนที่, รายการที่เชื่อมโยง, ชุด, ฯลฯ ทุกที่ที่ฉันทำงานคนเช่นฉัน แต่เมื่อใดก็ตามที่ฉันสัมภาษณ์มันมีโอกาสมากที่ผู้คนจะถามฉันเกี่ยวกับแฮชต้นไม้กองและคิว คำถามบางข้อเกี่ยวกับการเล่นกลอัลกอริทึมการเรียงลำดับ ฉันไม่รู้ว่าควรจะรู้จักพวกเขาจริง ๆ หรือฉันควรหยุดเรียกตัวเองว่าเป็นโปรแกรมเมอร์ มีบางอย่างในตัวฉันที่บอกฉันด้วยถึงแม้ว่าคนที่ถามคำถามเหล่านี้ทั้งหมดจะเลือกฉันพวกเขาจะไม่ทำให้ฉันทำงานกับสิ่งเหล่านี้ ฉันจำเป็นต้องรู้ทั้งหมดนี้จริง ๆ หรือไม่


10
ขึ้นอยู่กับว่าคุณทำงานที่ไหนและใครที่คุณอยากจะเรียกคุณว่าโปรแกรมเมอร์
ทิม

1
ใช่ถ้าไม่มีคำคุณศัพท์เชิงลบใด ๆ
duros

คำตอบ:


79

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


6
ว้าวฉันคาดหวังครึ่งหนึ่งว่าสิ่งนี้จะถูกลดทอนลงในการให้อภัยโดยผู้คนที่ถูกต้องทางการเมืองมากเกินไปสำหรับการใช้คำว่า "รหัสลิง"
dsimcha

15
"simian ซอฟต์แวร์" เป็นคำศัพท์ที่ต้องการเสมอ
STW

3
ฉันไม่เห็นด้วยทั้งหมด ประเภทของซอฟต์แวร์ที่กำลังเขียน "ตั้งแต่เริ่มต้น" มีผลกระทบอย่างมากต่อผู้ที่สามารถเขียนได้ ซอฟต์แวร์บางตัวต้องการความซับซ้อนน้อยกว่าหรือมากกว่า
Nick Spreitzer

8
+1, 20% เพราะฉันเห็นด้วย, 5% เพราะ "Real Programmer TM" และ 75% เพราะฉันได้เรียนรู้ภาษาแอสเซมบลีและต้องการที่จะแกล้งว่ามันคุ้มค่ากับความเจ็บปวด
Carson Myers

3
งานที่มีอยู่ส่วนใหญ่ต้องการเพียง 'รหัสลิง' เป็นเรื่องปกติที่ผู้คนในงาน 'รหัสลิง' มักจะลืมความรู้เดิมทั้งหมดของเขาทำให้ตัวเองมากกว่า 'ลิงรหัส' ทุกวันแม้จะมีศักยภาพ :(
cag

32

ผู้ที่ไม่ทราบประวัติจะถูกประณามว่าจะสร้างใหม่


75
ในความเป็นจริงผู้ที่ไม่ทราบประวัติจะถูกประณามเพื่อสร้างมันขึ้นมาใหม่โดยใช้วิธี O (N 2) หรือ O (N 3) แทนที่จะใช้วิธี O (N log N) ที่รู้จักกันดีที่เก่าแก่พอที่จะซื้อเหล้าใน 50 ทั้งหมด รัฐ
John R. Strohm

@John ROFLMAO - จริงเกินไป!
Steven A. Lowe

3
.... ถึงวาระที่จะแนะนำ

30

การทำงานในภาษาอย่าง JavaScript ทำให้ค่อนข้าง obsolote เนื่องจาก Array เป็นการผสมผสานระหว่างเวกเตอร์แฮชและทรีและสามารถใช้เป็นสแต็กหรือคิวได้ ไม่น่าเป็นไปได้ที่คุณจะต้องใช้หรือสามารถใช้โครงสร้างข้อมูลใน JavaScript ที่มีประสิทธิภาพสูงกว่าคลาส Array นี่เป็นกรณีใน PHP

สำหรับ Java OTOH มีความแตกต่าง ฉันคิดว่าห้องสมุดมาตรฐานของ Java ให้ข้อมูลเกี่ยวกับโครงสร้างข้อมูลที่คุณต้องการ อย่างไรก็ตาม:

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

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

มีสองสิ่งที่แน่นอน:

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

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

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


13

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

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

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

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

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

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

ขอให้โชคดีกับทุกสิ่งที่คุณเลือก


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

+1 ด้วยถ้อยคำที่ว่า 'ฉันคิดว่าในการตอบคำถามของคุณคุณควรถามตัวเองว่า "ฉันต้องการเป็นอะไรฉันจะไปกับอาชีพของฉันที่ไหน'
Bill

11

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

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

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


1
ขอบคุณสำหรับคำตอบ. ฉันจะแบ่งปันกับคนสัมภาษณ์ตลก ua intervewing ฉันต้องการใครสักคนที่ดีในด้านส่วนติดต่อผู้ใช้โดยใช้ json css ajax javascript jquery ฯลฯ พวกเขาถามฉันว่าคุณจะเขียนเว็บเซิร์ฟเวอร์อย่างไร และจะเกิดอะไรขึ้นเมื่อมีการกดบันทึกในแฟ้มคำ
sushil bharwani

2
@sushil - ฉันคิดว่านั่นคือการจัดเรียงของสถานที่ที่คุณไม่ต้องการที่จะทำงาน ...
จอนฮอปกินส์

@sushil: ฉันทั้งหมดเห็นด้วยกับ @ จอนฮอปกินส์ การทำงานเป็นบริกรที่ดีกว่ากำลังรองานที่ดีกว่ารับงานแบบนั้น การมีคนงี่เง่าไร้ความสามารถในฐานะผู้บังคับบัญชาจะทำให้คุณหงุดหงิดอย่างมากและขัดขวางคุณในการพัฒนาตนเอง
back2dos

6

เป็นคำถามที่ดีมาก Javascript หรือ Java หรือ VC ++ เป็นภาษาการเขียนโปรแกรมขั้นสูงที่คุณไม่จำเป็นต้องสร้างรายการที่เชื่อมโยงหรือตารางแฮชตั้งแต่เริ่มต้น แต่คุณยังต้องมีความสามารถในการตัดสินใจว่าจะใช้เมื่อใดที่หนึ่งเหนืออื่น ๆ การลงโทษประสิทธิภาพและโบนัสแต่ละเกิดขึ้น ฯลฯ

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


ขอบคุณมากฉันจะรับคำแนะนำของคุณและเริ่มเรียนรู้เกี่ยวกับหัวข้อเหล่านั้น
Mahmoud Hossam

3

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


2

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


2

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

-Charles E. Leiserson

คำแนะนำที่ดีจากการวิเคราะห์อัลกอริทึมโดย Charles E. Leiserson - MIT


1

ขึ้นอยู่กับโครงการ: ฉันเป็น BEng ในวิศวกรคอมพิวเตอร์และฉันทำงานเป็นโปรแกรมเมอร์วิเคราะห์

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

อัลกอริทึมแบบดั้งเดิมและโครงสร้างข้อมูลเป็นชนิดของ "รูปแบบพจนานุกรม" ในโลกของนักพัฒนา

บางลิงค์ที่ยอดเยี่ยม:


1

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

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

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

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


0

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

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

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

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