7 คะแนน โดย GN⁺ 2023-12-27 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

โปรแกรมแก้ไขข้อความ

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

เกม 2D - Space Invaders

  • แม้จะเป็นเกมง่าย ๆ ก็ยังต้องใช้โครงสร้างข้อมูลและดีไซน์แพตเทิร์นเฉพาะ แทนที่จะโฟกัสกับการออกแบบเกมหรืออาร์ต ให้เน้นที่การสร้างเกมโดยรวม
  • เรียนรู้การวาดหน้าจอ game loop การจัดการอินพุตจากผู้ใช้ การสร้างและจัดการอ็อบเจ็กต์แบบไดนามิก และการนำ game logic มาใช้
  • หลังจากสร้างเกมพื้นฐานแล้ว สามารถขยายต่อได้ด้วยเมนูหน้าจอไตเติล หน้าจอ game over การรักษาความเร็วให้เท่ากันบนคอมพิวเตอร์หลายเครื่อง และการใส่ AI

คอมไพเลอร์ - Tiny BASIC

  • การสร้างคอมไพเลอร์เป็นโปรเจกต์ที่ต้องอาศัยความเข้าใจเชิงลึกด้านการเขียนโปรแกรม เริ่มจากการเขียนคอมไพเลอร์สำหรับภาษาง่าย ๆ อย่าง Tiny BASIC
  • เรียนรู้กระบวนการต่าง ๆ เช่น การแปลงโค้ดเป็นโทเค็น (lexical analysis), การพาร์ส (ตรวจสอบโครงสร้างและสร้างต้นไม้), semantic analysis และการสร้างโค้ด
  • หลังจากสร้างคอมไพเลอร์พื้นฐานแล้ว สามารถขยายต่อได้ด้วยการเพิ่ม standard library เพิ่มขั้นตอนการ optimize และปรับปรุงข้อความแจ้งข้อผิดพลาด

มินิระบบปฏิบัติการ

  • แนวคิดพื้นฐานของระบบปฏิบัติการสามารถนำไปใช้ได้ในหลายสาขา การสร้างระบบปฏิบัติการช่วยเพิ่มความเข้าใจด้านฮาร์ดแวร์
  • แม้จะมีช่วงการเรียนรู้ที่ขึ้นอยู่กับฮาร์ดแวร์ แต่หากทำตามหนังสือหรือบทช่วยสอน ก็สามารถสร้าง OS ที่บูตได้

สเปรดชีต

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

อีมูเลเตอร์เครื่องเล่นวิดีโอเกม

  • การเขียนอีมูเลเตอร์คือการรวมความท้าทายของการเขียนคอมไพเลอร์ ระบบปฏิบัติการ และคอมไพเลอร์ไว้ในงานเดียว การได้เล่นเกมจริงบนอีมูเลเตอร์ที่เราสร้างเองเป็นประสบการณ์ที่คุ้มค่า
  • การจำลองเครื่องเล่นวิดีโอเกมจริงหมายถึงการสร้าง virtual machine ที่ทำงานเหมือน CPU และองค์ประกอบฮาร์ดแวร์อื่น ๆ ของเครื่องนั้น

ความเห็นของ GN⁺

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

1 ความคิดเห็น

 
GN⁺ 2023-12-27
ความเห็นจาก Hacker News
  • การทำโปรเจกต์อย่าง text editor, compiler, operating system หรือ ray tracer อาจช่วยพัฒนาทักษะการเขียนโปรแกรมได้ แต่ไม่ได้ช่วยยกระดับความสามารถด้าน software engineering โดยตรง จริง ๆ แล้วโปรเจกต์แบบนี้แฝงหลักการที่เป็นหายนะอย่าง "Not Invented Here" อยู่ด้วย จึงอาจให้ผลย้อนกลับในแง่ software engineering

    • ความสามารถในการตัดสินใจว่าจะดึงจากไลบรารีหรือเขียนเอง
    • ความสามารถในการระบุไลบรารีและเฟรมเวิร์กคุณภาพสูงที่เหมาะกับความต้องการของโปรเจกต์
    • ความสามารถในการตัดสินใจว่าควร optimize ตรงไหนและตรงไหนไม่คุ้ม
    • ความสามารถในการเขียนโค้ดที่อีกหลายปีต่อมาก็ยังอ่านรู้เรื่อง
    • ความสามารถในการมองโปรเจกต์เป็นระบบขนาดใหญ่ที่ซับซ้อน และคำนึงถึง dependency ทั้งฝั่งซอฟต์แวร์และที่ไม่ใช่ซอฟต์แวร์
    • เสนอความท้าทายทางเลือกเป็นการสร้าง web search engine เนื่องจากอัลกอริทึมอย่าง string matching นั้นคนอื่นแก้ไว้แล้ว เป้าหมายจึงคือการสร้าง search engine (และ crawler) ที่ใช้งานได้จริง
  • สำหรับโปรเจกต์สาย UI/เว็บ แนะนำสิ่งต่อไปนี้:

    • วิดีโอเกมง่าย ๆ ที่ใช้ Unity หรือ Unreal (เพราะในเกม 30-60fps สำคัญ จึงช่วยให้สร้างอินเทอร์เฟซที่ทำงานได้ลื่นในงานอื่นด้วย)
    • JavaScript framework แบบง่าย ๆ คล้าย React (ช่วยให้เข้าใจ data flow และการจัดการ event)
    • http library wrapper รอบ XMLHTTPRequest (แม้จะมี fetch อยู่แล้ว แต่การเข้าใจว่าคำขอ HTTP ถูกส่งและอ่านตั้งแต่ต้นอย่างไร มีประโยชน์เวลา debug ปัญหา CORS, คำขอ OPTIONS เป็นต้น)
  • มีความเห็นเชิงบวกต่อ mini operating system ในฐานะนักพัฒนาแอปพลิเคชัน เราพึ่งพาฟังก์ชันของระบบปฏิบัติการอยู่แล้ว เช่น memory management และ file system จึงย่อมอยากรู้ว่าสิ่งเหล่านี้ทำงานเบื้องหลังอย่างไร การใช้ xv6 เพื่อเรียนรู้และลงมือทำอัลกอริทึมการจัดตาราง process แบบต่าง ๆ ในเวลาว่างเป็นประสบการณ์ที่มีประโยชน์มากและสนุกด้วย

  • มีความอยากลองจับงานที่เป็นกายภาพบ้าง เช่น หุ่นยนต์หรือโดรนที่มี autopilot หรือการจำลองพลศาสตร์การบินของยานอวกาศอย่างแม่นยำซึ่งมีพารามิเตอร์ GNC ที่ตั้งโปรแกรมได้ มีหนังสือชื่อ "Fundamentals of Astrodynamics" อยู่ และอยากใช้ช่วงวันหยุดนี้ศึกษาจากมัน อยากได้ข้อมูลดี ๆ เกี่ยวกับ GNC (guidance, navigation and control)

  • แม้จะขึ้นอยู่กับรสนิยมและสถานการณ์ส่วนตัว แต่ถ้ากำลังหาไอเดีย รายการนี้ก็เป็นจุดเริ่มต้นที่ดีได้ เคยใช้ Sinclair ZX Spectrum ทำ music staff editor กับ tracker รวมถึงเกม 2D (Space Invaders) เป็นต้น ส่วนคอมพิวเตอร์เครื่องแรก (386) ก็เคยใช้ทำ Huffman compressor, B-Tree index, OOP form generator, ตัวตรวจอีเมลสำหรับ dial-up, parser ที่เขียนเอง เป็นต้น

  • การพูดคุยเรื่อง text editor: ความท้าทายใหญ่ที่สุดคือจะเก็บเอกสารข้อความไว้ในหน่วยความจำอย่างไร การใช้ array เป็นความคิดแรก แต่ประสิทธิภาพจะแย่มากเมื่อแทรกข้อความในตำแหน่งที่ไม่ใช่ท้ายเอกสาร อย่างไรก็ตาม การใช้ JavaScript string และใช้งาน editor มานานกว่า 2 ปี ก็ไม่พบปัญหาด้านประสิทธิภาพ แน่นอนว่ายังมีปัญหาอื่นอีกมาก เช่น การ render เส้นแนวนอนยาว ๆ เป็นปัญหา เพราะแนวทาง optimize ตั้งอยู่บนสมมติฐานว่าการ render ทีละบรรทัดจะมีต้นทุนต่ำ

  • การลองทำ ray tracer แบบของเล่นง่าย ๆ ก็เป็นความคิดที่ดี การสร้าง ray tracer ที่ทำ sphere ในกราฟิกแบบ bitmap พร้อมการสะท้อนแบบ diffuse และ reflective อาจเป็นโปรเจกต์ที่มีขอบเขตค่อนข้างจำกัด ตราบใดที่ไม่ทำให้โปรเจกต์ซับซ้อนเกินไป

  • ถ้าคุณคิดว่าการเขียน Space Invaders ต้องใช้ "factory pattern" แสดงว่ามีบางอย่างผิดปกติ ไม่น่าเชื่อว่าเกมต้นฉบับจะใช้แนวคิดด้านการออกแบบแบบนั้น

  • ความเห็นเกี่ยวกับ text editor ที่ใช้ array เป็นโครงสร้างข้อมูล: ระหว่างพิมพ์ต้องการความเร็วสูง และมักเปลี่ยนแค่บรรทัดเดียว เมื่อป้อนบรรทัดใหม่ หลังจากกด Enter แล้ว ความหน่วงเพิ่มเติมที่ต้องใช้เพื่อจัดโครงสร้าง array ใหม่แทบไม่สังเกตเห็นได้แม้ในไฟล์ระดับหลายล้านบรรทัด ส่วนที่ท้าทายกว่าของ text editor คือการทำให้แน่ใจว่าจะ render เฉพาะสิ่งที่ผู้ใช้มองเห็นเท่านั้น