โปรแกรมแก้ไขข้อความ
- เราใช้โปรแกรมแก้ไขข้อความทุกวัน แต่รู้หรือไม่ว่ามันทำงานจริง ๆ อย่างไร เริ่มจากการสร้างฟีเจอร์พื้นฐานก่อน
- ความท้าทายที่ใหญ่ที่สุดคือจะเก็บเอกสารข้อความไว้ในหน่วยความจำอย่างไร การใช้อาร์เรย์มีปัญหาเรื่องประสิทธิภาพ จึงต้องเรียนรู้โครงสร้างข้อมูลหลายแบบเพื่อแก้ปัญหานี้
- เรียนรู้การทำงานของเคอร์เซอร์ข้อความ และหลังจากสร้างตัวแก้ไขพื้นฐานแล้ว ให้ลองต่อยอดด้วยฟีเจอร์ 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 ความคิดเห็น
ความเห็นจาก Hacker News
การทำโปรเจกต์อย่าง text editor, compiler, operating system หรือ ray tracer อาจช่วยพัฒนาทักษะการเขียนโปรแกรมได้ แต่ไม่ได้ช่วยยกระดับความสามารถด้าน software engineering โดยตรง จริง ๆ แล้วโปรเจกต์แบบนี้แฝงหลักการที่เป็นหายนะอย่าง "Not Invented Here" อยู่ด้วย จึงอาจให้ผลย้อนกลับในแง่ software engineering
สำหรับโปรเจกต์สาย UI/เว็บ แนะนำสิ่งต่อไปนี้:
มีความเห็นเชิงบวกต่อ 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 เฉพาะสิ่งที่ผู้ใช้มองเห็นเท่านั้น