ฉันควรรู้แนวคิดวิทยาศาสตร์คอมพิวเตอร์อะไรบ้าง [ปิด]


95

คุณคิดว่าแนวคิดใดในวิทยาการคอมพิวเตอร์ทำให้คุณเป็นโปรแกรมเมอร์ที่ดีขึ้น

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

คุณสมบัติภาษา

  • ตัวชี้และการเรียกซ้ำ (ขอบคุณ Joel!)

โครงสร้างข้อมูล

  • รายการที่เชื่อมโยง
  • Hashtables

อัลกอริทึม

  • ประเภทฟอง

เห็นได้ชัดว่ารายการสั้นไปหน่อยในขณะนี้ดังนั้นฉันจึงหวังว่าจะได้รับคำแนะนำเกี่ยวกับ:

  1. ฉันควรเข้าใจแนวคิดอะไร
  2. แหล่งข้อมูลที่ดีสำหรับการทำความเข้าใจอย่างถูกต้อง (เนื่องจาก Wikipedia อาจมีความหนาแน่นและเป็นวิชาการในบางครั้ง)

5
ฟองสบู่? อยู่ห่างจากพวกเขาให้มากที่สุด! เรียนรู้วิธีการทำงานของ quicksort / heapsort
Carra

18
ใช่เรียนรู้ bubbleort เรียนรู้ว่าทำไมมันแย่มาก เรียนรู้ Quicksort การรวมและส่วนที่เหลือทั้งหมดรวมถึงจุดอ่อนของแต่ละคน แต่อย่าเขียนในรหัสการผลิต: เรียกใช้ฟังก์ชันการจัดเรียงที่มีให้โดยไม่ว่าคุณจะอยู่บนแพลตฟอร์มใด
Brian Ensink

@ Roger Pate - +1 สำหรับคุณเราควรรู้ว่าอัลกอริทึมหรือโครงสร้างข้อมูลนั้นดีสำหรับอะไรและอะไรที่มันแย่ ทั้ง Quicksort และ Bubblesort มีประสิทธิภาพเคสที่แย่ที่สุดเท่ากัน [O (n ^ 2)] แต่สำหรับอินพุตประเภทต่างๆกันมากและ Bubblesort มีประสิทธิภาพเคสที่ดีที่สุดของ O (n) โดยที่ QS ยังคงเป็น O (n log n) แน่นอนว่าหากคุณกำลังพิจารณา Bubblesort คุณอาจต้องการไปที่การเรียงลำดับการแทรกแทน
Andre Artus

คำตอบ:


60

ดูโพสต์บล็อกนี้โดย Steve Yegge (เดิมคือ Amazon ตอนนี้อยู่ที่ Google):

จะกล่าวถึงรายละเอียดบางประการเกี่ยวกับแนวคิดที่สำคัญที่สุดห้าประการที่นักพัฒนาควรต้องรู้:

  1. การเขียนโปรแกรมพื้นฐาน (รวมถึงการเรียกซ้ำไฟล์ I / O เอาต์พุตที่จัดรูปแบบลูป ฯลฯ )
  2. การออกแบบเชิงวัตถุ (รวมถึงรูปแบบการออกแบบ ฯลฯ ) คุณควรสามารถสร้างการออกแบบ OO ที่เหมาะสมและเข้าใจแนวคิด
  3. การเขียนสคริปต์และ regexes
  4. โครงสร้างข้อมูล - รายการชุดแฮชแท็กต้นไม้กราฟและอื่น ๆ ตลอดจนสัญกรณ์ Big O และความซับซ้อนของอัลกอริทึม
  5. บิตไบต์และเลขฐานสอง - วิธีแสดงตัวเลขภายในคอมพิวเตอร์และวิธีจัดการกับตัวเลขเหล่านี้

ลิงค์ที่ดี เน้นไปที่ด้าน unix เล็กน้อย (ไม่มี. NET โดยสมบูรณ์) แต่ก็ยังดี
Toon Krijthe

ลิงก์ที่ดี - มีหลายอย่างให้ฉันดำเนินการฉันแค่หวังว่ามันจะมีลิงค์ไปยังหน้าที่ดีที่อธิบายสิ่งเหล่านั้น
Jon Artus

ลิงก์นี้จะมีประโยชน์มากสำหรับฉันในการตรวจสอบตัวเองและติดตามข้อมูลพื้นฐาน ขอบคุณ ..
rpr

เห็นด้วยลิงค์ที่ดี ในขณะที่โซลูชันที่เป็นไปได้ที่ระบุจำนวนมากนั้นใช้ Unix แต่แนวคิดโดยรวมที่เกี่ยวข้องนั้นเป็นภาษา / แพลตฟอร์มที่ไม่เชื่อเรื่องพระเจ้า สำหรับโปรแกรมเมอร์ส่วนใหญ่สิ่งต่างๆเช่นการเรียกซ้ำการเขียน ADT เช่นต้นไม้และการดำเนินการระดับบิตนั้นค่อนข้างหายาก แต่ก็เป็นรากฐานที่สำคัญ
Zach Burlingame

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

35

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


1
คุณสามารถเริ่มต้นด้วยบทความ Wikipedia ที่ฉันเชื่อมโยงไป - มันค่อนข้างง่ายและถูกต้องทางคณิตศาสตร์
sharptooth

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

1
อย่าลืมแนวคิดของ NP และเมื่อมีปัญหาอยู่ในนั้นนักพัฒนาที่พยายามเขียนรหัส TSP (พนักงานขายที่เดินทาง) ลงในธุรกรรมฐานข้อมูลแต่ละรายการเพื่อจุดประสงค์ในการค้นหาหรือความโง่เขลาอื่น ๆ ที่เป็นปัญหาใหญ่ =]
Ed James

2
คุณควรทราบด้วยว่า O ขนาดใหญ่ไม่ได้บอกคุณว่าอัลกอริทึมใดใช้เวลาน้อยกว่า สิ่งที่ผู้สำเร็จการศึกษาจาก CS ส่วนใหญ่ไม่เข้าใจ
Martin Beckett

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

30

ฉันคิดว่ามันตลกเล็กน้อยที่คุณกำลังมองหาวิชาวิทยาการคอมพิวเตอร์แต่พบว่าวิกิพีเดียเป็นวิชาการเกินไป: D

อย่างไรก็ตามต่อไปนี้ไม่เรียงตามลำดับ:


2
+1 เนื่องจากคุณกล่าวถึงฐานข้อมูลซึ่งมักถูกมองข้ามในรายการประเภทนี้ แต่เป็นแนวคิดที่สำคัญมากสำหรับผู้สำเร็จการศึกษาด้าน CS ที่มีความรอบรู้
Brian Ensink

14

แนวคิดบางอย่างที่ช่วยในการพัฒนาของฉัน (สติปัญญาและรหัส):

  • Lexing, การแยกวิเคราะห์, การจับคู่สตริง, Regex
  • การท่องจำ
    • การห่อหุ้ม / การกำหนดขอบเขต / การปิด
    • เก็บเอาไว้
  • การเรียกซ้ำ
  • ตัวทำซ้ำ / เครื่องกำเนิดไฟฟ้า
  • การเขียนโปรแกรมเชิงฟังก์ชัน - บทความที่น่าทึ่งของ John Hughes มีคำว่า "why"

นี่คือโดเมนทั้งหมดของคณิตศาสตร์แบบไม่ต่อเนื่อง แต่จำเป็นต้องมีการแนะนำอย่างจริงจังสำหรับ CS:

  • เมทริกซ์ / พีชคณิตเชิงเส้น
  • ทฤษฎีกราฟ

แม้ว่าการบรรยายและบทความโดยมาร์คเจสัน Dominusมักจะถูกนำไปยังแฮกเกอร์ Perl ผมคิดว่าโปรแกรมเมอร์ใด ๆ ที่จะได้รับประโยชน์จากการนำเสนอที่ชัดเจนของเขาและรหัสจริงโดยเฉพาะอย่างยิ่งในการสั่งซื้อที่สูงขึ้น Perl


10

ฉันจะบอกว่าทุกวันนี้ความเข้าใจเกี่ยวกับ Object Orientated Programming เป็นสิ่งจำเป็นแม้ว่าคุณจะไม่จำเป็นต้องใช้มันแบบวันต่อวันก็ตาม

จากนี้ฉันจะบอกว่าการเข้าใจรูปแบบที่พบบ่อยที่สุดสามารถช่วยได้เช่นกัน


10

ฉันเห็นแนวคิดเกี่ยวกับ CS ที่ดีหลายประการ แต่มีการพูดถึงคณิตศาสตร์เพียงเล็กน้อย

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

ในขณะที่เราเรียนวิชาคณิตศาสตร์พีชคณิตเชิงเส้นมักเป็นสิ่งที่จำเป็นสำหรับคลาสคอมพิวเตอร์กราฟิกขั้นสูง


1
ถ้าฉันต้องเลือกเพียงอันเดียวมันจะเป็นคณิตศาสตร์ไม่ต่อเนื่อง มันค่อนข้างเป็น CS 101 ฉันยากที่จะคิดถึงพื้นที่หรือกระบวนทัศน์ในการเขียนโปรแกรมทั่วไปที่ DM ไม่ได้สัมผัส
Andre Artus

7

Programmer Competency Matrixกล่าวถึงรายละเอียดนี้ แต่ฉันจะเน้นสองสามข้อ:

  • โครงสร้างข้อมูล
    • โครงสร้างข้อมูลขั้นสูงเช่น B-tree, binomial และ fibonacci heaps, AVL / Red Black trees, Splay Trees, Skip Lists, tried เป็นต้น
  • อัลกอริทึม
    • ทรีกราฟอัลกอริทึมโลภง่ายหารและพิชิตสามารถเข้าใจความเกี่ยวข้องของระดับของเมทริกซ์นี้
  • การเขียนโปรแกรมระบบ
    • ทำความเข้าใจกับสแต็กการเขียนโปรแกรมทั้งหมดฮาร์ดแวร์ (CPU + หน่วยความจำ + แคช + อินเทอร์รัปต์ + ไมโครโค้ด) รหัสไบนารีแอสเซมบลีการเชื่อมโยงแบบคงที่และไดนามิกการรวบรวมการตีความการคอมไพล์ JIT การรวบรวมขยะฮีปสแต็กการกำหนดแอดเดรสหน่วยความจำ ...
  • การควบคุมเวอร์ชันซอร์สโค้ด
    • ความรู้เกี่ยวกับระบบ VCS แบบกระจาย ได้ทดลองใช้ Bzr / Mercurial / Darcs / Git
  • สร้างระบบอัตโนมัติ
    • สามารถตั้งค่าสคริปต์เพื่อสร้างระบบและเอกสารคู่มือผู้ติดตั้งสร้างบันทึกประจำรุ่นและแท็กโค้ดในการควบคุมแหล่งที่มา
  • การทดสอบอัตโนมัติ
    • เข้าใจและสามารถตั้งค่าการทดสอบการทำงานโหลด / ประสิทธิภาพและ UI อัตโนมัติได้
  • ปัญหาการสลายตัว
    • การใช้โครงสร้างข้อมูลและอัลกอริทึมที่เหมาะสมและมาพร้อมกับรหัสทั่วไป / เชิงวัตถุที่สรุปแง่มุมของปัญหาที่อาจเปลี่ยนแปลงได้
  • การสลายตัวของระบบ
    • สามารถมองเห็นภาพและออกแบบระบบที่ซับซ้อนด้วยสายผลิตภัณฑ์หลายกลุ่มและการผสานรวมกับระบบภายนอก นอกจากนี้ยังควรสามารถออกแบบระบบสนับสนุนการปฏิบัติงานเช่นการตรวจสอบการรายงานการทำงานล้มเหลวเป็นต้น

5

ฉันพบว่ากราฟและอัลกอริทึมที่ใช้บางอย่างเช่นความลึกก่อนการค้นหาก่อนหายใจเส้นทางที่สั้นที่สุด ฯลฯ มีประโยชน์มาก การวางแนววัตถุยังเป็นแนวคิดที่ใช้กันทั่วไป


4

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

อัลกอริทึมและโครงสร้างข้อมูลเป็นสองด้านของเหรียญเดียวกัน อัลกอริทึมขึ้นอยู่กับโครงสร้างข้อมูลโครงสร้างข้อมูลขึ้นอยู่กับอัลกอริทึม

ยกเลิกการเรียนรู้การจัดเรียงฟองโดยเร็วที่สุด อย่างจริงจัง. ภาษาสมัยใหม่ทั้งหมด (Java, Python และอื่น ๆ ) มีคลาสคอลเลกชันที่ใช้การเรียงลำดับที่ดีกว่าการเรียงลำดับฟอง ไม่มีสถานการณ์ใด ๆ ที่คุณควรใช้การเรียงลำดับฟองสำหรับสิ่งใด ๆ คุณควรมองหาคลาสคอลเลกชันที่มีวิธีการจัดเรียง ดีกว่าคุณควรมองหาอัลกอริทึมที่หลีกเลี่ยงการเรียงลำดับทั้งหมด

คุณต้องเรียนรู้หลายภาษา

  • ภาษาการเขียนโปรแกรม (Java, Python ฯลฯ )

  • ภาษาเชลล์

  • ภาษาฐานข้อมูล (SQL)

  • ภาษาในการนำเสนอ (HTML และ CSS)

  • ภาษาแสดงข้อมูลอื่น ๆ (XML, JSON)

คุณต้องเรียนรู้โครงสร้างข้อมูลหลายอย่าง

  • ลำดับ (รายการสิ่งที่เพิ่มขึ้นไฟล์)

  • ลำดับชั้น (เช่นเอกสาร XML และ HTML ตลอดจนระบบไฟล์พื้นฐาน)

  • เชิงสัมพันธ์ (เช่นฐานข้อมูลและระบบไฟล์ที่มีลิงก์แบบแข็งและแบบอ่อน)

  • Maps (หรือ Indexes หรือ Associative Arrays) รวมทั้ง Hash Maps และ Tree Maps

  • ชุด

บวกกับการวิเคราะห์ความซับซ้อนของอัลกอริทึม บางครั้งเรียกว่า "บิ๊กออ". เหตุใดการเรียงฟองจึงไม่ดีคือO ( n ^ 2) โดยที่ Quicksort คือO ( n log n )


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

มีอัลกอริทึมมากมายนับไม่ถ้วน ส่วนใหญ่ไม่ดี บางคนก็ดี Bubble Sort นั้นไม่ดีเลย ซื้อหนังสือเกี่ยวกับอัลกอริทึมและดำเนินการต่อ
ล็อต

เพียงแค่เลือกเล็กน้อย แต่ Quicksort เป็นกรณีที่เลวร้ายที่สุด O (n ^ 2) ฉันเพียงชี้ให้เห็นเพราะฉันคิดว่าการทำความเข้าใจว่าเหตุใดจึงเป็นความจริงจึงเป็นแบบฝึกหัดทางการศึกษาที่มีคุณค่าเมื่อศึกษาอัลกอริทึมพื้นฐาน
Brian Ensink

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

4

ตอนนี้หนอนกระป๋องเปิดแล้ว! :)
ฉันเริ่มเรียนสาขาวิศวกรรมไฟฟ้า

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

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

การเขียนโปรแกรมเชิงวัตถุ: หลายภาษาจะกลายเป็นรูปแบบนี้

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

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

ควบคุมเหตุการณ์ ... วิธีการทำงาน:
แยกสิ่งต่างๆออกจากรหัสของคุณ ช่วยให้ผู้อื่นทำการอัปเดตในอนาคตได้ง่ายขึ้น นอกจากนี้ยังค่อนข้างคล้ายคลึงกับเฟรมเวิร์ก Model / View / Controller (MVC)

พีเจ


3

สำหรับฉันฉันได้รับมากมายจากหลักสูตรต่อไปนี้ที่ตัวแทน

  • การบริหารโครงการ
  • ปฏิสัมพันธ์กับคอมพิวเตอร์ของมนุษย์ (ช่วยให้เราสามารถสร้างหน้าจอที่เป็นมิตรกับผู้ใช้มากขึ้น)
  • การออกแบบฐานข้อมูล (รวมถึงวิธีการทำงานของฐานข้อมูลบันทึกธุรกรรมการล็อก ฯลฯ )
  • คลังข้อมูล
  • กราฟิก (OpenGL)
  • อัลกอริทึมขั้นสูง
  • โครงสร้างข้อมูล

สิ่งที่ฉันหวังว่าฉันจะทำที่ตัวแทน

  • การก่อสร้างคอมไพเลอร์
  • รูปแบบการออกแบบ
  • ทฤษฎีออโตมาตา

3

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

Propositional Logic , First-Order Logic , Second-Order Logic : เป็นเครื่องมือที่ทรงพลังมาก อาจเป็นสิ่งที่สำคัญที่สุด (และสิ่งเดียว) ที่ฉันได้เรียนรู้ในมหาวิทยาลัย ลอจิกเป็นเหมือนปืนใหญ่ขนาดใหญ่ของโปรแกรมเมอร์ - ปัญหาที่ซับซ้อนมาก ๆ (รวมถึงปัญหาที่ซับซ้อนน้อยกว่า) จะง่ายขึ้นมากเมื่อคุณใส่มันลงในรูปแบบที่เป็นระเบียบและมีเหตุผล มันเหมือนกับพีชคณิตเชิงเส้นสำหรับวิศวกรเครื่องกล


3

ฉันคิดว่าความเข้าใจที่ดีเกี่ยวกับวิธีการทำงานของคอมไพเลอร์เป็นสิ่งที่ควรรู้ Aho มีหนังสือคลาสสิกเกี่ยวกับแนวคิดที่ใช้ในการสร้างคอมไพเลอร์ ชื่อเรื่องคือคอมไพเลอร์: หลักการเทคนิคและเครื่องมือ ชื่อเล่นของมันคือหนังสือมังกร เพื่อที่จะเข้าใจหนังสือเล่มนั้นอย่างแท้จริงคุณควรมีความเข้าใจภาษาที่เป็นทางการ Hopcroft มีหนังสือดีๆเกี่ยวกับเรื่องนี้ - Introduction to Automata Theory, Languages, and Computation


2

2

มีการพูดถึงคำตอบที่ดีมากมายที่นี่แล้ว แต่ฉันต้องการเพิ่มชุดย่อยของสิ่งที่สำคัญ แต่ยังไม่ได้รับการกล่าวถึง

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

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

หากภาษา / แพลตฟอร์มของคุณไม่รองรับ Garbage Collection การจัดสรรหน่วยความจำและการล้างข้อมูลเป็นสิ่งสำคัญและจะเพิ่มเข้าไปในรายการ


2

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

ฉันยังต้องการเพิ่มสิ่งที่ S.Lott พูดเกี่ยวกับภาษา การเรียนรู้หลายประเภทของภาษาก็สำคัญเช่นกัน ไม่ใช่แค่คอมไพล์ VS สคริปต์ แต่ใช้งานได้ (ML, Lisp, Haskell) เชิงตรรกะ (Prolog) เชิงวัตถุ (C ++, Java, Smalltalk) จำเป็น (C, Pascal, FORTRAN แม้กระทั่ง)

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


2

แนวคิดบางอย่างของระบบปฏิบัติการ

 ( memory, IO, Scheduling, process\Threads, multithreading )

[หนังสือดีๆ " Modern Operating Systems , 2nd Edition, Andrew S. Tanenbaum"]

ความรู้พื้นฐานเกี่ยวกับเครือข่ายคอมพิวเตอร์

[หนังสือดีโดยTanenbaum

แนวคิด OOPS

จำกัด ออโตเมต้า

ภาษาโปรแกรม (ฉันเรียนภาษา C ก่อนจากนั้นจึงเรียนภาษา C ++)

อัลกอริทึม (ความซับซ้อนของเวลาการเรียงลำดับการค้นหาต้นไม้รายการที่เชื่อมโยงสแต็กคิว)

[หนังสือแนะนำอัลกอริทึมที่ดี ]


เมตาอัตโนมัติ? - "ออโตมาตะ" แน่นอนตามการแก้ไขครั้งแรก
Tom Duckering

อ๊ะ! จมลงเพื่อตรวจสอบการสะกดฉันเดา ฉันจะแก้ไขมัน ขอบคุณ.
aJ.

2

มุ่งมั่นในการมีเพศสัมพันธ์ต่ำติดต่อกันสูง

การมีเพศสัมพันธ์ต่ำการทำงานร่วมกันสูง

(ฉันขโมยภาพนี้มาจากเว็บไซต์ที่เชื่อมโยงด้านบน)


1

พยายามทำความเข้าใจเกี่ยวกับการเขียนโปรแกรมทุกระดับ จากระดับต่ำสุด (ชุดประกอบ) ไปจนถึงระดับสูงสุด

ใช้การเรียกซ้ำซึ่งเป็นคุณสมบัติที่ง่าย :) พยายามเรียนรู้การประกอบและสร้างโปรแกรมที่จะใช้การเรียกซ้ำในการประกอบ


1

อัลกอริทึม

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

ตัวอย่างเช่นเราไม่สามารถเขียนโปรแกรมบางโปรแกรมด้วยการเรียงลำดับฟองและคาดว่าจะถือว่าดีไม่ว่าโค้ดจะดีแค่ไหนก็ตาม

เพื่อสรุปให้ดูที่บทนำสู่อัลกอริทึม

ไม่ต้องเชี่ยวชาญก็รู้ว่าเกิดอะไรขึ้น ...


1

ในฐานะที่เพิ่งสำเร็จการศึกษาระดับปริญญาวิทยาศาสตร์คอมพิวเตอร์ฉันขอแนะนำสิ่งต่อไปนี้:

  • ดังที่กล่าวไว้ในโพสต์ต่างๆสัญกรณ์ Big O

    การออกแบบ OO

    โครงสร้างข้อมูลและอัลกอริทึม (จำชื่อหนังสือที่ใช้ไม่ได้แน่นอนจะอัปเดตถ้าจำได้)

    ระบบปฏิบัติการ http://www.amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/0130313580

    ปัญหา NP


1

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

หากคุณดู SOA หรือ DDD พวกเขาทั้งหมดจะกลับไปสู่แนวคิด OOP บางรูปแบบในที่สุด

ฉันอยากจะแนะนำให้คุณซื้อหนังสือ OOP ดีๆสักเล่มและเลือกภาษาที่หลากหลายเช่น C # หรือ Java เพื่อเริ่มต้นด้วย

OOP โดย Grady Booch

(PHP พวกทับทิมโปรดอย่าลงคะแนนฉันฉันแค่ยกตัวอย่างให้เขาเริ่มต้นคุณสามารถให้คำตอบและคำแนะนำของคุณเองได้ที่นี่)


1

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


1

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

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


0

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

Semaphores ส่วนที่สำคัญและเหตุการณ์


0

ไม่ไม่ใช่การเรียงฟองแบบด่วน มันคือค่าเฉลี่ยการเรียงลำดับของฟองขนาดใหญ่ O (n ^ 2) คิวสั้นคือ O (n * log (n))


0

ฉันจะบอกว่าด้านล่างนี้เป็นสิ่งที่สำคัญที่สุด

  • การเขียนโปรแกรมเชิงวัตถุ
  • แนวคิดของระบบปฏิบัติการ
    • กระบวนการและเธรด
    • อัลกอริทึมการตั้งเวลา
  • โครงสร้างข้อมูล
    • ประเภทของการจัดเก็บและรวบรวมข้อมูลประเภท (ลิงค์ลิสต์แฮชอาร์เรย์ ฯลฯ )
    • การเรียงลำดับอัลกอริทึม
    • ความซับซ้อนของอัลกอริทึม

จากนั้นไปที่สิ่งที่เกี่ยวข้องกับภาษาเฉพาะ ฉันหวังว่านี้จะเป็นประโยชน์!!


0

ฉันจะเริ่มต้นด้วยคำพูด:

"ถ้าคุณมีเครื่องมือเพียงอย่างเดียวคือค้อนคุณจะทำทุกอย่างเหมือนตะปู" (อับราฮัมมาสโลว์)

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

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

คำแนะนำนี้สอดคล้องกับแนวโน้มในปัจจุบันสำหรับโครงการหลายภาษา (เช่นใช้เว็บแอปพลิเคชันซึ่งอาจเกี่ยวข้องกับหลายภาษาในแอปพลิเคชันเดียวเช่น C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp .... และแม้แต่ กระบวนทัศน์การเขียนโปรแกรมที่แตกต่างกัน (เช่น C # เพิ่งเปิดตัวแนวคิดบางอย่างจากกระบวนทัศน์การเขียนโปรแกรมเชิงฟังก์ชันแลมบ์ดาส)

ดังนั้นสิ่งพื้นฐานคือการเรียนรู้อย่างต่อเนื่องตลอดไป :)


0

ฉันคิดว่า3D-Graphicsเป็นสิ่งที่ทุกคนควรเรียนรู้ หรืออย่างน้อยวิธีใช้เวกเตอร์ที่เป็นเนื้อเดียวกันและการแปลงเมทริกซ์อย่างเหมาะสม

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

ฉันไม่เข้าใจพีชคณิตเชิงเส้นอย่างเต็มที่จนกระทั่งฉันได้อ่านกราฟิก 3 มิติซึ่งเป็นหนึ่งในหลักสูตรที่ดีที่สุดที่ฉันเคยเรียนแม้ว่าครูของเราจะแย่ก็ตาม


0

เนื่องจากเครื่องที่มีหลายคอร์ (ทั้ง CPU และ GPU) กำลังกลายเป็นมาตรฐานฉันจึงบอกว่าจะรวมอัลกอริทึมแบบกระจาย (จากหลายเธรดไปจนถึงหลายเครื่อง) จำเป็นอย่างยิ่งที่จะต้องเข้าใจการประมวลผลแบบมัลติเธรดและแบบกระจาย ขออภัยที่ลิงค์ไม่ได้ให้ความช่วยเหลือมากนัก

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