- รวบรวม ไอเดียโปรเจ็กต์เขียนโปรแกรม 73 รายการ เพื่อให้นักพัฒนาได้สัมผัสทั้งการเรียนรู้และความท้าทายเชิงสร้างสรรค์ไปพร้อมกัน
- แต่ละโปรเจ็กต์ครอบคลุมหลากหลายด้าน เช่น เครือข่าย ระบบ AI กราฟิกส์ ความปลอดภัย และฐานข้อมูล
- ไอเดียส่วนใหญ่ถูกออกแบบให้ ลงมือสร้างหลักการเทคนิคสำคัญด้วยตนเอง จึงเรียนรู้ได้ทั้งทฤษฎีและการใช้งานจริง
- ในแต่ละหัวข้อมี ลิงก์ไปยังงานวิจัย เอกสารทางการ และบทสอน ที่เกี่ยวข้อง ช่วยชี้เส้นทางการเรียนรู้อย่างชัดเจน
- เป็นโอกาสให้มองการเขียนโปรแกรมไม่ใช่แค่การเขียนโค้ด แต่เป็น ศิลปะแห่งการสำรวจและการสร้างสรรค์
ภาพรวม
- นักพัฒนาจำนวนมาก อยากเริ่ม side project แต่ไม่รู้จะสร้างอะไรดี
- บนอินเทอร์เน็ตมีไอเดียแบบเดิม ๆ ที่น่าเบื่ออยู่มาก
- บทความนี้นำเสนอ 73 โปรเจ็กต์ที่ทั้งสนุกและมีคุณค่าในการเรียนรู้สูง
- แต่ละโปรเจ็กต์ถูกออกแบบให้ได้เรียนรู้ผ่านการลงมือสร้างแนวคิดทางเทคนิคเฉพาะด้านด้วยตนเอง
โปรเจ็กต์ด้านเครือข่ายและระบบ
- BitTorrent client: สร้างไคลเอนต์ดาวน์โหลดไฟล์เพื่อเรียนรู้หลักการทำงานของเครือข่ายแบบ P2P
- DNS server: สร้างเซิร์ฟเวอร์ที่รองรับการรับ query, การ parse packet, การแปลงโดเมน และการแคช
- Container runtime: เรียนรู้ kernel namespace,
chroot และการแยก process โดยไม่ใช้ Docker
- TCP/IP stack: ลงมือ implement โปรโตคอล TCP/IP เองใน user space ของ Linux
- Load balancer: สร้างระบบกระจายคำขอระหว่างเซิร์ฟเวอร์ backend พร้อม health check และ session persistence
ข้อมูลและระบบกระจาย
- RAFT protocol: สร้างระบบที่รองรับ distributed consensus และการกู้คืนเมื่อเกิดความขัดข้อง
- Redis clone: สร้างฐานข้อมูลในหน่วยความจำที่มีคำสั่งพื้นฐาน, RDB persistence, replication และ transaction
- Kafka broker: สร้างระบบ distributed log ที่รองรับการสร้าง topic และจัดการคำขอผลิต-บริโภคข้อความ
- SQL engine และ optimizer: เรียนรู้กระบวนการรัน query และการทำ optimization โดยจำลองโครงสร้างของ SQLite
- CI system: สร้างระบบรวมศูนย์ที่ทำงานติดตาม Git repository, รันทดสอบ และรายงานผลแบบอัตโนมัติ
ปัญญาประดิษฐ์และอัลกอริทึม
- Wordle solver: โปรแกรมทายคำโดยใช้แนวคิด information theory และ entropy
- Deepfake generator: สร้างการแปลงใบหน้าโดยใช้ Optimal Transport
- Random forest: ลงมือ implement decision tree และ random forest เพื่อแก้ปัญหาการจำแนกประเภท
- Neural network framework: สร้างเฟรมเวิร์ก deep learning ที่มี tensor, autograd และ optimizer
- Evolutionary design: ซิมูเลชันที่ใช้ genetic algorithm เพื่อทำให้โครงสร้างเครื่องจักรวิวัฒน์โดยอัตโนมัติ
กราฟิกส์และการพัฒนาเกม
- Ray Tracer: เรนเดอร์ฉาก 3D ที่ประกอบด้วยทรงกลม ระนาบ และแสง
- OpenGL renderer: สร้างมินิ renderer เพื่อฝึกพื้นฐานของการเขียนโปรแกรมกราฟิกส์
- Dangerous Dave remake: สร้างเกมคลาสสิกขึ้นใหม่ด้วย SDL
- Chess engine: พัฒนาเกมหมากรุกพร้อม UCI engine
- Procedural Crossword: สร้างปริศนา crossword อัตโนมัติด้วย constraint propagation
ความปลอดภัยและการเข้ารหัส
- Authentication server (JWT/Sessions) : ลงมือสร้างการเข้ารหัส การหมดอายุของโทเค็น และการจัดการ session
- Anonymous voting system: ออกแบบระบบลงคะแนนแบบเข้ารหัสด้วย zero-knowledge proof (ZKP)
- VPN: สร้าง mesh VPN ที่ส่งต่อทราฟฟิกได้โดยไม่ต้องมีเซิร์ฟเวอร์กลาง
- Malware experiment: ทดสอบการตอบสนองของไฟร์วอลล์ในสภาพแวดล้อม virtual machine
- Zip archiver: ลงมือสร้างฟังก์ชันบีบอัด เข้ารหัส และรวมไฟล์ด้วยตนเอง
การพัฒนาเว็บและแอปพลิเคชัน
- Web server: รองรับการจัดการคำขอ HTTP, การเสิร์ฟไฟล์สแตติก, routing และ reverse proxy
- Collaborative editor: สร้างตัวแก้ไขข้อความแบบกระจายที่อิง CRDT
- Browser engine: สร้างเอนจินอย่างง่ายที่ทำการ parse และ render HTML/CSS
- Video editor: โปรแกรมตัดต่อฝั่ง client ที่ทำงานภายในเบราว์เซอร์
- Browser extension: บันทึกและกรอกข้อมูลรหัสผ่าน ฟอร์ม และสถานะคลิปบอร์ดโดยอัตโนมัติ
การทำข้อมูลเป็นภาพและการค้นหา
- Googlebot: สร้าง web crawler เพื่อเรียนรู้โครงสร้างพื้นฐานของระบบค้นหา
- Wikipedia search engine: ลงมือ implement การทำดัชนี การ tokenization และอัลกอริทึมจัดอันดับ
- Knowledge graph: แสดงความสัมพันธ์ระหว่างเอนทิตีและอัปเดตข้อมูลจากเว็บโดยอัตโนมัติ
- Google Maps engine: สร้างระบบแผนที่ที่ทำดัชนีข้อมูลถนน ภูมิประเทศ และสถานที่
- CDN caching system: ออกแบบโครงสร้างแคชเพื่อลดคำขอซ้ำซ้อนของ static asset
ฮาร์ดแวร์และระบบฝังตัว
- Laser tag system: ระบบตรวจจับแบบเรียลไทม์ที่ใช้ IR encoding และการสื่อสารผ่าน MQTT
- Smart home app: โปรเจ็กต์ IoT ที่รองรับการควบคุมอุปกรณ์ IR การตั้งเวลา และระบบอัตโนมัติ
- Game Boy Advance emulator: จำลองโครงสร้างของ CPU หน่วยความจำ กราฟิก และอินพุต
บล็อกเชนและการเงิน
- Bitcoin node: ลงมือสร้างฟังก์ชันดาวน์โหลดและตรวจสอบบล็อก
- Stock trading bot: ทำการซื้อขายอัตโนมัติด้วยระบบแบบ event-driven
- Anonymous voting และ smart contract: ระบบลงคะแนนที่เชื่อถือได้บนพื้นฐานบล็อกเชน
สรุป
- ทั้ง 73 โปรเจ็กต์เน้น แนวทางการเรียนรู้เชิงทดลองผ่านการลงมือสร้างเทคโนโลยีหลักด้วยตนเอง
- แต่ละไอเดียเชื่อมต่อไปยัง เอกสารทางการ งานวิจัย และบทสอน เพื่อชี้นำการเรียนรู้แบบลงมือปฏิบัติ
- เป็นข้อเสนอเชิงปฏิบัติที่ชวนให้ค้นพบการเขียนโปรแกรมอีกครั้งในฐานะ ศิลปะแห่งการสำรวจและการสร้างสรรค์
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
บางคนบอกว่ารายการนี้ดูเหมือน AI สร้างขึ้นมา แต่ฉันกลับคิดว่าการ ‘ลงมือสร้างเองตั้งแต่ต้น’ คือวิธีที่ดีที่สุดในการลดการพึ่งพา AI
ในญี่ปุ่น กระบวนการแบบนี้เรียกว่า ‘ชูเงียว (修行, Shugyo)’
ช่างฝีมือใช้เวลานานในการลับเครื่องมือ ไม่ใช่เพราะประสิทธิภาพ แต่เพื่อทำความเข้าใจแก่นแท้ของเหล็กกล้า
การสร้าง Redis หรือ Git ด้วยตัวเองไม่ใช่เรื่องของผลลัพธ์ แต่เป็นการสร้างแบบจำลองความคิดผ่านแรงเสียดทานของกระบวนการ นี่แหละคือส่วนที่ AI แทนที่ไม่ได้
ขอแนะนำชุดไอเดียโปรเจกต์ที่ฉันทำเอง Challenging programming projects every programmer should try
นี่คือลิสต์จาก codecrafters.io แพลตฟอร์มนี้ให้คุณค่อย ๆ สร้างโปรเจกต์เป็นขั้นตอน พร้อมมี integration tests และ community ให้
ตอนนี้ฉันก็กำลังทำโปรเจกต์ ‘Build your own Redis’ อยู่และมันค่อนข้างสนุก ดูไม่เหมือนงานที่ AI ทำ แต่เหมือนเป็นการรวบรวมไอเดียจากชุมชนมากกว่า
ขอแนะนำอย่างยิ่งให้ลองสร้าง BitTorrent client ด้วยตัวเอง สเปกไม่ซับซ้อนและปัญหารายละเอียดต่าง ๆ ก็น่าสนใจมาก หลังทำเสร็จแล้วความภูมิใจตอนใช้มันดาวน์โหลด Debian kernel เองนั้นคุ้มค่ามาก
ถ้าลองเพิ่มการรองรับ magnet link หรือฟังก์ชัน seeding เข้าไปด้วยก็จะได้เรียนรู้ลึกขึ้นอีก ประสบการณ์นี้ทำให้ฉันสนใจ ระบบ P2P และ DHT (เช่น Chord) มากขึ้น
ลิสต์นี้ค่อนข้างแปลก เช่น #58 คือการทำ malloc ซึ่งสำหรับมือใหม่ถือว่ายากพอสมควร แต่ถัดไป #59 กลับให้สร้าง streaming protocol ขึ้นมาเองตั้งแต่ศูนย์ ระดับความยากต่างกันเกินไป
อยากรู้ว่าคนอื่นคิดเห็นอย่างไรกับ programming challenge ของ /g/ ใน 4chan ฉันรู้สึกว่าการแบ่งระดับความยากค่อนข้างตามอำเภอใจ เช่น การบอกว่า bootloader ยากกว่า C compiler ก็ดูแปลก ๆ
ลิงก์รูปภาพอ้างอิง
.mdจะดีกว่าการลองสร้างเครื่องมือหรือโปรโตคอลขนาดเล็กที่จบในตัวเองขึ้นมาเองนั้นดีมาก ความพึงพอใจที่ได้มาจาก ความชัดเจนและความสมบูรณ์ของงาน นั้นมีค่ามากกว่าขนาดของมัน
ชวนให้สงสัยว่านี่คือ ‘astroturfing’ (การโปรโมตแบบจัดฉาก) หรือเปล่า
บางโปรเจกต์ใช้เวลาแค่วันเดียวก็เสร็จ แต่บางอันมีขนาดระดับโปรเจกต์จบปริญญาตรีหรือวิทยานิพนธ์ปริญญาโท
พอเห็นลิสต์นี้แล้วทำให้รู้สึกเหมือนตัวเองไม่ใช่โปรแกรมเมอร์ที่เก่งพอ
ถ้าอยากเริ่มต้น ควรลองดูงานก่อนหน้าที่เกี่ยวข้องในด้านที่คุณสนใจ ตัวอย่างเช่นงานของ Adam Dunkels ก็น่าอ้างอิง เพราะทำมาสำหรับระบบ embedded จึงมีขนาดเล็กและเข้าใจได้ง่าย
หากจำเป็น ก็แนะนำให้ใช้เครื่องมือ AI เพื่อช่วยทำความเข้าใจโค้ดหรือช่วยสร้างโค้ดได้เช่นกัน