Why we are teaching this class
ในการศึกษาด้านวิทยาการคอมพิวเตอร์ (Computer Science) ตามปกติ พวกเราน่าจะต้องผ่านวิชาเรียนขั้นสูงมากมาย ตั้งแต่ระบบปฏิบัติการ (Operating Systems) ภาษาโปรแกรม (Programming Languages) ไปจนถึง Machine Learning แต่ปัญหาคือในหลายๆ สถาบัน กลับมีหัวข้อสำคัญเรื่องหนึ่งที่ไม่ค่อยถูกนำมาสอน ปล่อยให้นักศึกษาต้องไปเรียนรู้กันเอาเอง นั่นก็คือ “ความเข้าใจในเครื่องมือและสภาพแวดล้อมในการเขียนโปรแกรม (Computing Ecosystem Literacy)”
ตลอดหลายปีที่ผ่านมา พวกเราได้ช่วยสอนหลายวิชาที่ MIT และเรามักจะเห็นภาพเดิมๆ ซ้ำแล้วซ้ำเล่า คือนักศึกษาหลายคนมีความรู้จำกัดเรื่องเครื่องมือที่สามารถนำมาใช้งานได้ ทั้งที่คอมพิวเตอร์ถูกสร้างขึ้นมาเพื่อทำงานซ้ำซากแทนเราแบบอัตโนมัติ (Automate) แต่นักศึกษากลับชอบป้อนคำสั่งซ้ำๆ ด้วยมือ (Manual) หรือไม่ก็ใช้ประโยชน์จากเครื่องมืออันทรงพลังอย่างระบบ Version Control และ Text Editors ได้ไม่เต็มประสิทธิภาพ ในกรณีที่ดีที่สุด ปัญหานี้ทำให้เกิดความล่าช้าและเสียเวลาโดยเปล่าประโยชน์ แต่ในกรณีที่เลวร้ายกว่านั้น มันทำให้เกิดข้อมูลสูญหาย หรืองานพังจนทำต่อไม่ได้
หัวข้อเหล่านี้มักไม่ได้ถูกบรรจุในหลักสูตรมหาวิทยาลัย นักศึกษาไม่เคยถูกสอนว่าต้องใช้งานเครื่องมือเหล่านี้อย่างไร หรืออย่างน้อยก็ไม่เคยถูกสอนให้ใช้อย่าง มีประสิทธิภาพ ผลที่ตามมาคือต้องมาเสียเวลาและลงแรงไปกับงานที่จริงๆ แล้ว “ควรจะ” เป็นเรื่องง่าย สรุปก็คือ หลักสูตร CS ปกติยังขาดการสอนเนื้อหาสำคัญๆ เกี่ยวกับระบบสภาพแวดล้อมต่างๆ ที่จะช่วยให้ชีวิตการเขียนโค้ดของนักศึกษาง่ายขึ้นได้อีกมาก
เทอมที่หายไปในชีวิตเด็ก CS (The missing semester of your CS education)
เพื่ออุดช่องโหว่ตรงนี้ เราจึงจัดทำวิชานี้ขึ้นมาเพื่อครอบคลุมหัวข้อทั้งหมดที่เรามองว่า “จำเป็น” ต่อการเป็นโปรแกรมเมอร์ที่มีประสิทธิภาพ วิชานี้เน้นปฏิบัติและสามารถนำไปใช้ได้จริง (Pragmatic & Practical) โดยจะปูพื้นฐานการใช้งานเครื่องมือและเทคนิคต่างๆ ที่พวกคุณสามารถนำไปประยุกต์ใช้กับสถานการณ์หลากหลายรูปแบบที่จะต้องเจอได้ทันที เวอร์ชันล่าสุดของคอร์สนี้มีการปรับปรุงเนื้อหาขนานใหญ่ และนำมาสอนในช่วง “Independent Activities Period” ของ MIT ในเดือนมกราคม 2026 (เทอมระยะสั้น 1 เดือนที่นักศึกษาจัดสอนเอง) ถึงแม้วิชาเรียนจะจำกัดแค่ภายใน MIT แต่เราได้นำสื่อการสอนทั้งหมดพร้อมวิดีโอบันทึกการสอนมาเปิดให้เรียนกันได้แบบสาธารณะ
ถ้าคิดว่านี่คือสิ่งที่คุณกำลังตามหาอยู่ นี่คือตัวอย่างคร่าวๆ ของสิ่งที่จะได้เรียนในวิชานี้:
Command Shell
วิธีเขียนสร้างระบบอัตโนมัติ (Automate) สำหรับงานที่ต้องทำบ่อยๆ และทำซ้ำๆ ด้วย Aliases, Scripts และ Build Systems เลิกได้แล้วกับการก็อปปี้คำสั่งมาวางจากไฟล์ Text เลิกการต้องมาจำว่า “ต้องรัน 15 คำสั่งนี้เรียงต่อกัน” เลิกปัญหา “ลืมรันคำสั่งตัวนี้” หรือ “ลืมส่ง Argument ตัวนั้น” ได้แล้ว
ตัวอย่างเช่น การค้นหาประวัติคำสั่งผ่าน History อย่างรวดเร็วจะช่วยประหยัดเวลาได้เยอะมาก ในวิดีโอด้านล่างนี้ เราจะแสดงเทคนิคหลายวิธีในการไล่ค้นประวัติของคำสั่ง convert
Version Control
การใช้ Version Control อย่าง ถูกวิธี (properly) และใช้ประโยชน์จากมันเพื่อพาคุณรอดจากวิกฤต, สามารถทำงานร่วมกับคนอื่นได้ รวมถึงการค้นหาและแยกโค้ดส่วนที่มีปัญหาออกมาได้อย่างรวดเร็ว พอกันทีกับ rm -rf; git clone พอกันทีกับ Merge Conflict (เอาเป็นว่าขอให้เจอน้อยลงก็พอ) พอกันทีกับก้อน Commented-out Code ลากยาว พอกันทีกับการต้องมานั่งปวดหัวว่าใครทำโค้ดพัง หรืออาการช็อคว่า “เฮ้ย โค้ดที่ใช้งานได้เมื่อกี้เพิ่งหายไปไหน?!” เราจะสอนบรรดาเครื่องมือรวมไปถึงวิธีส่ง Pull Requests เพื่อไปช่วยสมทบ (Contribute) งานของชาวบ้านด้วย
ในตัวอย่างด้านล่าง เราใช้ git bisect เพื่อควานหาว่า Commit ไหนเป็นตัวการทำให้ Unit Test พัง แล้วตามไปแก้ด้วย git revert
Text Editing
วิธีแก้ไขไฟล์อย่างมีประสิทธิภาพผ่าน Command-Line ทั้งบนเครื่องของตัวเอง (Locally) และเครื่องระยะไกล (Remotely) และใช้ฟีเจอร์ระดับสูงของ Editor ให้เป็นประโยชน์ พอกันทีกับการก็อปปี้ไฟล์สลับไปมา พอกันทีกับการแก้ไฟล์เรื่องเดิมๆ ซ้ำแล้วซ้ำเล่า
Vim macros คือหนึ่งในฟีเจอร์ที่ดีที่สุด ในตัวอย่างด้านล่าง เราสามารถแปลง HTML Table เป็นรูปแบบ CSV ได้อย่างรวดเร็วด้วยการใช้ Nested Vim Macro
Remote Machines
วิธีคุมสติให้อยู่รอดเมื่อต้องทำงานบนเครื่อง Remote ด้วย SSH Keys และ Terminal Multiplexing หมดปัญหาที่ต้องเปิดเบราว์เซอร์หรือ Terminal กองเต็มหน้าจอเพียงเพื่อจะรันสองคำสั่งพร้อมกัน เลิกพิมพ์รหัสผ่านซ้ำทุกรอบตอนคอนเนค หมดปัญหาของพังหายหมดเพียงเพราะอินเทอร์เน็ตหลุดกะทันหัน หรือต้อง Reboot แลปท็อป
ในวิดีโอด้านล่าง เราพาใช้ tmux เพื่อป้องไม่ให้ Session ขาดหลุดจากการทำงานบน Remote Server และใช้ mosh เพื่อให้รองรับกรณีการเปลี่ยนเครือข่ายมือถือและเน็ตหลุด
Finding Files
วิธีค้นหาไฟล์ที่ต้องการอย่างรวดเร็ว พอกันทีกับการต้องนั่งคลิกหาทีละไฟล์ในโปรเจกต์ กว่าจะเจอโค้ดหน้าตาอย่างที่อยากได้
ในวิดีโอดังกล่าวนี้เราตามหาไฟล์อย่างรวดเร็วด้วย fd และสืบหา Code Snippets ด้วย rg รวมทั้งสั่ง cd และ vim เรียกใช้ไฟล์/โฟลเดอร์ที่เพิ่งเข้าบ่อยๆ ได้อย่างรวดเร็วโดยใช้ fasd
Data Wrangling
วิธีปรับแต่ง, แสดงผล, แปลง (Parse), พล็อตข้อมูล และคำนวณสถิติจากข้อมูลไฟล์โดยตรงจากหน้า Command-Line ได้อย่างง่ายและรวดเร็ว พอกันทีกับการก็อปวางจาก Log File พอกันทีกับการใช้เครื่องคิดเลขจิ้มสถิติเองจากข้อมูล พอกันทีกับการพล็อตบน Spreadsheet
Code Quality and Continuous Integration
วิธีใช้งาน Autoformatting, Linting, Testing และ Code Coverage Tools เพื่อยกระดับ Code Quality เลิกเขียนโค้ดอ่านยาก เลิกเจอปัญหาบั๊กพังกลับมา (Regressions) เลิกเจอปัญหา “บนเครื่องเราก็รันผ่านนะ แต่พังบนเครื่องของคนอื่น”
ขยับไปไกลกว่าแค่ตัวโค้ด (Beyond the Code)
วิธีเขียนเอกสาร (Documentation) ให้ออกมาดี การสื่อสารพูดคุยกับเหล่า Open-source Maintainers ให้รู้เรื่อง การแจ้งปัญหา (Issue) อย่างตรงจุด และส่ง Pull Requests ให้ได้รับการถูกใช้โค้ด (Merged) หมดปัญหาผู้ใช้หน้าใหม่งงจนติดตั้งโปรแกรมคุณไม่เป็น หมดปัญหาโดน Maintainer อ่านไม่ตอบ
บทสรุป (Conclusion)
ทุกอย่างที่ได้กล่าวไป รวมทั้งหัวข้ออื่นๆ จะรวมอยู่ในการบรรยายฉบับเต็มทั้ง 9 บทเรียน แต่ละบทเรียนก็จะมีแบบฝึกหัดเพื่อให้พวกคุณได้ลองทำความคุ้นเคยกับเครื่องมือต่างๆ ด้วยตัวเอง หากคุณอดใจรอตัวเต็มในมกราคม 2026 ไม่ไหว ก็สามารถกลับไปดูวิดีโอจาก วิชาที่เคยสอนไว้เมื่อปีก่อนหน้า ซึ่งมีเนื้อหาครอบคลุมหลายหัวข้อที่คล้ายคลึงกันไปก่อนได้
หวังว่าจะได้พบพวกคุณในเดือนมกราคมนี้นะครับ ไม่ว่าจะตัวเป็นๆ ในคลาส หรือเจอกันบนโลกออนไลน์ก็ตาม!
Happy hacking,
Anish, Jon, and Jose
Licensed under CC BY-NC-SA.